@sjcrh/proteinpaint-client 2.201.0 → 2.202.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/2dmaf-Y2MBOXHL.js +1373 -0
- package/dist/AIProjectAdmin-2W4WNV65.js +958 -0
- package/dist/AggregateMatrix-7L7OKUXI.js +671 -0
- package/dist/AppHeader-6WM66GKP.js +835 -0
- package/dist/BoxPlot-AF72DMSS.js +1218 -0
- package/dist/CorrelationVolcano-H6DHMTYZ.js +620 -0
- package/dist/CorrelationVolcano-H6DHMTYZ.js.map +7 -0
- package/dist/DE-AABMOSEE.js +95 -0
- package/dist/DEinput-3HVHJE2I.js +409 -0
- package/dist/DEinput-3HVHJE2I.js.map +7 -0
- package/dist/DifferentialAnalysis-NBC222Q6.js +243 -0
- package/dist/Disco-B6E3ALAV.js +3392 -0
- package/dist/Disco.UI-KGFIQHXC.js +248 -0
- package/dist/DmrPlot-R3S4PCAE.js +642 -0
- package/dist/DziViewer-QYLZ4EMQ.js +16332 -0
- package/dist/GB-PV4RI5DG.js +1396 -0
- package/dist/GSEA-DHUOROST.js +846 -0
- package/dist/GeneExpInput-RESMBEM3.js +367 -0
- package/dist/Geomap-2WACSP77.js +89 -0
- package/dist/HicApp-3FJEZXAI.js +2250 -0
- package/dist/IDCViewer-MIRQEK4N.js +10817 -0
- package/dist/NumBinaryEditor-EP277U4I.js +284 -0
- package/dist/NumBinaryEditor.unit.spec-ZB627VLG.js +317 -0
- package/dist/NumContEditor-F7DOQSIW.js +110 -0
- package/dist/NumContEditor.unit.spec-PROGQHTU.js +169 -0
- package/dist/NumCustomBinEditor-QS3IPKIQ.js +38 -0
- package/dist/NumCustomBinEditor.unit.spec-BRDEFIX6.js +402 -0
- package/dist/NumDiscreteEditor-SE4I3BDA.js +175 -0
- package/dist/NumDiscreteEditor.unit.spec-6GBWQ3NQ.js +238 -0
- package/dist/NumRegularBinEditor-RJKB3G3V.js +38 -0
- package/dist/NumRegularBinEditor.unit.spec-HRU2Y76X.js +283 -0
- package/dist/NumSplineEditor-2DCORF5E.js +215 -0
- package/dist/NumSplineEditor.unit.spec-TTNB5IXX.js +229 -0
- package/dist/NumericDensity-3A7KTA7Y.js +38 -0
- package/dist/NumericDensity.unit.spec-ISPDAUVX.js +423 -0
- package/dist/NumericHandler-RG5XZMBU.js +39 -0
- package/dist/NumericHandler.unit.spec-RTD7AZNE.js +219 -0
- package/dist/ProteomeInput-6A7UB4CI.js +394 -0
- package/dist/RunChart2-YEAOBR2L.js +758 -0
- package/dist/SC-C3MJQBI5.js +1112 -0
- package/dist/Volcano-N6MXAQDZ.js +1417 -0
- package/dist/Volcano-N6MXAQDZ.js.map +7 -0
- package/dist/WSIViewer-OVJ2QS7P.js +26200 -0
- package/dist/WSIViewer-OVJ2QS7P.js.map +7 -0
- package/dist/Wsi-CMLKCEG3.js +239 -0
- package/dist/Wsi-CMLKCEG3.js.map +7 -0
- package/dist/WsiSamplesPlot-ET7LGNJW.js +165 -0
- package/dist/adSandbox-6LGHUXPX.js +38 -0
- package/dist/animatedBubbleChart-VJ6EQDQP.js +553 -0
- package/dist/app-PRLLUIAA.js +49 -0
- package/dist/app-WR6PQ2YK.js +37 -0
- package/dist/app.js +13 -13
- package/dist/bam-EXBXKUSE.js +859 -0
- package/dist/barchart-FSIB3IZZ.js +47 -0
- package/dist/barchart.events-F4HSVH6M.js +47 -0
- package/dist/barchart.integration.spec-AXE7BRKX.js +2243 -0
- package/dist/barchart2-DRNQQJE2.js +314 -0
- package/dist/block-J3A3RIGS.js +6255 -0
- package/dist/block.init-MQKMDKKW.js +38 -0
- package/dist/block.mds.expressionrank-ZQEPPDEL.js +359 -0
- package/dist/block.mds.geneboxplot-VJTIMZ6H.js +828 -0
- package/dist/block.mds.junction-VTAMQ2CW.js +1545 -0
- package/dist/block.mds.svcnv-WG7WY3CS.js +6801 -0
- package/dist/block.svg-YTWYGSGO.js +164 -0
- package/dist/block.tk.aicheck-L4M55U63.js +283 -0
- package/dist/block.tk.ase-3OBVSGWM.js +365 -0
- package/dist/block.tk.bam-QUCP3HST.js +1906 -0
- package/dist/block.tk.bedgraphdot-BGAH5YPF.js +384 -0
- package/dist/block.tk.bigwig.ui-2MG6VMOE.js +211 -0
- package/dist/block.tk.hicstraw-MDQHFWBB.js +823 -0
- package/dist/block.tk.junction-PBCJTAFX.js +2364 -0
- package/dist/block.tk.junction.textmatrixui-FJR76QBO.js +199 -0
- package/dist/block.tk.ld-ISL7K3DH.js +99 -0
- package/dist/block.tk.menu-VQW3FUAF.js +1029 -0
- package/dist/block.tk.pgv-RMXDF3XD.js +944 -0
- package/dist/brainImaging-F4GZRF53.js +423 -0
- package/dist/brainRegions-ONUXPD7P.js +221 -0
- package/dist/bubbleHeatmap-ZOS2ME3T.js +383 -0
- package/dist/cellTypeBubbleHeatmap-BEVDWLHJ.js +283 -0
- package/dist/chunk-2JQWA4EO.js +6364 -0
- package/dist/chunk-2TWVFQD2.js +494 -0
- package/dist/chunk-2TWVFQD2.js.map +7 -0
- package/dist/chunk-2TZITKMT.js +498 -0
- package/dist/chunk-4BDOPNYW.js +129 -0
- package/dist/chunk-4G6ZGXZF.js +1338 -0
- package/dist/chunk-4G6ZGXZF.js.map +7 -0
- package/dist/chunk-4QW2O66J.js +22695 -0
- package/dist/chunk-4QW2O66J.js.map +7 -0
- package/dist/chunk-4RWLKZMS.js +480 -0
- package/dist/chunk-57GCW5SF.js +2899 -0
- package/dist/chunk-5RUVBYLK.js +117 -0
- package/dist/chunk-5YOZ4E5H.js +55 -0
- package/dist/chunk-6N5DNN7P.js +302 -0
- package/dist/chunk-73PFJ2VF.js +21517 -0
- package/dist/chunk-73PFJ2VF.js.map +7 -0
- package/dist/chunk-AOVDTRFY.js +272 -0
- package/dist/chunk-BIDQ4OZH.js +465 -0
- package/dist/chunk-C34UTN5M.js +292 -0
- package/dist/chunk-DFHSLHXZ.js +134 -0
- package/dist/chunk-DMOTISFN.js +835 -0
- package/dist/chunk-DMOTISFN.js.map +7 -0
- package/dist/chunk-E2JRANYL.js +299 -0
- package/dist/chunk-E6EA7IU7.js +1172 -0
- package/dist/chunk-E6EA7IU7.js.map +7 -0
- package/dist/chunk-E732F6XI.js +141 -0
- package/dist/chunk-E732F6XI.js.map +7 -0
- package/dist/chunk-FESRWKYY.js +203 -0
- package/dist/chunk-GMJSMF7P.js +5070 -0
- package/dist/chunk-H6INPPUC.js +784 -0
- package/dist/chunk-H6INPPUC.js.map +7 -0
- package/dist/chunk-HDPL53U4.js +14 -0
- package/dist/chunk-HOCICSX4.js +276 -0
- package/dist/chunk-HR7XPTAV.js +340 -0
- package/dist/chunk-HR7XPTAV.js.map +7 -0
- package/dist/chunk-HV3GD2F3.js +54 -0
- package/dist/chunk-IGVKT4CE.js +56 -0
- package/dist/chunk-IMKIDF2H.js +123 -0
- package/dist/chunk-ITKMNOLR.js +37 -0
- package/dist/chunk-JABW3SRG.js +217 -0
- package/dist/chunk-JTYQX3EE.js +4306 -0
- package/dist/chunk-JTYQX3EE.js.map +7 -0
- package/dist/chunk-KDNYUHAH.js +70 -0
- package/dist/chunk-KSA3ND7Z.js +2327 -0
- package/dist/chunk-LCRPBPKX.js +34 -0
- package/dist/chunk-NIZTWHGT.js +514 -0
- package/dist/chunk-OBRVYT5O.js +187 -0
- package/dist/chunk-OBRVYT5O.js.map +7 -0
- package/dist/chunk-OCC5HEPR.js +411 -0
- package/dist/chunk-OMIUJ7JT.js +448 -0
- package/dist/chunk-ONCG5AKF.js +160 -0
- package/dist/chunk-OW5LD7S2.js +102 -0
- package/dist/chunk-PY4QOYPK.js +102 -0
- package/dist/chunk-Q3QY7QGU.js +50 -0
- package/dist/chunk-RL3IRMOA.js +236 -0
- package/dist/chunk-SCOFWMSE.js +240 -0
- package/dist/chunk-SMOHPEMJ.js +2681 -0
- package/dist/chunk-SNL7MSZD.js +243 -0
- package/dist/chunk-SP7HDNXC.js +368 -0
- package/dist/chunk-UILBQKQ6.js +143 -0
- package/dist/chunk-USH6NWXA.js +1943 -0
- package/dist/chunk-USH6NWXA.js.map +7 -0
- package/dist/chunk-UTNJA7JC.js +381 -0
- package/dist/chunk-VJCJCDFI.js +142 -0
- package/dist/chunk-VSSZJHOR.js +473 -0
- package/dist/chunk-W2WOZNEN.js +158 -0
- package/dist/chunk-WGRJEQT7.js +1250 -0
- package/dist/chunk-WGRJEQT7.js.map +7 -0
- package/dist/chunk-WJTRQ3ZC.js +1710 -0
- package/dist/chunk-X4QQRHFB.js +1812 -0
- package/dist/chunk-Y2UCJ33M.js +263 -0
- package/dist/chunk-Y45RZL4F.js +98 -0
- package/dist/chunk-YAISXQJ5.js +626 -0
- package/dist/chunk-YAISXQJ5.js.map +7 -0
- package/dist/chunk-Z2TA7NML.js +352 -0
- package/dist/chunk-Z7U74YGW.js +222 -0
- package/dist/chunk-ZKMBNB5E.js +176 -0
- package/dist/chunk-ZPBG6CT3.js +100 -0
- package/dist/chunk-ZUDSOVYT.js +2784 -0
- package/dist/chunk-ZZMIDYRE.js +197 -0
- package/dist/chunk-ZZMIDYRE.js.map +7 -0
- package/dist/cohort-R743ZSCR.js +75 -0
- package/dist/condition-MPZIRRGP.js +332 -0
- package/dist/controls-WD5TZITZ.js +39 -0
- package/dist/controls.btns-KCLXBXSL.js +9 -0
- package/dist/controls.config-577UCREO.js +39 -0
- package/dist/correlation-OCFBDDOX.js +102 -0
- package/dist/cuminc-YJGCKHFM.js +1153 -0
- package/dist/cuminc-YJGCKHFM.js.map +7 -0
- package/dist/cuminc.integration.spec-V46K57GV.js +678 -0
- package/dist/customdata.inputui-2MS5ZRKC.js +289 -0
- package/dist/dataDownload-HBFKARTR.js +332 -0
- package/dist/dataDownload-HBFKARTR.js.map +7 -0
- package/dist/dataDownload.integration.spec-TEOJOMYK.js +193 -0
- package/dist/databrowser.ui-PDPFHOH7.js +432 -0
- package/dist/dictionary-MWUQYW6W.js +118 -0
- package/dist/dnaMethylation-SNVVE2MD.js +38 -0
- package/dist/dnaMethylation.integration.spec-OSYZ3YDP.js +203 -0
- package/dist/dofetch-7R7PL4BX.js +51 -0
- package/dist/e2pca-7FYIWR5O.js +350 -0
- package/dist/ep-PTAJZLKI.js +1256 -0
- package/dist/expclust.gdc.spec-2R7T7JPY.js +307 -0
- package/dist/facet-BY6DQRCA.js +521 -0
- package/dist/facet-BY6DQRCA.js.map +7 -0
- package/dist/gb-5UFIDQWY.js +88 -0
- package/dist/geneExpClustering-QLBETGVB.js +249 -0
- package/dist/geneExpression-SAMLSOHQ.js +38 -0
- package/dist/geneExpression-SECTPIDT.js +313 -0
- package/dist/geneExpression.unit.spec-UNRGPJIG.js +102 -0
- package/dist/geneORA-CCQGE7QL.js +278 -0
- package/dist/geneRanking-NVR7ZZIP.js +553 -0
- package/dist/geneVariant-5KL2J3NA.js +39 -0
- package/dist/geneVariant-72E5YEPJ.js +41 -0
- package/dist/geneVariant.integration.spec-7JLVYF7Q.js +198 -0
- package/dist/genefusion.ui-M3IG6NUU.js +308 -0
- package/dist/geneset-V2535XGY.js +208 -0
- package/dist/genomeBrowser.spec-TRREAQCH.js +281 -0
- package/dist/grin2-6X5GCPBQ.js +75 -0
- package/dist/grin2-GOO7H3RC.js +1143 -0
- package/dist/hierCluster-5YZOCCTV.js +63 -0
- package/dist/hierCluster-ZPQCUSVO.js +59 -0
- package/dist/hierCluster.config-T3Y2LS6V.js +40 -0
- package/dist/hierCluster.integration.spec-PTXVQH77.js +488 -0
- package/dist/hierCluster.interactivity-JNBO3MJB.js +54 -0
- package/dist/imagePlot-AH2JIGVN.js +163 -0
- package/dist/imagePlot-AH2JIGVN.js.map +7 -0
- package/dist/importPlot-CWMBFQDD.js +8 -0
- package/dist/isoformExpression-ABPY2N3A.js +40 -0
- package/dist/isoformExpression.unit.spec-KRAZBQVF.js +242 -0
- package/dist/junction-XGCBNVHV.js +41 -0
- package/dist/junction.unit.spec-XZFUJRI3.js +187 -0
- package/dist/launch.adhoc-7FJD3XSI.js +42 -0
- package/dist/leftlabel.sample-VPOZWRVY.js +263 -0
- package/dist/lollipop-WBOAFWWO.js +171 -0
- package/dist/maf-MMN6WYHA.js +460 -0
- package/dist/maf-MMN6WYHA.js.map +7 -0
- package/dist/maftimeline-UK4MQP2D.js +593 -0
- package/dist/matrix-AT2FFTWO.js +58 -0
- package/dist/matrix-AU6NPNID.js +63 -0
- package/dist/matrix.config-VTQ6HL5L.js +41 -0
- package/dist/matrix.data-DBYXSWIN.js +25 -0
- package/dist/matrix.dom-DDPSUNY2.js +11 -0
- package/dist/matrix.integration.spec-NJ2AXQAS.js +3072 -0
- package/dist/matrix.interactivity-HE2Q6SAO.js +42 -0
- package/dist/matrix.layout-FD5BPRCX.js +44 -0
- package/dist/matrix.renderers-DVM4NB2R.js +38 -0
- package/dist/matrix.sort.unit.spec-VQ3TR4S2.js +472 -0
- package/dist/matrix.sorterUi-4KYRGJT5.js +18 -0
- package/dist/matrix.sorterUi.unit.spec-IEHG3OKN.js +342 -0
- package/dist/mavb-RPRKXPTZ.js +732 -0
- package/dist/mds.fimo-PZCVBD44.js +518 -0
- package/dist/mds.samplescatterplot-236GTHM4.js +1550 -0
- package/dist/mds.survivalplot-IJHOWSZL.js +483 -0
- package/dist/oncomatrix-R4OKDXSV.js +295 -0
- package/dist/oncomatrix.spec-4Z4HKS44.js +448 -0
- package/dist/plot.2dvaf-ZK7DAKRQ.js +377 -0
- package/dist/plot.app-J66BA2LD.js +41 -0
- package/dist/plot.barplot-UVRVPOKA.js +102 -0
- package/dist/plot.boxplot-DQGBDNLU.js +152 -0
- package/dist/plot.brainImaging-WRMDYYHC.js +51 -0
- package/dist/plot.disco-SSGPSM7W.js +102 -0
- package/dist/plot.dzi-F77KKPIJ.js +33 -0
- package/dist/plot.ssgq-FVFJOYVO.js +139 -0
- package/dist/plot.vaf2cov-CJSYBSPQ.js +259 -0
- package/dist/plot.wsi-OSZU2PQ5.js +36 -0
- package/dist/polar2-R4ZKXKEV.js +237 -0
- package/dist/profileForms-F7LXHITE.js +940 -0
- package/dist/profileForms-F7LXHITE.js.map +7 -0
- package/dist/profilePlot-JU7SFYYY.js +54 -0
- package/dist/proteinView-VU4SVO5I.js +1568 -0
- package/dist/proteomeCohortCompare-2U537GOK.js +799 -0
- package/dist/pseudbulk.unit.spec-2FDKAEVI.js +91 -0
- package/dist/pseudobulk-5GBUBBOY.js +40 -0
- package/dist/qualitative-3FTEQ7JW.js +43 -0
- package/dist/radar2-EBOTTAMC.js +332 -0
- package/dist/radarFacility2-PAGNJR6D.js +340 -0
- package/dist/regression-XOVSVC7S.js +58 -0
- package/dist/regression.inputs-LGA67ESO.js +48 -0
- package/dist/regression.inputs.term-UCQKXC5D.js +50 -0
- package/dist/regression.inputs.values.table-2RRE7SMS.js +45 -0
- package/dist/regression.integration.spec-BKM5UI7H.js +838 -0
- package/dist/regression.results-T3HB6CBH.js +40 -0
- package/dist/regression.spec-W7IVCYVZ.js +708 -0
- package/dist/render-2C6LWNG2.js +38 -0
- package/dist/report-HRGU3XKL.js +222 -0
- package/dist/sampleView-P5JZHEKY.js +48 -0
- package/dist/samplelst-OYQ6BASU.js +111 -0
- package/dist/samplematrix-JC3SGO5V.js +2198 -0
- package/dist/sc-FTHUNDGY.js +86 -0
- package/dist/scatter-WYP2NPNB.js +890 -0
- package/dist/selectGenomeWithTklst-CIETKILP.js +134 -0
- package/dist/singleCellCellType-3O3TTLM6.js +38 -0
- package/dist/singleCellCellType.unit.spec-GHBS36DB.js +159 -0
- package/dist/singleCellGeneExpression-2F7F4EKK.js +38 -0
- package/dist/singleCellGeneExpression.unit.spec-2VGIH2NZ.js +153 -0
- package/dist/singleCellPlot-MGSS4O3L.js +54 -0
- package/dist/singlecell-CKC2VVJ3.js +86 -0
- package/dist/singlecell-QOXATRF4.js +1572 -0
- package/dist/snp-OSYJO2R7.js +38 -0
- package/dist/snp.unit.spec-L5ANPFO2.js +176 -0
- package/dist/snplocus-64MJJID2.js +208 -0
- package/dist/spliceevent.a53ss.diagram-LHRT5UPB.js +151 -0
- package/dist/spliceevent.exonskip.diagram-BGSEPGR5.js +283 -0
- package/dist/spliceevent.noeventdiagram-QGZZSKW7.js +460 -0
- package/dist/ssGSEA-VVAZDFDT.js +38 -0
- package/dist/ssGSEA.unit.spec-LP76RHTV.js +88 -0
- package/dist/stattable-55YGV5B4.js +122 -0
- package/dist/stattable-55YGV5B4.js.map +7 -0
- package/dist/studyCatalog-AXWH7IOH.js +358 -0
- package/dist/summarizeCnvGeneexp-DRBIXOAP.js +163 -0
- package/dist/summarizeGeneexpSurvival-4PATAUSN.js +110 -0
- package/dist/summarizeMutationCnv-UGSIGZDJ.js +164 -0
- package/dist/summarizeMutationDiagnosis-UATVI5BK.js +40 -0
- package/dist/summarizeMutationSurvival-CZXGM3AA.js +99 -0
- package/dist/summary-IGTXNQ5I.js +49 -0
- package/dist/summary.integration.spec-VFCYU2V6.js +414 -0
- package/dist/summaryInput-AFZSASTM.js +231 -0
- package/dist/sunburst-G7DBI637.js +284 -0
- package/dist/survival-GIRR5ML4.js +1247 -0
- package/dist/survival-GIRR5ML4.js.map +7 -0
- package/dist/survival-YOJBLMR2.js +58 -0
- package/dist/survival.integration.spec-FXPCZJSS.js +958 -0
- package/dist/svgraph-ZSSOWI7R.js +1387 -0
- package/dist/svmr-FPYSMXSC.js +3842 -0
- package/dist/table-NHS2WLWT.js +202 -0
- package/dist/table-NHS2WLWT.js.map +7 -0
- package/dist/termCollection-IY5V64IY.js +38 -0
- package/dist/termCollection-SR4SP6RZ.js +257 -0
- package/dist/termCollection.unit.spec-NL72AQ2P.js +304 -0
- package/dist/termCollectionFractionSelection-2LPBE224.js +47 -0
- package/dist/termCollectionFractionSelection.unit.spec-PUMGBUDN.js +193 -0
- package/dist/termInfo-2DR7DHXM.js +9 -0
- package/dist/tk-COBDWIZJ.js +1127 -0
- package/dist/tk-N2YBXDQK.js +46 -0
- package/dist/tp.ui-BMK2MMIJ.js +1459 -0
- package/dist/tvs.dt-KL4VCW5Y.js +39 -0
- package/dist/tvs.dtcnv.categorical-VGXOASJE.js +40 -0
- package/dist/tvs.dtcnv.continuous-IANT7BPS.js +72 -0
- package/dist/tvs.dtfusion-M5HJWCJI.js +40 -0
- package/dist/tvs.dtitd-KB72EDPN.js +40 -0
- package/dist/tvs.dtsnvindel-VGYTLO6E.js +40 -0
- package/dist/tvs.dtsv-KWUXW2F5.js +40 -0
- package/dist/tvs.samplelst-3UA7XMHJ.js +104 -0
- package/dist/tvs.termCollection-LK6CVGYZ.js +129 -0
- package/dist/violin-D4EX3ZFV.js +46 -0
- package/dist/violin.integration.spec-GBW3VBHW.js +1425 -0
- package/dist/violin.interactivity-N3JVI2AQ.js +38 -0
- package/dist/violin.renderer-2NYRUXUY.js +40 -0
- package/dist/vocabulary-277KD4RO.js +41 -0
- package/dist/wsi.direct-RI3XGLUC.js +81 -0
- package/dist/wsi.direct-RI3XGLUC.js.map +7 -0
- package/package.json +2 -2
- package/dist/2dmaf-6MNHNHWX.js +0 -1373
- package/dist/AIProjectAdmin-W36NGUX2.js +0 -958
- package/dist/AggregateMatrix-YH2SN6VN.js +0 -671
- package/dist/AppHeader-I5CFECIL.js +0 -835
- package/dist/BoxPlot-4SXDAOBP.js +0 -1218
- package/dist/CorrelationVolcano-NAWMGG4Q.js +0 -619
- package/dist/CorrelationVolcano-NAWMGG4Q.js.map +0 -7
- package/dist/DE-VZMT7KEM.js +0 -95
- package/dist/DEinput-TKERM2YD.js +0 -409
- package/dist/DEinput-TKERM2YD.js.map +0 -7
- package/dist/DifferentialAnalysis-Y4SU4BVP.js +0 -243
- package/dist/Disco-DLK3BYPV.js +0 -3392
- package/dist/Disco.UI-IKGMFG36.js +0 -248
- package/dist/DmrPlot-JWBZJFS6.js +0 -642
- package/dist/DziViewer-6737GC22.js +0 -16332
- package/dist/GB-3UZSSIBW.js +0 -1396
- package/dist/GSEA-YLHBZY55.js +0 -846
- package/dist/GeneExpInput-KX5I63YV.js +0 -367
- package/dist/Geomap-QTUHM4VH.js +0 -89
- package/dist/HicApp-M2OCHGRT.js +0 -2250
- package/dist/IDCViewer-SWFBLBZH.js +0 -10817
- package/dist/NumBinaryEditor-ILFP6DR7.js +0 -284
- package/dist/NumBinaryEditor.unit.spec-TNIH7GQB.js +0 -317
- package/dist/NumContEditor-7UR3QMO6.js +0 -110
- package/dist/NumContEditor.unit.spec-P67AFEHM.js +0 -169
- package/dist/NumCustomBinEditor-H22J4K47.js +0 -38
- package/dist/NumCustomBinEditor.unit.spec-CO76BQPZ.js +0 -402
- package/dist/NumDiscreteEditor-TSUHVX77.js +0 -175
- package/dist/NumDiscreteEditor.unit.spec-RGC3GT22.js +0 -238
- package/dist/NumRegularBinEditor-IRD27CE2.js +0 -38
- package/dist/NumRegularBinEditor.unit.spec-MUHVOK5P.js +0 -283
- package/dist/NumSplineEditor-3V7RWHE2.js +0 -215
- package/dist/NumSplineEditor.unit.spec-BUI7NPN4.js +0 -229
- package/dist/NumericDensity-53KMCTDL.js +0 -38
- package/dist/NumericDensity.unit.spec-OKAQPQHR.js +0 -423
- package/dist/NumericHandler-5QFNXVBA.js +0 -39
- package/dist/NumericHandler.unit.spec-OBITSUU3.js +0 -219
- package/dist/ProteomeInput-MM373EL3.js +0 -394
- package/dist/RunChart2-2L6T3ITZ.js +0 -758
- package/dist/SC-JKD3Z2X5.js +0 -1112
- package/dist/Volcano-STGBS7IJ.js +0 -1404
- package/dist/Volcano-STGBS7IJ.js.map +0 -7
- package/dist/WSIViewer-LOBVUTOD.js +0 -48562
- package/dist/WSIViewer-LOBVUTOD.js.map +0 -7
- package/dist/WsiSamplesPlot-D3L3AILR.js +0 -165
- package/dist/adSandbox-XO5HDSFW.js +0 -38
- package/dist/animatedBubbleChart-XKW6TCZP.js +0 -553
- package/dist/app-H7ABTG6X.js +0 -49
- package/dist/app-HJSPIKRQ.js +0 -37
- package/dist/bam-R5QVHWGY.js +0 -859
- package/dist/barchart-OGCLBPQ2.js +0 -47
- package/dist/barchart.events-GZTY4IC3.js +0 -47
- package/dist/barchart.integration.spec-Z6ECNFSM.js +0 -2243
- package/dist/barchart2-DT42I747.js +0 -314
- package/dist/block-UYYJXSCM.js +0 -6255
- package/dist/block.init-43M53IMA.js +0 -38
- package/dist/block.mds.expressionrank-YH3IWMKM.js +0 -359
- package/dist/block.mds.geneboxplot-QS2IK37X.js +0 -828
- package/dist/block.mds.junction-7FF5BFEX.js +0 -1545
- package/dist/block.mds.svcnv-MMJYLL2W.js +0 -6801
- package/dist/block.svg-SA6DSUM2.js +0 -164
- package/dist/block.tk.aicheck-ZX5LZ2QO.js +0 -283
- package/dist/block.tk.ase-YXT4BOXK.js +0 -365
- package/dist/block.tk.bam-IMLRIOOV.js +0 -1906
- package/dist/block.tk.bedgraphdot-UYQLL7HM.js +0 -384
- package/dist/block.tk.bigwig.ui-WUVLVRSM.js +0 -211
- package/dist/block.tk.hicstraw-N4SJGF7H.js +0 -823
- package/dist/block.tk.junction-LZWHFKWJ.js +0 -2364
- package/dist/block.tk.junction.textmatrixui-B626NYPA.js +0 -199
- package/dist/block.tk.ld-6VWUMAP6.js +0 -99
- package/dist/block.tk.menu-RRN2UPQX.js +0 -1029
- package/dist/block.tk.pgv-GYG3EI6P.js +0 -944
- package/dist/brainImaging-VIMLETC5.js +0 -423
- package/dist/brainRegions-DRYZT5K5.js +0 -221
- package/dist/bubbleHeatmap-Y4SGMVJY.js +0 -383
- package/dist/cellTypeBubbleHeatmap-QW37ZT5W.js +0 -283
- package/dist/chunk-2Y5C7GJS.js +0 -299
- package/dist/chunk-2ZTCRUOL.js +0 -2899
- package/dist/chunk-3O6XFPUB.js +0 -243
- package/dist/chunk-3P74DH6P.js +0 -236
- package/dist/chunk-3PPCZPLN.js +0 -98
- package/dist/chunk-4H4WJJ2G.js +0 -54
- package/dist/chunk-4KY4XKJV.js +0 -143
- package/dist/chunk-4L2OSDQ6.js +0 -626
- package/dist/chunk-4L2OSDQ6.js.map +0 -7
- package/dist/chunk-4USLEUNR.js +0 -1812
- package/dist/chunk-5ITKSTJX.js +0 -34
- package/dist/chunk-5VMYXVZG.js +0 -272
- package/dist/chunk-7ZVFLC2V.js +0 -134
- package/dist/chunk-C2JHLAKV.js +0 -222
- package/dist/chunk-C5IAIOCA.js +0 -102
- package/dist/chunk-CIRCVMWE.js +0 -102
- package/dist/chunk-CRH37PEV.js +0 -203
- package/dist/chunk-DCNDZOI3.js +0 -6364
- package/dist/chunk-DHPLHIVP.js +0 -498
- package/dist/chunk-DKAHHMKN.js +0 -5070
- package/dist/chunk-ECIBJXFT.js +0 -352
- package/dist/chunk-EQCVSUAF.js +0 -37
- package/dist/chunk-FVL37XFU.js +0 -834
- package/dist/chunk-FVL37XFU.js.map +0 -7
- package/dist/chunk-FXS4I3Z3.js +0 -176
- package/dist/chunk-FYAY6D3O.js +0 -123
- package/dist/chunk-GL44X7JY.js +0 -302
- package/dist/chunk-HQAJVJCQ.js +0 -195
- package/dist/chunk-HQAJVJCQ.js.map +0 -7
- package/dist/chunk-IIT367QZ.js +0 -473
- package/dist/chunk-IYT5PNYJ.js +0 -148
- package/dist/chunk-IYT5PNYJ.js.map +0 -7
- package/dist/chunk-J6EP7JPJ.js +0 -1245
- package/dist/chunk-J6EP7JPJ.js.map +0 -7
- package/dist/chunk-JKMN7XOP.js +0 -1114
- package/dist/chunk-JKMN7XOP.js.map +0 -7
- package/dist/chunk-JLGCQ2F4.js +0 -480
- package/dist/chunk-JQT67SWE.js +0 -263
- package/dist/chunk-JQYPRW42.js +0 -217
- package/dist/chunk-K4IGOJPT.js +0 -160
- package/dist/chunk-K6OVOHIZ.js +0 -21483
- package/dist/chunk-K6OVOHIZ.js.map +0 -7
- package/dist/chunk-KPTPDZX2.js +0 -56
- package/dist/chunk-KTB7KXC2.js +0 -187
- package/dist/chunk-KTB7KXC2.js.map +0 -7
- package/dist/chunk-KW7MKBGF.js +0 -2681
- package/dist/chunk-KZFVYDVK.js +0 -448
- package/dist/chunk-M3J4MINX.js +0 -783
- package/dist/chunk-M3J4MINX.js.map +0 -7
- package/dist/chunk-M77DCLJX.js +0 -100
- package/dist/chunk-MFEYO6FB.js +0 -4306
- package/dist/chunk-MFEYO6FB.js.map +0 -7
- package/dist/chunk-MUJMZ6W6.js +0 -129
- package/dist/chunk-NRP55BOF.js +0 -50
- package/dist/chunk-O5KFJBU3.js +0 -1942
- package/dist/chunk-O5KFJBU3.js.map +0 -7
- package/dist/chunk-Q4AP5L7R.js +0 -1311
- package/dist/chunk-Q4AP5L7R.js.map +0 -7
- package/dist/chunk-QHPN3JJZ.js +0 -55
- package/dist/chunk-QSGXZEUU.js +0 -465
- package/dist/chunk-RIQT2LSR.js +0 -479
- package/dist/chunk-RIQT2LSR.js.map +0 -7
- package/dist/chunk-RZGEKL77.js +0 -117
- package/dist/chunk-SOCGXVIL.js +0 -2327
- package/dist/chunk-SZHFBRRT.js +0 -514
- package/dist/chunk-TOYMIFHN.js +0 -381
- package/dist/chunk-TPVHGI7Q.js +0 -368
- package/dist/chunk-UJN2RH5R.js +0 -411
- package/dist/chunk-V2DU2OXH.js +0 -1710
- package/dist/chunk-X7KRSZQT.js +0 -2784
- package/dist/chunk-XIBY5I6F.js +0 -240
- package/dist/chunk-XJBSBIZ4.js +0 -70
- package/dist/chunk-XRQWZJJ3.js +0 -347
- package/dist/chunk-XRQWZJJ3.js.map +0 -7
- package/dist/chunk-XZ4M3QAV.js +0 -158
- package/dist/chunk-YMP4YKBN.js +0 -142
- package/dist/chunk-Z7VK2AMA.js +0 -292
- package/dist/chunk-ZH7JPYQE.js +0 -14
- package/dist/chunk-ZVDOSFWU.js +0 -276
- package/dist/cohort-CEYVJJ7E.js +0 -75
- package/dist/condition-QSOFP4MY.js +0 -332
- package/dist/controls-QYHARIEY.js +0 -39
- package/dist/controls.btns-AP67YWKW.js +0 -9
- package/dist/controls.config-3OO3JK6E.js +0 -39
- package/dist/correlation-TOI3TMYL.js +0 -102
- package/dist/cuminc-L7OJTYXC.js +0 -1148
- package/dist/cuminc-L7OJTYXC.js.map +0 -7
- package/dist/cuminc.integration.spec-LSWV3KOF.js +0 -678
- package/dist/customdata.inputui-VMB3HSSC.js +0 -289
- package/dist/dataDownload-NPSWNOAG.js +0 -330
- package/dist/dataDownload-NPSWNOAG.js.map +0 -7
- package/dist/dataDownload.integration.spec-J6FRFLBK.js +0 -193
- package/dist/databrowser.ui-GVYWG6YI.js +0 -432
- package/dist/dictionary-GD67R72W.js +0 -118
- package/dist/dnaMethylation-S7OSGLAF.js +0 -38
- package/dist/dnaMethylation.integration.spec-ETMMJNDE.js +0 -203
- package/dist/dofetch-7GURQS65.js +0 -51
- package/dist/e2pca-ZIIPBJFN.js +0 -350
- package/dist/ep-A2HAL5WA.js +0 -1256
- package/dist/expclust.gdc.spec-ZSILLYNI.js +0 -307
- package/dist/facet-74LKIPTA.js +0 -521
- package/dist/facet-74LKIPTA.js.map +0 -7
- package/dist/gb-C3MPQXKN.js +0 -88
- package/dist/geneExpClustering-HYCFUUTU.js +0 -249
- package/dist/geneExpression-GATKMJJ5.js +0 -313
- package/dist/geneExpression-JXSAP2H7.js +0 -38
- package/dist/geneExpression.unit.spec-CODZYFHZ.js +0 -102
- package/dist/geneORA-LJRIR4VV.js +0 -278
- package/dist/geneRanking-TWLBKQZG.js +0 -553
- package/dist/geneVariant-35RQHTCK.js +0 -41
- package/dist/geneVariant-TMJJIMUF.js +0 -39
- package/dist/geneVariant.integration.spec-FIQ7IBSD.js +0 -198
- package/dist/genefusion.ui-SOBESSNO.js +0 -308
- package/dist/geneset-JXEJFEK2.js +0 -208
- package/dist/genomeBrowser.spec-25ZO5S2X.js +0 -281
- package/dist/grin2-CW4RPVPI.js +0 -75
- package/dist/grin2-EI5BVP4E.js +0 -1143
- package/dist/hierCluster-OBBPQH24.js +0 -59
- package/dist/hierCluster-SDH3TJQY.js +0 -63
- package/dist/hierCluster.config-DO67TCXI.js +0 -40
- package/dist/hierCluster.integration.spec-EB24C4VZ.js +0 -488
- package/dist/hierCluster.interactivity-LGEAFT5T.js +0 -54
- package/dist/imagePlot-LGLFG2QZ.js +0 -163
- package/dist/imagePlot-LGLFG2QZ.js.map +0 -7
- package/dist/importPlot-R2WRZGZU.js +0 -8
- package/dist/isoformExpression-KI3WY5M3.js +0 -40
- package/dist/isoformExpression.unit.spec-OQRG2DDU.js +0 -242
- package/dist/junction-6SWFPNM5.js +0 -41
- package/dist/junction.unit.spec-5TZFITSU.js +0 -187
- package/dist/launch.adhoc-HCX2RQLB.js +0 -42
- package/dist/leftlabel.sample-OI6XCXTQ.js +0 -263
- package/dist/lollipop-SOSOYHYL.js +0 -171
- package/dist/maf-73RLOEVN.js +0 -459
- package/dist/maf-73RLOEVN.js.map +0 -7
- package/dist/maftimeline-UOMLYUNI.js +0 -593
- package/dist/matrix-5QWDN6SI.js +0 -63
- package/dist/matrix-SKPVVDVR.js +0 -58
- package/dist/matrix.config-HE64MAL4.js +0 -41
- package/dist/matrix.data-HTUZXQAM.js +0 -25
- package/dist/matrix.dom-F7AN3QGE.js +0 -11
- package/dist/matrix.integration.spec-YKJ4LZFY.js +0 -3072
- package/dist/matrix.interactivity-YB5G5W5T.js +0 -42
- package/dist/matrix.layout-MFG65V7K.js +0 -44
- package/dist/matrix.renderers-PCZFHDDZ.js +0 -38
- package/dist/matrix.sort.unit.spec-GEAM5DSU.js +0 -472
- package/dist/matrix.sorterUi-YSKIX6B6.js +0 -18
- package/dist/matrix.sorterUi.unit.spec-2MW64QS5.js +0 -342
- package/dist/mavb-YMHJXCGA.js +0 -732
- package/dist/mds.fimo-PTEDRMLQ.js +0 -518
- package/dist/mds.samplescatterplot-7R7PLVQJ.js +0 -1550
- package/dist/mds.survivalplot-F3EENMFQ.js +0 -483
- package/dist/oncomatrix-27VVSMZB.js +0 -295
- package/dist/oncomatrix.spec-F43Y7CWN.js +0 -448
- package/dist/plot.2dvaf-MYFQSWIA.js +0 -377
- package/dist/plot.app-36QWCKXR.js +0 -41
- package/dist/plot.barplot-535EP7XT.js +0 -102
- package/dist/plot.boxplot-6IBP7VEB.js +0 -152
- package/dist/plot.brainImaging-M4HPNXZH.js +0 -51
- package/dist/plot.disco-HIT6GR44.js +0 -102
- package/dist/plot.dzi-W66SBKTH.js +0 -33
- package/dist/plot.ssgq-MI2OMCUY.js +0 -139
- package/dist/plot.vaf2cov-F4CBMLRA.js +0 -259
- package/dist/plot.wsi-7M5KTNFC.js +0 -36
- package/dist/polar2-7VSWGT4U.js +0 -237
- package/dist/profileForms-DFPCNJW2.js +0 -940
- package/dist/profileForms-DFPCNJW2.js.map +0 -7
- package/dist/profilePlot-ECTPPVB2.js +0 -54
- package/dist/proteinView-6ELOLOIU.js +0 -1568
- package/dist/proteomeCohortCompare-V2FMWI62.js +0 -799
- package/dist/pseudbulk.unit.spec-KV6URTXC.js +0 -91
- package/dist/pseudobulk-6ZRFCE65.js +0 -40
- package/dist/qualitative-3B62RUOB.js +0 -43
- package/dist/radar2-4QQER64E.js +0 -332
- package/dist/radarFacility2-MZKORRDY.js +0 -340
- package/dist/regression-GZ2YNX6Y.js +0 -56
- package/dist/regression.inputs-ZEFDNSVT.js +0 -48
- package/dist/regression.inputs.term-O2FQBX7L.js +0 -48
- package/dist/regression.inputs.values.table-63BQKSZP.js +0 -45
- package/dist/regression.integration.spec-KDHC3KDU.js +0 -838
- package/dist/regression.results-5J3QM4RX.js +0 -40
- package/dist/regression.spec-WZAZTDDA.js +0 -708
- package/dist/render-MZTEXVU5.js +0 -38
- package/dist/report-M5TYHH2W.js +0 -222
- package/dist/sampleView-QYTLYJEW.js +0 -48
- package/dist/samplelst-FN3Q7M7A.js +0 -111
- package/dist/samplematrix-Z5FVODO7.js +0 -2198
- package/dist/sc-4CHP5SYP.js +0 -86
- package/dist/scatter-UOPJYXL3.js +0 -890
- package/dist/selectGenomeWithTklst-WMAHGT4F.js +0 -134
- package/dist/singleCellCellType-XPWENB6V.js +0 -38
- package/dist/singleCellCellType.unit.spec-QK56PHKW.js +0 -159
- package/dist/singleCellGeneExpression-4CEVDVYF.js +0 -38
- package/dist/singleCellGeneExpression.unit.spec-ZYRLBVF5.js +0 -153
- package/dist/singleCellPlot-JS74VUGC.js +0 -54
- package/dist/singlecell-5XYOHMWJ.js +0 -1572
- package/dist/singlecell-OO77XBDD.js +0 -86
- package/dist/snp-X5ZILM5J.js +0 -38
- package/dist/snp.unit.spec-V23G3JLJ.js +0 -176
- package/dist/snplocus-U5UIIUWR.js +0 -208
- package/dist/spliceevent.a53ss.diagram-YDFVSDMT.js +0 -151
- package/dist/spliceevent.exonskip.diagram-VDKN5JBE.js +0 -283
- package/dist/spliceevent.noeventdiagram-EFPFRUFI.js +0 -460
- package/dist/ssGSEA-LKJW5OQK.js +0 -38
- package/dist/ssGSEA.unit.spec-7WCZVEP2.js +0 -88
- package/dist/stattable-MDABSW3F.js +0 -90
- package/dist/stattable-MDABSW3F.js.map +0 -7
- package/dist/studyCatalog-EU33KE5H.js +0 -358
- package/dist/summarizeCnvGeneexp-QL25OQNB.js +0 -163
- package/dist/summarizeGeneexpSurvival-B7HTCH7L.js +0 -110
- package/dist/summarizeMutationCnv-DFAPX2JE.js +0 -164
- package/dist/summarizeMutationDiagnosis-HCSDSVII.js +0 -40
- package/dist/summarizeMutationSurvival-6WEASSA2.js +0 -99
- package/dist/summary-BWYXE77G.js +0 -49
- package/dist/summary.integration.spec-AVGSW5MF.js +0 -414
- package/dist/summaryInput-MOQ6HUCX.js +0 -231
- package/dist/sunburst-EZDHVJCL.js +0 -284
- package/dist/survival-5TFMM7NP.js +0 -1239
- package/dist/survival-5TFMM7NP.js.map +0 -7
- package/dist/survival-IEVELTC4.js +0 -58
- package/dist/survival.integration.spec-HHWP3R4H.js +0 -958
- package/dist/svgraph-55XRIYJW.js +0 -1387
- package/dist/svmr-CMEBFSRO.js +0 -3842
- package/dist/table-LTWQ3TLQ.js +0 -200
- package/dist/table-LTWQ3TLQ.js.map +0 -7
- package/dist/termCollection-CPQXYBFA.js +0 -38
- package/dist/termCollection-ZWOH273K.js +0 -257
- package/dist/termCollection.unit.spec-RK7VATLU.js +0 -304
- package/dist/termCollectionFractionSelection-Z4ZRW63R.js +0 -47
- package/dist/termCollectionFractionSelection.unit.spec-3CS7DPNU.js +0 -193
- package/dist/termInfo-6MJDJSDW.js +0 -9
- package/dist/tk-4NNTWWLK.js +0 -46
- package/dist/tk-RHWJJXH2.js +0 -1127
- package/dist/tp.ui-DPN5UN6U.js +0 -1459
- package/dist/tvs.dt-ARPDFRVM.js +0 -39
- package/dist/tvs.dtcnv.categorical-POS6WQK6.js +0 -40
- package/dist/tvs.dtcnv.continuous-5OETJ7JU.js +0 -72
- package/dist/tvs.dtfusion-ERYVI3DW.js +0 -40
- package/dist/tvs.dtitd-KTZZYEWU.js +0 -40
- package/dist/tvs.dtsnvindel-TGUAX3RN.js +0 -40
- package/dist/tvs.dtsv-AM63OIL6.js +0 -40
- package/dist/tvs.samplelst-VW2NOQ2C.js +0 -104
- package/dist/tvs.termCollection-O4ZSWJFA.js +0 -129
- package/dist/violin-ZQ3DEYGR.js +0 -46
- package/dist/violin.integration.spec-PVEF77HB.js +0 -1425
- package/dist/violin.interactivity-FYU4TCFO.js +0 -38
- package/dist/violin.renderer-XAERGBMV.js +0 -40
- package/dist/vocabulary-ECJX27W2.js +0 -41
- /package/dist/{2dmaf-6MNHNHWX.js.map → 2dmaf-Y2MBOXHL.js.map} +0 -0
- /package/dist/{AIProjectAdmin-W36NGUX2.js.map → AIProjectAdmin-2W4WNV65.js.map} +0 -0
- /package/dist/{AggregateMatrix-YH2SN6VN.js.map → AggregateMatrix-7L7OKUXI.js.map} +0 -0
- /package/dist/{AppHeader-I5CFECIL.js.map → AppHeader-6WM66GKP.js.map} +0 -0
- /package/dist/{BoxPlot-4SXDAOBP.js.map → BoxPlot-AF72DMSS.js.map} +0 -0
- /package/dist/{DE-VZMT7KEM.js.map → DE-AABMOSEE.js.map} +0 -0
- /package/dist/{DifferentialAnalysis-Y4SU4BVP.js.map → DifferentialAnalysis-NBC222Q6.js.map} +0 -0
- /package/dist/{Disco-DLK3BYPV.js.map → Disco-B6E3ALAV.js.map} +0 -0
- /package/dist/{Disco.UI-IKGMFG36.js.map → Disco.UI-KGFIQHXC.js.map} +0 -0
- /package/dist/{DmrPlot-JWBZJFS6.js.map → DmrPlot-R3S4PCAE.js.map} +0 -0
- /package/dist/{DziViewer-6737GC22.js.map → DziViewer-QYLZ4EMQ.js.map} +0 -0
- /package/dist/{GB-3UZSSIBW.js.map → GB-PV4RI5DG.js.map} +0 -0
- /package/dist/{GSEA-YLHBZY55.js.map → GSEA-DHUOROST.js.map} +0 -0
- /package/dist/{GeneExpInput-KX5I63YV.js.map → GeneExpInput-RESMBEM3.js.map} +0 -0
- /package/dist/{Geomap-QTUHM4VH.js.map → Geomap-2WACSP77.js.map} +0 -0
- /package/dist/{HicApp-M2OCHGRT.js.map → HicApp-3FJEZXAI.js.map} +0 -0
- /package/dist/{IDCViewer-SWFBLBZH.js.map → IDCViewer-MIRQEK4N.js.map} +0 -0
- /package/dist/{NumBinaryEditor-ILFP6DR7.js.map → NumBinaryEditor-EP277U4I.js.map} +0 -0
- /package/dist/{NumBinaryEditor.unit.spec-TNIH7GQB.js.map → NumBinaryEditor.unit.spec-ZB627VLG.js.map} +0 -0
- /package/dist/{NumContEditor-7UR3QMO6.js.map → NumContEditor-F7DOQSIW.js.map} +0 -0
- /package/dist/{NumContEditor.unit.spec-P67AFEHM.js.map → NumContEditor.unit.spec-PROGQHTU.js.map} +0 -0
- /package/dist/{NumCustomBinEditor-H22J4K47.js.map → NumCustomBinEditor-QS3IPKIQ.js.map} +0 -0
- /package/dist/{NumCustomBinEditor.unit.spec-CO76BQPZ.js.map → NumCustomBinEditor.unit.spec-BRDEFIX6.js.map} +0 -0
- /package/dist/{NumDiscreteEditor-TSUHVX77.js.map → NumDiscreteEditor-SE4I3BDA.js.map} +0 -0
- /package/dist/{NumDiscreteEditor.unit.spec-RGC3GT22.js.map → NumDiscreteEditor.unit.spec-6GBWQ3NQ.js.map} +0 -0
- /package/dist/{NumRegularBinEditor-IRD27CE2.js.map → NumRegularBinEditor-RJKB3G3V.js.map} +0 -0
- /package/dist/{NumRegularBinEditor.unit.spec-MUHVOK5P.js.map → NumRegularBinEditor.unit.spec-HRU2Y76X.js.map} +0 -0
- /package/dist/{NumSplineEditor-3V7RWHE2.js.map → NumSplineEditor-2DCORF5E.js.map} +0 -0
- /package/dist/{NumSplineEditor.unit.spec-BUI7NPN4.js.map → NumSplineEditor.unit.spec-TTNB5IXX.js.map} +0 -0
- /package/dist/{NumericDensity-53KMCTDL.js.map → NumericDensity-3A7KTA7Y.js.map} +0 -0
- /package/dist/{NumericDensity.unit.spec-OKAQPQHR.js.map → NumericDensity.unit.spec-ISPDAUVX.js.map} +0 -0
- /package/dist/{NumericHandler-5QFNXVBA.js.map → NumericHandler-RG5XZMBU.js.map} +0 -0
- /package/dist/{NumericHandler.unit.spec-OBITSUU3.js.map → NumericHandler.unit.spec-RTD7AZNE.js.map} +0 -0
- /package/dist/{ProteomeInput-MM373EL3.js.map → ProteomeInput-6A7UB4CI.js.map} +0 -0
- /package/dist/{RunChart2-2L6T3ITZ.js.map → RunChart2-YEAOBR2L.js.map} +0 -0
- /package/dist/{SC-JKD3Z2X5.js.map → SC-C3MJQBI5.js.map} +0 -0
- /package/dist/{WsiSamplesPlot-D3L3AILR.js.map → WsiSamplesPlot-ET7LGNJW.js.map} +0 -0
- /package/dist/{adSandbox-XO5HDSFW.js.map → adSandbox-6LGHUXPX.js.map} +0 -0
- /package/dist/{animatedBubbleChart-XKW6TCZP.js.map → animatedBubbleChart-VJ6EQDQP.js.map} +0 -0
- /package/dist/{app-H7ABTG6X.js.map → app-PRLLUIAA.js.map} +0 -0
- /package/dist/{app-HJSPIKRQ.js.map → app-WR6PQ2YK.js.map} +0 -0
- /package/dist/{bam-R5QVHWGY.js.map → bam-EXBXKUSE.js.map} +0 -0
- /package/dist/{barchart-OGCLBPQ2.js.map → barchart-FSIB3IZZ.js.map} +0 -0
- /package/dist/{barchart.events-GZTY4IC3.js.map → barchart.events-F4HSVH6M.js.map} +0 -0
- /package/dist/{barchart.integration.spec-Z6ECNFSM.js.map → barchart.integration.spec-AXE7BRKX.js.map} +0 -0
- /package/dist/{barchart2-DT42I747.js.map → barchart2-DRNQQJE2.js.map} +0 -0
- /package/dist/{block-UYYJXSCM.js.map → block-J3A3RIGS.js.map} +0 -0
- /package/dist/{block.init-43M53IMA.js.map → block.init-MQKMDKKW.js.map} +0 -0
- /package/dist/{block.mds.expressionrank-YH3IWMKM.js.map → block.mds.expressionrank-ZQEPPDEL.js.map} +0 -0
- /package/dist/{block.mds.geneboxplot-QS2IK37X.js.map → block.mds.geneboxplot-VJTIMZ6H.js.map} +0 -0
- /package/dist/{block.mds.junction-7FF5BFEX.js.map → block.mds.junction-VTAMQ2CW.js.map} +0 -0
- /package/dist/{block.mds.svcnv-MMJYLL2W.js.map → block.mds.svcnv-WG7WY3CS.js.map} +0 -0
- /package/dist/{block.svg-SA6DSUM2.js.map → block.svg-YTWYGSGO.js.map} +0 -0
- /package/dist/{block.tk.aicheck-ZX5LZ2QO.js.map → block.tk.aicheck-L4M55U63.js.map} +0 -0
- /package/dist/{block.tk.ase-YXT4BOXK.js.map → block.tk.ase-3OBVSGWM.js.map} +0 -0
- /package/dist/{block.tk.bam-IMLRIOOV.js.map → block.tk.bam-QUCP3HST.js.map} +0 -0
- /package/dist/{block.tk.bedgraphdot-UYQLL7HM.js.map → block.tk.bedgraphdot-BGAH5YPF.js.map} +0 -0
- /package/dist/{block.tk.bigwig.ui-WUVLVRSM.js.map → block.tk.bigwig.ui-2MG6VMOE.js.map} +0 -0
- /package/dist/{block.tk.hicstraw-N4SJGF7H.js.map → block.tk.hicstraw-MDQHFWBB.js.map} +0 -0
- /package/dist/{block.tk.junction-LZWHFKWJ.js.map → block.tk.junction-PBCJTAFX.js.map} +0 -0
- /package/dist/{block.tk.junction.textmatrixui-B626NYPA.js.map → block.tk.junction.textmatrixui-FJR76QBO.js.map} +0 -0
- /package/dist/{block.tk.ld-6VWUMAP6.js.map → block.tk.ld-ISL7K3DH.js.map} +0 -0
- /package/dist/{block.tk.menu-RRN2UPQX.js.map → block.tk.menu-VQW3FUAF.js.map} +0 -0
- /package/dist/{block.tk.pgv-GYG3EI6P.js.map → block.tk.pgv-RMXDF3XD.js.map} +0 -0
- /package/dist/{brainImaging-VIMLETC5.js.map → brainImaging-F4GZRF53.js.map} +0 -0
- /package/dist/{brainRegions-DRYZT5K5.js.map → brainRegions-ONUXPD7P.js.map} +0 -0
- /package/dist/{bubbleHeatmap-Y4SGMVJY.js.map → bubbleHeatmap-ZOS2ME3T.js.map} +0 -0
- /package/dist/{cellTypeBubbleHeatmap-QW37ZT5W.js.map → cellTypeBubbleHeatmap-BEVDWLHJ.js.map} +0 -0
- /package/dist/{chunk-DCNDZOI3.js.map → chunk-2JQWA4EO.js.map} +0 -0
- /package/dist/{chunk-DHPLHIVP.js.map → chunk-2TZITKMT.js.map} +0 -0
- /package/dist/{chunk-MUJMZ6W6.js.map → chunk-4BDOPNYW.js.map} +0 -0
- /package/dist/{chunk-JLGCQ2F4.js.map → chunk-4RWLKZMS.js.map} +0 -0
- /package/dist/{chunk-2ZTCRUOL.js.map → chunk-57GCW5SF.js.map} +0 -0
- /package/dist/{chunk-RZGEKL77.js.map → chunk-5RUVBYLK.js.map} +0 -0
- /package/dist/{chunk-QHPN3JJZ.js.map → chunk-5YOZ4E5H.js.map} +0 -0
- /package/dist/{chunk-GL44X7JY.js.map → chunk-6N5DNN7P.js.map} +0 -0
- /package/dist/{chunk-5VMYXVZG.js.map → chunk-AOVDTRFY.js.map} +0 -0
- /package/dist/{chunk-QSGXZEUU.js.map → chunk-BIDQ4OZH.js.map} +0 -0
- /package/dist/{chunk-Z7VK2AMA.js.map → chunk-C34UTN5M.js.map} +0 -0
- /package/dist/{chunk-7ZVFLC2V.js.map → chunk-DFHSLHXZ.js.map} +0 -0
- /package/dist/{chunk-2Y5C7GJS.js.map → chunk-E2JRANYL.js.map} +0 -0
- /package/dist/{chunk-CRH37PEV.js.map → chunk-FESRWKYY.js.map} +0 -0
- /package/dist/{chunk-DKAHHMKN.js.map → chunk-GMJSMF7P.js.map} +0 -0
- /package/dist/{chunk-ZH7JPYQE.js.map → chunk-HDPL53U4.js.map} +0 -0
- /package/dist/{chunk-ZVDOSFWU.js.map → chunk-HOCICSX4.js.map} +0 -0
- /package/dist/{chunk-4H4WJJ2G.js.map → chunk-HV3GD2F3.js.map} +0 -0
- /package/dist/{chunk-KPTPDZX2.js.map → chunk-IGVKT4CE.js.map} +0 -0
- /package/dist/{chunk-FYAY6D3O.js.map → chunk-IMKIDF2H.js.map} +0 -0
- /package/dist/{chunk-EQCVSUAF.js.map → chunk-ITKMNOLR.js.map} +0 -0
- /package/dist/{chunk-JQYPRW42.js.map → chunk-JABW3SRG.js.map} +0 -0
- /package/dist/{chunk-XJBSBIZ4.js.map → chunk-KDNYUHAH.js.map} +0 -0
- /package/dist/{chunk-SOCGXVIL.js.map → chunk-KSA3ND7Z.js.map} +0 -0
- /package/dist/{chunk-5ITKSTJX.js.map → chunk-LCRPBPKX.js.map} +0 -0
- /package/dist/{chunk-SZHFBRRT.js.map → chunk-NIZTWHGT.js.map} +0 -0
- /package/dist/{chunk-UJN2RH5R.js.map → chunk-OCC5HEPR.js.map} +0 -0
- /package/dist/{chunk-KZFVYDVK.js.map → chunk-OMIUJ7JT.js.map} +0 -0
- /package/dist/{chunk-K4IGOJPT.js.map → chunk-ONCG5AKF.js.map} +0 -0
- /package/dist/{chunk-C5IAIOCA.js.map → chunk-OW5LD7S2.js.map} +0 -0
- /package/dist/{chunk-CIRCVMWE.js.map → chunk-PY4QOYPK.js.map} +0 -0
- /package/dist/{chunk-NRP55BOF.js.map → chunk-Q3QY7QGU.js.map} +0 -0
- /package/dist/{chunk-3P74DH6P.js.map → chunk-RL3IRMOA.js.map} +0 -0
- /package/dist/{chunk-XIBY5I6F.js.map → chunk-SCOFWMSE.js.map} +0 -0
- /package/dist/{chunk-KW7MKBGF.js.map → chunk-SMOHPEMJ.js.map} +0 -0
- /package/dist/{chunk-3O6XFPUB.js.map → chunk-SNL7MSZD.js.map} +0 -0
- /package/dist/{chunk-TPVHGI7Q.js.map → chunk-SP7HDNXC.js.map} +0 -0
- /package/dist/{chunk-4KY4XKJV.js.map → chunk-UILBQKQ6.js.map} +0 -0
- /package/dist/{chunk-TOYMIFHN.js.map → chunk-UTNJA7JC.js.map} +0 -0
- /package/dist/{chunk-YMP4YKBN.js.map → chunk-VJCJCDFI.js.map} +0 -0
- /package/dist/{chunk-IIT367QZ.js.map → chunk-VSSZJHOR.js.map} +0 -0
- /package/dist/{chunk-XZ4M3QAV.js.map → chunk-W2WOZNEN.js.map} +0 -0
- /package/dist/{chunk-V2DU2OXH.js.map → chunk-WJTRQ3ZC.js.map} +0 -0
- /package/dist/{chunk-4USLEUNR.js.map → chunk-X4QQRHFB.js.map} +0 -0
- /package/dist/{chunk-JQT67SWE.js.map → chunk-Y2UCJ33M.js.map} +0 -0
- /package/dist/{chunk-3PPCZPLN.js.map → chunk-Y45RZL4F.js.map} +0 -0
- /package/dist/{chunk-ECIBJXFT.js.map → chunk-Z2TA7NML.js.map} +0 -0
- /package/dist/{chunk-C2JHLAKV.js.map → chunk-Z7U74YGW.js.map} +0 -0
- /package/dist/{chunk-FXS4I3Z3.js.map → chunk-ZKMBNB5E.js.map} +0 -0
- /package/dist/{chunk-M77DCLJX.js.map → chunk-ZPBG6CT3.js.map} +0 -0
- /package/dist/{chunk-X7KRSZQT.js.map → chunk-ZUDSOVYT.js.map} +0 -0
- /package/dist/{cohort-CEYVJJ7E.js.map → cohort-R743ZSCR.js.map} +0 -0
- /package/dist/{condition-QSOFP4MY.js.map → condition-MPZIRRGP.js.map} +0 -0
- /package/dist/{controls-QYHARIEY.js.map → controls-WD5TZITZ.js.map} +0 -0
- /package/dist/{controls.btns-AP67YWKW.js.map → controls.btns-KCLXBXSL.js.map} +0 -0
- /package/dist/{controls.config-3OO3JK6E.js.map → controls.config-577UCREO.js.map} +0 -0
- /package/dist/{correlation-TOI3TMYL.js.map → correlation-OCFBDDOX.js.map} +0 -0
- /package/dist/{cuminc.integration.spec-LSWV3KOF.js.map → cuminc.integration.spec-V46K57GV.js.map} +0 -0
- /package/dist/{customdata.inputui-VMB3HSSC.js.map → customdata.inputui-2MS5ZRKC.js.map} +0 -0
- /package/dist/{dataDownload.integration.spec-J6FRFLBK.js.map → dataDownload.integration.spec-TEOJOMYK.js.map} +0 -0
- /package/dist/{databrowser.ui-GVYWG6YI.js.map → databrowser.ui-PDPFHOH7.js.map} +0 -0
- /package/dist/{dictionary-GD67R72W.js.map → dictionary-MWUQYW6W.js.map} +0 -0
- /package/dist/{dnaMethylation-S7OSGLAF.js.map → dnaMethylation-SNVVE2MD.js.map} +0 -0
- /package/dist/{dnaMethylation.integration.spec-ETMMJNDE.js.map → dnaMethylation.integration.spec-OSYZ3YDP.js.map} +0 -0
- /package/dist/{dofetch-7GURQS65.js.map → dofetch-7R7PL4BX.js.map} +0 -0
- /package/dist/{e2pca-ZIIPBJFN.js.map → e2pca-7FYIWR5O.js.map} +0 -0
- /package/dist/{ep-A2HAL5WA.js.map → ep-PTAJZLKI.js.map} +0 -0
- /package/dist/{expclust.gdc.spec-ZSILLYNI.js.map → expclust.gdc.spec-2R7T7JPY.js.map} +0 -0
- /package/dist/{gb-C3MPQXKN.js.map → gb-5UFIDQWY.js.map} +0 -0
- /package/dist/{geneExpClustering-HYCFUUTU.js.map → geneExpClustering-QLBETGVB.js.map} +0 -0
- /package/dist/{geneExpression-JXSAP2H7.js.map → geneExpression-SAMLSOHQ.js.map} +0 -0
- /package/dist/{geneExpression-GATKMJJ5.js.map → geneExpression-SECTPIDT.js.map} +0 -0
- /package/dist/{geneExpression.unit.spec-CODZYFHZ.js.map → geneExpression.unit.spec-UNRGPJIG.js.map} +0 -0
- /package/dist/{geneORA-LJRIR4VV.js.map → geneORA-CCQGE7QL.js.map} +0 -0
- /package/dist/{geneRanking-TWLBKQZG.js.map → geneRanking-NVR7ZZIP.js.map} +0 -0
- /package/dist/{geneVariant-35RQHTCK.js.map → geneVariant-5KL2J3NA.js.map} +0 -0
- /package/dist/{geneVariant-TMJJIMUF.js.map → geneVariant-72E5YEPJ.js.map} +0 -0
- /package/dist/{geneVariant.integration.spec-FIQ7IBSD.js.map → geneVariant.integration.spec-7JLVYF7Q.js.map} +0 -0
- /package/dist/{genefusion.ui-SOBESSNO.js.map → genefusion.ui-M3IG6NUU.js.map} +0 -0
- /package/dist/{geneset-JXEJFEK2.js.map → geneset-V2535XGY.js.map} +0 -0
- /package/dist/{genomeBrowser.spec-25ZO5S2X.js.map → genomeBrowser.spec-TRREAQCH.js.map} +0 -0
- /package/dist/{grin2-CW4RPVPI.js.map → grin2-6X5GCPBQ.js.map} +0 -0
- /package/dist/{grin2-EI5BVP4E.js.map → grin2-GOO7H3RC.js.map} +0 -0
- /package/dist/{hierCluster-OBBPQH24.js.map → hierCluster-5YZOCCTV.js.map} +0 -0
- /package/dist/{hierCluster-SDH3TJQY.js.map → hierCluster-ZPQCUSVO.js.map} +0 -0
- /package/dist/{hierCluster.config-DO67TCXI.js.map → hierCluster.config-T3Y2LS6V.js.map} +0 -0
- /package/dist/{hierCluster.integration.spec-EB24C4VZ.js.map → hierCluster.integration.spec-PTXVQH77.js.map} +0 -0
- /package/dist/{hierCluster.interactivity-LGEAFT5T.js.map → hierCluster.interactivity-JNBO3MJB.js.map} +0 -0
- /package/dist/{importPlot-R2WRZGZU.js.map → importPlot-CWMBFQDD.js.map} +0 -0
- /package/dist/{isoformExpression-KI3WY5M3.js.map → isoformExpression-ABPY2N3A.js.map} +0 -0
- /package/dist/{isoformExpression.unit.spec-OQRG2DDU.js.map → isoformExpression.unit.spec-KRAZBQVF.js.map} +0 -0
- /package/dist/{junction-6SWFPNM5.js.map → junction-XGCBNVHV.js.map} +0 -0
- /package/dist/{junction.unit.spec-5TZFITSU.js.map → junction.unit.spec-XZFUJRI3.js.map} +0 -0
- /package/dist/{launch.adhoc-HCX2RQLB.js.map → launch.adhoc-7FJD3XSI.js.map} +0 -0
- /package/dist/{leftlabel.sample-OI6XCXTQ.js.map → leftlabel.sample-VPOZWRVY.js.map} +0 -0
- /package/dist/{lollipop-SOSOYHYL.js.map → lollipop-WBOAFWWO.js.map} +0 -0
- /package/dist/{maftimeline-UOMLYUNI.js.map → maftimeline-UK4MQP2D.js.map} +0 -0
- /package/dist/{matrix-5QWDN6SI.js.map → matrix-AT2FFTWO.js.map} +0 -0
- /package/dist/{matrix-SKPVVDVR.js.map → matrix-AU6NPNID.js.map} +0 -0
- /package/dist/{matrix.config-HE64MAL4.js.map → matrix.config-VTQ6HL5L.js.map} +0 -0
- /package/dist/{matrix.data-HTUZXQAM.js.map → matrix.data-DBYXSWIN.js.map} +0 -0
- /package/dist/{matrix.dom-F7AN3QGE.js.map → matrix.dom-DDPSUNY2.js.map} +0 -0
- /package/dist/{matrix.integration.spec-YKJ4LZFY.js.map → matrix.integration.spec-NJ2AXQAS.js.map} +0 -0
- /package/dist/{matrix.interactivity-YB5G5W5T.js.map → matrix.interactivity-HE2Q6SAO.js.map} +0 -0
- /package/dist/{matrix.layout-MFG65V7K.js.map → matrix.layout-FD5BPRCX.js.map} +0 -0
- /package/dist/{matrix.renderers-PCZFHDDZ.js.map → matrix.renderers-DVM4NB2R.js.map} +0 -0
- /package/dist/{matrix.sort.unit.spec-GEAM5DSU.js.map → matrix.sort.unit.spec-VQ3TR4S2.js.map} +0 -0
- /package/dist/{matrix.sorterUi-YSKIX6B6.js.map → matrix.sorterUi-4KYRGJT5.js.map} +0 -0
- /package/dist/{matrix.sorterUi.unit.spec-2MW64QS5.js.map → matrix.sorterUi.unit.spec-IEHG3OKN.js.map} +0 -0
- /package/dist/{mavb-YMHJXCGA.js.map → mavb-RPRKXPTZ.js.map} +0 -0
- /package/dist/{mds.fimo-PTEDRMLQ.js.map → mds.fimo-PZCVBD44.js.map} +0 -0
- /package/dist/{mds.samplescatterplot-7R7PLVQJ.js.map → mds.samplescatterplot-236GTHM4.js.map} +0 -0
- /package/dist/{mds.survivalplot-F3EENMFQ.js.map → mds.survivalplot-IJHOWSZL.js.map} +0 -0
- /package/dist/{oncomatrix-27VVSMZB.js.map → oncomatrix-R4OKDXSV.js.map} +0 -0
- /package/dist/{oncomatrix.spec-F43Y7CWN.js.map → oncomatrix.spec-4Z4HKS44.js.map} +0 -0
- /package/dist/{plot.2dvaf-MYFQSWIA.js.map → plot.2dvaf-ZK7DAKRQ.js.map} +0 -0
- /package/dist/{plot.app-36QWCKXR.js.map → plot.app-J66BA2LD.js.map} +0 -0
- /package/dist/{plot.barplot-535EP7XT.js.map → plot.barplot-UVRVPOKA.js.map} +0 -0
- /package/dist/{plot.boxplot-6IBP7VEB.js.map → plot.boxplot-DQGBDNLU.js.map} +0 -0
- /package/dist/{plot.brainImaging-M4HPNXZH.js.map → plot.brainImaging-WRMDYYHC.js.map} +0 -0
- /package/dist/{plot.disco-HIT6GR44.js.map → plot.disco-SSGPSM7W.js.map} +0 -0
- /package/dist/{plot.dzi-W66SBKTH.js.map → plot.dzi-F77KKPIJ.js.map} +0 -0
- /package/dist/{plot.ssgq-MI2OMCUY.js.map → plot.ssgq-FVFJOYVO.js.map} +0 -0
- /package/dist/{plot.vaf2cov-F4CBMLRA.js.map → plot.vaf2cov-CJSYBSPQ.js.map} +0 -0
- /package/dist/{plot.wsi-7M5KTNFC.js.map → plot.wsi-OSZU2PQ5.js.map} +0 -0
- /package/dist/{polar2-7VSWGT4U.js.map → polar2-R4ZKXKEV.js.map} +0 -0
- /package/dist/{profilePlot-ECTPPVB2.js.map → profilePlot-JU7SFYYY.js.map} +0 -0
- /package/dist/{proteinView-6ELOLOIU.js.map → proteinView-VU4SVO5I.js.map} +0 -0
- /package/dist/{proteomeCohortCompare-V2FMWI62.js.map → proteomeCohortCompare-2U537GOK.js.map} +0 -0
- /package/dist/{pseudbulk.unit.spec-KV6URTXC.js.map → pseudbulk.unit.spec-2FDKAEVI.js.map} +0 -0
- /package/dist/{pseudobulk-6ZRFCE65.js.map → pseudobulk-5GBUBBOY.js.map} +0 -0
- /package/dist/{qualitative-3B62RUOB.js.map → qualitative-3FTEQ7JW.js.map} +0 -0
- /package/dist/{radar2-4QQER64E.js.map → radar2-EBOTTAMC.js.map} +0 -0
- /package/dist/{radarFacility2-MZKORRDY.js.map → radarFacility2-PAGNJR6D.js.map} +0 -0
- /package/dist/{regression-GZ2YNX6Y.js.map → regression-XOVSVC7S.js.map} +0 -0
- /package/dist/{regression.inputs-ZEFDNSVT.js.map → regression.inputs-LGA67ESO.js.map} +0 -0
- /package/dist/{regression.inputs.term-O2FQBX7L.js.map → regression.inputs.term-UCQKXC5D.js.map} +0 -0
- /package/dist/{regression.inputs.values.table-63BQKSZP.js.map → regression.inputs.values.table-2RRE7SMS.js.map} +0 -0
- /package/dist/{regression.integration.spec-KDHC3KDU.js.map → regression.integration.spec-BKM5UI7H.js.map} +0 -0
- /package/dist/{regression.results-5J3QM4RX.js.map → regression.results-T3HB6CBH.js.map} +0 -0
- /package/dist/{regression.spec-WZAZTDDA.js.map → regression.spec-W7IVCYVZ.js.map} +0 -0
- /package/dist/{render-MZTEXVU5.js.map → render-2C6LWNG2.js.map} +0 -0
- /package/dist/{report-M5TYHH2W.js.map → report-HRGU3XKL.js.map} +0 -0
- /package/dist/{sampleView-QYTLYJEW.js.map → sampleView-P5JZHEKY.js.map} +0 -0
- /package/dist/{samplelst-FN3Q7M7A.js.map → samplelst-OYQ6BASU.js.map} +0 -0
- /package/dist/{samplematrix-Z5FVODO7.js.map → samplematrix-JC3SGO5V.js.map} +0 -0
- /package/dist/{sc-4CHP5SYP.js.map → sc-FTHUNDGY.js.map} +0 -0
- /package/dist/{scatter-UOPJYXL3.js.map → scatter-WYP2NPNB.js.map} +0 -0
- /package/dist/{selectGenomeWithTklst-WMAHGT4F.js.map → selectGenomeWithTklst-CIETKILP.js.map} +0 -0
- /package/dist/{singleCellCellType-XPWENB6V.js.map → singleCellCellType-3O3TTLM6.js.map} +0 -0
- /package/dist/{singleCellCellType.unit.spec-QK56PHKW.js.map → singleCellCellType.unit.spec-GHBS36DB.js.map} +0 -0
- /package/dist/{singleCellGeneExpression-4CEVDVYF.js.map → singleCellGeneExpression-2F7F4EKK.js.map} +0 -0
- /package/dist/{singleCellGeneExpression.unit.spec-ZYRLBVF5.js.map → singleCellGeneExpression.unit.spec-2VGIH2NZ.js.map} +0 -0
- /package/dist/{singleCellPlot-JS74VUGC.js.map → singleCellPlot-MGSS4O3L.js.map} +0 -0
- /package/dist/{singlecell-OO77XBDD.js.map → singlecell-CKC2VVJ3.js.map} +0 -0
- /package/dist/{singlecell-5XYOHMWJ.js.map → singlecell-QOXATRF4.js.map} +0 -0
- /package/dist/{snp-X5ZILM5J.js.map → snp-OSYJO2R7.js.map} +0 -0
- /package/dist/{snp.unit.spec-V23G3JLJ.js.map → snp.unit.spec-L5ANPFO2.js.map} +0 -0
- /package/dist/{snplocus-U5UIIUWR.js.map → snplocus-64MJJID2.js.map} +0 -0
- /package/dist/{spliceevent.a53ss.diagram-YDFVSDMT.js.map → spliceevent.a53ss.diagram-LHRT5UPB.js.map} +0 -0
- /package/dist/{spliceevent.exonskip.diagram-VDKN5JBE.js.map → spliceevent.exonskip.diagram-BGSEPGR5.js.map} +0 -0
- /package/dist/{spliceevent.noeventdiagram-EFPFRUFI.js.map → spliceevent.noeventdiagram-QGZZSKW7.js.map} +0 -0
- /package/dist/{ssGSEA-LKJW5OQK.js.map → ssGSEA-VVAZDFDT.js.map} +0 -0
- /package/dist/{ssGSEA.unit.spec-7WCZVEP2.js.map → ssGSEA.unit.spec-LP76RHTV.js.map} +0 -0
- /package/dist/{studyCatalog-EU33KE5H.js.map → studyCatalog-AXWH7IOH.js.map} +0 -0
- /package/dist/{summarizeCnvGeneexp-QL25OQNB.js.map → summarizeCnvGeneexp-DRBIXOAP.js.map} +0 -0
- /package/dist/{summarizeGeneexpSurvival-B7HTCH7L.js.map → summarizeGeneexpSurvival-4PATAUSN.js.map} +0 -0
- /package/dist/{summarizeMutationCnv-DFAPX2JE.js.map → summarizeMutationCnv-UGSIGZDJ.js.map} +0 -0
- /package/dist/{summarizeMutationDiagnosis-HCSDSVII.js.map → summarizeMutationDiagnosis-UATVI5BK.js.map} +0 -0
- /package/dist/{summarizeMutationSurvival-6WEASSA2.js.map → summarizeMutationSurvival-CZXGM3AA.js.map} +0 -0
- /package/dist/{summary-BWYXE77G.js.map → summary-IGTXNQ5I.js.map} +0 -0
- /package/dist/{summary.integration.spec-AVGSW5MF.js.map → summary.integration.spec-VFCYU2V6.js.map} +0 -0
- /package/dist/{summaryInput-MOQ6HUCX.js.map → summaryInput-AFZSASTM.js.map} +0 -0
- /package/dist/{sunburst-EZDHVJCL.js.map → sunburst-G7DBI637.js.map} +0 -0
- /package/dist/{survival-IEVELTC4.js.map → survival-YOJBLMR2.js.map} +0 -0
- /package/dist/{survival.integration.spec-HHWP3R4H.js.map → survival.integration.spec-FXPCZJSS.js.map} +0 -0
- /package/dist/{svgraph-55XRIYJW.js.map → svgraph-ZSSOWI7R.js.map} +0 -0
- /package/dist/{svmr-CMEBFSRO.js.map → svmr-FPYSMXSC.js.map} +0 -0
- /package/dist/{termCollection-CPQXYBFA.js.map → termCollection-IY5V64IY.js.map} +0 -0
- /package/dist/{termCollection-ZWOH273K.js.map → termCollection-SR4SP6RZ.js.map} +0 -0
- /package/dist/{termCollection.unit.spec-RK7VATLU.js.map → termCollection.unit.spec-NL72AQ2P.js.map} +0 -0
- /package/dist/{termCollectionFractionSelection-Z4ZRW63R.js.map → termCollectionFractionSelection-2LPBE224.js.map} +0 -0
- /package/dist/{termCollectionFractionSelection.unit.spec-3CS7DPNU.js.map → termCollectionFractionSelection.unit.spec-PUMGBUDN.js.map} +0 -0
- /package/dist/{termInfo-6MJDJSDW.js.map → termInfo-2DR7DHXM.js.map} +0 -0
- /package/dist/{tk-RHWJJXH2.js.map → tk-COBDWIZJ.js.map} +0 -0
- /package/dist/{tk-4NNTWWLK.js.map → tk-N2YBXDQK.js.map} +0 -0
- /package/dist/{tp.ui-DPN5UN6U.js.map → tp.ui-BMK2MMIJ.js.map} +0 -0
- /package/dist/{tvs.dt-ARPDFRVM.js.map → tvs.dt-KL4VCW5Y.js.map} +0 -0
- /package/dist/{tvs.dtcnv.categorical-POS6WQK6.js.map → tvs.dtcnv.categorical-VGXOASJE.js.map} +0 -0
- /package/dist/{tvs.dtcnv.continuous-5OETJ7JU.js.map → tvs.dtcnv.continuous-IANT7BPS.js.map} +0 -0
- /package/dist/{tvs.dtfusion-ERYVI3DW.js.map → tvs.dtfusion-M5HJWCJI.js.map} +0 -0
- /package/dist/{tvs.dtitd-KTZZYEWU.js.map → tvs.dtitd-KB72EDPN.js.map} +0 -0
- /package/dist/{tvs.dtsnvindel-TGUAX3RN.js.map → tvs.dtsnvindel-VGYTLO6E.js.map} +0 -0
- /package/dist/{tvs.dtsv-AM63OIL6.js.map → tvs.dtsv-KWUXW2F5.js.map} +0 -0
- /package/dist/{tvs.samplelst-VW2NOQ2C.js.map → tvs.samplelst-3UA7XMHJ.js.map} +0 -0
- /package/dist/{tvs.termCollection-O4ZSWJFA.js.map → tvs.termCollection-LK6CVGYZ.js.map} +0 -0
- /package/dist/{violin-ZQ3DEYGR.js.map → violin-D4EX3ZFV.js.map} +0 -0
- /package/dist/{violin.integration.spec-PVEF77HB.js.map → violin.integration.spec-GBW3VBHW.js.map} +0 -0
- /package/dist/{violin.interactivity-FYU4TCFO.js.map → violin.interactivity-N3JVI2AQ.js.map} +0 -0
- /package/dist/{violin.renderer-XAERGBMV.js.map → violin.renderer-2NYRUXUY.js.map} +0 -0
- /package/dist/{vocabulary-ECJX27W2.js.map → vocabulary-277KD4RO.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../plots/regression.inputs.term.js", "../plots/regression.inputs.js", "../plots/regression.js"],
|
|
4
|
+
"sourcesContent": ["import { termsettingInit, get$id } from '#termsetting'\nimport { isDictionaryType, get_bin_label, isNumericTerm, getValueConversionFactor, roundValue } from '#shared'\nimport { InputValuesTable } from './regression.inputs.values.table'\nimport { Menu } from '#dom'\nimport { select } from 'd3-selection'\nimport { mayRunSnplstTask } from '../termsetting/handlers/snplst.sampleSum.ts'\nimport { get_defaultQ4fillTW, isLoneOutcome } from './regression'\n\n/*\nclass instance is an input\n*/\n\nexport class InputTerm {\n\tconstructor(opts) {\n\t\t// opts { section, term, parent }\n\t\tthis.opts = opts\n\t\tthis.section = opts.section\n\t\tthis.term = opts.term // term wrapper {id, term, q}; will be missing for a blank input\n\t\tthis.parent = opts.parent // the inputs instance\n\t\t// the plot-scoped vocabApi from PlotBase, this.parent.parent is the regression plot\n\t\tthis.vocabApi = this.parent.parent.vocabApi\n\t}\n\n\tasync init(holder) {\n\t\t// only run once when a new input variable is added to the user interface via data/enter() in inputs.js\n\n\t\tconst termRow = holder.append('div')\n\t\t// the row contains two cells: left to show ts pill, right to show interaction\n\t\tconst pillDiv = termRow.append('span').style('display', 'inline-block')\n\t\tconst interactionDiv = termRow.append('span').style('margin-left', '20px')\n\n\t\tthis.dom = {\n\t\t\tholder,\n\t\t\ttermRow,\n\t\t\tpillDiv,\n\t\t\tinteractionDiv,\n\t\t\terr_div: holder\n\t\t\t\t.append('div')\n\t\t\t\t.style('display', 'none')\n\t\t\t\t.style('padding', '5px')\n\t\t\t\t.style('background-color', 'rgba(255,100,100,0.2)'),\n\t\t\tinfoDiv: holder.append('div'),\n\t\t\ttip: new Menu()\n\t\t}\n\n\t\ttry {\n\t\t\tconst { app, config, state, disable_terms } = this.parent\n\n\t\t\t// termsetting constructor option\n\t\t\tconst arg = {\n\t\t\t\tplaceholder: this.section.selectPrompt,\n\t\t\t\tplaceholderIcon: this.section.placeholderIcon,\n\t\t\t\tholder: this.dom.pillDiv,\n\t\t\t\tvocabApi: this.vocabApi,\n\t\t\t\tnoTermPromptOptions: this.opts.noTermPromptOptions,\n\t\t\t\tactiveCohort: state.activeCohort,\n\t\t\t\tdebug: app.opts.debug,\n\t\t\t\tmenuOptions: this.getMenuOptions(),\n\t\t\t\tusecase: { target: 'regression', detail: this.section.configKey, regressionType: config.regressionType },\n\t\t\t\tdisable_terms,\n\t\t\t\tabbrCutoff: 50,\n\t\t\t\tgenomeObj: this.parent.parent.genomeObj, // required for snplocus\n\t\t\t\tdefaultQ4fillTW: get_defaultQ4fillTW(config.regressionType, this.section.configKey),\n\t\t\t\tcallback: term => {\n\t\t\t\t\tthis.parent.editConfig(this, term)\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.furbishTsConstructorArg(arg)\n\t\t\t// use 'await' here because it is safer to assume that\n\t\t\t// termsettingInit() returns a promise, in case the Termsetting\n\t\t\t// class ever has an init() method as detected in rx/index.js\n\t\t\tthis.pill = await termsettingInit(arg)\n\n\t\t\tif (this.section.configKey == 'outcome') {\n\t\t\t\t// special treatment for terms selected for outcome\n\t\t\t\tthis.setQ = getQSetter4outcome(config.regressionType)\n\t\t\t}\n\n\t\t\tthis.valuesTable = new InputValuesTable({\n\t\t\t\tholder: this.dom.infoDiv,\n\t\t\t\tinput: this,\n\t\t\t\tcallback: term => {\n\t\t\t\t\tthis.parent.editConfig(this, term)\n\t\t\t\t}\n\t\t\t})\n\t\t} catch (e) {\n\t\t\tthis.displayError([e])\n\t\t}\n\t}\n\n\tfurbishTsConstructorArg(arg) {\n\t\t// furbish termsetting constructor argument, based on regression type and if term is outcome/input\n\t\tconst type = this.parent.config.regressionType\n\t\tif (this.section.configKey == 'outcome') {\n\t\t\t// this term is outcome\n\t\t\tif (type == 'logistic') {\n\t\t\t\targ.numericEditMenuVersion = ['binary']\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (type == 'linear') {\n\t\t\t\targ.numericEditMenuVersion = ['continuous']\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (type == 'cox') {\n\t\t\t\t//arg.showTimeScale = true\n\t\t\t\treturn\n\t\t\t}\n\t\t\tthrow 'unknown regressionType'\n\t\t}\n\t\tif (this.section.configKey == 'independent') {\n\t\t\t// this temr is independent\n\t\t\t// do not allow condition term\n\t\t\targ.numericEditMenuVersion = ['continuous', 'discrete', 'spline']\n\t\t\t// for geneVariant term, only allow groupsetting\n\t\t\targ.geneVariantEditMenuOnlyGrp = true\n\t\t\treturn\n\t\t}\n\t\tthrow 'unknown section.configKey: ' + this.section.configKey\n\t}\n\n\tdisplayError(errors) {\n\t\tthis.hasError = true\n\t\tthis.dom.err_div.selectAll('*').remove()\n\t\tthis.dom.err_div\n\t\t\t.style('display', 'block')\n\t\t\t.selectAll('div')\n\t\t\t.data(Array.isArray(errors) ? errors : [errors])\n\t\t\t.enter()\n\t\t\t.append('div')\n\t\t\t.text(e => e)\n\t\tthis.parent.handleError()\n\t\tconsole.error(errors)\n\t}\n\n\tasync main() {\n\t\t/* called in inputs.main()\n\t\twhen the regression component is notified of a change\n\t\t*/\n\n\t\tconst tw = this.term // term wrapper\n\n\t\t// clear previous errors\n\t\tif (tw) {\n\t\t\t// a term has been selected\n\t\t\tdelete tw.error\n\t\t}\n\n\t\tthis.dom.err_div.style('display', 'none').text('')\n\t\tthis.hasError = false\n\n\t\tconst errors = []\n\t\ttry {\n\t\t\tif (tw && this.setQ) {\n\t\t\t\tconst { app, state } = this.parent\n\t\t\t\tawait this.setQ[tw.term.type](tw, this.vocabApi, this.parent.parent.filter, state)\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait this.updateTerm()\n\t\t\t} catch (e) {\n\t\t\t\t// will allow pill to update to a new term as needed,\n\t\t\t\t// so that the rendered pill and values table match the error message\n\t\t\t\terrors.push(e)\n\t\t\t}\n\t\t\tawait this.pill.main(this.getPillArgs())\n\t\t\tthis.renderInteractionPrompt()\n\t\t\tawait this.valuesTable.main()\n\t\t\t// $id needs to be filled in here for non-dictionary terms\n\t\t\t// TODO: should have a centralized location for filling in\n\t\t\t// $id for non-dictionary terms\n\t\t\tif (tw && !tw.$id) tw.$id = await get$id(this.vocabApi.getTwMinCopy(tw))\n\t\t\tconst e = (tw && tw.error) || this.pill.error\n\t\t\tif (e) errors.push(e)\n\t\t\tif (errors.length) throw errors\n\t\t} catch (errors) {\n\t\t\tthis.displayError(errors)\n\t\t}\n\t}\n\n\tasync updateTerm() {\n\t\t/*\n\t\tonly used in this.main() above\n\t\tto derive bins/groups based on q{} setting of this term\n\t\tcreate following attributes:\n\n\t\tinput.orderedLabels\n\t\tinput.termStatus{ sampleCounts, excludeCounts }\n\t\tinput.term.refGrp\n\t\t*/\n\t\tconst tw = this.term\n\t\tif (!tw) return\n\n\t\tif (!tw.q) throw '.term.q missing on this input'\n\n\t\tif (!tw.q.mode && isDictionaryType(tw.term.type)) {\n\t\t\t// fill in q.mode for dictionary terms\n\t\t\tif (\n\t\t\t\ttw.term.type == 'categorical' ||\n\t\t\t\ttw.term.type == 'condition' ||\n\t\t\t\ttw.term.type == 'survival' ||\n\t\t\t\ttw.term.type == 'samplelst'\n\t\t\t)\n\t\t\t\ttw.q.mode = 'discrete'\n\t\t\telse tw.q.mode = 'continuous'\n\t\t}\n\n\t\t// need to supply tw.q in body, otherwise getCategories() will\n\t\t// generate a default .q for the term\n\t\tconst body = tw.term.type == 'snplst' || tw.term.type == 'snplocus' ? { cacheid: tw.q.cacheid } : { term1_q: tw.q }\n\n\t\t// get term categories\n\t\tconst wait = this.dom.holder.append('div').style('padding', '5px').text('Loading...') // getCategories may wait long time e.g. gdc. adding this to indicate its loading to avoid just showing a nopill prompt\n\t\tlet data\n\t\ttry {\n\t\t\tdata = await this.vocabApi.getCategories(tw.term, this.parent.parent.filter, body)\n\t\t\tif (!data) throw `no data for term.id='${tw.term.id}'`\n\t\t\tif (data.error) throw data.error\n\t\t} finally {\n\t\t\twait.remove()\n\t\t}\n\n\t\tmayRunSnplstTask(tw, data)\n\n\t\tthis.termStatus = {\n\t\t\ttopInfoStatus: [],\n\t\t\tbottomSummaryStatus: undefined,\n\t\t\tsampleCounts: undefined,\n\t\t\texcludeCounts: undefined,\n\t\t\tallowToSelectRefGrp: false\n\t\t}\n\n\t\t// update status based on special attr from snplst and snplocus terms\n\t\tif (tw.q.numOfSampleWithAnyValidGT) {\n\t\t\tconst invalid_snps_count = tw.term.snps.reduce((i, j) => i + (j.invalid ? 1 : 0), 0)\n\t\t\tthis.termStatus.topInfoStatus.push(\n\t\t\t\t`${tw.q.numOfSampleWithAnyValidGT} samples with valid genotypes` +\n\t\t\t\t\t(invalid_snps_count > 0 ? ` ${invalid_snps_count} invalid SNP${invalid_snps_count > 1 ? 's' : ''}.` : '')\n\t\t\t)\n\t\t}\n\t\tif ('geneticModel' in tw.q) {\n\t\t\tthis.termStatus.topInfoStatus.push(\n\t\t\t\t'Genetic model: ' +\n\t\t\t\t\t(tw.q.geneticModel == 0\n\t\t\t\t\t\t? 'Additive'\n\t\t\t\t\t\t: tw.q.geneticModel == 1\n\t\t\t\t\t\t? 'Dominant'\n\t\t\t\t\t\t: tw.q.geneticModel == 2\n\t\t\t\t\t\t? 'Recessive'\n\t\t\t\t\t\t: 'By genotype')\n\t\t\t)\n\t\t}\n\t\tif (tw.q.restrictAncestry) {\n\t\t\tthis.termStatus.topInfoStatus.push('Analyzing ' + tw.q.restrictAncestry.name)\n\t\t\tif (tw.q.restrictAncestry.PCcount) {\n\t\t\t\tthis.termStatus.topInfoStatus.push(\n\t\t\t\t\t`Adjusting for top ${tw.q.restrictAncestry.PCcount} ancestry principal components`\n\t\t\t\t)\n\t\t\t}\n\t\t}\n\t\tif (tw.term.reachedVariantLimit) {\n\t\t\tthis.termStatus.topInfoStatus.push(\n\t\t\t\t`<span class=sja_mcdot style=\"background:#aaa;font-size:1em\">\n\t\t\t\t ⚠ Restricted to first ${tw.term.snps.length}\n\t\t\t\tvariants of this region. </span> Try zooming in.`\n\t\t\t)\n\t\t}\n\n\t\tthis.orderedLabels = data.orderedLabels\n\n\t\tif (data.lst) {\n\t\t\t// got sample counts for dictionary terms\n\n\t\t\tthis.summarizeSample(tw, data.lst)\n\n\t\t\tif (isNumericTerm(tw.term)) {\n\t\t\t\tif (tw.q.mode != 'continuous' && tw.q.mode != 'spline') {\n\t\t\t\t\tthis.termStatus.allowToSelectRefGrp = true\n\t\t\t\t}\n\t\t\t\tif (tw.q.scale && tw.q.scale != 1) this.termStatus.topInfoStatus.push(`Scale: Per ${tw.q.scale}`)\n\t\t\t\tif (tw.q.mode == 'discrete') {\n\t\t\t\t\tthis.termStatus.topInfoStatus.push(`Discrete variable with ${this.termStatus.sampleCounts.length} bins`)\n\t\t\t\t}\n\t\t\t\t/* continuous and spline modes are analyzed in the term's converted unit\n\t\t\t\t(see makeRinput() in server/src/routes/termdb.regression.ts), so report the unit\n\t\t\t\tand print the knots by it, rather than by the unit the values are stored in */\n\t\t\t\tconst vc = tw.term.valueConversion\n\t\t\t\tconst isConverted = vc && (tw.q.mode == 'continuous' || tw.q.mode == 'spline')\n\t\t\t\tif (isConverted) {\n\t\t\t\t\tthis.termStatus.topInfoStatus.push(`Analyzed by the unit of ${vc.toUnit}, converted from ${vc.fromUnit}`)\n\t\t\t\t}\n\t\t\t\tif (tw.q.mode == 'spline') {\n\t\t\t\t\tconst f = getValueConversionFactor(tw.term)\n\t\t\t\t\tthis.termStatus.topInfoStatus.push(\n\t\t\t\t\t\t`Cubic spline variable with ${tw.q.knots.length} knots: ${tw.q.knots\n\t\t\t\t\t\t\t.map(x => Number(x.value) * f)\n\t\t\t\t\t\t\t.sort((a, b) => a - b)\n\t\t\t\t\t\t\t.map(v => (f == 1 ? v : roundValue(v, 2)))\n\t\t\t\t\t\t\t.join(', ')}${isConverted ? ` ${vc.toUnit}s` : ''}`\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t} else if (tw.term.type == 'categorical' || tw.term.type == 'geneVariant' || tw.term.type == 'samplelst') {\n\t\t\t\tthis.termStatus.allowToSelectRefGrp = true\n\t\t\t} else if (tw.term.type == 'condition') {\n\t\t\t\tif (this.section.configKey == 'outcome' && this.parent.opts.regressionType == 'logistic') {\n\t\t\t\t\t// allow selecting refgrp\n\t\t\t\t\tthis.termStatus.allowToSelectRefGrp = true\n\t\t\t\t}\n\t\t\t\tif (this.section.configKey == 'outcome' && this.parent.opts.regressionType == 'cox') {\n\t\t\t\t\tif (!['age', 'time'].includes(tw.q.timeScale)) throw 'invalid q.timeScale'\n\t\t\t\t\tconst tdb = this.vocabApi.termdbConfig\n\n\t\t\t\t\tthis.termStatus.topInfoStatus.push(`Time axis: ${tw.q.timeScale == 'time' ? tdb.timeUnit : 'age'}`)\n\n\t\t\t\t\tthis.termStatus.topInfoStatus.push(\n\t\t\t\t\t\t`<span style=\"padding-left: 10px;\">-start: ${\n\t\t\t\t\t\t\ttw.q.timeScale == 'time' ? ' ' : 'age at '\n\t\t\t\t\t\t}entry into the cohort (i.e., ${tdb.cohortStartTimeMsg})</span>`\n\t\t\t\t\t)\n\n\t\t\t\t\tthis.termStatus.topInfoStatus.push(\n\t\t\t\t\t\t`<span style=\"padding-left: 10px;\">-end: ${\n\t\t\t\t\t\t\ttw.q.timeScale == 'time' ? ' ' : 'age at '\n\t\t\t\t\t\t}event or censoring/death</span>`\n\t\t\t\t\t)\n\n\t\t\t\t\tconst grades = Object.keys(tw.term.values).map(Number)\n\t\t\t\t\tconst maxgrade = Math.max(...grades)\n\t\t\t\t\tthis.termStatus.topInfoStatus.push(\n\t\t\t\t\t\t`<div style=\"padding-top: 8px;\">Event: first occurrence of grade ${\n\t\t\t\t\t\t\ttw.q.breaks[0] === maxgrade ? tw.q.breaks[0] : `${tw.q.breaks[0]}-${maxgrade}</div>`\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\tthis.maySet_refGrp(tw)\n\t\t\tif (this.section.configKey == 'outcome') {\n\t\t\t\tif (this.parent.config.regressionType == 'logistic') {\n\t\t\t\t\t// get non-ref group of logistic outcome variable\n\t\t\t\t\t// will be used in tooltip messages of coefficients table\n\t\t\t\t\t// and in Y axis of cubic spline plot\n\t\t\t\t\ttw.nonRefGrp = getLogisticOutcomeNonref(tw)\n\t\t\t\t} else if (this.parent.config.regressionType == 'cox') {\n\t\t\t\t\t// get event label of cox outcome variable\n\t\t\t\t\t// will be used in tooltip messages of coefficients table\n\t\t\t\t\ttw.eventLabel = getCoxOutcomeEventLabel(tw)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tsummarizeSample(tw, datalst) {\n\t\t// sepeate include and exclude categories based on term.values.uncomputable\n\t\tconst excluded_values = new Set()\n\t\tif (tw.term.values) {\n\t\t\tfor (const i in tw.term.values) {\n\t\t\t\tif (tw.term.values[i].uncomputable) excluded_values.add(tw.term.values[i].label)\n\t\t\t}\n\t\t}\n\t\tif (tw.q.mode == 'cox') {\n\t\t\tconst toExclude = datalst.find(x => x.key == -1)\n\t\t\tif (toExclude) excluded_values.add(toExclude.label)\n\t\t}\n\t\tconst sampleCounts = (this.termStatus.sampleCounts = datalst.filter(v => !excluded_values.has(v.label)))\n\t\tconst excludeCounts = (this.termStatus.excludeCounts = datalst.filter(v => excluded_values.has(v.label)))\n\n\t\t// get include, excluded and total sample count\n\t\tconst totalCount = { included: 0, excluded: 0, total: 0 }\n\t\tsampleCounts.forEach(v => (totalCount.included += v.samplecount))\n\t\texcludeCounts.forEach(v => (totalCount.excluded += v.samplecount))\n\t\ttotalCount.total = totalCount.included + totalCount.excluded\n\t\t// for condition term, subtract included count from totalCount.total to get excluded\n\t\tif (tw.term.type == 'condition' && totalCount.total) {\n\t\t\ttotalCount.excluded = totalCount.total - totalCount.included\n\t\t}\n\t\t// update bottomSummaryStatus\n\t\tthis.termStatus.bottomSummaryStatus =\n\t\t\t`${totalCount.included} samples included` +\n\t\t\t(totalCount.excluded ? `. ${totalCount.excluded} samples excluded:` : '')\n\t\tif (tw && tw.q.mode !== 'continuous' && sampleCounts.length < 2)\n\t\t\tthrow `there should be two or more discrete values with samples for variable='${tw.term.name}'`\n\t}\n\n\tmaySet_refGrp(tw) {\n\t\tif (this.section.configKey == 'outcome' && this.parent.config.regressionType == 'cox') {\n\t\t\t// no need to set refgrp\n\t\t\treturn\n\t\t}\n\t\tif (tw.q.mode == 'continuous') {\n\t\t\t// numeric term in continuous mode, refgrp NA is hardcoded in R\n\t\t\ttw.refGrp = 'NA'\n\t\t\treturn\n\t\t}\n\t\tconst sc = this.termStatus.sampleCounts\n\t\tif (!('refGrp' in tw) || !sc.find(i => i.key == tw.refGrp)) {\n\t\t\t// refGrp not defined or no longer exists according to sampleCounts[]\n\t\t\tif (tw.term.type == 'geneVariant') {\n\t\t\t\t// for a gene variant term, the wildtype group is the natural reference,\n\t\t\t\t// use it when available rather than falling back to the biggest group\n\t\t\t\tconst wtGrp = getGeneVariantWildtypeGrp(tw, sc)\n\t\t\t\tif (wtGrp) {\n\t\t\t\t\ttw.refGrp = wtGrp\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst o = this.orderedLabels\n\t\t\tif (o && o.length) sc.sort((a, b) => o.indexOf(a.key) - o.indexOf(b.key))\n\t\t\telse sc.sort((a, b) => (a.samplecount < b.samplecount ? 1 : -1))\n\t\t\ttw.refGrp = sc[0].key\n\t\t}\n\t}\n\n\t/*\n\trecomputed on every main() and not just at init(), since switching cohort can change whether the\n\toutcome term is the only one this dataset offers\n\t*/\n\tgetMenuOptions() {\n\t\tconst { config, state } = this.parent\n\t\tif (this.section.configKey != 'outcome') return '{edit,reuse,remove}'\n\t\t// an outcome cannot be removed, only replaced; and when there is nothing to replace it with,\n\t\t// hide the option rather than opening a term tree with a single, already selected term\n\t\treturn isLoneOutcome(config.regressionType, this.vocabApi.termdbConfig, state.activeCohort)\n\t\t\t? '{edit,reuse}'\n\t\t\t: '{edit,reuse,replace}'\n\t}\n\n\tgetPillArgs() {\n\t\tconst section = this.section\n\t\tconst { config, state, disable_terms } = this.parent\n\t\tconst args = Object.assign(\n\t\t\t{\n\t\t\t\tactiveCohort: state.activeCohort,\n\t\t\t\tdisable_terms,\n\t\t\t\tmenuOptions: this.getMenuOptions(),\n\t\t\t\tusecase: {\n\t\t\t\t\ttarget: 'regression',\n\t\t\t\t\tdetail: section.configKey,\n\t\t\t\t\tregressionType: config.regressionType\n\t\t\t\t}\n\t\t\t},\n\t\t\tthis.term\n\t\t)\n\t\targs.filter = this.parent.parent.filter\n\t\treturn args\n\t}\n\n\tremove() {\n\t\tthis.dom.termRow.transition().duration(500).style('opacity', 0).remove()\n\n\t\tfor (const key in this.dom) {\n\t\t\tdelete this.dom[key]\n\t\t}\n\t}\n\n\trenderInteractionPrompt() {\n\t\t// set to hidden in the beginning; redisplay when interaction is enabled\n\t\tthis.dom.interactionDiv.style('display', 'none')\n\n\t\t// identify situations not eligible for showing prompt\n\t\tif (!this.term) return // missing term\n\t\tif (this.section.configKey != 'independent') return\n\t\tif (this.term.q.mode == 'spline') return // not on a spline term\n\t\tif (this.vocabApi.termdbConfig.regression?.settings?.disableInteractions) return\n\t\t{\n\t\t\t// require minimum of 2 independent terms eligible for interaction\n\t\t\tlet count = 0\n\t\t\tfor (const input of this.section.inputLst) {\n\t\t\t\tif (input.term && input.term.q.mode != 'spline') {\n\t\t\t\t\t// spline term cannot be used for interaction\n\t\t\t\t\tcount++\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (count < 2) return\n\t\t}\n\n\t\tconst n = this.term.interactions.length\n\t\tthis.dom.interactionDiv\n\t\t\t.style('display', 'inline')\n\t\t\t.html(n == 0 ? 'Add interactions' : `${n} interaction${n > 1 ? 's' : ''}`)\n\t\t\t.style('padding', '5px')\n\t\t\t.style('background-color', n == 0 ? null : '#ececec')\n\t\t\t.style('border-radius', n == 0 ? null : '6px')\n\t\t\t.style('color', n == 0 ? 'rgb(153, 153, 153)' : '#000')\n\t\t\t.style('font-size', n == 0 ? '0.8em' : '')\n\t\t\t.style('cursor', 'pointer')\n\t\t\t.on('click', () => this.renderInteractionOptions())\n\t}\n\n\trenderInteractionOptions() {\n\t\tconst self = this\n\t\tself.dom.tip.clear().showunder(self.dom.interactionDiv.node())\n\t\tif (self.parent.config.includeUnivariate) {\n\t\t\tconst label = self.parent.dom.univariateCheckboxDiv.select('label').text().trim()\n\t\t\tself.dom.tip.d.append('div').text(`Cannot add interactions. Please uncheck the \"${label}\" checkbox.`)\n\t\t\treturn\n\t\t}\n\t\tself.dom.tip.d\n\t\t\t.append('div')\n\t\t\t.style('padding', '5px')\n\t\t\t.style('font-size', '0.8em')\n\t\t\t.style('color', 'rgb(153, 153, 153)')\n\t\t\t.html(`Selected variables will each form pairwise interaction with ${this.term.term.name}`)\n\n\t\tself.dom.tip.d\n\t\t\t.append('div')\n\t\t\t.selectAll('div')\n\t\t\t.data(self.parent.config.independent.filter(tw => tw && tw.$id != self.term.$id && tw.q.mode != 'spline'))\n\t\t\t.enter()\n\t\t\t.append('div')\n\t\t\t.style('margin', '5px')\n\t\t\t.each(function (tw) {\n\t\t\t\tconst elem = select(this).append('label')\n\t\t\t\tconst checkbox = elem\n\t\t\t\t\t.append('input')\n\t\t\t\t\t.attr('type', 'checkbox')\n\t\t\t\t\t.property('checked', self.term.interactions.includes(tw.$id))\n\n\t\t\t\telem.append('span').text(' ' + tw.term.name)\n\t\t\t})\n\n\t\tself.dom.tip.d\n\t\t\t.append('button')\n\t\t\t.text('Apply')\n\t\t\t.style('margin', '5px')\n\t\t\t.on('click', () => {\n\t\t\t\tself.dom.tip.hide()\n\t\t\t\tself.term.interactions = []\n\t\t\t\tself.dom.tip.d.selectAll('input').each(function (tw) {\n\t\t\t\t\tif (select(this).property('checked')) self.term.interactions.push(tw.$id)\n\t\t\t\t})\n\t\t\t\tfor (const tw of self.parent.config.independent) {\n\t\t\t\t\tconst interactions = new Set(tw.interactions)\n\t\t\t\t\tself.term.interactions.includes(tw.$id) ? interactions.add(self.term.$id) : interactions.delete(self.term.$id)\n\t\t\t\t\ttw.interactions = [...interactions]\n\t\t\t\t}\n\t\t\t\tself.parent.editConfig(self, self.term)\n\t\t\t})\n\t}\n}\n\nfunction getQSetter4outcome(regressionType) {\n\t// only for outcome term\n\treturn {\n\t\tinteger: regressionType == 'logistic' ? maySetTwoBins : setContMode,\n\t\tfloat: regressionType == 'logistic' ? maySetTwoBins : setContMode,\n\t\tgeneExpression: regressionType == 'logistic' ? maySetTwoBins : setContMode, //Added geneExpression, but still breaks, need to fix\n\t\tcategorical: maySetTwoGroups,\n\t\tcondition: setQ4tteOutcome,\n\t\tsurvival: setQ4tteOutcome\n\t}\n}\n\n// query backend for median and create custom 2 bins with median and boundry\n// for logistic independet numeric terms\nasync function maySetTwoBins(tw, vocabApi, filter, state) {\n\t// if the bins are already binary, do not reset\n\tif (tw.q.mode == 'binary' && tw.q.lst && tw.q.lst.length == 2) {\n\t\ttw.q.mode = 'binary'\n\t\treturn\n\t}\n\n\tconst data = await vocabApi.getPercentile(tw.term, [50], state.termfilter)\n\tif (data.error || !data.values.length || !Number.isFinite(data.values[0]))\n\t\tthrow 'cannot get median value: ' + (data.error || 'no data')\n\tconst median = tw.term.type == 'integer' ? Math.round(data.values[0]) : Number(data.values[0].toFixed(2))\n\ttw.q = {\n\t\tmode: 'binary',\n\t\ttype: 'custom-bin',\n\t\tlst: [\n\t\t\t{\n\t\t\t\tstartunbounded: true,\n\t\t\t\tstopinclusive: true,\n\t\t\t\tstop: median\n\t\t\t},\n\t\t\t{\n\t\t\t\tstopunbounded: true,\n\t\t\t\tstartinclusive: false,\n\t\t\t\tstart: median\n\t\t\t}\n\t\t]\n\t}\n\n\ttw.q.lst.forEach(bin => {\n\t\tbin.label = get_bin_label(bin, tw.q)\n\t})\n\n\ttw.refGrp = tw.q.lst[0].label\n}\n\nfunction setQ4tteOutcome(tw, vocabApi, filter, state) {\n\t// set q for time-to-event outcome (i.e., condition or survival term)\n\tif (state.config.regressionType == 'logistic') {\n\t\t// if refGrp missing, set to be first group, guaranteed to be \"No event / Grade 0\"\n\t\tif (!tw.refGrp) tw.refGrp = tw.q.groups[0].name\n\t}\n\tif (state.config.regressionType == 'cox') {\n\t\tif (!tw.q.timeScale) tw.q.timeScale = 'time'\n\t}\n}\n\nasync function maySetTwoGroups(tw, vocabApi, filter, state) {\n\t// if the bins are already binary, do not reset\n\tconst { term, q } = tw\n\n\t// TODO clean up logic?\n\n\t// not condition, currently can only be categorical\n\tif (q.mode == 'binary') {\n\t\tif (q.type == 'values' && Object.keys(term.values).length == 2) return\n\t\tif (q.type == 'predefined-groupset') {\n\t\t\tconst idx = q.predefined_groupset_idx\n\t\t\tconst t_gs = term.groupsetting\n\t\t\tif (t_gs[idx] && Object.keys(t_gs[idx]).length == 2) return\n\t\t}\n\t\tif (q.type == 'custom-groupset') {\n\t\t\tconst gs = q.customset\n\t\t\tif (gs.groups.filter(g => !g.uncomputable).length == 2) return\n\t\t}\n\t}\n\n\t// step 1: check if term has only two computable categories/grades with >0 samples\n\t// if so, use the two categories as outcome and do not apply groupsetting\n\t// check the number of samples for computable categories, only use categories with >0 samples\n\tconst data = await vocabApi.getCategories(term, filter)\n\tif (data.error) throw 'cannot get categories: ' + data.error\n\tconst category2samplecount = new Map() // k: category/grade, v: number of samples\n\tconst computableCategories = [] // list of computable keys\n\tconst uncomputableCategories = [] // list of computable keys\n\tfor (const i of data.lst) {\n\t\tcategory2samplecount.set(i.key, i.samplecount)\n\t\tif (term.values && term.values[i.key] && term.values[i.key].uncomputable) uncomputableCategories.push(i.key)\n\t\telse computableCategories.push(i.key)\n\t}\n\tif (computableCategories.length < 2) {\n\t\t// TODO UI should reject this term and prompt user to select a different one\n\t\tq.type = 'values'\n\t\ttw.error = 'less than 2 categories/grades - cannot create separate groups'\n\t\treturn\n\t}\n\tif (computableCategories.length == 2) {\n\t\tq.type = 'values'\n\t\t// will use the categories from term.values{} and do not apply groupsetting\n\t\t// if the two grades happen to be \"normal\" and \"disease\" then it will make sense\n\t\t// but if the two grades are both diseaes then may not make sense\n\t\t// e.g. secondary breast cancer has just 3 and 4\n\t\treturn\n\t}\n\n\t// step 2: term has 3 or more categories/grades. must apply groupsetting\n\tconst t_gs = term.groupsetting\n\n\t// find if term already has a usable groupsetting\n\tif (\n\t\tq.customset &&\n\t\tq.customset.groups &&\n\t\tq.customset.groups.length == 2 &&\n\t\tgroupsetNoEmptyGroup(q.customset, category2samplecount)\n\t) {\n\t\tq.type = 'custom-groupset'\n\t\t// has a usable custom set\n\t\treturn\n\t}\n\n\t// step 3: check if the term has predefined groupsetting\n\tif (t_gs && t_gs.lst) {\n\t\t// has predefined groupsetting\n\t\t// note!!!! check on input.term.term but not input.term.q\n\n\t\tif (\n\t\t\tq.predefined_groupset_idx >= 0 &&\n\t\t\tt_gs.lst[q.predefined_groupset_idx] &&\n\t\t\tt_gs.lst[q.predefined_groupset_idx].groups.length == 2 &&\n\t\t\tgroupsetNoEmptyGroup(t_gs.lst[q.predefined_groupset_idx], category2samplecount)\n\t\t) {\n\t\t\t// has a usable predefined groupset\n\t\t\tq.type = 'predefined-groupset'\n\t\t\t// used for groupsetting if one of the group is filter (group.type) rahter than values,\n\t\t\t// Not in use rightnow, if used in future, uncomment following line\n\t\t\t// if (state.activeCohort != -1) q.groupsetting.activeCohort = state.activeCohort\n\t\t\treturn\n\t\t}\n\n\t\t// step 4: see if any predefined groupset has 2 groups. if so, use that\n\t\tconst i = t_gs.lst.findIndex(g => g.groups.length == 2)\n\t\tif (i != -1 && groupsetNoEmptyGroup(t_gs.lst[i], category2samplecount)) {\n\t\t\t// found a usable groupset\n\t\t\tq.predefined_groupset_idx = i\n\t\t\tq.type = 'predefined-groupset'\n\t\t\t// used for groupsetting if one of the group is filter (group.type) rahter than values,\n\t\t\t// Not in use rightnow, if used in future, uncomment following line\n\t\t\t// if (state.activeCohort != -1) q.groupsetting.activeCohort = state.activeCohort\n\t\t\treturn\n\t\t}\n\t}\n\n\t// step 5: last resort. divide values[] array into two groups\n\tconst customset = {\n\t\tactiveCohort: state.activeCohort,\n\t\t// creating 3 groups instead of 2 groups since current groupset UI expects first group to be excluded group\n\t\t// TODO: refactor client/termsetting/handlers/qualitative.ts to not consider the first group (i.e. group.currentIdx === 0) as the excluded group, but rather to consider group.excluded=true as the excluded group\n\t\tgroups: [\n\t\t\t{\n\t\t\t\tname: 'Excluded categories',\n\t\t\t\ttype: 'values',\n\t\t\t\tvalues: uncomputableCategories.map(v => {\n\t\t\t\t\treturn { key: v }\n\t\t\t\t})\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Group 1',\n\t\t\t\ttype: 'values',\n\t\t\t\tvalues: []\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'Group 2',\n\t\t\t\ttype: 'values',\n\t\t\t\tvalues: []\n\t\t\t}\n\t\t]\n\t}\n\t// TODO use category2samplecount to evenlly divide samples\n\tconst group_i_cutoff = Math.round(computableCategories.length / 2)\n\tfor (const [i, v] of computableCategories.entries()) {\n\t\tif (i < group_i_cutoff) customset.groups[1].values.push({ key: v })\n\t\telse customset.groups[2].values.push({ key: v })\n\t}\n\tq.customset = customset\n\tq.type = 'custom-groupset'\n}\n\nfunction setContMode(tw) {\n\ttw.q.mode = 'continuous'\n}\n\nfunction groupsetNoEmptyGroup(gs, c2s) {\n\t// return true if a groupset does not have empty group\n\tfor (const g of gs.groups) {\n\t\tlet total = 0\n\t\tif (g.type == 'values') {\n\t\t\tfor (const i of g.values) total += c2s.get(i.key) || 0\n\t\t\tif (total == 0) return false\n\t\t}\n\t}\n\treturn true\n}\n\nexport function getGeneVariantWildtypeGrp(tw, sampleCounts) {\n\t/* for a gene variant term, find the wildtype group of the groupset in use\n\treturns the group name, which is also the sample count key\n\treturns undefined when the groupset has no wildtype group (e.g. bi-/mono-allelic),\n\tor when the wildtype group has no samples\n\t*/\n\tconst groupset =\n\t\ttw.q.type == 'predefined-groupset'\n\t\t\t? tw.term.groupsetting?.lst?.[tw.q.predefined_groupset_idx]\n\t\t\t: tw.q.type == 'custom-groupset'\n\t\t\t? tw.q.customset\n\t\t\t: null\n\tif (!groupset?.groups) return\n\tfor (const g of groupset.groups) {\n\t\tif (g.type != 'filter') continue\n\t\t/* a wildtype group matches samples without alteration, indicated by\n\t\ttvs.genotype='wt' for mutation data and tvs.cnvWT for continuous cnv data\n\t\t(see getPredefinedGroupsets() in client/tw/geneVariant.ts) */\n\t\tconst isWt = g.filter?.lst?.some(i => i.tvs && (i.tvs.genotype == 'wt' || i.tvs.cnvWT))\n\t\tif (!isWt) continue\n\t\tif (sampleCounts.find(i => i.key == g.name)) return g.name\n\t}\n}\n\nfunction getLogisticOutcomeNonref(outcome) {\n\t// outcome is the outcome term-wrapper {q{}, refGrp, term{}}\n\tif (outcome.term.type == 'condition') {\n\t\t// condition term does not use q.type\n\t\t// from q.groups[], return the str name that's not refgrp\n\t\tfor (const i of outcome.q.groups) {\n\t\t\tif (i.name != outcome.refGrp) return i.name\n\t\t}\n\t\tthrow 'nonref group not found for logistic outcome'\n\t}\n\t// not condition term;\n\t// depending on q.type, find the non-ref group and return its name\n\tif (outcome.q.type == 'predefined-groupset') {\n\t\tif (!Number.isInteger(outcome.q.predefined_groupset_idx))\n\t\t\tthrow 'outcome.q.predefined_groupset_idx not integer when q.type is \"predefined-groupset\"'\n\t\tif (!outcome.term.groupsetting) throw 'outcome.term.groupsetting missing'\n\t\tconst grpset = outcome.term.groupsetting.lst[outcome.q.predefined_groupset_idx]\n\t\tif (!grpset) throw 'groupset not found by outcome.q.predefined_groupset_idx'\n\t\tconst nonrefgrp = grpset.groups.find(i => i.name != outcome.refGrp)\n\t\tif (!nonrefgrp) throw 'non-ref group not found for predefined-groupset'\n\t\treturn nonrefgrp.name\n\t}\n\tif (outcome.q.type == 'custom-groupset') {\n\t\tif (!outcome.q.customset) throw 'outcome.q.customset missing'\n\t\tconst nonrefgrp = outcome.q.customset.groups.find(i => i.name != outcome.refGrp)\n\t\tif (!nonrefgrp) throw 'non-ref group not found for custom-groupset'\n\t\treturn nonrefgrp.name\n\t}\n\tif (outcome.q.type == 'values') {\n\t\tif (!outcome.term.values) throw 'outcome.term.values{} missing'\n\t\tfor (const k in outcome.term.values) {\n\t\t\tconst v = outcome.term.values[k]\n\t\t\tif (v.label != outcome.refGrp) return v.label\n\t\t}\n\t\tthrow 'unknown nonref group from outcome.term.values'\n\t}\n\tif (outcome.q.type == 'custom-bin') {\n\t\tconst nonrefbin = outcome.q.lst.find(i => i.label != outcome.refGrp)\n\t\tif (!nonrefbin) throw 'non-ref bin is not found for custom-bin'\n\t\treturn nonrefbin.label\n\t}\n\tif (outcome.q.type == 'regular-bin') {\n\t\tthrow 'do not know a way to find computed bin list for type=regular-bin'\n\t}\n\tthrow 'unknown outcome.q.type'\n}\n\nfunction getCoxOutcomeEventLabel(tw) {\n\tlet eventLabel\n\tif (!tw.term.values) throw 'tw.term.values missing'\n\tif (tw.term.type == 'condition') {\n\t\tconst grades = Object.keys(tw.term.values).map(k => {\n\t\t\tconst grade = Number(k)\n\t\t\tif (!Number.isFinite(grade)) throw 'grade is not a number'\n\t\t\treturn grade\n\t\t})\n\t\tconst startGrade = tw.q.breaks[0]\n\t\tconst endGrade = Math.max(...grades)\n\t\teventLabel = `Grades ${startGrade}-${endGrade}`\n\t} else if (tw.term.type == 'survival') {\n\t\tconst exitCodes = Object.keys(tw.term.values).map(k => {\n\t\t\tconst code = Number(k)\n\t\t\tif (!Number.isFinite(code)) throw 'exit code is not a number'\n\t\t\treturn code\n\t\t})\n\t\t// exit codes can be 0=alive,1=dead; 1=alive,2=dead; etc. (see Surv() in R)\n\t\t// so using max exit code value as the exit code of the event\n\t\teventLabel = tw.term.values[Math.max(...exitCodes)].label\n\t} else {\n\t\tthrow 'unexpected tw.term.type'\n\t}\n\treturn eventLabel\n}\n", "import { select } from 'd3-selection'\nimport { InputTerm } from './regression.inputs.term'\nimport { make_one_checkbox, Menu } from '#dom'\n\n/*\noutcome and independent are two sections sharing same structure\n\"inputLst[]\" collect one or multiple variables for each section\n\"input\" tracks attributes from a variable\nblank input: a blank input is a termsetting instance. once a term is created for it, the term is filled to the same instance, and a new blank input may need to be created (for independent section)\n\n**** function cascade ****\n\nconstructor\n\tcreateSectionConfigs\n\tinitUI\n\t\taddSection\n\t\tsubmit (by clicking button)\n\t\teditConfig (by termsetting callback)\nmain\n\tmayUpdateSandboxHeader\n\tsetDisableTerms\n\trenderSection\n\t\tsyncInputsWithConfig\n\t\t\tInputTerm\n\t\t\tmayAddBlankInput\n\t\t\t\tInputTerm\n\t\tremoveInput\n\t\taddInput\n*/\n\n// non-dictionary term types to use as independent variable\n// check against allowedTermTypes from a dataset\nconst allNonDictionaryTerms = [\n\t{\n\t\ttermtype: 'snplst',\n\t\t//html: 'A list of SNPs <span style=\"font-size:.7em\">All SNPs are analyzed in one model</span>'\n\t\thtml: 'A list of variants'\n\t},\n\n\t{\n\t\ttermtype: 'snplocus',\n\t\t//html: 'Variants in a locus <span style=\"font-size:.7em\">Variants are analyzed individually</span>'\n\t\thtml: 'Variants in a locus'\n\t},\n\t{\n\t\ttermtype: 'prs',\n\t\ttext: 'Polygenic risk score'\n\t}\n]\n\nexport class RegressionInputs {\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\n\t\tsetInteractivity(this)\n\t\tsetRenderers(this)\n\n\t\tthis.createSectionConfigs()\n\t\tthis.initUI()\n\t}\n\n\tcreateSectionConfigs() {\n\t\t/* Create configuration data for each section of the input UI\n\t\tsee google doc \"Regression UI\"\n\t\t*/\n\t\t// configuration for the outcome variable section\n\t\tthis.outcome = {\n\t\t\t/*** static configuration ***/\n\t\t\theading: 'Outcome variable',\n\t\t\tselectPrompt:\n\t\t\t\tthis.opts.regressionType == 'linear' ? 'Select continuous outcome variable' : 'Select outcome variable',\n\t\t\tplaceholderIcon: '',\n\t\t\tconfigKey: 'outcome',\n\t\t\tlimit: 1,\n\t\t\tusecase: { target: 'regression', regressionType: this.opts.regressionType, detail: 'outcome' },\n\n\t\t\t/*** dynamic configuration ***/\n\t\t\tinputLst: [],\n\n\t\t\t/*** tracker for this section's DOM elements ***/\n\t\t\tdom: {}\n\t\t}\n\n\t\t// configuration for the independent variable section\n\t\tthis.independent = {\n\t\t\t/*** static configuration ***/\n\t\t\theading: 'Independent variable(s)',\n\t\t\tselectPrompt: 'Add independent variable',\n\t\t\tplaceholderIcon: '',\n\t\t\tconfigKey: 'independent',\n\t\t\tlimit: 10,\n\t\t\tusecase: { target: 'regression', regressionType: this.opts.regressionType, detail: 'independent' },\n\n\t\t\t/*** dynamic configuration ***/\n\t\t\tinputLst: [],\n\n\t\t\t/*** tracker for this section's DOM elements ***/\n\t\t\tdom: {}\n\t\t}\n\n\t\t// track sections in an array, for convenience in loops\n\t\t// but not for use in `d3.data()`\n\t\tthis.sections = [this.outcome, this.independent]\n\t}\n\n\tasync main() {\n\t\ttry {\n\t\t\tthis.config = this.parent.config\n\t\t\tthis.state = this.parent.state\n\t\t\tthis.hasError = false\n\t\t\tthis.setDisableTerms()\n\t\t\tconst updates = []\n\t\t\tfor (const section of this.sections) {\n\t\t\t\tawait this.renderSection(section)\n\t\t\t\tfor (const input of section.inputLst) {\n\t\t\t\t\tinput.dom.holder.style('border-left', input.term ? '1px solid #bbb' : '')\n\t\t\t\t\tupdates.push(input.main())\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait Promise.all(updates)\n\t\t\tfor (const section of this.sections) {\n\t\t\t\tfor (const input of section.inputLst) {\n\t\t\t\t\tif ((input.term && input.term.error) || input.hasError) {\n\t\t\t\t\t\tthis.hasError = true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.hasError = true\n\t\t\tthrow e\n\t\t}\n\t}\n\n\tsetDisableTerms() {\n\t\tthis.disable_terms = []\n\t\tif (this.config.outcome && this.config.outcome.term) this.disable_terms.push(this.config.outcome.term)\n\t\tif (this.config.independent) {\n\t\t\tfor (const vb of this.config.independent) {\n\t\t\t\tthis.disable_terms.push(vb.term)\n\t\t\t}\n\t\t}\n\t}\n\n\thandleError() {\n\t\tthis.hasError = true\n\t\tthis.dom.submitBtn.property('disabled', true)\n\t}\n\n\tgetNoTermPromptOptions(section) {\n\t\t// only for independent section\n\t\tif (section.configKey != 'independent') return\n\t\t// return an array, each ele is an item in the mini menu at termsetting prompt\n\t\t// okay for the array to be empty\n\t\t// need to check if the dataset allows this\n\t\t// if so, add to this array, to be shown as mini menu\n\t\tconst lst = []\n\t\tfor (const item of structuredClone(allNonDictionaryTerms)) {\n\t\t\t// TODO do this via vocab api\n\t\t\tif (!this.state.allowedTermTypes.includes(item.termtype)) {\n\t\t\t\t// not allowed by this dataset\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (section.inputLst.find(i => i.term && i.term.term.type == item.termtype)) {\n\t\t\t\t// same term is already present in this section, do not add a second\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (item.termtype == 'snplocus') {\n\t\t\t\tif (this.config.includeUnivariate) {\n\t\t\t\t\t// snplocus is computationally intensive so it should not\n\t\t\t\t\t// be allowed when univariate results are included\n\t\t\t\t\titem.invalid = true\n\t\t\t\t\tconst label = this.dom.univariateCheckboxDiv.select('label').text().trim()\n\t\t\t\t\titem.invalidMsg = `Cannot add this variable. Please uncheck the \"${label}\" checkbox.`\n\t\t\t\t}\n\t\t\t}\n\t\t\tlst.push(item)\n\t\t}\n\t\tif (lst.length) {\n\t\t\t// added at least one non-dict term type\n\t\t\t// for the mini menu in termsetting prompt to show both dict- and non-dict-terms, add dict option\n\t\t\tlst.unshift({\n\t\t\t\tisDictionary: true,\n\t\t\t\ttext: 'Dictionary variable'\n\t\t\t})\n\t\t}\n\t\treturn lst\n\t}\n}\n\nfunction setRenderers(self) {\n\tself.initUI = () => {\n\t\tconst controls = self.opts.holder.append('div').style('display', 'block')\n\n\t\tself.dom = {\n\t\t\tdiv: self.opts.holder, //.style('margin', '10px 0px'),\n\t\t\tcontrols,\n\t\t\tbody: controls.append('div'),\n\t\t\tfoot: controls\n\t\t\t\t.append('div')\n\t\t\t\t.style('margin', '0px 20px')\n\t\t\t\t.style('display', 'flex')\n\t\t\t\t.style('align-items', 'center')\n\t\t\t\t.style('gap', '20px')\n\t\t}\n\n\t\tself.dom.submitBtn = self.dom.foot\n\t\t\t.append('div')\n\t\t\t.append('button')\n\t\t\t.style('display', 'none')\n\t\t\t.style('padding', '5px 15px')\n\t\t\t.style('border-radius', '15px')\n\t\t\t.style('cursor', 'pointer')\n\t\t\t.text('Run analysis')\n\t\t\t.on('click', self.submit)\n\n\t\t// checkbox for including univariate results\n\t\tself.dom.univariateCheckboxDiv = self.dom.foot.append('div').style('display', 'none')\n\t\tself.dom.univariateCheckbox = make_one_checkbox({\n\t\t\tlabeltext: 'Include univariate results',\n\t\t\tchecked: false,\n\t\t\tholder: self.dom.univariateCheckboxDiv,\n\t\t\tcallback: checked => {\n\t\t\t\tconst invalid = self.config.independent.find(v => v.interactions.length || v.term.type == 'snplocus')\n\t\t\t\tif (invalid) {\n\t\t\t\t\t// interactions or snplocus variable in use\n\t\t\t\t\t// disable univariate analysis\n\t\t\t\t\tself.dom.univariateCheckbox.property('checked', false)\n\t\t\t\t\tconst tip = new Menu()\n\t\t\t\t\ttip.showunder(self.dom.univariateCheckboxDiv.node())\n\t\t\t\t\tconst msg = `Cannot include univariate results. Please remove ${\n\t\t\t\t\t\tinvalid.interactions.length ? 'all interactions' : `the \"${invalid.term.name}\" variable`\n\t\t\t\t\t}.`\n\t\t\t\t\ttip.d.append('div').text(msg)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tself.app.dispatch({\n\t\t\t\t\ttype: 'plot_edit',\n\t\t\t\t\tid: self.parent.id,\n\t\t\t\t\tchartType: 'regression',\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\thasUnsubmittedEdits: true,\n\t\t\t\t\t\tincludeUnivariate: checked\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\n\t\tself.dom.submitMsgs = self.dom.foot\n\t\t\t.append('div')\n\t\t\t.style('color', '#cc0000')\n\t\t\t.style('font-style', 'italic')\n\t\t\t.style('font-size', '0.8em')\n\n\t\tself.submitMsgs = {}\n\n\t\t/*\n\t\t\tnot using d3.data() here since each section may only\n\t\t\tbe added and re-rendered, but not removed\n\t\t*/\n\t\tfor (const section of self.sections) {\n\t\t\tconst div = self.dom.body.append('div')\n\t\t\tself.addSection(section, div)\n\t\t}\n\t}\n\n\tself.addSection = function (section, div) {\n\t\tdiv\n\t\t\t.style('display', 'none')\n\t\t\t.style('margin', '3px 5px')\n\t\t\t.style('padding', '3px 5px')\n\t\t\t.attr('data-testid', section.configKey)\n\n\t\tsection.dom = {\n\t\t\tholder: div,\n\t\t\theadingDiv: div\n\t\t\t\t.append('div')\n\t\t\t\t.style('margin', '3px 5px 20px 5px')\n\t\t\t\t.style('font-size', '17px')\n\t\t\t\t.style('color', '#bbb')\n\t\t\t\t.text(section.heading),\n\n\t\t\tinputsDiv: div.append('div')\n\t\t}\n\t}\n\n\t/* \n\t\tupdate each section's visibility,\n\t\tremove and add inputs as needed,\n\t\tand later may do more section restyling based on\n\t\tthe state of inputs that are being edited\n\t*/\n\tself.renderSection = function (section) {\n\t\t// decide to show/hide this section\n\t\t// only show when this section is for outcome,\n\t\t// or this is independent and only show it when the outcome has been selected\n\t\t// effect is to force user to first select outcome, then independent, but not to select independent first\n\t\tsection.dom.holder.style('display', section.configKey == 'outcome' || self.config.outcome ? 'block' : 'none')\n\n\t\tsyncInputsWithConfig(section)\n\t\t// section.inputLst[] is now synced with plot config\n\n\t\tconst inputs = section.dom.inputsDiv\n\t\t\t.selectAll(':scope > div')\n\t\t\t// key function (2nd arg) uses a function to determine how datum and element are joined by variable id\n\t\t\t.data(section.inputLst, input => input.term && (input.term.term.id || input.term.term.name))\n\n\t\tinputs.exit().each(removeInput)\n\n\t\tinputs.enter().append('div').each(addInput)\n\t}\n\n\tfunction syncInputsWithConfig(section) {\n\t\t// get the input variables from config.outcome or config.independent\n\t\tconst selected = self.config[section.configKey]\n\n\t\t// force the outcome variable into an array for ease of handling\n\t\t// the independent variables array will be used as-is\n\t\tconst selectedArray = Array.isArray(selected) ? selected : selected ? [selected] : []\n\n\t\tmayConvertInteractionIds(selectedArray, section)\n\n\t\t// process each selected variable\n\t\tfor (const variable of selectedArray) {\n\t\t\tif (section.configKey == 'independent') {\n\t\t\t\tif (!variable.interactions) variable.interactions = []\n\t\t\t\tfor (const id of variable.interactions) {\n\t\t\t\t\tconst tw = selectedArray.find(i => i.$id == id)\n\t\t\t\t\tif (!tw) throw 'interacting partner not found in independents: ' + id\n\t\t\t\t\tif (!tw.interactions) tw.interactions = []\n\t\t\t\t\tif (!tw.interactions.includes(variable.$id)) tw.interactions.push(variable.$id)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst input = section.inputLst.find(input => input.term?.$id == variable.$id)\n\t\t\tif (!input) {\n\t\t\t\tsection.inputLst.push(\n\t\t\t\t\tnew InputTerm({\n\t\t\t\t\t\tsection,\n\t\t\t\t\t\tterm: variable,\n\t\t\t\t\t\tparent: self\n\t\t\t\t\t})\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\t// reassign the variable reference to the mutable variable copy\n\t\t\t\t// from state.config.outcome | .independent\n\t\t\t\tinput.term = variable\n\t\t\t}\n\t\t}\n\n\t\tmayAddBlankInput(section, self)\n\t}\n\n\t// interactions[] from url will contain term ids\n\t// convert these to $ids\n\tfunction mayConvertInteractionIds(selectedArray, section) {\n\t\tif (section.configKey != 'independent') return\n\t\tconst id2$id = new Map() // id => $id\n\t\t// first populate id2$id map\n\t\tfor (const v of selectedArray) {\n\t\t\tif (v.id) id2$id.set(v.id, v.$id)\n\t\t}\n\t\t// then convert all ids in interactions[] to $ids\n\t\tfor (const v of selectedArray) {\n\t\t\tif (v.interactions?.length) {\n\t\t\t\tfor (const [i, id] of v.interactions.entries()) {\n\t\t\t\t\tconst $id = id2$id.get(id)\n\t\t\t\t\tif ($id) v.interactions[i] = $id\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function addInput(input) {\n\t\tawait input.init(\n\t\t\tselect(this).style('width', 'fit-content').style('margin', '0px 15px 35px 25px').style('padding', '0px 5px')\n\t\t)\n\t}\n\n\tfunction removeInput(input) {\n\t\t/* NOTE: editConfig deletes this input from the section.inputLst array */\n\t\tinput.remove()\n\t\tfor (const key in input.dom) {\n\t\t\t//input.dom[key].remove()\n\t\t\tdelete input.dom[key]\n\t\t}\n\t\tconst div = select(this)\n\t\tdiv.transition().duration(500).style('opacity', 0).remove()\n\t}\n\n\tself.resetSubmitButton = () => {\n\t\t// do not disable button upon ui error. only disable after clicking button and analysis is running\n\t\tself.dom.submitBtn\n\t\t\t.text('Run analysis')\n\t\t\t.style('display', self.config.outcome && self.config.independent.length ? 'block' : 'none')\n\t\t\t.property('disabled', self.hasError)\n\t}\n\n\tself.mayShowUnivariateCheckbox = () => {\n\t\tif (!self.config.outcome || self.config.independent.length < 2) {\n\t\t\t// hide univariate checkbox if analysis does not have\n\t\t\t// multiple covariates\n\t\t\tself.dom.univariateCheckboxDiv.style('display', 'none')\n\t\t\treturn\n\t\t}\n\t\tself.dom.univariateCheckboxDiv.style('display', 'block')\n\t\t// set checked status\n\t\tself.dom.univariateCheckbox.property('checked', self.config.includeUnivariate)\n\t}\n\n\tself.mayShowSubmitMsgs = () => {\n\t\tself.dom.submitMsgs\n\t\t\t.selectAll('div')\n\t\t\t.data(Object.values(self.submitMsgs))\n\t\t\t.join('div')\n\t\t\t.text(d => d)\n\t}\n}\n\nfunction setInteractivity(self) {\n\t/* this function is called when any change is made to a term of an input\n\te.g. by termsetting callback\n\t*/\n\tself.editConfig = async (input, variable) => {\n\t\tif (!variable) {\n\t\t\t// the variable has been deleted from this input; will delete this input from section\n\t\t\tconst i = input.section.inputLst.findIndex(d => d === input)\n\t\t\tif (i == -1) throw `deleting an unknown input`\n\t\t\t// delete this input\n\t\t\tinput.section.inputLst.splice(i, 1)\n\t\t\tif (input.term) {\n\t\t\t\t// if the input.term has interaction pairs, then\n\t\t\t\t// delete this term.id from those other input term.interactions\n\t\t\t\tfor (const other of input.section.inputLst) {\n\t\t\t\t\tif (!other.term || !other.term.interactions?.length) continue\n\t\t\t\t\tconst i = other.term.interactions.indexOf(input.term.$id)\n\t\t\t\t\tif (i != -1) other.term.interactions.splice(i, 1)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// variable is selected for this input\n\n\t\t\tconst prevTerm = input.term\n\n\t\t\t/*\n\t\t\t\tFor a new term (replacing a blank input), the refGrp will be missing.\n\t\t\t\tIn that case, updateTerm() in regression.inputs.term.js will assign a\n\t\t\t\tdefault refGrp based on sample counts. \n\n\t\t\t\tFor a replacement term that happens to match the previous term's ID, \n\t\t\t\tfor example adjusting a group other than the refGrp, the refGrp may be \n\t\t\t\treused if there happen to be sample counts for it.\n\t\t\t*/\n\t\t\tif (prevTerm && variable.term.id === prevTerm.term.id) {\n\t\t\t\tfor (const k in prevTerm) {\n\t\t\t\t\t// reapply any unedited key-values to the variable, such as refGrp\n\t\t\t\t\tif (!(k in variable)) variable[k] = prevTerm[k]\n\t\t\t\t}\n\t\t\t}\n\t\t\tinput.term = variable\n\n\t\t\tif (variable.q.mode == 'spline' && variable.interactions) {\n\t\t\t\t// this is a spline term, delete existing interactions with this term\n\t\t\t\tfor (const other of input.section.inputLst) {\n\t\t\t\t\tif (!other.term || !other.term.interactions) continue\n\t\t\t\t\tconst i = other.term.interactions.indexOf(input.term.$id)\n\t\t\t\t\tif (i != -1) other.term.interactions.splice(i, 1)\n\t\t\t\t}\n\t\t\t\tvariable.interactions = []\n\t\t\t}\n\t\t}\n\n\t\tconst selected = []\n\t\tfor (const i of input.section.inputLst) {\n\t\t\tif (i.term) selected.push(i.term)\n\t\t}\n\t\tconst key = input.section.configKey\n\t\t// the target config to fill-in/replace/delete may hold one or more selected input variables\n\t\t// config.outcome is not an array (exactly one selected variable)\n\t\t// config.independent is an array (0 or more selected variables)\n\t\tconst configValue = Array.isArray(self.config[key]) ? selected : selected[0]\n\n\t\tself.app.dispatch({\n\t\t\ttype: 'plot_edit',\n\t\t\tid: self.parent.id,\n\t\t\tchartType: 'regression',\n\t\t\tconfig: {\n\t\t\t\thasUnsubmittedEdits: true,\n\t\t\t\t// replace config.outcome or config.independent\n\t\t\t\t[key]: JSON.parse(JSON.stringify(configValue))\n\t\t\t}\n\t\t})\n\t}\n\n\tself.submit = () => {\n\t\t// disable button upon clicking to prevent double-clicking\n\t\tself.dom.submitBtn.property('disabled', true)\n\t\tif (self.hasError) {\n\t\t\talert('Please fix the input variable errors (highlighted in red background).')\n\t\t\treturn\n\t\t}\n\n\t\tconst config = JSON.parse(JSON.stringify(self.config))\n\t\tconfig.hasUnsubmittedEdits = false\n\n\t\tself.app.dispatch({\n\t\t\ttype: 'plot_edit',\n\t\t\tid: self.parent.id,\n\t\t\tchartType: 'regression',\n\t\t\tconfig\n\t\t})\n\t}\n}\n\n/*\nsection is one of this.sections[]\ndecide if a blank input needs to be added to this section\nfor outcome section, there can just be one input, it's either blank or filled\nfor independent, there should always be one blank input, among other filled inputs\n*/\nfunction mayAddBlankInput(section, self) {\n\tif (section.inputLst.length >= section.limit) {\n\t\t// number of inputs in this section is beyond limit, do not create more\n\t\treturn\n\t}\n\tconst blankInput = section.inputLst.find(i => !i.term)\n\tif (blankInput) {\n\t\t// this section already have a blank input (without .term{})\n\t\t// as a section is limited to have only one blank input, do not add a new one\n\t\tconst noTermPromptOptions = self.getNoTermPromptOptions(section)\n\t\tif (noTermPromptOptions) {\n\t\t\t// will need to update noTermPromptOptions on this input\n\t\t\t// due to the fact that we don't want two snplst or snplocus terms in one model\n\t\t\tblankInput.pill.main({ noTermPromptOptions })\n\t\t}\n\t\treturn\n\t}\n\t// now add a blank input to this section\n\tsection.inputLst.push(\n\t\tnew InputTerm({\n\t\t\tsection,\n\t\t\tparent: self,\n\t\t\tnoTermPromptOptions: self.getNoTermPromptOptions(section)\n\t\t})\n\t)\n}\n", "import { RegressionInputs } from './regression.inputs'\nimport { RegressionResults } from './regression.results'\nimport { getCompInit, copyMerge } from '../rx'\nimport { sayerror } from '#dom'\nimport { fillTermWrapper } from '#termsetting'\nimport { getCombinedTermFilter } from '#filter'\nimport { PlotBase } from '#plots/PlotBase.js'\nimport { numericTypes, dictionaryNumericTypes } from '#shared'\nimport { getActiveCohortStr } from '#mass/charts'\n\n/*\nCode architecture:\n\nregression.js\n\tregression.inputs.js\n\t\tregression.inputs.term.js\n\t\t\tregression.inputs.values.table.js\n\tregression.results.js\n*/\n\nclass Regression extends PlotBase {\n\tstatic type = 'regression'\n\n\tconstructor(opts) {\n\t\tsuper(opts)\n\t\tthis.type = Regression.type\n\t\tthis.genomeObj = opts.app.opts.genome\n\t}\n\n\tasync init(appState) {\n\t\tthis.dom = {\n\t\t\theader: this.opts.header, // header is optional\n\t\t\terrordiv: this.opts.holder.append('div'),\n\t\t\tinputs: this.opts.holder.append('div').style('margin', '20px 10px'),\n\t\t\tresults: this.opts.holder.append('div').style('margin-left', '40px')\n\t\t}\n\n\t\t// this.id is from opts.id and assigned by rx\n\t\tconst config = appState.plots.find(p => p.id === this.id)\n\n\t\tthis.inputs = new RegressionInputs({\n\t\t\tapp: this.app,\n\t\t\tparent: this,\n\t\t\tid: this.id,\n\t\t\tholder: this.dom.inputs,\n\t\t\tregressionType: config.regressionType\n\t\t})\n\n\t\tthis.results = new RegressionResults({\n\t\t\tapp: this.app,\n\t\t\tparent: this,\n\t\t\tid: this.id,\n\t\t\tholder: this.dom.results,\n\t\t\tregressionType: config.regressionType\n\t\t})\n\t}\n\n\tgetState(appState, sub) {\n\t\tconst config = appState.plots.find(p => p.id === this.id)\n\t\tif (!config) {\n\t\t\tthrow `No plot with id='${this.id}' found. Did you set this.id before this.api = getComponentApi(this)?`\n\t\t}\n\t\tif (!config.regressionType) throw 'regressionType is required'\n\t\tconst parentConfig = this.parentId && appState.plots.find(p => p.id === this.parentId)\n\t\tconst termfilter = getCombinedTermFilter(appState, config.filter || parentConfig?.filter)\n\t\treturn {\n\t\t\tvocab: appState.vocab,\n\t\t\tformIsComplete: config.outcome && config.independent.length,\n\t\t\tactiveCohort: appState.activeCohort,\n\t\t\ttermfilter,\n\t\t\tconfig,\n\t\t\tallowedTermTypes: appState.termdbConfig.allowedTermTypes,\n\t\t\tminTimeSinceDx: appState.termdbConfig.minTimeSinceDx\n\t\t}\n\t}\n\n\t/* do not set reactsTo\n\tso it reacts to all actions matching with the plot id (controlled by store method)\n\tincluding filter/cohort change\n\t*/\n\n\tasync main() {\n\t\ttry {\n\t\t\tthis.config = JSON.parse(JSON.stringify(this.state.config))\n\t\t\tthis.mayUpdateSandboxHeader()\n\t\t\tthis.getFilter()\n\t\t\tawait this.inputs.main()\n\t\t\tawait this.results.main()\n\t\t\tthis.inputs.resetSubmitButton()\n\t\t\tthis.inputs.mayShowUnivariateCheckbox()\n\t\t\tthis.inputs.mayShowSubmitMsgs()\n\t\t} catch (e) {\n\t\t\tif (this.inputs.hasError) {\n\t\t\t\t// will hide the results ui\n\t\t\t\tthis.results.main()\n\t\t\t}\n\t\t\tsayerror(this.dom.errordiv, 'Error: ' + (e.error || e))\n\t\t\tif (e.stack) console.log(e.stack)\n\t\t}\n\t}\n\n\tmayUpdateSandboxHeader() {\n\t\tif (!this.dom.header) return\n\t\t// based on data in config state, but not section\n\t\tconst o = this.config.outcome\n\t\tthis.dom.header.html(\n\t\t\t(o ? o.term.name : '') +\n\t\t\t\t'<span style=\"opacity:.6;font-size:.7em;margin-left:10px;\">' +\n\t\t\t\tthis.config.regressionType.toUpperCase() +\n\t\t\t\t' REGRESSION</span>'\n\t\t)\n\t}\n\n\tgetFilter() {\n\t\t// regression analysis may have multiple\n\t\t// filters (e.g. term filter + restrict ancestry filter)\n\t\t// so track all filters here\n\t\tconst filters = []\n\n\t\t// term filter\n\t\tif (this.state.termfilter?.filter) filters.push(this.state.termfilter.filter)\n\n\t\t// restrict ancestry filter\n\t\tconst tws = [this.config.outcome, ...this.config.independent]\n\t\tconst tws_restrictAncestry = tws.filter(tw => tw?.q.restrictAncestry)\n\t\tif (tws_restrictAncestry.length) {\n\t\t\tif (tws_restrictAncestry.length > 1) {\n\t\t\t\tconst ancestries = new Set(tws_restrictAncestry.map(tw => tw.q.restrictAncestry.name))\n\t\t\t\tif (ancestries.size > 1) throw 'samples cannot be restricted to more than 1 ancestry'\n\t\t\t}\n\t\t\tconst tw = tws_restrictAncestry[0]\n\t\t\tfilters.push({ type: 'tvs', tvs: tw.q.restrictAncestry.tvs })\n\t\t\t// notify user that samples will be restricted by ancestry\n\t\t\tthis.inputs.submitMsgs.restrictAncestry = `Restricting analysis to samples of ${tw.q.restrictAncestry.name}`\n\t\t} else {\n\t\t\tdelete this.inputs.submitMsgs.restrictAncestry\n\t\t}\n\n\t\t// store filters\n\t\t// vocabApi will use getNormalFilter() to remove any empty filters and convert a single entry tvslst into a tvs\n\t\tthis.filter = { type: 'tvslst', join: 'and', lst: filters }\n\t}\n}\n\nexport const regressionInit = getCompInit(Regression)\n// this alias will allow abstracted dynamic imports\nexport const componentInit = regressionInit\n\nlet _ID_ = 1\n\nexport async function getPlotConfig(opts, app, activeCohort) {\n\t// TODO need to supply term filter of app to fillTermWrapper\n\tif (!opts.outcome) opts.outcome = mayGetLoneOutcome(opts.regressionType, app, activeCohort)\n\n\tconst id = 'id' in opts ? opts.id : `_REGRESSION_${_ID_++}`\n\tconst config = { id }\n\t// without an outcome, config.outcome is left unset rather than \"outcome:undefined\",\n\t// so that the input ui shows a blank outcome pill for user to fill in\n\tif (opts.outcome) {\n\t\tawait fillTermWrapper(opts.outcome, app.vocabApi, get_defaultQ4fillTW(opts.regressionType, 'outcome'))\n\t\tconfig.outcome = opts.outcome\n\t}\n\n\tif (opts.independent) {\n\t\tif (!Array.isArray(opts.independent)) throw '.independent[] is not array'\n\t\tfor (const t of opts.independent) {\n\t\t\tawait fillTermWrapper(\n\t\t\t\tt,\n\t\t\t\tapp.vocabApi,\n\t\t\t\tt.q?.mode ? undefined : get_defaultQ4fillTW(opts.regressionType, 'independent')\n\t\t\t)\n\t\t}\n\t\tconfig.independent = opts.independent\n\t} else {\n\t\tconfig.independent = []\n\t}\n\t// may apply term-specific changes to the default object\n\treturn copyMerge(config, opts)\n}\n\n/*\nreturns a tw-shaped {term} when the dataset offers just one term usable as this method's outcome,\nso the outcome pill is prefilled rather than making user open the tree to pick the only choice\n(e.g. gdc, with its single hardcoded \"Overall Survival\" term); otherwise returns undefined\n\nonly applies to cox, whose outcome is a survival or condition term. linear and logistic accept\nnumeric/categorical terms too, so they always have more than one candidate.\n\ntermdbConfig.loneTermByType{} is computed at server launch, keyed by cohort; see findLoneTermByType()\n*/\nfunction mayGetLoneOutcome(regressionType, app, activeCohort) {\n\tif (regressionType != 'cox') return\n\tconst byType = getLoneTermByType(app.vocabApi.termdbConfig, activeCohort)\n\tconst t1 = byType?.survival\n\tconst t2 = byType?.condition\n\tif (t1 && t2) return // has both. no preference thus do not auto select one\n\tif (t1) return { term: structuredClone(t1) }\n\tif (t2) return { term: structuredClone(t2) }\n\treturn\n}\n\n// term types accepted as cox outcome, per getUsecaseSupportedTerms() of termdb.usecase.ts\nconst coxOutcomeTypes = ['survival', 'condition']\n\n// returns termdbConfig.loneTermByType{} entry for the active cohort, or undefined when the ds has\n// no lone term or the cohort key cannot be determined\nfunction getLoneTermByType(termdbConfig, activeCohort) {\n\tif (!termdbConfig?.loneTermByType) return // no lone term in this dataset\n\t// a caller may not know the active cohort (e.g. getPlotConfig() when restoring a session),\n\t// in which case the cohort key cannot be determined for a ds with subcohorts\n\tif (termdbConfig.selectCohort && !Number.isInteger(activeCohort)) return\n\treturn termdbConfig.loneTermByType[getActiveCohortStr({ termdbConfig, activeCohort })]\n}\n\n/*\nreturns true when the dataset has only one term usable as this method's outcome, so the input ui\nmust not offer \"Replace\" on the outcome pill: the term tree would have nothing else to show\n\na term type is absent from loneTermByType{} when the cohort has either 0 or 2+ terms of it, so a\nlone term of one type only proves there is no alternative if the ds has no term of the other type\nat all; that is what allowedTermTypes[] reports. when in doubt \"Replace\" is kept, as offering it\nneedlessly is much less confusing than withholding it while other outcome terms exist\n*/\nexport function isLoneOutcome(regressionType, termdbConfig, activeCohort) {\n\tif (regressionType != 'cox') return false // other methods also accept numeric/categorical terms\n\tconst byType = getLoneTermByType(termdbConfig, activeCohort)\n\tif (!byType) return false\n\tconst loneTypes = coxOutcomeTypes.filter(type => byType[type])\n\tif (loneTypes.length != 1) return false // no lone term, or one of each type thus replaceable\n\tconst otherType = coxOutcomeTypes.find(type => type != loneTypes[0])\n\treturn !termdbConfig.allowedTermTypes?.includes(otherType)\n}\n\nexport function get_defaultQ4fillTW(regressionType, useCase = '') {\n\tconst defaultQ = {}\n\n\t// numeric term\n\tdefaultQ['numeric'] = regressionType == 'logistic' && useCase == 'outcome' ? { mode: 'binary' } : { mode: 'discrete' }\n\n\t// non-dictionary numeric terms will default to 2-bin using median cutoff\n\tfor (const t of numericTypes) {\n\t\tif (dictionaryNumericTypes.has(t)) continue // already covered by defaultQ['numeric']\n\t\tdefaultQ[t] =\n\t\t\tregressionType == 'logistic' && useCase == 'outcome'\n\t\t\t\t? { mode: 'binary' }\n\t\t\t\t: { mode: 'discrete', type: 'custom-bin', preferredBins: 'median' }\n\t}\n\n\t// categorical term\n\tdefaultQ['categorical'] =\n\t\tregressionType == 'logistic' && useCase == 'outcome' ? { mode: 'binary' } : { mode: 'discrete' }\n\n\t// condition term\n\tif (useCase == 'outcome') {\n\t\tif (regressionType == 'cox') {\n\t\t\t// do not preset timeScale to 'time' here because\n\t\t\t// that can cause copyMerge to overwrite saved setting\n\t\t\t// fillTW will auto fill missing value\n\t\t\tdefaultQ.condition = { mode: 'cox' }\n\t\t}\n\t\tif (regressionType == 'logistic') {\n\t\t\tdefaultQ.condition = { mode: 'binary' }\n\t\t}\n\t}\n\n\t// geneVariant term\n\tdefaultQ['geneVariant'] = { type: 'predefined-groupset' }\n\n\treturn defaultQ\n}\n\nexport async function makeChartBtnMenu(holder, chartsInstance) {\n\t/*\n\tholder: the holder in the tooltip\n\tchartsInstance: MassCharts instance\n\t*/\n\tconst allMethods = [\n\t\t{ label: 'Linear', type: 'linear' },\n\t\t{ label: 'Logistic', type: 'logistic' },\n\t\t{ label: 'Cox', type: 'cox' }\n\t]\n\tconst useMethods = allMethods.filter(i => chartsInstance.state.currentCohortChartTypes.includes(i.type))\n\tif (useMethods.length == 0) return holder.append('div').text('Error: no methods available')\n\tif (useMethods.length == 1) {\n\t\t// only 1 method supported. directly show ui for this method but not menu\n\t\tchartsInstance.dom.tip.hide()\n\t\tchartsInstance.prepPlot({ config: await getPrepConfig(useMethods[0].type, chartsInstance) })\n\t\treturn\n\t}\n\t// multiple methods. show menu to list them\n\tfor (const { label, type } of useMethods) {\n\t\tholder\n\t\t\t.append('div')\n\t\t\t.attr('class', 'sja_menuoption sja_sharp_border')\n\t\t\t.text(label)\n\t\t\t.on('click', async () => {\n\t\t\t\tchartsInstance.dom.tip.hide()\n\t\t\t\tchartsInstance.prepPlot({ config: await getPrepConfig(type, chartsInstance) })\n\t\t\t})\n\t}\n}\n\n/*\nconfig for the input ui of a regression method, launched by the \"plot_prep\" action\n\nthe outcome is filled in here rather than in getPlotConfig(), as \"plot_prep\" only calls\ngetPlotConfig() for a config holding nothing but the chart type (see plot_prep in mass/store.ts)\n*/\nasync function getPrepConfig(regressionType, chartsInstance) {\n\tconst config = { chartType: 'regression', regressionType, independent: [] }\n\tconst { app, state } = chartsInstance\n\tconst outcome = mayGetLoneOutcome(regressionType, app, state.activeCohort)\n\tif (!outcome) return config\n\ttry {\n\t\tawait fillTermWrapper(outcome, app.vocabApi, get_defaultQ4fillTW(regressionType, 'outcome'))\n\t\tconfig.outcome = outcome\n\t} catch (e) {\n\t\t// prefilling is a convenience; on failure launch the ui with a blank outcome pill\n\t\tconsole.error(`cannot prefill ${regressionType} outcome with \"${outcome.term.id}\": ${e}`)\n\t}\n\treturn config\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["e", "errors", "t_gs", "input", "i", "tw"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import {
|
|
2
|
+
skipPrevActionAbort,
|
|
3
|
+
storeInit
|
|
4
|
+
} from "./chunk-2TWVFQD2.js";
|
|
5
|
+
import {
|
|
6
|
+
recoverInit
|
|
7
|
+
} from "./chunk-UILBQKQ6.js";
|
|
8
|
+
import {
|
|
9
|
+
AppBase,
|
|
10
|
+
sayerror,
|
|
11
|
+
vocabInit
|
|
12
|
+
} from "./chunk-73PFJ2VF.js";
|
|
13
|
+
import {
|
|
14
|
+
importPlot
|
|
15
|
+
} from "./chunk-ZZMIDYRE.js";
|
|
16
|
+
import {
|
|
17
|
+
Menu
|
|
18
|
+
} from "./chunk-HYOEWQ5P.js";
|
|
19
|
+
import {
|
|
20
|
+
AppApi
|
|
21
|
+
} from "./chunk-H6INPPUC.js";
|
|
22
|
+
|
|
23
|
+
// plots/plot.app.ts
|
|
24
|
+
var PlotApp = class _PlotApp extends AppBase {
|
|
25
|
+
constructor(opts, api) {
|
|
26
|
+
super(opts);
|
|
27
|
+
this.components = {};
|
|
28
|
+
this.wasDestroyed = false;
|
|
29
|
+
this.api = api;
|
|
30
|
+
this.type = _PlotApp.type;
|
|
31
|
+
this.dom = this.getDom(opts);
|
|
32
|
+
}
|
|
33
|
+
static {
|
|
34
|
+
this.type = "app";
|
|
35
|
+
}
|
|
36
|
+
getDom(opts) {
|
|
37
|
+
const dom = {
|
|
38
|
+
holder: opts.holder,
|
|
39
|
+
errdiv: opts.holder.append("div"),
|
|
40
|
+
plotDiv: opts.holder.append("div")
|
|
41
|
+
};
|
|
42
|
+
const controls = opts.violin?.mode == "minimal" ? null : opts.holder.append("div").style("white-space", "nowrap");
|
|
43
|
+
if (controls) {
|
|
44
|
+
dom.plotControls = controls.append("div").style("display", "inline-block");
|
|
45
|
+
dom.recoverControls = controls.append("div").style("display", "inline-block");
|
|
46
|
+
}
|
|
47
|
+
return dom;
|
|
48
|
+
}
|
|
49
|
+
async preApiFreeze(api) {
|
|
50
|
+
try {
|
|
51
|
+
api.tip = new Menu({ padding: "5px" });
|
|
52
|
+
api.printError = (e) => this.printError(e);
|
|
53
|
+
const vocab = this.opts.state.vocab;
|
|
54
|
+
api.vocabApi = this.opts.vocabApi ? this.opts.vocabApi : await vocabInit({
|
|
55
|
+
app: api,
|
|
56
|
+
state: {
|
|
57
|
+
vocab: {
|
|
58
|
+
// either (genome + dslabel) XOR (terms) can be undefined
|
|
59
|
+
genome: vocab?.genome || this.opts.state.genome,
|
|
60
|
+
dslabel: vocab?.dslabel || this.opts.state.dslabel,
|
|
61
|
+
terms: vocab?.terms
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
fetchOpts: this.opts.fetchOpts
|
|
65
|
+
});
|
|
66
|
+
this.opts.state.vocab = api.vocabApi.vocab;
|
|
67
|
+
} catch (e) {
|
|
68
|
+
console.log(`preApiFreeze error`, e);
|
|
69
|
+
throw e;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async init() {
|
|
73
|
+
try {
|
|
74
|
+
this.opts.state.nav = { header_mode: "hidden" };
|
|
75
|
+
this.store = await storeInit({ app: this.api, state: this.opts.state });
|
|
76
|
+
this.state = await this.store.copyState();
|
|
77
|
+
this.components = {
|
|
78
|
+
plots: {}
|
|
79
|
+
};
|
|
80
|
+
if (this.opts.app?.features?.includes("recover"))
|
|
81
|
+
this.components.recover = await recoverInit({
|
|
82
|
+
app: this.api,
|
|
83
|
+
holder: this.dom.recoverControls,
|
|
84
|
+
// TODO: ???? may limit the tracked state to only the filter, activeCohort ???
|
|
85
|
+
getState: (appState) => appState,
|
|
86
|
+
//reactsTo: action => true, //action.type != 'plot_edit' || action.type == 'app_refresh',
|
|
87
|
+
maxHistoryLen: 10
|
|
88
|
+
});
|
|
89
|
+
if (this.opts.app?.doNotAwaitInitRender) {
|
|
90
|
+
this.api.dispatch();
|
|
91
|
+
} else {
|
|
92
|
+
await this.api.dispatch();
|
|
93
|
+
}
|
|
94
|
+
} catch (e) {
|
|
95
|
+
this.printError(e);
|
|
96
|
+
throw e;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async main() {
|
|
100
|
+
this.api.vocabApi.main();
|
|
101
|
+
for (const id in this.components.plots) {
|
|
102
|
+
const plot = this.components.plots[id];
|
|
103
|
+
if (!this.state.plots.find((p) => p.id === plot.id)) {
|
|
104
|
+
plot.destroy();
|
|
105
|
+
delete this.components.plots[id];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
for (const plot of this.state.plots.values()) {
|
|
109
|
+
if (plot.parentId) continue;
|
|
110
|
+
if (!this.components.plots[plot.id]) {
|
|
111
|
+
const holder = this.opts?.app?.getPlotHolder ? this.opts.app.getPlotHolder(plot, this.dom.holder) : this.dom.holder.append("div");
|
|
112
|
+
if (!this.dom.plotDiv) this.dom.plotDiv = holder;
|
|
113
|
+
const { componentInit } = await importPlot(plot.chartType);
|
|
114
|
+
const plotApi = await componentInit({
|
|
115
|
+
id: plot.id,
|
|
116
|
+
app: this.api,
|
|
117
|
+
holder,
|
|
118
|
+
controls: this.dom.plotControls
|
|
119
|
+
});
|
|
120
|
+
this.components.plots[plot.id] = plotApi;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
printError(e) {
|
|
125
|
+
sayerror(this.dom.errdiv, "Error: " + (e.message || e));
|
|
126
|
+
if (e.stack) console.log(e.stack);
|
|
127
|
+
this.bus.emit("error");
|
|
128
|
+
}
|
|
129
|
+
skipPrevActionAbort(action) {
|
|
130
|
+
return skipPrevActionAbort(action);
|
|
131
|
+
}
|
|
132
|
+
destroy() {
|
|
133
|
+
if (this.dom?.holder) this.dom.holder.selectAll("*").remove();
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
var appInit = AppApi.getInitFxn(PlotApp);
|
|
137
|
+
|
|
138
|
+
export {
|
|
139
|
+
appInit
|
|
140
|
+
};
|
|
141
|
+
//# sourceMappingURL=chunk-E732F6XI.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../plots/plot.app.ts"],
|
|
4
|
+
"sourcesContent": ["import { AppApi, type RxApp, type ComponentApi } from '../rx'\nimport { AppBase } from '#plots/AppBase.ts'\nimport { storeInit } from '#mass/store'\nimport { skipPrevActionAbort as skipAbortPolicy } from '#mass/skipPrevActionAbort'\nimport { vocabInit } from '#termdb/vocabulary'\nimport { recoverInit } from '../rx/src/recover'\nimport { sayerror, Menu } from '#dom'\nimport { importPlot } from '#plots/importPlot.js'\n\n/*\nthe purpose of this wrapper is to allow a mass plot to be used with control options outside of mass app\n\nTODO allow to hide controls. e.g. in the cuminc plot integrated into cox-snplocus, allowing to get rid of duplicating code of Cuminc class in cuminc.js\n\nFIXME convert to ts and fully type opts\n\nconstructor options (opts)\n\n\t.holder\n\t\td3-wrapped DOM container\n\n\t.vocabApi\n\t\trequired if state.vocab is not provided\n\n\t.violin{}\n\t\t.mode='minimal'??\n\n\t.app{}\n\t\t.features{}\n\t\t.getPlotHolder() ??\n\n\t.fetchOpts{}\n\t.state: {\n\t\t\n\t\t// required if opts.vocabApi is not provided\n\t\t.vocab: { \n\t\t\tgenome\n\t\t\tdslabel\n\t\t}\n\t\t\n\t\t// required\n\t\tplots[{}] options for rendering 1 or more plot(s), for example:\n\n\t\t[{\n\t\t\tchartType: 'summary',\n\t\t\tchildType: 'barchart',\n\t\t\tterm: {},\n\t\t\tterm2: {},\n\t\t\tsettings: {\n\t\t\t\tbarchart: {\n\t\t\t\t\tunit: 'pct'\n\t\t\t\t}\n\t\t\t}\n\t\t}]\n\t}\n*/\n\nclass PlotApp extends AppBase implements RxApp {\n\tstatic type = 'app'\n\n\t// expected RxApp, some are already declared/set in AppBase\n\tapi: AppApi\n\ttype: string\n\tparentId?: string\n\tdom!: {\n\t\t[index: string]: any\n\t}\n\tcomponents: {\n\t\t[name: string]: ComponentApi | { [name: string]: ComponentApi }\n\t} = {}\n\n\twasDestroyed = false\n\tstore: any\n\tbus!: any\n\n\tconstructor(opts, api) {\n\t\tsuper(opts)\n\t\tthis.api = api\n\t\tthis.type = PlotApp.type\n\t\tthis.dom = this.getDom(opts)\n\t}\n\n\tgetDom(opts) {\n\t\t// this will create divs in the correct stacking order\n\t\tconst dom: { [index: string]: any } = {\n\t\t\tholder: opts.holder,\n\t\t\terrdiv: opts.holder.append('div'),\n\t\t\tplotDiv: opts.holder.append('div')\n\t\t}\n\t\tconst controls = opts.violin?.mode == 'minimal' ? null : opts.holder.append('div').style('white-space', 'nowrap')\n\t\tif (controls) {\n\t\t\tdom.plotControls = controls.append('div').style('display', 'inline-block')\n\t\t\tdom.recoverControls = controls.append('div').style('display', 'inline-block')\n\t\t}\n\t\treturn dom\n\t}\n\n\tasync preApiFreeze(api) {\n\t\ttry {\n\t\t\tapi.tip = new Menu({ padding: '5px' })\n\t\t\tapi.printError = e => this.printError(e)\n\n\t\t\tconst vocab = this.opts.state.vocab\n\n\t\t\tapi.vocabApi = this.opts.vocabApi\n\t\t\t\t? this.opts.vocabApi\n\t\t\t\t: await vocabInit({\n\t\t\t\t\t\tapp: api,\n\t\t\t\t\t\tstate: {\n\t\t\t\t\t\t\tvocab: {\n\t\t\t\t\t\t\t\t// either (genome + dslabel) XOR (terms) can be undefined\n\t\t\t\t\t\t\t\tgenome: vocab?.genome || this.opts.state.genome,\n\t\t\t\t\t\t\t\tdslabel: vocab?.dslabel || this.opts.state.dslabel,\n\t\t\t\t\t\t\t\tterms: vocab?.terms\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfetchOpts: this.opts.fetchOpts\n\t\t\t\t })\n\n\t\t\t// the vocabApi's vocab may be reprocessed from the original input\n\t\t\tthis.opts.state.vocab = api.vocabApi.vocab\n\t\t} catch (e) {\n\t\t\tconsole.log(`preApiFreeze error`, e)\n\t\t\tthrow e\n\t\t}\n\t}\n\n\tasync init() {\n\t\t// catch initialization error\n\t\ttry {\n\t\t\t// this plot.app does not create a this.components.nav, unlike mass/app.js\n\t\t\t// so the nav is always hidden, can be hardcoded here\n\t\t\tthis.opts.state.nav = { header_mode: 'hidden' }\n\t\t\tthis.store = await storeInit({ app: this.api, state: this.opts.state })\n\t\t\tthis.state = await this.store.copyState()\n\t\t\tthis.components = {\n\t\t\t\tplots: {}\n\t\t\t}\n\t\t\tif (this.opts.app?.features?.includes('recover'))\n\t\t\t\tthis.components.recover = await recoverInit({\n\t\t\t\t\tapp: this.api,\n\t\t\t\t\tholder: this.dom.recoverControls,\n\t\t\t\t\t// TODO: ???? may limit the tracked state to only the filter, activeCohort ???\n\t\t\t\t\tgetState: appState => appState,\n\t\t\t\t\t//reactsTo: action => true, //action.type != 'plot_edit' || action.type == 'app_refresh',\n\t\t\t\t\tmaxHistoryLen: 10\n\t\t\t\t})\n\n\t\t\tif (this.opts.app?.doNotAwaitInitRender) {\n\t\t\t\t// do not await to return the instance sooner and allow calling appApi.triggerAbort() before initial render,\n\t\t\t\t// instead of waiting for initial data loading and rendering\n\t\t\t\tthis.api.dispatch()\n\t\t\t} else {\n\t\t\t\tawait this.api.dispatch()\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis.printError(e)\n\t\t\tthrow e\n\t\t}\n\t}\n\n\tasync main() {\n\t\tthis.api.vocabApi.main()\n\n\t\tfor (const id in this.components.plots) {\n\t\t\tconst plot = this.components.plots[id]\n\t\t\tif (!this.state.plots.find(p => p.id === plot.id)) {\n\t\t\t\tplot.destroy()\n\t\t\t\tdelete this.components.plots[id]\n\t\t\t}\n\t\t}\n\n\t\tfor (const plot of this.state.plots.values()) {\n\t\t\t/** plots with parentId means the parent plot will trigger the plot instead of being triggered here\n\t\t\t * (e.g. subplots with SC app). Mimics the same behavior in client/mass/app.ts main() */\n\t\t\tif (plot.parentId) continue\n\t\t\tif (!this.components.plots[plot.id]) {\n\t\t\t\tconst holder = this.opts?.app?.getPlotHolder\n\t\t\t\t\t? this.opts.app.getPlotHolder(plot, this.dom.holder)\n\t\t\t\t\t: this.dom.holder.append('div')\n\n\t\t\t\t// quick fix to only track the plotDiv for the first plot\n\t\t\t\t// TODO: reliably handle the case where a plotApp instance may have multiple plots/holders\n\t\t\t\tif (!this.dom.plotDiv) this.dom.plotDiv = holder\n\t\t\t\tconst { componentInit } = await importPlot(plot.chartType)\n\t\t\t\tconst plotApi = await componentInit({\n\t\t\t\t\tid: plot.id,\n\t\t\t\t\tapp: this.api,\n\t\t\t\t\tholder,\n\t\t\t\t\tcontrols: this.dom.plotControls\n\t\t\t\t})\n\t\t\t\tthis.components.plots[plot.id] = plotApi\n\t\t\t}\n\t\t}\n\t}\n\n\tprintError(e) {\n\t\tsayerror(this.dom.errdiv, 'Error: ' + (e.message || e))\n\t\tif (e.stack) console.log(e.stack)\n\t\tthis.bus.emit('error')\n\t}\n\n\tskipPrevActionAbort(action) {\n\t\treturn skipAbortPolicy(action)\n\t}\n\n\tdestroy() {\n\t\tif (this.dom?.holder) this.dom.holder.selectAll('*').remove()\n\t}\n}\n\nexport const appInit = AppApi.getInitFxn(PlotApp)\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import {
|
|
2
|
+
tkt
|
|
3
|
+
} from "./chunk-73PFJ2VF.js";
|
|
4
|
+
import {
|
|
5
|
+
stratinput
|
|
6
|
+
} from "./chunk-PF4DSFDR.js";
|
|
7
|
+
import {
|
|
8
|
+
stratify_default
|
|
9
|
+
} from "./chunk-VQZ2Z5YU.js";
|
|
10
|
+
|
|
11
|
+
// src/vcf.tkconvert.js
|
|
12
|
+
function vcf2dstk(arg) {
|
|
13
|
+
const ds = {
|
|
14
|
+
id2vcf: {},
|
|
15
|
+
label: arg.name || "Unnamed VCF file"
|
|
16
|
+
};
|
|
17
|
+
let vcfobj;
|
|
18
|
+
if (arg.file) {
|
|
19
|
+
const id = Math.random().toString();
|
|
20
|
+
vcfobj = {
|
|
21
|
+
file: arg.file,
|
|
22
|
+
indexURL: arg.indexURL,
|
|
23
|
+
vcfid: id
|
|
24
|
+
};
|
|
25
|
+
ds.id2vcf[id] = vcfobj;
|
|
26
|
+
} else if (arg.url) {
|
|
27
|
+
const id = Math.random().toString();
|
|
28
|
+
vcfobj = {
|
|
29
|
+
url: arg.url,
|
|
30
|
+
indexURL: arg.indexURL,
|
|
31
|
+
vcfid: id
|
|
32
|
+
};
|
|
33
|
+
ds.id2vcf[id] = vcfobj;
|
|
34
|
+
} else {
|
|
35
|
+
return ["no .file or .url"];
|
|
36
|
+
}
|
|
37
|
+
vcfobj.headernotloaded = true;
|
|
38
|
+
if (arg.samplenamemap) {
|
|
39
|
+
vcfobj.samplenamemap = arg.samplenamemap;
|
|
40
|
+
}
|
|
41
|
+
if (arg.variant2img) {
|
|
42
|
+
if (!arg.variant2img.path) return [".path missing from .variant2img{}"];
|
|
43
|
+
}
|
|
44
|
+
const tk = {
|
|
45
|
+
type: tkt.ds,
|
|
46
|
+
// to be loaded by loadvcftk() as a custom track, rather than "/dsdata" for official ds
|
|
47
|
+
isvcf: true,
|
|
48
|
+
name: ds.label,
|
|
49
|
+
ds,
|
|
50
|
+
populationfrequencyfilter: arg.populationfrequencyfilter,
|
|
51
|
+
vcfinfofilter: arg.vcfinfofilter,
|
|
52
|
+
itemlabelname: arg.itemlabelname,
|
|
53
|
+
viewrangeupperlimit: arg.viewrangeupperlimit,
|
|
54
|
+
variant2img: arg.variant2img,
|
|
55
|
+
axisheight: arg.axisheight
|
|
56
|
+
};
|
|
57
|
+
if (arg.url4variant) {
|
|
58
|
+
const err = check_url4variant(arg.url4variant);
|
|
59
|
+
if (err) return [".url4variant error: " + err];
|
|
60
|
+
tk.url4variant = arg.url4variant;
|
|
61
|
+
}
|
|
62
|
+
if (arg.button4variant) {
|
|
63
|
+
const err = check_button4variant(arg.button4variant);
|
|
64
|
+
if (err) return [".button4variant error: " + err];
|
|
65
|
+
tk.button4variant = arg.button4variant;
|
|
66
|
+
}
|
|
67
|
+
if (arg.sampleannotation) {
|
|
68
|
+
const sn = arg.sampleannotation;
|
|
69
|
+
if (!sn.annotation) return [".annotation{} missing from .sampleannotation"];
|
|
70
|
+
if (sn.levels) {
|
|
71
|
+
if (!Array.isArray(sn.levels)) return [".sampleannotation.levels should be array"];
|
|
72
|
+
const lst = [];
|
|
73
|
+
for (const sample in sn.annotation) {
|
|
74
|
+
const o = { sample_name: sample };
|
|
75
|
+
for (const k in sn.annotation[sample]) {
|
|
76
|
+
o[k] = sn.annotation[sample][k];
|
|
77
|
+
}
|
|
78
|
+
lst.push(o);
|
|
79
|
+
}
|
|
80
|
+
const nodes = stratinput(lst, sn.levels);
|
|
81
|
+
sn.root = stratify_default()(nodes);
|
|
82
|
+
sn.root.sum((i) => i.value);
|
|
83
|
+
}
|
|
84
|
+
if (sn.variantsunburst) {
|
|
85
|
+
if (!sn.levels) return [".levels missing when .variantsunburst is on from .sampleannotation"];
|
|
86
|
+
}
|
|
87
|
+
tk.ds.cohort = sn;
|
|
88
|
+
}
|
|
89
|
+
if (arg.vcfcohorttrack) {
|
|
90
|
+
if (!arg.vcfcohorttrack.file && !arg.vcfcohorttrack.url) return ["no .file or .url provided from .vcfcohorttrack"];
|
|
91
|
+
tk.ds.vcfcohorttrack = arg.vcfcohorttrack;
|
|
92
|
+
}
|
|
93
|
+
if (arg.germline2dvafplot) {
|
|
94
|
+
if (!arg.germline2dvafplot.individualkey) return [".individualkey missing from germline2dvafplot"];
|
|
95
|
+
if (!arg.germline2dvafplot.sampletypekey) return [".sampletypekey missing from germline2dvafplot"];
|
|
96
|
+
if (!arg.germline2dvafplot.xsampletype) return [".xsampletype missing from germline2dvafplot"];
|
|
97
|
+
if (!arg.germline2dvafplot.yleftsampletype) return [".yleftsampletype missing from germline2dvafplot"];
|
|
98
|
+
if (arg.germline2dvafplot.yrightsampletype) {
|
|
99
|
+
if (arg.germline2dvafplot.yrightsampletype == arg.germline2dvafplot.yleftsampletype)
|
|
100
|
+
return [".yrightsampletype should not be same as yleftsampletype"];
|
|
101
|
+
}
|
|
102
|
+
tk.ds.germline2dvafplot = arg.germline2dvafplot;
|
|
103
|
+
}
|
|
104
|
+
if (arg.vaf2coverageplot) {
|
|
105
|
+
if (arg.vaf2coverageplot.categorykey) {
|
|
106
|
+
if (!arg.vaf2coverageplot.categories)
|
|
107
|
+
return [".categories missing when .categorykey is in use for .vaf2coverageplot"];
|
|
108
|
+
}
|
|
109
|
+
tk.ds.vaf2coverageplot = arg.vaf2coverageplot;
|
|
110
|
+
}
|
|
111
|
+
if (arg.genotype2boxplot) {
|
|
112
|
+
if (arg.genotype2boxplot.boxplotvaluekey) {
|
|
113
|
+
} else if (arg.genotype2boxplot.sampleannotationkey) {
|
|
114
|
+
if (!tk.ds.cohort) return ["sampleannotation missing when using genotype2boxplot.sampleannotationkey"];
|
|
115
|
+
if (!tk.ds.cohort.annotation)
|
|
116
|
+
return ["sampleannotation.annotation missing when using genotype2boxplot.sampleannotationkey"];
|
|
117
|
+
let found = false;
|
|
118
|
+
for (const k in tk.ds.cohort.annotation) {
|
|
119
|
+
if (arg.genotype2boxplot.sampleannotationkey in tk.ds.cohort.annotation[k]) {
|
|
120
|
+
found = true;
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (!found) return [arg.genotype2boxplot.sampleannotationkey + " not found in any sample annotation"];
|
|
125
|
+
} else {
|
|
126
|
+
return ["incomplete instruction for genotype2boxplot"];
|
|
127
|
+
}
|
|
128
|
+
tk.ds.genotype2boxplot = arg.genotype2boxplot;
|
|
129
|
+
}
|
|
130
|
+
if (arg.discardsymbolicallele) {
|
|
131
|
+
tk.ds.discardsymbolicallele = true;
|
|
132
|
+
}
|
|
133
|
+
if (arg.samplebynumericvalue) {
|
|
134
|
+
if (!arg.samplebynumericvalue.attrkey) return ["attrkey missing from samplebynumericvalue"];
|
|
135
|
+
if (!tk.ds.cohort) return ["sampleannotation missing when using samplebynumericvalue"];
|
|
136
|
+
if (!tk.ds.cohort.annotation) return ["sampleannotation.annotation missing when using samplebynumericvalue"];
|
|
137
|
+
let found = false;
|
|
138
|
+
for (const k in tk.ds.cohort.annotation) {
|
|
139
|
+
if (Number.isFinite(tk.ds.cohort.annotation[k][arg.samplebynumericvalue.attrkey])) {
|
|
140
|
+
found = true;
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
if (!found) return ["samplebynumericvalue.attrkey not found in any sample annotation"];
|
|
145
|
+
tk.ds.samplebynumericvalue = arg.samplebynumericvalue;
|
|
146
|
+
}
|
|
147
|
+
{
|
|
148
|
+
const g = arg.genotypebynumericvalue;
|
|
149
|
+
if (g) {
|
|
150
|
+
if (!g.refref) return [tk.name + ": refref missing from genotypebynumericvalue"];
|
|
151
|
+
if (!g.refalt) return [tk.name + ": refalt missing from genotypebynumericvalue"];
|
|
152
|
+
if (!g.altalt) return [tk.name + ": altalt missing from genotypebynumericvalue"];
|
|
153
|
+
if (!g.refref.infokey) return [tk.name + ": refref.infokey missing from genotypebynumericvalue"];
|
|
154
|
+
if (!g.refalt.infokey) return [tk.name + ": refalt.infokey missing from genotypebynumericvalue"];
|
|
155
|
+
if (!g.altalt.infokey) return [tk.name + ": altalt.infokey missing from genotypebynumericvalue"];
|
|
156
|
+
if (g.refref.genotypeCountInfokey || g.refalt.genotypeCountInfokey || g.altalt.genotypeCountInfokey) {
|
|
157
|
+
if (!g.refref.genotypeCountInfokey)
|
|
158
|
+
return [tk.name + ": genotypeCountInfokey missing from genotypebynumericvalue.refref{}"];
|
|
159
|
+
if (!g.refalt.genotypeCountInfokey)
|
|
160
|
+
return [tk.name + ": genotypeCountInfokey missing from genotypebynumericvalue.refalt{}"];
|
|
161
|
+
if (!g.altalt.genotypeCountInfokey)
|
|
162
|
+
return [tk.name + ": genotypeCountInfokey missing from genotypebynumericvalue.altalt{}"];
|
|
163
|
+
}
|
|
164
|
+
tk.ds.genotypebynumericvalue = g;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (arg.pointdown) {
|
|
168
|
+
tk.aboveprotein = false;
|
|
169
|
+
}
|
|
170
|
+
if (arg.dstk_novcferror) {
|
|
171
|
+
tk.dstk_novcferror = true;
|
|
172
|
+
}
|
|
173
|
+
return [null, tk];
|
|
174
|
+
}
|
|
175
|
+
function check_url4variant(lst) {
|
|
176
|
+
if (!Array.isArray(lst)) return "value is not an array";
|
|
177
|
+
for (const item of lst) {
|
|
178
|
+
if (!item.makeurl) {
|
|
179
|
+
return ".makeurl missing";
|
|
180
|
+
}
|
|
181
|
+
if (typeof item.makeurl != "function") {
|
|
182
|
+
return ".makeurl must be a function";
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
function check_button4variant(lst) {
|
|
188
|
+
if (!Array.isArray(lst)) return "value is not an array";
|
|
189
|
+
for (const item of lst) {
|
|
190
|
+
if (!item.makebutton) {
|
|
191
|
+
return ".makebutton missing";
|
|
192
|
+
}
|
|
193
|
+
if (typeof item.makebutton != "function") {
|
|
194
|
+
return ".makebutton must be a function";
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export {
|
|
201
|
+
vcf2dstk
|
|
202
|
+
};
|
|
203
|
+
//# sourceMappingURL=chunk-FESRWKYY.js.map
|