@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.
- package/dist/2dmaf-YHYYSSKR.js +1371 -0
- package/dist/AIProjectAdmin-D4AASQBM.js +830 -0
- package/dist/AIProjectAdmin-D4AASQBM.js.map +7 -0
- package/dist/AppHeader-T4ZLY3VG.js +833 -0
- package/dist/BoxPlot-DIU4YXNK.js +1217 -0
- package/dist/BoxPlot-DIU4YXNK.js.map +7 -0
- package/dist/CorrelationVolcano-EXH4P56S.js +617 -0
- package/dist/DE-C5K2TVUQ.js +93 -0
- package/dist/DE-C5K2TVUQ.js.map +7 -0
- package/dist/DEinput-KVILE7QQ.js +297 -0
- package/dist/DEinput-KVILE7QQ.js.map +7 -0
- package/dist/DifferentialAnalysis-P6GKHAS5.js +238 -0
- package/dist/Disco-IMLXEBPG.js +3235 -0
- package/dist/Disco-IMLXEBPG.js.map +7 -0
- package/dist/Disco.UI-4A2P5Q55.js +242 -0
- package/dist/DmrPlot-6EEEGD32.js +640 -0
- package/dist/GB-XFO5I6ND.js +1125 -0
- package/dist/HicApp-3LFHOOAR.js +2248 -0
- package/dist/NumBinaryEditor-74PY52BP.js +268 -0
- package/dist/NumBinaryEditor-74PY52BP.js.map +7 -0
- package/dist/NumBinaryEditor.unit.spec-2PYZ7P2R.js +284 -0
- package/dist/NumContEditor-BMWALLQM.js +105 -0
- package/dist/NumContEditor.unit.spec-ETVLVX6A.js +167 -0
- package/dist/NumCustomBinEditor-2XJ6GUWY.js +36 -0
- package/dist/NumCustomBinEditor.unit.spec-TZVL553E.js +282 -0
- package/dist/NumDiscreteEditor-4LNLKAXT.js +177 -0
- package/dist/NumDiscreteEditor-4LNLKAXT.js.map +7 -0
- package/dist/NumDiscreteEditor.unit.spec-KQND2XAE.js +200 -0
- package/dist/NumRegularBinEditor-OYELFDIB.js +36 -0
- package/dist/NumRegularBinEditor.unit.spec-44SALKLH.js +225 -0
- package/dist/NumSplineEditor-SENQC4P2.js +190 -0
- package/dist/NumSplineEditor-SENQC4P2.js.map +7 -0
- package/dist/NumSplineEditor.unit.spec-XKB4XXU4.js +197 -0
- package/dist/NumericDensity-GCNWO7YS.js +36 -0
- package/dist/NumericDensity.unit.spec-7LWNOUYK.js +219 -0
- package/dist/NumericHandler-EMQBI5UI.js +37 -0
- package/dist/NumericHandler.unit.spec-TEELPRIM.js +217 -0
- package/dist/RunChart2-LJBC5X2H.js +756 -0
- package/dist/RunChart2-LJBC5X2H.js.map +7 -0
- package/dist/SC-3EB6UYIS.js +682 -0
- package/dist/SC-3EB6UYIS.js.map +7 -0
- package/dist/Volcano-CPULLVYV.js +1185 -0
- package/dist/Volcano-CPULLVYV.js.map +7 -0
- package/dist/WSIViewer-2YCT4LCM.js +47974 -0
- package/dist/WSIViewer-2YCT4LCM.js.map +7 -0
- package/dist/WsiSamplesPlot-B2DM7Z3Q.js +163 -0
- package/dist/adSandbox-INF3NNEV.js +36 -0
- package/dist/alphaGenome-CO4TQHXN.js +173 -0
- package/dist/app-63JU2YIT.js +47 -0
- package/dist/app-BL3POUOO.js +35 -0
- package/dist/app.js +17 -17
- package/dist/bam-SVEJYICC.js +857 -0
- package/dist/bam-SVEJYICC.js.map +7 -0
- package/dist/barchart-PDUXZAIH.js +45 -0
- package/dist/barchart.data-EXENRVMU.js +22 -0
- package/dist/barchart.events-MQNQTSWI.js +45 -0
- package/dist/barchart.integration.spec-DSO2377T.js +1675 -0
- package/dist/bars.renderer-S7A7I6BQ.js +12 -0
- package/dist/block-OO2NLGUP.js +6200 -0
- package/dist/block-OO2NLGUP.js.map +7 -0
- package/dist/block.init-7J5OHYKA.js +36 -0
- package/dist/block.mds.expressionrank-643H7PN7.js +357 -0
- package/dist/block.mds.geneboxplot-C222ODSL.js +826 -0
- package/dist/block.mds.junction-C5DJRUOK.js +1543 -0
- package/dist/block.mds.svcnv-4G74JQ7Y.js +6799 -0
- package/dist/block.svg-35KUC5R7.js +162 -0
- package/dist/block.tk.aicheck-LLWT6K6H.js +281 -0
- package/dist/block.tk.ase-PQUKY65E.js +363 -0
- package/dist/block.tk.bam-EUEOB7BR.js +1904 -0
- package/dist/block.tk.bedgraphdot-XAHUY545.js +382 -0
- package/dist/block.tk.bigwig.ui-HEOPNL3T.js +209 -0
- package/dist/block.tk.hicstraw-EPH3LEX2.js +821 -0
- package/dist/block.tk.junction-MIUDAIAR.js +2362 -0
- package/dist/block.tk.junction.textmatrixui-AVFUQBDS.js +197 -0
- package/dist/block.tk.ld-ED7YMBQ4.js +97 -0
- package/dist/block.tk.menu-3CVIECWQ.js +1027 -0
- package/dist/block.tk.pgv-HETJVWXH.js +942 -0
- package/dist/brainImaging-K3LHK3DD.js +421 -0
- package/dist/chat-BYX5ARUK.js +148 -0
- package/dist/chunk-25RP5OSE.js +1426 -0
- package/dist/chunk-25RP5OSE.js.map +7 -0
- package/dist/chunk-2LULD7RN.js +31 -0
- package/dist/chunk-2M6JV7YS.js +261 -0
- package/dist/chunk-2M6JV7YS.js.map +7 -0
- package/dist/chunk-2TJESM3Z.js +158 -0
- package/dist/chunk-2TJESM3Z.js.map +7 -0
- package/dist/chunk-2VFYZ3EY.js +102 -0
- package/dist/chunk-3CD5ZROA.js +4952 -0
- package/dist/chunk-3DCABJHB.js +381 -0
- package/dist/chunk-3MMKHYUM.js +95 -0
- package/dist/chunk-3PRPMJTG.js +55 -0
- package/dist/chunk-4JON7TLI.js +176 -0
- package/dist/chunk-4JON7TLI.js.map +7 -0
- package/dist/chunk-5JD4D5GD.js +215 -0
- package/dist/chunk-5JD4D5GD.js.map +7 -0
- package/dist/chunk-5UMPBVA6.js +534 -0
- package/dist/chunk-64FGLSIM.js +56 -0
- package/dist/chunk-64FGLSIM.js.map +7 -0
- package/dist/chunk-6ITDJ5UR.js +261 -0
- package/dist/chunk-6ITDJ5UR.js.map +7 -0
- package/dist/chunk-6LAE5AVA.js +13624 -0
- package/dist/chunk-6VLA5NEW.js +335 -0
- package/dist/chunk-6VLA5NEW.js.map +7 -0
- package/dist/chunk-7FKIAQ4K.js +17 -0
- package/dist/chunk-7FKIAQ4K.js.map +7 -0
- package/dist/chunk-7FTDQDVF.js +824 -0
- package/dist/chunk-7IEZ2KMW.js +142 -0
- package/dist/chunk-7RN3L2BX.js +1788 -0
- package/dist/chunk-7RN3L2BX.js.map +7 -0
- package/dist/chunk-A5AFIW2T.js +14 -0
- package/dist/chunk-A6TQGNDQ.js +421 -0
- package/dist/chunk-A6TQGNDQ.js.map +7 -0
- package/dist/chunk-AIBODF32.js +2784 -0
- package/dist/chunk-AWWW6K2I.js +407 -0
- package/dist/chunk-AWWW6K2I.js.map +7 -0
- package/dist/chunk-BAY47D5E.js +226 -0
- package/dist/chunk-CFHKYLDY.js +26 -0
- package/dist/chunk-CJZN7HFL.js +293 -0
- package/dist/chunk-CXOF4UGH.js +229 -0
- package/dist/chunk-CXOF4UGH.js.map +7 -0
- package/dist/chunk-D4QFQQWJ.js +170 -0
- package/dist/chunk-DNCSPTOQ.js +446 -0
- package/dist/chunk-DQGSCCI3.js +100 -0
- package/dist/chunk-EWGMLVC7.js +34 -0
- package/dist/chunk-F7PB5HGT.js +148 -0
- package/dist/chunk-G7QKLA54.js +92 -0
- package/dist/chunk-HWHG63LH.js +148 -0
- package/dist/chunk-HWHG63LH.js.map +7 -0
- package/dist/chunk-HYZG6OPC.js +467 -0
- package/dist/chunk-HYZG6OPC.js.map +7 -0
- package/dist/chunk-IBBMKCO7.js +526 -0
- package/dist/chunk-IBBMKCO7.js.map +7 -0
- package/dist/chunk-IQUYTZOA.js +455 -0
- package/dist/chunk-IQUYTZOA.js.map +7 -0
- package/dist/chunk-J5RINDKS.js +480 -0
- package/dist/chunk-JMPSZMDD.js +52 -0
- package/dist/chunk-KQMEJUWI.js +815 -0
- package/dist/chunk-KWFEGPZL.js +97 -0
- package/dist/chunk-KWFEGPZL.js.map +7 -0
- package/dist/chunk-LBXZGYU5.js +368 -0
- package/dist/chunk-LBXZGYU5.js.map +7 -0
- package/dist/chunk-LRBNYEFI.js +50 -0
- package/dist/chunk-LRBNYEFI.js.map +7 -0
- package/dist/chunk-LRMV5DNW.js +441 -0
- package/dist/chunk-LWNOC7AJ.js +54 -0
- package/dist/chunk-MICNOSX7.js +129 -0
- package/dist/chunk-MLWNMXAV.js +272 -0
- package/dist/chunk-MMBLSLQR.js +158 -0
- package/dist/chunk-N3QEGDEZ.js +117 -0
- package/dist/chunk-N3QEGDEZ.js.map +7 -0
- package/dist/chunk-NV5XWADG.js +1150 -0
- package/dist/chunk-NVB7MQLH.js +20649 -0
- package/dist/chunk-NVB7MQLH.js.map +7 -0
- package/dist/chunk-O3255WPP.js +1087 -0
- package/dist/chunk-OSM7YS23.js +276 -0
- package/dist/chunk-PEWHCKCH.js +1205 -0
- package/dist/chunk-PEWHCKCH.js.map +7 -0
- package/dist/chunk-Q7PYFSNU.js +107 -0
- package/dist/chunk-QEZPKEWB.js +1159 -0
- package/dist/chunk-QEZPKEWB.js.map +7 -0
- package/dist/chunk-QMI222IJ.js +386 -0
- package/dist/chunk-QRIRWDIW.js +252 -0
- package/dist/chunk-SJTOSA7E.js +629 -0
- package/dist/chunk-SRYFYAXK.js +615 -0
- package/dist/chunk-SSPDNHDW.js +398 -0
- package/dist/chunk-SSPDNHDW.js.map +7 -0
- package/dist/chunk-SYMOQE3X.js +37 -0
- package/dist/chunk-SYMOQE3X.js.map +7 -0
- package/dist/chunk-TITA4HJA.js +228 -0
- package/dist/chunk-U7ZMIMI5.js +2815 -0
- package/dist/chunk-UJU3Q7QJ.js +119 -0
- package/dist/chunk-UL2ISTHR.js +2672 -0
- package/dist/chunk-VIPMLSZP.js +217 -0
- package/dist/chunk-VYIO7T6J.js +82 -0
- package/dist/chunk-VYIO7T6J.js.map +7 -0
- package/dist/chunk-VZPYIG77.js +1271 -0
- package/dist/chunk-VZPYIG77.js.map +7 -0
- package/dist/chunk-W345H42C.js +273 -0
- package/dist/chunk-W345H42C.js.map +7 -0
- package/dist/chunk-WGL6FIUE.js +330 -0
- package/dist/chunk-WIYKAKWE.js +302 -0
- package/dist/chunk-WJGVQJSX.js +514 -0
- package/dist/chunk-WJGVQJSX.js.map +7 -0
- package/dist/chunk-WPHOEG56.js +194 -0
- package/dist/chunk-WU63AOK2.js +4207 -0
- package/dist/chunk-WU63AOK2.js.map +7 -0
- package/dist/chunk-XS4QWRS3.js +205 -0
- package/dist/chunk-XYFDBYOY.js +1658 -0
- package/dist/chunk-XYFDBYOY.js.map +7 -0
- package/dist/chunk-YDWRIMCT.js +289 -0
- package/dist/chunk-YDWRIMCT.js.map +7 -0
- package/dist/chunk-YK5NFMHR.js +269 -0
- package/dist/chunk-YK5NFMHR.js.map +7 -0
- package/dist/chunk-YSW57QDM.js +6364 -0
- package/dist/chunk-YXQNZPCO.js +203 -0
- package/dist/chunk-YYYJB53A.js +2370 -0
- package/dist/chunk-ZTKQLABY.js +470 -0
- package/dist/condition-AM523RDR.js +330 -0
- package/dist/controls-HTMH5QBP.js +39 -0
- package/dist/controls.config-EEK2RBPI.js +37 -0
- package/dist/correlation-HKD67SPS.js +96 -0
- package/dist/cuminc-66V55MMN.js +1147 -0
- package/dist/cuminc.integration.spec-PNTOPB2L.js +676 -0
- package/dist/customdata.inputui-Z4WQDU6I.js +285 -0
- package/dist/dataDownload-3ZEI22OK.js +328 -0
- package/dist/dataDownload.integration.spec-C3JRC6K5.js +191 -0
- package/dist/databrowser.ui-Q365SHBG.js +419 -0
- package/dist/dictionary-D4E2VEJT.js +109 -0
- package/dist/dictionary-D4E2VEJT.js.map +7 -0
- package/dist/dnaMethylation-IFZWWBUG.js +36 -0
- package/dist/dnaMethylation.integration.spec-UKV4BSIO.js +165 -0
- package/dist/dnaMethylation.integration.spec-UKV4BSIO.js.map +7 -0
- package/dist/e2pca-I3QXF7EM.js +348 -0
- package/dist/ep-2VCQ36GT.js +1254 -0
- package/dist/expclust.gdc.spec-VWIQFY67.js +305 -0
- package/dist/facet-CHP3VUWS.js +519 -0
- package/dist/geneExpClustering-YDIDEH2O.js +246 -0
- package/dist/geneExpression-FA5RJRHZ.js +36 -0
- package/dist/geneExpression-X2KXJPND.js +312 -0
- package/dist/geneExpression.unit.spec-3LVHYZGG.js +100 -0
- package/dist/geneORA-4CAYRKSN.js +276 -0
- package/dist/geneVariant-OCOTNUH4.js +39 -0
- package/dist/geneVariant-Y4L5W5HF.js +37 -0
- package/dist/geneVariant.integration.spec-BOJ5MM5K.js +196 -0
- package/dist/genefusion.ui-I6HZOBIV.js +249 -0
- package/dist/geneset-GEWKDAAT.js +194 -0
- package/dist/genomeBrowser.spec-FDEGH4DY.js +279 -0
- package/dist/grin2-K56B6XBZ.js +1031 -0
- package/dist/grin2-V6FMM44N.js +1554 -0
- package/dist/gsea-UNPPRU2U.js +45 -0
- package/dist/hierCluster-DXAWRQNI.js +58 -0
- package/dist/hierCluster-SPIQA2M2.js +62 -0
- package/dist/hierCluster.config-JW6D3T3Q.js +38 -0
- package/dist/hierCluster.integration.spec-5NXZY4LG.js +374 -0
- package/dist/hierCluster.interactivity-CPPBXHM7.js +52 -0
- package/dist/hierCluster.renderers-A6MEGO2B.js +21 -0
- package/dist/imagePlot-QLAHCULW.js +139 -0
- package/dist/importPlot-6ITZ6U7G.js +8 -0
- package/dist/isoformExpression-7GAUF2QV.js +38 -0
- package/dist/isoformExpression.unit.spec-3BVXVVNO.js +206 -0
- package/dist/isoformExpression.unit.spec-3BVXVVNO.js.map +7 -0
- package/dist/jspdf.es.min-FC3BCETM.js +40 -0
- package/dist/launch.adhoc-HFHBAUR6.js +40 -0
- package/dist/leftlabel.sample-CWPJUCHR.js +257 -0
- package/dist/lollipop-QFRQLEER.js +166 -0
- package/dist/maf-OEODBT3Y.js +450 -0
- package/dist/maf-OEODBT3Y.js.map +7 -0
- package/dist/maftimeline-2DFIF4C4.js +591 -0
- package/dist/matrix-3HFB5TUU.js +57 -0
- package/dist/matrix-MIXK27AD.js +62 -0
- package/dist/matrix.cells-U7AQNEBP.js +28 -0
- package/dist/matrix.config-FX5MHX6O.js +39 -0
- package/dist/matrix.controls-5K7BB5Z4.js +37 -0
- package/dist/matrix.data-EEIY6AO4.js +25 -0
- package/dist/matrix.dom-6QL3AJMW.js +11 -0
- package/dist/matrix.groups-CUB6UWC5.js +26 -0
- package/dist/matrix.integration.spec-ML4T7FRG.js +3070 -0
- package/dist/matrix.interactivity-QMPWX63Q.js +40 -0
- package/dist/matrix.layout-7SEF6MYI.js +42 -0
- package/dist/matrix.legend-42LQGAGX.js +22 -0
- package/dist/matrix.renderers-ZF7LLER3.js +36 -0
- package/dist/matrix.serieses-4B2WB526.js +21 -0
- package/dist/matrix.sort-BJACNR7G.js +27 -0
- package/dist/matrix.sort.unit.spec-ZGSM7HDJ.js +470 -0
- package/dist/matrix.sorterUi-W6XFYZY2.js +18 -0
- package/dist/matrix.sorterUi.unit.spec-V34ZZD7A.js +340 -0
- package/dist/mavb-NVQVFU6E.js +730 -0
- package/dist/mds.fimo-HOCF6U6K.js +516 -0
- package/dist/mds.samplescatterplot-ULD5BK5R.js +1548 -0
- package/dist/mds.survivalplot-5US32RQD.js +481 -0
- package/dist/oncomatrix-Y3G3MUJJ.js +293 -0
- package/dist/oncomatrix-Y3G3MUJJ.js.map +7 -0
- package/dist/oncomatrix.spec-MFUJLWEP.js +446 -0
- package/dist/plot.2dvaf-F4WZ4YPU.js +375 -0
- package/dist/plot.app-YFFLLBU5.js +39 -0
- package/dist/plot.barplot-2EJ2MWQD.js +100 -0
- package/dist/plot.boxplot-AKZM443E.js +150 -0
- package/dist/plot.brainImaging-DR6WJNFZ.js +51 -0
- package/dist/plot.disco-LBE5H67U.js +101 -0
- package/dist/plot.disco-LBE5H67U.js.map +7 -0
- package/dist/plot.dzi-R2MR7HAT.js +33 -0
- package/dist/plot.ssgq-C52YIUFY.js +137 -0
- package/dist/plot.vaf2cov-FOD3K7BC.js +257 -0
- package/dist/plot.wsi-D2TXYERK.js +36 -0
- package/dist/polar-2LC35O6K.js +184 -0
- package/dist/polar2-QPUOEUJZ.js +226 -0
- package/dist/profile.spec-3NCDGHLX.js +78 -0
- package/dist/profileBarchart-PPQ3NL4D.js +265 -0
- package/dist/profileForms-GS3VVW65.js +438 -0
- package/dist/profilePlot-DQWFH5NC.js +52 -0
- package/dist/profileRadar-KAKRDC4R.js +261 -0
- package/dist/profileRadarFacility-FZP62VPV.js +261 -0
- package/dist/profileRadarFacility-FZP62VPV.js.map +7 -0
- package/dist/proteinView-LWVWJY54.js +444 -0
- package/dist/proteinView-LWVWJY54.js.map +7 -0
- package/dist/proteomeAbundance-DE4NVBCN.js +21 -0
- package/dist/proteomeAbundance-LTB3QR3G.js +63 -0
- package/dist/qualitative-YOFAROVR.js +41 -0
- package/dist/regression-PF6IAHJK.js +54 -0
- package/dist/regression.inputs-77IUYED3.js +46 -0
- package/dist/regression.inputs.term-WWCHU6KF.js +46 -0
- package/dist/regression.inputs.values.table-I6GM6MU7.js +43 -0
- package/dist/regression.integration.spec-DGEZUURU.js +782 -0
- package/dist/regression.integration.spec-DGEZUURU.js.map +7 -0
- package/dist/regression.results-6GXNKYUS.js +38 -0
- package/dist/regression.spec-MEFQNY34.js +706 -0
- package/dist/report-LG3UKZHL.js +220 -0
- package/dist/sampleScatter.spec-D3IK7MSA.js +200 -0
- package/dist/sampleView-XUI2J5EC.js +46 -0
- package/dist/samplelst-A7IHCBAX.js +109 -0
- package/dist/samplematrix-VGUU7Q75.js +2196 -0
- package/dist/sc-UVKVT2RY.js +84 -0
- package/dist/scatter-UILUYOGO.js +800 -0
- package/dist/scatter.integration.spec-VPNALPUG.js +1194 -0
- package/dist/scatter.integration.spec-VPNALPUG.js.map +7 -0
- package/dist/selectGenomeWithTklst-LWKIMZEJ.js +132 -0
- package/dist/singleCellCellType-TI52WQQ4.js +36 -0
- package/dist/singleCellCellType.unit.spec-R3BTRFRU.js +158 -0
- package/dist/singleCellCellType.unit.spec-R3BTRFRU.js.map +7 -0
- package/dist/singleCellGeneExpression-I5SAHMGI.js +36 -0
- package/dist/singleCellGeneExpression.unit.spec-2JTB5HLY.js +151 -0
- package/dist/singleCellGeneExpression.unit.spec-2JTB5HLY.js.map +7 -0
- package/dist/singleCellPlot-HRWCHYCI.js +51 -0
- package/dist/singlecell-BHPP7KCO.js +1570 -0
- package/dist/singlecell-PQNKBKR7.js +84 -0
- package/dist/snp-V4YGI7B3.js +36 -0
- package/dist/snp.unit.spec-JSUCMGNP.js +174 -0
- package/dist/snplocus-3YT5NNCH.js +206 -0
- package/dist/spliceevent.a53ss.diagram-QEQJ44YH.js +149 -0
- package/dist/spliceevent.exonskip.diagram-HMWVSOJG.js +275 -0
- package/dist/spliceevent.noeventdiagram-L5HUCT5A.js +458 -0
- package/dist/ssGSEA-Z3XRCBYW.js +36 -0
- package/dist/ssGSEA.unit.spec-EUCTV2XJ.js +86 -0
- package/dist/summarizeCnvGeneexp-O7O2CFW4.js +161 -0
- package/dist/summarizeCnvGeneexp-O7O2CFW4.js.map +7 -0
- package/dist/summarizeGeneexpSurvival-DDPH56EI.js +106 -0
- package/dist/summarizeGeneexpSurvival-DDPH56EI.js.map +7 -0
- package/dist/summarizeMutationCnv-6KJQUJWR.js +162 -0
- package/dist/summarizeMutationCnv-6KJQUJWR.js.map +7 -0
- package/dist/summarizeMutationDiagnosis-HFFYLQOF.js +38 -0
- package/dist/summarizeMutationSurvival-OBK6YILP.js +97 -0
- package/dist/summary-W55WWIU2.js +47 -0
- package/dist/summary.integration.spec-X2PNAUKW.js +412 -0
- package/dist/summaryInput-X547Q6C7.js +218 -0
- package/dist/sunburst-KWNGYBRI.js +282 -0
- package/dist/sunburst-KWNGYBRI.js.map +7 -0
- package/dist/survival-PAJZHZPD.js +56 -0
- package/dist/survival-TQPWMOD5.js +44 -0
- package/dist/survival.integration.spec-YMQASOMX.js +800 -0
- package/dist/survival.integration.spec-YMQASOMX.js.map +7 -0
- package/dist/svg2pdf.es.min-CYTPRWNB.js +3157 -0
- package/dist/svgraph-Y35C2M3D.js +1385 -0
- package/dist/svmr-WGCIR7PE.js +3840 -0
- package/dist/table-Q3B2YXEN.js +198 -0
- package/dist/termCollection-A6YTSM5I.js +177 -0
- package/dist/termCollection-NTFNVQ7D.js +36 -0
- package/dist/termCollection.unit.spec-BX54PHKT.js +206 -0
- package/dist/tk-OCBZ7YR6.js +44 -0
- package/dist/tp.ui-ZT47N2CO.js +1457 -0
- package/dist/tvs.dt-BFB253O3.js +37 -0
- package/dist/tvs.dtcnv.categorical-ARGAYIDO.js +38 -0
- package/dist/tvs.dtcnv.continuous-JCU23ERV.js +70 -0
- package/dist/tvs.dtfusion-FV64XLZI.js +38 -0
- package/dist/tvs.dtsnvindel-DMOXMEVL.js +38 -0
- package/dist/tvs.dtsv-53FSZEPV.js +38 -0
- package/dist/tvs.samplelst-MVPL6VXX.js +102 -0
- package/dist/tvs.termCollection-UGJXTHTG.js +151 -0
- package/dist/violin-ZLUDGSQG.js +44 -0
- package/dist/violin.integration.spec-KWOFOFLT.js +1423 -0
- package/dist/violin.integration.spec-KWOFOFLT.js.map +7 -0
- package/dist/violin.interactivity-ULDOCZWW.js +36 -0
- package/dist/violin.renderer-KJAXPMIK.js +38 -0
- package/dist/vocabulary-34YUQ4ZQ.js +39 -0
- package/package.json +3 -3
- package/dist/2dmaf-PFPBHIUI.js +0 -1371
- package/dist/AIProjectAdmin-H2GB5ZOX.js +0 -830
- package/dist/AIProjectAdmin-H2GB5ZOX.js.map +0 -7
- package/dist/AppHeader-FCWML6WH.js +0 -833
- package/dist/BoxPlot-QKXGF76K.js +0 -1295
- package/dist/BoxPlot-QKXGF76K.js.map +0 -7
- package/dist/CorrelationVolcano-ZJ7Q6JBC.js +0 -617
- package/dist/DifferentialAnalysis-PWCFCWFY.js +0 -238
- package/dist/Disco-IE5JKIF2.js +0 -3199
- package/dist/Disco-IE5JKIF2.js.map +0 -7
- package/dist/Disco.UI-SR7LSJE3.js +0 -242
- package/dist/DmrPlot-UDY7GOSY.js +0 -640
- package/dist/GB-GNTOP5C6.js +0 -1125
- package/dist/HicApp-FZTJL3OA.js +0 -2248
- package/dist/NumBinaryEditor-R5QVG3C4.js +0 -266
- package/dist/NumBinaryEditor-R5QVG3C4.js.map +0 -7
- package/dist/NumBinaryEditor.unit.spec-BMVRI24W.js +0 -284
- package/dist/NumContEditor-6JT5D6IW.js +0 -105
- package/dist/NumContEditor.unit.spec-XBQF2SW6.js +0 -167
- package/dist/NumCustomBinEditor-MEKEFOQI.js +0 -36
- package/dist/NumCustomBinEditor.unit.spec-LEMQJHDT.js +0 -282
- package/dist/NumDiscreteEditor-U3N37XRQ.js +0 -170
- package/dist/NumDiscreteEditor-U3N37XRQ.js.map +0 -7
- package/dist/NumDiscreteEditor.unit.spec-WQM4DLKO.js +0 -200
- package/dist/NumRegularBinEditor-HQR5Y6P7.js +0 -36
- package/dist/NumRegularBinEditor.unit.spec-FL4IFT7L.js +0 -225
- package/dist/NumSplineEditor-OESWMWP5.js +0 -188
- package/dist/NumSplineEditor-OESWMWP5.js.map +0 -7
- package/dist/NumSplineEditor.unit.spec-HYOXO45B.js +0 -197
- package/dist/NumericDensity-GJZ4BBJS.js +0 -36
- package/dist/NumericDensity.unit.spec-6LXWAXW7.js +0 -219
- package/dist/NumericHandler-LZIMPOHS.js +0 -37
- package/dist/NumericHandler.unit.spec-ZSU35AMD.js +0 -217
- package/dist/RunChart2-7XV6TIFO.js +0 -756
- package/dist/RunChart2-7XV6TIFO.js.map +0 -7
- package/dist/SC-E4EYAG26.js +0 -733
- package/dist/SC-E4EYAG26.js.map +0 -7
- package/dist/Volcano-Z7TJK6PW.js +0 -1187
- package/dist/Volcano-Z7TJK6PW.js.map +0 -7
- package/dist/WSIViewer-ZH2XABLC.js +0 -47933
- package/dist/WSIViewer-ZH2XABLC.js.map +0 -7
- package/dist/WsiSamplesPlot-BL47MDHQ.js +0 -163
- package/dist/adSandbox-V3NTKVBC.js +0 -36
- package/dist/alphaGenome-IQVFCSWQ.js +0 -173
- package/dist/app-GJLZ2G2U.js +0 -47
- package/dist/app-YSD2U64Q.js +0 -35
- package/dist/bam-TRIF3AIQ.js +0 -849
- package/dist/bam-TRIF3AIQ.js.map +0 -7
- package/dist/barchart-GLLUYTAJ.js +0 -45
- package/dist/barchart.data-FRYRGKH3.js +0 -22
- package/dist/barchart.events-WODVSHRN.js +0 -45
- package/dist/barchart.integration.spec-6POS3V3T.js +0 -1675
- package/dist/bars.renderer-T5R3UIBW.js +0 -12
- package/dist/block-2QM37YSE.js +0 -6300
- package/dist/block-2QM37YSE.js.map +0 -7
- package/dist/block.init-7HDLKQVX.js +0 -36
- package/dist/block.mds.expressionrank-UIB25S6E.js +0 -357
- package/dist/block.mds.geneboxplot-4PQYO3MR.js +0 -826
- package/dist/block.mds.junction-DWFYZEC2.js +0 -1543
- package/dist/block.mds.svcnv-N3KJJ4GQ.js +0 -6799
- package/dist/block.svg-2HBDI7BT.js +0 -162
- package/dist/block.tk.aicheck-2M4522IQ.js +0 -281
- package/dist/block.tk.ase-URIKF6JD.js +0 -363
- package/dist/block.tk.bam-HTDMASHX.js +0 -1904
- package/dist/block.tk.bedgraphdot-RVKMSFCQ.js +0 -382
- package/dist/block.tk.bigwig.ui-7JPEOIKM.js +0 -209
- package/dist/block.tk.hicstraw-72J7UJ2J.js +0 -821
- package/dist/block.tk.junction-GGFMBCV5.js +0 -2362
- package/dist/block.tk.junction.textmatrixui-44SAYYWE.js +0 -197
- package/dist/block.tk.ld-XDKJFEOL.js +0 -97
- package/dist/block.tk.menu-46FOTM7H.js +0 -1027
- package/dist/block.tk.pgv-ZVONRT4B.js +0 -942
- package/dist/brainImaging-CSLO7ODJ.js +0 -421
- package/dist/chat-GMD22F3K.js +0 -148
- package/dist/chunk-22KWZOCN.js +0 -153
- package/dist/chunk-22KWZOCN.js.map +0 -7
- package/dist/chunk-2NQ4TM74.js +0 -48
- package/dist/chunk-2NQ4TM74.js.map +0 -7
- package/dist/chunk-2SRMRC6L.js +0 -421
- package/dist/chunk-2SRMRC6L.js.map +0 -7
- package/dist/chunk-2TIYJ3PH.js +0 -815
- package/dist/chunk-2UWHV2SB.js +0 -261
- package/dist/chunk-2UWHV2SB.js.map +0 -7
- package/dist/chunk-3656ZY4T.js +0 -237
- package/dist/chunk-3656ZY4T.js.map +0 -7
- package/dist/chunk-3TU6TRLQ.js +0 -98
- package/dist/chunk-3TU6TRLQ.js.map +0 -7
- package/dist/chunk-4FJ5GS6P.js +0 -4202
- package/dist/chunk-4FJ5GS6P.js.map +0 -7
- package/dist/chunk-4FO7KZY2.js +0 -534
- package/dist/chunk-4OEOQX4L.js +0 -334
- package/dist/chunk-4OEOQX4L.js.map +0 -7
- package/dist/chunk-5ZICCKEH.js +0 -4952
- package/dist/chunk-6UU7VPDO.js +0 -272
- package/dist/chunk-6YLQN7FF.js +0 -441
- package/dist/chunk-74QJDBIP.js +0 -480
- package/dist/chunk-75EBDB7G.js +0 -21
- package/dist/chunk-75EBDB7G.js.map +0 -7
- package/dist/chunk-7FXPMQRW.js +0 -34
- package/dist/chunk-A2Y3GEUH.js +0 -228
- package/dist/chunk-AAEXTQT3.js +0 -330
- package/dist/chunk-AG6HVFQY.js +0 -504
- package/dist/chunk-AG6HVFQY.js.map +0 -7
- package/dist/chunk-AHLUW2BN.js +0 -129
- package/dist/chunk-AYDXOUFX.js +0 -1275
- package/dist/chunk-AYDXOUFX.js.map +0 -7
- package/dist/chunk-BBIPZ2UF.js +0 -52
- package/dist/chunk-BBVOZ5BY.js +0 -230
- package/dist/chunk-BBVOZ5BY.js.map +0 -7
- package/dist/chunk-BHVDOW3W.js +0 -470
- package/dist/chunk-BNN32RI2.js +0 -36
- package/dist/chunk-BNN32RI2.js.map +0 -7
- package/dist/chunk-BQLC6QOH.js +0 -368
- package/dist/chunk-BQLC6QOH.js.map +0 -7
- package/dist/chunk-C5QOWZK6.js +0 -629
- package/dist/chunk-CJJ6LDZM.js +0 -170
- package/dist/chunk-CJJ6LDZM.js.map +0 -7
- package/dist/chunk-D4U5X2QQ.js +0 -261
- package/dist/chunk-D4U5X2QQ.js.map +0 -7
- package/dist/chunk-DV444SFD.js +0 -26
- package/dist/chunk-DWWAB4YQ.js +0 -102
- package/dist/chunk-FP5VKE3Z.js +0 -170
- package/dist/chunk-G2MAZI6I.js +0 -205
- package/dist/chunk-HLRNIO5K.js +0 -158
- package/dist/chunk-HTHH2B6D.js +0 -46
- package/dist/chunk-HTHH2B6D.js.map +0 -7
- package/dist/chunk-I7X6K4OL.js +0 -217
- package/dist/chunk-IC7SUXJD.js +0 -82
- package/dist/chunk-IC7SUXJD.js.map +0 -7
- package/dist/chunk-ITYEOGLB.js +0 -302
- package/dist/chunk-J6XKDYNZ.js +0 -276
- package/dist/chunk-JDX4E7ZO.js +0 -381
- package/dist/chunk-JWX7GYHP.js +0 -95
- package/dist/chunk-KISFQDQE.js +0 -258
- package/dist/chunk-KISFQDQE.js.map +0 -7
- package/dist/chunk-KLFROH3F.js +0 -203
- package/dist/chunk-KQSN7PUK.js +0 -215
- package/dist/chunk-KQSN7PUK.js.map +0 -7
- package/dist/chunk-L2ED35QZ.js +0 -2815
- package/dist/chunk-LLPFFNLV.js +0 -526
- package/dist/chunk-LLPFFNLV.js.map +0 -7
- package/dist/chunk-LRV4VWRF.js +0 -94
- package/dist/chunk-LRV4VWRF.js.map +0 -7
- package/dist/chunk-M464GTNI.js +0 -615
- package/dist/chunk-MDN3K2BG.js +0 -229
- package/dist/chunk-MDN3K2BG.js.map +0 -7
- package/dist/chunk-N46WTUX7.js +0 -286
- package/dist/chunk-N46WTUX7.js.map +0 -7
- package/dist/chunk-NBMJ2UMA.js +0 -194
- package/dist/chunk-NI7VSKJI.js +0 -293
- package/dist/chunk-NTVM4ZPG.js +0 -2784
- package/dist/chunk-O64UTRAC.js +0 -252
- package/dist/chunk-OM326NV3.js +0 -100
- package/dist/chunk-P4ENJUBN.js +0 -386
- package/dist/chunk-PEKVBCIH.js +0 -824
- package/dist/chunk-PF6MKI4X.js +0 -92
- package/dist/chunk-PJTQP6RL.js +0 -54
- package/dist/chunk-PVSRVJBE.js +0 -1201
- package/dist/chunk-PVSRVJBE.js.map +0 -7
- package/dist/chunk-PZ3L3KM6.js +0 -55
- package/dist/chunk-QEHUEG4X.js +0 -1788
- package/dist/chunk-QEHUEG4X.js.map +0 -7
- package/dist/chunk-QXCVG66S.js +0 -2672
- package/dist/chunk-RIGZHHCP.js +0 -119
- package/dist/chunk-SEIANPCX.js +0 -142
- package/dist/chunk-SK7YVOQN.js +0 -148
- package/dist/chunk-SPPZB5ZQ.js +0 -158
- package/dist/chunk-SPPZB5ZQ.js.map +0 -7
- package/dist/chunk-T5KFRIP4.js +0 -1087
- package/dist/chunk-TTSNECVD.js +0 -1413
- package/dist/chunk-TTSNECVD.js.map +0 -7
- package/dist/chunk-TVXESYIR.js +0 -439
- package/dist/chunk-TVXESYIR.js.map +0 -7
- package/dist/chunk-U3UR3U3F.js +0 -446
- package/dist/chunk-UBS5UVIY.js +0 -13624
- package/dist/chunk-UFYU7AKL.js +0 -107
- package/dist/chunk-VIYGTRUZ.js +0 -6364
- package/dist/chunk-WCTH7CB3.js +0 -31
- package/dist/chunk-WGSWVYHY.js +0 -1155
- package/dist/chunk-WGSWVYHY.js.map +0 -7
- package/dist/chunk-WYZ4COTF.js +0 -226
- package/dist/chunk-WZRXJ5LL.js +0 -2370
- package/dist/chunk-XDI4UFCZ.js +0 -467
- package/dist/chunk-XDI4UFCZ.js.map +0 -7
- package/dist/chunk-XZZLEHWC.js +0 -20328
- package/dist/chunk-XZZLEHWC.js.map +0 -7
- package/dist/chunk-Y7JAPSMG.js +0 -406
- package/dist/chunk-Y7JAPSMG.js.map +0 -7
- package/dist/chunk-YJ2HC4CP.js +0 -1150
- package/dist/chunk-ZLH4PJKX.js +0 -1658
- package/dist/chunk-ZLH4PJKX.js.map +0 -7
- package/dist/chunk-ZZSDYKD5.js +0 -14
- package/dist/condition-S52W57ZO.js +0 -330
- package/dist/controls-B4MTTPWO.js +0 -39
- package/dist/controls.config-6KBCTIPN.js +0 -37
- package/dist/correlation-VSBCBFFP.js +0 -96
- package/dist/cuminc-T5ZPAGVB.js +0 -1147
- package/dist/cuminc.integration.spec-2QT3IPHU.js +0 -676
- package/dist/customdata.inputui-5MHQQHJL.js +0 -285
- package/dist/dataDownload-S4EBNHMW.js +0 -328
- package/dist/dataDownload.integration.spec-OVSIWI34.js +0 -191
- package/dist/databrowser.ui-EAJS3NXV.js +0 -419
- package/dist/dictionary-CQHSMVYF.js +0 -98
- package/dist/dictionary-CQHSMVYF.js.map +0 -7
- package/dist/dnaMethylation-G3F2INDH.js +0 -36
- package/dist/dnaMethylation.integration.spec-FWF4353K.js +0 -179
- package/dist/dnaMethylation.integration.spec-FWF4353K.js.map +0 -7
- package/dist/e2pca-SLXGPVHP.js +0 -348
- package/dist/ep-4HGUSDGJ.js +0 -1254
- package/dist/expclust.gdc.spec-JJ42ESKE.js +0 -305
- package/dist/facet-6WVTVKDV.js +0 -519
- package/dist/geneExpClustering-5LOZPD5X.js +0 -246
- package/dist/geneExpression-BJ46UGXW.js +0 -312
- package/dist/geneExpression-PTSZWKCM.js +0 -36
- package/dist/geneExpression.unit.spec-NW5HTO7F.js +0 -100
- package/dist/geneORA-H65EZ7QO.js +0 -276
- package/dist/geneVariant-T6GWOVZD.js +0 -39
- package/dist/geneVariant-WTDFZTXG.js +0 -37
- package/dist/geneVariant.integration.spec-OPSBRUM3.js +0 -196
- package/dist/genefusion.ui-RSBCC37C.js +0 -249
- package/dist/geneset-B67PAZVL.js +0 -194
- package/dist/genomeBrowser.spec-AUTULF4C.js +0 -279
- package/dist/grin2-CMBP7XVH.js +0 -1031
- package/dist/grin2-JVCNH3KW.js +0 -1554
- package/dist/gsea-H774WVPQ.js +0 -45
- package/dist/hierCluster-IQTXQUMI.js +0 -58
- package/dist/hierCluster-ZQJDXYBD.js +0 -62
- package/dist/hierCluster.config-ZHJTZK5L.js +0 -38
- package/dist/hierCluster.integration.spec-MSJ5GHHK.js +0 -374
- package/dist/hierCluster.interactivity-H2GNO6AA.js +0 -52
- package/dist/hierCluster.renderers-2TE6HMK2.js +0 -21
- package/dist/imagePlot-FMNMB7JZ.js +0 -139
- package/dist/importPlot-N66G43XX.js +0 -8
- package/dist/isoformExpression-B64WLO3H.js +0 -38
- package/dist/isoformExpression.unit.spec-D2R6CRKO.js +0 -126
- package/dist/isoformExpression.unit.spec-D2R6CRKO.js.map +0 -7
- package/dist/jspdf.es.min-DO4YWL2R.js +0 -40
- package/dist/launch.adhoc-MPRAJ3GN.js +0 -40
- package/dist/leftlabel.sample-4JCKYXED.js +0 -257
- package/dist/lollipop-25ADHT7O.js +0 -166
- package/dist/maf-POYTGXT4.js +0 -442
- package/dist/maf-POYTGXT4.js.map +0 -7
- package/dist/maftimeline-FOQF6O3X.js +0 -591
- package/dist/matrix-LHLAYDTQ.js +0 -57
- package/dist/matrix-ZKF7NRAD.js +0 -62
- package/dist/matrix.cells-H4TS74FJ.js +0 -28
- package/dist/matrix.config-HE7QUDER.js +0 -39
- package/dist/matrix.controls-VILCLNSC.js +0 -37
- package/dist/matrix.data-2OUWYD35.js +0 -25
- package/dist/matrix.dom-IZFFS4RQ.js +0 -11
- package/dist/matrix.groups-5BGJIOOJ.js +0 -26
- package/dist/matrix.integration.spec-DSXZHAEY.js +0 -3070
- package/dist/matrix.interactivity-VK3NWX5M.js +0 -40
- package/dist/matrix.layout-PUNMMNCC.js +0 -42
- package/dist/matrix.legend-QMERGVYU.js +0 -22
- package/dist/matrix.renderers-2KQ2NXSQ.js +0 -36
- package/dist/matrix.serieses-24G3XPJD.js +0 -21
- package/dist/matrix.sort-HTVT4K7C.js +0 -27
- package/dist/matrix.sort.unit.spec-EUVL76NB.js +0 -470
- package/dist/matrix.sorterUi-PJPFXWOJ.js +0 -18
- package/dist/matrix.sorterUi.unit.spec-QWL5Y4DQ.js +0 -340
- package/dist/mavb-UGM5SHEF.js +0 -730
- package/dist/mds.fimo-64US7RTE.js +0 -516
- package/dist/mds.samplescatterplot-JMXLXVIE.js +0 -1548
- package/dist/mds.survivalplot-RJ5UD3IU.js +0 -481
- package/dist/oncomatrix-ZFT3DRAP.js +0 -293
- package/dist/oncomatrix-ZFT3DRAP.js.map +0 -7
- package/dist/oncomatrix.spec-4YLKDGFE.js +0 -446
- package/dist/plot.2dvaf-DYSU6BBN.js +0 -375
- package/dist/plot.app-NFBVLAXZ.js +0 -39
- package/dist/plot.barplot-DBGTDK7J.js +0 -100
- package/dist/plot.boxplot-MCKZUROP.js +0 -150
- package/dist/plot.brainImaging-BBAVUEB4.js +0 -51
- package/dist/plot.disco-VGOEQYRL.js +0 -101
- package/dist/plot.disco-VGOEQYRL.js.map +0 -7
- package/dist/plot.dzi-YQIFOTZQ.js +0 -33
- package/dist/plot.ssgq-MU3BRTMC.js +0 -137
- package/dist/plot.vaf2cov-KDHZ7JXJ.js +0 -257
- package/dist/plot.wsi-G2TUGQF7.js +0 -36
- package/dist/polar-RCCZXZIU.js +0 -184
- package/dist/polar2-COQ3WIGW.js +0 -226
- package/dist/profile.spec-A4ZASR2T.js +0 -78
- package/dist/profileBarchart-GB4RK5DF.js +0 -265
- package/dist/profileForms-O5KBHRF6.js +0 -438
- package/dist/profilePlot-COCLCP5B.js +0 -52
- package/dist/profileRadar-4EE3YDOH.js +0 -261
- package/dist/profileRadarFacility-JYTSGA5H.js +0 -261
- package/dist/profileRadarFacility-JYTSGA5H.js.map +0 -7
- package/dist/proteomeAbundance-JBVXUSD6.js +0 -19
- package/dist/proteomeAbundance-NQVU4DOW.js +0 -63
- package/dist/qualitative-QROOPDSI.js +0 -41
- package/dist/regression-7FQZ22OO.js +0 -54
- package/dist/regression.inputs-F62CES3A.js +0 -46
- package/dist/regression.inputs.term-BCGP7PX4.js +0 -46
- package/dist/regression.inputs.values.table-D3ZXZSH7.js +0 -43
- package/dist/regression.integration.spec-P2BBTT2O.js +0 -784
- package/dist/regression.integration.spec-P2BBTT2O.js.map +0 -7
- package/dist/regression.results-JX6RJQQP.js +0 -38
- package/dist/regression.spec-ROME7T33.js +0 -706
- package/dist/report-B6MM4T6B.js +0 -220
- package/dist/sampleScatter.spec-EPCMC3SR.js +0 -200
- package/dist/sampleView-77EAJ75T.js +0 -46
- package/dist/samplelst-CX4NQWA7.js +0 -109
- package/dist/samplematrix-PYQFAH64.js +0 -2196
- package/dist/sc-X6SI5VVI.js +0 -84
- package/dist/scatter-ZFFHAI4F.js +0 -800
- package/dist/scatter.integration.spec-NN43OXRN.js +0 -1194
- package/dist/scatter.integration.spec-NN43OXRN.js.map +0 -7
- package/dist/selectGenomeWithTklst-CZMVTBMD.js +0 -132
- package/dist/singleCellCellType-GOBX7JKV.js +0 -36
- package/dist/singleCellCellType.unit.spec-F344QMTQ.js +0 -177
- package/dist/singleCellCellType.unit.spec-F344QMTQ.js.map +0 -7
- package/dist/singleCellGeneExpression-BLMNMEAI.js +0 -36
- package/dist/singleCellGeneExpression.unit.spec-6ZEPUFWC.js +0 -163
- package/dist/singleCellGeneExpression.unit.spec-6ZEPUFWC.js.map +0 -7
- package/dist/singleCellPlot-HLD7PLQH.js +0 -51
- package/dist/singlecell-HL4GLGIA.js +0 -1570
- package/dist/singlecell-JQFPINRS.js +0 -84
- package/dist/snp-EAUNFDAV.js +0 -36
- package/dist/snp.unit.spec-AVLPMAWI.js +0 -174
- package/dist/snplocus-2J7OA6OL.js +0 -206
- package/dist/spliceevent.a53ss.diagram-4DU2U7NW.js +0 -149
- package/dist/spliceevent.exonskip.diagram-GG5FGXOK.js +0 -275
- package/dist/spliceevent.noeventdiagram-T6RNIMCM.js +0 -458
- package/dist/ssGSEA-XJWLRVFQ.js +0 -36
- package/dist/ssGSEA.unit.spec-MQ23ODYO.js +0 -86
- package/dist/summarizeCnvGeneexp-CJPC76RM.js +0 -158
- package/dist/summarizeCnvGeneexp-CJPC76RM.js.map +0 -7
- package/dist/summarizeGeneexpSurvival-FGCFZTVG.js +0 -105
- package/dist/summarizeGeneexpSurvival-FGCFZTVG.js.map +0 -7
- package/dist/summarizeMutationCnv-4E7R2NHQ.js +0 -159
- package/dist/summarizeMutationCnv-4E7R2NHQ.js.map +0 -7
- package/dist/summarizeMutationDiagnosis-ZVX7AZK7.js +0 -38
- package/dist/summarizeMutationSurvival-EWXD7TCT.js +0 -97
- package/dist/summary-VUYBKQOC.js +0 -47
- package/dist/summary.integration.spec-EPBV5XCT.js +0 -412
- package/dist/summaryInput-YX5IRGWM.js +0 -218
- package/dist/sunburst-HPDML45I.js +0 -282
- package/dist/sunburst-HPDML45I.js.map +0 -7
- package/dist/survival-E6SRRXBB.js +0 -44
- package/dist/survival-XOXDPXZR.js +0 -56
- package/dist/survival.integration.spec-SJBPJZGJ.js +0 -787
- package/dist/survival.integration.spec-SJBPJZGJ.js.map +0 -7
- package/dist/svg2pdf.es.min-EZ4UYRSH.js +0 -3157
- package/dist/svgraph-D23WG3UE.js +0 -1385
- package/dist/svmr-UFC4TKWV.js +0 -3840
- package/dist/table-US2K6IYZ.js +0 -198
- package/dist/termCollection-E7S57CIN.js +0 -177
- package/dist/termCollection-ZMP3VE2G.js +0 -36
- package/dist/termCollection.unit.spec-MDWK6XH3.js +0 -206
- package/dist/tk-TLQJK6R4.js +0 -44
- package/dist/tp.ui-NQEAKWUH.js +0 -1457
- package/dist/tvs.dt-U2MINIBH.js +0 -37
- package/dist/tvs.dtcnv.categorical-2OOAZJKC.js +0 -38
- package/dist/tvs.dtcnv.continuous-5ETKBJ52.js +0 -70
- package/dist/tvs.dtfusion-EB4PPR3Y.js +0 -38
- package/dist/tvs.dtsnvindel-IRQPTKQF.js +0 -38
- package/dist/tvs.dtsv-TOVXZJCR.js +0 -38
- package/dist/tvs.samplelst-4SCH543Y.js +0 -102
- package/dist/tvs.termCollection-GGN5F6HC.js +0 -151
- package/dist/violin-7D7DN74I.js +0 -44
- package/dist/violin.integration.spec-KE76AL54.js +0 -1417
- package/dist/violin.integration.spec-KE76AL54.js.map +0 -7
- package/dist/violin.interactivity-YPJ2H6SQ.js +0 -36
- package/dist/violin.renderer-UK7WSA2Z.js +0 -38
- package/dist/vocabulary-KLWZ6LRP.js +0 -39
- /package/dist/{2dmaf-PFPBHIUI.js.map → 2dmaf-YHYYSSKR.js.map} +0 -0
- /package/dist/{AppHeader-FCWML6WH.js.map → AppHeader-T4ZLY3VG.js.map} +0 -0
- /package/dist/{CorrelationVolcano-ZJ7Q6JBC.js.map → CorrelationVolcano-EXH4P56S.js.map} +0 -0
- /package/dist/{DifferentialAnalysis-PWCFCWFY.js.map → DifferentialAnalysis-P6GKHAS5.js.map} +0 -0
- /package/dist/{Disco.UI-SR7LSJE3.js.map → Disco.UI-4A2P5Q55.js.map} +0 -0
- /package/dist/{DmrPlot-UDY7GOSY.js.map → DmrPlot-6EEEGD32.js.map} +0 -0
- /package/dist/{GB-GNTOP5C6.js.map → GB-XFO5I6ND.js.map} +0 -0
- /package/dist/{HicApp-FZTJL3OA.js.map → HicApp-3LFHOOAR.js.map} +0 -0
- /package/dist/{NumBinaryEditor.unit.spec-BMVRI24W.js.map → NumBinaryEditor.unit.spec-2PYZ7P2R.js.map} +0 -0
- /package/dist/{NumContEditor-6JT5D6IW.js.map → NumContEditor-BMWALLQM.js.map} +0 -0
- /package/dist/{NumContEditor.unit.spec-XBQF2SW6.js.map → NumContEditor.unit.spec-ETVLVX6A.js.map} +0 -0
- /package/dist/{NumCustomBinEditor-MEKEFOQI.js.map → NumCustomBinEditor-2XJ6GUWY.js.map} +0 -0
- /package/dist/{NumCustomBinEditor.unit.spec-LEMQJHDT.js.map → NumCustomBinEditor.unit.spec-TZVL553E.js.map} +0 -0
- /package/dist/{NumDiscreteEditor.unit.spec-WQM4DLKO.js.map → NumDiscreteEditor.unit.spec-KQND2XAE.js.map} +0 -0
- /package/dist/{NumRegularBinEditor-HQR5Y6P7.js.map → NumRegularBinEditor-OYELFDIB.js.map} +0 -0
- /package/dist/{NumRegularBinEditor.unit.spec-FL4IFT7L.js.map → NumRegularBinEditor.unit.spec-44SALKLH.js.map} +0 -0
- /package/dist/{NumSplineEditor.unit.spec-HYOXO45B.js.map → NumSplineEditor.unit.spec-XKB4XXU4.js.map} +0 -0
- /package/dist/{NumericDensity-GJZ4BBJS.js.map → NumericDensity-GCNWO7YS.js.map} +0 -0
- /package/dist/{NumericDensity.unit.spec-6LXWAXW7.js.map → NumericDensity.unit.spec-7LWNOUYK.js.map} +0 -0
- /package/dist/{NumericHandler-LZIMPOHS.js.map → NumericHandler-EMQBI5UI.js.map} +0 -0
- /package/dist/{NumericHandler.unit.spec-ZSU35AMD.js.map → NumericHandler.unit.spec-TEELPRIM.js.map} +0 -0
- /package/dist/{WsiSamplesPlot-BL47MDHQ.js.map → WsiSamplesPlot-B2DM7Z3Q.js.map} +0 -0
- /package/dist/{adSandbox-V3NTKVBC.js.map → adSandbox-INF3NNEV.js.map} +0 -0
- /package/dist/{alphaGenome-IQVFCSWQ.js.map → alphaGenome-CO4TQHXN.js.map} +0 -0
- /package/dist/{app-GJLZ2G2U.js.map → app-63JU2YIT.js.map} +0 -0
- /package/dist/{app-YSD2U64Q.js.map → app-BL3POUOO.js.map} +0 -0
- /package/dist/{barchart-GLLUYTAJ.js.map → barchart-PDUXZAIH.js.map} +0 -0
- /package/dist/{barchart.data-FRYRGKH3.js.map → barchart.data-EXENRVMU.js.map} +0 -0
- /package/dist/{barchart.events-WODVSHRN.js.map → barchart.events-MQNQTSWI.js.map} +0 -0
- /package/dist/{barchart.integration.spec-6POS3V3T.js.map → barchart.integration.spec-DSO2377T.js.map} +0 -0
- /package/dist/{bars.renderer-T5R3UIBW.js.map → bars.renderer-S7A7I6BQ.js.map} +0 -0
- /package/dist/{block.init-7HDLKQVX.js.map → block.init-7J5OHYKA.js.map} +0 -0
- /package/dist/{block.mds.expressionrank-UIB25S6E.js.map → block.mds.expressionrank-643H7PN7.js.map} +0 -0
- /package/dist/{block.mds.geneboxplot-4PQYO3MR.js.map → block.mds.geneboxplot-C222ODSL.js.map} +0 -0
- /package/dist/{block.mds.junction-DWFYZEC2.js.map → block.mds.junction-C5DJRUOK.js.map} +0 -0
- /package/dist/{block.mds.svcnv-N3KJJ4GQ.js.map → block.mds.svcnv-4G74JQ7Y.js.map} +0 -0
- /package/dist/{block.svg-2HBDI7BT.js.map → block.svg-35KUC5R7.js.map} +0 -0
- /package/dist/{block.tk.aicheck-2M4522IQ.js.map → block.tk.aicheck-LLWT6K6H.js.map} +0 -0
- /package/dist/{block.tk.ase-URIKF6JD.js.map → block.tk.ase-PQUKY65E.js.map} +0 -0
- /package/dist/{block.tk.bam-HTDMASHX.js.map → block.tk.bam-EUEOB7BR.js.map} +0 -0
- /package/dist/{block.tk.bedgraphdot-RVKMSFCQ.js.map → block.tk.bedgraphdot-XAHUY545.js.map} +0 -0
- /package/dist/{block.tk.bigwig.ui-7JPEOIKM.js.map → block.tk.bigwig.ui-HEOPNL3T.js.map} +0 -0
- /package/dist/{block.tk.hicstraw-72J7UJ2J.js.map → block.tk.hicstraw-EPH3LEX2.js.map} +0 -0
- /package/dist/{block.tk.junction-GGFMBCV5.js.map → block.tk.junction-MIUDAIAR.js.map} +0 -0
- /package/dist/{block.tk.junction.textmatrixui-44SAYYWE.js.map → block.tk.junction.textmatrixui-AVFUQBDS.js.map} +0 -0
- /package/dist/{block.tk.ld-XDKJFEOL.js.map → block.tk.ld-ED7YMBQ4.js.map} +0 -0
- /package/dist/{block.tk.menu-46FOTM7H.js.map → block.tk.menu-3CVIECWQ.js.map} +0 -0
- /package/dist/{block.tk.pgv-ZVONRT4B.js.map → block.tk.pgv-HETJVWXH.js.map} +0 -0
- /package/dist/{brainImaging-CSLO7ODJ.js.map → brainImaging-K3LHK3DD.js.map} +0 -0
- /package/dist/{chat-GMD22F3K.js.map → chat-BYX5ARUK.js.map} +0 -0
- /package/dist/{chunk-WCTH7CB3.js.map → chunk-2LULD7RN.js.map} +0 -0
- /package/dist/{chunk-DWWAB4YQ.js.map → chunk-2VFYZ3EY.js.map} +0 -0
- /package/dist/{chunk-5ZICCKEH.js.map → chunk-3CD5ZROA.js.map} +0 -0
- /package/dist/{chunk-JDX4E7ZO.js.map → chunk-3DCABJHB.js.map} +0 -0
- /package/dist/{chunk-JWX7GYHP.js.map → chunk-3MMKHYUM.js.map} +0 -0
- /package/dist/{chunk-PZ3L3KM6.js.map → chunk-3PRPMJTG.js.map} +0 -0
- /package/dist/{chunk-4FO7KZY2.js.map → chunk-5UMPBVA6.js.map} +0 -0
- /package/dist/{chunk-UBS5UVIY.js.map → chunk-6LAE5AVA.js.map} +0 -0
- /package/dist/{chunk-PEKVBCIH.js.map → chunk-7FTDQDVF.js.map} +0 -0
- /package/dist/{chunk-SEIANPCX.js.map → chunk-7IEZ2KMW.js.map} +0 -0
- /package/dist/{chunk-ZZSDYKD5.js.map → chunk-A5AFIW2T.js.map} +0 -0
- /package/dist/{chunk-NTVM4ZPG.js.map → chunk-AIBODF32.js.map} +0 -0
- /package/dist/{chunk-WYZ4COTF.js.map → chunk-BAY47D5E.js.map} +0 -0
- /package/dist/{chunk-DV444SFD.js.map → chunk-CFHKYLDY.js.map} +0 -0
- /package/dist/{chunk-NI7VSKJI.js.map → chunk-CJZN7HFL.js.map} +0 -0
- /package/dist/{chunk-FP5VKE3Z.js.map → chunk-D4QFQQWJ.js.map} +0 -0
- /package/dist/{chunk-U3UR3U3F.js.map → chunk-DNCSPTOQ.js.map} +0 -0
- /package/dist/{chunk-OM326NV3.js.map → chunk-DQGSCCI3.js.map} +0 -0
- /package/dist/{chunk-7FXPMQRW.js.map → chunk-EWGMLVC7.js.map} +0 -0
- /package/dist/{chunk-SK7YVOQN.js.map → chunk-F7PB5HGT.js.map} +0 -0
- /package/dist/{chunk-PF6MKI4X.js.map → chunk-G7QKLA54.js.map} +0 -0
- /package/dist/{chunk-74QJDBIP.js.map → chunk-J5RINDKS.js.map} +0 -0
- /package/dist/{chunk-BBIPZ2UF.js.map → chunk-JMPSZMDD.js.map} +0 -0
- /package/dist/{chunk-2TIYJ3PH.js.map → chunk-KQMEJUWI.js.map} +0 -0
- /package/dist/{chunk-6YLQN7FF.js.map → chunk-LRMV5DNW.js.map} +0 -0
- /package/dist/{chunk-PJTQP6RL.js.map → chunk-LWNOC7AJ.js.map} +0 -0
- /package/dist/{chunk-AHLUW2BN.js.map → chunk-MICNOSX7.js.map} +0 -0
- /package/dist/{chunk-6UU7VPDO.js.map → chunk-MLWNMXAV.js.map} +0 -0
- /package/dist/{chunk-HLRNIO5K.js.map → chunk-MMBLSLQR.js.map} +0 -0
- /package/dist/{chunk-YJ2HC4CP.js.map → chunk-NV5XWADG.js.map} +0 -0
- /package/dist/{chunk-T5KFRIP4.js.map → chunk-O3255WPP.js.map} +0 -0
- /package/dist/{chunk-J6XKDYNZ.js.map → chunk-OSM7YS23.js.map} +0 -0
- /package/dist/{chunk-UFYU7AKL.js.map → chunk-Q7PYFSNU.js.map} +0 -0
- /package/dist/{chunk-P4ENJUBN.js.map → chunk-QMI222IJ.js.map} +0 -0
- /package/dist/{chunk-O64UTRAC.js.map → chunk-QRIRWDIW.js.map} +0 -0
- /package/dist/{chunk-C5QOWZK6.js.map → chunk-SJTOSA7E.js.map} +0 -0
- /package/dist/{chunk-M464GTNI.js.map → chunk-SRYFYAXK.js.map} +0 -0
- /package/dist/{chunk-A2Y3GEUH.js.map → chunk-TITA4HJA.js.map} +0 -0
- /package/dist/{chunk-L2ED35QZ.js.map → chunk-U7ZMIMI5.js.map} +0 -0
- /package/dist/{chunk-RIGZHHCP.js.map → chunk-UJU3Q7QJ.js.map} +0 -0
- /package/dist/{chunk-QXCVG66S.js.map → chunk-UL2ISTHR.js.map} +0 -0
- /package/dist/{chunk-I7X6K4OL.js.map → chunk-VIPMLSZP.js.map} +0 -0
- /package/dist/{chunk-AAEXTQT3.js.map → chunk-WGL6FIUE.js.map} +0 -0
- /package/dist/{chunk-ITYEOGLB.js.map → chunk-WIYKAKWE.js.map} +0 -0
- /package/dist/{chunk-NBMJ2UMA.js.map → chunk-WPHOEG56.js.map} +0 -0
- /package/dist/{chunk-G2MAZI6I.js.map → chunk-XS4QWRS3.js.map} +0 -0
- /package/dist/{chunk-VIYGTRUZ.js.map → chunk-YSW57QDM.js.map} +0 -0
- /package/dist/{chunk-KLFROH3F.js.map → chunk-YXQNZPCO.js.map} +0 -0
- /package/dist/{chunk-WZRXJ5LL.js.map → chunk-YYYJB53A.js.map} +0 -0
- /package/dist/{chunk-BHVDOW3W.js.map → chunk-ZTKQLABY.js.map} +0 -0
- /package/dist/{condition-S52W57ZO.js.map → condition-AM523RDR.js.map} +0 -0
- /package/dist/{controls-B4MTTPWO.js.map → controls-HTMH5QBP.js.map} +0 -0
- /package/dist/{controls.config-6KBCTIPN.js.map → controls.config-EEK2RBPI.js.map} +0 -0
- /package/dist/{correlation-VSBCBFFP.js.map → correlation-HKD67SPS.js.map} +0 -0
- /package/dist/{cuminc-T5ZPAGVB.js.map → cuminc-66V55MMN.js.map} +0 -0
- /package/dist/{cuminc.integration.spec-2QT3IPHU.js.map → cuminc.integration.spec-PNTOPB2L.js.map} +0 -0
- /package/dist/{customdata.inputui-5MHQQHJL.js.map → customdata.inputui-Z4WQDU6I.js.map} +0 -0
- /package/dist/{dataDownload-S4EBNHMW.js.map → dataDownload-3ZEI22OK.js.map} +0 -0
- /package/dist/{dataDownload.integration.spec-OVSIWI34.js.map → dataDownload.integration.spec-C3JRC6K5.js.map} +0 -0
- /package/dist/{databrowser.ui-EAJS3NXV.js.map → databrowser.ui-Q365SHBG.js.map} +0 -0
- /package/dist/{dnaMethylation-G3F2INDH.js.map → dnaMethylation-IFZWWBUG.js.map} +0 -0
- /package/dist/{e2pca-SLXGPVHP.js.map → e2pca-I3QXF7EM.js.map} +0 -0
- /package/dist/{ep-4HGUSDGJ.js.map → ep-2VCQ36GT.js.map} +0 -0
- /package/dist/{expclust.gdc.spec-JJ42ESKE.js.map → expclust.gdc.spec-VWIQFY67.js.map} +0 -0
- /package/dist/{facet-6WVTVKDV.js.map → facet-CHP3VUWS.js.map} +0 -0
- /package/dist/{geneExpClustering-5LOZPD5X.js.map → geneExpClustering-YDIDEH2O.js.map} +0 -0
- /package/dist/{geneExpression-PTSZWKCM.js.map → geneExpression-FA5RJRHZ.js.map} +0 -0
- /package/dist/{geneExpression-BJ46UGXW.js.map → geneExpression-X2KXJPND.js.map} +0 -0
- /package/dist/{geneExpression.unit.spec-NW5HTO7F.js.map → geneExpression.unit.spec-3LVHYZGG.js.map} +0 -0
- /package/dist/{geneORA-H65EZ7QO.js.map → geneORA-4CAYRKSN.js.map} +0 -0
- /package/dist/{geneVariant-T6GWOVZD.js.map → geneVariant-OCOTNUH4.js.map} +0 -0
- /package/dist/{geneVariant-WTDFZTXG.js.map → geneVariant-Y4L5W5HF.js.map} +0 -0
- /package/dist/{geneVariant.integration.spec-OPSBRUM3.js.map → geneVariant.integration.spec-BOJ5MM5K.js.map} +0 -0
- /package/dist/{genefusion.ui-RSBCC37C.js.map → genefusion.ui-I6HZOBIV.js.map} +0 -0
- /package/dist/{geneset-B67PAZVL.js.map → geneset-GEWKDAAT.js.map} +0 -0
- /package/dist/{genomeBrowser.spec-AUTULF4C.js.map → genomeBrowser.spec-FDEGH4DY.js.map} +0 -0
- /package/dist/{grin2-CMBP7XVH.js.map → grin2-K56B6XBZ.js.map} +0 -0
- /package/dist/{grin2-JVCNH3KW.js.map → grin2-V6FMM44N.js.map} +0 -0
- /package/dist/{gsea-H774WVPQ.js.map → gsea-UNPPRU2U.js.map} +0 -0
- /package/dist/{hierCluster-IQTXQUMI.js.map → hierCluster-DXAWRQNI.js.map} +0 -0
- /package/dist/{hierCluster-ZQJDXYBD.js.map → hierCluster-SPIQA2M2.js.map} +0 -0
- /package/dist/{hierCluster.config-ZHJTZK5L.js.map → hierCluster.config-JW6D3T3Q.js.map} +0 -0
- /package/dist/{hierCluster.integration.spec-MSJ5GHHK.js.map → hierCluster.integration.spec-5NXZY4LG.js.map} +0 -0
- /package/dist/{hierCluster.interactivity-H2GNO6AA.js.map → hierCluster.interactivity-CPPBXHM7.js.map} +0 -0
- /package/dist/{hierCluster.renderers-2TE6HMK2.js.map → hierCluster.renderers-A6MEGO2B.js.map} +0 -0
- /package/dist/{imagePlot-FMNMB7JZ.js.map → imagePlot-QLAHCULW.js.map} +0 -0
- /package/dist/{importPlot-N66G43XX.js.map → importPlot-6ITZ6U7G.js.map} +0 -0
- /package/dist/{isoformExpression-B64WLO3H.js.map → isoformExpression-7GAUF2QV.js.map} +0 -0
- /package/dist/{jspdf.es.min-DO4YWL2R.js.map → jspdf.es.min-FC3BCETM.js.map} +0 -0
- /package/dist/{launch.adhoc-MPRAJ3GN.js.map → launch.adhoc-HFHBAUR6.js.map} +0 -0
- /package/dist/{leftlabel.sample-4JCKYXED.js.map → leftlabel.sample-CWPJUCHR.js.map} +0 -0
- /package/dist/{lollipop-25ADHT7O.js.map → lollipop-QFRQLEER.js.map} +0 -0
- /package/dist/{maftimeline-FOQF6O3X.js.map → maftimeline-2DFIF4C4.js.map} +0 -0
- /package/dist/{matrix-LHLAYDTQ.js.map → matrix-3HFB5TUU.js.map} +0 -0
- /package/dist/{matrix-ZKF7NRAD.js.map → matrix-MIXK27AD.js.map} +0 -0
- /package/dist/{matrix.cells-H4TS74FJ.js.map → matrix.cells-U7AQNEBP.js.map} +0 -0
- /package/dist/{matrix.config-HE7QUDER.js.map → matrix.config-FX5MHX6O.js.map} +0 -0
- /package/dist/{matrix.controls-VILCLNSC.js.map → matrix.controls-5K7BB5Z4.js.map} +0 -0
- /package/dist/{matrix.data-2OUWYD35.js.map → matrix.data-EEIY6AO4.js.map} +0 -0
- /package/dist/{matrix.dom-IZFFS4RQ.js.map → matrix.dom-6QL3AJMW.js.map} +0 -0
- /package/dist/{matrix.groups-5BGJIOOJ.js.map → matrix.groups-CUB6UWC5.js.map} +0 -0
- /package/dist/{matrix.integration.spec-DSXZHAEY.js.map → matrix.integration.spec-ML4T7FRG.js.map} +0 -0
- /package/dist/{matrix.interactivity-VK3NWX5M.js.map → matrix.interactivity-QMPWX63Q.js.map} +0 -0
- /package/dist/{matrix.layout-PUNMMNCC.js.map → matrix.layout-7SEF6MYI.js.map} +0 -0
- /package/dist/{matrix.legend-QMERGVYU.js.map → matrix.legend-42LQGAGX.js.map} +0 -0
- /package/dist/{matrix.renderers-2KQ2NXSQ.js.map → matrix.renderers-ZF7LLER3.js.map} +0 -0
- /package/dist/{matrix.serieses-24G3XPJD.js.map → matrix.serieses-4B2WB526.js.map} +0 -0
- /package/dist/{matrix.sort-HTVT4K7C.js.map → matrix.sort-BJACNR7G.js.map} +0 -0
- /package/dist/{matrix.sort.unit.spec-EUVL76NB.js.map → matrix.sort.unit.spec-ZGSM7HDJ.js.map} +0 -0
- /package/dist/{matrix.sorterUi-PJPFXWOJ.js.map → matrix.sorterUi-W6XFYZY2.js.map} +0 -0
- /package/dist/{matrix.sorterUi.unit.spec-QWL5Y4DQ.js.map → matrix.sorterUi.unit.spec-V34ZZD7A.js.map} +0 -0
- /package/dist/{mavb-UGM5SHEF.js.map → mavb-NVQVFU6E.js.map} +0 -0
- /package/dist/{mds.fimo-64US7RTE.js.map → mds.fimo-HOCF6U6K.js.map} +0 -0
- /package/dist/{mds.samplescatterplot-JMXLXVIE.js.map → mds.samplescatterplot-ULD5BK5R.js.map} +0 -0
- /package/dist/{mds.survivalplot-RJ5UD3IU.js.map → mds.survivalplot-5US32RQD.js.map} +0 -0
- /package/dist/{oncomatrix.spec-4YLKDGFE.js.map → oncomatrix.spec-MFUJLWEP.js.map} +0 -0
- /package/dist/{plot.2dvaf-DYSU6BBN.js.map → plot.2dvaf-F4WZ4YPU.js.map} +0 -0
- /package/dist/{plot.app-NFBVLAXZ.js.map → plot.app-YFFLLBU5.js.map} +0 -0
- /package/dist/{plot.barplot-DBGTDK7J.js.map → plot.barplot-2EJ2MWQD.js.map} +0 -0
- /package/dist/{plot.boxplot-MCKZUROP.js.map → plot.boxplot-AKZM443E.js.map} +0 -0
- /package/dist/{plot.brainImaging-BBAVUEB4.js.map → plot.brainImaging-DR6WJNFZ.js.map} +0 -0
- /package/dist/{plot.dzi-YQIFOTZQ.js.map → plot.dzi-R2MR7HAT.js.map} +0 -0
- /package/dist/{plot.ssgq-MU3BRTMC.js.map → plot.ssgq-C52YIUFY.js.map} +0 -0
- /package/dist/{plot.vaf2cov-KDHZ7JXJ.js.map → plot.vaf2cov-FOD3K7BC.js.map} +0 -0
- /package/dist/{plot.wsi-G2TUGQF7.js.map → plot.wsi-D2TXYERK.js.map} +0 -0
- /package/dist/{polar-RCCZXZIU.js.map → polar-2LC35O6K.js.map} +0 -0
- /package/dist/{polar2-COQ3WIGW.js.map → polar2-QPUOEUJZ.js.map} +0 -0
- /package/dist/{profile.spec-A4ZASR2T.js.map → profile.spec-3NCDGHLX.js.map} +0 -0
- /package/dist/{profileBarchart-GB4RK5DF.js.map → profileBarchart-PPQ3NL4D.js.map} +0 -0
- /package/dist/{profileForms-O5KBHRF6.js.map → profileForms-GS3VVW65.js.map} +0 -0
- /package/dist/{profilePlot-COCLCP5B.js.map → profilePlot-DQWFH5NC.js.map} +0 -0
- /package/dist/{profileRadar-4EE3YDOH.js.map → profileRadar-KAKRDC4R.js.map} +0 -0
- /package/dist/{proteomeAbundance-JBVXUSD6.js.map → proteomeAbundance-DE4NVBCN.js.map} +0 -0
- /package/dist/{proteomeAbundance-NQVU4DOW.js.map → proteomeAbundance-LTB3QR3G.js.map} +0 -0
- /package/dist/{qualitative-QROOPDSI.js.map → qualitative-YOFAROVR.js.map} +0 -0
- /package/dist/{regression-7FQZ22OO.js.map → regression-PF6IAHJK.js.map} +0 -0
- /package/dist/{regression.inputs-F62CES3A.js.map → regression.inputs-77IUYED3.js.map} +0 -0
- /package/dist/{regression.inputs.term-BCGP7PX4.js.map → regression.inputs.term-WWCHU6KF.js.map} +0 -0
- /package/dist/{regression.inputs.values.table-D3ZXZSH7.js.map → regression.inputs.values.table-I6GM6MU7.js.map} +0 -0
- /package/dist/{regression.results-JX6RJQQP.js.map → regression.results-6GXNKYUS.js.map} +0 -0
- /package/dist/{regression.spec-ROME7T33.js.map → regression.spec-MEFQNY34.js.map} +0 -0
- /package/dist/{report-B6MM4T6B.js.map → report-LG3UKZHL.js.map} +0 -0
- /package/dist/{sampleScatter.spec-EPCMC3SR.js.map → sampleScatter.spec-D3IK7MSA.js.map} +0 -0
- /package/dist/{sampleView-77EAJ75T.js.map → sampleView-XUI2J5EC.js.map} +0 -0
- /package/dist/{samplelst-CX4NQWA7.js.map → samplelst-A7IHCBAX.js.map} +0 -0
- /package/dist/{samplematrix-PYQFAH64.js.map → samplematrix-VGUU7Q75.js.map} +0 -0
- /package/dist/{sc-X6SI5VVI.js.map → sc-UVKVT2RY.js.map} +0 -0
- /package/dist/{scatter-ZFFHAI4F.js.map → scatter-UILUYOGO.js.map} +0 -0
- /package/dist/{selectGenomeWithTklst-CZMVTBMD.js.map → selectGenomeWithTklst-LWKIMZEJ.js.map} +0 -0
- /package/dist/{singleCellCellType-GOBX7JKV.js.map → singleCellCellType-TI52WQQ4.js.map} +0 -0
- /package/dist/{singleCellGeneExpression-BLMNMEAI.js.map → singleCellGeneExpression-I5SAHMGI.js.map} +0 -0
- /package/dist/{singleCellPlot-HLD7PLQH.js.map → singleCellPlot-HRWCHYCI.js.map} +0 -0
- /package/dist/{singlecell-HL4GLGIA.js.map → singlecell-BHPP7KCO.js.map} +0 -0
- /package/dist/{singlecell-JQFPINRS.js.map → singlecell-PQNKBKR7.js.map} +0 -0
- /package/dist/{snp-EAUNFDAV.js.map → snp-V4YGI7B3.js.map} +0 -0
- /package/dist/{snp.unit.spec-AVLPMAWI.js.map → snp.unit.spec-JSUCMGNP.js.map} +0 -0
- /package/dist/{snplocus-2J7OA6OL.js.map → snplocus-3YT5NNCH.js.map} +0 -0
- /package/dist/{spliceevent.a53ss.diagram-4DU2U7NW.js.map → spliceevent.a53ss.diagram-QEQJ44YH.js.map} +0 -0
- /package/dist/{spliceevent.exonskip.diagram-GG5FGXOK.js.map → spliceevent.exonskip.diagram-HMWVSOJG.js.map} +0 -0
- /package/dist/{spliceevent.noeventdiagram-T6RNIMCM.js.map → spliceevent.noeventdiagram-L5HUCT5A.js.map} +0 -0
- /package/dist/{ssGSEA-XJWLRVFQ.js.map → ssGSEA-Z3XRCBYW.js.map} +0 -0
- /package/dist/{ssGSEA.unit.spec-MQ23ODYO.js.map → ssGSEA.unit.spec-EUCTV2XJ.js.map} +0 -0
- /package/dist/{summarizeMutationDiagnosis-ZVX7AZK7.js.map → summarizeMutationDiagnosis-HFFYLQOF.js.map} +0 -0
- /package/dist/{summarizeMutationSurvival-EWXD7TCT.js.map → summarizeMutationSurvival-OBK6YILP.js.map} +0 -0
- /package/dist/{summary-VUYBKQOC.js.map → summary-W55WWIU2.js.map} +0 -0
- /package/dist/{summary.integration.spec-EPBV5XCT.js.map → summary.integration.spec-X2PNAUKW.js.map} +0 -0
- /package/dist/{summaryInput-YX5IRGWM.js.map → summaryInput-X547Q6C7.js.map} +0 -0
- /package/dist/{survival-XOXDPXZR.js.map → survival-PAJZHZPD.js.map} +0 -0
- /package/dist/{survival-E6SRRXBB.js.map → survival-TQPWMOD5.js.map} +0 -0
- /package/dist/{svg2pdf.es.min-EZ4UYRSH.js.map → svg2pdf.es.min-CYTPRWNB.js.map} +0 -0
- /package/dist/{svgraph-D23WG3UE.js.map → svgraph-Y35C2M3D.js.map} +0 -0
- /package/dist/{svmr-UFC4TKWV.js.map → svmr-WGCIR7PE.js.map} +0 -0
- /package/dist/{table-US2K6IYZ.js.map → table-Q3B2YXEN.js.map} +0 -0
- /package/dist/{termCollection-E7S57CIN.js.map → termCollection-A6YTSM5I.js.map} +0 -0
- /package/dist/{termCollection-ZMP3VE2G.js.map → termCollection-NTFNVQ7D.js.map} +0 -0
- /package/dist/{termCollection.unit.spec-MDWK6XH3.js.map → termCollection.unit.spec-BX54PHKT.js.map} +0 -0
- /package/dist/{tk-TLQJK6R4.js.map → tk-OCBZ7YR6.js.map} +0 -0
- /package/dist/{tp.ui-NQEAKWUH.js.map → tp.ui-ZT47N2CO.js.map} +0 -0
- /package/dist/{tvs.dt-U2MINIBH.js.map → tvs.dt-BFB253O3.js.map} +0 -0
- /package/dist/{tvs.dtcnv.categorical-2OOAZJKC.js.map → tvs.dtcnv.categorical-ARGAYIDO.js.map} +0 -0
- /package/dist/{tvs.dtcnv.continuous-5ETKBJ52.js.map → tvs.dtcnv.continuous-JCU23ERV.js.map} +0 -0
- /package/dist/{tvs.dtfusion-EB4PPR3Y.js.map → tvs.dtfusion-FV64XLZI.js.map} +0 -0
- /package/dist/{tvs.dtsnvindel-IRQPTKQF.js.map → tvs.dtsnvindel-DMOXMEVL.js.map} +0 -0
- /package/dist/{tvs.dtsv-TOVXZJCR.js.map → tvs.dtsv-53FSZEPV.js.map} +0 -0
- /package/dist/{tvs.samplelst-4SCH543Y.js.map → tvs.samplelst-MVPL6VXX.js.map} +0 -0
- /package/dist/{tvs.termCollection-GGN5F6HC.js.map → tvs.termCollection-UGJXTHTG.js.map} +0 -0
- /package/dist/{violin-7D7DN74I.js.map → violin-ZLUDGSQG.js.map} +0 -0
- /package/dist/{violin.interactivity-YPJ2H6SQ.js.map → violin.interactivity-ULDOCZWW.js.map} +0 -0
- /package/dist/{violin.renderer-UK7WSA2Z.js.map → violin.renderer-KJAXPMIK.js.map} +0 -0
- /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(` | ${labels.join(' | ')}`)\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(' ⓘ')\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()} – ${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
|
+
}
|