@sjcrh/proteinpaint-client 2.181.0 → 2.182.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (980) hide show
  1. package/dist/2dmaf-YHYYSSKR.js +1371 -0
  2. package/dist/AIProjectAdmin-D4AASQBM.js +830 -0
  3. package/dist/AIProjectAdmin-D4AASQBM.js.map +7 -0
  4. package/dist/AppHeader-T4ZLY3VG.js +833 -0
  5. package/dist/BoxPlot-DIU4YXNK.js +1217 -0
  6. package/dist/BoxPlot-DIU4YXNK.js.map +7 -0
  7. package/dist/CorrelationVolcano-EXH4P56S.js +617 -0
  8. package/dist/DE-C5K2TVUQ.js +93 -0
  9. package/dist/DE-C5K2TVUQ.js.map +7 -0
  10. package/dist/DEinput-KVILE7QQ.js +297 -0
  11. package/dist/DEinput-KVILE7QQ.js.map +7 -0
  12. package/dist/DifferentialAnalysis-P6GKHAS5.js +238 -0
  13. package/dist/Disco-IMLXEBPG.js +3235 -0
  14. package/dist/Disco-IMLXEBPG.js.map +7 -0
  15. package/dist/Disco.UI-4A2P5Q55.js +242 -0
  16. package/dist/DmrPlot-6EEEGD32.js +640 -0
  17. package/dist/GB-XFO5I6ND.js +1125 -0
  18. package/dist/HicApp-3LFHOOAR.js +2248 -0
  19. package/dist/NumBinaryEditor-74PY52BP.js +268 -0
  20. package/dist/NumBinaryEditor-74PY52BP.js.map +7 -0
  21. package/dist/NumBinaryEditor.unit.spec-2PYZ7P2R.js +284 -0
  22. package/dist/NumContEditor-BMWALLQM.js +105 -0
  23. package/dist/NumContEditor.unit.spec-ETVLVX6A.js +167 -0
  24. package/dist/NumCustomBinEditor-2XJ6GUWY.js +36 -0
  25. package/dist/NumCustomBinEditor.unit.spec-TZVL553E.js +282 -0
  26. package/dist/NumDiscreteEditor-4LNLKAXT.js +177 -0
  27. package/dist/NumDiscreteEditor-4LNLKAXT.js.map +7 -0
  28. package/dist/NumDiscreteEditor.unit.spec-KQND2XAE.js +200 -0
  29. package/dist/NumRegularBinEditor-OYELFDIB.js +36 -0
  30. package/dist/NumRegularBinEditor.unit.spec-44SALKLH.js +225 -0
  31. package/dist/NumSplineEditor-SENQC4P2.js +190 -0
  32. package/dist/NumSplineEditor-SENQC4P2.js.map +7 -0
  33. package/dist/NumSplineEditor.unit.spec-XKB4XXU4.js +197 -0
  34. package/dist/NumericDensity-GCNWO7YS.js +36 -0
  35. package/dist/NumericDensity.unit.spec-7LWNOUYK.js +219 -0
  36. package/dist/NumericHandler-EMQBI5UI.js +37 -0
  37. package/dist/NumericHandler.unit.spec-TEELPRIM.js +217 -0
  38. package/dist/RunChart2-LJBC5X2H.js +756 -0
  39. package/dist/RunChart2-LJBC5X2H.js.map +7 -0
  40. package/dist/SC-3EB6UYIS.js +682 -0
  41. package/dist/SC-3EB6UYIS.js.map +7 -0
  42. package/dist/Volcano-CPULLVYV.js +1185 -0
  43. package/dist/Volcano-CPULLVYV.js.map +7 -0
  44. package/dist/WSIViewer-2YCT4LCM.js +47974 -0
  45. package/dist/WSIViewer-2YCT4LCM.js.map +7 -0
  46. package/dist/WsiSamplesPlot-B2DM7Z3Q.js +163 -0
  47. package/dist/adSandbox-INF3NNEV.js +36 -0
  48. package/dist/alphaGenome-CO4TQHXN.js +173 -0
  49. package/dist/app-63JU2YIT.js +47 -0
  50. package/dist/app-BL3POUOO.js +35 -0
  51. package/dist/app.js +17 -17
  52. package/dist/bam-SVEJYICC.js +857 -0
  53. package/dist/bam-SVEJYICC.js.map +7 -0
  54. package/dist/barchart-PDUXZAIH.js +45 -0
  55. package/dist/barchart.data-EXENRVMU.js +22 -0
  56. package/dist/barchart.events-MQNQTSWI.js +45 -0
  57. package/dist/barchart.integration.spec-DSO2377T.js +1675 -0
  58. package/dist/bars.renderer-S7A7I6BQ.js +12 -0
  59. package/dist/block-OO2NLGUP.js +6200 -0
  60. package/dist/block-OO2NLGUP.js.map +7 -0
  61. package/dist/block.init-7J5OHYKA.js +36 -0
  62. package/dist/block.mds.expressionrank-643H7PN7.js +357 -0
  63. package/dist/block.mds.geneboxplot-C222ODSL.js +826 -0
  64. package/dist/block.mds.junction-C5DJRUOK.js +1543 -0
  65. package/dist/block.mds.svcnv-4G74JQ7Y.js +6799 -0
  66. package/dist/block.svg-35KUC5R7.js +162 -0
  67. package/dist/block.tk.aicheck-LLWT6K6H.js +281 -0
  68. package/dist/block.tk.ase-PQUKY65E.js +363 -0
  69. package/dist/block.tk.bam-EUEOB7BR.js +1904 -0
  70. package/dist/block.tk.bedgraphdot-XAHUY545.js +382 -0
  71. package/dist/block.tk.bigwig.ui-HEOPNL3T.js +209 -0
  72. package/dist/block.tk.hicstraw-EPH3LEX2.js +821 -0
  73. package/dist/block.tk.junction-MIUDAIAR.js +2362 -0
  74. package/dist/block.tk.junction.textmatrixui-AVFUQBDS.js +197 -0
  75. package/dist/block.tk.ld-ED7YMBQ4.js +97 -0
  76. package/dist/block.tk.menu-3CVIECWQ.js +1027 -0
  77. package/dist/block.tk.pgv-HETJVWXH.js +942 -0
  78. package/dist/brainImaging-K3LHK3DD.js +421 -0
  79. package/dist/chat-BYX5ARUK.js +148 -0
  80. package/dist/chunk-25RP5OSE.js +1426 -0
  81. package/dist/chunk-25RP5OSE.js.map +7 -0
  82. package/dist/chunk-2LULD7RN.js +31 -0
  83. package/dist/chunk-2M6JV7YS.js +261 -0
  84. package/dist/chunk-2M6JV7YS.js.map +7 -0
  85. package/dist/chunk-2TJESM3Z.js +158 -0
  86. package/dist/chunk-2TJESM3Z.js.map +7 -0
  87. package/dist/chunk-2VFYZ3EY.js +102 -0
  88. package/dist/chunk-3CD5ZROA.js +4952 -0
  89. package/dist/chunk-3DCABJHB.js +381 -0
  90. package/dist/chunk-3MMKHYUM.js +95 -0
  91. package/dist/chunk-3PRPMJTG.js +55 -0
  92. package/dist/chunk-4JON7TLI.js +176 -0
  93. package/dist/chunk-4JON7TLI.js.map +7 -0
  94. package/dist/chunk-5JD4D5GD.js +215 -0
  95. package/dist/chunk-5JD4D5GD.js.map +7 -0
  96. package/dist/chunk-5UMPBVA6.js +534 -0
  97. package/dist/chunk-64FGLSIM.js +56 -0
  98. package/dist/chunk-64FGLSIM.js.map +7 -0
  99. package/dist/chunk-6ITDJ5UR.js +261 -0
  100. package/dist/chunk-6ITDJ5UR.js.map +7 -0
  101. package/dist/chunk-6LAE5AVA.js +13624 -0
  102. package/dist/chunk-6VLA5NEW.js +335 -0
  103. package/dist/chunk-6VLA5NEW.js.map +7 -0
  104. package/dist/chunk-7FKIAQ4K.js +17 -0
  105. package/dist/chunk-7FKIAQ4K.js.map +7 -0
  106. package/dist/chunk-7FTDQDVF.js +824 -0
  107. package/dist/chunk-7IEZ2KMW.js +142 -0
  108. package/dist/chunk-7RN3L2BX.js +1788 -0
  109. package/dist/chunk-7RN3L2BX.js.map +7 -0
  110. package/dist/chunk-A5AFIW2T.js +14 -0
  111. package/dist/chunk-A6TQGNDQ.js +421 -0
  112. package/dist/chunk-A6TQGNDQ.js.map +7 -0
  113. package/dist/chunk-AIBODF32.js +2784 -0
  114. package/dist/chunk-AWWW6K2I.js +407 -0
  115. package/dist/chunk-AWWW6K2I.js.map +7 -0
  116. package/dist/chunk-BAY47D5E.js +226 -0
  117. package/dist/chunk-CFHKYLDY.js +26 -0
  118. package/dist/chunk-CJZN7HFL.js +293 -0
  119. package/dist/chunk-CXOF4UGH.js +229 -0
  120. package/dist/chunk-CXOF4UGH.js.map +7 -0
  121. package/dist/chunk-D4QFQQWJ.js +170 -0
  122. package/dist/chunk-DNCSPTOQ.js +446 -0
  123. package/dist/chunk-DQGSCCI3.js +100 -0
  124. package/dist/chunk-EWGMLVC7.js +34 -0
  125. package/dist/chunk-F7PB5HGT.js +148 -0
  126. package/dist/chunk-G7QKLA54.js +92 -0
  127. package/dist/chunk-HWHG63LH.js +148 -0
  128. package/dist/chunk-HWHG63LH.js.map +7 -0
  129. package/dist/chunk-HYZG6OPC.js +467 -0
  130. package/dist/chunk-HYZG6OPC.js.map +7 -0
  131. package/dist/chunk-IBBMKCO7.js +526 -0
  132. package/dist/chunk-IBBMKCO7.js.map +7 -0
  133. package/dist/chunk-IQUYTZOA.js +455 -0
  134. package/dist/chunk-IQUYTZOA.js.map +7 -0
  135. package/dist/chunk-J5RINDKS.js +480 -0
  136. package/dist/chunk-JMPSZMDD.js +52 -0
  137. package/dist/chunk-KQMEJUWI.js +815 -0
  138. package/dist/chunk-KWFEGPZL.js +97 -0
  139. package/dist/chunk-KWFEGPZL.js.map +7 -0
  140. package/dist/chunk-LBXZGYU5.js +368 -0
  141. package/dist/chunk-LBXZGYU5.js.map +7 -0
  142. package/dist/chunk-LRBNYEFI.js +50 -0
  143. package/dist/chunk-LRBNYEFI.js.map +7 -0
  144. package/dist/chunk-LRMV5DNW.js +441 -0
  145. package/dist/chunk-LWNOC7AJ.js +54 -0
  146. package/dist/chunk-MICNOSX7.js +129 -0
  147. package/dist/chunk-MLWNMXAV.js +272 -0
  148. package/dist/chunk-MMBLSLQR.js +158 -0
  149. package/dist/chunk-N3QEGDEZ.js +117 -0
  150. package/dist/chunk-N3QEGDEZ.js.map +7 -0
  151. package/dist/chunk-NV5XWADG.js +1150 -0
  152. package/dist/chunk-NVB7MQLH.js +20649 -0
  153. package/dist/chunk-NVB7MQLH.js.map +7 -0
  154. package/dist/chunk-O3255WPP.js +1087 -0
  155. package/dist/chunk-OSM7YS23.js +276 -0
  156. package/dist/chunk-PEWHCKCH.js +1205 -0
  157. package/dist/chunk-PEWHCKCH.js.map +7 -0
  158. package/dist/chunk-Q7PYFSNU.js +107 -0
  159. package/dist/chunk-QEZPKEWB.js +1159 -0
  160. package/dist/chunk-QEZPKEWB.js.map +7 -0
  161. package/dist/chunk-QMI222IJ.js +386 -0
  162. package/dist/chunk-QRIRWDIW.js +252 -0
  163. package/dist/chunk-SJTOSA7E.js +629 -0
  164. package/dist/chunk-SRYFYAXK.js +615 -0
  165. package/dist/chunk-SSPDNHDW.js +398 -0
  166. package/dist/chunk-SSPDNHDW.js.map +7 -0
  167. package/dist/chunk-SYMOQE3X.js +37 -0
  168. package/dist/chunk-SYMOQE3X.js.map +7 -0
  169. package/dist/chunk-TITA4HJA.js +228 -0
  170. package/dist/chunk-U7ZMIMI5.js +2815 -0
  171. package/dist/chunk-UJU3Q7QJ.js +119 -0
  172. package/dist/chunk-UL2ISTHR.js +2672 -0
  173. package/dist/chunk-VIPMLSZP.js +217 -0
  174. package/dist/chunk-VYIO7T6J.js +82 -0
  175. package/dist/chunk-VYIO7T6J.js.map +7 -0
  176. package/dist/chunk-VZPYIG77.js +1271 -0
  177. package/dist/chunk-VZPYIG77.js.map +7 -0
  178. package/dist/chunk-W345H42C.js +273 -0
  179. package/dist/chunk-W345H42C.js.map +7 -0
  180. package/dist/chunk-WGL6FIUE.js +330 -0
  181. package/dist/chunk-WIYKAKWE.js +302 -0
  182. package/dist/chunk-WJGVQJSX.js +514 -0
  183. package/dist/chunk-WJGVQJSX.js.map +7 -0
  184. package/dist/chunk-WPHOEG56.js +194 -0
  185. package/dist/chunk-WU63AOK2.js +4207 -0
  186. package/dist/chunk-WU63AOK2.js.map +7 -0
  187. package/dist/chunk-XS4QWRS3.js +205 -0
  188. package/dist/chunk-XYFDBYOY.js +1658 -0
  189. package/dist/chunk-XYFDBYOY.js.map +7 -0
  190. package/dist/chunk-YDWRIMCT.js +289 -0
  191. package/dist/chunk-YDWRIMCT.js.map +7 -0
  192. package/dist/chunk-YK5NFMHR.js +269 -0
  193. package/dist/chunk-YK5NFMHR.js.map +7 -0
  194. package/dist/chunk-YSW57QDM.js +6364 -0
  195. package/dist/chunk-YXQNZPCO.js +203 -0
  196. package/dist/chunk-YYYJB53A.js +2370 -0
  197. package/dist/chunk-ZTKQLABY.js +470 -0
  198. package/dist/condition-AM523RDR.js +330 -0
  199. package/dist/controls-HTMH5QBP.js +39 -0
  200. package/dist/controls.config-EEK2RBPI.js +37 -0
  201. package/dist/correlation-HKD67SPS.js +96 -0
  202. package/dist/cuminc-66V55MMN.js +1147 -0
  203. package/dist/cuminc.integration.spec-PNTOPB2L.js +676 -0
  204. package/dist/customdata.inputui-Z4WQDU6I.js +285 -0
  205. package/dist/dataDownload-3ZEI22OK.js +328 -0
  206. package/dist/dataDownload.integration.spec-C3JRC6K5.js +191 -0
  207. package/dist/databrowser.ui-Q365SHBG.js +419 -0
  208. package/dist/dictionary-D4E2VEJT.js +109 -0
  209. package/dist/dictionary-D4E2VEJT.js.map +7 -0
  210. package/dist/dnaMethylation-IFZWWBUG.js +36 -0
  211. package/dist/dnaMethylation.integration.spec-UKV4BSIO.js +165 -0
  212. package/dist/dnaMethylation.integration.spec-UKV4BSIO.js.map +7 -0
  213. package/dist/e2pca-I3QXF7EM.js +348 -0
  214. package/dist/ep-2VCQ36GT.js +1254 -0
  215. package/dist/expclust.gdc.spec-VWIQFY67.js +305 -0
  216. package/dist/facet-CHP3VUWS.js +519 -0
  217. package/dist/geneExpClustering-YDIDEH2O.js +246 -0
  218. package/dist/geneExpression-FA5RJRHZ.js +36 -0
  219. package/dist/geneExpression-X2KXJPND.js +312 -0
  220. package/dist/geneExpression.unit.spec-3LVHYZGG.js +100 -0
  221. package/dist/geneORA-4CAYRKSN.js +276 -0
  222. package/dist/geneVariant-OCOTNUH4.js +39 -0
  223. package/dist/geneVariant-Y4L5W5HF.js +37 -0
  224. package/dist/geneVariant.integration.spec-BOJ5MM5K.js +196 -0
  225. package/dist/genefusion.ui-I6HZOBIV.js +249 -0
  226. package/dist/geneset-GEWKDAAT.js +194 -0
  227. package/dist/genomeBrowser.spec-FDEGH4DY.js +279 -0
  228. package/dist/grin2-K56B6XBZ.js +1031 -0
  229. package/dist/grin2-V6FMM44N.js +1554 -0
  230. package/dist/gsea-UNPPRU2U.js +45 -0
  231. package/dist/hierCluster-DXAWRQNI.js +58 -0
  232. package/dist/hierCluster-SPIQA2M2.js +62 -0
  233. package/dist/hierCluster.config-JW6D3T3Q.js +38 -0
  234. package/dist/hierCluster.integration.spec-5NXZY4LG.js +374 -0
  235. package/dist/hierCluster.interactivity-CPPBXHM7.js +52 -0
  236. package/dist/hierCluster.renderers-A6MEGO2B.js +21 -0
  237. package/dist/imagePlot-QLAHCULW.js +139 -0
  238. package/dist/importPlot-6ITZ6U7G.js +8 -0
  239. package/dist/isoformExpression-7GAUF2QV.js +38 -0
  240. package/dist/isoformExpression.unit.spec-3BVXVVNO.js +206 -0
  241. package/dist/isoformExpression.unit.spec-3BVXVVNO.js.map +7 -0
  242. package/dist/jspdf.es.min-FC3BCETM.js +40 -0
  243. package/dist/launch.adhoc-HFHBAUR6.js +40 -0
  244. package/dist/leftlabel.sample-CWPJUCHR.js +257 -0
  245. package/dist/lollipop-QFRQLEER.js +166 -0
  246. package/dist/maf-OEODBT3Y.js +450 -0
  247. package/dist/maf-OEODBT3Y.js.map +7 -0
  248. package/dist/maftimeline-2DFIF4C4.js +591 -0
  249. package/dist/matrix-3HFB5TUU.js +57 -0
  250. package/dist/matrix-MIXK27AD.js +62 -0
  251. package/dist/matrix.cells-U7AQNEBP.js +28 -0
  252. package/dist/matrix.config-FX5MHX6O.js +39 -0
  253. package/dist/matrix.controls-5K7BB5Z4.js +37 -0
  254. package/dist/matrix.data-EEIY6AO4.js +25 -0
  255. package/dist/matrix.dom-6QL3AJMW.js +11 -0
  256. package/dist/matrix.groups-CUB6UWC5.js +26 -0
  257. package/dist/matrix.integration.spec-ML4T7FRG.js +3070 -0
  258. package/dist/matrix.interactivity-QMPWX63Q.js +40 -0
  259. package/dist/matrix.layout-7SEF6MYI.js +42 -0
  260. package/dist/matrix.legend-42LQGAGX.js +22 -0
  261. package/dist/matrix.renderers-ZF7LLER3.js +36 -0
  262. package/dist/matrix.serieses-4B2WB526.js +21 -0
  263. package/dist/matrix.sort-BJACNR7G.js +27 -0
  264. package/dist/matrix.sort.unit.spec-ZGSM7HDJ.js +470 -0
  265. package/dist/matrix.sorterUi-W6XFYZY2.js +18 -0
  266. package/dist/matrix.sorterUi.unit.spec-V34ZZD7A.js +340 -0
  267. package/dist/mavb-NVQVFU6E.js +730 -0
  268. package/dist/mds.fimo-HOCF6U6K.js +516 -0
  269. package/dist/mds.samplescatterplot-ULD5BK5R.js +1548 -0
  270. package/dist/mds.survivalplot-5US32RQD.js +481 -0
  271. package/dist/oncomatrix-Y3G3MUJJ.js +293 -0
  272. package/dist/oncomatrix-Y3G3MUJJ.js.map +7 -0
  273. package/dist/oncomatrix.spec-MFUJLWEP.js +446 -0
  274. package/dist/plot.2dvaf-F4WZ4YPU.js +375 -0
  275. package/dist/plot.app-YFFLLBU5.js +39 -0
  276. package/dist/plot.barplot-2EJ2MWQD.js +100 -0
  277. package/dist/plot.boxplot-AKZM443E.js +150 -0
  278. package/dist/plot.brainImaging-DR6WJNFZ.js +51 -0
  279. package/dist/plot.disco-LBE5H67U.js +101 -0
  280. package/dist/plot.disco-LBE5H67U.js.map +7 -0
  281. package/dist/plot.dzi-R2MR7HAT.js +33 -0
  282. package/dist/plot.ssgq-C52YIUFY.js +137 -0
  283. package/dist/plot.vaf2cov-FOD3K7BC.js +257 -0
  284. package/dist/plot.wsi-D2TXYERK.js +36 -0
  285. package/dist/polar-2LC35O6K.js +184 -0
  286. package/dist/polar2-QPUOEUJZ.js +226 -0
  287. package/dist/profile.spec-3NCDGHLX.js +78 -0
  288. package/dist/profileBarchart-PPQ3NL4D.js +265 -0
  289. package/dist/profileForms-GS3VVW65.js +438 -0
  290. package/dist/profilePlot-DQWFH5NC.js +52 -0
  291. package/dist/profileRadar-KAKRDC4R.js +261 -0
  292. package/dist/profileRadarFacility-FZP62VPV.js +261 -0
  293. package/dist/profileRadarFacility-FZP62VPV.js.map +7 -0
  294. package/dist/proteinView-LWVWJY54.js +444 -0
  295. package/dist/proteinView-LWVWJY54.js.map +7 -0
  296. package/dist/proteomeAbundance-DE4NVBCN.js +21 -0
  297. package/dist/proteomeAbundance-LTB3QR3G.js +63 -0
  298. package/dist/qualitative-YOFAROVR.js +41 -0
  299. package/dist/regression-PF6IAHJK.js +54 -0
  300. package/dist/regression.inputs-77IUYED3.js +46 -0
  301. package/dist/regression.inputs.term-WWCHU6KF.js +46 -0
  302. package/dist/regression.inputs.values.table-I6GM6MU7.js +43 -0
  303. package/dist/regression.integration.spec-DGEZUURU.js +782 -0
  304. package/dist/regression.integration.spec-DGEZUURU.js.map +7 -0
  305. package/dist/regression.results-6GXNKYUS.js +38 -0
  306. package/dist/regression.spec-MEFQNY34.js +706 -0
  307. package/dist/report-LG3UKZHL.js +220 -0
  308. package/dist/sampleScatter.spec-D3IK7MSA.js +200 -0
  309. package/dist/sampleView-XUI2J5EC.js +46 -0
  310. package/dist/samplelst-A7IHCBAX.js +109 -0
  311. package/dist/samplematrix-VGUU7Q75.js +2196 -0
  312. package/dist/sc-UVKVT2RY.js +84 -0
  313. package/dist/scatter-UILUYOGO.js +800 -0
  314. package/dist/scatter.integration.spec-VPNALPUG.js +1194 -0
  315. package/dist/scatter.integration.spec-VPNALPUG.js.map +7 -0
  316. package/dist/selectGenomeWithTklst-LWKIMZEJ.js +132 -0
  317. package/dist/singleCellCellType-TI52WQQ4.js +36 -0
  318. package/dist/singleCellCellType.unit.spec-R3BTRFRU.js +158 -0
  319. package/dist/singleCellCellType.unit.spec-R3BTRFRU.js.map +7 -0
  320. package/dist/singleCellGeneExpression-I5SAHMGI.js +36 -0
  321. package/dist/singleCellGeneExpression.unit.spec-2JTB5HLY.js +151 -0
  322. package/dist/singleCellGeneExpression.unit.spec-2JTB5HLY.js.map +7 -0
  323. package/dist/singleCellPlot-HRWCHYCI.js +51 -0
  324. package/dist/singlecell-BHPP7KCO.js +1570 -0
  325. package/dist/singlecell-PQNKBKR7.js +84 -0
  326. package/dist/snp-V4YGI7B3.js +36 -0
  327. package/dist/snp.unit.spec-JSUCMGNP.js +174 -0
  328. package/dist/snplocus-3YT5NNCH.js +206 -0
  329. package/dist/spliceevent.a53ss.diagram-QEQJ44YH.js +149 -0
  330. package/dist/spliceevent.exonskip.diagram-HMWVSOJG.js +275 -0
  331. package/dist/spliceevent.noeventdiagram-L5HUCT5A.js +458 -0
  332. package/dist/ssGSEA-Z3XRCBYW.js +36 -0
  333. package/dist/ssGSEA.unit.spec-EUCTV2XJ.js +86 -0
  334. package/dist/summarizeCnvGeneexp-O7O2CFW4.js +161 -0
  335. package/dist/summarizeCnvGeneexp-O7O2CFW4.js.map +7 -0
  336. package/dist/summarizeGeneexpSurvival-DDPH56EI.js +106 -0
  337. package/dist/summarizeGeneexpSurvival-DDPH56EI.js.map +7 -0
  338. package/dist/summarizeMutationCnv-6KJQUJWR.js +162 -0
  339. package/dist/summarizeMutationCnv-6KJQUJWR.js.map +7 -0
  340. package/dist/summarizeMutationDiagnosis-HFFYLQOF.js +38 -0
  341. package/dist/summarizeMutationSurvival-OBK6YILP.js +97 -0
  342. package/dist/summary-W55WWIU2.js +47 -0
  343. package/dist/summary.integration.spec-X2PNAUKW.js +412 -0
  344. package/dist/summaryInput-X547Q6C7.js +218 -0
  345. package/dist/sunburst-KWNGYBRI.js +282 -0
  346. package/dist/sunburst-KWNGYBRI.js.map +7 -0
  347. package/dist/survival-PAJZHZPD.js +56 -0
  348. package/dist/survival-TQPWMOD5.js +44 -0
  349. package/dist/survival.integration.spec-YMQASOMX.js +800 -0
  350. package/dist/survival.integration.spec-YMQASOMX.js.map +7 -0
  351. package/dist/svg2pdf.es.min-CYTPRWNB.js +3157 -0
  352. package/dist/svgraph-Y35C2M3D.js +1385 -0
  353. package/dist/svmr-WGCIR7PE.js +3840 -0
  354. package/dist/table-Q3B2YXEN.js +198 -0
  355. package/dist/termCollection-A6YTSM5I.js +177 -0
  356. package/dist/termCollection-NTFNVQ7D.js +36 -0
  357. package/dist/termCollection.unit.spec-BX54PHKT.js +206 -0
  358. package/dist/tk-OCBZ7YR6.js +44 -0
  359. package/dist/tp.ui-ZT47N2CO.js +1457 -0
  360. package/dist/tvs.dt-BFB253O3.js +37 -0
  361. package/dist/tvs.dtcnv.categorical-ARGAYIDO.js +38 -0
  362. package/dist/tvs.dtcnv.continuous-JCU23ERV.js +70 -0
  363. package/dist/tvs.dtfusion-FV64XLZI.js +38 -0
  364. package/dist/tvs.dtsnvindel-DMOXMEVL.js +38 -0
  365. package/dist/tvs.dtsv-53FSZEPV.js +38 -0
  366. package/dist/tvs.samplelst-MVPL6VXX.js +102 -0
  367. package/dist/tvs.termCollection-UGJXTHTG.js +151 -0
  368. package/dist/violin-ZLUDGSQG.js +44 -0
  369. package/dist/violin.integration.spec-KWOFOFLT.js +1423 -0
  370. package/dist/violin.integration.spec-KWOFOFLT.js.map +7 -0
  371. package/dist/violin.interactivity-ULDOCZWW.js +36 -0
  372. package/dist/violin.renderer-KJAXPMIK.js +38 -0
  373. package/dist/vocabulary-34YUQ4ZQ.js +39 -0
  374. package/package.json +3 -3
  375. package/dist/2dmaf-PFPBHIUI.js +0 -1371
  376. package/dist/AIProjectAdmin-H2GB5ZOX.js +0 -830
  377. package/dist/AIProjectAdmin-H2GB5ZOX.js.map +0 -7
  378. package/dist/AppHeader-FCWML6WH.js +0 -833
  379. package/dist/BoxPlot-QKXGF76K.js +0 -1295
  380. package/dist/BoxPlot-QKXGF76K.js.map +0 -7
  381. package/dist/CorrelationVolcano-ZJ7Q6JBC.js +0 -617
  382. package/dist/DifferentialAnalysis-PWCFCWFY.js +0 -238
  383. package/dist/Disco-IE5JKIF2.js +0 -3199
  384. package/dist/Disco-IE5JKIF2.js.map +0 -7
  385. package/dist/Disco.UI-SR7LSJE3.js +0 -242
  386. package/dist/DmrPlot-UDY7GOSY.js +0 -640
  387. package/dist/GB-GNTOP5C6.js +0 -1125
  388. package/dist/HicApp-FZTJL3OA.js +0 -2248
  389. package/dist/NumBinaryEditor-R5QVG3C4.js +0 -266
  390. package/dist/NumBinaryEditor-R5QVG3C4.js.map +0 -7
  391. package/dist/NumBinaryEditor.unit.spec-BMVRI24W.js +0 -284
  392. package/dist/NumContEditor-6JT5D6IW.js +0 -105
  393. package/dist/NumContEditor.unit.spec-XBQF2SW6.js +0 -167
  394. package/dist/NumCustomBinEditor-MEKEFOQI.js +0 -36
  395. package/dist/NumCustomBinEditor.unit.spec-LEMQJHDT.js +0 -282
  396. package/dist/NumDiscreteEditor-U3N37XRQ.js +0 -170
  397. package/dist/NumDiscreteEditor-U3N37XRQ.js.map +0 -7
  398. package/dist/NumDiscreteEditor.unit.spec-WQM4DLKO.js +0 -200
  399. package/dist/NumRegularBinEditor-HQR5Y6P7.js +0 -36
  400. package/dist/NumRegularBinEditor.unit.spec-FL4IFT7L.js +0 -225
  401. package/dist/NumSplineEditor-OESWMWP5.js +0 -188
  402. package/dist/NumSplineEditor-OESWMWP5.js.map +0 -7
  403. package/dist/NumSplineEditor.unit.spec-HYOXO45B.js +0 -197
  404. package/dist/NumericDensity-GJZ4BBJS.js +0 -36
  405. package/dist/NumericDensity.unit.spec-6LXWAXW7.js +0 -219
  406. package/dist/NumericHandler-LZIMPOHS.js +0 -37
  407. package/dist/NumericHandler.unit.spec-ZSU35AMD.js +0 -217
  408. package/dist/RunChart2-7XV6TIFO.js +0 -756
  409. package/dist/RunChart2-7XV6TIFO.js.map +0 -7
  410. package/dist/SC-E4EYAG26.js +0 -733
  411. package/dist/SC-E4EYAG26.js.map +0 -7
  412. package/dist/Volcano-Z7TJK6PW.js +0 -1187
  413. package/dist/Volcano-Z7TJK6PW.js.map +0 -7
  414. package/dist/WSIViewer-ZH2XABLC.js +0 -47933
  415. package/dist/WSIViewer-ZH2XABLC.js.map +0 -7
  416. package/dist/WsiSamplesPlot-BL47MDHQ.js +0 -163
  417. package/dist/adSandbox-V3NTKVBC.js +0 -36
  418. package/dist/alphaGenome-IQVFCSWQ.js +0 -173
  419. package/dist/app-GJLZ2G2U.js +0 -47
  420. package/dist/app-YSD2U64Q.js +0 -35
  421. package/dist/bam-TRIF3AIQ.js +0 -849
  422. package/dist/bam-TRIF3AIQ.js.map +0 -7
  423. package/dist/barchart-GLLUYTAJ.js +0 -45
  424. package/dist/barchart.data-FRYRGKH3.js +0 -22
  425. package/dist/barchart.events-WODVSHRN.js +0 -45
  426. package/dist/barchart.integration.spec-6POS3V3T.js +0 -1675
  427. package/dist/bars.renderer-T5R3UIBW.js +0 -12
  428. package/dist/block-2QM37YSE.js +0 -6300
  429. package/dist/block-2QM37YSE.js.map +0 -7
  430. package/dist/block.init-7HDLKQVX.js +0 -36
  431. package/dist/block.mds.expressionrank-UIB25S6E.js +0 -357
  432. package/dist/block.mds.geneboxplot-4PQYO3MR.js +0 -826
  433. package/dist/block.mds.junction-DWFYZEC2.js +0 -1543
  434. package/dist/block.mds.svcnv-N3KJJ4GQ.js +0 -6799
  435. package/dist/block.svg-2HBDI7BT.js +0 -162
  436. package/dist/block.tk.aicheck-2M4522IQ.js +0 -281
  437. package/dist/block.tk.ase-URIKF6JD.js +0 -363
  438. package/dist/block.tk.bam-HTDMASHX.js +0 -1904
  439. package/dist/block.tk.bedgraphdot-RVKMSFCQ.js +0 -382
  440. package/dist/block.tk.bigwig.ui-7JPEOIKM.js +0 -209
  441. package/dist/block.tk.hicstraw-72J7UJ2J.js +0 -821
  442. package/dist/block.tk.junction-GGFMBCV5.js +0 -2362
  443. package/dist/block.tk.junction.textmatrixui-44SAYYWE.js +0 -197
  444. package/dist/block.tk.ld-XDKJFEOL.js +0 -97
  445. package/dist/block.tk.menu-46FOTM7H.js +0 -1027
  446. package/dist/block.tk.pgv-ZVONRT4B.js +0 -942
  447. package/dist/brainImaging-CSLO7ODJ.js +0 -421
  448. package/dist/chat-GMD22F3K.js +0 -148
  449. package/dist/chunk-22KWZOCN.js +0 -153
  450. package/dist/chunk-22KWZOCN.js.map +0 -7
  451. package/dist/chunk-2NQ4TM74.js +0 -48
  452. package/dist/chunk-2NQ4TM74.js.map +0 -7
  453. package/dist/chunk-2SRMRC6L.js +0 -421
  454. package/dist/chunk-2SRMRC6L.js.map +0 -7
  455. package/dist/chunk-2TIYJ3PH.js +0 -815
  456. package/dist/chunk-2UWHV2SB.js +0 -261
  457. package/dist/chunk-2UWHV2SB.js.map +0 -7
  458. package/dist/chunk-3656ZY4T.js +0 -237
  459. package/dist/chunk-3656ZY4T.js.map +0 -7
  460. package/dist/chunk-3TU6TRLQ.js +0 -98
  461. package/dist/chunk-3TU6TRLQ.js.map +0 -7
  462. package/dist/chunk-4FJ5GS6P.js +0 -4202
  463. package/dist/chunk-4FJ5GS6P.js.map +0 -7
  464. package/dist/chunk-4FO7KZY2.js +0 -534
  465. package/dist/chunk-4OEOQX4L.js +0 -334
  466. package/dist/chunk-4OEOQX4L.js.map +0 -7
  467. package/dist/chunk-5ZICCKEH.js +0 -4952
  468. package/dist/chunk-6UU7VPDO.js +0 -272
  469. package/dist/chunk-6YLQN7FF.js +0 -441
  470. package/dist/chunk-74QJDBIP.js +0 -480
  471. package/dist/chunk-75EBDB7G.js +0 -21
  472. package/dist/chunk-75EBDB7G.js.map +0 -7
  473. package/dist/chunk-7FXPMQRW.js +0 -34
  474. package/dist/chunk-A2Y3GEUH.js +0 -228
  475. package/dist/chunk-AAEXTQT3.js +0 -330
  476. package/dist/chunk-AG6HVFQY.js +0 -504
  477. package/dist/chunk-AG6HVFQY.js.map +0 -7
  478. package/dist/chunk-AHLUW2BN.js +0 -129
  479. package/dist/chunk-AYDXOUFX.js +0 -1275
  480. package/dist/chunk-AYDXOUFX.js.map +0 -7
  481. package/dist/chunk-BBIPZ2UF.js +0 -52
  482. package/dist/chunk-BBVOZ5BY.js +0 -230
  483. package/dist/chunk-BBVOZ5BY.js.map +0 -7
  484. package/dist/chunk-BHVDOW3W.js +0 -470
  485. package/dist/chunk-BNN32RI2.js +0 -36
  486. package/dist/chunk-BNN32RI2.js.map +0 -7
  487. package/dist/chunk-BQLC6QOH.js +0 -368
  488. package/dist/chunk-BQLC6QOH.js.map +0 -7
  489. package/dist/chunk-C5QOWZK6.js +0 -629
  490. package/dist/chunk-CJJ6LDZM.js +0 -170
  491. package/dist/chunk-CJJ6LDZM.js.map +0 -7
  492. package/dist/chunk-D4U5X2QQ.js +0 -261
  493. package/dist/chunk-D4U5X2QQ.js.map +0 -7
  494. package/dist/chunk-DV444SFD.js +0 -26
  495. package/dist/chunk-DWWAB4YQ.js +0 -102
  496. package/dist/chunk-FP5VKE3Z.js +0 -170
  497. package/dist/chunk-G2MAZI6I.js +0 -205
  498. package/dist/chunk-HLRNIO5K.js +0 -158
  499. package/dist/chunk-HTHH2B6D.js +0 -46
  500. package/dist/chunk-HTHH2B6D.js.map +0 -7
  501. package/dist/chunk-I7X6K4OL.js +0 -217
  502. package/dist/chunk-IC7SUXJD.js +0 -82
  503. package/dist/chunk-IC7SUXJD.js.map +0 -7
  504. package/dist/chunk-ITYEOGLB.js +0 -302
  505. package/dist/chunk-J6XKDYNZ.js +0 -276
  506. package/dist/chunk-JDX4E7ZO.js +0 -381
  507. package/dist/chunk-JWX7GYHP.js +0 -95
  508. package/dist/chunk-KISFQDQE.js +0 -258
  509. package/dist/chunk-KISFQDQE.js.map +0 -7
  510. package/dist/chunk-KLFROH3F.js +0 -203
  511. package/dist/chunk-KQSN7PUK.js +0 -215
  512. package/dist/chunk-KQSN7PUK.js.map +0 -7
  513. package/dist/chunk-L2ED35QZ.js +0 -2815
  514. package/dist/chunk-LLPFFNLV.js +0 -526
  515. package/dist/chunk-LLPFFNLV.js.map +0 -7
  516. package/dist/chunk-LRV4VWRF.js +0 -94
  517. package/dist/chunk-LRV4VWRF.js.map +0 -7
  518. package/dist/chunk-M464GTNI.js +0 -615
  519. package/dist/chunk-MDN3K2BG.js +0 -229
  520. package/dist/chunk-MDN3K2BG.js.map +0 -7
  521. package/dist/chunk-N46WTUX7.js +0 -286
  522. package/dist/chunk-N46WTUX7.js.map +0 -7
  523. package/dist/chunk-NBMJ2UMA.js +0 -194
  524. package/dist/chunk-NI7VSKJI.js +0 -293
  525. package/dist/chunk-NTVM4ZPG.js +0 -2784
  526. package/dist/chunk-O64UTRAC.js +0 -252
  527. package/dist/chunk-OM326NV3.js +0 -100
  528. package/dist/chunk-P4ENJUBN.js +0 -386
  529. package/dist/chunk-PEKVBCIH.js +0 -824
  530. package/dist/chunk-PF6MKI4X.js +0 -92
  531. package/dist/chunk-PJTQP6RL.js +0 -54
  532. package/dist/chunk-PVSRVJBE.js +0 -1201
  533. package/dist/chunk-PVSRVJBE.js.map +0 -7
  534. package/dist/chunk-PZ3L3KM6.js +0 -55
  535. package/dist/chunk-QEHUEG4X.js +0 -1788
  536. package/dist/chunk-QEHUEG4X.js.map +0 -7
  537. package/dist/chunk-QXCVG66S.js +0 -2672
  538. package/dist/chunk-RIGZHHCP.js +0 -119
  539. package/dist/chunk-SEIANPCX.js +0 -142
  540. package/dist/chunk-SK7YVOQN.js +0 -148
  541. package/dist/chunk-SPPZB5ZQ.js +0 -158
  542. package/dist/chunk-SPPZB5ZQ.js.map +0 -7
  543. package/dist/chunk-T5KFRIP4.js +0 -1087
  544. package/dist/chunk-TTSNECVD.js +0 -1413
  545. package/dist/chunk-TTSNECVD.js.map +0 -7
  546. package/dist/chunk-TVXESYIR.js +0 -439
  547. package/dist/chunk-TVXESYIR.js.map +0 -7
  548. package/dist/chunk-U3UR3U3F.js +0 -446
  549. package/dist/chunk-UBS5UVIY.js +0 -13624
  550. package/dist/chunk-UFYU7AKL.js +0 -107
  551. package/dist/chunk-VIYGTRUZ.js +0 -6364
  552. package/dist/chunk-WCTH7CB3.js +0 -31
  553. package/dist/chunk-WGSWVYHY.js +0 -1155
  554. package/dist/chunk-WGSWVYHY.js.map +0 -7
  555. package/dist/chunk-WYZ4COTF.js +0 -226
  556. package/dist/chunk-WZRXJ5LL.js +0 -2370
  557. package/dist/chunk-XDI4UFCZ.js +0 -467
  558. package/dist/chunk-XDI4UFCZ.js.map +0 -7
  559. package/dist/chunk-XZZLEHWC.js +0 -20328
  560. package/dist/chunk-XZZLEHWC.js.map +0 -7
  561. package/dist/chunk-Y7JAPSMG.js +0 -406
  562. package/dist/chunk-Y7JAPSMG.js.map +0 -7
  563. package/dist/chunk-YJ2HC4CP.js +0 -1150
  564. package/dist/chunk-ZLH4PJKX.js +0 -1658
  565. package/dist/chunk-ZLH4PJKX.js.map +0 -7
  566. package/dist/chunk-ZZSDYKD5.js +0 -14
  567. package/dist/condition-S52W57ZO.js +0 -330
  568. package/dist/controls-B4MTTPWO.js +0 -39
  569. package/dist/controls.config-6KBCTIPN.js +0 -37
  570. package/dist/correlation-VSBCBFFP.js +0 -96
  571. package/dist/cuminc-T5ZPAGVB.js +0 -1147
  572. package/dist/cuminc.integration.spec-2QT3IPHU.js +0 -676
  573. package/dist/customdata.inputui-5MHQQHJL.js +0 -285
  574. package/dist/dataDownload-S4EBNHMW.js +0 -328
  575. package/dist/dataDownload.integration.spec-OVSIWI34.js +0 -191
  576. package/dist/databrowser.ui-EAJS3NXV.js +0 -419
  577. package/dist/dictionary-CQHSMVYF.js +0 -98
  578. package/dist/dictionary-CQHSMVYF.js.map +0 -7
  579. package/dist/dnaMethylation-G3F2INDH.js +0 -36
  580. package/dist/dnaMethylation.integration.spec-FWF4353K.js +0 -179
  581. package/dist/dnaMethylation.integration.spec-FWF4353K.js.map +0 -7
  582. package/dist/e2pca-SLXGPVHP.js +0 -348
  583. package/dist/ep-4HGUSDGJ.js +0 -1254
  584. package/dist/expclust.gdc.spec-JJ42ESKE.js +0 -305
  585. package/dist/facet-6WVTVKDV.js +0 -519
  586. package/dist/geneExpClustering-5LOZPD5X.js +0 -246
  587. package/dist/geneExpression-BJ46UGXW.js +0 -312
  588. package/dist/geneExpression-PTSZWKCM.js +0 -36
  589. package/dist/geneExpression.unit.spec-NW5HTO7F.js +0 -100
  590. package/dist/geneORA-H65EZ7QO.js +0 -276
  591. package/dist/geneVariant-T6GWOVZD.js +0 -39
  592. package/dist/geneVariant-WTDFZTXG.js +0 -37
  593. package/dist/geneVariant.integration.spec-OPSBRUM3.js +0 -196
  594. package/dist/genefusion.ui-RSBCC37C.js +0 -249
  595. package/dist/geneset-B67PAZVL.js +0 -194
  596. package/dist/genomeBrowser.spec-AUTULF4C.js +0 -279
  597. package/dist/grin2-CMBP7XVH.js +0 -1031
  598. package/dist/grin2-JVCNH3KW.js +0 -1554
  599. package/dist/gsea-H774WVPQ.js +0 -45
  600. package/dist/hierCluster-IQTXQUMI.js +0 -58
  601. package/dist/hierCluster-ZQJDXYBD.js +0 -62
  602. package/dist/hierCluster.config-ZHJTZK5L.js +0 -38
  603. package/dist/hierCluster.integration.spec-MSJ5GHHK.js +0 -374
  604. package/dist/hierCluster.interactivity-H2GNO6AA.js +0 -52
  605. package/dist/hierCluster.renderers-2TE6HMK2.js +0 -21
  606. package/dist/imagePlot-FMNMB7JZ.js +0 -139
  607. package/dist/importPlot-N66G43XX.js +0 -8
  608. package/dist/isoformExpression-B64WLO3H.js +0 -38
  609. package/dist/isoformExpression.unit.spec-D2R6CRKO.js +0 -126
  610. package/dist/isoformExpression.unit.spec-D2R6CRKO.js.map +0 -7
  611. package/dist/jspdf.es.min-DO4YWL2R.js +0 -40
  612. package/dist/launch.adhoc-MPRAJ3GN.js +0 -40
  613. package/dist/leftlabel.sample-4JCKYXED.js +0 -257
  614. package/dist/lollipop-25ADHT7O.js +0 -166
  615. package/dist/maf-POYTGXT4.js +0 -442
  616. package/dist/maf-POYTGXT4.js.map +0 -7
  617. package/dist/maftimeline-FOQF6O3X.js +0 -591
  618. package/dist/matrix-LHLAYDTQ.js +0 -57
  619. package/dist/matrix-ZKF7NRAD.js +0 -62
  620. package/dist/matrix.cells-H4TS74FJ.js +0 -28
  621. package/dist/matrix.config-HE7QUDER.js +0 -39
  622. package/dist/matrix.controls-VILCLNSC.js +0 -37
  623. package/dist/matrix.data-2OUWYD35.js +0 -25
  624. package/dist/matrix.dom-IZFFS4RQ.js +0 -11
  625. package/dist/matrix.groups-5BGJIOOJ.js +0 -26
  626. package/dist/matrix.integration.spec-DSXZHAEY.js +0 -3070
  627. package/dist/matrix.interactivity-VK3NWX5M.js +0 -40
  628. package/dist/matrix.layout-PUNMMNCC.js +0 -42
  629. package/dist/matrix.legend-QMERGVYU.js +0 -22
  630. package/dist/matrix.renderers-2KQ2NXSQ.js +0 -36
  631. package/dist/matrix.serieses-24G3XPJD.js +0 -21
  632. package/dist/matrix.sort-HTVT4K7C.js +0 -27
  633. package/dist/matrix.sort.unit.spec-EUVL76NB.js +0 -470
  634. package/dist/matrix.sorterUi-PJPFXWOJ.js +0 -18
  635. package/dist/matrix.sorterUi.unit.spec-QWL5Y4DQ.js +0 -340
  636. package/dist/mavb-UGM5SHEF.js +0 -730
  637. package/dist/mds.fimo-64US7RTE.js +0 -516
  638. package/dist/mds.samplescatterplot-JMXLXVIE.js +0 -1548
  639. package/dist/mds.survivalplot-RJ5UD3IU.js +0 -481
  640. package/dist/oncomatrix-ZFT3DRAP.js +0 -293
  641. package/dist/oncomatrix-ZFT3DRAP.js.map +0 -7
  642. package/dist/oncomatrix.spec-4YLKDGFE.js +0 -446
  643. package/dist/plot.2dvaf-DYSU6BBN.js +0 -375
  644. package/dist/plot.app-NFBVLAXZ.js +0 -39
  645. package/dist/plot.barplot-DBGTDK7J.js +0 -100
  646. package/dist/plot.boxplot-MCKZUROP.js +0 -150
  647. package/dist/plot.brainImaging-BBAVUEB4.js +0 -51
  648. package/dist/plot.disco-VGOEQYRL.js +0 -101
  649. package/dist/plot.disco-VGOEQYRL.js.map +0 -7
  650. package/dist/plot.dzi-YQIFOTZQ.js +0 -33
  651. package/dist/plot.ssgq-MU3BRTMC.js +0 -137
  652. package/dist/plot.vaf2cov-KDHZ7JXJ.js +0 -257
  653. package/dist/plot.wsi-G2TUGQF7.js +0 -36
  654. package/dist/polar-RCCZXZIU.js +0 -184
  655. package/dist/polar2-COQ3WIGW.js +0 -226
  656. package/dist/profile.spec-A4ZASR2T.js +0 -78
  657. package/dist/profileBarchart-GB4RK5DF.js +0 -265
  658. package/dist/profileForms-O5KBHRF6.js +0 -438
  659. package/dist/profilePlot-COCLCP5B.js +0 -52
  660. package/dist/profileRadar-4EE3YDOH.js +0 -261
  661. package/dist/profileRadarFacility-JYTSGA5H.js +0 -261
  662. package/dist/profileRadarFacility-JYTSGA5H.js.map +0 -7
  663. package/dist/proteomeAbundance-JBVXUSD6.js +0 -19
  664. package/dist/proteomeAbundance-NQVU4DOW.js +0 -63
  665. package/dist/qualitative-QROOPDSI.js +0 -41
  666. package/dist/regression-7FQZ22OO.js +0 -54
  667. package/dist/regression.inputs-F62CES3A.js +0 -46
  668. package/dist/regression.inputs.term-BCGP7PX4.js +0 -46
  669. package/dist/regression.inputs.values.table-D3ZXZSH7.js +0 -43
  670. package/dist/regression.integration.spec-P2BBTT2O.js +0 -784
  671. package/dist/regression.integration.spec-P2BBTT2O.js.map +0 -7
  672. package/dist/regression.results-JX6RJQQP.js +0 -38
  673. package/dist/regression.spec-ROME7T33.js +0 -706
  674. package/dist/report-B6MM4T6B.js +0 -220
  675. package/dist/sampleScatter.spec-EPCMC3SR.js +0 -200
  676. package/dist/sampleView-77EAJ75T.js +0 -46
  677. package/dist/samplelst-CX4NQWA7.js +0 -109
  678. package/dist/samplematrix-PYQFAH64.js +0 -2196
  679. package/dist/sc-X6SI5VVI.js +0 -84
  680. package/dist/scatter-ZFFHAI4F.js +0 -800
  681. package/dist/scatter.integration.spec-NN43OXRN.js +0 -1194
  682. package/dist/scatter.integration.spec-NN43OXRN.js.map +0 -7
  683. package/dist/selectGenomeWithTklst-CZMVTBMD.js +0 -132
  684. package/dist/singleCellCellType-GOBX7JKV.js +0 -36
  685. package/dist/singleCellCellType.unit.spec-F344QMTQ.js +0 -177
  686. package/dist/singleCellCellType.unit.spec-F344QMTQ.js.map +0 -7
  687. package/dist/singleCellGeneExpression-BLMNMEAI.js +0 -36
  688. package/dist/singleCellGeneExpression.unit.spec-6ZEPUFWC.js +0 -163
  689. package/dist/singleCellGeneExpression.unit.spec-6ZEPUFWC.js.map +0 -7
  690. package/dist/singleCellPlot-HLD7PLQH.js +0 -51
  691. package/dist/singlecell-HL4GLGIA.js +0 -1570
  692. package/dist/singlecell-JQFPINRS.js +0 -84
  693. package/dist/snp-EAUNFDAV.js +0 -36
  694. package/dist/snp.unit.spec-AVLPMAWI.js +0 -174
  695. package/dist/snplocus-2J7OA6OL.js +0 -206
  696. package/dist/spliceevent.a53ss.diagram-4DU2U7NW.js +0 -149
  697. package/dist/spliceevent.exonskip.diagram-GG5FGXOK.js +0 -275
  698. package/dist/spliceevent.noeventdiagram-T6RNIMCM.js +0 -458
  699. package/dist/ssGSEA-XJWLRVFQ.js +0 -36
  700. package/dist/ssGSEA.unit.spec-MQ23ODYO.js +0 -86
  701. package/dist/summarizeCnvGeneexp-CJPC76RM.js +0 -158
  702. package/dist/summarizeCnvGeneexp-CJPC76RM.js.map +0 -7
  703. package/dist/summarizeGeneexpSurvival-FGCFZTVG.js +0 -105
  704. package/dist/summarizeGeneexpSurvival-FGCFZTVG.js.map +0 -7
  705. package/dist/summarizeMutationCnv-4E7R2NHQ.js +0 -159
  706. package/dist/summarizeMutationCnv-4E7R2NHQ.js.map +0 -7
  707. package/dist/summarizeMutationDiagnosis-ZVX7AZK7.js +0 -38
  708. package/dist/summarizeMutationSurvival-EWXD7TCT.js +0 -97
  709. package/dist/summary-VUYBKQOC.js +0 -47
  710. package/dist/summary.integration.spec-EPBV5XCT.js +0 -412
  711. package/dist/summaryInput-YX5IRGWM.js +0 -218
  712. package/dist/sunburst-HPDML45I.js +0 -282
  713. package/dist/sunburst-HPDML45I.js.map +0 -7
  714. package/dist/survival-E6SRRXBB.js +0 -44
  715. package/dist/survival-XOXDPXZR.js +0 -56
  716. package/dist/survival.integration.spec-SJBPJZGJ.js +0 -787
  717. package/dist/survival.integration.spec-SJBPJZGJ.js.map +0 -7
  718. package/dist/svg2pdf.es.min-EZ4UYRSH.js +0 -3157
  719. package/dist/svgraph-D23WG3UE.js +0 -1385
  720. package/dist/svmr-UFC4TKWV.js +0 -3840
  721. package/dist/table-US2K6IYZ.js +0 -198
  722. package/dist/termCollection-E7S57CIN.js +0 -177
  723. package/dist/termCollection-ZMP3VE2G.js +0 -36
  724. package/dist/termCollection.unit.spec-MDWK6XH3.js +0 -206
  725. package/dist/tk-TLQJK6R4.js +0 -44
  726. package/dist/tp.ui-NQEAKWUH.js +0 -1457
  727. package/dist/tvs.dt-U2MINIBH.js +0 -37
  728. package/dist/tvs.dtcnv.categorical-2OOAZJKC.js +0 -38
  729. package/dist/tvs.dtcnv.continuous-5ETKBJ52.js +0 -70
  730. package/dist/tvs.dtfusion-EB4PPR3Y.js +0 -38
  731. package/dist/tvs.dtsnvindel-IRQPTKQF.js +0 -38
  732. package/dist/tvs.dtsv-TOVXZJCR.js +0 -38
  733. package/dist/tvs.samplelst-4SCH543Y.js +0 -102
  734. package/dist/tvs.termCollection-GGN5F6HC.js +0 -151
  735. package/dist/violin-7D7DN74I.js +0 -44
  736. package/dist/violin.integration.spec-KE76AL54.js +0 -1417
  737. package/dist/violin.integration.spec-KE76AL54.js.map +0 -7
  738. package/dist/violin.interactivity-YPJ2H6SQ.js +0 -36
  739. package/dist/violin.renderer-UK7WSA2Z.js +0 -38
  740. package/dist/vocabulary-KLWZ6LRP.js +0 -39
  741. /package/dist/{2dmaf-PFPBHIUI.js.map → 2dmaf-YHYYSSKR.js.map} +0 -0
  742. /package/dist/{AppHeader-FCWML6WH.js.map → AppHeader-T4ZLY3VG.js.map} +0 -0
  743. /package/dist/{CorrelationVolcano-ZJ7Q6JBC.js.map → CorrelationVolcano-EXH4P56S.js.map} +0 -0
  744. /package/dist/{DifferentialAnalysis-PWCFCWFY.js.map → DifferentialAnalysis-P6GKHAS5.js.map} +0 -0
  745. /package/dist/{Disco.UI-SR7LSJE3.js.map → Disco.UI-4A2P5Q55.js.map} +0 -0
  746. /package/dist/{DmrPlot-UDY7GOSY.js.map → DmrPlot-6EEEGD32.js.map} +0 -0
  747. /package/dist/{GB-GNTOP5C6.js.map → GB-XFO5I6ND.js.map} +0 -0
  748. /package/dist/{HicApp-FZTJL3OA.js.map → HicApp-3LFHOOAR.js.map} +0 -0
  749. /package/dist/{NumBinaryEditor.unit.spec-BMVRI24W.js.map → NumBinaryEditor.unit.spec-2PYZ7P2R.js.map} +0 -0
  750. /package/dist/{NumContEditor-6JT5D6IW.js.map → NumContEditor-BMWALLQM.js.map} +0 -0
  751. /package/dist/{NumContEditor.unit.spec-XBQF2SW6.js.map → NumContEditor.unit.spec-ETVLVX6A.js.map} +0 -0
  752. /package/dist/{NumCustomBinEditor-MEKEFOQI.js.map → NumCustomBinEditor-2XJ6GUWY.js.map} +0 -0
  753. /package/dist/{NumCustomBinEditor.unit.spec-LEMQJHDT.js.map → NumCustomBinEditor.unit.spec-TZVL553E.js.map} +0 -0
  754. /package/dist/{NumDiscreteEditor.unit.spec-WQM4DLKO.js.map → NumDiscreteEditor.unit.spec-KQND2XAE.js.map} +0 -0
  755. /package/dist/{NumRegularBinEditor-HQR5Y6P7.js.map → NumRegularBinEditor-OYELFDIB.js.map} +0 -0
  756. /package/dist/{NumRegularBinEditor.unit.spec-FL4IFT7L.js.map → NumRegularBinEditor.unit.spec-44SALKLH.js.map} +0 -0
  757. /package/dist/{NumSplineEditor.unit.spec-HYOXO45B.js.map → NumSplineEditor.unit.spec-XKB4XXU4.js.map} +0 -0
  758. /package/dist/{NumericDensity-GJZ4BBJS.js.map → NumericDensity-GCNWO7YS.js.map} +0 -0
  759. /package/dist/{NumericDensity.unit.spec-6LXWAXW7.js.map → NumericDensity.unit.spec-7LWNOUYK.js.map} +0 -0
  760. /package/dist/{NumericHandler-LZIMPOHS.js.map → NumericHandler-EMQBI5UI.js.map} +0 -0
  761. /package/dist/{NumericHandler.unit.spec-ZSU35AMD.js.map → NumericHandler.unit.spec-TEELPRIM.js.map} +0 -0
  762. /package/dist/{WsiSamplesPlot-BL47MDHQ.js.map → WsiSamplesPlot-B2DM7Z3Q.js.map} +0 -0
  763. /package/dist/{adSandbox-V3NTKVBC.js.map → adSandbox-INF3NNEV.js.map} +0 -0
  764. /package/dist/{alphaGenome-IQVFCSWQ.js.map → alphaGenome-CO4TQHXN.js.map} +0 -0
  765. /package/dist/{app-GJLZ2G2U.js.map → app-63JU2YIT.js.map} +0 -0
  766. /package/dist/{app-YSD2U64Q.js.map → app-BL3POUOO.js.map} +0 -0
  767. /package/dist/{barchart-GLLUYTAJ.js.map → barchart-PDUXZAIH.js.map} +0 -0
  768. /package/dist/{barchart.data-FRYRGKH3.js.map → barchart.data-EXENRVMU.js.map} +0 -0
  769. /package/dist/{barchart.events-WODVSHRN.js.map → barchart.events-MQNQTSWI.js.map} +0 -0
  770. /package/dist/{barchart.integration.spec-6POS3V3T.js.map → barchart.integration.spec-DSO2377T.js.map} +0 -0
  771. /package/dist/{bars.renderer-T5R3UIBW.js.map → bars.renderer-S7A7I6BQ.js.map} +0 -0
  772. /package/dist/{block.init-7HDLKQVX.js.map → block.init-7J5OHYKA.js.map} +0 -0
  773. /package/dist/{block.mds.expressionrank-UIB25S6E.js.map → block.mds.expressionrank-643H7PN7.js.map} +0 -0
  774. /package/dist/{block.mds.geneboxplot-4PQYO3MR.js.map → block.mds.geneboxplot-C222ODSL.js.map} +0 -0
  775. /package/dist/{block.mds.junction-DWFYZEC2.js.map → block.mds.junction-C5DJRUOK.js.map} +0 -0
  776. /package/dist/{block.mds.svcnv-N3KJJ4GQ.js.map → block.mds.svcnv-4G74JQ7Y.js.map} +0 -0
  777. /package/dist/{block.svg-2HBDI7BT.js.map → block.svg-35KUC5R7.js.map} +0 -0
  778. /package/dist/{block.tk.aicheck-2M4522IQ.js.map → block.tk.aicheck-LLWT6K6H.js.map} +0 -0
  779. /package/dist/{block.tk.ase-URIKF6JD.js.map → block.tk.ase-PQUKY65E.js.map} +0 -0
  780. /package/dist/{block.tk.bam-HTDMASHX.js.map → block.tk.bam-EUEOB7BR.js.map} +0 -0
  781. /package/dist/{block.tk.bedgraphdot-RVKMSFCQ.js.map → block.tk.bedgraphdot-XAHUY545.js.map} +0 -0
  782. /package/dist/{block.tk.bigwig.ui-7JPEOIKM.js.map → block.tk.bigwig.ui-HEOPNL3T.js.map} +0 -0
  783. /package/dist/{block.tk.hicstraw-72J7UJ2J.js.map → block.tk.hicstraw-EPH3LEX2.js.map} +0 -0
  784. /package/dist/{block.tk.junction-GGFMBCV5.js.map → block.tk.junction-MIUDAIAR.js.map} +0 -0
  785. /package/dist/{block.tk.junction.textmatrixui-44SAYYWE.js.map → block.tk.junction.textmatrixui-AVFUQBDS.js.map} +0 -0
  786. /package/dist/{block.tk.ld-XDKJFEOL.js.map → block.tk.ld-ED7YMBQ4.js.map} +0 -0
  787. /package/dist/{block.tk.menu-46FOTM7H.js.map → block.tk.menu-3CVIECWQ.js.map} +0 -0
  788. /package/dist/{block.tk.pgv-ZVONRT4B.js.map → block.tk.pgv-HETJVWXH.js.map} +0 -0
  789. /package/dist/{brainImaging-CSLO7ODJ.js.map → brainImaging-K3LHK3DD.js.map} +0 -0
  790. /package/dist/{chat-GMD22F3K.js.map → chat-BYX5ARUK.js.map} +0 -0
  791. /package/dist/{chunk-WCTH7CB3.js.map → chunk-2LULD7RN.js.map} +0 -0
  792. /package/dist/{chunk-DWWAB4YQ.js.map → chunk-2VFYZ3EY.js.map} +0 -0
  793. /package/dist/{chunk-5ZICCKEH.js.map → chunk-3CD5ZROA.js.map} +0 -0
  794. /package/dist/{chunk-JDX4E7ZO.js.map → chunk-3DCABJHB.js.map} +0 -0
  795. /package/dist/{chunk-JWX7GYHP.js.map → chunk-3MMKHYUM.js.map} +0 -0
  796. /package/dist/{chunk-PZ3L3KM6.js.map → chunk-3PRPMJTG.js.map} +0 -0
  797. /package/dist/{chunk-4FO7KZY2.js.map → chunk-5UMPBVA6.js.map} +0 -0
  798. /package/dist/{chunk-UBS5UVIY.js.map → chunk-6LAE5AVA.js.map} +0 -0
  799. /package/dist/{chunk-PEKVBCIH.js.map → chunk-7FTDQDVF.js.map} +0 -0
  800. /package/dist/{chunk-SEIANPCX.js.map → chunk-7IEZ2KMW.js.map} +0 -0
  801. /package/dist/{chunk-ZZSDYKD5.js.map → chunk-A5AFIW2T.js.map} +0 -0
  802. /package/dist/{chunk-NTVM4ZPG.js.map → chunk-AIBODF32.js.map} +0 -0
  803. /package/dist/{chunk-WYZ4COTF.js.map → chunk-BAY47D5E.js.map} +0 -0
  804. /package/dist/{chunk-DV444SFD.js.map → chunk-CFHKYLDY.js.map} +0 -0
  805. /package/dist/{chunk-NI7VSKJI.js.map → chunk-CJZN7HFL.js.map} +0 -0
  806. /package/dist/{chunk-FP5VKE3Z.js.map → chunk-D4QFQQWJ.js.map} +0 -0
  807. /package/dist/{chunk-U3UR3U3F.js.map → chunk-DNCSPTOQ.js.map} +0 -0
  808. /package/dist/{chunk-OM326NV3.js.map → chunk-DQGSCCI3.js.map} +0 -0
  809. /package/dist/{chunk-7FXPMQRW.js.map → chunk-EWGMLVC7.js.map} +0 -0
  810. /package/dist/{chunk-SK7YVOQN.js.map → chunk-F7PB5HGT.js.map} +0 -0
  811. /package/dist/{chunk-PF6MKI4X.js.map → chunk-G7QKLA54.js.map} +0 -0
  812. /package/dist/{chunk-74QJDBIP.js.map → chunk-J5RINDKS.js.map} +0 -0
  813. /package/dist/{chunk-BBIPZ2UF.js.map → chunk-JMPSZMDD.js.map} +0 -0
  814. /package/dist/{chunk-2TIYJ3PH.js.map → chunk-KQMEJUWI.js.map} +0 -0
  815. /package/dist/{chunk-6YLQN7FF.js.map → chunk-LRMV5DNW.js.map} +0 -0
  816. /package/dist/{chunk-PJTQP6RL.js.map → chunk-LWNOC7AJ.js.map} +0 -0
  817. /package/dist/{chunk-AHLUW2BN.js.map → chunk-MICNOSX7.js.map} +0 -0
  818. /package/dist/{chunk-6UU7VPDO.js.map → chunk-MLWNMXAV.js.map} +0 -0
  819. /package/dist/{chunk-HLRNIO5K.js.map → chunk-MMBLSLQR.js.map} +0 -0
  820. /package/dist/{chunk-YJ2HC4CP.js.map → chunk-NV5XWADG.js.map} +0 -0
  821. /package/dist/{chunk-T5KFRIP4.js.map → chunk-O3255WPP.js.map} +0 -0
  822. /package/dist/{chunk-J6XKDYNZ.js.map → chunk-OSM7YS23.js.map} +0 -0
  823. /package/dist/{chunk-UFYU7AKL.js.map → chunk-Q7PYFSNU.js.map} +0 -0
  824. /package/dist/{chunk-P4ENJUBN.js.map → chunk-QMI222IJ.js.map} +0 -0
  825. /package/dist/{chunk-O64UTRAC.js.map → chunk-QRIRWDIW.js.map} +0 -0
  826. /package/dist/{chunk-C5QOWZK6.js.map → chunk-SJTOSA7E.js.map} +0 -0
  827. /package/dist/{chunk-M464GTNI.js.map → chunk-SRYFYAXK.js.map} +0 -0
  828. /package/dist/{chunk-A2Y3GEUH.js.map → chunk-TITA4HJA.js.map} +0 -0
  829. /package/dist/{chunk-L2ED35QZ.js.map → chunk-U7ZMIMI5.js.map} +0 -0
  830. /package/dist/{chunk-RIGZHHCP.js.map → chunk-UJU3Q7QJ.js.map} +0 -0
  831. /package/dist/{chunk-QXCVG66S.js.map → chunk-UL2ISTHR.js.map} +0 -0
  832. /package/dist/{chunk-I7X6K4OL.js.map → chunk-VIPMLSZP.js.map} +0 -0
  833. /package/dist/{chunk-AAEXTQT3.js.map → chunk-WGL6FIUE.js.map} +0 -0
  834. /package/dist/{chunk-ITYEOGLB.js.map → chunk-WIYKAKWE.js.map} +0 -0
  835. /package/dist/{chunk-NBMJ2UMA.js.map → chunk-WPHOEG56.js.map} +0 -0
  836. /package/dist/{chunk-G2MAZI6I.js.map → chunk-XS4QWRS3.js.map} +0 -0
  837. /package/dist/{chunk-VIYGTRUZ.js.map → chunk-YSW57QDM.js.map} +0 -0
  838. /package/dist/{chunk-KLFROH3F.js.map → chunk-YXQNZPCO.js.map} +0 -0
  839. /package/dist/{chunk-WZRXJ5LL.js.map → chunk-YYYJB53A.js.map} +0 -0
  840. /package/dist/{chunk-BHVDOW3W.js.map → chunk-ZTKQLABY.js.map} +0 -0
  841. /package/dist/{condition-S52W57ZO.js.map → condition-AM523RDR.js.map} +0 -0
  842. /package/dist/{controls-B4MTTPWO.js.map → controls-HTMH5QBP.js.map} +0 -0
  843. /package/dist/{controls.config-6KBCTIPN.js.map → controls.config-EEK2RBPI.js.map} +0 -0
  844. /package/dist/{correlation-VSBCBFFP.js.map → correlation-HKD67SPS.js.map} +0 -0
  845. /package/dist/{cuminc-T5ZPAGVB.js.map → cuminc-66V55MMN.js.map} +0 -0
  846. /package/dist/{cuminc.integration.spec-2QT3IPHU.js.map → cuminc.integration.spec-PNTOPB2L.js.map} +0 -0
  847. /package/dist/{customdata.inputui-5MHQQHJL.js.map → customdata.inputui-Z4WQDU6I.js.map} +0 -0
  848. /package/dist/{dataDownload-S4EBNHMW.js.map → dataDownload-3ZEI22OK.js.map} +0 -0
  849. /package/dist/{dataDownload.integration.spec-OVSIWI34.js.map → dataDownload.integration.spec-C3JRC6K5.js.map} +0 -0
  850. /package/dist/{databrowser.ui-EAJS3NXV.js.map → databrowser.ui-Q365SHBG.js.map} +0 -0
  851. /package/dist/{dnaMethylation-G3F2INDH.js.map → dnaMethylation-IFZWWBUG.js.map} +0 -0
  852. /package/dist/{e2pca-SLXGPVHP.js.map → e2pca-I3QXF7EM.js.map} +0 -0
  853. /package/dist/{ep-4HGUSDGJ.js.map → ep-2VCQ36GT.js.map} +0 -0
  854. /package/dist/{expclust.gdc.spec-JJ42ESKE.js.map → expclust.gdc.spec-VWIQFY67.js.map} +0 -0
  855. /package/dist/{facet-6WVTVKDV.js.map → facet-CHP3VUWS.js.map} +0 -0
  856. /package/dist/{geneExpClustering-5LOZPD5X.js.map → geneExpClustering-YDIDEH2O.js.map} +0 -0
  857. /package/dist/{geneExpression-PTSZWKCM.js.map → geneExpression-FA5RJRHZ.js.map} +0 -0
  858. /package/dist/{geneExpression-BJ46UGXW.js.map → geneExpression-X2KXJPND.js.map} +0 -0
  859. /package/dist/{geneExpression.unit.spec-NW5HTO7F.js.map → geneExpression.unit.spec-3LVHYZGG.js.map} +0 -0
  860. /package/dist/{geneORA-H65EZ7QO.js.map → geneORA-4CAYRKSN.js.map} +0 -0
  861. /package/dist/{geneVariant-T6GWOVZD.js.map → geneVariant-OCOTNUH4.js.map} +0 -0
  862. /package/dist/{geneVariant-WTDFZTXG.js.map → geneVariant-Y4L5W5HF.js.map} +0 -0
  863. /package/dist/{geneVariant.integration.spec-OPSBRUM3.js.map → geneVariant.integration.spec-BOJ5MM5K.js.map} +0 -0
  864. /package/dist/{genefusion.ui-RSBCC37C.js.map → genefusion.ui-I6HZOBIV.js.map} +0 -0
  865. /package/dist/{geneset-B67PAZVL.js.map → geneset-GEWKDAAT.js.map} +0 -0
  866. /package/dist/{genomeBrowser.spec-AUTULF4C.js.map → genomeBrowser.spec-FDEGH4DY.js.map} +0 -0
  867. /package/dist/{grin2-CMBP7XVH.js.map → grin2-K56B6XBZ.js.map} +0 -0
  868. /package/dist/{grin2-JVCNH3KW.js.map → grin2-V6FMM44N.js.map} +0 -0
  869. /package/dist/{gsea-H774WVPQ.js.map → gsea-UNPPRU2U.js.map} +0 -0
  870. /package/dist/{hierCluster-IQTXQUMI.js.map → hierCluster-DXAWRQNI.js.map} +0 -0
  871. /package/dist/{hierCluster-ZQJDXYBD.js.map → hierCluster-SPIQA2M2.js.map} +0 -0
  872. /package/dist/{hierCluster.config-ZHJTZK5L.js.map → hierCluster.config-JW6D3T3Q.js.map} +0 -0
  873. /package/dist/{hierCluster.integration.spec-MSJ5GHHK.js.map → hierCluster.integration.spec-5NXZY4LG.js.map} +0 -0
  874. /package/dist/{hierCluster.interactivity-H2GNO6AA.js.map → hierCluster.interactivity-CPPBXHM7.js.map} +0 -0
  875. /package/dist/{hierCluster.renderers-2TE6HMK2.js.map → hierCluster.renderers-A6MEGO2B.js.map} +0 -0
  876. /package/dist/{imagePlot-FMNMB7JZ.js.map → imagePlot-QLAHCULW.js.map} +0 -0
  877. /package/dist/{importPlot-N66G43XX.js.map → importPlot-6ITZ6U7G.js.map} +0 -0
  878. /package/dist/{isoformExpression-B64WLO3H.js.map → isoformExpression-7GAUF2QV.js.map} +0 -0
  879. /package/dist/{jspdf.es.min-DO4YWL2R.js.map → jspdf.es.min-FC3BCETM.js.map} +0 -0
  880. /package/dist/{launch.adhoc-MPRAJ3GN.js.map → launch.adhoc-HFHBAUR6.js.map} +0 -0
  881. /package/dist/{leftlabel.sample-4JCKYXED.js.map → leftlabel.sample-CWPJUCHR.js.map} +0 -0
  882. /package/dist/{lollipop-25ADHT7O.js.map → lollipop-QFRQLEER.js.map} +0 -0
  883. /package/dist/{maftimeline-FOQF6O3X.js.map → maftimeline-2DFIF4C4.js.map} +0 -0
  884. /package/dist/{matrix-LHLAYDTQ.js.map → matrix-3HFB5TUU.js.map} +0 -0
  885. /package/dist/{matrix-ZKF7NRAD.js.map → matrix-MIXK27AD.js.map} +0 -0
  886. /package/dist/{matrix.cells-H4TS74FJ.js.map → matrix.cells-U7AQNEBP.js.map} +0 -0
  887. /package/dist/{matrix.config-HE7QUDER.js.map → matrix.config-FX5MHX6O.js.map} +0 -0
  888. /package/dist/{matrix.controls-VILCLNSC.js.map → matrix.controls-5K7BB5Z4.js.map} +0 -0
  889. /package/dist/{matrix.data-2OUWYD35.js.map → matrix.data-EEIY6AO4.js.map} +0 -0
  890. /package/dist/{matrix.dom-IZFFS4RQ.js.map → matrix.dom-6QL3AJMW.js.map} +0 -0
  891. /package/dist/{matrix.groups-5BGJIOOJ.js.map → matrix.groups-CUB6UWC5.js.map} +0 -0
  892. /package/dist/{matrix.integration.spec-DSXZHAEY.js.map → matrix.integration.spec-ML4T7FRG.js.map} +0 -0
  893. /package/dist/{matrix.interactivity-VK3NWX5M.js.map → matrix.interactivity-QMPWX63Q.js.map} +0 -0
  894. /package/dist/{matrix.layout-PUNMMNCC.js.map → matrix.layout-7SEF6MYI.js.map} +0 -0
  895. /package/dist/{matrix.legend-QMERGVYU.js.map → matrix.legend-42LQGAGX.js.map} +0 -0
  896. /package/dist/{matrix.renderers-2KQ2NXSQ.js.map → matrix.renderers-ZF7LLER3.js.map} +0 -0
  897. /package/dist/{matrix.serieses-24G3XPJD.js.map → matrix.serieses-4B2WB526.js.map} +0 -0
  898. /package/dist/{matrix.sort-HTVT4K7C.js.map → matrix.sort-BJACNR7G.js.map} +0 -0
  899. /package/dist/{matrix.sort.unit.spec-EUVL76NB.js.map → matrix.sort.unit.spec-ZGSM7HDJ.js.map} +0 -0
  900. /package/dist/{matrix.sorterUi-PJPFXWOJ.js.map → matrix.sorterUi-W6XFYZY2.js.map} +0 -0
  901. /package/dist/{matrix.sorterUi.unit.spec-QWL5Y4DQ.js.map → matrix.sorterUi.unit.spec-V34ZZD7A.js.map} +0 -0
  902. /package/dist/{mavb-UGM5SHEF.js.map → mavb-NVQVFU6E.js.map} +0 -0
  903. /package/dist/{mds.fimo-64US7RTE.js.map → mds.fimo-HOCF6U6K.js.map} +0 -0
  904. /package/dist/{mds.samplescatterplot-JMXLXVIE.js.map → mds.samplescatterplot-ULD5BK5R.js.map} +0 -0
  905. /package/dist/{mds.survivalplot-RJ5UD3IU.js.map → mds.survivalplot-5US32RQD.js.map} +0 -0
  906. /package/dist/{oncomatrix.spec-4YLKDGFE.js.map → oncomatrix.spec-MFUJLWEP.js.map} +0 -0
  907. /package/dist/{plot.2dvaf-DYSU6BBN.js.map → plot.2dvaf-F4WZ4YPU.js.map} +0 -0
  908. /package/dist/{plot.app-NFBVLAXZ.js.map → plot.app-YFFLLBU5.js.map} +0 -0
  909. /package/dist/{plot.barplot-DBGTDK7J.js.map → plot.barplot-2EJ2MWQD.js.map} +0 -0
  910. /package/dist/{plot.boxplot-MCKZUROP.js.map → plot.boxplot-AKZM443E.js.map} +0 -0
  911. /package/dist/{plot.brainImaging-BBAVUEB4.js.map → plot.brainImaging-DR6WJNFZ.js.map} +0 -0
  912. /package/dist/{plot.dzi-YQIFOTZQ.js.map → plot.dzi-R2MR7HAT.js.map} +0 -0
  913. /package/dist/{plot.ssgq-MU3BRTMC.js.map → plot.ssgq-C52YIUFY.js.map} +0 -0
  914. /package/dist/{plot.vaf2cov-KDHZ7JXJ.js.map → plot.vaf2cov-FOD3K7BC.js.map} +0 -0
  915. /package/dist/{plot.wsi-G2TUGQF7.js.map → plot.wsi-D2TXYERK.js.map} +0 -0
  916. /package/dist/{polar-RCCZXZIU.js.map → polar-2LC35O6K.js.map} +0 -0
  917. /package/dist/{polar2-COQ3WIGW.js.map → polar2-QPUOEUJZ.js.map} +0 -0
  918. /package/dist/{profile.spec-A4ZASR2T.js.map → profile.spec-3NCDGHLX.js.map} +0 -0
  919. /package/dist/{profileBarchart-GB4RK5DF.js.map → profileBarchart-PPQ3NL4D.js.map} +0 -0
  920. /package/dist/{profileForms-O5KBHRF6.js.map → profileForms-GS3VVW65.js.map} +0 -0
  921. /package/dist/{profilePlot-COCLCP5B.js.map → profilePlot-DQWFH5NC.js.map} +0 -0
  922. /package/dist/{profileRadar-4EE3YDOH.js.map → profileRadar-KAKRDC4R.js.map} +0 -0
  923. /package/dist/{proteomeAbundance-JBVXUSD6.js.map → proteomeAbundance-DE4NVBCN.js.map} +0 -0
  924. /package/dist/{proteomeAbundance-NQVU4DOW.js.map → proteomeAbundance-LTB3QR3G.js.map} +0 -0
  925. /package/dist/{qualitative-QROOPDSI.js.map → qualitative-YOFAROVR.js.map} +0 -0
  926. /package/dist/{regression-7FQZ22OO.js.map → regression-PF6IAHJK.js.map} +0 -0
  927. /package/dist/{regression.inputs-F62CES3A.js.map → regression.inputs-77IUYED3.js.map} +0 -0
  928. /package/dist/{regression.inputs.term-BCGP7PX4.js.map → regression.inputs.term-WWCHU6KF.js.map} +0 -0
  929. /package/dist/{regression.inputs.values.table-D3ZXZSH7.js.map → regression.inputs.values.table-I6GM6MU7.js.map} +0 -0
  930. /package/dist/{regression.results-JX6RJQQP.js.map → regression.results-6GXNKYUS.js.map} +0 -0
  931. /package/dist/{regression.spec-ROME7T33.js.map → regression.spec-MEFQNY34.js.map} +0 -0
  932. /package/dist/{report-B6MM4T6B.js.map → report-LG3UKZHL.js.map} +0 -0
  933. /package/dist/{sampleScatter.spec-EPCMC3SR.js.map → sampleScatter.spec-D3IK7MSA.js.map} +0 -0
  934. /package/dist/{sampleView-77EAJ75T.js.map → sampleView-XUI2J5EC.js.map} +0 -0
  935. /package/dist/{samplelst-CX4NQWA7.js.map → samplelst-A7IHCBAX.js.map} +0 -0
  936. /package/dist/{samplematrix-PYQFAH64.js.map → samplematrix-VGUU7Q75.js.map} +0 -0
  937. /package/dist/{sc-X6SI5VVI.js.map → sc-UVKVT2RY.js.map} +0 -0
  938. /package/dist/{scatter-ZFFHAI4F.js.map → scatter-UILUYOGO.js.map} +0 -0
  939. /package/dist/{selectGenomeWithTklst-CZMVTBMD.js.map → selectGenomeWithTklst-LWKIMZEJ.js.map} +0 -0
  940. /package/dist/{singleCellCellType-GOBX7JKV.js.map → singleCellCellType-TI52WQQ4.js.map} +0 -0
  941. /package/dist/{singleCellGeneExpression-BLMNMEAI.js.map → singleCellGeneExpression-I5SAHMGI.js.map} +0 -0
  942. /package/dist/{singleCellPlot-HLD7PLQH.js.map → singleCellPlot-HRWCHYCI.js.map} +0 -0
  943. /package/dist/{singlecell-HL4GLGIA.js.map → singlecell-BHPP7KCO.js.map} +0 -0
  944. /package/dist/{singlecell-JQFPINRS.js.map → singlecell-PQNKBKR7.js.map} +0 -0
  945. /package/dist/{snp-EAUNFDAV.js.map → snp-V4YGI7B3.js.map} +0 -0
  946. /package/dist/{snp.unit.spec-AVLPMAWI.js.map → snp.unit.spec-JSUCMGNP.js.map} +0 -0
  947. /package/dist/{snplocus-2J7OA6OL.js.map → snplocus-3YT5NNCH.js.map} +0 -0
  948. /package/dist/{spliceevent.a53ss.diagram-4DU2U7NW.js.map → spliceevent.a53ss.diagram-QEQJ44YH.js.map} +0 -0
  949. /package/dist/{spliceevent.exonskip.diagram-GG5FGXOK.js.map → spliceevent.exonskip.diagram-HMWVSOJG.js.map} +0 -0
  950. /package/dist/{spliceevent.noeventdiagram-T6RNIMCM.js.map → spliceevent.noeventdiagram-L5HUCT5A.js.map} +0 -0
  951. /package/dist/{ssGSEA-XJWLRVFQ.js.map → ssGSEA-Z3XRCBYW.js.map} +0 -0
  952. /package/dist/{ssGSEA.unit.spec-MQ23ODYO.js.map → ssGSEA.unit.spec-EUCTV2XJ.js.map} +0 -0
  953. /package/dist/{summarizeMutationDiagnosis-ZVX7AZK7.js.map → summarizeMutationDiagnosis-HFFYLQOF.js.map} +0 -0
  954. /package/dist/{summarizeMutationSurvival-EWXD7TCT.js.map → summarizeMutationSurvival-OBK6YILP.js.map} +0 -0
  955. /package/dist/{summary-VUYBKQOC.js.map → summary-W55WWIU2.js.map} +0 -0
  956. /package/dist/{summary.integration.spec-EPBV5XCT.js.map → summary.integration.spec-X2PNAUKW.js.map} +0 -0
  957. /package/dist/{summaryInput-YX5IRGWM.js.map → summaryInput-X547Q6C7.js.map} +0 -0
  958. /package/dist/{survival-XOXDPXZR.js.map → survival-PAJZHZPD.js.map} +0 -0
  959. /package/dist/{survival-E6SRRXBB.js.map → survival-TQPWMOD5.js.map} +0 -0
  960. /package/dist/{svg2pdf.es.min-EZ4UYRSH.js.map → svg2pdf.es.min-CYTPRWNB.js.map} +0 -0
  961. /package/dist/{svgraph-D23WG3UE.js.map → svgraph-Y35C2M3D.js.map} +0 -0
  962. /package/dist/{svmr-UFC4TKWV.js.map → svmr-WGCIR7PE.js.map} +0 -0
  963. /package/dist/{table-US2K6IYZ.js.map → table-Q3B2YXEN.js.map} +0 -0
  964. /package/dist/{termCollection-E7S57CIN.js.map → termCollection-A6YTSM5I.js.map} +0 -0
  965. /package/dist/{termCollection-ZMP3VE2G.js.map → termCollection-NTFNVQ7D.js.map} +0 -0
  966. /package/dist/{termCollection.unit.spec-MDWK6XH3.js.map → termCollection.unit.spec-BX54PHKT.js.map} +0 -0
  967. /package/dist/{tk-TLQJK6R4.js.map → tk-OCBZ7YR6.js.map} +0 -0
  968. /package/dist/{tp.ui-NQEAKWUH.js.map → tp.ui-ZT47N2CO.js.map} +0 -0
  969. /package/dist/{tvs.dt-U2MINIBH.js.map → tvs.dt-BFB253O3.js.map} +0 -0
  970. /package/dist/{tvs.dtcnv.categorical-2OOAZJKC.js.map → tvs.dtcnv.categorical-ARGAYIDO.js.map} +0 -0
  971. /package/dist/{tvs.dtcnv.continuous-5ETKBJ52.js.map → tvs.dtcnv.continuous-JCU23ERV.js.map} +0 -0
  972. /package/dist/{tvs.dtfusion-EB4PPR3Y.js.map → tvs.dtfusion-FV64XLZI.js.map} +0 -0
  973. /package/dist/{tvs.dtsnvindel-IRQPTKQF.js.map → tvs.dtsnvindel-DMOXMEVL.js.map} +0 -0
  974. /package/dist/{tvs.dtsv-TOVXZJCR.js.map → tvs.dtsv-53FSZEPV.js.map} +0 -0
  975. /package/dist/{tvs.samplelst-4SCH543Y.js.map → tvs.samplelst-MVPL6VXX.js.map} +0 -0
  976. /package/dist/{tvs.termCollection-GGN5F6HC.js.map → tvs.termCollection-UGJXTHTG.js.map} +0 -0
  977. /package/dist/{violin-7D7DN74I.js.map → violin-ZLUDGSQG.js.map} +0 -0
  978. /package/dist/{violin.interactivity-YPJ2H6SQ.js.map → violin.interactivity-ULDOCZWW.js.map} +0 -0
  979. /package/dist/{violin.renderer-UK7WSA2Z.js.map → violin.renderer-KJAXPMIK.js.map} +0 -0
  980. /package/dist/{vocabulary-KLWZ6LRP.js.map → vocabulary-34YUQ4ZQ.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../plots/regression.results.js"],
4
+ "sourcesContent": ["import { scaleLinear, scaleLog } from 'd3-scale'\nimport { axisBottom } from 'd3-axis'\nimport { first_genetrack_tolist } from '../common/1stGenetk'\nimport { interpolateRgb } from 'd3-interpolate'\nimport { sayerror, axisstyle, drawBoxplot, makeSsmLink, ColorScale, Menu } from '#dom'\nimport { roundValue } from '#shared/roundValue.js'\n\n/*************\ncan dynamically add following attributes\n\n- this.snplocusBlock:\n\tfor snplocus term\n\tdisplay in this.dom.snplocusBlockDiv\n- this.hasUnsubmittedEdits_nullify_singleuse:\n\tto negate hasUnsubmittedEdits and keep running analysis\n\n**************** R result object\nresult.data: {}\n\twarnings\n\tsampleSize: int\n\theaderRow: { k:str, v:str }\n\tresiduals: { header[], rows[], label:str }\n\tcoefficients: { header[], intercept[], terms{}, interactions[], label }\n\ttype3: {header[], intercept[], terms{}, interactions[], label }\n\ttotalSnpEffect: {header[], intercept[], snp, interactions[], lst, label }\n\tother: {header[], rows[], label}\n\n\n*************** function cascade\nmain\n\tdisplayResult\n\t\tcreateGenomebrowser\n\t\t\tgetMtooltipValues\n\t\t\tmayCheckLD\n\t\t\t\tshowLDlegend\n\t\tupdateMds3Tk\n\t\t\tmake_mds3_variants\n\t\tshow_genomebrowser_snplocus\n\t\tdisplayResult_oneset\n\t\t\tmayshow_warn\n\t\t\tmayshow_splinePlots\n\t\t\tmayshow_residuals\n\t\t\tmayshow_coefficients\n\t\t\tmayshow_totalSnpEffect\n\t\t\tmayshow_type3\n\t\t\tmayshow_other\n\t\t\tmayshow_fisher\n\t\t\tmayshow_wilcoxon\n\t\t\tmayshow_cuminc\n*/\n\nconst refGrp_NA = 'NA' // refGrp value is not applicable, hardcoded for R\nconst forestcolor = '#126e08' // forest plot color\nconst boxplotcolor = forestcolor\n\nexport class RegressionResults {\n\tconstructor(opts) {\n\t\tthis.opts = opts\n\t\tthis.app = opts.app\n\t\t// reference to the parent component's mutable instance (not its API)\n\t\tthis.parent = opts.parent\n\t\tthis.type = 'regression'\n\t\tsetInteractivity(this)\n\t\tsetRenderers(this)\n\n\t\tconst holder = this.opts.holder\n\t\tholder\n\t\t\t.append('div')\n\t\t\t.style('margin-top', '10px')\n\t\t\t.style('padding-top', '20px')\n\t\t\t.style('font-size', '1.2em')\n\t\t\t.style('opacity', 0.3)\n\t\t\t.html('Results')\n\n\t\tthis.dom = {\n\t\t\tholder,\n\t\t\terr_div: holder.append('div'),\n\t\t\tsnplocusBlockDiv: holder.append('div'),\n\t\t\t// is where newDiv() and displayResult_oneset() writes to\n\t\t\toneSetResultDiv: holder.append('div').style('margin', '10px'),\n\t\t\ttip: new Menu({ padding: '9px' })\n\t\t}\n\t}\n\n\tasync main() {\n\t\ttry {\n\t\t\tthis.parent.inputs.dom.submitBtn.text('Running...')\n\t\t\t// share the writable config copy\n\t\t\tthis.config = this.parent.config\n\t\t\tthis.state = this.parent.state\n\t\t\tif (\n\t\t\t\t!this.state.formIsComplete ||\n\t\t\t\tthis.parent.inputs.hasError ||\n\t\t\t\t(this.config.hasUnsubmittedEdits && !this.hasUnsubmittedEdits_nullify_singleuse)\n\t\t\t) {\n\t\t\t\t// no result to show\n\t\t\t\t// remove block instance when input variables are edited\n\t\t\t\tdelete this.snplocusBlock\n\t\t\t\tthis.dom.snplocusBlockDiv.selectAll('*').remove()\n\t\t\t\tthis.dom.holder.style('display', 'none')\n\t\t\t\treturn\n\t\t\t}\n\t\t\tdelete this.hasUnsubmittedEdits_nullify_singleuse // single-use, delete\n\n\t\t\tif (this.snplocusBlock) {\n\t\t\t\t// if a block instance is already made, cloak it\n\t\t\t\tthis.snplocusBlock.cloakOn()\n\t\t\t}\n\n\t\t\t// submit server request to run analysis\n\t\t\tconst data = await this.app.vocabApi.getRegressionData(this.getDataRequestOpts())\n\t\t\tif (data.error) throw data.error\n\t\t\tthis.dom.err_div.style('display', 'none')\n\t\t\tthis.dom.oneSetResultDiv.selectAll('*').remove()\n\t\t\tthis.dom.holder.style('display', 'block')\n\t\t\tawait this.displayResult(data)\n\n\t\t\t// scroll to results\n\t\t\tconst results_y = this.dom.holder.node().getBoundingClientRect().top + window.scrollY\n\t\t\tconst nav_height = document.querySelector('.sjpp-nav').getBoundingClientRect().height\n\t\t\twindow.scroll({ behavior: 'smooth', top: results_y - nav_height })\n\t\t} catch (e) {\n\t\t\tthis.hasError = true\n\t\t\tthis.dom.holder.style('display', 'block')\n\t\t\tthis.dom.err_div.style('display', 'block')\n\t\t\tsayerror(this.dom.err_div, 'Error: ' + (e.error || e))\n\t\t\tthis.parent.inputs.dom.submitBtn.property('disabled', true)\n\t\t\tconsole.error(e)\n\t\t}\n\t}\n\n\t// creates an opts object for the vocabApi.getRegressionData()\n\tgetDataRequestOpts() {\n\t\tconst c = this.config\n\t\tconst opts = {\n\t\t\tregressionType: c.regressionType,\n\t\t\toutcome: c.outcome,\n\t\t\tindependent: c.independent,\n\t\t\tincludeUnivariate: c.includeUnivariate\n\t\t}\n\t\topts.filter = this.parent.filter\n\t\treturn opts\n\t}\n\n\tgetIndependentInput(tid) {\n\t\t/* arg is independent tw $id or snpid\n\t\treturn input instance\n\t\tfor accessing input.orderedLabels and input.term{refGrp, term{}, q{}} which is term-wrapper\n\n\t\tin order to reliably access refGrp,\n\t\tmust use termwrapper from Input instance but not this.state.config\n\t\tdue to a specific condition when refGrp is set in self.config, but is missing from state\n\t\tthis happens when launching from a parameterized url that's missing refgrp for the term\n\t\tand the refGrp is dynamically filled by input.updateTerm() but not propagated to state\n\t\t*/\n\t\tfor (const i of this.parent.inputs.independent.inputLst) {\n\t\t\tif (!i.term) continue\n\t\t\tif (i.term.term && i.term.term.snps) {\n\t\t\t\t// is a snplst or snplocus term with .snps[]\n\t\t\t\tfor (const snp of i.term.term.snps) {\n\t\t\t\t\tif (snp.snpid == tid) {\n\t\t\t\t\t\t// tid matches with a snpid\n\t\t\t\t\t\t// make up an object looking like an Input instance for this snp/variant\n\t\t\t\t\t\tconst tw = {\n\t\t\t\t\t\t\tid: tid,\n\t\t\t\t\t\t\tq: {\n\t\t\t\t\t\t\t\tgeneticModel: i.term.q.geneticModel\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tterm: {\n\t\t\t\t\t\t\t\tid: tid,\n\t\t\t\t\t\t\t\tname: tid\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tinteractions: i.term.interactions,\n\t\t\t\t\t\t\teffectAllele: i.term.q.snp2effAle[tid],\n\t\t\t\t\t\t\tgt2count: snp.gt2count\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (i.term.q.snp2refGrp) {\n\t\t\t\t\t\t\ttw.refGrp = i.term.q.snp2refGrp[tid]\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (snp.mlst) {\n\t\t\t\t\t\t\t// try to update tw.term.name\n\t\t\t\t\t\t\tconst m = snp.mlst.find(j => j.alt == i.term.q.snp2effAle[tid])\n\t\t\t\t\t\t\tif (m) {\n\t\t\t\t\t\t\t\ttw.term.name = m.mname\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttw.term.name = snp.mlst[0].mname\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn { term: tw }\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (i.term.$id == tid) return i\n\t\t}\n\t\t// given tid does not match with an Input\n\t\t// can be an ancestry PC which is automatically added by serverside and not recorded on client\n\t\t// quick fix: return dummy tw so it won't break\n\t\treturn {\n\t\t\tterm: {\n\t\t\t\tid: tid,\n\t\t\t\tq: { mode: 'continuous' },\n\t\t\t\tterm: { name: tid }\n\t\t\t}\n\t\t}\n\t\t//throw 'cannot find Input for a tid: ' + tid\n\t}\n}\n\nfunction setInteractivity(self) {}\n\nfunction setRenderers(self) {\n\tself.displayResult = async result => {\n\t\t/*\n\t\tresult {\n\t\t\tresultLst [\n\t\t\t\t{ data: { err, splinePlots, residuals, ... }, id:'snp1' },\n\t\t\t\t{ data: { err, splinePlots, residuals, ... }, id:'snp2' },\n\t\t\t\t...\n\t\t\t]\n\t\t}\n\t\t*/\n\n\t\t// if there is a snplocus Input\n\t\tconst snplocusInput = self.parent.inputs.independent.inputLst.find(i => i.term && i.term.term.type == 'snplocus')\n\t\tif (snplocusInput) {\n\t\t\t/* has a snploucs term\n\t\t\tin result[], there's one set of result for each variant, identified by id\n\t\t\tshow a genome browser and a mds3 tk to show dots for the variants from snplocus term\n\t\t\tclicking on a dot in browser tk will call displayResult_oneset() to display its results\n\t\t\t*/\n\t\t\tif (!self.snplocusBlock) {\n\t\t\t\tself.dom.snplocusBlockDiv\n\t\t\t\t\t.append('div')\n\t\t\t\t\t.style('margin-top', '30px')\n\t\t\t\t\t.style('opacity', 0.3)\n\t\t\t\t\t.text('Click on a variant within the browser to view its regression results')\n\t\t\t\tself.snplocusBlock = await createGenomebrowser(self, snplocusInput, result.resultLst)\n\t\t\t} else {\n\t\t\t\tawait updateMds3Tk(self, snplocusInput, result.resultLst)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\t// no snplocus, clear things if had it before\n\t\tdelete self.snplocusBlock\n\t\tself.dom.snplocusBlockDiv.selectAll('*').remove()\n\t\t// resultLst[] has only one set of result, from analyzing one model\n\t\tif (!result.resultLst[0] || !result.resultLst[0].data) throw 'result is not [ {data:{}} ]'\n\n\t\tself.displayResult_oneset(result.resultLst[0].data)\n\t}\n\n\tself.displayResult_oneset = result => {\n\t\tself.dom.oneSetResultDiv.selectAll('*').remove()\n\n\t\t// may be used when clicking snplocus dot\n\t\tself.dom.LDresultDiv = self.dom.oneSetResultDiv.append('div')\n\n\t\tself.mayshow_warn(result)\n\t\tif (result.sampleSize) self.newDiv('Sample size:', result.sampleSize)\n\t\tif (result.eventCnt) self.newDiv('Number of events:', result.eventCnt)\n\t\tself.mayshow_headerRow(result)\n\t\tself.mayshow_splinePlots(result)\n\t\tself.mayshow_residuals(result)\n\t\tself.mayshow_coefficients(result)\n\t\tself.mayshow_coxDisclaimer()\n\t\tself.mayshow_totalSnpEffect(result)\n\t\tself.mayshow_type3(result)\n\t\tself.mayshow_tests(result)\n\t\tself.mayshow_other(result)\n\t\tself.mayshow_fisher(result)\n\t\tself.mayshow_wilcoxon(result)\n\t\tself.mayshow_cuminc(result)\n\t}\n\n\tself.newDiv = (label, label2, getrow) => {\n\t\t// create div to show a section of the result\n\t\t// label is required, label2 is optional\n\t\t// specify getrow=true to return row instead of div\n\t\tconst div = self.dom.oneSetResultDiv.append('div').style('margin', '20px 0px 10px 0px').attr('name', label) //For integration testing\n\t\tconst row = div.append('div')\n\t\trow.append('span').style('text-decoration', 'underline').text(label)\n\t\tif (label2) {\n\t\t\trow.append('span').html(label2).style('margin-left', '5px')\n\t\t}\n\t\treturn getrow ? row : div.append('div').style('margin-left', '20px')\n\t}\n\n\tself.mayshow_warn = result => {\n\t\tif (!result.warnings) return\n\t\tconst div = self.newDiv('Warnings')\n\t\tconst warnings = new Set(result.warnings)\n\t\tfor (const line of warnings) {\n\t\t\tdiv.append('p').style('margin', '5px').text(line)\n\t\t}\n\t}\n\n\tself.mayshow_headerRow = result => {\n\t\tif (!result.headerRow) return\n\t\tconst k = result.headerRow.k\n\t\tconst v = result.headerRow.v\n\t\tconst snplocusInput = self.parent.inputs.independent.inputLst.find(i => i.term && i.term.term.type == 'snplocus')\n\t\tif (snplocusInput) {\n\t\t\t// header row is for snplocus results\n\t\t\t// variant label\n\t\t\tconst snp = snplocusInput.term.term.snps.find(snp => snp.snpid == v.snpid)\n\t\t\tconst m = snp.mlst[0]\n\t\t\tm.chr = snp.chr\n\t\t\tconst row = self.newDiv(k, null, true)\n\t\t\tconst snpLabelDom = row\n\t\t\t\t.append('span')\n\t\t\t\t.text(`${m.chr}:${m.pos + 1} ${m.ref && m.alt ? m.ref + '>' + m.alt : ''}`)\n\t\t\t\t.style('margin-left', '5px')\n\t\t\tconst urlConfig =\n\t\t\t\tself.app.vocabApi.termdbConfig.urlTemplates?.ssm || self.app.vocabApi.termdbConfig.queries?.snvindel?.ssmUrl\n\t\t\tif (urlConfig) {\n\t\t\t\t// add urls to snp label\n\t\t\t\tconst separateUrls = makeSsmLink(urlConfig, m, snpLabelDom, self.parent.genomeObj.name)\n\t\t\t\tif (separateUrls?.length) {\n\t\t\t\t\trow.append('span').style('margin-left', '10px').html(separateUrls.join(' '))\n\t\t\t\t}\n\t\t\t}\n\t\t\t// gt label\n\t\t\tlet labels\n\t\t\tconst gt_label = `Genotypes: ${v.gtcounts.join(', ')}`\n\t\t\tif (v.monomorphic) {\n\t\t\t\tlabels = [gt_label]\n\t\t\t} else {\n\t\t\t\t// effect allele label\n\t\t\t\tconst effale_label = `Effect allele: ${v.effAle}`\n\t\t\t\t// allel frequency label\n\t\t\t\tconst af_label = `Allele frequency: ${v.af}`\n\t\t\t\tlabels = [effale_label, af_label, gt_label]\n\t\t\t}\n\t\t\trow.append('span').html(`&nbsp;&#65372;&nbsp;${labels.join('&nbsp;&#65372;&nbsp;')}`)\n\t\t} else {\n\t\t\t// header row is not for snplocus results\n\t\t\tself.newDiv(k, v)\n\t\t}\n\t}\n\n\tself.mayshow_splinePlots = result => {\n\t\tif (!result.splinePlots) return\n\t\tconst div = self.newDiv('Cubic spline plots')\n\t\tdiv.style('display', 'flex').style('align-items', 'center')\n\t\tresult.splinePlots.sort((a, b) => {\n\t\t\t// univariate plots should appear before multivariate plots\n\t\t\tif (a.type == 'univariate' && b.type == 'multivariate') return -1\n\t\t\tif (a.type == 'multivariate' && b.type == 'univariate') return 1\n\t\t\treturn 0\n\t\t})\n\t\tfor (const plot of result.splinePlots) {\n\t\t\tconst plotDiv = div.append('div').style('margin', '0px 50px 5px 0px')\n\t\t\tplotDiv.append('img').attr('src', plot.src).attr('width', 670) // quick fix to hardcode width as half of what's used in R/src/regression.utils.R, for crisp img on high-res screen\n\t\t}\n\t}\n\n\tself.mayshow_residuals = result => {\n\t\tif (!result.residuals) return\n\t\tconst div = self.newDiv(result.residuals.label)\n\t\tconst table = div.append('table').style('border-spacing', '8px').attr('name', 'sjpp-residuals-table') //For integration tests\n\t\tconst tr1 = table.append('tr').style('opacity', 0.4)\n\t\tconst tr2 = table.append('tr')\n\t\tfor (let i = 0; i < result.residuals.header.length; i++) {\n\t\t\ttr1.append('td').text(result.residuals.header[i])\n\t\t\ttr2.append('td').text(result.residuals.rows[i])\n\t\t}\n\t}\n\n\tself.mayshow_cuminc = async result => {\n\t\tif (!result.cuminc) return\n\t\tconst holder = self.newDiv('Cumulative incidence test:' /*, 'p-value = ' + result.cuminc.pvalue*/)\n\t\tconst _ = await import('./cuminc')\n\t\tconst plotter = new _.Cuminc({\n\t\t\tholder,\n\t\t\tconfig: {\n\t\t\t\tterm: self.config.outcome,\n\t\t\t\tterm2: {\n\t\t\t\t\tterm: {\n\t\t\t\t\t\tname: 'Variant',\n\t\t\t\t\t\tvalues: {\n\t\t\t\t\t\t\t1: { key: 1, label: 'Has minor allele' },\n\t\t\t\t\t\t\t2: { key: 2, label: 'No minor allele' }\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\n\t\tif (result.cuminc.ci_data) {\n\t\t\tplotter.main(result.cuminc.ci_data)\n\t\t} else {\n\t\t\tholder.append('div').style('margin', '20px').text(result.cuminc.msg)\n\t\t}\n\t}\n\n\tself.mayshow_wilcoxon = result => {\n\t\tif (!result.wilcoxon) return\n\t\tconst div = self.newDiv('Wilcoxon rank sum test:', 'p-value = ' + result.wilcoxon.pvalue)\n\t\tif (result.wilcoxon.boxplots) {\n\t\t\tconst bs = result.wilcoxon.boxplots\n\t\t\t// {hasEff{}, noEff{}, minv, maxv}\n\n\t\t\tconst boxplotHeight = 20,\n\t\t\t\tboxplotWidth = 400,\n\t\t\t\tleftLabelWidth = 160, // hardcoded number, must fit the boxplot labels\n\t\t\t\taxisheight = 40,\n\t\t\t\tlabpad = 20,\n\t\t\t\tvpad = 10\n\n\t\t\tconst scale = scaleLinear().domain([bs.minv, bs.maxv]).range([0, boxplotWidth])\n\n\t\t\tconst svg = div\n\t\t\t\t.append('svg')\n\t\t\t\t.style('margin-top', '10px')\n\t\t\t\t.attr('width', leftLabelWidth + labpad + boxplotWidth + 10)\n\t\t\t\t.attr('height', vpad * 3 + boxplotHeight * 2 + axisheight)\n\t\t\t// anchor\n\t\t\tconst g = svg.append('g').attr('transform', `translate(${leftLabelWidth + labpad},${vpad})`)\n\t\t\tdrawBoxplot({\n\t\t\t\tg: g.append('g'),\n\t\t\t\tbp: bs.hasEff,\n\t\t\t\tscale,\n\t\t\t\trowheight: boxplotHeight,\n\t\t\t\tcolor: boxplotcolor,\n\t\t\t\tlabpad\n\t\t\t})\n\t\t\tdrawBoxplot({\n\t\t\t\tg: g.append('g').attr('transform', `translate(0,${boxplotHeight + vpad})`),\n\t\t\t\tbp: bs.noEff,\n\t\t\t\tscale,\n\t\t\t\trowheight: boxplotHeight,\n\t\t\t\tcolor: boxplotcolor,\n\t\t\t\tlabpad\n\t\t\t})\n\t\t\t// axis\n\t\t\t{\n\t\t\t\tconst axisg = g.append('g').attr('transform', `translate(0,${boxplotHeight * 2 + vpad * 2})`)\n\t\t\t\tconst axis = axisBottom().scale(scale)\n\t\t\t\taxisstyle({\n\t\t\t\t\taxis: axisg.call(axis),\n\t\t\t\t\tcolor: boxplotcolor,\n\t\t\t\t\tshowline: true\n\t\t\t\t})\n\t\t\t\taxisg\n\t\t\t\t\t.append('text')\n\t\t\t\t\t.text(self.config.outcome.term.name)\n\t\t\t\t\t.attr('font-size', 15)\n\t\t\t\t\t.attr('x', boxplotWidth / 2)\n\t\t\t\t\t.attr('y', axisheight - 5)\n\t\t\t\t\t.attr('text-anchor', 'middle')\n\t\t\t\t\t.attr('fill', boxplotcolor)\n\t\t\t}\n\t\t}\n\t}\n\n\tself.mayshow_fisher = result => {\n\t\tif (!result.fisher) return\n\t\tconst div = self.newDiv(\n\t\t\tresult.fisher.isChi ? 'Chi-square test:' : \"Fisher's exact test:\",\n\t\t\t'p-value = ' + result.fisher.pvalue\n\t\t)\n\t\tconst table = div\n\t\t\t.append('table')\n\t\t\t.style('margin', '20px')\n\t\t\t.style('border-spacing', '5px')\n\t\t\t.style('border-collapse', 'separate')\n\t\tfor (const r of result.fisher.rows) {\n\t\t\tconst tr = table.append('tr')\n\t\t\tfor (const c of r) {\n\t\t\t\ttr.append('td').text(c)\n\t\t\t}\n\t\t}\n\t}\n\n\tself.mayshow_coefficients = result => {\n\t\tif (!result.coefficients) {\n\t\t\tif (result.coefficients_uni && result.coefficients_multi) {\n\t\t\t\t// coefficients from univariate and multivariate analyses\n\t\t\t\tself.mayshow_coefficients_uniMulti(result)\n\t\t\t}\n\t\t\treturn\n\t\t}\n\n\t\tconst div = self.newDiv(result.coefficients.label)\n\t\tconst table = div\n\t\t\t.append('table')\n\t\t\t.style('border-spacing', '0px')\n\t\t\t.attr('data-testid', 'sjpp_regression_resultCoefficientTable')\n\n\t\t// padding is set on every <td>. need a better solution\n\n\t\t// header row\n\t\tlet header\n\t\t{\n\t\t\tconst tr = table.append('tr').style('opacity', 0.4)\n\t\t\theader = result.coefficients.header\n\t\t\t// header for variable column\n\t\t\ttr.append('td').text(header.shift()).style('padding', '8px')\n\t\t\t// header for category column\n\t\t\ttr.append('td').text(header.shift()).style('padding', '8px')\n\t\t\t// skip headers for sample and event count columns\n\t\t\tif (self.config.regressionType == 'cox') {\n\t\t\t\theader.shift()\n\t\t\t\theader.shift()\n\t\t\t}\n\t\t\t// combine headers for 95% CI columns\n\t\t\theader.splice(1, 2, '95% CI')\n\t\t\t// display remaining headers\n\t\t\tself.fillDataHeaders(header, tr)\n\t\t}\n\n\t\t// get tws of all independent variables\n\t\t// will be used for tooltip message of estimate value\n\t\tself.independentTws = Object.keys(result.coefficients.terms).map(tid => self.getIndependentInput(tid).term)\n\n\t\tlet varcount = 0\n\t\t// intercept row\n\t\tconst intercept = result.coefficients.intercept\n\t\tif (intercept) {\n\t\t\tconst tr = table.append('tr').style('background', ++varcount % 2 ? '#eee' : 'none')\n\t\t\t// variable column\n\t\t\ttr.append('td').text(intercept.shift()).style('padding', '8px')\n\t\t\t// category column\n\t\t\ttr.append('td').text(intercept.shift()).style('padding', '8px')\n\t\t\t// forest plot column\n\t\t\ttr.append('td')\n\t\t\t// data columns\n\t\t\tself.fillCoefDataCols({ tr, cols: intercept, isIntercept: true })\n\t\t}\n\n\t\t/* term rows:\n\t\tfor each independent terms, show 1 or multiple rows\n\t\tthese rows do not cover interactions, which are rendered afterwards\n\n\t\t* forest plot *\n\t\tshown for both interacting and non-interacting rows\n\t\ta plot is added to 3rd column of each row\n\t\tplotter can be a blank function if there's no valid value for plotting\n\t\t*/\n\t\tconst forestPlotter = self.getForestPlotter(result.coefficients.terms, result.coefficients.interactions)\n\t\tlet rowcolor\n\t\tfor (const tid in result.coefficients.terms) {\n\t\t\tconst termdata = result.coefficients.terms[tid]\n\t\t\tconst tw = self.getIndependentInput(tid).term\n\t\t\trowcolor = ++varcount % 2 ? '#eee' : 'none' // all rows of a variable will have same color\n\t\t\tlet tr = table.append('tr').style('background', rowcolor)\n\n\t\t\t// col 1: term name\n\t\t\tconst termNameTd = tr.append('td').style('padding', '8px')\n\t\t\tfillCoefficientTermname(tw, termNameTd)\n\n\t\t\tif (termdata.fields) {\n\t\t\t\t// create only 1 row for this term in coefficients table, as it doesn't have categories\n\n\t\t\t\tconst cols = termdata.fields\n\n\t\t\t\t// col 2: category column\n\t\t\t\t{\n\t\t\t\t\tconst td = tr.append('td').style('padding', '8px')\n\t\t\t\t\tfillColumn2coefficientsTable(td, tw)\n\t\t\t\t}\n\n\t\t\t\tif (self.config.regressionType == 'cox') {\n\t\t\t\t\t// sample size and event count columns are present\n\t\t\t\t\t// but do not need to report for continuous variable\n\t\t\t\t\tcols.shift()\n\t\t\t\t\tcols.shift()\n\t\t\t\t}\n\n\t\t\t\t// display forest plot\n\t\t\t\tforestPlotter(tr.append('td'), cols)\n\n\t\t\t\t// display data columns\n\t\t\t\tself.fillCoefDataCols({ tr, cols, tw })\n\t\t\t} else if (termdata.categories) {\n\t\t\t\t// term has categories, create one sub-row for each category in coefficient tables\n\n\t\t\t\tconst orderedCategories = []\n\t\t\t\tconst input = self.getIndependentInput(tid)\n\t\t\t\tif (input.orderedLabels) {\n\t\t\t\t\t// reorder rows by predefined order\n\t\t\t\t\tfor (const k of input.orderedLabels) {\n\t\t\t\t\t\tif (termdata.categories[k]) orderedCategories.push(k)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (const k in termdata.categories) {\n\t\t\t\t\tif (!orderedCategories.includes(k)) orderedCategories.push(k)\n\t\t\t\t}\n\n\t\t\t\t// multiple categories\n\t\t\t\t// show first category as full row, with first cell spanning rest of categories\n\t\t\t\ttermNameTd.attr('rowspan', orderedCategories.length).style('vertical-align', 'top')\n\n\t\t\t\tlet isfirst = true\n\t\t\t\tfor (const k of orderedCategories) {\n\t\t\t\t\tif (!isfirst) {\n\t\t\t\t\t\t// create new row starting from 2nd category\n\t\t\t\t\t\ttr = table.append('tr').style('background', rowcolor)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst cols = termdata.categories[k]\n\n\t\t\t\t\t// col 2: category column\n\t\t\t\t\tconst td = tr.append('td').style('padding', '8px')\n\t\t\t\t\tfillColumn2coefficientsTable(td, tw, k)\n\n\t\t\t\t\tif (self.config.regressionType == 'cox') {\n\t\t\t\t\t\t// sample size and event count columns present\n\t\t\t\t\t\tif (tw.q.mode == 'spline') {\n\t\t\t\t\t\t\t// skip columns for cubic spline variable\n\t\t\t\t\t\t\tcols.shift()\n\t\t\t\t\t\t\tcols.shift()\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// report sample sizes and event counts of coefficients\n\t\t\t\t\t\t\t// for both ref and non-ref categories\n\t\t\t\t\t\t\tconst [samplesize_ref, samplesize_c] = cols.shift().split('/')\n\t\t\t\t\t\t\tconst [eventcnt_ref, eventcnt_c] = cols.shift().split('/')\n\t\t\t\t\t\t\tif (isfirst) {\n\t\t\t\t\t\t\t\tconst variableBottomDiv = termNameTd.select('.sjpcb-coef-variable-bottom')\n\t\t\t\t\t\t\t\tvariableBottomDiv.style('align-items', 'baseline')\n\t\t\t\t\t\t\t\tconst refGrpDiv = variableBottomDiv.selectAll('div').filter((d, i) => i === 1)\n\t\t\t\t\t\t\t\trefGrpDiv.append('div').html(`n=${samplesize_ref}<br>events=${eventcnt_ref}`)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttd.append('div').style('font-size', '.8em').html(`n=${samplesize_c}<br>events=${eventcnt_c}`)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// display forest plot\n\t\t\t\t\tforestPlotter(tr.append('td'), cols)\n\n\t\t\t\t\t// display data columns\n\t\t\t\t\tself.fillCoefDataCols({ tr, cols, tw, categoryKey: k })\n\n\t\t\t\t\tisfirst = false\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttr.append('td').text('ERROR: no .fields[] or .categories{}')\n\t\t\t}\n\t\t}\n\n\t\t// interactions\n\t\tfor (const i of result.coefficients.interactions) {\n\t\t\trowcolor = ++varcount % 2 ? '#eee' : 'none' // all rows of an interaction will have same color\n\t\t\tlet tr = table.append('tr').style('background', rowcolor)\n\n\t\t\tconst term1 = self.getIndependentInput(i.term1).term\n\t\t\tconst term2 = self.getIndependentInput(i.term2).term\n\n\t\t\t// col 1: variable\n\t\t\t{\n\t\t\t\tconst td = tr.append('td').style('padding', '8px')\n\t\t\t\tfillTdName(td.append('div'), term1 ? term1.term.name + ' : ' : row.term1 + ' : ')\n\t\t\t\tfillTdName(td.append('div'), term2 ? term2.term.name : row.term2)\n\t\t\t\ttd.attr('rowspan', i.categories.length).style('vertical-align', 'top')\n\t\t\t}\n\n\t\t\tlet isfirst = true\n\t\t\tfor (const c of i.categories) {\n\t\t\t\t// new subrow for every category\n\t\t\t\tif (!isfirst) tr = table.append('tr').style('background', rowcolor)\n\n\t\t\t\t// col 2: category\n\t\t\t\tconst td = tr.append('td').style('padding', '8px')\n\t\t\t\tfillColumn2coefficientsTable(td.append('div'), term1, c.category1)\n\t\t\t\tfillColumn2coefficientsTable(td.append('div'), term2, c.category2)\n\n\t\t\t\tconst cols = c.lst\n\n\t\t\t\tif (self.config.regressionType == 'cox') {\n\t\t\t\t\t// sample size and event count columns are present\n\t\t\t\t\t// skip for now for interactions\n\t\t\t\t\t// TODO: how to handle sample size/event counts for interactions?\n\t\t\t\t\tcols.shift()\n\t\t\t\t\tcols.shift()\n\t\t\t\t}\n\n\t\t\t\t// display forest plot\n\t\t\t\tforestPlotter(tr.append('td'), cols)\n\n\t\t\t\t// display data columns\n\t\t\t\tself.fillCoefDataCols({ tr, cols, tw: term1, tw2: term2, categoryKey: c.category1, categoryKey2: c.category2 })\n\n\t\t\t\tisfirst = false\n\t\t\t}\n\t\t}\n\n\t\t// last row to show forest plot axis (call function without data)\n\t\tconst tr = table.append('tr')\n\t\ttr.append('td') // col 1\n\t\ttr.append('td') // col 2\n\t\tforestPlotter(tr.append('td')) // forest plot axis\n\t\tfor (const v of header) tr.append('td')\n\t}\n\n\tself.mayshow_coefficients_uniMulti = result => {\n\t\t// generate coefficients table for\n\t\t// univariate and multivariate analyses\n\t\tif (!result.coefficients_uni || !result.coefficients_multi) return\n\n\t\tconst div = self.newDiv(result.coefficients_uni.label)\n\t\tdiv.style('margin-bottom', '200px') // to provide space for rendering result tooltips\n\t\tconst table = div\n\t\t\t.append('table')\n\t\t\t.style('border-spacing', '0px')\n\t\t\t.attr('data-testid', 'sjpp_regression_resultCoefficientTable')\n\n\t\t// padding is set on every <td>. need a better solution\n\n\t\t// header row\n\t\tlet header_uni, header_multi\n\t\t{\n\t\t\tconst tr_label = table.append('tr').style('opacity', 0.4) // labels displayed above header row\n\t\t\tconst tr = table.append('tr').style('opacity', 0.4) // header row\n\n\t\t\theader_uni = result.coefficients_uni.header\n\t\t\theader_multi = result.coefficients_multi.header\n\n\t\t\t// header for variable column\n\t\t\ttr.append('td').text(header_uni.shift()).style('padding', '8px')\n\t\t\ttr_label.append('td').style('padding', '8px')\n\t\t\theader_multi.shift() // same value as in header_uni\n\n\t\t\t// header for category column\n\t\t\ttr.append('td').text(header_uni.shift()).style('padding', '8px')\n\t\t\ttr_label.append('td').style('padding', '8px')\n\t\t\theader_multi.shift() // same value as in header_uni\n\n\t\t\t// skip headers for sample and event count columns\n\t\t\tif (self.config.regressionType == 'cox') {\n\t\t\t\theader_uni.shift()\n\t\t\t\theader_uni.shift()\n\t\t\t\theader_multi.shift()\n\t\t\t\theader_multi.shift()\n\t\t\t}\n\n\t\t\t// combine headers for 95% CI columns\n\t\t\theader_uni.splice(1, 2, '95% CI')\n\t\t\theader_multi.splice(1, 2, '95% CI')\n\n\t\t\t// fill headers for data columns\n\t\t\tself.fillDataHeaders(header_uni, tr, tr_label, 'Univariate')\n\t\t\ttr.append('td').style('width', '2px') //separation between univariate/multivariate\n\t\t\ttr_label.append('td').style('width', '2px')\n\t\t\tself.fillDataHeaders(header_multi, tr, tr_label, 'Multivariable-adjusted')\n\t\t}\n\n\t\t/* term rows:\n\t\tfor each independent terms, show 1 or multiple rows\n\n\t\t* forest plot *\n\t\ta plot for univariate data and a plot for multivariate data\n\t\tare shown as separate columns in each row\n\t\t*/\n\n\t\tconst forestPlotter_uni = self.getForestPlotter(result.coefficients_uni.terms, result.coefficients_uni.interactions)\n\t\tconst forestPlotter_multi = self.getForestPlotter(\n\t\t\tresult.coefficients_multi.terms,\n\t\t\tresult.coefficients_multi.interactions\n\t\t)\n\n\t\t// get tws of all independent variables\n\t\t// will be used for tooltip message of estimate value\n\t\tself.independentTws = Object.keys(result.coefficients_uni.terms).map(tid => self.getIndependentInput(tid).term)\n\n\t\tlet varcount = 0,\n\t\t\trowcolor\n\t\tfor (const tid in result.coefficients_uni.terms) {\n\t\t\t// termdata is data from univariate analysis\n\t\t\t// will be used to fill in variable, category, and\n\t\t\t// univariate data columns\n\t\t\tconst termdata = result.coefficients_uni.terms[tid]\n\t\t\t// termdata_multi is data from multivariate analysis\n\t\t\t// will be used to fill in multivariate data columns\n\t\t\tconst termdata_multi = result.coefficients_multi.terms[tid]\n\n\t\t\tconst tw = self.getIndependentInput(tid).term\n\t\t\trowcolor = ++varcount % 2 ? '#eee' : 'none' // all rows of a variable will have same color\n\t\t\tlet tr = table.append('tr').style('background', rowcolor)\n\n\t\t\t// col 1: term name\n\t\t\tconst termNameTd = tr.append('td').style('padding', '8px')\n\t\t\tfillCoefficientTermname(tw, termNameTd)\n\n\t\t\tif (termdata.fields) {\n\t\t\t\t// create only 1 row for this term in coefficients table, as it doesn't have categories\n\n\t\t\t\tconst cols = termdata.fields\n\t\t\t\tconst cols_multi = termdata_multi.fields\n\n\t\t\t\t// col 2: category column\n\t\t\t\t{\n\t\t\t\t\tconst td = tr.append('td').style('padding', '8px')\n\t\t\t\t\tfillColumn2coefficientsTable(td, tw)\n\t\t\t\t}\n\n\t\t\t\tif (self.config.regressionType == 'cox') {\n\t\t\t\t\t// cox regression\n\t\t\t\t\t// sample size and event count columns are present\n\t\t\t\t\t// but do not need to report for continuous variable\n\t\t\t\t\tcols.shift()\n\t\t\t\t\tcols.shift()\n\t\t\t\t\tcols_multi.shift()\n\t\t\t\t\tcols_multi.shift()\n\t\t\t\t}\n\n\t\t\t\t// display univariate forest plot\n\t\t\t\tforestPlotter_uni(tr.append('td'), cols)\n\n\t\t\t\t// display univariate data columns\n\t\t\t\tself.fillCoefDataCols({ tr, cols, tw, isUnivariate: true })\n\n\t\t\t\ttr.append('td').style('width', '2px') // separation between univariate/multivariate\n\n\t\t\t\t// display multivariate forest plot\n\t\t\t\tforestPlotter_multi(tr.append('td'), cols_multi)\n\n\t\t\t\t// display multivariate data columns\n\t\t\t\tself.fillCoefDataCols({ tr, cols: cols_multi, tw })\n\t\t\t} else if (termdata.categories) {\n\t\t\t\t// term has categories, create one sub-row for each category in coefficient tables\n\n\t\t\t\tconst orderedCategories = []\n\t\t\t\tconst input = self.getIndependentInput(tid)\n\t\t\t\tif (input.orderedLabels) {\n\t\t\t\t\t// reorder rows by predefined order\n\t\t\t\t\tfor (const k of input.orderedLabels) {\n\t\t\t\t\t\tif (termdata.categories[k]) orderedCategories.push(k)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (const k in termdata.categories) {\n\t\t\t\t\tif (!orderedCategories.includes(k)) orderedCategories.push(k)\n\t\t\t\t}\n\n\t\t\t\t// multiple categories\n\t\t\t\t// show first category as full row, with first cell spanning rest of categories\n\t\t\t\ttermNameTd.attr('rowspan', orderedCategories.length).style('vertical-align', 'top')\n\n\t\t\t\tlet isfirst = true\n\t\t\t\tfor (const k of orderedCategories) {\n\t\t\t\t\tif (!isfirst) {\n\t\t\t\t\t\t// create new row starting from 2nd category\n\t\t\t\t\t\ttr = table.append('tr').style('background', rowcolor)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst cols = termdata.categories[k]\n\t\t\t\t\tconst cols_multi = termdata_multi.categories[k]\n\n\t\t\t\t\t// col 2: category column\n\t\t\t\t\tconst td = tr.append('td').style('padding', '8px')\n\t\t\t\t\tfillColumn2coefficientsTable(td, tw, k)\n\n\t\t\t\t\tif (self.config.regressionType == 'cox') {\n\t\t\t\t\t\t// cox regression\n\t\t\t\t\t\t// sample size and event count columns are present\n\t\t\t\t\t\tif (tw.q.mode == 'spline') {\n\t\t\t\t\t\t\t// skip columns for cubic spline variable\n\t\t\t\t\t\t\tcols.shift()\n\t\t\t\t\t\t\tcols.shift()\n\t\t\t\t\t\t\tcols_multi.shift()\n\t\t\t\t\t\t\tcols_multi.shift()\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// report sample sizes and event counts of coefficients\n\t\t\t\t\t\t\t// for both ref and non-ref categories\n\t\t\t\t\t\t\tconst [samplesize_ref, samplesize_c] = cols.shift().split('/')\n\t\t\t\t\t\t\tconst [eventcnt_ref, eventcnt_c] = cols.shift().split('/')\n\t\t\t\t\t\t\tif (isfirst) {\n\t\t\t\t\t\t\t\tconst variableBottomDiv = termNameTd.select('.sjpcb-coef-variable-bottom')\n\t\t\t\t\t\t\t\tvariableBottomDiv.style('align-items', 'baseline')\n\t\t\t\t\t\t\t\tconst refGrpDiv = variableBottomDiv.selectAll('div').filter((d, i) => i === 1)\n\t\t\t\t\t\t\t\trefGrpDiv.append('div').html(`n=${samplesize_ref}<br>events=${eventcnt_ref}`)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ttd.append('div').style('font-size', '.8em').html(`n=${samplesize_c}<br>events=${eventcnt_c}`)\n\t\t\t\t\t\t\tcols_multi.shift()\n\t\t\t\t\t\t\tcols_multi.shift()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// display univariate forest plot\n\t\t\t\t\tforestPlotter_uni(tr.append('td'), cols)\n\n\t\t\t\t\t// display univariate data columns\n\t\t\t\t\tself.fillCoefDataCols({ tr, cols, tw, categoryKey: k, isUnivariate: true })\n\n\t\t\t\t\ttr.append('td').style('width', '2px') // separation between univariate/multivariate\n\n\t\t\t\t\t// display multivariate forest plot\n\t\t\t\t\tforestPlotter_multi(tr.append('td'), cols_multi)\n\n\t\t\t\t\t// display multivariate data columns\n\t\t\t\t\tself.fillCoefDataCols({ tr, cols: cols_multi, tw, categoryKey: k })\n\n\t\t\t\t\tisfirst = false\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttr.append('td').text('ERROR: no .fields[] or .categories{}')\n\t\t\t}\n\t\t}\n\n\t\t// last row to show forest plot axis (call function without data)\n\t\tconst tr = table.append('tr')\n\t\ttr.append('td') // col 1\n\t\ttr.append('td') // col 2\n\t\tforestPlotter_uni(tr.append('td')) // forest plot axis\n\t\tfor (const v of header_uni) tr.append('td')\n\t\ttr.append('td').style('width', '2px') // separation between univariate/multivariate\n\t\tforestPlotter_multi(tr.append('td')) // forest plot axis\n\t\tfor (const v of header_multi) tr.append('td')\n\t}\n\n\t// fill headers of data columns of coefficients table\n\tself.fillDataHeaders = (header, tr, tr_label, label) => {\n\t\tconst startColN = tr.selectAll('td').size()\n\t\t// header for forest plot column\n\t\ttr.append('td')\n\t\t// headers for data columns\n\t\theader.forEach((h, i, arr) => {\n\t\t\tif (i === 0) {\n\t\t\t\t// header for estimate column\n\t\t\t\tconst est = h\n\t\t\t\tconst estTd = tr.append('td').style('padding', '8px').text(est)\n\t\t\t\tconst estInfo = estTd.append('sup').style('cursor', 'default').html('&nbsp;&#9432;')\n\t\t\t\testInfo.on('mouseover', event => {\n\t\t\t\t\tconst tip = self.dom.tip.clear()\n\t\t\t\t\ttip.d.append('div').text('Hover over each value to view explanation of the result')\n\t\t\t\t\ttip.showunder(event.target)\n\t\t\t\t})\n\t\t\t\testInfo.on('mouseout', () => self.dom.tip.hide())\n\t\t\t} else {\n\t\t\t\t// headers for all other data columns\n\t\t\t\tconst td = tr.append('td').text(h).style('padding', '8px')\n\t\t\t\tif (i === arr.length - 1) td.style('font-style', 'italic')\n\t\t\t}\n\t\t})\n\t\t// fill label row, if defined\n\t\tif (tr_label) {\n\t\t\tconst endColN = tr.selectAll('td').size()\n\t\t\ttr_label\n\t\t\t\t.append('td')\n\t\t\t\t.attr('colspan', endColN - startColN)\n\t\t\t\t.style('padding', '0px 8px')\n\t\t\t\t.style('text-align', 'center')\n\t\t\t\t.append('div')\n\t\t\t\t.text(label)\n\t\t\t\t.style('border-bottom', '1px solid')\n\t\t\t\t.style('padding', '5px')\n\t\t}\n\t}\n\n\t// fill data columns of row of coefficients table\n\tself.fillCoefDataCols = arg => {\n\t\tconst { tr, cols, tw } = arg\n\t\t// estimate (Beta/OR/HR) column\n\t\tconst est = cols.shift()\n\t\tconst estSpan = tr.append('td').style('padding', '8px').style('cursor', 'default').append('span').text(est)\n\t\t// on mouseover, display explanation of estimate value\n\t\testSpan.on('mouseover', event => {\n\t\t\tif (tw && tw.q.mode == 'spline') return\n\t\t\tconst tip = self.dom.tip.clear()\n\t\t\tlet estimateMsg = self.getEstimateMsg(Object.assign({ est: Number(est) }, arg))\n\t\t\tif (tw) {\n\t\t\t\tconst pvalue = Number(cols[cols.length - 1])\n\t\t\t\testimateMsg += `<br><br><span style=\"font-style: italic\">This association is ${\n\t\t\t\t\tpvalue < 0.05 ? 'statistically significant (P < 0.05)' : 'not statistically significant (P \u2265 0.05)</span>'\n\t\t\t\t}.`\n\t\t\t}\n\t\t\ttip.d.append('div').style('max-width', '500px').html(estimateMsg)\n\t\t\ttip.showunder(event.target)\n\t\t})\n\t\testSpan.on('mouseout', () => self.dom.tip.hide())\n\t\t// 95% CI column\n\t\ttr.append('td').html(`${cols.shift()} &ndash; ${cols.shift()}`).style('padding', '8px')\n\t\t// rest of columns\n\t\tfor (const v of cols) tr.append('td').text(v).style('padding', '8px')\n\t}\n\n\t// get tooltip message explaining the estimate value\n\tself.getEstimateMsg = arg => {\n\t\tconst { est, tw, tw2, categoryKey, categoryKey2, isIntercept, isUnivariate } = arg\n\t\tconst independentTws = self.independentTws\n\t\tconst outcomeTw = self.config.outcome\n\t\tconst regtype = self.config.regressionType\n\t\tconst category = tw?.term?.values && tw.term.values[categoryKey] ? tw.term.values[categoryKey].label : categoryKey\n\t\tconst category2 =\n\t\t\ttw2?.term?.values && tw2.term.values[categoryKey2] ? tw2.term.values[categoryKey2].label : categoryKey2\n\t\tconst refGrp = tw?.term?.values && tw.term.values[tw.refGrp] ? tw.term.values[tw.refGrp].label : tw?.refGrp\n\t\tconst refGrp2 = tw2?.term?.values && tw2.term.values[tw2.refGrp] ? tw2.term.values[tw2.refGrp].label : tw2?.refGrp\n\n\t\t/** part 1: outcome variable **/\n\t\tlet msg\n\t\tif (regtype == 'linear') {\n\t\t\tmsg = tw2 ? getInteractionMsg() : `Mean ${styleVariable(outcomeTw)} is`\n\t\t\tmsg += ` ${Math.abs(est)} units`\n\t\t\tif (isIntercept) {\n\t\t\t\tconst baselines = getBaselines(independentTws)\n\t\t\t\treturn `${msg} when ${joinVariables(baselines)}.`\n\t\t\t}\n\t\t\tmsg += ` ${est < 0 ? 'lower' : 'higher'} `\n\t\t} else if (regtype == 'logistic') {\n\t\t\tmsg = tw2 ? getInteractionMsg() : `Odds of ${styleVariable(outcomeTw, outcomeTw.nonRefGrp)} is`\n\t\t\tif (isIntercept) {\n\t\t\t\tconst baselines = getBaselines(independentTws)\n\t\t\t\treturn `${msg} ${est} when ${joinVariables(baselines)}.`\n\t\t\t}\n\t\t\tmsg += est > 1 ? ` ${est} times higher ` : ` ${roundValue(1 / est, 3)} times lower `\n\t\t} else if (regtype == 'cox') {\n\t\t\tmsg = tw2\n\t\t\t\t? getInteractionMsg()\n\t\t\t\t: `Hazard (instantaneous rate) of ${styleVariable(outcomeTw, outcomeTw.eventLabel)} is`\n\t\t\tmsg += est > 1 ? ` ${est} times higher ` : ` ${roundValue(1 / est, 3)} times lower `\n\t\t} else {\n\t\t\tthrow 'regression type not recognized'\n\t\t}\n\n\t\t/** part 2: independent variable **/\n\t\tconst interactions = []\n\t\tconst interactionsBaselines = []\n\t\tif (tw.interactions?.length && !tw2) {\n\t\t\t// variable is part of an interaction, but the current row\n\t\t\t// is not an interaction row\n\t\t\tfor (const tid of tw.interactions) {\n\t\t\t\tconst t = self.getIndependentInput(tid).term\n\t\t\t\tif (t.term.snps) {\n\t\t\t\t\t// snplst or snplocus term\n\t\t\t\t\t// need to get term ids of individuals snps\n\t\t\t\t\tfor (const snp of t.term.snps) interactions.push(snp.snpid)\n\t\t\t\t} else {\n\t\t\t\t\tinteractions.push(tid)\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!interactions.length) throw 'interactions[] is empty'\n\t\t\tconst interactingTws = independentTws.filter(t => interactions.includes(t.$id || t.id))\n\t\t\tinteractionsBaselines.push(...getBaselines(interactingTws))\n\t\t}\n\t\tif (category) {\n\t\t\t// categorical variable\n\t\t\tmsg += `in ${joinVariables([styleVariable(tw, category), ...interactionsBaselines])} compared to ${joinVariables([\n\t\t\t\tstyleVariable(tw, refGrp),\n\t\t\t\t...interactionsBaselines\n\t\t\t])}`\n\t\t} else if (tw.q.mode == 'continuous') {\n\t\t\t// continuous variable\n\t\t\tmsg += `for every one unit increase of ${styleVariable(tw)}`\n\t\t\tif (interactionsBaselines.length) msg += ` when ${joinVariables(interactionsBaselines)}`\n\t\t} else if (tw.q.geneticModel === 0) {\n\t\t\t// genetic variable, additive model\n\t\t\tmsg += `for every additional ${tw.effectAllele} allele of ${styleVariable(tw)}`\n\t\t\tif (interactionsBaselines.length) msg += ` when ${joinVariables(interactionsBaselines)}`\n\t\t} else if (tw.q.geneticModel == 1 || tw.q.geneticModel == 2) {\n\t\t\t// genetic variable, dominant or recessive model\n\t\t\tconst gts = Object.keys(tw.gt2count)\n\t\t\tconst testGts = gts.filter(gt => {\n\t\t\t\tif (tw.q.geneticModel == 1) {\n\t\t\t\t\t// dominant model\n\t\t\t\t\treturn gt.includes(tw.effectAllele)\n\t\t\t\t} else {\n\t\t\t\t\t// recessive model\n\t\t\t\t\treturn gt\n\t\t\t\t\t\t.replace(/[^a-zA-Z]/g, '')\n\t\t\t\t\t\t.split('')\n\t\t\t\t\t\t.every(c => c == tw.effectAllele)\n\t\t\t\t}\n\t\t\t})\n\t\t\tconst refGts = gts.filter(gt => !testGts.includes(gt))\n\t\t\tmsg += `in ${joinVariables([\n\t\t\t\tstyleVariable(tw, testGts.join(', ')),\n\t\t\t\t...interactionsBaselines\n\t\t\t])} compared to ${joinVariables([styleVariable(tw, refGts.join(', ')), ...interactionsBaselines])}`\n\t\t}\n\n\t\t/** part 3: adjusting for covariates **/\n\t\t// get term ids of current variable and any interacting variables\n\t\tconst tids = [tw.$id || tw.id]\n\t\tif (tw.interactions?.length) {\n\t\t\tif (tw2) tids.push(tw2.$id || tw2.id)\n\t\t\telse tids.push(...interactions)\n\t\t}\n\t\t// get covariates (i.e., all other variables)\n\t\tconst covariates = independentTws.filter(t => !tids.includes(t.$id || t.id)).map(t => styleVariable(t))\n\t\tif (regtype == 'cox') {\n\t\t\tcovariates.push(outcomeTw.q.timeScale == 'time' ? '\"Years of follow-up\"' : '\"Attained age during follow-up\"') // TODO: how to handle styling for this?\n\t\t}\n\t\t// build message for covariates\n\t\tif (!covariates.length || isUnivariate) return msg + '.'\n\t\treturn msg + `, adjusting for ${joinVariables(covariates)}.`\n\n\t\t/** helper functions **/\n\t\t// function to style a variable (and its category)\n\t\tfunction styleVariable(tw, category) {\n\t\t\tconst spans = [\n\t\t\t\t`<span class=\"term_name_btn sja_filter_tag_btn\" style=\"padding: 3px 6px; margin: 2.5px 0px; border-radius: ${\n\t\t\t\t\tcategory ? '6px 0px 0px 6px' : '6px'\n\t\t\t\t};\">${tw.term.name.length < 40 ? tw.term.name : tw.term.name.substring(0, 35) + ' ...'}</span>`\n\t\t\t]\n\t\t\tif (category) {\n\t\t\t\tspans.push(\n\t\t\t\t\t`<span class=\"ts_summary_btn sja_filter_tag_btn\" style=\"padding: 3px 6px; margin: 2.5px 0px; border-radius: 0px 6px 6px 0px; font-style: italic;\">${category}</span>`\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn `<div style=\"display: inline; white-space: nowrap; font-size: 0.9em\">${spans.join('')}</div>`\n\t\t}\n\n\t\t// function to get message for interaction term\n\t\tfunction getInteractionMsg() {\n\t\t\tlet msg =\n\t\t\t\tregtype == 'linear'\n\t\t\t\t\t? `The difference in mean ${styleVariable(outcomeTw)}`\n\t\t\t\t\t: regtype == 'logistic'\n\t\t\t\t\t? `The difference in odds of ${styleVariable(outcomeTw, outcomeTw.nonRefGrp)}`\n\t\t\t\t\t: `The difference in hazard (instantaneous rate) of ${styleVariable(outcomeTw, outcomeTw.eventLabel)}`\n\n\t\t\tif (category2) {\n\t\t\t\t// categorical variable\n\t\t\t\tmsg += ` between ${styleVariable(tw2, category2)} and ${styleVariable(tw2, refGrp2)} is`\n\t\t\t} else if (tw2.q.mode == 'continuous') {\n\t\t\t\t// continuous variable\n\t\t\t\tmsg += ` for every one unit increase of ${styleVariable(tw2)} is`\n\t\t\t} else if (tw2.q.geneticModel === 0) {\n\t\t\t\t// genetic variable, additive model\n\t\t\t\tmsg += ` for every additional ${tw2.effectAllele} allele of ${styleVariable(tw2)} is`\n\t\t\t} else if (tw2.q.geneticModel == 1 || tw2.q.geneticModel == 2) {\n\t\t\t\t// genetic variable, dominant or recessive model\n\t\t\t\tconst gts = Object.keys(tw2.gt2count)\n\t\t\t\tconst testGts = gts.filter(gt => {\n\t\t\t\t\tif (tw2.q.geneticModel == 1) {\n\t\t\t\t\t\t// dominant model\n\t\t\t\t\t\treturn gt.includes(tw2.effectAllele)\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// recessive model\n\t\t\t\t\t\treturn gt\n\t\t\t\t\t\t\t.replace(/[^a-zA-Z]/g, '')\n\t\t\t\t\t\t\t.split('')\n\t\t\t\t\t\t\t.every(c => c == tw2.effectAllele)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tconst refGts = gts.filter(gt => !testGts.includes(gt))\n\t\t\t\tmsg += ` between ${styleVariable(tw2, testGts.join(', '))} and ${styleVariable(tw2, refGts.join(', '))} is`\n\t\t\t}\n\n\t\t\treturn msg\n\t\t}\n\n\t\t/* function to get the baseline level of each variable\n\t\t\t- categorical variable: refGrp\n\t\t\t- continuous variable: 0\n\t\t\t- genetic variable:\n\t\t\t\t- additive model: 0 effect alleles\n\t\t\t\t- dominant model: homozygous for non-effect allele\n\t\t\t\t- recessive model: homozygous for non-effect allele or heterozygous\n\t\t\t\t- by genotype: same as categorical variable\n\t\t*/\n\t\tfunction getBaselines(tws) {\n\t\t\tconst baselines = tws.map(tw => {\n\t\t\t\tif (tw.q.mode != 'spline' && 'refGrp' in tw && tw.refGrp != refGrp_NA) {\n\t\t\t\t\t// has refGrp, must be categorical variable\n\t\t\t\t\tconst refGrp = tw?.term?.values && tw.term.values[tw.refGrp] ? tw.term.values[tw.refGrp].label : tw?.refGrp\n\t\t\t\t\treturn styleVariable(tw, refGrp)\n\t\t\t\t} else if (tw.q.mode == 'continuous') {\n\t\t\t\t\t// continuous variable\n\t\t\t\t\treturn styleVariable(tw, '0')\n\t\t\t\t} else if (tw.q.geneticModel === 0) {\n\t\t\t\t\t// genetic variable, additive model\n\t\t\t\t\treturn styleVariable(tw, `No ${tw.effectAllele} alleles`)\n\t\t\t\t} else if (tw.q.geneticModel == 1 || tw.q.geneticModel == 2) {\n\t\t\t\t\t// genetic variable, dominant or recessive model\n\t\t\t\t\tconst gts = Object.keys(tw.gt2count)\n\t\t\t\t\tconst refGts = gts.filter(gt => {\n\t\t\t\t\t\tif (tw.q.geneticModel == 1) {\n\t\t\t\t\t\t\t// dominant model\n\t\t\t\t\t\t\treturn !gt.includes(tw.effectAllele)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// recessive model\n\t\t\t\t\t\t\treturn !gt\n\t\t\t\t\t\t\t\t.replace(/[^a-zA-Z]/g, '')\n\t\t\t\t\t\t\t\t.split('')\n\t\t\t\t\t\t\t\t.every(c => c == tw.effectAllele)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\treturn styleVariable(tw, refGts.join(', '))\n\t\t\t\t}\n\t\t\t})\n\t\t\treturn baselines\n\t\t}\n\n\t\tfunction joinVariables(variables) {\n\t\t\tif (!variables.length) return ''\n\t\t\telse if (variables.length == 1) return variables[0]\n\t\t\telse if (variables.length == 2) return variables.join(' and ')\n\t\t\telse return `${variables.slice(0, -1).join(', ')}, and ${variables.slice(-1)}`\n\t\t}\n\t}\n\n\t// show disclaimer message under the coefficient tables when\n\t// regressionType == 'cox\n\tself.mayshow_coxDisclaimer = () => {\n\t\tconst disclaimer = self.app.vocabApi.termdbConfig.regression?.settings?.coxDisclaimer\n\t\tif (disclaimer && self.config.regressionType == 'cox') {\n\t\t\tself.dom.oneSetResultDiv\n\t\t\t\t.append('div')\n\t\t\t\t.style('white-space', 'wrap') // somewhere in the parent dom there must be a nowrap setting that causes overly long text to look bad. must apply this so it will auto wrap\n\t\t\t\t.attr('data-testid', 'sjpp-regression-result-coxDisclaimer')\n\t\t\t\t.style('margin', '20px 0px 20px 10px')\n\t\t\t\t.style('font-size', '.8em')\n\t\t\t\t.style('text-align', 'left')\n\t\t\t\t.text(disclaimer)\n\t\t}\n\t}\n\n\tself.mayshow_totalSnpEffect = result => {\n\t\tif (!result.totalSnpEffect) return\n\t\tconst div = self.newDiv(result.totalSnpEffect.label)\n\t\tconst table = div.append('table').style('border-spacing', '0px')\n\n\t\t// header row\n\t\t{\n\t\t\tconst tr = table.append('tr').style('opacity', 0.4)\n\t\t\tfor (const v of result.totalSnpEffect.header) {\n\t\t\t\ttr.append('td').text(v).style('padding', '8px')\n\t\t\t}\n\t\t}\n\n\t\t// total snp effect row\n\t\tconst tr = table.append('tr').style('background', '#eee')\n\t\tfor (const v of result.totalSnpEffect.lst) {\n\t\t\ttr.append('td').text(v).style('padding', '8px')\n\t\t}\n\t\tconst snp = self.getIndependentInput(result.totalSnpEffect.snp).term\n\t\tconst interactions = result.totalSnpEffect.interactions.map(interaction => {\n\t\t\treturn {\n\t\t\t\tt1: self.getIndependentInput(interaction.term1).term,\n\t\t\t\tt2: self.getIndependentInput(interaction.term2).term\n\t\t\t}\n\t\t})\n\t\tconst bottomInfo = `Total: total effect of removing the snp (${snp.term.name}) and its interactions (${interactions\n\t\t\t.map(interaction => interaction.t1.term.name + ' : ' + interaction.t2.term.name)\n\t\t\t.join(' ; ')}) from the model`\n\t\tdiv\n\t\t\t.append('div')\n\t\t\t.style('margin', '20px 0px 20px 10px')\n\t\t\t.style('font-size', '.8em')\n\t\t\t.style('text-align', 'left')\n\t\t\t.style('color', '#999')\n\t\t\t.text(bottomInfo)\n\t}\n\n\tself.mayshow_type3 = result => {\n\t\tif (!result.type3 || self.app.vocabApi.termdbConfig.regression?.settings?.hideType3) return\n\t\tconst div = self.newDiv(result.type3.label)\n\t\tconst table = div.append('table').style('border-spacing', '0px')\n\n\t\t// header row\n\t\t{\n\t\t\tconst tr = table.append('tr').style('opacity', 0.4)\n\t\t\tfor (const v of result.type3.header) {\n\t\t\t\ttr.append('td').text(v).style('padding', '8px')\n\t\t\t}\n\t\t}\n\n\t\t// intercept row\n\t\tif (self.config.regressionType != 'cox') {\n\t\t\tconst tr = table.append('tr').style('background', '#eee')\n\t\t\tfor (const v of result.type3.intercept) {\n\t\t\t\ttr.append('td').text(v).style('padding', '8px')\n\t\t\t}\n\t\t}\n\n\t\t// term rows\n\t\t// independent terms (no interaction)\n\t\tlet rowcount = self.config.regressionType == 'cox' ? 1 : 0\n\t\tfor (const tid in result.type3.terms) {\n\t\t\t// get term data\n\t\t\tconst termdata = result.type3.terms[tid]\n\t\t\tconst tw = self.getIndependentInput(tid).term\n\t\t\tlet tr = table.append('tr').style('background', rowcount++ % 2 ? '#eee' : 'none')\n\t\t\t// col 1: variable\n\t\t\tconst termNameTd = tr.append('td').style('padding', '8px')\n\t\t\tfillTdName(termNameTd, tw.term.name)\n\t\t\t// rest of columns\n\t\t\tfor (const v of termdata) {\n\t\t\t\ttr.append('td').text(v).style('padding', '8px')\n\t\t\t}\n\t\t}\n\t\t// interactions\n\t\tfor (const row of result.type3.interactions) {\n\t\t\tconst tr = table.append('tr').style('background', rowcount++ % 2 ? '#eee' : 'none')\n\t\t\tconst t1 = self.getIndependentInput(row.term1).term\n\t\t\tconst t2 = self.getIndependentInput(row.term2).term\n\t\t\t// col 1: variable\n\t\t\tconst td = tr.append('td').style('padding', '8px')\n\t\t\tfillTdName(td.append('div'), t1.term.name + ' : ')\n\t\t\tfillTdName(td.append('div'), t2.term.name)\n\t\t\t// rest of columns\n\t\t\tfor (const v of row.lst) {\n\t\t\t\ttr.append('td').text(v).style('padding', '8px')\n\t\t\t}\n\t\t}\n\t}\n\n\tself.mayshow_tests = result => {\n\t\tif (!result.tests || self.app.vocabApi.termdbConfig.regression?.settings?.hideTests) return\n\t\tconst div = self.newDiv(result.tests.label)\n\t\tconst table = div.append('table').style('border-spacing', '0px')\n\t\tconst header = table.append('tr').style('opacity', 0.4)\n\t\tfor (const cell of result.tests.header) {\n\t\t\theader.append('td').text(cell).style('padding', '8px')\n\t\t}\n\t\tlet rowcount = 0\n\t\tfor (const row of result.tests.rows) {\n\t\t\tconst tr = table.append('tr').style('background', rowcount++ % 2 ? 'none' : '#eee')\n\t\t\tfor (const cell of row) {\n\t\t\t\ttr.append('td').text(cell).style('padding', '8px')\n\t\t\t}\n\t\t}\n\t}\n\n\tself.mayshow_other = result => {\n\t\tif (!result.other) return\n\t\tconst div = self.newDiv(result.other.label)\n\t\tconst table = div.append('table').style('border-spacing', '8px')\n\t\tfor (let i = 0; i < result.other.header.length; i++) {\n\t\t\tconst tr = table.append('tr')\n\t\t\ttr.append('td').style('opacity', 0.4).text(result.other.header[i])\n\t\t\ttr.append('td').text(result.other.rows[i])\n\t\t}\n\t}\n\n\t/*\n\tthe function takes all data rows (except intercept) from coefficients table, and return a callback\n\tthe callback closures the axis range of all data\n\trun callback on each coefficient table row to plot the forest plot\n\n\tcollect all numeric data points from terms/interactons\n\tto derive forest plot axis range\n\tsort numbers in an array\n\tin logistic, if array[i]=0 then cannot use log(0) as axis min,\n\tin that case should use array[i+1] or next to find the smallest real number as axis min\n\tan arbitary cap is used to guard against extreme estimate values\n\t*/\n\tself.getForestPlotter = (terms, interactions) => {\n\t\t// array indices are the same for both non-interacting and interacting rows\n\t\tlet midIdx, // array index of the beta/odds ratio\n\t\t\tCIlow, // array(column) index of low end of confidence interval of midIdx\n\t\t\tCIhigh, // array index of high end of confidence interval\n\t\t\taxislab, // data type to show as axis label\n\t\t\tbaselineValue, // baseline value to show a vertical line\n\t\t\t// min/max value capping the axis, to guard against extreme estimates\n\t\t\t// only used for logistic odds ratio\n\t\t\t// for linear, will use actual range from estimates and confidence interval\n\t\t\tcapMin,\n\t\t\tcapMax\n\t\tif (self.config.regressionType == 'linear') {\n\t\t\tmidIdx = 0\n\t\t\tCIlow = 1\n\t\t\tCIhigh = 2\n\t\t\taxislab = 'Beta value'\n\t\t\tbaselineValue = 0\n\t\t\tcapMin = null\n\t\t\tcapMax = null\n\t\t} else if (self.config.regressionType == 'logistic') {\n\t\t\tmidIdx = 0\n\t\t\tCIlow = 1\n\t\t\tCIhigh = 2\n\t\t\taxislab = 'Odds ratio'\n\t\t\tbaselineValue = 1\n\t\t\tcapMin = 0.1\n\t\t\tcapMax = 10\n\t\t} else if (self.config.regressionType == 'cox') {\n\t\t\tmidIdx = 0\n\t\t\tCIlow = 1\n\t\t\tCIhigh = 2\n\t\t\taxislab = 'Hazard ratio'\n\t\t\tbaselineValue = 1\n\t\t\tcapMin = 0.1\n\t\t\tcapMax = 10\n\t\t} else {\n\t\t\tthrow 'unknown regressionType'\n\t\t}\n\n\t\t// collect mid/CIlow/CIhigh numeric values into a flat array\n\t\tconst values = []\n\t\tfor (const tid in terms) {\n\t\t\tconst d = terms[tid]\n\t\t\tif (d.fields) {\n\t\t\t\tnumbers2array(d.fields)\n\t\t\t} else {\n\t\t\t\tfor (const k in d.categories) {\n\t\t\t\t\tnumbers2array(d.categories[k])\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const i of interactions) {\n\t\t\tfor (const k of i.categories) {\n\t\t\t\tnumbers2array(k.lst)\n\t\t\t}\n\t\t}\n\n\t\tif (values.length == 0) {\n\t\t\t// no valid estimates\n\t\t\t// return blank function for inability to make plot\n\t\t\treturn () => {}\n\t\t}\n\n\t\t// all valid numbers are collected into values[]\n\t\tvalues.sort((a, b) => a - b) // ascending\n\n\t\tif (capMin == null) {\n\t\t\t// use actual range as cap; all values are valid numbers\n\t\t\tcapMin = values[0]\n\t\t\tcapMax = values[values.length - 1]\n\t\t}\n\n\t\t// graph dimension\n\t\tconst width = 180 // plottable dimension\n\t\tconst height = 20\n\t\tconst xleftpad = 10,\n\t\t\txrightpad = 10 // leave space for axis\n\n\t\tconst scale = get_scale(values)\n\n\t\t// todo: logistic, add center line; linear: 0 value\n\t\treturn (td, lst) => {\n\t\t\tif (!scale) {\n\t\t\t\t// scale is not built, do not plot\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// lst is data from a row from either terms or interactions\n\n\t\t\tconst svg = td\n\t\t\t\t.append('svg')\n\t\t\t\t.attr('width', width + xleftpad + xrightpad)\n\t\t\t\t.attr('height', height)\n\t\t\tconst g = svg.append('g').attr('transform', 'translate(' + xleftpad + ',0)')\n\n\t\t\tif (!lst) {\n\t\t\t\t//////////////////////////////\n\t\t\t\t// no data; render axis instead\n\n\t\t\t\t// do not apply this format for linear regression,\n\t\t\t\t// had encountered a bug that '.1r' will print \"20\" at the tick of \"15\"\n\t\t\t\tconst tickFormat = self.config.regressionType == 'logistic' ? '.1r' : undefined\n\n\t\t\t\tconst axis = axisBottom().ticks(4, tickFormat).scale(scale)\n\t\t\t\taxisstyle({\n\t\t\t\t\taxis: g.call(axis),\n\t\t\t\t\tcolor: forestcolor,\n\t\t\t\t\tshowline: true\n\t\t\t\t})\n\t\t\t\tconst fontsize = 12\n\t\t\t\tg.append('text')\n\t\t\t\t\t.attr('fill', forestcolor)\n\t\t\t\t\t.text(axislab)\n\t\t\t\t\t.attr('x', width / 2)\n\t\t\t\t\t.attr('y', height + fontsize)\n\t\t\t\tsvg.attr('height', height + fontsize)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t{\n\t\t\t\t// vertical baseline\n\t\t\t\tconst x = scale(baselineValue)\n\t\t\t\tg.append('line').attr('x1', x).attr('y1', 0).attr('x2', x).attr('y2', height).attr('stroke', '#ccc')\n\t\t\t}\n\n\t\t\tconst mid = Number(lst[midIdx]),\n\t\t\t\tcilow = Number(lst[CIlow]),\n\t\t\t\tcihigh = Number(lst[CIhigh])\n\t\t\tif (Number.isNaN(mid)) {\n\t\t\t\t// not plottable\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tg.append('circle')\n\t\t\t\t.attr('cx', scale(Math.min(Math.max(mid, capMin), capMax)))\n\t\t\t\t.attr('cy', height / 2)\n\t\t\t\t.attr('r', 3)\n\t\t\t\t.attr('fill', forestcolor)\n\n\t\t\tif (Number.isNaN(cilow) || Number.isNaN(cihigh)) {\n\t\t\t\t// cannot plot confidence interval\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// confidence interval\n\t\t\tg.append('line')\n\t\t\t\t.attr('x1', scale(Math.min(Math.max(cilow, capMin), capMax)))\n\t\t\t\t.attr('y1', height / 2)\n\t\t\t\t.attr('x2', scale(Math.min(Math.max(cihigh, capMin), capMax)))\n\t\t\t\t.attr('y2', height / 2)\n\t\t\t\t.attr('stroke', forestcolor)\n\t\t}\n\t\t///////// helpers\n\t\tfunction numbers2array(_lst) {\n\t\t\tconst lst = self.config.regressionType == 'cox' ? _lst.slice(2) : _lst // exclude sample and event count columns\n\t\t\tconst m = Number(lst[midIdx])\n\t\t\tif (!Number.isNaN(m)) values.push(m)\n\t\t\tconst l = Number(lst[CIlow]),\n\t\t\t\th = Number(lst[CIhigh])\n\t\t\tif (!Number.isNaN(l) && !Number.isNaN(h)) {\n\t\t\t\t// if either low/high is NA, do not use\n\t\t\t\t// this prevent the case of low=NA, high=3e+41 (somehow high is extremely large value)\n\t\t\t\tvalues.push(l)\n\t\t\t\tvalues.push(h)\n\t\t\t}\n\t\t}\n\t\tfunction get_scale(values) {\n\t\t\tif (self.config.regressionType == 'logistic') {\n\t\t\t\t// apply log to odds ratio\n\t\t\t\t// iterate to find a non-0 value\n\t\t\t\tlet i = 0\n\t\t\t\twhile (values[i] <= 0) {\n\t\t\t\t\ti++\n\t\t\t\t}\n\t\t\t\tif (i >= values.length || values[i] <= 0) {\n\t\t\t\t\t// no valid value, won't build scale\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tconst min = values[i]\n\t\t\t\tconst max = values[values.length - 1]\n\t\t\t\treturn scaleLog()\n\t\t\t\t\t.domain([Math.max(min, capMin), Math.min(max, capMax)])\n\t\t\t\t\t.range([0, width])\n\t\t\t\t\t.nice()\n\t\t\t}\n\t\t\tif (self.config.regressionType == 'linear' || self.config.regressionType == 'cox') {\n\t\t\t\treturn scaleLinear()\n\t\t\t\t\t.domain([Math.max(values[0], capMin), Math.min(values[values.length - 1], capMax)])\n\t\t\t\t\t.range([0, width])\n\t\t\t}\n\t\t\tthrow 'unknown type'\n\t\t}\n\t}\n}\n\nfunction fillTdName(td, name) {\n\tif (name.length < 40) {\n\t\ttd.text(name)\n\t} else {\n\t\ttd.text(name.substring(0, 35) + ' ...').attr('aria-label', name)\n\t}\n}\nfunction fillCoefficientTermname(tw, td) {\n\t// fill column 1 <td> using term name\n\tfillTdName(td, tw.term.name || tid)\n\t// fill refGrp or effect allele, if applicable\n\tconst hasRefGrp = 'refGrp' in tw && tw.refGrp != refGrp_NA && tw.q.mode != 'spline'\n\tif (hasRefGrp || tw.effectAllele) {\n\t\t// has refGrp or effect allele\n\t\t// display beneath term name\n\t\tconst bottomDiv = td\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sjpcb-coef-variable-bottom')\n\t\t\t.style('display', 'flex')\n\t\t\t.style('align-items', 'center')\n\t\t\t.style('margin-top', '2px')\n\t\t\t.style('font-size', '.8em')\n\n\t\tlet label\n\t\tif (hasRefGrp) {\n\t\t\tlabel = tw.term.values && tw.term.values[tw.refGrp] ? tw.term.values[tw.refGrp].label : tw.refGrp\n\t\t} else {\n\t\t\tlabel = tw.effectAllele\n\t\t}\n\n\t\tbottomDiv\n\t\t\t.append('div')\n\t\t\t.style('padding', '1px 5px')\n\t\t\t.style('border', '1px solid #aaa')\n\t\t\t.style('border-radius', '10px')\n\t\t\t.style('font-size', '.7em')\n\t\t\t.text(hasRefGrp ? 'REF' : 'EFFECT ALLELE')\n\n\t\tbottomDiv.append('div').style('padding', '1px 3px').text(label)\n\t}\n}\n\nfunction make_mds3_variants(tw, resultLst, regressionType) {\n\t/* return a list of variants as mds3 client-side custom data\n\ttw:\n\t\tterm:\n\t\t\tsnps[ {} ]\n\t\t\t\tsnpid\n\t\t\t\tmlst[]\n\t\t\t\t\telement: {alt/class/dt/mname}\n\t\tq{}\n\t\t\tsnp2effAle:{}\n\n\tresultLst: [{data,id},{data,id},...]\n\t*/\n\tconst mlst = []\n\tfor (const snp of tw.term.snps) {\n\t\tconst m = {\n\t\t\tchr: snp.chr,\n\t\t\tpos: snp.pos,\n\t\t\tssm_id: snp.snpid // needed for highlighting dot\n\t\t}\n\t\tmlst.push(m)\n\t\t// decide class/mname for this based on effect allele\n\t\tconst effAle = tw.q.snp2effAle[snp.snpid]\n\t\tconst m2 = snp.mlst.find(i => i.alt == effAle)\n\t\tif (m2) {\n\t\t\t// eff ale is an alt allele, transfer its class to m\n\t\t\tObject.assign(m, m2)\n\t\t} else {\n\t\t\t// eff allele is not an alterative allele!\n\t\t\t// just use the class of the first alt allele\n\t\t\tObject.assign(m, snp.mlst[0])\n\t\t}\n\n\t\t// set default values as missing, to be able to show all variants in track\n\t\t// overwrite with real values if found in result\n\t\tm.regressionPvalue = 'NA'\n\t\tm.mlpv = 0 // display the dot at the bottom\n\n\t\tconst thisresult = resultLst.find(i => i.id == snp.snpid)\n\t\tif (!thisresult) {\n\t\t\t// missing result for this variant, caused by variable-skipping in R\n\t\t\tm.regressionResult = {\n\t\t\t\tdata: {\n\t\t\t\t\terr: ['No result for this variant at ' + snp.snpid]\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\t// reg result is found for this snp; can call displayResult_oneset\n\t\tm.regressionResult = thisresult // for displaying via click_snvindel()\n\n\t\tconst d = thisresult.data\n\t\tif (!d) throw '.data{} missing'\n\n\t\tif (d.type3) {\n\t\t\t/* result has type3 section, this variant has AF>cutoff and used for model-fitting\n\t\t\tshow this variant as a dot, do not set .shape = 'filledTriangle'\n\t\t\tfind p-value in regression results\n\t\t\t*/\n\t\t\tconst v = getSnpPvalueFromRegressionResults(d, snp.snpid)\n\t\t\tif (v == undefined) {\n\t\t\t\t// no valid pvalue from regression results\n\t\t\t} else {\n\t\t\t\t// has valid pvalue from regression results\n\t\t\t\tm.regressionPvalue = v\n\t\t\t\tm.mlpv = -Math.log10(v)\n\t\t\t}\n\n\t\t\t// assign estimate, for tooltip display\n\t\t\tif (!d.coefficients || !d.coefficients.terms) throw '.data.coefficients.terms{} missing'\n\t\t\tconst r = d.coefficients.terms[snp.snpid]\n\t\t\tif (!r) throw 'snp missing from data.coefficients.terms{}'\n\t\t\tif (Array.isArray(r.fields)) {\n\t\t\t\t// has fields[], snp is used as additive/dominant/recessive\n\t\t\t\tm.regressionEstimate = regressionType == 'cox' ? r.fields[2] : r.fields[0]\n\t\t\t} else if (r.categories) {\n\t\t\t\t// has categories{}: {C/T: Array(6), T/T: Array(6)}\n\t\t\t\t// snp is used by genotype\n\t\t\t\tconst lst = []\n\t\t\t\tfor (const gt in r.categories) {\n\t\t\t\t\tlst.push(gt + ':' + regressionType == 'cox' ? r.categories[gt][2] : r.categories[gt][0])\n\t\t\t\t}\n\t\t\t\tm.regressionEstimate = ' ' + lst.join(' ')\n\t\t\t} else {\n\t\t\t\tthrow 'unknown way to get snp estimates from coefficients table'\n\t\t\t}\n\t\t} else if (d.fisher) {\n\t\t\t/* { pvalue:float, table:[] }\n\t\t\tthis variant is tested by fisher, show as triangle\n\t\t\t*/\n\t\t\tm.regressionPvalue = d.fisher.pvalue\n\t\t\tm.mlpv = -Math.log10(d.fisher.pvalue)\n\t\t\tm.shape = 'filledTriangle'\n\t\t} else if (d.wilcoxon) {\n\t\t\t/* { pvalue:float }\n\t\t\tthis variant is tested by wilcoxon, show as triangle\n\t\t\t*/\n\t\t\tm.regressionPvalue = d.wilcoxon.pvalue\n\t\t\tm.mlpv = -Math.log10(d.wilcoxon.pvalue)\n\t\t\tm.shape = 'filledTriangle'\n\t\t} else if (d.cuminc) {\n\t\t\t/* { pvalue:float }\n\t\t\tthis variant is tested by cuminc, show as triangle\n\t\t\t*/\n\t\t\tm.regressionPvalue = d.cuminc.pvalue\n\t\t\tm.mlpv = -Math.log10(d.cuminc.pvalue)\n\t\t\tm.shape = 'filledTriangle'\n\t\t} else {\n\t\t\t// none of above. is monomorphic, show as hollow circle\n\t\t\tm.shape = 'emptyCircle'\n\t\t}\n\t}\n\treturn mlst\n}\n\nasync function createGenomebrowser(self, input, resultLst) {\n\t// create block instance that harbors the mds3 track for showing variants from the snplocus term\n\t// input is the snplocus Input instance\n\tconst arg = {\n\t\tholder: self.dom.snplocusBlockDiv,\n\t\tgenome: self.parent.genomeObj,\n\t\tchr: input.term.q.chr,\n\t\tstart: input.term.q.start,\n\t\tstop: input.term.q.stop,\n\t\tnobox: true,\n\t\ttklst: [],\n\t\tonCoordinateChange: async rglst => {\n\t\t\t// at the mds3 track, clear highlights added before\n\t\t\t// so that nothing is highlighted by default in updated data\n\t\t\tfor (const t of self.snplocusBlock.tklst) {\n\t\t\t\tif (t.type == 'mds3') delete t.skewer.hlssmid\n\t\t\t}\n\n\t\t\tconst { chr, start, stop } = rglst[0]\n\t\t\t// temporary tw as override for pill.runCallback()\n\t\t\tconst overrideTw = {\n\t\t\t\tterm: {\n\t\t\t\t\tid: input.term.term.id,\n\t\t\t\t\ttype: 'snplocus'\n\t\t\t\t},\n\t\t\t\tq: JSON.parse(JSON.stringify(input.term.q))\n\t\t\t}\n\t\t\toverrideTw.q.chr = chr\n\t\t\toverrideTw.q.start = start\n\t\t\toverrideTw.q.stop = stop\n\t\t\t// call fillTW of snplocus.js to recompute tw.term.snps[] and cache file\n\t\t\tconst _ = await import('../termsetting/handlers/snplocus')\n\t\t\tawait _.fillTW(overrideTw, self.app.vocabApi)\n\t\t\t/*\n\t\t\tupdated term info (term.snps[] and q.cacheid etc) are now in overrideTw\n\t\t\tcall pill.runCallback() with this override\n\t\t\twhich in turn calls editConfig() and\n\t\t\tdispatch action and write the updated tw into state;\n\t\t\tstate change will trigger pill.main()\n\t\t\tto propagate updated data to termsetting instance\n\n\t\t\t* Note *\n\t\t\tit is incorrect to call pill.main() or inputs.editConfig() here\n\n\t\t\taction dispatch will contain hasUnsubmittedEdits=true,\n\t\t\teffect of which is to hide result UI and require user to click submit button to rerun analysis\n\t\t\tset a single-use flag to nullify it so results.js can automatically run analysis\n\t\t\tso user can continuously look at genome browser\n\t\t\twithout break/interruption to user experience\n\t\t\t*/\n\t\t\tself.hasUnsubmittedEdits_nullify_singleuse = true\n\t\t\tinput.pill.runCallback(overrideTw)\n\t\t}\n\t}\n\n\t// add mds3 tk\n\targ.tklst.push({\n\t\ttype: 'mds3', // tkt.mds3\n\t\tname: 'Variants',\n\t\tskewerModes: [\n\t\t\t{\n\t\t\t\ttype: 'numeric',\n\t\t\t\tbyAttribute: 'mlpv', // corresponds to the \"mlpv\" attribute in m{}, can be anything\n\t\t\t\tlabel: '-log10 p-value',\n\t\t\t\tinuse: true,\n\t\t\t\ttooltipPrintValue: m => getMtooltipValues(m, self.config.regressionType)\n\t\t\t}\n\t\t],\n\t\tcustom_variants: make_mds3_variants(input.term, resultLst, self.config.regressionType),\n\t\tlegend: {\n\t\t\tcustomShapeLabels: {\n\t\t\t\tfilledCircle: 'common variants analyzed by model-fitting',\n\t\t\t\tfilledTriangle:\n\t\t\t\t\t'rare variants analyzed by ' +\n\t\t\t\t\t(self.config.regressionType == 'linear'\n\t\t\t\t\t\t? 'Wilcoxon rank sum test'\n\t\t\t\t\t\t: self.config.regressionType == 'logistic'\n\t\t\t\t\t\t? \"Fisher's exact test\"\n\t\t\t\t\t\t: 'Cumulative incidence test'),\n\t\t\t\temptyCircle: 'monomorphic variants skipped'\n\t\t\t}\n\t\t},\n\t\tclick_snvindel: async m => {\n\t\t\t// displayResult_oneset() will modify m.regressionResult.data\n\t\t\t// during rendering, so need to input clone of data\n\t\t\tself.displayResult_oneset(structuredClone(m.regressionResult.data))\n\t\t\tawait mayCheckLD(m, input, self)\n\t\t\tconst result_y = self.dom.oneSetResultDiv.node().getBoundingClientRect().top + window.scrollY\n\t\t\tconst nav_height = document.querySelector('.sjpp-nav').getBoundingClientRect().height\n\t\t\twindow.scroll({ behavior: 'smooth', top: result_y - nav_height })\n\t\t}\n\t})\n\n\tfirst_genetrack_tolist(self.parent.genomeObj, arg.tklst)\n\tconst _ = await import('../src/block')\n\treturn new _.Block(arg)\n}\n\nasync function updateMds3Tk(self, input, resultLst) {\n\t// browser is already created\n\t// find the mds3 track\n\tconst tk = self.snplocusBlock.tklst.find(i => i.type == 'mds3')\n\t// apply new sets of variants and results to track and render\n\ttk.custom_variants = make_mds3_variants(input.term, resultLst, self.config.regressionType)\n\t// if user changes position using termsetting ui,\n\t// input.term.q{} will hold different chr/start/stop than block\n\t// and block will need to update coord\n\tconst r = self.snplocusBlock.rglst[0]\n\tif (r.chr == input.term.q.chr && r.start == input.term.q.start && r.stop == input.term.q.stop) {\n\t\t// coord is the same between input and block\n\t\t// only need to rerender tk\n\t\ttk.load()\n\t} else {\n\t\tawait self.snplocusBlock.jump_1basedcoordinate(input.term.q)\n\t}\n\tself.snplocusBlock.cloakOff()\n}\n\nconst LDcolor0 = '#2E6594',\n\tLDcolor1 = '#ff0000',\n\tLDcolorScale = interpolateRgb(LDcolor0, LDcolor1)\n\nasync function mayCheckLD(m, input, self) {\n\t/*\n\tm: the mutation data object for the clicked dot in mds3 tk\n\t\t{chr, pos, ref, alt}\n\tinput: the snplocus Input instance\n\tself: result instance\n\t*/\n\tif (!input.term.q.restrictAncestry) {\n\t\t// requires restrictAncestry\n\t\t// may also support ld overlay without specifying an ancestry\n\t\treturn\n\t}\n\tconst tk = self.snplocusBlock.tklst.find(i => i.type == 'mds3')\n\tif (!tk || !tk.skewer || !tk.skewer.nmg) return\n\n\t// clear old result\n\tfor (const m of tk.custom_variants) delete m.regressionR2\n\n\tconst wait = self.dom.LDresultDiv.append('span').text('Loading LD data...')\n\n\ttry {\n\t\tconst data = await self.app.vocabApi.getLDdata(input.term.q.restrictAncestry.name, m)\n\t\tif (data.error) throw data.error\n\n\t\tif (data.nodata || !data.lst || data.lst.length == 0) {\n\t\t\t// either dataset does not have ld tracks, or no ld track found by name\n\t\t\t// or no ld data retrieved using given variant\n\t\t\t// restore color in case dots have been colored by ld in a prior click\n\t\t\twait.text('No LD data')\n\t\t\ttk.skewer.nmg.selectAll('.sja_aa_disk_fill').attr('fill', m => (m.shapeCircle ? 'none' : tk.color4disc(m)))\n\t\t\treturn\n\t\t}\n\t\ttk.skewer.nmg.selectAll('.sja_aa_disk_fill').attr('fill', m2 => {\n\t\t\tif (m2.pos == m.pos && m2.ref == m.ref && m2.alt == m.alt) {\n\t\t\t\t// same as m\n\t\t\t\treturn LDcolor1\n\t\t\t}\n\t\t\tfor (const i of data.lst) {\n\t\t\t\tif (i.pos == m2.pos && i.alleles == m2.ref + '.' + m2.alt) {\n\t\t\t\t\t// matched, record new result for displaying in hover tooltip\n\t\t\t\t\tm2.regressionR2 = i.r2\n\t\t\t\t\treturn LDcolorScale(i.r2)\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn LDcolorScale(0)\n\t\t})\n\n\t\twait.html(input.term.q.restrictAncestry.name + ' LD r<sup>2</sup>')\n\t\tshowLDlegend(self.dom.LDresultDiv, LDcolorScale)\n\t} catch (e) {\n\t\twait.text('Error: ' + (e.message || e))\n\t}\n}\n\nexport function showLDlegend(div, colorScale) {\n\tconst colorbardiv = div.append('span').style('margin-left', '10px')\n\tconst colorlst = []\n\tfor (let i = 0; i <= 1; i += 0.1) {\n\t\tcolorlst.push(colorScale(i))\n\t}\n\n\tconst axisheight = 20\n\tconst barheight = 15\n\tconst xpad = 10\n\tconst axiswidth = 150\n\n\t/** ColorScale component requires the color and data array to be the same\n\t * length. This data array is purely to fulfill that requirement.*/\n\tconst domain = colorlst.map((d, i) => i / (colorlst.length - 1))\n\n\tnew ColorScale({\n\t\tholder: colorbardiv,\n\t\tdomain,\n\t\ttopTicks: true,\n\t\twidth: xpad * 2 + axiswidth,\n\t\theight: axisheight + barheight,\n\t\tbarheight,\n\t\tbarwidth: axiswidth,\n\t\tfontSize: 12,\n\t\tcolors: colorlst,\n\t\tposition: `${xpad},${axisheight}`,\n\t\ttickSize: 6\n\t})\n}\n\nfunction getMtooltipValues(m, regressionType) {\n\tconst lst = [{ k: 'p-value', v: m.regressionPvalue }]\n\tif (m.regressionResult.AFstr) {\n\t\tlst.push({ k: 'AF', v: m.regressionResult.AFstr })\n\t}\n\tif (m.regressionEstimate) {\n\t\tif (regressionType == 'linear') lst.push({ k: 'beta', v: m.regressionEstimate })\n\t\telse if (regressionType == 'logistic') lst.push({ k: 'odds ratio', v: m.regressionEstimate })\n\t\telse if (regressionType == 'cox') lst.push({ k: 'hazard ratio', v: m.regressionEstimate })\n\t\telse throw 'unknown regression type'\n\t}\n\tif (m.regressionR2) {\n\t\tlst.push({ k: 'LD r2', v: m.regressionR2 })\n\t}\n\treturn lst\n}\n\nfunction getSnpPvalueFromRegressionResults(d, snpid) {\n\tlet str\n\tif (d.totalSnpEffect) {\n\t\t// snp has interactions\n\t\t// use p-value from total snp effect table\n\t\tstr = d.totalSnpEffect.lst[d.totalSnpEffect.lst.length - 1]\n\t} else {\n\t\t// snp has no interactions\n\t\t// use p-value from type3 stats table\n\t\tif (!d.type3.terms) throw '.data{type3:{terms}} missing'\n\t\tif (!d.type3.terms[snpid]) throw snpid + ' missing in type3.terms{}'\n\t\tif (!Array.isArray(d.type3.terms[snpid])) throw `type3.terms[${snp.snpid}] not array`\n\t\tstr = d.type3.terms[snpid][d.type3.terms[snpid].length - 1]\n\t}\n\tconst v = Number(str) // p-value string can be 'NA'\n\tif (Number.isFinite(v)) {\n\t\treturn v\n\t}\n\treturn undefined\n}\n\nfunction fillColumn2coefficientsTable(div, tw, categoryKey) {\n\tif (categoryKey) {\n\t\tdiv.text(tw && tw.term.values && tw.term.values[categoryKey] ? tw.term.values[categoryKey].label : categoryKey)\n\t\treturn\n\t}\n\t// the term doesn't have category, so indicate helpful status\n\tdiv.style('opacity', 0.3) // also gray out text to differentiate it from a category\n\tif ('geneticModel' in tw.q) {\n\t\tconst v = tw.q.geneticModel\n\t\tdiv.text(v == 0 ? '(additive)' : v == 1 ? '(dominant)' : '(recessive)')\n\t\treturn\n\t}\n\tif (tw.q.mode) {\n\t\tdiv.text('(' + tw.q.mode + ')')\n\t\treturn\n\t}\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["tid", "snp", "row", "tr", "tw", "category", "msg", "refGrp", "values", "_", "m"]
7
+ }
@@ -0,0 +1,273 @@
1
+ import {
2
+ TermTypes
3
+ } from "./chunk-6ITDJ5UR.js";
4
+ import {
5
+ __export
6
+ } from "./chunk-HFNDKYVF.js";
7
+
8
+ // plots/matrix/hierCluster.renderers.js
9
+ var hierCluster_renderers_exports = {};
10
+ __export(hierCluster_renderers_exports, {
11
+ maySetSandboxHeader: () => maySetSandboxHeader,
12
+ plotDendrogramHclust: () => plotDendrogramHclust,
13
+ renderImage: () => renderImage
14
+ });
15
+ function maySetSandboxHeader(appState) {
16
+ if (!this.dom.header) return;
17
+ switch (this.config.dataType) {
18
+ case TermTypes.GENE_EXPRESSION:
19
+ this.dom.header.text("Gene Expression Clustering");
20
+ break;
21
+ case TermTypes.METABOLITE_INTENSITY:
22
+ this.dom.header.text("Metabolite Intensity Clustering");
23
+ break;
24
+ case TermTypes.PROTEOME_ABUNDANCE:
25
+ this.dom.header.text(
26
+ this.config.assayCohortTitle ? `Protein Abundance Clustering (${this.config.assayCohortTitle})` : "Protein Abundance Clustering"
27
+ );
28
+ break;
29
+ default:
30
+ throw `dataType '${this.config.dataType}' not recognized`;
31
+ }
32
+ }
33
+ function plotDendrogramHclust(plotOnly) {
34
+ const d = this.dimensions;
35
+ const s = this.config.settings.matrix;
36
+ const xOffset = d.seriesXoffset;
37
+ const pxr = window.devicePixelRatio <= 1 ? 1 : window.devicePixelRatio;
38
+ const obj = this.hierClusterData.clustering;
39
+ const row = obj.row;
40
+ const col = obj.col;
41
+ const rowHeight = this.settings.matrix.clusterRowh, { xDendrogramHeight, yDendrogramHeight } = this.settings.hierCluster, colWidth = this.dimensions.dx;
42
+ if (plotOnly !== "left") {
43
+ if (!this.settings.hierCluster.clusterSamples) {
44
+ this.dom.topDendrogram.selectAll("*").remove();
45
+ } else {
46
+ const height2px = getHclustHeightScalefactor(col.height, yDendrogramHeight);
47
+ const height = yDendrogramHeight + 1e-7;
48
+ const width = Math.min(colWidth * col.inputOrder.length, s.imgWMax);
49
+ if (width <= 0 || height <= 0) {
50
+ console.warn(
51
+ "Skipping top dendrogram render: invalid dimensions.",
52
+ "This may indicate a zoom feedback loop issue.",
53
+ {
54
+ width,
55
+ height,
56
+ colWidth,
57
+ sampleCount: col.inputOrder.length,
58
+ yDendrogramHeight
59
+ }
60
+ );
61
+ this.dom.topDendrogram.selectAll("*").remove();
62
+ return;
63
+ }
64
+ const canvas = new OffscreenCanvas(width * pxr, height * pxr);
65
+ const ctx = canvas.getContext("2d");
66
+ ctx.scale(pxr, pxr);
67
+ ctx.translate(-d.xMin, 0);
68
+ ctx.imageSmoothingEnabled = false;
69
+ ctx.imageSmoothingQuality = "high";
70
+ ctx.strokeStyle = "black";
71
+ const mergedClusters = /* @__PURE__ */ new Map();
72
+ for (const [clusterid0, pair] of col.merge.entries()) {
73
+ const clusterid = clusterid0 + 1;
74
+ const children = [];
75
+ const childrenClusters = [];
76
+ let x1, x2, y1, y2;
77
+ if (pair.n1 < 0) {
78
+ const [name, columnNumber] = getLeafNumber(pair.n1, col.inputOrder, col.order);
79
+ x1 = colWidth * (columnNumber + 0.5);
80
+ y1 = yDendrogramHeight;
81
+ children.push({ name });
82
+ } else {
83
+ if (!mergedClusters.has(pair.n1)) throw "pair.n1 is positive but not seen before";
84
+ const c = mergedClusters.get(pair.n1);
85
+ x1 = c.x;
86
+ y1 = c.y;
87
+ children.push(...c.children);
88
+ childrenClusters.push(pair.n1);
89
+ }
90
+ if (pair.n2 < 0) {
91
+ const [name, columnNumber] = getLeafNumber(pair.n2, col.inputOrder, col.order);
92
+ x2 = colWidth * (columnNumber + 0.5);
93
+ y2 = yDendrogramHeight;
94
+ children.push({ name });
95
+ } else {
96
+ if (!mergedClusters.has(pair.n2)) throw "pair.n1 is positive but not seen before";
97
+ const c = mergedClusters.get(pair.n2);
98
+ x2 = c.x;
99
+ y2 = c.y;
100
+ children.push(...c.children);
101
+ childrenClusters.push(pair.n2);
102
+ }
103
+ const clusterY = yDendrogramHeight - col.height[clusterid0].height * height2px;
104
+ const highlight = this.clickedClusterIds?.includes(clusterid);
105
+ ctx.strokeStyle = highlight ? "red" : "black";
106
+ ctx.beginPath();
107
+ ctx.moveTo(x1, y1);
108
+ ctx.lineTo(x1, clusterY);
109
+ ctx.lineTo(x2, clusterY);
110
+ ctx.lineTo(x2, y2);
111
+ ctx.stroke();
112
+ ctx.closePath();
113
+ mergedClusters.set(clusterid, {
114
+ x: (x1 + x2) / 2,
115
+ y: clusterY,
116
+ children,
117
+ childrenClusters,
118
+ clusterPosition: {
119
+ x1,
120
+ x2,
121
+ y1,
122
+ y2,
123
+ clusterY
124
+ }
125
+ });
126
+ }
127
+ this.renderImage(
128
+ this.api,
129
+ this.dom.topDendrogram,
130
+ canvas,
131
+ width,
132
+ height,
133
+ xDendrogramHeight + 0.5 * colWidth + d.xMin,
134
+ s.margin.top + s.scrollHeight
135
+ );
136
+ col.mergedClusters = mergedClusters;
137
+ }
138
+ }
139
+ if (plotOnly !== "top") {
140
+ if (!this.settings.hierCluster.clusterRows) {
141
+ this.dom.leftDendrogram.selectAll("*").remove();
142
+ } else {
143
+ const height2px = getHclustHeightScalefactor(row.height, xDendrogramHeight);
144
+ const width = xDendrogramHeight + 1e-7;
145
+ const height = rowHeight * row.inputOrder.length;
146
+ const canvasWidthPx = Number.isFinite(width) && Number.isFinite(pxr) ? Math.max(0, Math.floor(width * pxr)) : 0;
147
+ const canvasHeightPx = Number.isFinite(height) && Number.isFinite(pxr) ? Math.max(0, Math.floor(height * pxr)) : 0;
148
+ if (!Number.isFinite(width) || !Number.isFinite(height) || !Number.isFinite(pxr) || width <= 0 || height <= 0 || pxr <= 0 || canvasWidthPx < 1 || canvasHeightPx < 1) {
149
+ console.warn(
150
+ "Skipping left dendrogram render: invalid dimensions.",
151
+ "This may indicate a zoom feedback loop issue.",
152
+ {
153
+ width,
154
+ height,
155
+ pxr,
156
+ canvasWidthPx,
157
+ canvasHeightPx,
158
+ rowHeight,
159
+ termCount: row.inputOrder.length,
160
+ xDendrogramHeight
161
+ }
162
+ );
163
+ this.dom.leftDendrogram.selectAll("*").remove();
164
+ return;
165
+ }
166
+ const canvas = new OffscreenCanvas(canvasWidthPx, canvasHeightPx);
167
+ const ctx = canvas.getContext("2d");
168
+ ctx.scale(pxr, pxr);
169
+ ctx.imageSmoothingEnabled = false;
170
+ ctx.imageSmoothingQuality = "high";
171
+ ctx.strokeStyle = "black";
172
+ const mergedClusters = /* @__PURE__ */ new Map();
173
+ for (const [clusterid0, pair] of row.merge.entries()) {
174
+ const clusterid = clusterid0 + 1;
175
+ const children = [];
176
+ const childrenClusters = [];
177
+ let x1, x2, y1, y2;
178
+ if (pair.n1 < 0) {
179
+ const [name, rowNumber] = getLeafNumber(pair.n1, row.inputOrder, row.order);
180
+ y1 = rowHeight * (rowNumber + 0.5);
181
+ x1 = xDendrogramHeight;
182
+ children.push({ name });
183
+ } else {
184
+ if (!mergedClusters.has(pair.n1)) throw "pair.n1 is positive but not seen before";
185
+ const c = mergedClusters.get(pair.n1);
186
+ x1 = c.x;
187
+ y1 = c.y;
188
+ children.push(...c.children);
189
+ childrenClusters.push(pair.n1);
190
+ }
191
+ if (pair.n2 < 0) {
192
+ const [name, rowNumber] = getLeafNumber(pair.n2, row.inputOrder, row.order);
193
+ y2 = rowHeight * (rowNumber + 0.5);
194
+ x2 = xDendrogramHeight;
195
+ children.push({ name });
196
+ } else {
197
+ if (!mergedClusters.has(pair.n2)) throw "pair.n1 is positive but not seen before";
198
+ const c = mergedClusters.get(pair.n2);
199
+ x2 = c.x;
200
+ y2 = c.y;
201
+ children.push(...c.children);
202
+ childrenClusters.push(pair.n2);
203
+ }
204
+ const clusterX = xDendrogramHeight - row.height[clusterid0].height * height2px;
205
+ const highlight = this.clickedLeftClusterIds?.includes(clusterid);
206
+ ctx.strokeStyle = highlight ? "red" : "black";
207
+ ctx.beginPath();
208
+ ctx.moveTo(x1, y1);
209
+ ctx.lineTo(clusterX, y1);
210
+ ctx.lineTo(clusterX, y2);
211
+ ctx.lineTo(x2, y2);
212
+ ctx.stroke();
213
+ ctx.closePath();
214
+ mergedClusters.set(clusterid, {
215
+ x: clusterX,
216
+ y: (y1 + y2) / 2,
217
+ children,
218
+ childrenClusters,
219
+ clusterPosition: {
220
+ x1,
221
+ x2,
222
+ y1,
223
+ y2,
224
+ clusterX
225
+ }
226
+ });
227
+ }
228
+ const t = this.termOrder.find((t2) => t2.grp.type == "hierCluster" || t2.grp.name == this.hcTermGroup.name);
229
+ const y = (
230
+ // t.labelOffset is commented out because it is already handled in adjustSvgDimensions
231
+ t.grpIndex * s.rowgspace + t.prevGrpTotalIndex * s.rowh + t.totalHtAdjustments + s.margin.top + s.scrollHeight + // left dendrogram image must be lower than the top dendrogram image height
232
+ yDendrogramHeight
233
+ );
234
+ this.renderImage(this.api, this.dom.leftDendrogram, canvas, width, height, 0, y);
235
+ row.mergedClusters = mergedClusters;
236
+ }
237
+ }
238
+ }
239
+ async function renderImage(componentApi, g, canvas, width, height, x, y) {
240
+ const sequenceId = componentApi.getSequenceId();
241
+ const reader = new FileReader();
242
+ reader.addEventListener(
243
+ "load",
244
+ () => {
245
+ if (componentApi.isStaleSequenceId(sequenceId)) return;
246
+ g.selectAll("*").remove();
247
+ g.append("image").attr("x", x + 0.033).attr("y", y + 0.033).attr("xlink:href", reader.result).attr("width", width).attr("height", height);
248
+ },
249
+ false
250
+ );
251
+ const blob = await canvas.convertToBlob({ quality: 1 });
252
+ reader.readAsDataURL(blob);
253
+ }
254
+ function getHclustHeightScalefactor(lst, ph) {
255
+ let max = lst[0].height;
256
+ for (const h of lst) max = Math.max(max, h.height);
257
+ return ph / max;
258
+ }
259
+ function getLeafNumber(minus, inputOrder, order) {
260
+ const name = inputOrder[-minus - 1];
261
+ if (!name) throw "minus not in inputOrder";
262
+ const i = order.findIndex((j) => j.name == name);
263
+ if (i == -1) throw "name not found in hc$order";
264
+ return [name, i];
265
+ }
266
+
267
+ export {
268
+ maySetSandboxHeader,
269
+ plotDendrogramHclust,
270
+ renderImage,
271
+ hierCluster_renderers_exports
272
+ };
273
+ //# sourceMappingURL=chunk-W345H42C.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../plots/matrix/hierCluster.renderers.js"],
4
+ "sourcesContent": ["import { TermTypes } from '#shared/terms.js'\n\nexport function maySetSandboxHeader(appState) {\n\t// run only once upon init, after state and dataType is given\n\tif (!this.dom.header) return // no header\n\tswitch (this.config.dataType) {\n\t\tcase TermTypes.GENE_EXPRESSION:\n\t\t\tthis.dom.header.text('Gene Expression Clustering')\n\t\t\tbreak\n\t\tcase TermTypes.METABOLITE_INTENSITY:\n\t\t\tthis.dom.header.text('Metabolite Intensity Clustering')\n\t\t\tbreak\n\t\tcase TermTypes.PROTEOME_ABUNDANCE:\n\t\t\tthis.dom.header.text(\n\t\t\t\tthis.config.assayCohortTitle\n\t\t\t\t\t? `Protein Abundance Clustering (${this.config.assayCohortTitle})`\n\t\t\t\t\t: 'Protein Abundance Clustering'\n\t\t\t)\n\t\t\tbreak\n\t\tdefault:\n\t\t\tthrow `dataType '${this.config.dataType}' not recognized`\n\t}\n}\n\nexport function plotDendrogramHclust(plotOnly) {\n\t/*\n\tbased on hclust() output\n\tplotOnly=top will only render column dendrograms\n\tplotOnly=left will only render row dendrograms\n\tif false will render both row and column\n\t*/\n\tconst d = this.dimensions\n\tconst s = this.config.settings.matrix\n\tconst xOffset = d.seriesXoffset // could be negative when zoomed\n\tconst pxr = window.devicePixelRatio <= 1 ? 1 : window.devicePixelRatio\n\n\tconst obj = this.hierClusterData.clustering\n\tconst row = obj.row\n\tconst col = obj.col\n\t/* both row{} and col{} are hclust() output structure:\n\t.merge[] {n1,n2}\n\t.height[] {height}\n\t.order[] {name}\n\t.inputOrder[] [str]\n\t*/\n\n\tconst rowHeight = this.settings.matrix.clusterRowh, //this.dimensions.dy,\n\t\t{ xDendrogramHeight, yDendrogramHeight } = this.settings.hierCluster,\n\t\tcolWidth = this.dimensions.dx\n\n\t// plot column dendrogram\n\tif (plotOnly !== 'left') {\n\t\tif (!this.settings.hierCluster.clusterSamples) {\n\t\t\tthis.dom.topDendrogram.selectAll('*').remove()\n\t\t} else {\n\t\t\tconst height2px = getHclustHeightScalefactor(col.height, yDendrogramHeight)\n\n\t\t\tconst height = yDendrogramHeight + 0.0000001\n\t\t\tconst width = Math.min(colWidth * col.inputOrder.length, s.imgWMax)\n\n\t\t\t// Safety check: prevent zero-sized canvas which causes convertToBlob error\n\t\t\tif (width <= 0 || height <= 0) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'Skipping top dendrogram render: invalid dimensions.',\n\t\t\t\t\t'This may indicate a zoom feedback loop issue.',\n\t\t\t\t\t{\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\theight,\n\t\t\t\t\t\tcolWidth,\n\t\t\t\t\t\tsampleCount: col.inputOrder.length,\n\t\t\t\t\t\tyDendrogramHeight\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t\tthis.dom.topDendrogram.selectAll('*').remove()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst canvas = new OffscreenCanvas(width * pxr, height * pxr)\n\t\t\tconst ctx = canvas.getContext('2d')\n\t\t\tctx.scale(pxr, pxr)\n\t\t\t// when the OffscreenCanvas width is too wide (>60k pixels as tested in Chrome and other browsers),\n\t\t\t// rendering outside of the usable width causes an IndexSizeError. The solution below is similar to\n\t\t\t// what's done in matrix.renderer: impose an upper limit of s.imgWMax for the canvas width and\n\t\t\t// translate the rendered x positions to the left, creating a viewport bounded by the max canvas\n\t\t\t// image width and where the segments/lines positioned outside of those bounds are clipped\n\t\t\t// by the canvas engine\n\t\t\tctx.translate(-d.xMin, 0) // d.xMin = 0 when imgWMax is not exceeded\n\t\t\t//ctx.translate(-d.xMin, 0)\n\t\t\tctx.imageSmoothingEnabled = false\n\t\t\tctx.imageSmoothingQuality = 'high'\n\t\t\tctx.strokeStyle = 'black'\n\n\t\t\tconst mergedClusters = new Map()\n\t\t\t/*\n\t\t\tas iterating through .merge[], collect merged clusters in here\n\t\t\tk: cluster id, positive integer, as in row.merge[]\n\t\t\tv: {\n\t\t\t\tx:\n\t\t\t\ty:\n\t\t\t\tchildren:[]\n\t\t\t}\n\t\t\t*/\n\t\t\tfor (const [clusterid0, pair] of col.merge.entries()) {\n\t\t\t\t// pair is {n1,n2}, n1 and n2 form a new cluster; id of which is clusterid\n\n\t\t\t\tconst clusterid = clusterid0 + 1 // id of this cluster formed by pair, as used in hclust$merge; positive integer\n\t\t\t\tconst children = [] // collect all children leaves for this cluster\n\t\t\t\tconst childrenClusters = [] // collect direct children cluster Ids for this cluster\n\n\t\t\t\tlet x1, x2, y1, y2\n\t\t\t\tif (pair.n1 < 0) {\n\t\t\t\t\t// n1 is leaf\n\t\t\t\t\tconst [name, columnNumber] = getLeafNumber(pair.n1, col.inputOrder, col.order)\n\t\t\t\t\tx1 = colWidth * (columnNumber + 0.5)\n\t\t\t\t\ty1 = yDendrogramHeight\n\t\t\t\t\tchildren.push({ name })\n\t\t\t\t} else {\n\t\t\t\t\t// n1 is cluster\n\t\t\t\t\tif (!mergedClusters.has(pair.n1)) throw 'pair.n1 is positive but not seen before'\n\t\t\t\t\tconst c = mergedClusters.get(pair.n1)\n\t\t\t\t\tx1 = c.x\n\t\t\t\t\ty1 = c.y\n\t\t\t\t\tchildren.push(...c.children)\n\t\t\t\t\tchildrenClusters.push(pair.n1)\n\t\t\t\t}\n\t\t\t\tif (pair.n2 < 0) {\n\t\t\t\t\t// n2 is leaf\n\t\t\t\t\tconst [name, columnNumber] = getLeafNumber(pair.n2, col.inputOrder, col.order)\n\t\t\t\t\tx2 = colWidth * (columnNumber + 0.5)\n\t\t\t\t\ty2 = yDendrogramHeight\n\t\t\t\t\tchildren.push({ name })\n\t\t\t\t} else {\n\t\t\t\t\tif (!mergedClusters.has(pair.n2)) throw 'pair.n1 is positive but not seen before'\n\t\t\t\t\tconst c = mergedClusters.get(pair.n2)\n\t\t\t\t\tx2 = c.x\n\t\t\t\t\ty2 = c.y\n\t\t\t\t\tchildren.push(...c.children)\n\t\t\t\t\tchildrenClusters.push(pair.n2)\n\t\t\t\t}\n\t\t\t\t// cluster y position\n\t\t\t\tconst clusterY = yDendrogramHeight - col.height[clusterid0].height * height2px\n\n\t\t\t\tconst highlight = this.clickedClusterIds?.includes(clusterid)\n\t\t\t\tctx.strokeStyle = highlight ? 'red' : 'black'\n\n\t\t\t\tctx.beginPath()\n\t\t\t\tctx.moveTo(x1, y1) // move to n1\n\t\t\t\tctx.lineTo(x1, clusterY) // vertical line up to cluster\n\t\t\t\tctx.lineTo(x2, clusterY) // h line to n2\n\t\t\t\tctx.lineTo(x2, y2) // v line down to n2\n\t\t\t\tctx.stroke()\n\t\t\t\tctx.closePath()\n\n\t\t\t\tmergedClusters.set(clusterid, {\n\t\t\t\t\tx: (x1 + x2) / 2,\n\t\t\t\t\ty: clusterY,\n\t\t\t\t\tchildren,\n\t\t\t\t\tchildrenClusters,\n\t\t\t\t\tclusterPosition: {\n\t\t\t\t\t\tx1,\n\t\t\t\t\t\tx2,\n\t\t\t\t\t\ty1,\n\t\t\t\t\t\ty2,\n\t\t\t\t\t\tclusterY\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tthis.renderImage(\n\t\t\t\tthis.api,\n\t\t\t\tthis.dom.topDendrogram,\n\t\t\t\tcanvas,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\txDendrogramHeight + 0.5 * colWidth + d.xMin,\n\t\t\t\ts.margin.top + s.scrollHeight\n\t\t\t)\n\n\t\t\tcol.mergedClusters = mergedClusters\n\t\t}\n\t}\n\n\t// plot row dendrogram\n\tif (plotOnly !== 'top') {\n\t\tif (!this.settings.hierCluster.clusterRows) {\n\t\t\tthis.dom.leftDendrogram.selectAll('*').remove()\n\t\t} else {\n\t\t\tconst height2px = getHclustHeightScalefactor(row.height, xDendrogramHeight)\n\t\t\tconst width = xDendrogramHeight + 0.0000001\n\t\t\tconst height = rowHeight * row.inputOrder.length\n\t\t\tconst canvasWidthPx = Number.isFinite(width) && Number.isFinite(pxr) ? Math.max(0, Math.floor(width * pxr)) : 0\n\t\t\tconst canvasHeightPx = Number.isFinite(height) && Number.isFinite(pxr) ? Math.max(0, Math.floor(height * pxr)) : 0\n\n\t\t\t// Safety check: prevent zero-sized canvas which causes OffscreenCanvas/convertToBlob errors\n\t\t\tif (\n\t\t\t\t!Number.isFinite(width) ||\n\t\t\t\t!Number.isFinite(height) ||\n\t\t\t\t!Number.isFinite(pxr) ||\n\t\t\t\twidth <= 0 ||\n\t\t\t\theight <= 0 ||\n\t\t\t\tpxr <= 0 ||\n\t\t\t\tcanvasWidthPx < 1 ||\n\t\t\t\tcanvasHeightPx < 1\n\t\t\t) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'Skipping left dendrogram render: invalid dimensions.',\n\t\t\t\t\t'This may indicate a zoom feedback loop issue.',\n\t\t\t\t\t{\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\theight,\n\t\t\t\t\t\tpxr,\n\t\t\t\t\t\tcanvasWidthPx,\n\t\t\t\t\t\tcanvasHeightPx,\n\t\t\t\t\t\trowHeight,\n\t\t\t\t\t\ttermCount: row.inputOrder.length,\n\t\t\t\t\t\txDendrogramHeight\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t\tthis.dom.leftDendrogram.selectAll('*').remove()\n\t\t\t\treturn\n\t\t\t}\n\t\t\tconst canvas = new OffscreenCanvas(canvasWidthPx, canvasHeightPx)\n\t\t\tconst ctx = canvas.getContext('2d')\n\t\t\tctx.scale(pxr, pxr)\n\t\t\tctx.imageSmoothingEnabled = false\n\t\t\tctx.imageSmoothingQuality = 'high'\n\t\t\tctx.strokeStyle = 'black'\n\n\t\t\tconst mergedClusters = new Map()\n\t\t\tfor (const [clusterid0, pair] of row.merge.entries()) {\n\t\t\t\t// pair is {n1,n2}, n1 and n2 form a new cluster; id of which is clusterid\n\n\t\t\t\tconst clusterid = clusterid0 + 1 // id of this cluster formed by pair, as used in hclust$merge; positive integer\n\t\t\t\tconst children = [] // collect all children leaves for this cluster\n\t\t\t\tconst childrenClusters = []\n\n\t\t\t\tlet x1, x2, y1, y2\n\t\t\t\tif (pair.n1 < 0) {\n\t\t\t\t\t// n1 is leaf\n\t\t\t\t\tconst [name, rowNumber] = getLeafNumber(pair.n1, row.inputOrder, row.order)\n\t\t\t\t\ty1 = rowHeight * (rowNumber + 0.5)\n\t\t\t\t\tx1 = xDendrogramHeight\n\t\t\t\t\tchildren.push({ name })\n\t\t\t\t} else {\n\t\t\t\t\t// n1 is cluster\n\t\t\t\t\tif (!mergedClusters.has(pair.n1)) throw 'pair.n1 is positive but not seen before'\n\t\t\t\t\tconst c = mergedClusters.get(pair.n1)\n\t\t\t\t\tx1 = c.x\n\t\t\t\t\ty1 = c.y\n\t\t\t\t\tchildren.push(...c.children)\n\t\t\t\t\tchildrenClusters.push(pair.n1)\n\t\t\t\t}\n\t\t\t\tif (pair.n2 < 0) {\n\t\t\t\t\t// n2 is leaf\n\t\t\t\t\tconst [name, rowNumber] = getLeafNumber(pair.n2, row.inputOrder, row.order)\n\t\t\t\t\ty2 = rowHeight * (rowNumber + 0.5)\n\t\t\t\t\tx2 = xDendrogramHeight\n\t\t\t\t\tchildren.push({ name })\n\t\t\t\t} else {\n\t\t\t\t\tif (!mergedClusters.has(pair.n2)) throw 'pair.n1 is positive but not seen before'\n\t\t\t\t\tconst c = mergedClusters.get(pair.n2)\n\t\t\t\t\tx2 = c.x\n\t\t\t\t\ty2 = c.y\n\t\t\t\t\tchildren.push(...c.children)\n\t\t\t\t\tchildrenClusters.push(pair.n2)\n\t\t\t\t}\n\t\t\t\t// cluster x position\n\t\t\t\tconst clusterX = xDendrogramHeight - row.height[clusterid0].height * height2px\n\n\t\t\t\tconst highlight = this.clickedLeftClusterIds?.includes(clusterid)\n\t\t\t\tctx.strokeStyle = highlight ? 'red' : 'black'\n\n\t\t\t\tctx.beginPath()\n\t\t\t\tctx.moveTo(x1, y1) // move to n1\n\t\t\t\tctx.lineTo(clusterX, y1) // h line right to cluster\n\t\t\t\tctx.lineTo(clusterX, y2) // v line down to n2\n\t\t\t\tctx.lineTo(x2, y2) // h line left to n2\n\t\t\t\tctx.stroke()\n\t\t\t\tctx.closePath()\n\n\t\t\t\tmergedClusters.set(clusterid, {\n\t\t\t\t\tx: clusterX,\n\t\t\t\t\ty: (y1 + y2) / 2,\n\t\t\t\t\tchildren,\n\t\t\t\t\tchildrenClusters,\n\t\t\t\t\tclusterPosition: {\n\t\t\t\t\t\tx1,\n\t\t\t\t\t\tx2,\n\t\t\t\t\t\ty1,\n\t\t\t\t\t\ty2,\n\t\t\t\t\t\tclusterX\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tconst t = this.termOrder.find(t => t.grp.type == 'hierCluster' || t.grp.name == this.hcTermGroup.name)\n\t\t\tconst y =\n\t\t\t\t// t.labelOffset is commented out because it is already handled in adjustSvgDimensions\n\t\t\t\tt.grpIndex * s.rowgspace +\n\t\t\t\tt.prevGrpTotalIndex * s.rowh /* + (t.labelOffset || 0) */ +\n\t\t\t\tt.totalHtAdjustments +\n\t\t\t\ts.margin.top +\n\t\t\t\ts.scrollHeight +\n\t\t\t\t// left dendrogram image must be lower than the top dendrogram image height\n\t\t\t\tyDendrogramHeight\n\t\t\tthis.renderImage(this.api, this.dom.leftDendrogram, canvas, width, height, 0, y)\n\n\t\t\trow.mergedClusters = mergedClusters\n\t\t}\n\t}\n}\n\nexport async function renderImage(componentApi, g, canvas, width, height, x, y) {\n\tconst sequenceId = componentApi.getSequenceId()\n\tconst reader = new FileReader()\n\treader.addEventListener(\n\t\t'load',\n\t\t() => {\n\t\t\tif (componentApi.isStaleSequenceId(sequenceId)) return\n\t\t\t// remove a previously rendered image, if applicable, right before replacing it\n\t\t\t// so that there will be no flicker on update\n\t\t\tg.selectAll('*').remove()\n\n\t\t\tg.append('image')\n\t\t\t\t.attr('x', x + 0.033)\n\t\t\t\t.attr('y', y + 0.033)\n\t\t\t\t.attr('xlink:href', reader.result)\n\t\t\t\t.attr('width', width)\n\t\t\t\t.attr('height', height)\n\t\t},\n\t\tfalse\n\t)\n\tconst blob = await canvas.convertToBlob({ quality: 1 })\n\treader.readAsDataURL(blob)\n\t// g.selectAll('*').remove()\n\t// const foCanvas = g.append('foreignObject').append('canvas').attr('width', width).attr('height', height).node()\n\t// const bitmap = canvas.transferToImageBitmap();\n\t// foCanvas.getContext(\"bitmaprenderer\").transferFromImageBitmap(bitmap);\n}\n\nfunction getHclustHeightScalefactor(lst, ph) {\n\t// scale hclust$height to on-screen max height (h) in number of pixels\n\tlet max = lst[0].height\n\tfor (const h of lst) max = Math.max(max, h.height)\n\treturn ph / max\n}\n\nfunction getLeafNumber(minus, inputOrder, order) {\n\tconst name = inputOrder[-minus - 1]\n\tif (!name) throw 'minus not in inputOrder'\n\tconst i = order.findIndex(j => j.name == name)\n\tif (i == -1) throw 'name not found in hc$order'\n\treturn [name, i]\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["t"]
7
+ }