@sjcrh/proteinpaint-client 2.74.2 → 2.76.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-b2d78c57.js → 2dmaf-74b99126.js} +1 -1
- package/dist/AppHeader-cecb39c2.js +1 -0
- package/dist/{ColorScale-9c76aef3.js → ColorScale-21cab8d2.js} +1 -1
- package/dist/DEanalysis-95bad59a.js +1 -0
- package/dist/Disco-a6e921a0.js +1 -0
- package/dist/Disco.UI-9ad999ed.js +1 -0
- package/dist/{DragControls-586f72db.js → DragControls-e3b6a937.js} +1 -1
- package/dist/{DziViewer-6311327c.js → DziViewer-354a790d.js} +1 -1
- package/dist/FilterRxComp-701a1480.js +1 -0
- package/dist/{FilterStateless-046081c2.js → FilterStateless-54c0b763.js} +1 -1
- package/dist/{HicApp-40e44cba.js → HicApp-d5a946bf.js} +1 -1
- package/dist/{OrbitControls-0cda1772.js → OrbitControls-694652cd.js} +1 -1
- package/dist/WSIViewer-dc7f8eb0.js +1 -0
- package/dist/adSandbox-f438e388.js +1 -0
- package/dist/app-3320ab6f.js +1 -0
- package/dist/app-649f8357.js +1 -0
- package/dist/app-b369b169.js +1 -0
- package/dist/app.js +1 -1
- package/dist/bam-431875ef.js +1 -0
- package/dist/barchart-8277ed43.js +1 -0
- package/dist/barchart.events-da29c90d.js +1 -0
- package/dist/{bars.renderer-5f7a4174.js → bars.renderer-dcfdd59b.js} +1 -1
- package/dist/block-6aedd569.js +1 -0
- package/dist/block.lazyload-87b12654.js +1 -0
- package/dist/block.legend-d3f61ef7.js +1 -0
- package/dist/{block.mds-effc078d.js → block.mds-3ad17dfa.js} +1 -1
- package/dist/{block.mds.cnv-ec861a26.js → block.mds.cnv-857ba868.js} +1 -1
- package/dist/{block.mds.expressionrank-a2ad7c80.js → block.mds.expressionrank-7e3b208c.js} +1 -1
- package/dist/{block.mds.expressionstat-31dc5595.js → block.mds.expressionstat-f2d31c86.js} +1 -1
- package/dist/{block.mds.geneboxplot-3ca857ce.js → block.mds.geneboxplot-f0fbaf12.js} +1 -1
- package/dist/{block.mds.junction-debba938.js → block.mds.junction-7f87f48f.js} +1 -1
- package/dist/{block.mds.svcnv-8dc5abdf.js → block.mds.svcnv-ac035c12.js} +1 -1
- package/dist/{block.mds.svcnv.share-81e62600.js → block.mds.svcnv.share-886d9479.js} +1 -1
- package/dist/block.mds2-7852c1ee.js +1 -0
- package/dist/{block.svg-9121e8e7.js → block.svg-9b916fa6.js} +1 -1
- package/dist/{block.tk.aicheck-c1b478e9.js → block.tk.aicheck-6770e333.js} +1 -1
- package/dist/{block.tk.ase-0f6ded48.js → block.tk.ase-ee807e59.js} +1 -1
- package/dist/{block.tk.bam-7cd06aee.js → block.tk.bam-00fba6e8.js} +1 -1
- package/dist/{block.tk.bedgraphdot-3ef8b94e.js → block.tk.bedgraphdot-7fda78e9.js} +1 -1
- package/dist/{block.tk.bigwig.ui-d1248810.js → block.tk.bigwig.ui-cc1a42f3.js} +1 -1
- package/dist/{block.tk.hicstraw-ee731e55.js → block.tk.hicstraw-526470e3.js} +1 -1
- package/dist/{block.tk.junction-4d8cab4d.js → block.tk.junction-b43a4cda.js} +1 -1
- package/dist/{block.tk.junction.textmatrixui-a6430b27.js → block.tk.junction.textmatrixui-a60ed78a.js} +1 -1
- package/dist/{block.tk.ld-8429a18b.js → block.tk.ld-d15bde41.js} +1 -1
- package/dist/{block.tk.menu-3f31f958.js → block.tk.menu-3aeb93c6.js} +1 -1
- package/dist/{block.tk.pgv-07e46705.js → block.tk.pgv-9af2bd64.js} +1 -1
- package/dist/boxplot-e17a17b7.js +1 -0
- package/dist/brainImaging-bf2ceee9.js +1 -0
- package/dist/{brush-c386fe3d.js → brush-aa175142.js} +1 -1
- package/dist/categorical-a52014a1.js +1 -0
- package/dist/condition-c646e357.js +1 -0
- package/dist/controls-287e6efa.js +1 -0
- package/dist/{controls.btns-1cb2bfab.js → controls.btns-79b805dd.js} +1 -1
- package/dist/controls.config-28d6d6a8.js +1 -0
- package/dist/cuminc-9e275854.js +1 -0
- package/dist/{customdata.inputui-cbd712ea.js → customdata.inputui-dc49d94b.js} +1 -1
- package/dist/dataDownload-3a3d4f33.js +1 -0
- package/dist/databrowser.ui-d8d3f8fd.js +1 -0
- package/dist/{density-19266ebf.js → density-a82a8b1c.js} +1 -1
- package/dist/dictionary-c5a19d90.js +1 -0
- package/dist/{drag-0b968811.js → drag-7b30ba17.js} +1 -1
- package/dist/{e2pca-b8752945.js → e2pca-82765817.js} +1 -1
- package/dist/{ep-a86b185a.js → ep-d017ec2f.js} +1 -1
- package/dist/facet-a9b44ef3.js +1 -0
- package/dist/{fusion.parse-244b2b97.js → fusion.parse-d40d0b9d.js} +1 -1
- package/dist/geneExpClustering-34c3f518.js +1 -0
- package/dist/geneExpression-0d1b7244.js +1 -0
- package/dist/{geneExpression-e0430f2e.js → geneExpression-589f485b.js} +1 -1
- package/dist/{geneExpression-387205bf.js → geneExpression-7d14983f.js} +1 -1
- package/dist/geneORA-903a780f.js +1 -0
- package/dist/{geneVariant-7de021b6.js → geneVariant-89601b34.js} +1 -1
- package/dist/geneVariant-92c4e870.js +1 -0
- package/dist/{genefusion.ui-a331de19.js → genefusion.ui-7e22e811.js} +1 -1
- package/dist/{genesearch-ea59f5d4.js → genesearch-a4e19f0d.js} +1 -1
- package/dist/geneset-108a39d2.js +1 -0
- package/dist/genomeBrowser-12f86a36.js +1 -0
- package/dist/genomeBrowser.controls-d5067811.js +1 -0
- package/dist/{groupsetting-20ffef77.js → groupsetting-b4416a96.js} +1 -1
- package/dist/gsea-543dab25.js +1 -0
- package/dist/hierCluster-26e14090.js +1 -0
- package/dist/hierCluster.config-98e82dff.js +1 -0
- package/dist/{hierCluster.interactivity-9b433033.js → hierCluster.interactivity-e56f6542.js} +1 -1
- package/dist/hierCluster.renderers-74a64cf5.js +1 -0
- package/dist/{html.legend-abb5452e.js → html.legend-a3f4ebfe.js} +1 -1
- package/dist/imagePlot-b9eae4ae.js +1 -0
- package/dist/{lasso-55cf4057.js → lasso-f767f634.js} +1 -1
- package/dist/launch.adhoc-abca6af3.js +1 -0
- package/dist/leftlabel.sample-24c2388d.js +1 -0
- package/dist/legacyDataset-e0e201ab.js +1 -0
- package/dist/{log-cf45fcf2.js → log-99af3443.js} +1 -1
- package/dist/{lollipop-c5b6e615.js → lollipop-806f8fa4.js} +1 -1
- package/dist/{maf-7535f1f9.js → maf-b06579e4.js} +1 -1
- package/dist/{maftimeline-1292ab62.js → maftimeline-4840a380.js} +1 -1
- package/dist/matrix-00bb50ff.js +1 -0
- package/dist/matrix.cells-914dd0c6.js +1 -0
- package/dist/{matrix.cluster-168bc96b.js → matrix.cluster-783ceab0.js} +1 -1
- package/dist/matrix.config-6ce74dfe.js +1 -0
- package/dist/matrix.controls-7b2a6f95.js +1 -0
- package/dist/{matrix.data-b1d0febe.js → matrix.data-dac4f1b7.js} +1 -1
- package/dist/{matrix.dom-00defa30.js → matrix.dom-4e10bbe9.js} +1 -1
- package/dist/matrix.groups-b9fca14a.js +1 -0
- package/dist/matrix.interactivity-84169b43.js +1 -0
- package/dist/{matrix.layout-c2345231.js → matrix.layout-dd5a44fd.js} +1 -1
- package/dist/matrix.legend-ac6d45e6.js +1 -0
- package/dist/matrix.renderers-78010275.js +1 -0
- package/dist/matrix.serieses-9b4fd744.js +1 -0
- package/dist/matrix.sort-014d798d.js +1 -0
- package/dist/{matrix.sorterUi-a741ba2e.js → matrix.sorterUi-9bf7e6f9.js} +1 -1
- package/dist/{mavb-92136d17.js → mavb-c6be46fc.js} +1 -1
- package/dist/{mds.fimo-c03115b4.js → mds.fimo-bff6a1ed.js} +1 -1
- package/dist/mds.samplescatterplot-9a02b9fb.js +1 -0
- package/dist/{mds.survivalplot-366db380.js → mds.survivalplot-055549f4.js} +1 -1
- package/dist/{metaboliteIntensity-ddb6e480.js → metaboliteIntensity-fac92f8b.js} +1 -1
- package/dist/niceNumLabels-238aabce.js +1 -0
- package/dist/{nodrag-2c046d31.js → nodrag-16ad4b03.js} +1 -1
- package/dist/{notify-44ebc0df.js → notify-224cccbd.js} +1 -1
- package/dist/{numeric-918d4686.js → numeric-b0b17185.js} +1 -1
- package/dist/numeric.binary-1f9e93f2.js +1 -0
- package/dist/numeric.continuous-ebcd0567.js +1 -0
- package/dist/numeric.discrete-7b97044a.js +1 -0
- package/dist/numeric.spline-1be88f3d.js +1 -0
- package/dist/numeric.toggle-7fa2a770.js +1 -0
- package/dist/oncomatrix-351af2a0.js +1 -0
- package/dist/{parseData-e66308cd.js → parseData-21fe9822.js} +1 -1
- package/dist/partjson.esm-b3f1fc21.js +1 -0
- package/dist/{plot.2dvaf-73dbfbd1.js → plot.2dvaf-18a35e4b.js} +1 -1
- package/dist/plot.app-30c4b8e5.js +1 -0
- package/dist/plot.barplot-7c4865a2.js +1 -0
- package/dist/{plot.boxplot-641da058.js → plot.boxplot-fe3046c6.js} +1 -1
- package/dist/plot.brainImaging-2ceb6023.js +1 -0
- package/dist/plot.disco-6011f87f.js +1 -0
- package/dist/{plot.dzi-41ea26e5.js → plot.dzi-6728a7c8.js} +1 -1
- package/dist/plot.ssgq-5581dc56.js +1 -0
- package/dist/{plot.vaf2cov-80e58833.js → plot.vaf2cov-b2284c64.js} +1 -1
- package/dist/{plot.wsi-51cc48ef.js → plot.wsi-9a9d4034.js} +1 -1
- package/dist/profileBarchart-0476f1f8.js +1 -0
- package/dist/profileHome-32eb9b50.js +1 -0
- package/dist/profilePlot-c7e099e8.js +1 -0
- package/dist/profilePolar-6b981e63.js +1 -0
- package/dist/profileRadar-bca1cc03.js +1 -0
- package/dist/profileRadarFacility-bbb1ecd8.js +1 -0
- package/dist/profileSummary-b114204f.js +1 -0
- package/dist/recover-49e09de0.js +1 -0
- package/dist/regression.inputs-a761f40d.js +1 -0
- package/dist/regression.inputs.values.table-5929d25a.js +1 -0
- package/dist/regression.results-69bc42d0.js +1 -0
- package/dist/{renderPvalueTable-895a72c2.js → renderPvalueTable-dc5d15f2.js} +1 -1
- package/dist/sampleScatter-2d0ed680.js +1 -0
- package/dist/{sampleScatter.rendererThree-5e686004.js → sampleScatter.rendererThree-0b12ac61.js} +2 -2
- package/dist/sampleView-484ab133.js +1 -0
- package/dist/samplelst-689796e6.js +1 -0
- package/dist/{samplematrix-2a1d7d82.js → samplematrix-2b137a05.js} +1 -1
- package/dist/scatter-205e013f.js +1 -0
- package/dist/{select2Terms-b4fffc50.js → select2Terms-b21e184a.js} +1 -1
- package/dist/{selectGenomeWithTklst-acf7e568.js → selectGenomeWithTklst-466995b4.js} +1 -1
- package/dist/singleCellCellType-5db730bb.js +1 -0
- package/dist/{singleCellGeneExpression-6de17162.js → singleCellGeneExpression-7147a2d0.js} +1 -1
- package/dist/singleCellPlot-73b2738f.js +1 -0
- package/dist/{singlecell-f76c856a.js → singlecell-24409b72.js} +1 -1
- package/dist/singlecell-bca774ed.js +1 -0
- package/dist/{snp-9590a1b4.js → snp-37d06246.js} +1 -1
- package/dist/snp-a8388ce4.js +1 -0
- package/dist/snplocus-7a1ea8c9.js +1 -0
- package/dist/{snplst-007a1926.js → snplst-6865d7c7.js} +1 -1
- package/dist/{spliceevent.a53ss.diagram-63dfef69.js → spliceevent.a53ss.diagram-e2eab72b.js} +1 -1
- package/dist/{spliceevent.exonskip.diagram-76fa9af8.js → spliceevent.exonskip.diagram-4d5df3a1.js} +1 -1
- package/dist/spliceevent.exonskip.getdefault-a94aad6e.js +1 -0
- package/dist/{spliceevent.noeventdiagram-64a099e0.js → spliceevent.noeventdiagram-ea97b0fb.js} +1 -1
- package/dist/{spliceevent.phrase-770c8cac.js → spliceevent.phrase-c5832470.js} +1 -1
- package/dist/{stattable-f1189f0f.js → stattable-7c5ecc2f.js} +1 -1
- package/dist/{style.gdc-89cfdb0f.js → style.gdc-131f3c77.js} +1 -1
- package/dist/summary-5ec455d3.js +1 -0
- package/dist/{sunburst-d5379952.js → sunburst-533902a7.js} +1 -1
- package/dist/survival-92250664.js +1 -0
- package/dist/survival-e16e068f.js +1 -0
- package/dist/{svg.download-86850940.js → svg.download-35926549.js} +1 -1
- package/dist/{svg.legend-a94b0697.js → svg.legend-8d490df2.js} +1 -1
- package/dist/{svgraph-c57b9ae3.js → svgraph-6fac8cbc.js} +1 -1
- package/dist/{svmr-cf6f1b27.js → svmr-d07ff695.js} +1 -1
- package/dist/table-29d5a973.js +1 -0
- package/dist/table-ad744310.js +1 -0
- package/dist/termInfo-bf99a37e.js +1 -0
- package/dist/{termdb.bins-9faa5170.js → termdb.bins-8b656cc3.js} +1 -1
- package/dist/termsetting-33ea66f1.js +1 -0
- package/dist/tk-071a7550.js +1 -0
- package/dist/{toggleButtons-002aeda1.js → toggleButtons-dbdbad01.js} +1 -1
- package/dist/tp.ui-9c2e9fc5.js +1 -0
- package/dist/tslib.es6-c3c2d88f.js +1 -0
- package/dist/tvs.density-f6128793.js +1 -0
- package/dist/{tvs.geneVariant-3a65ad94.js → tvs.geneVariant-ca4bdbb1.js} +1 -1
- package/dist/tvs.numeric-0260a825.js +1 -0
- package/dist/{tvs.samplelst-1eeb586b.js → tvs.samplelst-cb71b3bf.js} +1 -1
- package/dist/{uiUtils-1336bad7.js → uiUtils-f1bd2bcc.js} +1 -1
- package/dist/{variantBrowser-f0c812c1.js → variantBrowser-7c540224.js} +1 -1
- package/dist/{vcf-c4a23924.js → vcf-5cc55588.js} +1 -1
- package/dist/violin-2ba509eb.js +1 -0
- package/dist/violin.interactivity-4da6d7a9.js +1 -0
- package/dist/{violin.renderer-dafd89fa.js → violin.renderer-ce024265.js} +1 -1
- package/dist/{violinRenderer-8215f40d.js → violinRenderer-f7c96a60.js} +1 -1
- package/dist/{viridis-ffd14c4d.js → viridis-01ab20c5.js} +1 -1
- package/dist/{y-dd197cc9.js → y-67939f83.js} +1 -1
- package/dist/{zoom-9c63e74c.js → zoom-25dce8b9.js} +1 -1
- package/package.json +6 -4
- package/dist/AppHeader-a2a7e518.js +0 -1
- package/dist/DEanalysis-a6b50e49.js +0 -1
- package/dist/Disco-1c71b7dd.js +0 -1
- package/dist/Disco.UI-4c16ee50.js +0 -1
- package/dist/FilterRxComp-242f4615.js +0 -1
- package/dist/WSIViewer-d90032d7.js +0 -1
- package/dist/adSandbox-3528c372.js +0 -1
- package/dist/app-07dee349.js +0 -1
- package/dist/app-a8c4854a.js +0 -1
- package/dist/app-ade9c62a.js +0 -1
- package/dist/bam-92483a98.js +0 -1
- package/dist/barchart-3e69d094.js +0 -1
- package/dist/barchart.events-9b11d97e.js +0 -1
- package/dist/block-dcb130fb.js +0 -1
- package/dist/block.lazyload-9f031cac.js +0 -1
- package/dist/block.legend-b2987cd9.js +0 -1
- package/dist/block.mds2-de6e0986.js +0 -1
- package/dist/boxplot-1178fffc.js +0 -1
- package/dist/brainImaging-98ed7aa2.js +0 -1
- package/dist/categorical-26528ce8.js +0 -1
- package/dist/condition-b0d74550.js +0 -1
- package/dist/controls-0bacec22.js +0 -1
- package/dist/controls.config-0ccc9d79.js +0 -1
- package/dist/controls.divide-a9fe9466.js +0 -1
- package/dist/controls.overlay-fe20d41d.js +0 -1
- package/dist/controls.term1-faa2efcf.js +0 -1
- package/dist/cuminc-7e2cac2d.js +0 -1
- package/dist/dataDownload-ade8d840.js +0 -1
- package/dist/databrowser.ui-716f0519.js +0 -1
- package/dist/dictionary-3f83ce63.js +0 -1
- package/dist/facet-6850cfed.js +0 -1
- package/dist/geneExpClustering-7fd3c87e.js +0 -1
- package/dist/geneExpression-6462537d.js +0 -1
- package/dist/geneORA-7eb818c4.js +0 -1
- package/dist/geneVariant-b58e924a.js +0 -1
- package/dist/geneset-9f69ad3f.js +0 -1
- package/dist/genomeBrowser-1b2b83f7.js +0 -1
- package/dist/genomeBrowser.controls-cd8ddeb1.js +0 -1
- package/dist/gsea-36376589.js +0 -1
- package/dist/hierCluster-f1e30c19.js +0 -1
- package/dist/hierCluster.config-da3510b1.js +0 -1
- package/dist/hierCluster.renderers-610d8860.js +0 -1
- package/dist/imagePlot-7089bdff.js +0 -1
- package/dist/launch.adhoc-d229fd55.js +0 -1
- package/dist/leftlabel.sample-a919168c.js +0 -1
- package/dist/legacyDataset-1cbcb67d.js +0 -1
- package/dist/matrix-0614794d.js +0 -1
- package/dist/matrix.cells-819d4991.js +0 -1
- package/dist/matrix.config-c54ca273.js +0 -1
- package/dist/matrix.controls-5eca7822.js +0 -1
- package/dist/matrix.groups-4660dd70.js +0 -1
- package/dist/matrix.interactivity-23d83183.js +0 -1
- package/dist/matrix.legend-2e647224.js +0 -1
- package/dist/matrix.renderers-43445f4f.js +0 -1
- package/dist/matrix.serieses-972fbe5d.js +0 -1
- package/dist/matrix.sort-80d9b788.js +0 -1
- package/dist/mds.samplescatterplot-1623e6d0.js +0 -1
- package/dist/niceNumLabels-6cfc1508.js +0 -1
- package/dist/numeric.binary-80467e8b.js +0 -1
- package/dist/numeric.continuous-69a62a15.js +0 -1
- package/dist/numeric.discrete-86181905.js +0 -1
- package/dist/numeric.spline-1b07fd13.js +0 -1
- package/dist/numeric.toggle-37c4bee8.js +0 -1
- package/dist/oncomatrix-475271da.js +0 -1
- package/dist/plot.app-aa916e0e.js +0 -1
- package/dist/plot.barplot-8b440a2b.js +0 -1
- package/dist/plot.brainImaging-2f796b0c.js +0 -1
- package/dist/plot.disco-43e18d2f.js +0 -1
- package/dist/plot.ssgq-e49cb70b.js +0 -1
- package/dist/profileBarchart-91463ab6.js +0 -1
- package/dist/profileHome-d37a6821.js +0 -1
- package/dist/profilePlot-9ca577cb.js +0 -1
- package/dist/profilePolar-19c7da5b.js +0 -1
- package/dist/profileRadar-8bf094e3.js +0 -1
- package/dist/profileRadarFacility-f9fd8971.js +0 -1
- package/dist/profileSummary-93999c14.js +0 -1
- package/dist/recover-36ada47f.js +0 -1
- package/dist/regression.inputs-cb57ece6.js +0 -1
- package/dist/regression.inputs.values.table-908bb37a.js +0 -1
- package/dist/regression.results-c186a8dc.js +0 -1
- package/dist/roundValue-b0d0517c.js +0 -1
- package/dist/sampleScatter-9d5b3630.js +0 -1
- package/dist/sampleView-2d895023.js +0 -1
- package/dist/samplelst-9f8343ff.js +0 -1
- package/dist/scatter-b4992f64.js +0 -1
- package/dist/singleCellCellType-84a0c2cf.js +0 -1
- package/dist/singleCellPlot-2f2b8619.js +0 -1
- package/dist/singlecell-90567dde.js +0 -1
- package/dist/snp-79ec95ba.js +0 -1
- package/dist/snplocus-cb629be1.js +0 -1
- package/dist/spliceevent.exonskip.getdefault-31d2950c.js +0 -1
- package/dist/summary-b77bef3c.js +0 -1
- package/dist/survival-61ab375a.js +0 -1
- package/dist/survival-80a0ade9.js +0 -1
- package/dist/table-79e3e776.js +0 -1
- package/dist/table-eee91e14.js +0 -1
- package/dist/termInfo-f851b415.js +0 -1
- package/dist/tk-75566002.js +0 -1
- package/dist/tp.ui-02911b56.js +0 -1
- package/dist/tslib.es6-1f85f553.js +0 -1
- package/dist/tvs.density-026fca97.js +0 -1
- package/dist/tvs.numeric-3f3d9919.js +0 -1
- package/dist/violin-1515c3e6.js +0 -1
- package/dist/violin.interactivity-8e2f480d.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{M as t,bn as e,bo as s,j as n,z as a,bm as i,ah as r,I as l,W as o,ag as c,az as p,U as h,d,Z as f,a9 as u}from"./app-a8c4854a.js";import{c as m,a as y,b as g}from"./axis-747c801e.js";import{a as x,p as b,t as v,c as k,s as _}from"./math-2fb199c6.js";import{c as D,p as w}from"./constant-426a1483.js";var T={draw(t,e){const s=x(e/b);t.moveTo(s,0);t.arc(0,0,s,0,v)}};var N={draw(t,e){const s=x(e/5)/2;t.moveTo(-3*s,-s);t.lineTo(-s,-s);t.lineTo(-s,-3*s);t.lineTo(s,-3*s);t.lineTo(s,-s);t.lineTo(3*s,-s);t.lineTo(3*s,s);t.lineTo(s,s);t.lineTo(s,3*s);t.lineTo(-s,3*s);t.lineTo(-s,s);t.lineTo(-3*s,s);t.closePath()}};const R=x(1/3);const I=R*2;var M={draw(t,e){const s=x(e/I);const n=s*R;t.moveTo(0,-s);t.lineTo(n,0);t.lineTo(0,s);t.lineTo(-n,0);t.closePath()}};var X={draw(t,e){const s=x(e);const n=-s/2;t.rect(n,n,s,s)}};const B=.8908130915292852;const F=_(b/10)/_(7*b/10);const Y=_(v/10)*F;const z=-k(v/10)*F;var A={draw(t,e){const s=x(e*B);const n=Y*s;const a=z*s;t.moveTo(0,-s);t.lineTo(n,a);for(let e=1;e<5;++e){const i=v*e/5;const r=k(i);const l=_(i);t.lineTo(l*s,-r*s);t.lineTo(r*n-l*a,l*n+r*a)}t.closePath()}};const C=x(3);var O={draw(t,e){const s=-x(e/(C*3));t.moveTo(0,s*2);t.lineTo(-C*s,-s);t.lineTo(C*s,-s);t.closePath()}};const j=-.5;const S=x(3)/2;const L=1/x(12);const V=(L/2+1)*3;var W={draw(t,e){const s=x(e/V);const n=s/2,a=s*L;const i=n,r=s*L+s;const l=-i,o=r;t.moveTo(n,a);t.lineTo(i,r);t.lineTo(l,o);t.lineTo(j*n-S*a,S*n+j*a);t.lineTo(j*i-S*r,S*i+j*r);t.lineTo(j*l-S*o,S*l+j*o);t.lineTo(j*n+S*a,j*a-S*n);t.lineTo(j*i+S*r,j*r-S*i);t.lineTo(j*l+S*o,j*o-S*l);t.closePath()}};function E(t,e){let s=null;t=typeof t==="function"?t:D(t||T);e=typeof e==="function"?e:D(e===undefined?64:+e);function n(){let n;if(!s)s=n=w();t.apply(this,arguments).draw(s,+e.apply(this,arguments));if(n)return s=null,n+""||null}n.type=function(e){return arguments.length?(t=typeof e==="function"?e:D(e),n):t};n.size=function(t){return arguments.length?(e=typeof t==="function"?t:D(+t),n):e};n.context=function(t){return arguments.length?(s=t==null?null:t,n):s};return n}class H{constructor(t){this.opts=t;this.anchorType=t.anchorType;this.shareheight=t.shareheight;this.sharewidth=t.sharewidth;const e="x"in t?t.x:0;const s="y"in t?t.y:0;this.settings={visible:true,opacity:.3,x:e,y:s,xOffset:t.axiswidth+t.sp+t.sample2height,yOffset:t.shareheight,currX:t.axiswidth+t.sp+t.sample2height+e,currY:t.shareheight-s,strokeWidth:"strokeWidth"in t?t.strokeWidth:5,stroke:"stroke"in t?t.stroke:"red",xarmlen:"xarmlen"in t?t.xarmlen:25};this.addControls(this.anchorType?null:this.opts.headerdiv)}setWrapper(t){this.opts.wrapper=t}addControls(e=null){if(e){e.append("button").text("Anchors").on("click",(t=>{this.anchormenu.showunder(t.target);this.xInput.property("value",(this.settings.x/this.sharewidth).toFixed(2));this.yInput.property("value",(this.settings.y/this.sharewidth).toFixed(2))}))}this.anchormenu=new t({border:"solid 1px black"});this.anchormenu.d.style("text-align","center");this.addCoordInput();this.addColorInput();this.addOpacityInput();if(!this.anchorType)this.addSubmitBtns();else this.addDeleteBtn()}addColorInput(){const t=this.anchormenu.d.append("div");t.append("label").html("Color: ");this.strokeInput=t.append("input");this.strokeInput.attr("this.anchorType","text").property("value",this.settings.stroke).style("width","50px")}addOpacityInput(){const t=this.anchormenu.d.append("div");t.append("label").html("Opacity: ");this.opacityInput=t.append("input");this.opacityInput.attr("this.anchorType","number").attr("min",0).attr("max",1).attr("step",.01).property("value",this.settings.opacity).style("width","50px")}addSubmitBtns(){if(this.anchorType)return;const t=this.anchormenu.d.append("div");t.append("label").html("Add Anchor: ");t.append("button").html("R").on("click",(()=>{new P(this.getSettings("r"));this.anchormenu.hide()}));t.append("button").html("D").on("click",(()=>{new P(this.getSettings("d"));this.anchormenu.hide()}));t.append("button").html("X").on("click",(()=>{new P(this.getSettings("x"));this.anchormenu.hide()}));t.append("button").html("synced").on("click",(()=>{new P(this.getSettings("synced"));this.anchormenu.hide()}))}getSettings(t){return Object.assign({},this.opts,{anchorType:t,opacity:this.opacityInput.property("value"),x:this.xInput.property("value")*this.sharewidth,y:this.yInput.property("value")*this.shareheight,stroke:this.strokeInput.property("value")})}addCoordInput(){const t=this.anchormenu.d.append("div");t.append("label").html("X: ");this.xInput=t.append("input");this.xInput.attr("this.anchorType","number").attr("min",0).attr("max",1).attr("step",.01).property("value",0).style("width","80px");const e=this.anchormenu.d.append("div");e.append("label").html("Y: ");this.yInput=e.append("input");this.yInput.attr("this.anchorType","number").attr("min",0).attr("max",1).attr("step",.01).property("value",0).style("width","80px")}addDeleteBtn(){if(!this.anchorType)return;const t=this.anchormenu.d.append("div");t.append("button").html("Delete").on("click",(()=>{this.g_anchor.remove();this.anchormenu.hide()}))}}class P extends H{constructor(t){super(t);this.render();this.strokeInput.on("change",(()=>{this.settings.stroke=this.strokeInput.property("value");this.g_anchor.style("stroke",this.settings.stroke);this.anchormenu.hide()}));this.opacityInput.on("change",(()=>{this.settings.opacity=input.property("value");this.g_anchor.style("opacity",this.settings.opacity);this.anchormenu.hide()}));this.xInput.on("change",(()=>{this.settings.x=+this.xInput.property("value")*this.sharewidth;this.settings.currX=this.settings.x+this.settings.xOffset;if(this.d_anchor){this.d_anchor.transition().duration(1e3).attr("x1",this.settings.currX).attr("x2",this.settings.currX)}if(this.x_anchor){this.x_anchor.transition().duration(1e3).attr("transform","translate("+this.settings.currX+","+this.settings.currY+")")}this.anchormenu.hide()}));this.yInput.on("change",(()=>{this.settings.y=+this.yInput.property("value")*this.shareheight;this.settings.currY=-this.settings.y+this.settings.yOffset;if(this.r_anchor){this.r_anchor.transition().duration(1e3).attr("y1",this.settings.currY).attr("y2",this.settings.currY)}if(this.x_anchor){this.x_anchor.transition().duration(1e3).attr("transform","translate("+this.settings.currX+","+this.settings.currY+")")}this.anchormenu.hide()}))}render(){this.g_anchor=this.opts.wrapper.append("g").style("stroke",this.settings.stroke).style("opacity",this.settings.opacity).style("display",this.settings.visible?"":"none").style("stroke-width",this.settings.strokeWidth).on("click",this.anchorType=="synced"?null:t=>{this.anchormenu.showunder(t.target)});this.renderD();this.renderR();this.renderX()}renderD(){if(!["synced","d"].includes(this.anchorType))return;this.d_anchor=this.g_anchor.append("line");const t=this.opts;this.updateD(t.shareheight+t.sp2,t.shareheight+t.sample1height)}updateD(t,e){if(!["synced","d"].includes(this.anchorType))return;this.settings.D={y1:t,y2:e};this.d_anchor.attr("x1",this.settings.currX).attr("x2",this.settings.currX).attr("y1",t).attr("y2",e)}renderR(){if(!["synced","r"].includes(this.anchorType))return;this.r_anchor=this.g_anchor.append("line");const t=this.opts;this.updateR(t.axiswidth+t.sp,t.sample2height+t.sp)}updateR(t,e){if(!["synced","r"].includes(this.anchorType))return;this.settings.R={x1:t,x2:e};this.r_anchor.attr("x1",t).attr("x2",e).attr("y1",this.settings.currY).attr("y2",this.settings.currY)}renderX(){if(!["synced","x"].includes(this.anchorType))return;this.x_anchor=this.g_anchor.append("g").attr("transform","translate("+this.settings.currX+","+this.settings.currY+")");this.bindXDrag();this.x_anchor.append("circle").attr("cx",0).attr("cy",0).attr("r",this.settings.xarmlen).style("opacity",0);this.x_anchor.append("line").attr("x1",-this.settings.xarmlen).attr("x2",this.settings.xarmlen).attr("y1",0).attr("y2",0);this.x_anchor.append("line").attr("x1",0).attr("x2",0).attr("y1",this.settings.xarmlen).attr("y2",-this.settings.xarmlen)}bindXDrag(){if(!["synced"].includes(this.anchorType))return;this.x_anchor.on("mousedown",(t=>{const e=t.clientX;const s=t.clientY;let n=this.settings.currX,a=this.settings.currY;this.x_anchor.on("mousemove",(t=>{n=this.settings.currX-e+t.clientX;a=this.settings.currY-s+t.clientY;this.r_anchor.attr("y1",a).attr("y2",a);this.d_anchor.attr("x1",n).attr("x2",n);this.x_anchor.attr("transform","translate("+n+","+a+")")})).on("mouseup",(t=>{this.x_anchor.on("mousemove",null);n=this.settings.currX-e+t.clientX;a=this.settings.currY-s+t.clientY;if(n==this.settings.currX&&a==this.settings.currY){this.g_anchor.remove();return}this.settings.x=n<this.settings.xOffset?0:n-this.settings.xOffset;this.settings.y=a>this.settings.yOffset?0:-(a-this.settings.yOffset);this.settings.currX=this.settings.x+this.settings.xOffset;this.settings.currY=-this.settings.y+this.settings.yOffset;this.r_anchor.transition().duration(100).attr("y1",this.settings.currY).attr("y2",this.settings.currY);this.d_anchor.transition().duration(100).attr("x1",this.settings.currX).attr("x2",this.settings.currX);this.x_anchor.transition().duration(100).attr("transform","translate("+this.settings.currX+","+this.settings.currY+")")})).on("mouseleave",(()=>{this.x_anchor.on("mousemove",null)}))}))}}const q="#f9766c";const G="#609cff";const U="#01b937";const Z={circle:T,cross:N,diamond:M,square:X,star:A,triangle:O,wye:W};const J={path:t=>t.symbol,circle:t=>!t.symbol};const K={path:t=>t.symbol,ellipse:t=>!t.symbol};function Q(t,n){let a,i,r,l,o,c;if(n!==undefined)[i,r,l,o,c]=e(n,t);else{[a,i,r,l,o,c]=s(100,100,t);a.header.text("2DMAF: mutant allele fraction plot between a pair of samples");a.body.style("margin","10px")}i.append("div").style("margin-top","20px").html("<ul>"+'<li><a href="https://docs.google.com/document/d/1anyEDMcW1lTSf8399Li2G9r57V-Fqp2591WvoODY7n4/edit#heading=h.mne2ecmp9m13" target=_blank>File format</a></li>'+'<li>To define samples differently than "Diagnosis/Relapse", <a href=https://plus.google.com/+XinZhou_s/posts/WqBVvmd3wYR target=_blank>see how</a>.</li>'+"</ul>");i.append("p").html("<a href=https://proteinpaint.stjude.org/ppdemo/hg19/2dmaf/2dmaf.txt target=_blank>Example file</a>");function p(t,e){o.style("color",e?"red":"black").html(t)}const h=()=>{l.selectAll("*").remove();const e=l.append("input").attr("type","file").on("change",(e=>{const s=e.target.files[0];if(!s){h();return}if(!s.size){p("Invalid file "+s.name);h();return}const n=new FileReader;n.onload=e=>{const n=r.options[r.selectedIndex].innerHTML;const a=tt(e.target.result.trim().split(/\r?\n/),t[n],s.name,c);if(a){p(a,1);h();return}i.remove();l.remove();o.remove()};n.onerror=function(){p("Error reading file "+s.name,1);h();return};n.readAsText(s,"utf8")}));setTimeout((()=>e.node().focus()),1100)};h()}function $(t,e){if(!t.genome){n(e,".genome missing for 2dmaf");return}if(!t.input){n(e,".input missing for 2dmaf");return}const s=tt(t.input.trim().split(/\r?\n/),t.genome,t.datasetname||"unnamed dataset",e);if(s){n(e,"2DMAF data error: "+s)}}function tt(t,e,s,n){const[r,l,o]=et(t[0].trim());if(r){return r}const c={};const p={};const h={};const d={good:0,purity1set:false,purity2set:false,pairsetname:{}};const f=[];const u={};for(const t in a){u[a[t].label.toUpperCase()]=t}for(let e=1;e<t.length;e++){if(t[e]=="")continue;if(t[e][0]=="#"){if(t[e].startsWith("##samplename")){const s=t[e].trim().split(/[\s\t]+/);if(s.length==4){d.pairsetname[s[1]]={1:s[2],2:s[3]}}else{return"Line "+(e+1)+': invalid samplename line: must be "##samplename [patient] [sample1] [sample2]"'}}continue}const s=t[e].trim().split("\t");const n={};for(let t=0;t<l.length;t++){if(s[t]!=undefined&&s[t]!=""){n[l[t]]=s[t]}}if(!n.sample){return"Line "+(e+1)+": missing sample"}if(n.chr){if(n.chr.indexOf("chr")!=0){n.chr="chr"+n.chr}}if(n.chrstart){n.chrstart=Number.parseInt(n.chrstart);if(Number.isNaN(n.chrstart)){return"Line "+(e+1)+": invalid chromosome position"}}if(n.Dcnvloh){n.Dcnvlohraw=n.Dcnvloh;const t=n.Dcnvloh.toLowerCase();if(t=="yes"||t!="diploid"&&t!="haploid"){n.Dcnvloh=true}else{n.Dcnvloh=false}}if(n.Rcnvloh){n.Rcnvlohraw=n.Rcnvloh;const t=n.Rcnvloh.toLowerCase();if(t=="yes"||t!="diploid"&&t!="haploid"){n.Rcnvloh=true}else{n.Rcnvloh=false}}if(!n.call_d){f.push([e,"missing call_d",s]);continue}if(n.call_d!="somatic"&&n.call_d!="wildtype"){f.push([e,"call_d is neither somatic nor wildtype",s]);continue}if(!n.call_r){f.push([e,"missing call_r",s]);continue}if(n.call_r!="somatic"&&n.call_r!="wildtype"){f.push([e,"call_r is neither somatic nor wildtype",s]);continue}if(n.call_d=="somatic"){if(n.call_r=="somatic"){n.set_share=true}else{n.set_1=true}}else{if(n.call_r=="somatic"){n.set_2=true}}if(!n.type){f.push([e,"missing type",s]);continue}const i=n.type.toLowerCase();if(i=="snv"||i=="snp"||i=="mnv"||i=="complex"){n.issnv=true}else if(i=="indel"||i=="ins"||i=="del"){n.isindel=true}else{f.push([e,"type must be either SNV or INDEL",s]);continue}let r="MinD.D";let o=Number.parseInt(n[r]);if(Number.isNaN(o)||o<0){f.push([e,"invalid "+r+" value",s]);continue}n[r]=o;r="TinD.D";o=Number.parseInt(n[r]);if(Number.isNaN(o)||o<0){f.push([e,"invalid "+r+" value",s]);continue}n[r]=o;if(n["TinD.D"]<n["MinD.D"]){f.push([e,"TinD.D value lower than MinD.D",s]);continue}r="MinN.D";if(r in n){o=Number.parseInt(n[r]);if(Number.isNaN(o)||o<0){delete n[r]}else{n[r]=o}}r="TinN.D";if(r in n){o=Number.parseInt(n[r]);if(Number.isNaN(o)||o<0){delete n[r]}else{n[r]=o}}r="MinD.R";o=Number.parseInt(n[r]);if(Number.isNaN(o)||o<0){f.push([e,"invalid "+r+" value",s]);continue}n[r]=o;r="TinD.R";o=Number.parseInt(n[r]);if(Number.isNaN(o)||o<0){f.push([e,"invalid "+r+" value",s]);continue}n[r]=o;if(n["TinD.R"]<n["MinD.R"]){f.push([e,"TinD.R value lower than MinD.R",s]);continue}r="MinN.R";if(r in n){o=Number.parseInt(n[r]);if(Number.isNaN(o)||o<0){delete n[r]}else{n[r]=o}}r="TinN.R";if(r in n){o=Number.parseInt(n[r]);if(Number.isNaN(o)||o<0){delete n[r]}else{n[r]=o}}if(n.symbol){if(!Z[n.symbol]){f.push([e,"Invalid symbol value='"+n.symbol+"'",s]);continue}}if(n.class){const t=n.class.toUpperCase();if(t in u){n.class=u[t]}else{f.push([e,"invalid mutation class "+n.class,s]);continue}}n.style={fill:n.issnv?"white":"black",fillhl:n.class?a[n.class].color:"#ccc",stroke:n.chr=="chrX"?"black":n.issnv?"black":"none",strokehl:n.class?a[n.class].color:"black",fillopacity:n.issnv?0:.2,strokeopacity:.2};if(n["TinD.D"]>0){n.maf1=n["MinD.D"]/n["TinD.D"]}if(n["TinD.R"]>0){n.maf2=n["MinD.R"]/n["TinD.R"]}p[n.sample]=1;if(n.gene){h[n.gene]=1}if(!(n.sample in c)){c[n.sample]={name:n.sample,shown:false,header:l,mlst:[]}}const m=c[n.sample];m.mlst.push(n);if(n.purity1){let t=Number.parseFloat(n.purity1);if(Number.isNaN(t)){f.push([e,"diagnosis tumor purity should be a number"]);t=0}else{if(t>1){t/=100}}if(t>0){if(m.purity1==undefined){m.purity1=t;d.purity1set=true}else if(m.purity1!=t){f.push([e,"diagnosis tumor purity value "+t+" is different from existing value "+m.purity1+" in "+n.sample,s])}}}if(n.purity2){let t=Number.parseFloat(n.purity2);if(Number.isNaN(t)){f.push([e,"relapse tumor purity should be a number"]);t=0}else{if(t>1){t/=100}}if(t>0){if(m.purity2==undefined){m.purity2=t;d.purity2set=true}else if(m.purity2!=t){f.push([e,"relapse tumor purity value "+t+" is different from existing value "+m.purity2+" in "+n.sample,s])}}}d.good++}if(f.length>0){i(l,f)}if(d.good==0){return"No valid data."}n.append("p").text("File: "+s);let m=0;for(const t in h)m++;const y=16;const g=n.append("table");const x=g.append("tr");const b=x.append("td").attr("valign","top");b.append("div").html('<div style="display:inline-block;width:'+y+"px;height:"+y+"px;background-color:"+q+'"></div> Diagnosis only '+'<div style="display:inline-block;width:'+y+"px;height:"+y+"px;background-color:"+U+'"></div> Shared '+'<div style="display:inline-block;width:'+y+"px;height:"+y+"px;background-color:"+G+'"></div> Relapse only');const v=b.append("div").style("margin-top","10px").style("height","200px").style("width","300px").style("padding","5px").style("overflow-y","scroll").style("resize","both").style("border","solid 1px #ccc");b.append("div").style("margin-top","10px").style("height","200px").style("width","300px").style("padding","5px").style("overflow-y","scroll").style("resize","both").style("border","solid 1px #ccc");const k=x.append("td").style("vertical-align","top");for(const t in c){const e=d.pairsetname[t];if(e){c[t].setname=e}else{c[t].setname={1:"Diagnosis",2:"Relapse"}}}const _={genome:e,pairs:c,color1:q,color2:G,colorshare:U,rowh:y,peoplewidth:150,genewidth:150,showholder:k,genelimit:Math.min(20,m),purity1set:d.purity1set,purity2set:d.purity2set};lt(_,v)}function et(t){const e=t.toLowerCase().split("\t");const s=t.split("\t");if(s.length<=1){return["invalid file header"]}const n=(...t)=>{for(const s of t){const t=e.indexOf(s);if(t!=-1)return t}return-1};let i=n("person","sample","samplename","patient");if(i==-1)return["sample missing from header"];s[i]="sample";i=n("type");if(i==-1)return["type missing from header"];s[i]="type";i=n("mind.d1_g1","mind.d","mind");if(i==-1)return["MinD.D missing from header"];s[i]="MinD.D";i=n("tind.d1_g1","tind.d","tind");if(i==-1)return["TinD.D missing from header"];s[i]="TinD.D";i=n("mind.r1_g1","mind.r","minr");if(i==-1)return["MinD.R missing from header"];s[i]="MinD.R";i=n("tind.r1_g1","tind.r","tinr");if(i==-1)return["TinD.R missing from header"];s[i]="TinD.R";i=n("call_d1_g1","call_d");if(i==-1)return["call_d missing from header"];s[i]="call_d";i=n("call_r1_g1","call_r");if(i==-1)return["call_r missing from header"];s[i]="call_r";i=n("genename","gene");if(i==-1)return["gene missing from header"];s[i]="gene";i=n("amino_acid_change","annovar_sj_aachange","aachange","protein_change");if(i==-1)return["amino_acid_change missing from header"];s[i]="mname";i=n("class","mclass","variant_class","variant_classification","annovar_sj_class");if(i==-1)return["variant_class missing from header"];s[i]="class";i=n("chromosome","chr");if(i==-1)return["chromosome missing from header"];s[i]="chr";i=n("start","start_position","wu_hg19_pos","chr_position");if(i==-1)return["start missing from header"];s[i]="chrstart";i=n("minn.d1_g1","minn.d");if(i!=-1)s[i]="MinN.D";i=n("tinn.d1_g1","tinn.d");if(i!=-1)s[i]="TinN.D";i=n("minn.r1_g1","minn.r");if(i!=-1)s[i]="MinN.R";i=n("tinn.r1_g1","tinn.r");if(i!=-1)s[i]="TinN.R";i=n("mrna_accession","refseq_mrna_id","annovar_sj_filter_isoform","refseq");if(i!=-1)s[i]="isoform";i=n("primary_purity","purity_d");if(i!=-1)s[i]="purity1";i=n("relapse_purity","purity_r");if(i!=-1)s[i]="purity2";i=n("tag_d_cnvloh","cnvloh_d");if(i!=-1)s[i]="Dcnvloh";i=n("tag_r_cnvloh","cnvloh_r");if(i!=-1)s[i]="Rcnvloh";const r=[];for(const t of s){switch(t){case"Dcnvloh":r.push({label:"D. CNV/LOH",get:t=>t.Dcnvlohraw});break;case"Rcnvloh":r.push({label:"R. CNV/LOH",get:t=>t.Rcnvlohraw});break;case"type":r.push({label:"Type",get:t=>t.type});break;case"chr":break;case"chrstart":r.push({label:"Genome Loc.",get:t=>t.chr+":"+(t.chrstart+1)});break;case"class":r.push({label:"Class",get:t=>{if(t.class==p){return t.originalclasslabel?t.originalclasslabel:a[t.class].label}return a[t.class].label}});break;case"mname":r.push({label:"Mutation",get:t=>{let e=t.mname;if(!e)e=t.cdna_change;return e}});break;case"MinD.D":r.push({ismaf:true,width:60,height:14,readcountcredible:30,get:t=>t.maf_diagnosis,label:"D. tumor MAF",fill:"#F7483B",fillbg:"#FCBAB6"});break;case"TinD.D":break;case"MinD.R":r.push({ismaf:true,width:60,height:14,readcountcredible:30,get:t=>t.maf_relapse,label:"R. tumor MAF",fill:"#146EFF",fillbg:"#B6D5FC"});break;case"TinD.R":break;case"MinN.D":r.push({ismaf:true,width:60,height:14,readcountcredible:30,get:t=>t.maf_diagnosis_normal,label:"D. normal MAF",fill:"#F7483B",fillbg:"#FCBAB6"});break;case"TinN.D":break;case"MinN.R":r.push({ismaf:true,width:60,height:14,readcountcredible:30,get:t=>t.maf_relapse_normal,label:"R. normal MAF",fill:"#146EFF",fillbg:"#B6D5FC"});break;case"TinN.R":break;case"call_d":r.push({label:"D. call",get:t=>t.call_d});break;case"call_r":r.push({label:"R. call",get:t=>t.call_r});break;case"purity1":r.push({label:"D. purity",get:t=>t.purity1});break;case"purity2":r.push({label:"R. purity",get:t=>t.purity2});break;default:r.push({label:t,get:e=>e[t]})}}return[null,s,r]}function st(e,s){const n=new t({border:"solid 1px black"});const i=[];const o=[];const p=[];const f=s.mlst;const u=f[0].sample;const m=E();let x=0;let b={};const v={};for(const t of f){if(t["TinD.D"]>0){x=Math.max(x,t["TinD.D"])}if(t["TinD.R"]>0){x=Math.max(x,t["TinD.R"])}if(t.set_share){p.push(t)}else if(t.set_1){i.push(t)}else if(t.set_2){o.push(t)}if(!(t.class in v)){v[t.class]=0}if(t.symbol){if(!b[t.symbol]){b[t.symbol]={numlines:0,label:t.symbollabel,hidden:false}}b[t.symbol].numlines++}v[t.class]++}const k=Math.min(window.innerWidth,window.innerHeight);const _=50,D=k*.5,w=k*.5,T=w/2,N=D/2,R=_/3,I=T/5,M=Math.min(20,12*k/500),X=k/40,B=X*.7,F=3;const Y=l().domain([0,x]).range([X/2,X]);const z=t=>Math.PI*Math.pow(Y(t),2);for(const t of f){t.radius=Math.max(t["TinD.D"]?Y(t["TinD.D"]):0,t["TinD.R"]?Y(t["TinD.R"]):0)}const A=e.append("table");const C=A.append("tr");const O=C.append("td").style("vertical-align","top");const j=C.append("td").style("vertical-align","top");j.append("div").style("margin","10px").text("Name: "+u);const S=O.append("div");S.append("button").text("Hide").on("click",(()=>{s.shown=false;if(s.handle){s.handle.attr("font-weight","normal")}A.remove()}));const L=new H({axiswidth:_,sp:R,sp2:I,sample1height:T,sample2height:N,shareheight:w,sharewidth:D,headerdiv:S});S.append("button").text("Screenshot").on("click",(()=>{h(V.node(),"2dmaf_"+s.name)}));{const t=S.append("select").on("change",(t=>{const e=t.target.options[t.target.selectedIndex].value;if(e=="all"){tt.transition().attr("transform",(t=>t.posstring+" scale(1)"));ot.transition().attr("transform",(t=>t.posstring+" scale(1)"));dt.transition().attr("transform",(t=>t.posstring+" scale(1)"));return}tt.transition().attr("transform",(t=>t.posstring+" scale("+(t.class==e?1:0)+")"));ot.transition().attr("transform",(t=>t.posstring+" scale("+(t.class==e?1:0)+")"));dt.transition().attr("transform",(t=>t.posstring+" scale("+(t.class==e?1:0)+")"))}));t.append("option").text("Show all mutation classes").property("value","all");const e=[];for(const t in v){e.push([t,v[t]])}e.sort(((t,e)=>e[1]-t[1]));for(const s of e){t.append("option").text((s[0]in a?a[s[0]].label:s[0])+" ("+s[1]+")").property("value",s[0])}}const V=O.append("svg").attr("width",_+R+N+D+R*2).attr("height",_+R+T+w+R*2);const W=V.append("g").attr("transform","translate("+R+","+R+")");L.setWrapper(W.append("g"));const P=l().domain([0,1]).range([0,D]);const q=W.append("g").attr("transform","translate("+(_+R+N)+","+(w+T+R)+")").call(y().scale(P).tickSize(5));c({axis:q,showline:true,fontsize:M*.8});const G=i.length+p.length;q.append("text").text(s.setname[1]+", n="+G+(s.purity1?", purity="+s.purity1:"")).attr("x",D/2).attr("y",_-4).attr("text-anchor","middle").attr("font-size",M);const U=l().domain([0,1]).range([w,0]);const Q=W.append("g").attr("transform","translate("+_+",0)").call(g().scale(U).tickSize(5));c({axis:Q,showline:true,fontsize:M*.8});const $=o.length+p.length;Q.append("text").text(s.setname[2]+", n="+$+(s.purity2?", purity="+s.purity2:"")).attr("transform","translate("+(M-_-10)+","+w/2+") rotate(-90)").attr("text-anchor","middle").attr("font-size",M);W.append("path").attr("d","M"+(_+R)+",0"+"h"+(N+D)+"v"+(w+T)+"h-"+D+"v-"+(T+w)+"M"+(_+R)+",0"+"v"+w+"h"+(N+D)+"M"+(_+R+N)+","+w+"l"+D+",-"+w).attr("fill","none").attr("stroke","black").attr("shape-rendering","crispEdges").attr("stroke-dasharray","5,5");const tt=W.append("g").attr("transform","translate("+(_+R+N)+",0)").selectAll().data(p).enter().append("g").attr("transform",(t=>{t.posstring="translate("+P(t.maf1)+","+U(t.maf2)+")";return t.posstring}));tt.filter((t=>t.Dcnvloh)).append("circle").attr("cy",(t=>t.issnv?Y(t["TinD.R"]):B/2)).attr("fill","#858585").attr("r",F);tt.filter((t=>t.Rcnvloh)).append("circle").attr("cx",(t=>t.issnv?-Y(t["TinD.D"]):-B/2)).attr("fill","#858585").attr("r",F);let et=tt;for(const t in K){et.filter(K[t]).append(t).attr("rx",(t=>t.symbol?null:Y(t["TinD.D"]))).attr("ry",(t=>t.symbol?null:Y(t["TinD.R"]))).attr("d",(t=>!t.symbol?null:m.type(Z[t.symbol]).size(z(t["TinD.D"])+z(t["TinD.R"])/2)())).attr("fill",(t=>t.style.fill)).attr("fill-opacity",(t=>t.style.fillopacity)).attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("stroke-dasharray",(t=>t.chr=="chrX"?"5,5":"none")).on("mouseover",((t,e)=>nt(t,e,n))).on("mouseout",((t,e)=>at(t,e,n))).on("click",((t,e)=>it(t,s.header,e)))}et.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",-3).attr("x2",3).attr("y2",3);et.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",3).attr("x2",3).attr("y2",-3);const st=l().domain([0,x]).range([T-I,0]);const rt=W.append("g").attr("transform","translate("+(_+R+N)+","+(w+I)+")");const lt="#FFBEAD";rt.append("rect").attr("fill",lt).attr("fill-opacity",0).attr("x",0).attr("width",3).attr("height",T-I);c({axis:rt.call(g().scale(st).tickValues([0,x])),showline:true,fontsize:M*.8});rt.append("g").attr("transform","translate(-"+M/2+","+(T-I)/2+")").append("text").text("D total").attr("font-size",M*.8).attr("font-family",r).attr("fill","black").attr("text-anchor","middle").attr("dominant-baseline","middle").attr("transform","rotate(-90)");const ot=rt.selectAll().data(i).enter().append("g").attr("transform",(t=>{t.posstring="translate("+P(t.maf1)+","+st(t["TinD.D"])+")";return t.posstring}));ot.filter((t=>t.Dcnvloh)).append("circle").attr("cy",(t=>t.issnv?Y(t["TinD.R"]):B/2)).attr("fill","#858585").attr("r",F);ot.filter((t=>t.Rcnvloh)).append("circle").attr("cx",(t=>t.issnv?-Y(t["TinD.D"]):-B/2)).attr("fill","#858585").attr("r",F);et=ot;for(const t in J){et.filter(J[t]).append(t).attr("class",(t=>t.symbol?"twodmaf-"+t.symbol:null)).attr("r",(t=>t.symbol?null:Y(t["TinD.R"]))).attr("d",(t=>!t.symbol?null:m.type(Z[t.symbol]).size(z(t["TinD.R"]))())).attr("fill",(t=>t.style.fill)).attr("fill-opacity",(t=>t.style.fillopacity)).attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("stroke-dasharray",(t=>t.chr=="chrX"?"5,5":"none")).on("mouseover",((t,e)=>nt(t,e,n))).on("mouseout",((t,e)=>at(t,e,n))).on("click",((t,e)=>it(t,s.header,e)))}et.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",-3).attr("x2",3).attr("y2",3);et.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",3).attr("x2",3).attr("y2",-3);const ct=l().domain([0,x]).range([0,N-I]);const pt=W.append("g").attr("transform","translate("+(_+R)+",0)");pt.append("rect").attr("fill",lt).attr("fill-opacity",0).attr("y",w).attr("width",N-I).attr("height",3);const ht=pt.append("g").attr("transform","translate(0,"+w+")").call(y().scale(ct).tickValues([0,x]));c({axis:ht,showline:true,fontsize:M*.8});pt.append("text").text("R total").attr("font-size",M*.8).attr("font-family",r).attr("fill","black").attr("x",(N-I)/2).attr("y",w+M).attr("text-anchor","middle");const dt=pt.selectAll().data(o).enter().append("g").attr("transform",(t=>{t.posstring="translate("+ct(t["TinD.R"])+","+U(t.maf2)+")";return t.posstring}));dt.filter((t=>t.Dcnvloh)).append("circle").attr("cy",(t=>t.issnv?Y(t["TinD.R"]):B/2)).attr("fill","#858585").attr("r",F);dt.filter((t=>t.Rcnvloh)).append("circle").attr("cx",(t=>t.issnv?-Y(t["TinD.D"]):-B/2)).attr("fill","#858585").attr("r",F);et=dt;for(const t in J){et.filter(J[t]).append(t).attr("class",(t=>t.symbol?"twodmaf-"+t.symbol:null)).attr("r",(t=>t.symbol?null:Y(t["TinD.D"]))).attr("d",(t=>!t.symbol?null:m.type(Z[t.symbol]).size(z(t["TinD.R"]))())).attr("fill",(t=>t.style.fill)).attr("fill-opacity",(t=>t.style.fillopacity)).attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("stroke-dasharray",(t=>t.chr=="chrX"?"5,5":"none")).on("mouseover",((t,e)=>nt(t,e,n))).on("mouseout",((t,e)=>at(t,e,n))).on("click",((t,e)=>it(t,s.header,e)))}et.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",-3).attr("x2",3).attr("y2",3);et.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",3).attr("x2",3).attr("y2",-3);const ft=W.append("g").attr("transform","translate(0,"+(w+I)+")");let ut=M;ft.append("text").text(u).attr("font-size",M).attr("y",ut);const mt=Y(20),yt=Y(x);ut+=M+yt;let gt;ft.append("text").text("SNV coverage").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));gt+=mt+10;ft.append("circle").attr("cx",gt).attr("cy",ut).attr("r",mt).attr("stroke","black").attr("fill","none");ft.append("text").text(20).attr("x",gt).attr("y",ut).attr("text-anchor","middle").attr("dominant-baseline","middle");gt+=mt+yt+10;ft.append("circle").attr("cx",gt).attr("cy",ut).attr("r",yt).attr("stroke","black").attr("fill","none");ft.append("text").text(x).attr("x",gt).attr("y",ut).attr("text-anchor","middle").attr("dominant-baseline","middle");ut+=yt+10;ft.append("text").text("Indel").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));ft.append("circle").attr("cx",gt+10+B/2).attr("cy",ut).attr("r",B/2).attr("fill","black").attr("fill-opacity",.3);ut+=30;ft.append("text").text("chrX").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));gt+=mt+10;ft.append("circle").attr("cx",gt).attr("cy",ut).attr("r",10).attr("stroke","black").attr("stroke-dasharray","5,5").attr("fill","none");ut+=30;ft.append("text").text("D. CNV/LOH").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));gt+=mt+10;ft.append("circle").attr("cx",gt).attr("cy",ut).attr("r",10).attr("stroke","black").attr("fill","none");ft.append("circle").attr("cx",gt).attr("cy",ut+10).attr("r",F).attr("fill","black");ut+=30;ft.append("text").text("R. CNV/LOH").attr("y",ut).attr("dominant-baseline","central").each((function(){gt=this.getBBox().width}));gt+=mt+10;ft.append("circle").attr("cx",gt).attr("cy",ut).attr("r",10).attr("stroke","black").attr("fill","none");ft.append("circle").attr("cx",gt-10).attr("cy",ut).attr("r",F).attr("fill","black");ut+=30;if(s.purity1!=undefined||s.purity2!=undefined){ft.append("text").text("Expected MAF").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));gt+=10;ft.append("rect").attr("fill",lt).attr("x",gt).attr("y",ut).attr("width",40).attr("height",3);ut+=30}const xt=Object.keys(b);if(xt.length){ft.append("text").text("Symbols").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));let t;for(const e in b){const s=b[e];const n=ft.append("g").on("click",(()=>{s.hidden=!s.hidden;V.selectAll(".twodmaf-"+e).style("display",s.hidden?"none":"");a.style("text-decoration",s.hidden?"line-through":"")}));t=gt+20;n.append("path").attr("transform","translate("+t+","+ut+")").attr("d",m.type(Z[e]).size(100)()).attr("stroke","black").attr("fill","none").each((function(){t+=this.getBBox().width}));const a=n.append("text").text(s.label?s.label+" ("+s.numlines+")":"").attr("y",ut+2).attr("x",t).attr("dominant-baseline","middle").style("text-decoration",s.hidden?"line-through":"");ut+=30}ut+=30}const bt={},vt={},kt={},_t={};for(const t of f){if(!t.gene)continue;if(!(t.gene in bt)){bt[t.gene]=[]}bt[t.gene].push(t);if(t.set_1){vt[t.gene]=1}else if(t.set_2){kt[t.gene]=1}else if(t.set_share){_t[t.gene]=1}}const Dt=[];for(const t in vt){Dt.push(t)}for(const t in kt){if(!(t in vt)){Dt.push(t)}}for(const t in _t){if(!(t in vt)&&!(t in kt)){Dt.push(t)}}const wt=j.append("div").style("height",w+T+"px").style("margin","10px").style("padding","10px").style("border","solid 1px #ccc").style("overflow-y","scroll").style("resize","both").append("table");{const t=wt.append("tr");t.append("td").text("Gene");t.append("td").text(s.setname[1]+" only");t.append("td").text(s.setname[2]+" only");t.append("td").text("Shared")}let Tt=true;for(const t of Dt){const e=wt.append("tr");if(Tt){e.style("background-color","#f3f3f3")}Tt=!Tt;e.append("td").text(t);let s=[];if(t in bt){s=bt[t]}const n=[],a=[],i=[];for(const t of s){if(t.set_share)i.push(t);else if(t.set_1)n.push(t);else if(t.set_2)a.push(t)}let r=e.append("td");if(n.length){for(const t of n){const e=r.append("div").attr("class","sja_clbtext").style("color",t.style.fillhl).text(t.mname||"").on("click",(e=>{Nt(e.target,t,ot)}));if(t.labelIsVisible){Nt(e.node(),t,ot)}}}r=e.append("td");if(a.length){for(const t of a){const e=r.append("div").attr("class","sja_clbtext").style("color",t.style.fillhl).text(t.mname||"").on("click",(e=>{Nt(e.target,t,dt)}));if(t.labelIsVisible){Nt(e.node(),t,ot)}}}r=e.append("td");if(i.length){for(const t of i){const e=r.append("div").attr("class","sja_clbtext").style("color",t.style.fillhl).text(t.mname||"").on("click",(e=>{Nt(e.target,t,tt)}));if(t.labelIsVisible){Nt(e.node(),t,ot)}}}}function Nt(t,e,s){if(e.selected){t.style.border="";e.selected=false}else{t.style.border="solid 1px black";e.selected=true}const n=s.filter((t=>t.gene==e.gene&&t.class==e.class&&t.mname==e.mname));n.selectAll("rect").attr("fill-opacity",e.selected?.5:e.style.fillopacity).attr("fill",e.selected?e.style.fillhl:e.style.fill);n.selectAll("circle,ellipse,line").attr("stroke-opacity",e.selected?1:e.style.strokeopacity).attr("stroke",e.selected?e.style.strokehl:e.style.stroke).attr("stroke-width",e.selected?2:1);if(e.selected){let t=Math.max(20,e.radius),s=0;if((e.set_1||e.set_share)&&e.maf1>=.8){t=-e.radius;s=e.radius*2}const a=n.append("g").attr("class","sja_2dmaf_mlabel").attr("transform","translate("+t+","+s+")");let i;a.append("text").text(e.labelAs?e.labelAs:e.gene+" "+e.mname).attr("fill",e.style.fillhl).attr("dominant-baseline","middle").attr("text-anchor","start").attr("font-size",e.radius).each((function(){i=this.getBBox().width}));a.append("rect").attr("y",-e.radius/2).attr("width",i).attr("height",e.radius).attr("fill","black").attr("fill-opacity",0).on("mouseover",(t=>d(t.target).attr("fill-opacity",.2))).on("mouseout",(t=>d(t.target).attr("fill-opacity",0))).on("mousedown",(e=>{const n=t,i=s,r=e.clientX,l=e.clientY,o=d(document.body);o.on("mousemove",(e=>{e.preventDefault();t=n+e.clientX-r;s=i+e.clientY-l;a.attr("transform","translate("+t+","+s+")")}));o.on("mouseup",(()=>{o.on("mousemove",null).on("mouseup",null)}))}))}else{n.select(".sja_2dmaf_mlabel").remove()}}return A}function nt(t,e,s){if(!e.selected){d(t.target).attr("fill",e.style.fillhl).attr("fill-opacity",.2)}s.clear();s.show(t.clientX,t.clientY);s.d.append("div").html((e.gene||"no gene")+' <span style="color:'+e.style.fillhl+'">'+(e.mname||"")+"</span>"+(e.class?' <span style="font-size:70%">'+a[e.class].label+"</span>":""))}function at(t,e,s){if(!e.selected){d(t.ele).attr("fill",e.style.fill).attr("fill-opacity",e.style.fillopacity).attr("stroke",e.style.stroke)}s.hide()}function it(t,e,s){const n=f({x:t.clientX+30,y:t.clientY-30});n.header.text((s.gene?s.gene:"No gene")+" "+(s.mname?s.mname:""));var a=[];for(let t=0;t<e.length;t++){a.push({k:e[t],v:s[e[t]]})}u(n.body,a)}function rt(t,e){const s=t.pairs[e];if(s.shown){s.shown=false;s.holder.remove();if(s.handle){s.handle.attr("font-weight","normal")}}else{s.shown=true;if(s.holder){t.showholder.node().appendChild(s.holder.node())}else{s.holder=st(t.showholder,s)}if(s.handle){s.handle.attr("font-weight","bold")}}}function lt(t,e){const s=[];for(const e in t.pairs){s.push([e,t.pairs[e].mlst.length])}e.selectAll("*").remove();const n=e.append("div").style("margin-bottom","5px");n.append("span").text(s.length+" individual"+(s.length>1?"s":""));const a=e.append("svg");const i=5,p=20,h=t.rowh;let d=0;for(const t of s){a.append("text").text(t[0]).attr("font-size",h).attr("font-family",r).each((function(){d=Math.max(d,this.getBBox().width)})).remove()}a.attr("width",d+i+t.peoplewidth+30).attr("height",p+i+h*s.length);s.sort(((t,e)=>e[1]-t[1]));let f=0;for(const e in t.pairs){f=Math.max(f,t.pairs[e].mlst.length)}const u=a.append("g").attr("transform","translate("+(d+i)+","+p+")").call(m().scale(l().domain([0,f]).range([0,t.peoplewidth])).tickFormat(o("d")).ticks(3));c({axis:u,showline:true,color:"black"});const y=t.peoplewidth/f;let g=p+i;for(const e of s){const s=e[0];t.pairs[s].handle=a.append("text").text(s).attr("class","sja_svgtext2").attr("font-size",h-2).attr("font-family",r).attr("x",d).attr("y",g+i+h/2).attr("text-anchor","end").on("click",(()=>{rt(t,s)}));let n=0,l=0,o=0;for(const e of t.pairs[s].mlst){if(e.set_1)n++;else if(e.set_2)l++;else if(e.set_share)o++}const c=a.append("g").attr("transform","translate("+(d+i)+","+g+")");if(n>0){c.append("rect").attr("width",y*n).attr("height",h-1).attr("fill",t.color1)}if(o>0){c.append("rect").attr("x",y*n).attr("width",y*o).attr("height",h-1).attr("fill",t.colorshare)}if(l>0){c.append("rect").attr("x",y*(n+o)).attr("width",y*l).attr("height",h-1).attr("fill",t.color2)}g+=h}}export{$ as d2mafparseinput,Q as d2mafui};
|
|
1
|
+
import{M as t,bn as e,bo as s,j as n,z as a,bm as i,ah as r,I as l,W as o,ag as c,az as p,U as h,d,Z as f,a9 as u}from"./app-b369b169.js";import{c as m,a as y,b as g}from"./axis-747c801e.js";import{a as x,p as b,t as v,c as k,s as _}from"./math-2fb199c6.js";import{c as D,p as w}from"./constant-426a1483.js";var T={draw(t,e){const s=x(e/b);t.moveTo(s,0);t.arc(0,0,s,0,v)}};var N={draw(t,e){const s=x(e/5)/2;t.moveTo(-3*s,-s);t.lineTo(-s,-s);t.lineTo(-s,-3*s);t.lineTo(s,-3*s);t.lineTo(s,-s);t.lineTo(3*s,-s);t.lineTo(3*s,s);t.lineTo(s,s);t.lineTo(s,3*s);t.lineTo(-s,3*s);t.lineTo(-s,s);t.lineTo(-3*s,s);t.closePath()}};const R=x(1/3);const I=R*2;var M={draw(t,e){const s=x(e/I);const n=s*R;t.moveTo(0,-s);t.lineTo(n,0);t.lineTo(0,s);t.lineTo(-n,0);t.closePath()}};var X={draw(t,e){const s=x(e);const n=-s/2;t.rect(n,n,s,s)}};const B=.8908130915292852;const F=_(b/10)/_(7*b/10);const Y=_(v/10)*F;const z=-k(v/10)*F;var A={draw(t,e){const s=x(e*B);const n=Y*s;const a=z*s;t.moveTo(0,-s);t.lineTo(n,a);for(let e=1;e<5;++e){const i=v*e/5;const r=k(i);const l=_(i);t.lineTo(l*s,-r*s);t.lineTo(r*n-l*a,l*n+r*a)}t.closePath()}};const C=x(3);var O={draw(t,e){const s=-x(e/(C*3));t.moveTo(0,s*2);t.lineTo(-C*s,-s);t.lineTo(C*s,-s);t.closePath()}};const j=-.5;const S=x(3)/2;const L=1/x(12);const V=(L/2+1)*3;var W={draw(t,e){const s=x(e/V);const n=s/2,a=s*L;const i=n,r=s*L+s;const l=-i,o=r;t.moveTo(n,a);t.lineTo(i,r);t.lineTo(l,o);t.lineTo(j*n-S*a,S*n+j*a);t.lineTo(j*i-S*r,S*i+j*r);t.lineTo(j*l-S*o,S*l+j*o);t.lineTo(j*n+S*a,j*a-S*n);t.lineTo(j*i+S*r,j*r-S*i);t.lineTo(j*l+S*o,j*o-S*l);t.closePath()}};function E(t,e){let s=null;t=typeof t==="function"?t:D(t||T);e=typeof e==="function"?e:D(e===undefined?64:+e);function n(){let n;if(!s)s=n=w();t.apply(this,arguments).draw(s,+e.apply(this,arguments));if(n)return s=null,n+""||null}n.type=function(e){return arguments.length?(t=typeof e==="function"?e:D(e),n):t};n.size=function(t){return arguments.length?(e=typeof t==="function"?t:D(+t),n):e};n.context=function(t){return arguments.length?(s=t==null?null:t,n):s};return n}class H{constructor(t){this.opts=t;this.anchorType=t.anchorType;this.shareheight=t.shareheight;this.sharewidth=t.sharewidth;const e="x"in t?t.x:0;const s="y"in t?t.y:0;this.settings={visible:true,opacity:.3,x:e,y:s,xOffset:t.axiswidth+t.sp+t.sample2height,yOffset:t.shareheight,currX:t.axiswidth+t.sp+t.sample2height+e,currY:t.shareheight-s,strokeWidth:"strokeWidth"in t?t.strokeWidth:5,stroke:"stroke"in t?t.stroke:"red",xarmlen:"xarmlen"in t?t.xarmlen:25};this.addControls(this.anchorType?null:this.opts.headerdiv)}setWrapper(t){this.opts.wrapper=t}addControls(e=null){if(e){e.append("button").text("Anchors").on("click",(t=>{this.anchormenu.showunder(t.target);this.xInput.property("value",(this.settings.x/this.sharewidth).toFixed(2));this.yInput.property("value",(this.settings.y/this.sharewidth).toFixed(2))}))}this.anchormenu=new t({border:"solid 1px black"});this.anchormenu.d.style("text-align","center");this.addCoordInput();this.addColorInput();this.addOpacityInput();if(!this.anchorType)this.addSubmitBtns();else this.addDeleteBtn()}addColorInput(){const t=this.anchormenu.d.append("div");t.append("label").html("Color: ");this.strokeInput=t.append("input");this.strokeInput.attr("this.anchorType","text").property("value",this.settings.stroke).style("width","50px")}addOpacityInput(){const t=this.anchormenu.d.append("div");t.append("label").html("Opacity: ");this.opacityInput=t.append("input");this.opacityInput.attr("this.anchorType","number").attr("min",0).attr("max",1).attr("step",.01).property("value",this.settings.opacity).style("width","50px")}addSubmitBtns(){if(this.anchorType)return;const t=this.anchormenu.d.append("div");t.append("label").html("Add Anchor: ");t.append("button").html("R").on("click",(()=>{new P(this.getSettings("r"));this.anchormenu.hide()}));t.append("button").html("D").on("click",(()=>{new P(this.getSettings("d"));this.anchormenu.hide()}));t.append("button").html("X").on("click",(()=>{new P(this.getSettings("x"));this.anchormenu.hide()}));t.append("button").html("synced").on("click",(()=>{new P(this.getSettings("synced"));this.anchormenu.hide()}))}getSettings(t){return Object.assign({},this.opts,{anchorType:t,opacity:this.opacityInput.property("value"),x:this.xInput.property("value")*this.sharewidth,y:this.yInput.property("value")*this.shareheight,stroke:this.strokeInput.property("value")})}addCoordInput(){const t=this.anchormenu.d.append("div");t.append("label").html("X: ");this.xInput=t.append("input");this.xInput.attr("this.anchorType","number").attr("min",0).attr("max",1).attr("step",.01).property("value",0).style("width","80px");const e=this.anchormenu.d.append("div");e.append("label").html("Y: ");this.yInput=e.append("input");this.yInput.attr("this.anchorType","number").attr("min",0).attr("max",1).attr("step",.01).property("value",0).style("width","80px")}addDeleteBtn(){if(!this.anchorType)return;const t=this.anchormenu.d.append("div");t.append("button").html("Delete").on("click",(()=>{this.g_anchor.remove();this.anchormenu.hide()}))}}class P extends H{constructor(t){super(t);this.render();this.strokeInput.on("change",(()=>{this.settings.stroke=this.strokeInput.property("value");this.g_anchor.style("stroke",this.settings.stroke);this.anchormenu.hide()}));this.opacityInput.on("change",(()=>{this.settings.opacity=input.property("value");this.g_anchor.style("opacity",this.settings.opacity);this.anchormenu.hide()}));this.xInput.on("change",(()=>{this.settings.x=+this.xInput.property("value")*this.sharewidth;this.settings.currX=this.settings.x+this.settings.xOffset;if(this.d_anchor){this.d_anchor.transition().duration(1e3).attr("x1",this.settings.currX).attr("x2",this.settings.currX)}if(this.x_anchor){this.x_anchor.transition().duration(1e3).attr("transform","translate("+this.settings.currX+","+this.settings.currY+")")}this.anchormenu.hide()}));this.yInput.on("change",(()=>{this.settings.y=+this.yInput.property("value")*this.shareheight;this.settings.currY=-this.settings.y+this.settings.yOffset;if(this.r_anchor){this.r_anchor.transition().duration(1e3).attr("y1",this.settings.currY).attr("y2",this.settings.currY)}if(this.x_anchor){this.x_anchor.transition().duration(1e3).attr("transform","translate("+this.settings.currX+","+this.settings.currY+")")}this.anchormenu.hide()}))}render(){this.g_anchor=this.opts.wrapper.append("g").style("stroke",this.settings.stroke).style("opacity",this.settings.opacity).style("display",this.settings.visible?"":"none").style("stroke-width",this.settings.strokeWidth).on("click",this.anchorType=="synced"?null:t=>{this.anchormenu.showunder(t.target)});this.renderD();this.renderR();this.renderX()}renderD(){if(!["synced","d"].includes(this.anchorType))return;this.d_anchor=this.g_anchor.append("line");const t=this.opts;this.updateD(t.shareheight+t.sp2,t.shareheight+t.sample1height)}updateD(t,e){if(!["synced","d"].includes(this.anchorType))return;this.settings.D={y1:t,y2:e};this.d_anchor.attr("x1",this.settings.currX).attr("x2",this.settings.currX).attr("y1",t).attr("y2",e)}renderR(){if(!["synced","r"].includes(this.anchorType))return;this.r_anchor=this.g_anchor.append("line");const t=this.opts;this.updateR(t.axiswidth+t.sp,t.sample2height+t.sp)}updateR(t,e){if(!["synced","r"].includes(this.anchorType))return;this.settings.R={x1:t,x2:e};this.r_anchor.attr("x1",t).attr("x2",e).attr("y1",this.settings.currY).attr("y2",this.settings.currY)}renderX(){if(!["synced","x"].includes(this.anchorType))return;this.x_anchor=this.g_anchor.append("g").attr("transform","translate("+this.settings.currX+","+this.settings.currY+")");this.bindXDrag();this.x_anchor.append("circle").attr("cx",0).attr("cy",0).attr("r",this.settings.xarmlen).style("opacity",0);this.x_anchor.append("line").attr("x1",-this.settings.xarmlen).attr("x2",this.settings.xarmlen).attr("y1",0).attr("y2",0);this.x_anchor.append("line").attr("x1",0).attr("x2",0).attr("y1",this.settings.xarmlen).attr("y2",-this.settings.xarmlen)}bindXDrag(){if(!["synced"].includes(this.anchorType))return;this.x_anchor.on("mousedown",(t=>{const e=t.clientX;const s=t.clientY;let n=this.settings.currX,a=this.settings.currY;this.x_anchor.on("mousemove",(t=>{n=this.settings.currX-e+t.clientX;a=this.settings.currY-s+t.clientY;this.r_anchor.attr("y1",a).attr("y2",a);this.d_anchor.attr("x1",n).attr("x2",n);this.x_anchor.attr("transform","translate("+n+","+a+")")})).on("mouseup",(t=>{this.x_anchor.on("mousemove",null);n=this.settings.currX-e+t.clientX;a=this.settings.currY-s+t.clientY;if(n==this.settings.currX&&a==this.settings.currY){this.g_anchor.remove();return}this.settings.x=n<this.settings.xOffset?0:n-this.settings.xOffset;this.settings.y=a>this.settings.yOffset?0:-(a-this.settings.yOffset);this.settings.currX=this.settings.x+this.settings.xOffset;this.settings.currY=-this.settings.y+this.settings.yOffset;this.r_anchor.transition().duration(100).attr("y1",this.settings.currY).attr("y2",this.settings.currY);this.d_anchor.transition().duration(100).attr("x1",this.settings.currX).attr("x2",this.settings.currX);this.x_anchor.transition().duration(100).attr("transform","translate("+this.settings.currX+","+this.settings.currY+")")})).on("mouseleave",(()=>{this.x_anchor.on("mousemove",null)}))}))}}const q="#f9766c";const G="#609cff";const U="#01b937";const Z={circle:T,cross:N,diamond:M,square:X,star:A,triangle:O,wye:W};const J={path:t=>t.symbol,circle:t=>!t.symbol};const K={path:t=>t.symbol,ellipse:t=>!t.symbol};function Q(t,n){let a,i,r,l,o,c;if(n!==undefined)[i,r,l,o,c]=e(n,t);else{[a,i,r,l,o,c]=s(100,100,t);a.header.text("2DMAF: mutant allele fraction plot between a pair of samples");a.body.style("margin","10px")}i.append("div").style("margin-top","20px").html("<ul>"+'<li><a href="https://docs.google.com/document/d/1anyEDMcW1lTSf8399Li2G9r57V-Fqp2591WvoODY7n4/edit#heading=h.mne2ecmp9m13" target=_blank>File format</a></li>'+'<li>To define samples differently than "Diagnosis/Relapse", <a href=https://plus.google.com/+XinZhou_s/posts/WqBVvmd3wYR target=_blank>see how</a>.</li>'+"</ul>");i.append("p").html("<a href=https://proteinpaint.stjude.org/ppdemo/hg19/2dmaf/2dmaf.txt target=_blank>Example file</a>");function p(t,e){o.style("color",e?"red":"black").html(t)}const h=()=>{l.selectAll("*").remove();const e=l.append("input").attr("type","file").on("change",(e=>{const s=e.target.files[0];if(!s){h();return}if(!s.size){p("Invalid file "+s.name);h();return}const n=new FileReader;n.onload=e=>{const n=r.options[r.selectedIndex].innerHTML;const a=tt(e.target.result.trim().split(/\r?\n/),t[n],s.name,c);if(a){p(a,1);h();return}i.remove();l.remove();o.remove()};n.onerror=function(){p("Error reading file "+s.name,1);h();return};n.readAsText(s,"utf8")}));setTimeout((()=>e.node().focus()),1100)};h()}function $(t,e){if(!t.genome){n(e,".genome missing for 2dmaf");return}if(!t.input){n(e,".input missing for 2dmaf");return}const s=tt(t.input.trim().split(/\r?\n/),t.genome,t.datasetname||"unnamed dataset",e);if(s){n(e,"2DMAF data error: "+s)}}function tt(t,e,s,n){const[r,l,o]=et(t[0].trim());if(r){return r}const c={};const p={};const h={};const d={good:0,purity1set:false,purity2set:false,pairsetname:{}};const f=[];const u={};for(const t in a){u[a[t].label.toUpperCase()]=t}for(let e=1;e<t.length;e++){if(t[e]=="")continue;if(t[e][0]=="#"){if(t[e].startsWith("##samplename")){const s=t[e].trim().split(/[\s\t]+/);if(s.length==4){d.pairsetname[s[1]]={1:s[2],2:s[3]}}else{return"Line "+(e+1)+': invalid samplename line: must be "##samplename [patient] [sample1] [sample2]"'}}continue}const s=t[e].trim().split("\t");const n={};for(let t=0;t<l.length;t++){if(s[t]!=undefined&&s[t]!=""){n[l[t]]=s[t]}}if(!n.sample){return"Line "+(e+1)+": missing sample"}if(n.chr){if(n.chr.indexOf("chr")!=0){n.chr="chr"+n.chr}}if(n.chrstart){n.chrstart=Number.parseInt(n.chrstart);if(Number.isNaN(n.chrstart)){return"Line "+(e+1)+": invalid chromosome position"}}if(n.Dcnvloh){n.Dcnvlohraw=n.Dcnvloh;const t=n.Dcnvloh.toLowerCase();if(t=="yes"||t!="diploid"&&t!="haploid"){n.Dcnvloh=true}else{n.Dcnvloh=false}}if(n.Rcnvloh){n.Rcnvlohraw=n.Rcnvloh;const t=n.Rcnvloh.toLowerCase();if(t=="yes"||t!="diploid"&&t!="haploid"){n.Rcnvloh=true}else{n.Rcnvloh=false}}if(!n.call_d){f.push([e,"missing call_d",s]);continue}if(n.call_d!="somatic"&&n.call_d!="wildtype"){f.push([e,"call_d is neither somatic nor wildtype",s]);continue}if(!n.call_r){f.push([e,"missing call_r",s]);continue}if(n.call_r!="somatic"&&n.call_r!="wildtype"){f.push([e,"call_r is neither somatic nor wildtype",s]);continue}if(n.call_d=="somatic"){if(n.call_r=="somatic"){n.set_share=true}else{n.set_1=true}}else{if(n.call_r=="somatic"){n.set_2=true}}if(!n.type){f.push([e,"missing type",s]);continue}const i=n.type.toLowerCase();if(i=="snv"||i=="snp"||i=="mnv"||i=="complex"){n.issnv=true}else if(i=="indel"||i=="ins"||i=="del"){n.isindel=true}else{f.push([e,"type must be either SNV or INDEL",s]);continue}let r="MinD.D";let o=Number.parseInt(n[r]);if(Number.isNaN(o)||o<0){f.push([e,"invalid "+r+" value",s]);continue}n[r]=o;r="TinD.D";o=Number.parseInt(n[r]);if(Number.isNaN(o)||o<0){f.push([e,"invalid "+r+" value",s]);continue}n[r]=o;if(n["TinD.D"]<n["MinD.D"]){f.push([e,"TinD.D value lower than MinD.D",s]);continue}r="MinN.D";if(r in n){o=Number.parseInt(n[r]);if(Number.isNaN(o)||o<0){delete n[r]}else{n[r]=o}}r="TinN.D";if(r in n){o=Number.parseInt(n[r]);if(Number.isNaN(o)||o<0){delete n[r]}else{n[r]=o}}r="MinD.R";o=Number.parseInt(n[r]);if(Number.isNaN(o)||o<0){f.push([e,"invalid "+r+" value",s]);continue}n[r]=o;r="TinD.R";o=Number.parseInt(n[r]);if(Number.isNaN(o)||o<0){f.push([e,"invalid "+r+" value",s]);continue}n[r]=o;if(n["TinD.R"]<n["MinD.R"]){f.push([e,"TinD.R value lower than MinD.R",s]);continue}r="MinN.R";if(r in n){o=Number.parseInt(n[r]);if(Number.isNaN(o)||o<0){delete n[r]}else{n[r]=o}}r="TinN.R";if(r in n){o=Number.parseInt(n[r]);if(Number.isNaN(o)||o<0){delete n[r]}else{n[r]=o}}if(n.symbol){if(!Z[n.symbol]){f.push([e,"Invalid symbol value='"+n.symbol+"'",s]);continue}}if(n.class){const t=n.class.toUpperCase();if(t in u){n.class=u[t]}else{f.push([e,"invalid mutation class "+n.class,s]);continue}}n.style={fill:n.issnv?"white":"black",fillhl:n.class?a[n.class].color:"#ccc",stroke:n.chr=="chrX"?"black":n.issnv?"black":"none",strokehl:n.class?a[n.class].color:"black",fillopacity:n.issnv?0:.2,strokeopacity:.2};if(n["TinD.D"]>0){n.maf1=n["MinD.D"]/n["TinD.D"]}if(n["TinD.R"]>0){n.maf2=n["MinD.R"]/n["TinD.R"]}p[n.sample]=1;if(n.gene){h[n.gene]=1}if(!(n.sample in c)){c[n.sample]={name:n.sample,shown:false,header:l,mlst:[]}}const m=c[n.sample];m.mlst.push(n);if(n.purity1){let t=Number.parseFloat(n.purity1);if(Number.isNaN(t)){f.push([e,"diagnosis tumor purity should be a number"]);t=0}else{if(t>1){t/=100}}if(t>0){if(m.purity1==undefined){m.purity1=t;d.purity1set=true}else if(m.purity1!=t){f.push([e,"diagnosis tumor purity value "+t+" is different from existing value "+m.purity1+" in "+n.sample,s])}}}if(n.purity2){let t=Number.parseFloat(n.purity2);if(Number.isNaN(t)){f.push([e,"relapse tumor purity should be a number"]);t=0}else{if(t>1){t/=100}}if(t>0){if(m.purity2==undefined){m.purity2=t;d.purity2set=true}else if(m.purity2!=t){f.push([e,"relapse tumor purity value "+t+" is different from existing value "+m.purity2+" in "+n.sample,s])}}}d.good++}if(f.length>0){i(l,f)}if(d.good==0){return"No valid data."}n.append("p").text("File: "+s);let m=0;for(const t in h)m++;const y=16;const g=n.append("table");const x=g.append("tr");const b=x.append("td").attr("valign","top");b.append("div").html('<div style="display:inline-block;width:'+y+"px;height:"+y+"px;background-color:"+q+'"></div> Diagnosis only '+'<div style="display:inline-block;width:'+y+"px;height:"+y+"px;background-color:"+U+'"></div> Shared '+'<div style="display:inline-block;width:'+y+"px;height:"+y+"px;background-color:"+G+'"></div> Relapse only');const v=b.append("div").style("margin-top","10px").style("height","200px").style("width","300px").style("padding","5px").style("overflow-y","scroll").style("resize","both").style("border","solid 1px #ccc");b.append("div").style("margin-top","10px").style("height","200px").style("width","300px").style("padding","5px").style("overflow-y","scroll").style("resize","both").style("border","solid 1px #ccc");const k=x.append("td").style("vertical-align","top");for(const t in c){const e=d.pairsetname[t];if(e){c[t].setname=e}else{c[t].setname={1:"Diagnosis",2:"Relapse"}}}const _={genome:e,pairs:c,color1:q,color2:G,colorshare:U,rowh:y,peoplewidth:150,genewidth:150,showholder:k,genelimit:Math.min(20,m),purity1set:d.purity1set,purity2set:d.purity2set};lt(_,v)}function et(t){const e=t.toLowerCase().split("\t");const s=t.split("\t");if(s.length<=1){return["invalid file header"]}const n=(...t)=>{for(const s of t){const t=e.indexOf(s);if(t!=-1)return t}return-1};let i=n("person","sample","samplename","patient");if(i==-1)return["sample missing from header"];s[i]="sample";i=n("type");if(i==-1)return["type missing from header"];s[i]="type";i=n("mind.d1_g1","mind.d","mind");if(i==-1)return["MinD.D missing from header"];s[i]="MinD.D";i=n("tind.d1_g1","tind.d","tind");if(i==-1)return["TinD.D missing from header"];s[i]="TinD.D";i=n("mind.r1_g1","mind.r","minr");if(i==-1)return["MinD.R missing from header"];s[i]="MinD.R";i=n("tind.r1_g1","tind.r","tinr");if(i==-1)return["TinD.R missing from header"];s[i]="TinD.R";i=n("call_d1_g1","call_d");if(i==-1)return["call_d missing from header"];s[i]="call_d";i=n("call_r1_g1","call_r");if(i==-1)return["call_r missing from header"];s[i]="call_r";i=n("genename","gene");if(i==-1)return["gene missing from header"];s[i]="gene";i=n("amino_acid_change","annovar_sj_aachange","aachange","protein_change");if(i==-1)return["amino_acid_change missing from header"];s[i]="mname";i=n("class","mclass","variant_class","variant_classification","annovar_sj_class");if(i==-1)return["variant_class missing from header"];s[i]="class";i=n("chromosome","chr");if(i==-1)return["chromosome missing from header"];s[i]="chr";i=n("start","start_position","wu_hg19_pos","chr_position");if(i==-1)return["start missing from header"];s[i]="chrstart";i=n("minn.d1_g1","minn.d");if(i!=-1)s[i]="MinN.D";i=n("tinn.d1_g1","tinn.d");if(i!=-1)s[i]="TinN.D";i=n("minn.r1_g1","minn.r");if(i!=-1)s[i]="MinN.R";i=n("tinn.r1_g1","tinn.r");if(i!=-1)s[i]="TinN.R";i=n("mrna_accession","refseq_mrna_id","annovar_sj_filter_isoform","refseq");if(i!=-1)s[i]="isoform";i=n("primary_purity","purity_d");if(i!=-1)s[i]="purity1";i=n("relapse_purity","purity_r");if(i!=-1)s[i]="purity2";i=n("tag_d_cnvloh","cnvloh_d");if(i!=-1)s[i]="Dcnvloh";i=n("tag_r_cnvloh","cnvloh_r");if(i!=-1)s[i]="Rcnvloh";const r=[];for(const t of s){switch(t){case"Dcnvloh":r.push({label:"D. CNV/LOH",get:t=>t.Dcnvlohraw});break;case"Rcnvloh":r.push({label:"R. CNV/LOH",get:t=>t.Rcnvlohraw});break;case"type":r.push({label:"Type",get:t=>t.type});break;case"chr":break;case"chrstart":r.push({label:"Genome Loc.",get:t=>t.chr+":"+(t.chrstart+1)});break;case"class":r.push({label:"Class",get:t=>{if(t.class==p){return t.originalclasslabel?t.originalclasslabel:a[t.class].label}return a[t.class].label}});break;case"mname":r.push({label:"Mutation",get:t=>{let e=t.mname;if(!e)e=t.cdna_change;return e}});break;case"MinD.D":r.push({ismaf:true,width:60,height:14,readcountcredible:30,get:t=>t.maf_diagnosis,label:"D. tumor MAF",fill:"#F7483B",fillbg:"#FCBAB6"});break;case"TinD.D":break;case"MinD.R":r.push({ismaf:true,width:60,height:14,readcountcredible:30,get:t=>t.maf_relapse,label:"R. tumor MAF",fill:"#146EFF",fillbg:"#B6D5FC"});break;case"TinD.R":break;case"MinN.D":r.push({ismaf:true,width:60,height:14,readcountcredible:30,get:t=>t.maf_diagnosis_normal,label:"D. normal MAF",fill:"#F7483B",fillbg:"#FCBAB6"});break;case"TinN.D":break;case"MinN.R":r.push({ismaf:true,width:60,height:14,readcountcredible:30,get:t=>t.maf_relapse_normal,label:"R. normal MAF",fill:"#146EFF",fillbg:"#B6D5FC"});break;case"TinN.R":break;case"call_d":r.push({label:"D. call",get:t=>t.call_d});break;case"call_r":r.push({label:"R. call",get:t=>t.call_r});break;case"purity1":r.push({label:"D. purity",get:t=>t.purity1});break;case"purity2":r.push({label:"R. purity",get:t=>t.purity2});break;default:r.push({label:t,get:e=>e[t]})}}return[null,s,r]}function st(e,s){const n=new t({border:"solid 1px black"});const i=[];const o=[];const p=[];const f=s.mlst;const u=f[0].sample;const m=E();let x=0;let b={};const v={};for(const t of f){if(t["TinD.D"]>0){x=Math.max(x,t["TinD.D"])}if(t["TinD.R"]>0){x=Math.max(x,t["TinD.R"])}if(t.set_share){p.push(t)}else if(t.set_1){i.push(t)}else if(t.set_2){o.push(t)}if(!(t.class in v)){v[t.class]=0}if(t.symbol){if(!b[t.symbol]){b[t.symbol]={numlines:0,label:t.symbollabel,hidden:false}}b[t.symbol].numlines++}v[t.class]++}const k=Math.min(window.innerWidth,window.innerHeight);const _=50,D=k*.5,w=k*.5,T=w/2,N=D/2,R=_/3,I=T/5,M=Math.min(20,12*k/500),X=k/40,B=X*.7,F=3;const Y=l().domain([0,x]).range([X/2,X]);const z=t=>Math.PI*Math.pow(Y(t),2);for(const t of f){t.radius=Math.max(t["TinD.D"]?Y(t["TinD.D"]):0,t["TinD.R"]?Y(t["TinD.R"]):0)}const A=e.append("table");const C=A.append("tr");const O=C.append("td").style("vertical-align","top");const j=C.append("td").style("vertical-align","top");j.append("div").style("margin","10px").text("Name: "+u);const S=O.append("div");S.append("button").text("Hide").on("click",(()=>{s.shown=false;if(s.handle){s.handle.attr("font-weight","normal")}A.remove()}));const L=new H({axiswidth:_,sp:R,sp2:I,sample1height:T,sample2height:N,shareheight:w,sharewidth:D,headerdiv:S});S.append("button").text("Screenshot").on("click",(()=>{h(V.node(),"2dmaf_"+s.name)}));{const t=S.append("select").on("change",(t=>{const e=t.target.options[t.target.selectedIndex].value;if(e=="all"){tt.transition().attr("transform",(t=>t.posstring+" scale(1)"));ot.transition().attr("transform",(t=>t.posstring+" scale(1)"));dt.transition().attr("transform",(t=>t.posstring+" scale(1)"));return}tt.transition().attr("transform",(t=>t.posstring+" scale("+(t.class==e?1:0)+")"));ot.transition().attr("transform",(t=>t.posstring+" scale("+(t.class==e?1:0)+")"));dt.transition().attr("transform",(t=>t.posstring+" scale("+(t.class==e?1:0)+")"))}));t.append("option").text("Show all mutation classes").property("value","all");const e=[];for(const t in v){e.push([t,v[t]])}e.sort(((t,e)=>e[1]-t[1]));for(const s of e){t.append("option").text((s[0]in a?a[s[0]].label:s[0])+" ("+s[1]+")").property("value",s[0])}}const V=O.append("svg").attr("width",_+R+N+D+R*2).attr("height",_+R+T+w+R*2);const W=V.append("g").attr("transform","translate("+R+","+R+")");L.setWrapper(W.append("g"));const P=l().domain([0,1]).range([0,D]);const q=W.append("g").attr("transform","translate("+(_+R+N)+","+(w+T+R)+")").call(y().scale(P).tickSize(5));c({axis:q,showline:true,fontsize:M*.8});const G=i.length+p.length;q.append("text").text(s.setname[1]+", n="+G+(s.purity1?", purity="+s.purity1:"")).attr("x",D/2).attr("y",_-4).attr("text-anchor","middle").attr("font-size",M);const U=l().domain([0,1]).range([w,0]);const Q=W.append("g").attr("transform","translate("+_+",0)").call(g().scale(U).tickSize(5));c({axis:Q,showline:true,fontsize:M*.8});const $=o.length+p.length;Q.append("text").text(s.setname[2]+", n="+$+(s.purity2?", purity="+s.purity2:"")).attr("transform","translate("+(M-_-10)+","+w/2+") rotate(-90)").attr("text-anchor","middle").attr("font-size",M);W.append("path").attr("d","M"+(_+R)+",0"+"h"+(N+D)+"v"+(w+T)+"h-"+D+"v-"+(T+w)+"M"+(_+R)+",0"+"v"+w+"h"+(N+D)+"M"+(_+R+N)+","+w+"l"+D+",-"+w).attr("fill","none").attr("stroke","black").attr("shape-rendering","crispEdges").attr("stroke-dasharray","5,5");const tt=W.append("g").attr("transform","translate("+(_+R+N)+",0)").selectAll().data(p).enter().append("g").attr("transform",(t=>{t.posstring="translate("+P(t.maf1)+","+U(t.maf2)+")";return t.posstring}));tt.filter((t=>t.Dcnvloh)).append("circle").attr("cy",(t=>t.issnv?Y(t["TinD.R"]):B/2)).attr("fill","#858585").attr("r",F);tt.filter((t=>t.Rcnvloh)).append("circle").attr("cx",(t=>t.issnv?-Y(t["TinD.D"]):-B/2)).attr("fill","#858585").attr("r",F);let et=tt;for(const t in K){et.filter(K[t]).append(t).attr("rx",(t=>t.symbol?null:Y(t["TinD.D"]))).attr("ry",(t=>t.symbol?null:Y(t["TinD.R"]))).attr("d",(t=>!t.symbol?null:m.type(Z[t.symbol]).size(z(t["TinD.D"])+z(t["TinD.R"])/2)())).attr("fill",(t=>t.style.fill)).attr("fill-opacity",(t=>t.style.fillopacity)).attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("stroke-dasharray",(t=>t.chr=="chrX"?"5,5":"none")).on("mouseover",((t,e)=>nt(t,e,n))).on("mouseout",((t,e)=>at(t,e,n))).on("click",((t,e)=>it(t,s.header,e)))}et.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",-3).attr("x2",3).attr("y2",3);et.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",3).attr("x2",3).attr("y2",-3);const st=l().domain([0,x]).range([T-I,0]);const rt=W.append("g").attr("transform","translate("+(_+R+N)+","+(w+I)+")");const lt="#FFBEAD";rt.append("rect").attr("fill",lt).attr("fill-opacity",0).attr("x",0).attr("width",3).attr("height",T-I);c({axis:rt.call(g().scale(st).tickValues([0,x])),showline:true,fontsize:M*.8});rt.append("g").attr("transform","translate(-"+M/2+","+(T-I)/2+")").append("text").text("D total").attr("font-size",M*.8).attr("font-family",r).attr("fill","black").attr("text-anchor","middle").attr("dominant-baseline","middle").attr("transform","rotate(-90)");const ot=rt.selectAll().data(i).enter().append("g").attr("transform",(t=>{t.posstring="translate("+P(t.maf1)+","+st(t["TinD.D"])+")";return t.posstring}));ot.filter((t=>t.Dcnvloh)).append("circle").attr("cy",(t=>t.issnv?Y(t["TinD.R"]):B/2)).attr("fill","#858585").attr("r",F);ot.filter((t=>t.Rcnvloh)).append("circle").attr("cx",(t=>t.issnv?-Y(t["TinD.D"]):-B/2)).attr("fill","#858585").attr("r",F);et=ot;for(const t in J){et.filter(J[t]).append(t).attr("class",(t=>t.symbol?"twodmaf-"+t.symbol:null)).attr("r",(t=>t.symbol?null:Y(t["TinD.R"]))).attr("d",(t=>!t.symbol?null:m.type(Z[t.symbol]).size(z(t["TinD.R"]))())).attr("fill",(t=>t.style.fill)).attr("fill-opacity",(t=>t.style.fillopacity)).attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("stroke-dasharray",(t=>t.chr=="chrX"?"5,5":"none")).on("mouseover",((t,e)=>nt(t,e,n))).on("mouseout",((t,e)=>at(t,e,n))).on("click",((t,e)=>it(t,s.header,e)))}et.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",-3).attr("x2",3).attr("y2",3);et.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",3).attr("x2",3).attr("y2",-3);const ct=l().domain([0,x]).range([0,N-I]);const pt=W.append("g").attr("transform","translate("+(_+R)+",0)");pt.append("rect").attr("fill",lt).attr("fill-opacity",0).attr("y",w).attr("width",N-I).attr("height",3);const ht=pt.append("g").attr("transform","translate(0,"+w+")").call(y().scale(ct).tickValues([0,x]));c({axis:ht,showline:true,fontsize:M*.8});pt.append("text").text("R total").attr("font-size",M*.8).attr("font-family",r).attr("fill","black").attr("x",(N-I)/2).attr("y",w+M).attr("text-anchor","middle");const dt=pt.selectAll().data(o).enter().append("g").attr("transform",(t=>{t.posstring="translate("+ct(t["TinD.R"])+","+U(t.maf2)+")";return t.posstring}));dt.filter((t=>t.Dcnvloh)).append("circle").attr("cy",(t=>t.issnv?Y(t["TinD.R"]):B/2)).attr("fill","#858585").attr("r",F);dt.filter((t=>t.Rcnvloh)).append("circle").attr("cx",(t=>t.issnv?-Y(t["TinD.D"]):-B/2)).attr("fill","#858585").attr("r",F);et=dt;for(const t in J){et.filter(J[t]).append(t).attr("class",(t=>t.symbol?"twodmaf-"+t.symbol:null)).attr("r",(t=>t.symbol?null:Y(t["TinD.D"]))).attr("d",(t=>!t.symbol?null:m.type(Z[t.symbol]).size(z(t["TinD.R"]))())).attr("fill",(t=>t.style.fill)).attr("fill-opacity",(t=>t.style.fillopacity)).attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("stroke-dasharray",(t=>t.chr=="chrX"?"5,5":"none")).on("mouseover",((t,e)=>nt(t,e,n))).on("mouseout",((t,e)=>at(t,e,n))).on("click",((t,e)=>it(t,s.header,e)))}et.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",-3).attr("x2",3).attr("y2",3);et.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",3).attr("x2",3).attr("y2",-3);const ft=W.append("g").attr("transform","translate(0,"+(w+I)+")");let ut=M;ft.append("text").text(u).attr("font-size",M).attr("y",ut);const mt=Y(20),yt=Y(x);ut+=M+yt;let gt;ft.append("text").text("SNV coverage").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));gt+=mt+10;ft.append("circle").attr("cx",gt).attr("cy",ut).attr("r",mt).attr("stroke","black").attr("fill","none");ft.append("text").text(20).attr("x",gt).attr("y",ut).attr("text-anchor","middle").attr("dominant-baseline","middle");gt+=mt+yt+10;ft.append("circle").attr("cx",gt).attr("cy",ut).attr("r",yt).attr("stroke","black").attr("fill","none");ft.append("text").text(x).attr("x",gt).attr("y",ut).attr("text-anchor","middle").attr("dominant-baseline","middle");ut+=yt+10;ft.append("text").text("Indel").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));ft.append("circle").attr("cx",gt+10+B/2).attr("cy",ut).attr("r",B/2).attr("fill","black").attr("fill-opacity",.3);ut+=30;ft.append("text").text("chrX").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));gt+=mt+10;ft.append("circle").attr("cx",gt).attr("cy",ut).attr("r",10).attr("stroke","black").attr("stroke-dasharray","5,5").attr("fill","none");ut+=30;ft.append("text").text("D. CNV/LOH").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));gt+=mt+10;ft.append("circle").attr("cx",gt).attr("cy",ut).attr("r",10).attr("stroke","black").attr("fill","none");ft.append("circle").attr("cx",gt).attr("cy",ut+10).attr("r",F).attr("fill","black");ut+=30;ft.append("text").text("R. CNV/LOH").attr("y",ut).attr("dominant-baseline","central").each((function(){gt=this.getBBox().width}));gt+=mt+10;ft.append("circle").attr("cx",gt).attr("cy",ut).attr("r",10).attr("stroke","black").attr("fill","none");ft.append("circle").attr("cx",gt-10).attr("cy",ut).attr("r",F).attr("fill","black");ut+=30;if(s.purity1!=undefined||s.purity2!=undefined){ft.append("text").text("Expected MAF").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));gt+=10;ft.append("rect").attr("fill",lt).attr("x",gt).attr("y",ut).attr("width",40).attr("height",3);ut+=30}const xt=Object.keys(b);if(xt.length){ft.append("text").text("Symbols").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));let t;for(const e in b){const s=b[e];const n=ft.append("g").on("click",(()=>{s.hidden=!s.hidden;V.selectAll(".twodmaf-"+e).style("display",s.hidden?"none":"");a.style("text-decoration",s.hidden?"line-through":"")}));t=gt+20;n.append("path").attr("transform","translate("+t+","+ut+")").attr("d",m.type(Z[e]).size(100)()).attr("stroke","black").attr("fill","none").each((function(){t+=this.getBBox().width}));const a=n.append("text").text(s.label?s.label+" ("+s.numlines+")":"").attr("y",ut+2).attr("x",t).attr("dominant-baseline","middle").style("text-decoration",s.hidden?"line-through":"");ut+=30}ut+=30}const bt={},vt={},kt={},_t={};for(const t of f){if(!t.gene)continue;if(!(t.gene in bt)){bt[t.gene]=[]}bt[t.gene].push(t);if(t.set_1){vt[t.gene]=1}else if(t.set_2){kt[t.gene]=1}else if(t.set_share){_t[t.gene]=1}}const Dt=[];for(const t in vt){Dt.push(t)}for(const t in kt){if(!(t in vt)){Dt.push(t)}}for(const t in _t){if(!(t in vt)&&!(t in kt)){Dt.push(t)}}const wt=j.append("div").style("height",w+T+"px").style("margin","10px").style("padding","10px").style("border","solid 1px #ccc").style("overflow-y","scroll").style("resize","both").append("table");{const t=wt.append("tr");t.append("td").text("Gene");t.append("td").text(s.setname[1]+" only");t.append("td").text(s.setname[2]+" only");t.append("td").text("Shared")}let Tt=true;for(const t of Dt){const e=wt.append("tr");if(Tt){e.style("background-color","#f3f3f3")}Tt=!Tt;e.append("td").text(t);let s=[];if(t in bt){s=bt[t]}const n=[],a=[],i=[];for(const t of s){if(t.set_share)i.push(t);else if(t.set_1)n.push(t);else if(t.set_2)a.push(t)}let r=e.append("td");if(n.length){for(const t of n){const e=r.append("div").attr("class","sja_clbtext").style("color",t.style.fillhl).text(t.mname||"").on("click",(e=>{Nt(e.target,t,ot)}));if(t.labelIsVisible){Nt(e.node(),t,ot)}}}r=e.append("td");if(a.length){for(const t of a){const e=r.append("div").attr("class","sja_clbtext").style("color",t.style.fillhl).text(t.mname||"").on("click",(e=>{Nt(e.target,t,dt)}));if(t.labelIsVisible){Nt(e.node(),t,ot)}}}r=e.append("td");if(i.length){for(const t of i){const e=r.append("div").attr("class","sja_clbtext").style("color",t.style.fillhl).text(t.mname||"").on("click",(e=>{Nt(e.target,t,tt)}));if(t.labelIsVisible){Nt(e.node(),t,ot)}}}}function Nt(t,e,s){if(e.selected){t.style.border="";e.selected=false}else{t.style.border="solid 1px black";e.selected=true}const n=s.filter((t=>t.gene==e.gene&&t.class==e.class&&t.mname==e.mname));n.selectAll("rect").attr("fill-opacity",e.selected?.5:e.style.fillopacity).attr("fill",e.selected?e.style.fillhl:e.style.fill);n.selectAll("circle,ellipse,line").attr("stroke-opacity",e.selected?1:e.style.strokeopacity).attr("stroke",e.selected?e.style.strokehl:e.style.stroke).attr("stroke-width",e.selected?2:1);if(e.selected){let t=Math.max(20,e.radius),s=0;if((e.set_1||e.set_share)&&e.maf1>=.8){t=-e.radius;s=e.radius*2}const a=n.append("g").attr("class","sja_2dmaf_mlabel").attr("transform","translate("+t+","+s+")");let i;a.append("text").text(e.labelAs?e.labelAs:e.gene+" "+e.mname).attr("fill",e.style.fillhl).attr("dominant-baseline","middle").attr("text-anchor","start").attr("font-size",e.radius).each((function(){i=this.getBBox().width}));a.append("rect").attr("y",-e.radius/2).attr("width",i).attr("height",e.radius).attr("fill","black").attr("fill-opacity",0).on("mouseover",(t=>d(t.target).attr("fill-opacity",.2))).on("mouseout",(t=>d(t.target).attr("fill-opacity",0))).on("mousedown",(e=>{const n=t,i=s,r=e.clientX,l=e.clientY,o=d(document.body);o.on("mousemove",(e=>{e.preventDefault();t=n+e.clientX-r;s=i+e.clientY-l;a.attr("transform","translate("+t+","+s+")")}));o.on("mouseup",(()=>{o.on("mousemove",null).on("mouseup",null)}))}))}else{n.select(".sja_2dmaf_mlabel").remove()}}return A}function nt(t,e,s){if(!e.selected){d(t.target).attr("fill",e.style.fillhl).attr("fill-opacity",.2)}s.clear();s.show(t.clientX,t.clientY);s.d.append("div").html((e.gene||"no gene")+' <span style="color:'+e.style.fillhl+'">'+(e.mname||"")+"</span>"+(e.class?' <span style="font-size:70%">'+a[e.class].label+"</span>":""))}function at(t,e,s){if(!e.selected){d(t.ele).attr("fill",e.style.fill).attr("fill-opacity",e.style.fillopacity).attr("stroke",e.style.stroke)}s.hide()}function it(t,e,s){const n=f({x:t.clientX+30,y:t.clientY-30});n.header.text((s.gene?s.gene:"No gene")+" "+(s.mname?s.mname:""));var a=[];for(let t=0;t<e.length;t++){a.push({k:e[t],v:s[e[t]]})}u(n.body,a)}function rt(t,e){const s=t.pairs[e];if(s.shown){s.shown=false;s.holder.remove();if(s.handle){s.handle.attr("font-weight","normal")}}else{s.shown=true;if(s.holder){t.showholder.node().appendChild(s.holder.node())}else{s.holder=st(t.showholder,s)}if(s.handle){s.handle.attr("font-weight","bold")}}}function lt(t,e){const s=[];for(const e in t.pairs){s.push([e,t.pairs[e].mlst.length])}e.selectAll("*").remove();const n=e.append("div").style("margin-bottom","5px");n.append("span").text(s.length+" individual"+(s.length>1?"s":""));const a=e.append("svg");const i=5,p=20,h=t.rowh;let d=0;for(const t of s){a.append("text").text(t[0]).attr("font-size",h).attr("font-family",r).each((function(){d=Math.max(d,this.getBBox().width)})).remove()}a.attr("width",d+i+t.peoplewidth+30).attr("height",p+i+h*s.length);s.sort(((t,e)=>e[1]-t[1]));let f=0;for(const e in t.pairs){f=Math.max(f,t.pairs[e].mlst.length)}const u=a.append("g").attr("transform","translate("+(d+i)+","+p+")").call(m().scale(l().domain([0,f]).range([0,t.peoplewidth])).tickFormat(o("d")).ticks(3));c({axis:u,showline:true,color:"black"});const y=t.peoplewidth/f;let g=p+i;for(const e of s){const s=e[0];t.pairs[s].handle=a.append("text").text(s).attr("class","sja_svgtext2").attr("font-size",h-2).attr("font-family",r).attr("x",d).attr("y",g+i+h/2).attr("text-anchor","end").on("click",(()=>{rt(t,s)}));let n=0,l=0,o=0;for(const e of t.pairs[s].mlst){if(e.set_1)n++;else if(e.set_2)l++;else if(e.set_share)o++}const c=a.append("g").attr("transform","translate("+(d+i)+","+g+")");if(n>0){c.append("rect").attr("width",y*n).attr("height",h-1).attr("fill",t.color1)}if(o>0){c.append("rect").attr("x",y*n).attr("width",y*o).attr("height",h-1).attr("fill",t.colorshare)}if(l>0){c.append("rect").attr("x",y*(n+o)).attr("width",y*l).attr("height",h-1).attr("fill",t.color2)}g+=h}}export{$ as d2mafparseinput,Q as d2mafui};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as t}from"./tslib.es6-c3c2d88f.js";import{M as e,k as s,a as i,t as a,d as n,b as o,n as r,u as p,g as l,c as d,f as c,e as h,h as m,r as u,i as y,j as b,l as f,m as g,o as w}from"./app-b369b169.js";import{o as v,m as x}from"./adSandbox-f438e388.js";import"./genesearch-a4e19f0d.js";import"./toggleButtons-dbdbad01.js";class k{constructor(t){this.holder=t.holder;this.input=t.holder.append("input");this.tip=t.tip||new e({border:"",padding:"0px"});this.style=t.style||{};this.size=t.size||20;this.placeholder=t.placeholder||"";this.title=t.title||"";this.searchItems=t.searchItems;this.app=t.app}initUI(){this.holder.style("padding","padding"in this.style?this.style.padding:"5px").style("display","inline-block");this.input.attr("class","sjpp-input-search").style("border","border"in this.style?this.style.border:"5px").attr("size",this.size).attr("placeholder",this.placeholder).attr("aria-label",this.title).on("keyup",(e=>t(this,void 0,void 0,(function*(){if(s(e))yield this.enterSearch();i.debounce(this.addSearchItems(),400)}))))}addSearchItems(){return t(this,void 0,void 0,(function*(){if(!this.input.property("value").trim()){this.tip.hide();return}try{this.tip.clear().showunder(this.input.node());const t=this.tip.d.append("div");const e=yield this.searchItems();yield t.append("div").style("display","flex").selectAll().data(e.filter((t=>{var e;return((e=t.items)===null||e===void 0?void 0:e.length)>=1}))).enter().append("div").style("display","block").style("border-left","0.5px solid lightgrey").each(this.showResultsList)}catch(t){if(t.stack)console.error(t.stack);else a(t)}}))}showResultsList(e){return t(this,void 0,void 0,(function*(){e.wrapper=n(this);e.wrapper.style("padding","5px");e.titleDiv=e.wrapper.append("span").style("padding","3px 0px 5px").style("opacity",.65).style("font-size","0.8em").text(e.title);yield e.wrapper.append("div").classed("sjpp-result-wrapper",true).selectAll("div").data(e.items).enter().append("div").classed("sja_menuoption",true).classed("sjpp-search-result",true).style("display","block").style("padding-left","10px").style("background-color",e.color||"").text((t=>t.name||t.label||t.title||t)).on("click",((t,s)=>{t.stopPropagation();e.callback(s)}))}))}enterSearch(){return t(this,void 0,void 0,(function*(){if(!this.input.property("value").trim())return;const t=this.tip.d.select(".sjpp-result-wrapper").node();const e=this.tip.d.select(".sjpp-search-result").node();if(e!=null&&e.__data__)t.__data__.callback(e.__data__);else{const t=yield this.searchItems();const e=t.filter((t=>t.default));e[0].callback(this.input.property("value"))}this.input.property("value","");this.tip.hide()}))}updatePlaceholder(t){this.input.attr("placeholder",t)}}async function _(t,e,s,i,a){const o=n("input").property("value").trim();const r=[{title:"Genes",default:true,items:await P(o,t.selectgenome.property("value"),a),color:"#F2F2F2",callback:s=>{t.drawer.dispatch({type:"is_apps_btn_active",value:false});e.hide();B(s,t,t.selectgenome.property("value"),a)}}];await j(t,o,r,e);r.push({title:"Help",default:false,items:s.filter((t=>t.label.toLowerCase().includes(o.toLowerCase()))),color:"#faebd9",callback:t=>{window.open(t.link,t.label)}});r.push({title:"Publications",default:false,items:i.filter((t=>t.title.toLowerCase().includes(o.toLowerCase())||t.appHeaderTitle.toLowerCase().includes(o.toLowerCase()))),color:"#E6E6FA",callback:t=>{window.open(t.doi,t.title)}});return r}async function j(t,e,s,i){const n=await o(t.cardsPath+"/index.json");if(n.error)a(`Problem retrieving ../cards/index.json`);const r=e.toLowerCase().trim();const p=[...n.elements];let l;if(r.length>2){await A(p,t);l=$(p,r)}else{l=$(p,r)}const d={app:t.drawer.opts,sandboxDiv:t.drawer.opts.sandboxDiv,genomes:t.genomes,fromApp:true};s.push({title:"Tracks and Apps",items:l.filter((t=>t.type=="card")),color:"#e1edf7",callback:e=>{t.drawer.dispatch({type:"is_apps_btn_active",value:false});i.hide();v(e,d)}},{title:"Datasets",items:l.filter((t=>t.type=="dsButton")),color:"#e5f5e4",callback:e=>{t.drawer.dispatch({type:"is_apps_btn_active",value:false});i.hide();v(e,d)}});return s}async function A(t,e){const s=t.map((async t=>{if(t.hidden||t.type!="card"||!t.sandboxJson)return t;const s=await o(e.cardsPath+`/${t.sandboxJson}.json`);if(s?.ppcalls.length>0){for(const e of s.ppcalls){if(e.isUI)return;if(e?.label)t.searchterms.push(e.label)}}}));await Promise.all(s)}function $(t,e){return t.filter((t=>{if(t.hidden)return false;let s=(t.searchterms||[]).reduce(((t,s)=>{if(t)return true;return s.toLowerCase().includes(e)}),false);return s||t.name.toLowerCase().includes(e)})).sort(((t,e)=>t.name.localeCompare(e.name)))}async function P(t,e,s){if(t.length==0)return;try{const i=await o("/genelookup",{body:{input:t,genome:e,jwt:s}});if(i.error)throw i.error;if(!i.hits)throw".hits[] missing";return i.hits}catch(t){}}async function B(t,e,s,i){const a=e.genomes[s];if(!a){console.error("unknown genome "+s);return}const n=r(e.drawer.opts.sandboxDiv);n.header.html('<div style="display:inline-block;">'+t+'</div><div class="sjpp-output-sandbox-title">'+s+"</div>");const o=p();const m=await l(o,a);const u=d(t,a);if(u){const t={hostURL:e.hostURL,jwt:i,holder:n.body,genome:a,nobox:true,chr:u.chr,start:u.start,stop:u.stop,dogtag:s,tklst:m,debugmode:e.debugmode};c(a,t.tklst);import("./block-6aedd569.js").then((function(t){return t.c})).then((e=>new e.Block(t))).catch((t=>{e.error0(t)}));return}const y={hostURL:e.hostURL,jwt:i,query:t,genome:a,holder:n.body,variantPageCall_snv:e.variantPageCall_snv,samplecart:e.samplecart,tklst:m,debugmode:e.debugmode};const b=sessionStorage.getItem("urlp_mds");if(b){const t=b.split(",");if(t.length==2){y.datasetqueries=[{dataset:t[0],querykey:t[1]}]}}await h(y)}class D{constructor(t){this.type="card";this.opts=this.validateOpts(t);this.holder=t.holder;this.dom=t.dom;this.sandboxDiv=t.sandboxDiv;S(this)}validateOpts(t){if(!t.element.name)throw`Card .name is missing`;if(t.element.type=="card"){if(!t.element.sandboxJson&&!t.element.sandboxHtml)throw`Either .sandboxJson or .sandboxHtml is missing for card=${t.element.name}`}if(t.element.type=="nestedCard"){if(!t.element.children||t.element.children.length==0)throw`Missing .children for nested card = ${t.element.name}`}if(t.element.ribbon){if(!t.element.ribbon.text)throw`Missing ribbon .text for ${t.element.type} = ${t.element.name}`;if((t.element.ribbon.text.toUpperCase()=="NEW"||t.element.ribbon.text.toUpperCase()=="UPDATED")&&!t.element.ribbon.expireDate)throw`${t.element.type} = ${t.element.name} ribbon is ${t.element.ribbon.text.toUpperCase()} but .expireDate is missing. Please provide`;if(t.element.ribbon.expireDate){if(t.element.ribbon.expireDate>=0){throw`Flag for ${t.element.type} = ${t.element.name} is not a valid date`}}}return t}main(){}}const L=m(D);function S(t){const e=t.holder.append("li");if(t.opts.element.type=="card"){e.classed("sjpp-track",true).html(`<div class="sjpp-track-h"><span style="font-size:14.5px;font-weight:500;">${t.opts.element.name}</span></div>\n\t\t\t\t${t.opts.element.description?`<span class="sjpp-track-blurb" style="cursor:default">${t.opts.element.description}</span></div>`:" "}\n\t\t\t\t<span class="sjpp-track-image"><img src="${t.opts.element.image}" alt="${t.opts.element.description}"></img></span>\n\t\t\t\t</div>`)}else if(t.opts.element.type=="nestedCard"){e.classed("sjpp-app-drawer-card",true).html(`<p style="margin-left: 12px; font-size:14.5px;font-weight:500; display: block;">${t.opts.element.name}</p>\n\t\t\t<p style="display: block; font-size: 13px; font-weight: 300; margin-left: 20px; justify-content: center; font-style:oblique; color: #403f3f;">${t.opts.element.description}</p>`)}t.makeRibbon=function(t){const s=e.append("div").classed("sjpp-app-drawer-card-ribbon",true).style("align-items","center").style("justify-content","center");const i=t.text.toUpperCase();const a=i=="BETA"?"#418cb5":i=="NEW"?"#1ba176":i=="UPDATED"?"orange":t.color?t.color:"red";s.append("span").text(i).style("color","white").style("background-color",u(a).darker()).style("height","auto").style("width","100%").style("top","15%").style("left","-30%").style("font-size","11.5px").style("text-transform","uppercase").style("text-align","center")};if(t.opts.element.ribbon){const e=new Date;const s=new Date(t.opts.element.ribbon.expireDate);if(s>e||s=="Invalid Date")t.makeRibbon(t.opts.element.ribbon)}e.on("click",(async e=>{e.stopPropagation();await t.app.dispatch({type:"is_apps_btn_active",value:false});T(t);await v(t.opts.element,t.opts)}))}class R{constructor(t){this.type="button";this.opts=this.validateOpts(t);this.holder=t.holder;this.dom=t.dom;this.sandboxDiv=t.sandboxDiv;z(this)}validateOpts(t){if(!t.element.name)throw`Button name is missing`;if(!t.element.sandboxJson&&!t.element.sandboxHtml)throw`Either .sandboxJson or .sandboxHtml is missing for button=${t.element.name}`;return t}main(){}}const C=y(R);function z(t){const e=x({div:t.holder,text:t.opts.element.name,margin:"20px 20px 0px"});e.attr("class","sjpp-appdrawer-dataset-btn").on("click",(async e=>{e.stopPropagation();await t.app.dispatch({type:"is_apps_btn_active",value:false});T(t);await v(t.opts.element,t.opts)}))}class I{constructor(t){this.type="layout";this.dom={holder:t.dom.drawerDiv,wrapper:t.dom.wrapper,sandboxDiv:t.dom.sandboxDiv};this.state=t.state;this.hasStatePreMain=true}async validateIndexJson(){const t=await this.getIndexJson();if(!t.elements)throw`Missing elements array`;if(!t.elements.length)throw`No element objects provided`;if(t.columnsLayout){if(t.columnsLayout.length==0)throw`Missing column objects`;const e=t.columnsLayout.map((t=>t.gridarea));if(e.length!=new Set(e).size)throw`Duplicate values for .gridarea found`;const s=[];for(const e of t.columnsLayout){if(!e.gridarea)throw`Missing column .gridarea for column = ${e.name}`;if(!e.sections||e.sections.length==0)throw`Missing section objects for column = ${e.name}`;for(const t of e.sections){if(!t.id)throw`Missing section .id in ${t.name?`section = ${t.name}`:`column = ${e.name} array`}`;s.push(t.id)}if(e.sections.length!=new Set(e.sections).size){throw`Non-unique levels in line ${lineNum}: ${JSON.stringify(levelNames)}`}}if(s.length!=new Set(s).size)throw`Duplicate values for section.id found`;for(const e of t.elements){if(!e.section)throw`.section is missing for ${e.type} = ${e.name}`;if(!s.some((t=>t==e.section)))throw`section = ${e.section} for ${e.type} = ${e.name} is not a column section`}}return t}async getIndexJson(){const t=await o(this.app.cardsPath+"/index.json");if(t.error){b(this.dom.holder.append("div"),t.error);return}return t}validateElements(){const t=JSON.parse(sessionStorage.getItem("optionalFeatures"))||{};this.elements=this.index.elements.filter((e=>!e.hidden&&(!e.configFeature||t[e.configFeature])))}async init(){this.index=await this.validateIndexJson();this.elementsRendered=false;U(this);this.validateElements();this.layout=this.index.columnsLayout?this.index.columnsLayout:null;this.components={elements:[]}}async main(){if(this.elementsRendered==true)return;this.elementsRendered=true;for(const t of this.elements){const e=n(this.layout?`#${t.section} > .sjpp-element-list`:`.sjpp-element-list`);if(t.type=="card"||t.type=="nestedCard"){this.components.elements.push(await L({app:this.app,holder:e.style("display","grid").style("grid-template-columns","repeat(auto-fit, minmax(320px, 1fr))").style("gap","10px").style("list-style","none").style("margin","15px 0px"),element:t,dom:this.opts.dom,state:this.state,sandboxDiv:this.dom.sandboxDiv}))}else if(t.type=="dsButton"){this.components.elements.push(await C({app:this.app,holder:e,element:t,dom:this.opts.dom,state:this.state,sandboxDiv:this.dom.sandboxDiv}))}}}}const H=m(I);function U(t){if(!t.index.columnsLayout)F(t);if(t.index.columnsLayout)O(t)}function F(t){const e=t.dom.wrapper.append("div").style("display","flex").style("padding","10px").classed("sjpp-element-list",true);return e}function O(t){const e=t.dom.wrapper.append("div").style("display","grid").style("grid-template-columns","repeat(auto-fit, minmax(425px, 1fr))").style("gap","10px").style("padding","10px").style("text-align","left");const s=[];for(const e of t.index.columnsLayout)s.push(e.gridarea);e.style("grid-template-areas",`"${s.toString().replace(","," ")}"`);for(const s of t.index.columnsLayout){const t=e.append("div").style("grid-area",s.gridarea).classed(".sjpp-track-cols",true);for(const e of s.sections)i(e,t)}function i(t,e){const s=e.append("div").attr("id",t.id);if(t.name)s.append("h5").classed("sjpp-appdrawer-cols",true).style("color",u(f).darker()).text(t.name);s.append("div").classed("sjpp-element-list",true).style("padding","10px");return s}}class E{constructor(t){this.type="mainBtn";this.opts=this.validateOpts(t);this.dom=t.dom;this.state=t.state;this.hasStatePreMain=true;N(this)}validateOpts(t){return t.app.opts}getState(t){return{appBtnActive:t.appBtnActive}}async init(){this.btnRendered=false;this.drawerFullHeight="";try{if(window.location.pathname=="/"&&!window.location.search.length)await this.app.dispatch({type:"is_apps_btn_active",value:true});this.components={layout:[]}}catch(t){throw t}}async main(t){if(this.app.getState(t).appBtnActive==true&&this.btnRendered==false){this.dom.drawerDiv.style("background-color","#f5f5f5");this.components.layout.push(await H({app:this.app,dom:this.dom,state:this.state}));setTimeout((()=>{this.drawerFullHeight=this.dom.drawerDiv.node().getBoundingClientRect().height+5}),this.state.duration+5);T(this);this.btnRendered=true}if(this.state.appBtnActive==false&&this.btnRendered==true)T(this)}}const J=m(E);function N(t){t.dom.btnWrapper.style("background-color",t.state.appBtnActive?"#b2b2b2":"#f2f2f2").style("color",t.state.appBtnActive?"#fff":"#000").on("click",(async e=>{e.stopPropagation();await t.app.dispatch({type:"is_apps_btn_active"});T(t);if(t.state.appBtnActive){setTimeout((()=>{t.drawerFullHeight=t.dom.drawerDiv.node().getBoundingClientRect().height+5}),t.state.duration+5)}}));t.dom.btn.attr("class","sja_menuoption").style("display","inline-block").style("background-color","transparent").style("color",t.state.appBtnActive?"#fff":"#000").style("padding",t.opts.padw_sm).style("margin","0px 5px").style("cursor","pointer").text("Apps");t.dom.drawerHint.style("position","relative").style("display","inline-block").style("height",t.state.arrowSize.closed+"px").style("width",t.state.appBtnActive?t.state.hintWidth.open:t.state.hintWidth.closed).style("background-color","transparent").style("text-align","center").style("cursor","pointer");t.dom.drawerArrow.style("position","absolute").style("font-size",t.state.arrowSize.closed+"px").style("right",t.state.hintPos.closed.rt+"px").style("bottom",t.state.hintPos.closed.btm+"px").style("background-color","transparent").style("color",t.state.arrowColor.closed).style("opacity",t.state.appBtnActive?0:1).style("cursor","pointer").html("▼");t.dom.drawerArrowOpen.style("position","absolute").style("font-size",t.state.arrowSize.open+"px").style("left",t.state.hintPos.open.left+"px").style("bottom",t.state.hintPos.open.btm+"px").style("transform","rotate(180deg)").style("background-color","transparent").style("color",t.state.arrowColor.open).style("opacity",t.state.appBtnActive?1:0).style("cursor","pointer").style("pointer-events",t.state.appBtnActive?"auto":"none").html("▼");t.drawerFullHeight=t.dom.drawerRow.node().getBoundingClientRect().height+5}async function T(t){t.dom.btnWrapper.transition().duration(t.opts.state.duration).style("background-color",t.state.appBtnActive?"#b2b2b2":"#f2f2f2").style("color",t.state.appBtnActive?"#fff":"#000");t.dom.btn.transition().duration(t.opts.state.duration).style("color",t.state.appBtnActive?"#fff":"#000");t.dom.drawerDiv.style("display","inline-block").transition().duration(t.opts.state.duration).style("top",t.state.appBtnActive?"0px":"-"+t.drawerFullHeight+"px");t.dom.drawerRow.transition().duration(t.opts.state.duration).style("height",t.state.appBtnActive?t.drawerFullHeight+"px":"0px");t.dom.drawerHint.transition().duration(t.opts.state.duration).style("width",t.state.appBtnActive?t.opts.state.hintWidth.open:t.opts.state.hintWidth.closed);t.dom.drawerArrow.transition().duration(t.opts.state.duration).style("opacity",t.state.appBtnActive?0:1);t.dom.drawerArrowOpen.style("pointer-events",t.state.appBtnActive?"auto":"none").transition().duration(t.opts.state.duration).style("opacity",t.state.appBtnActive?1:0)}class W{constructor(t){this.type="store";this.defaultState={duration:500,hintPos:{open:{btm:-42,left:13},closed:{btm:3,rt:5}},hintWidth:{open:"0px",closed:"18px"},arrowSize:{open:42,closed:20},arrowColor:{open:"rgb(242,242,242)",closed:"rgb(85,85,85)"},appBtnActive:false}}async init(){}}const M=g(W);W.prototype.actions={is_apps_btn_active(t){this.state.appBtnActive="value"in t?t.value:!this.state.appBtnActive}};class q{constructor(t){this.type="app";const e=t.drawerRow.append("div").style("position","relative").style("margin","0 20px").style("padding",`0 ${t.padw_sm}`).style("display","inline-block").style("overflow","hidden").style("border-radius","0px 0px 5px 5px").style("width","93vw").classed("sjpp-drawer-div",true);const s=t.headbox.append("div").style("position","relative").style("display","inline-block").style("margin-left","5px").style("margin-right","5px").style("border-radius","5px").classed("sjpp-apps-btn-wrapper",true);this.dom={drawerRow:t.drawerRow,drawerDiv:e,sandboxDiv:t.sandboxDiv,btnWrapper:s,btn:s.append("div"),drawerHint:s.append("div"),drawerArrow:s.append("div"),drawerArrowOpen:s.append("div"),wrapper:e.append("div")}}preApiFreeze(t){t.cardsPath=this.opts.cardsPath}async init(){try{this.store=await M({app:this.api,state:this.opts.state});this.state=await this.store.copyState();this.components={mainBtn:await J({app:this.api,dom:this.dom,state:this.state,indexJson:this.indexJson})};await this.api.dispatch()}catch(t){throw t}}main(){}}const G=w(q);class K{constructor(t){this.headtip=t.headtip;this.app=t.app;this.data=t.data;this.jwt=t.jwt;this.publications=[]}createPublicationsList(){var e;return t(this,void 0,void 0,(function*(){const t=yield o(this.app.cardsPath+"/citations.json");if(t.error)console.error(`Problem retrieving ../cards/citations.json`);this.publications=((e=t===null||t===void 0?void 0:t.publications)===null||e===void 0?void 0:e.length)?t.publications.filter((t=>t.appHeaderTitle)).sort(((t,e)=>e.year-t.year)):[]}))}makeheader(){return t(this,void 0,void 0,(function*(){yield this.createPublicationsList();const e=u(f);const s="13px";const i="5px 10px";const a="7px 10px";const n=document.documentElement.clientWidth;const r=this.app.holder.append("div").style("white-space","nowrap").style("border-bottom",n>1600?"solid 1px rgba("+e.r+","+e.g+","+e.b+",.3)":"");const p=r.append("div").style("margin","10px").style("padding","8px").style("padding-bottom","12px").style("display",n<1600?"block":"inline-block").style("border-bottom",n<1600?"solid 1px rgba("+e.r+","+e.g+","+e.b+",.3)":"");const l=r.append("div").style("display","inline-block").style("padding",a).style("padding-left","25px").style("font-size",".8em").style("color",u(f).darker());{const e=l.append("div").style("padding-left","15px");e.attr("id","sjpp-serverstat").append("span").text("Code updated: "+(this.data.codedate||"??")+", server launched: "+(this.data.launchdate||"??")+".");if(this.data.hasblat){e.append("a").style("margin-left","10px").text("Running BLAT").on("click",(e=>t(this,void 0,void 0,(function*(){this.headtip.clear().showunder(e.target);const t=this.headtip.d.append("div").style("margin","10px");const s=t.append("div").text("Loading...");try{const e=yield o("blat?serverstat=1");if(e.error)throw e.error;if(!e.lst)throw"invalid response";s.remove();for(const s of e.lst){t.append("div").text(s)}}catch(t){s.text(t.message||t);if(t.stack)console.error(t.stack)}}))))}}if(this.data.headermessage){l.append("div").html(this.data.headermessage)}p.append("div").text("ProteinPaint").style("display","inline-block").style("padding",s).style("color",f).style("font-size","1.3em").style("font-weight","bold");const d=new k({holder:p,tip:this.headtip,style:{padding:a,border:`'solid 1px ${f}`},size:32,placeholder:"Gene, position, SNP, app, or dataset",title:"Search by gene, SNP, position, app, or dataset",searchItems:()=>t(this,void 0,void 0,(function*(){return yield _(this.app,this.headtip,K.help,this.publications,this.jwt)}))});d.initUI();const c=p.append("div").attr("class","sjpp-genome-select-div").style("padding",a);const h=()=>{const t=this.app.genomes[this.app.selectgenome.property("value")];const e=["Gene","position","app"];if(t.hasSNP)e.splice(2,0,"SNP");if(Object.keys(t.datasets).length)e.push("dataset");const s=e.join(", ").replace(/,(?=[^,]*$)/,", or");return s};this.app.selectgenome=c.append("select").attr("aria-label","Select a genome").attr("class","sjpp-genome-select").style("padding",i).style("border","solid 1px "+f).on("change",(()=>{this.update_genome_browser_btn(this.app);d.updatePlaceholder(h())}));const m=Object.values(this.app.genomes).filter((t=>!t.hideOnClient));for(const t of m){this.app.selectgenome.append("option").attr("n",t.name).text(`${t.species} ${t.name}`).property("value",t.name)}this.app.genome_browser_btn=this.make_genome_browser_btn(this.app,p,this.jwt);this.app.drawer=yield G({holder:this.app.holder,genomes:this.app.genomes,drawerRow:this.app.holder.append("div").style("position","relative").style("overflow-x","visible").style("overflow-y","hidden").classed("sjpp-drawer-row",true),sandboxDiv:this.app.holder.append("div").style("margin-top","15px").classed("sjpp-drawer-sandbox",true),genome_browser_btn:this.app.genome_browser_btn,debugmode:this.app.debugmode,headbox:p,padw_sm:a,cardsPath:this.app.cardsPath});p.append("span").classed("sja_menuoption",true).attr("id","sjpp-header-help-btn").style("padding",a).text("Help").on("click",(e=>t(this,void 0,void 0,(function*(){const t=e.target.getBoundingClientRect();const s=this.headtip.clear().show(t.left-0,t.top+t.height+5);yield s.d.append("div").style("padding","5px 20px").selectAll("p").data(K.help.filter((t=>!t.onlySearch))).enter().append("p").html((t=>`<a href=${t.link} target=_blank>${t.label}</a>`))}))));if(this.publications.length>0){p.append("span").classed("sja_menuoption",true).attr("id","sjpp-header-publications-btn").style("padding",a).style("margin","0px 5px").text("Publications").on("click",(e=>t(this,void 0,void 0,(function*(){const t=e.target.getBoundingClientRect();const s=this.headtip.clear().show(t.left-150,t.top+t.height+5);yield s.d.append("div").style("padding","5px 20px").selectAll("p").data(this.publications).enter().append("p").html((t=>`<a href=${t.doi} target=_blank>${t.appHeaderTitle}, ${t.journal}, ${t.year}</a>`))}))))}}))}make_genome_browser_btn(t,e,s){if(t.selectgenome.node().options.length===0){console.error(`No selected selectgenome options.`);return}const i="8px";const a=e.append("span");const n=t.selectgenome.node().options[t.selectgenome.property("selectedIndex")].value;const o=a.attr("class","sja_menuoption").attr("id","genome_btn").style("padding",i).datum(n).text(n+" genome browser").on("click",(()=>{const e=t.selectgenome.node().value;const i=t.genomes[e];if(!i){alert("Invalid genome name: "+e);return}const a=r(t.drawer.opts.sandboxDiv);a.header.text(e+" genome browser");const n={hostURL:t.hostURL,jwt:s,holder:a.body,genome:i,chr:i.defaultcoord.chr,start:i.defaultcoord.start,stop:i.defaultcoord.stop,nobox:true,tklst:[],debugmode:t.debugmode};c(i,n.tklst);import("./block-6aedd569.js").then((function(t){return t.c})).then((t=>new t.Block(n)));t.drawer.dispatch({type:"is_apps_btn_active",value:false})}));return o}update_genome_browser_btn(t){t.genome_browser_btn.text(t.selectgenome.node().value+" genome browser");t.genome_browser_btn.datum(t.selectgenome.node().value)}}K.help=[{label:"Embed in your website",link:"https://github.com/stjude/proteinpaint/wiki/Embedding"},{label:"URL parameters",link:"https://github.com/stjude/proteinpaint/wiki/URL-parameters"},{label:"All tutorials",link:"https://github.com/stjude/proteinpaint/wiki/"},{label:"User community",link:"https://groups.google.com/g/proteinpaint"},{label:"License ProteinPaint",link:"https://www.stjude.org/research/why-st-jude/shared-resources/technology-licensing/technologies/proteinpaint-web-application-for-visualizing-genomic-data-sj-15-0021.html",onlySearch:true},{label:"Our Team",link:"https://proteinpaint.stjude.org/team/",onlySearch:true}];export{K as AppHeader};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as t}from"./axisstyle-fac7f76b.js";import{I as a,ah as s}from"./app-
|
|
1
|
+
import{a as t}from"./axisstyle-fac7f76b.js";import{I as a,ah as s}from"./app-b369b169.js";import{c as i,a as r}from"./axis-747c801e.js";class e{constructor(t){this.barheight=t.barheight||14;this.barwidth=t.barwidth||100;this.startColor=t.startColor||"white";this.midColor=t.midColor||"white";this.endColor=t.endColor||"red";this.data=t.data;this.position=t.position||"0,0";this.svg={width:t.width||100,height:t.height||30};this.topTicks=t.topTicks||false;this.ticks=t.ticks||5;this.tickSize=t.tickSize||1;this.fontSize=t.fontSize||10;this.markedValue=t.markedValue&&t.markedValue>.001?t.markedValue:null;if(!t.holder)throw new Error("No holder provided for color scale.");if(!t.data)throw new Error("No data provided for color scale.");this.formatData();const a=t.holder.append("svg").attr("data-testid","sjpp-color-scale").attr("width",this.svg.width).attr("height",this.svg.height);const s=a.append("g").attr("transform",`translate(${this.position})`);const i=Math.random().toString();if(this.topTicks===true){const{scale:t,scaleAxis:a}=this.makeAxis(s,i);const{gradientStart:r,gradientMid:e,gradientEnd:o}=this.makeColorBar(s,i);this.dom={scale:t,scaleAxis:a,gradientStart:r,gradientMid:e,gradientEnd:o}}else{const{gradientStart:t,gradientMid:a,gradientEnd:r}=this.makeColorBar(s,i);const{scale:e,scaleAxis:o}=this.makeAxis(s,i);this.dom={scale:e,scaleAxis:o,gradientStart:t,gradientMid:a,gradientEnd:r};if(this.markedValue!==null)this.markedValueInColorBar(s)}}formatData(){this.data=this.data.map((t=>Number(t.toFixed(2))))}makeColorBar(t,a){const s=t.append("defs");const i=s.append("linearGradient").attr("data-testid","sjpp-color-scale-bar").attr("id",a);const r=i.append("stop").attr("offset","0%").attr("stop-color",this.startColor);const e=i.append("stop").attr("offset","100%").attr("stop-color",this.midColor);const o=i.append("stop").attr("offset","100%").attr("stop-color",this.endColor);return{gradientStart:r,gradientMid:e,gradientEnd:o}}makeAxis(t,s){t.append("rect").attr("height",this.barheight).attr("width",this.barwidth).attr("fill","url(#"+s+")");const i=t.append("g").attr("data-testid","sjpp-color-scale-axis");if(this.topTicks===false)i.attr("transform",`translate(0, ${this.barheight+2})`);const r=a().domain(this.data).range([0,this.barwidth]);return{scale:r,scaleAxis:i}}markedValueInColorBar(t){if(!this.markedValue||this.topTicks==true)return;this.dom.line=t.append("line").classed("sjpp-color-scale-marked",true).attr("data-testid","sjpp-color-scale-marked-tick").attr("y1",this.barheight-2).attr("y2",this.barheight+1).attr("stroke","black");this.dom.label=t.append("text").classed("sjpp-color-scale-marked",true).attr("data-testid","sjpp-color-scale-marked-label").attr("text-anchor","middle").attr("font-family",s).attr("font-size",this.fontSize).attr("y",this.barheight-3);this.updateValueInColorBar()}render(){const a=this.getAxis();t({axis:this.dom.scaleAxis.call(a),showline:false,fontsize:this.fontSize})}getAxis(){const t=this.topTicks===true?i(this.dom.scale):r(this.dom.scale);t.ticks(this.ticks).tickSize(this.tickSize);return t}setAxis(t){if(this.topTicks===true){return i(this.dom.scale).tickValues(t).tickSize(this.tickSize)}else{return r(this.dom.scale).tickValues(t).tickSize(this.tickSize)}}updateColors(){this.dom.gradientStart.attr("stop-color",this.startColor);this.dom.gradientMid.attr("stop-color",this.midColor);this.dom.gradientEnd.attr("stop-color",this.endColor)}updateAxis(){this.formatData();const t=this.data[0];const s=this.data[this.data.length-1];const i=[t,s];this.dom.scaleAxis.selectAll("*").remove();if(t<0&&s>0){i.splice(this.data.length/2,0,0);this.dom.scale=a().domain(i).range([0,this.barwidth/2,this.barwidth]);this.dom.gradientStart.attr("offset","0%").attr("stop-color",this.startColor);this.dom.gradientMid.attr("offset","50%").attr("stop-color",this.midColor);this.dom.gradientEnd.attr("offset","100%").attr("stop-color",this.endColor)}else{this.dom.scale=a().domain(i).range([0,this.barwidth]);this.dom.gradientStart.attr("offset","0%").attr("stop-color",this.startColor);this.dom.gradientMid.attr("offset",t>=0?"0%":"100%").attr("stop-color",t>=0?this.startColor:this.endColor);this.dom.gradientEnd.attr("offset","100%").attr("stop-color",this.endColor)}this.dom.scaleAxis.transition().duration(500).call(this.setAxis(i))}updateValueInColorBar(){if(!this.markedValue||this.topTicks==true)return;if(!this.dom.line||!this.dom.label)throw new Error("Missing dom elements to update value in color bar.");const t=Math.min(this.barwidth,this.dom.scale(this.markedValue));this.dom.line.attr("x1",t).attr("x2",t);this.dom.label.attr("x",t).text(Math.floor(this.markedValue))}updateScale(){this.updateColors();this.updateAxis();this.updateValueInColorBar()}}export{e as C};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e}from"./axisstyle-fac7f76b.js";import{M as t,P as a,h as s,I as l,D as o,d as n,b as i}from"./app-b369b169.js";import{d as r,r as c}from"./table-29d5a973.js";import{controlsInit as d}from"./controls-287e6efa.js";import{b as p,a as g}from"./axis-747c801e.js";import"./tslib.es6-c3c2d88f.js";import"./controls.btns-79b805dd.js";import"./controls.config-28d6d6a8.js";import"./termsetting-33ea66f1.js";import"path";const u="#ffa200";const h=new t;class m{constructor(){this.type="DEanalysis"}async init(e){e.plots.find((e=>e.id===this.id));const t=this.opts.holder.append("div").style("display","inline-block");const a=this.opts.holder.append("div").style("display","inline-block").style("margin-left","50px");const s=a.append("div").style("display","inline-block");const l=a.append("div").style("display","inline-block").style("vertical-align","top").style("margin-top","50px");const o=this.opts.holder.append("div").style("margin-left","50px");this.dom={holder:s,header:this.opts.header,controlsDiv:t,detailsDiv:l,tableDiv:o}}async setControls(e){this.dom.controlsDiv.selectAll("*").remove();const t=[{label:"Minimum read count",type:"number",chartType:"DEanalysis",settingsKey:"min_count",title:"Relative cpm cutoff for filtering a gene compared to all samples and genes in dataset",min:0,max:1e4},{label:"Minimum total read count",type:"number",chartType:"DEanalysis",settingsKey:"min_total_count",title:"Minimum total read count required for each sample",min:0,max:1e4},{label:"P-value significance (linear scale)",type:"number",chartType:"DEanalysis",settingsKey:"pvalue",title:"P-value significance",min:0,max:1},{label:"Fold change (log scale)",type:"number",chartType:"DEanalysis",settingsKey:"foldchange",title:"Fold change",min:-10,max:10},{label:"P-value table",type:"checkbox",chartType:"DEanalysis",settingsKey:"pvaluetable",title:"Display table showing original and adjusted pvalues for all significant genes",boxLabel:""},{label:"P-value",type:"radio",chartType:"DEanalysis",settingsKey:"adjusted_original_pvalue",title:"Toggle between original and adjusted pvalues for volcano plot",options:[{label:"adjusted",value:"adjusted"},{label:"original",value:"original"}]}];if(e.mid_sample_size_cutoff>=e.sample_size1&&e.mid_sample_size_cutoff<e.sample_size2&&e.sample_size2<e.high_sample_size_cutoff||e.mid_sample_size_cutoff>=e.sample_size2&&e.mid_sample_size_cutoff<e.sample_size1&&e.sample_size1<e.high_sample_size_cutoff){t.push({label:"Method",type:"radio",chartType:"DEanalysis",settingsKey:"method",title:"Toggle between edgeR and wilcoxon test",options:[{label:"edgeR",value:"edgeR"},{label:"wilcoxon",value:"wilcoxon"}]});this.settings.method=e.method;this.state.config=e.method}if(this.app.opts.genome.termdbs){t.push({label:"Gene set overrepresentation analysis",type:"radio",chartType:"DEanalysis",settingsKey:"gene_ora",title:"Toggle between analyzing upregulated, downregulated or both genes",options:[{label:"upregulated",value:"upregulated"},{label:"downregulated",value:"downregulated"},{label:"both",value:"both"}]})}if(this.app.opts.genome.termdbs&&!this.settings.gsea){t.push({label:"Gene set enrichment analysis",type:"radio",chartType:"DEanalysis",settingsKey:"gsea",title:"Gene set enrichment analysis",options:[{label:"Submit",value:"Submit"}]})}if(this.settings.pvaluetable==true){t.push({label:"Hierarchial Clustering",type:"radio",chartType:"DEanalysis",settingsKey:"hierCluster",title:"Toggle between various methods for selecting genes for hierarchial clustering",options:[{label:"Top 100 genes",value:"top100"},{label:"Top 100 upregulated",value:"top100up"},{label:"Top 100 downregulated",value:"top100down"}]});this.settings.hierCluster="top100"}this.components={controls:await d({app:this.app,id:this.id,holder:this.dom.controlsDiv,inputs:t})};this.components.controls.on("downloadClick.DEanalysis",(()=>{r(this.table_rows,this.table_cols)}))}getState(e){const t=e.plots.find((e=>e.id===this.id));if(!t)throw`No plot with id='${this.id}' found`;return{config:t}}async main(){this.config=JSON.parse(JSON.stringify(this.state.config));this.settings=this.config.settings.DEanalysis;if(this.dom.detailsDiv){this.dom.detailsDiv.selectAll("*").remove()}if(this.dom.holder){this.dom.holder.selectAll("*").remove()}const e=this.dom.detailsDiv.append("div").text("Loading...");const t=await D(this);e.remove();t.mid_sample_size_cutoff=8;t.high_sample_size_cutoff=30;await this.setControls(t);this.dom.header.style("opacity",.6).style("padding-left","10px").style("font-size","0.75em").text("DIFFERENTIAL GENE EXPRESSION");f(this,t)}}async function f(t,a){const s=a.sample_size1;const n=a.sample_size2;const i=a.data;const r=t.dom.holder;r.selectAll("*").remove();t.dom.detailsDiv.selectAll("*").remove();let d=0,h=0,m=0,f=0;for(const e of i){d=Math.min(d,e.fold_change);h=Math.max(h,e.fold_change);if(e.adjusted_p_value==0){continue}else{m=Math.min(m,e.adjusted_p_value);f=Math.max(f,e.adjusted_p_value)}}let _,v,b,y,j,D,E=50,M=50,k;const z=r.append("svg");const T=z.append("g");const P=z.append("g");const A=z.append("text").text("log2(fold change)").attr("fill","black").attr("text-anchor","middle");const K=z.append("text").text("-log10(adjusted P value)").attr("fill","black").attr("text-anchor","middle");i.vo_dotarea=z.append("g");const R=i.vo_dotarea.append("rect").attr("stroke","#ededed").attr("fill","none").attr("shape-rendering","crispEdges");const S=l().domain([d,h]);const N=l().domain([m,f]);const C=i.vo_dotarea.selectAll().data(i).enter().append("g").each((function(e){e.vo_g=this}));const G=t.settings.foldchange;if(t.settings.pvalue==0)throw"p-value significance cannot be zero";const O=-Math.log10(t.settings.pvalue);const F=t.settings.adjusted_original_pvalue;let I=0;let L=0;t.table_rows=[];const H=C.append("circle").attr("stroke",(e=>{let a;if(F=="adjusted"&&e.adjusted_p_value>O&&Math.abs(e.fold_change)>G){a="red";I+=1;t.table_rows.push([{value:e.gene_name},{value:e.gene_symbol},{value:e.fold_change.toPrecision(4)},{value:Math.pow(10,-e.original_p_value).toPrecision(4)},{value:Math.pow(10,-e.adjusted_p_value).toPrecision(4)}])}else if(F=="original"&&e.original_p_value>O&&Math.abs(e.fold_change)>G){a="red";I+=1;t.table_rows.push([{value:e.gene_name},{value:e.gene_symbol},{value:e.fold_change},{value:Math.pow(10,-e.original_p_value)},{value:Math.pow(10,-e.adjusted_p_value)}])}else{a="black";L+=1}return a})).attr("stroke-opacity",.2).attr("stroke-width",1).attr("fill",u).attr("fill-opacity",0).each((function(e){e.vo_circle=this})).on("mouseover",w).on("mouseout",x);t.table_rows.sort(((e,t)=>e[2].value-t[2].value)).reverse();const J=i.vo_dotarea.append("line").attr("stroke","#ccc").attr("shape-rendering","crispEdges");function X(t,a){b=t;y=a;_=Math.max(50,b/8);v=Math.max(50,y/8);k=Math.max(b,y)/80;const s=k*3;H.each((e=>{e.vo_radius=k}));j=Math.max(s,b/50);D=Math.max(s,y/50);T.attr("transform","translate("+_+","+E+")");P.attr("transform","translate("+(_+j)+","+(E+y+D)+")");A.attr("x",_+j+b/2).attr("y",E+y+D+v-5);K.attr("transform","translate(15,"+(E+y/2)+") rotate(-90)");i.vo_dotarea.attr("transform","translate("+(_+j)+","+E+")");R.attr("width",b).attr("height",y);S.range([0,b]);N.range([y,0]);C.attr("transform",(e=>"translate("+S(e.fold_change)+","+N(e.adjusted_p_value)+")"));H.attr("r",(e=>e.vo_radius));J.attr("x1",S(0)).attr("x2",S(0)).attr("y2",y);z.attr("width",_+j+b+M).attr("height",E+y+D+v);e({axis:T.call(p().scale(N)),color:"black",showline:true});e({axis:P.call(g().scale(S)),color:"black",showline:true})}X(400,400);if(i[0].adjusted_p_value!=undefined){r.append("div").style("margin","20px");m=0;f=0;let l;for(const e of i){let t;if(F=="adjusted"){t=e.adjusted_p_value}else{t=e.original_p_value}if(t==0)continue;m=Math.min(m,t);f=Math.max(f,t)}N.domain([m,f]);e({axis:T.call(p().scale(N)),color:"black",showline:true});C.attr("transform",(e=>{let t;if(F=="adjusted"){t=e.adjusted_p_value}else{t=e.original_p_value}return"translate("+S(e.fold_change)+","+N(t)+")"}));if(F=="adjusted"){l="-log10(adjusted P value)"}else{l="-log10(original P value)"}K.text(l);const d=o({holder:t.dom.detailsDiv});const g=[{label:"Percentage of significant genes",value:(I*100/(I+L)).toPrecision(2)},{label:"Number of significant genes",value:I},{label:"Number of total genes",value:I+L},{label:"Group1 sample size",value:s},{label:"Group2 sample size",value:n}];for(const e of g){const[t,a]=d.addRow();t.text(e.label);a.style("text-align","end").text(e.value)}t.table_cols=[{label:"Gene Name"},{label:"Gene Symbol"},{label:"log2 Fold change"},{label:"Original p-value (linear scale)"},{label:"Adjusted p-value (linear scale)"}];if(t.settings.pvaluetable==true){const e=t.dom.tableDiv.append("div").html(`<br>DE analysis results`);c({columns:t.table_cols,rows:t.table_rows,div:e,showLines:true,maxHeight:"150vh",resize:true})}else{t.dom.tableDiv.selectAll("*").remove()}if(t.settings.gene_ora&&t.app.opts.genome.termdbs){const e=[];const s=[];if(t.settings.gene_ora=="upregulated"){for(const t of a.data){if(t.gene_symbol.length>0){if(G<Math.abs(t.fold_change)&&t.fold_change>0){e.push(t.gene_symbol)}s.push(t.gene_symbol)}}}else if(t.settings.gene_ora=="downregulated"){for(const t of a.data){if(t.gene_symbol.length>0){if(G<Math.abs(t.fold_change)&&t.fold_change<0){e.push(t.gene_symbol)}s.push(t.gene_symbol)}}}else if(t.settings.gene_ora=="both"){for(const t of a.data){if(t.gene_symbol.length>0){if(G<Math.abs(t.fold_change)){e.push(t.gene_symbol)}s.push(t.gene_symbol)}}}else{console.log("Unrecognized option")}const l={sample_genes:e.toString(),background_genes:s.toString(),genome:t.app.vocabApi.opts.state.vocab.genome};const o={chartType:"geneORA",geneORAparams:l};t.app.dispatch({type:"plot_create",config:o})}if(t.settings.gsea&&t.app.opts.genome.termdbs){const e={genes:a.data.map((e=>e.gene_symbol)),fold_change:a.data.map((e=>e.fold_change)),genome:t.app.vocabApi.opts.state.vocab.genome};const s={chartType:"gsea",gsea_params:e};t.app.dispatch({type:"plot_create",config:s})}}return z}async function _(e,t){try{if(e.samplelst.groups.length!=2)throw"opts.samplelst.groups[].length!=2";if(e.samplelst.groups[0].values?.length<1)throw"group 1 not having >1 samples";if(e.samplelst.groups[1].values?.length<1)throw"group 2 not having >1 samples";const t={settings:{DEanalysis:{pvalue:.05,foldchange:2,min_count:10,min_total_count:15,pvaluetable:false,adjusted_original_pvalue:"adjusted",method:undefined,gene_ora:undefined,gsea:undefined}}};return a(t,e)}catch(e){throw`${e} [DEanalysis getPlotConfig()]`}}const v=s(m);const b=v;function y(e,t){t.prepPlot({config:{chartType:"DEanalysis"}})}function w(e,t){h.clear().show(e.clientX,e.clientY);const a=[{k:"gene_name",v:t.gene_name},{k:"gene_symbol",v:t.gene_symbol},{k:"log fold change",v:t.fold_change.toPrecision(6)},{k:"log original p-value",v:t.original_p_value.toPrecision(6)},{k:"log adjusted p-value",v:t.adjusted_p_value.toPrecision(6)}];const s=o({holder:h.d});for(const e of a){const[t,a]=s.addRow();t.text(e.k);a.text(e.v)}if(!t.ma_label){n(t.ma_circle).attr("fill-opacity",.9);n(t.vo_circle).attr("fill-opacity",.9)}}function x(e,t){h.hide();if(!t.ma_label){n(t.ma_circle).attr("fill-opacity",0);n(t.vo_circle).attr("fill-opacity",0)}}async function j(e,t,a,s,l){e.term?e:{term:e};let o={chartType:"hierCluster",genes:["barchart",xxx]};if(s)o.insertBefore=s;if(l)o.id=l();await a.dispatch({type:"plot_create",config:o})}async function D(e){const t=await i("DEanalysis",{body:{genome:e.app.vocabApi.vocab.genome,dslabel:e.app.vocabApi.vocab.dslabel,samplelst:e.config.samplelst,min_count:e.settings.min_count,min_total_count:e.settings.min_total_count,method:e.settings.method}});if(t.error)console.log("server side error:",t.error);return t}export{v as DEanalysisInit,b as componentInit,_ as getPlotConfig,y as makeChartBtnMenu,j as openHiercluster};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as t}from"./tslib.es6-c3c2d88f.js";import{M as e,D as s,ak as n,at as i,as as a,ap as o,aq as r,z as l,I as c,d as h,P as d,h as p,K as u}from"./app-b369b169.js";import{d as g}from"./arc-3d6751aa.js";import{p as m,c as f}from"./constant-426a1483.js";import{s as v}from"./svg.legend-8d490df2.js";import{a as A,l as x}from"./line-264f8f9e.js";import{t as M}from"./math-2fb199c6.js";import{topBarInit as R}from"./controls.btns-79b805dd.js";import{configUiInit as b}from"./controls.config-28d6d6a8.js";import"./termsetting-33ea66f1.js";import"path";var C=Math.abs;var y=Math.cos;var w=Math.sin;var I=Math.PI;var L=I/2;var D=1e-12;var T=Array.prototype.slice;function P(t){return function(){return t}}function O(t){return t.source}function N(t){return t.target}function E(t){return t.radius}function V(t){return t.startAngle}function S(t){return t.endAngle}function z(){return 0}function B(t){var e=O,s=N,n=E,i=E,a=V,o=S,r=z,l=null;function c(){var c,h=e.apply(this,arguments),d=s.apply(this,arguments),p=r.apply(this,arguments)/2,u=T.call(arguments),g=+n.apply(this,(u[0]=h,u)),f=a.apply(this,u)-L,v=o.apply(this,u)-L,A=+i.apply(this,(u[0]=d,u)),x=a.apply(this,u)-L,M=o.apply(this,u)-L;if(!l)l=c=m();if(p>D){if(C(v-f)>p*2+D)v>f?(f+=p,v-=p):(f-=p,v+=p);else f=v=(f+v)/2;if(C(M-x)>p*2+D)M>x?(x+=p,M-=p):(x-=p,M+=p);else x=M=(x+M)/2}l.moveTo(g*y(f),g*w(f));l.arc(0,0,g,f,v);if(f!==x||v!==M){if(t){var R=+t.apply(this,arguments),b=A-R,I=(x+M)/2;l.quadraticCurveTo(0,0,b*y(x),b*w(x));l.lineTo(A*y(I),A*w(I));l.lineTo(b*y(M),b*w(M))}else{l.quadraticCurveTo(0,0,A*y(x),A*w(x));l.arc(0,0,A,x,M)}}l.quadraticCurveTo(0,0,g*y(f),g*w(f));l.closePath();if(c)return l=null,c+""||null}if(t)c.headRadius=function(e){return arguments.length?(t=typeof e==="function"?e:P(+e),c):t};c.radius=function(t){return arguments.length?(n=i=typeof t==="function"?t:P(+t),c):n};c.sourceRadius=function(t){return arguments.length?(n=typeof t==="function"?t:P(+t),c):n};c.targetRadius=function(t){return arguments.length?(i=typeof t==="function"?t:P(+t),c):i};c.startAngle=function(t){return arguments.length?(a=typeof t==="function"?t:P(+t),c):a};c.endAngle=function(t){return arguments.length?(o=typeof t==="function"?t:P(+t),c):o};c.padAngle=function(t){return arguments.length?(r=typeof t==="function"?t:P(+t),c):r};c.source=function(t){return arguments.length?(e=t,c):e};c.target=function(t){return arguments.length?(s=t,c):s};c.context=function(t){return arguments.length?(l=t==null?null:t,c):l};return c}function G(){return B()}function $(t,e){return e<t?-1:e>t?1:e>=t?0:NaN}function k(t){return t}function W(){var t=k,e=$,s=null,n=f(0),i=f(M),a=f(0);function o(o){var r,l=(o=A(o)).length,c,h,d=0,p=new Array(l),u=new Array(l),g=+n.apply(this,arguments),m=Math.min(M,Math.max(-M,i.apply(this,arguments)-g)),f,v=Math.min(Math.abs(m)/l,a.apply(this,arguments)),x=v*(m<0?-1:1),R;for(r=0;r<l;++r){if((R=u[p[r]=r]=+t(o[r],r,o))>0){d+=R}}if(e!=null)p.sort((function(t,s){return e(u[t],u[s])}));else if(s!=null)p.sort((function(t,e){return s(o[t],o[e])}));for(r=0,h=d?(m-l*x)/d:0;r<l;++r,g=f){c=p[r],R=u[c],f=g+(R>0?R*h:0)+x,u[c]={data:o[c],index:r,value:R,startAngle:g,endAngle:f,padAngle:v}}return u}o.value=function(e){return arguments.length?(t=typeof e==="function"?e:f(+e),o):t};o.sortValues=function(t){return arguments.length?(e=t,s=null,o):e};o.sort=function(t){return arguments.length?(s=t,e=null,o):s};o.startAngle=function(t){return arguments.length?(n=typeof t==="function"?t:f(+t),o):n};o.endAngle=function(t){return arguments.length?(i=typeof t==="function"?t:f(+t),o):i};o.padAngle=function(t){return arguments.length?(a=typeof t==="function"?t:f(+t),o):a};return o}class F{constructor(t,e,s){this.radius=t;this.width=e;this.color=s}render(t){const e=g();const s={startAngle:0,endAngle:Math.PI*2,innerRadius:this.radius,outerRadius:this.radius+this.width,color:this.color,text:"No label"};const n=[];n.push(s);const i=t.append("g");i.selectAll("path").data(n).enter().append("path").attr("d",(t=>e(t))).attr("fill",(t=>t.color))}}class j{static create(){const t=new e({padding:5});t.d.style("border","1px solid #FFF").style("position","absolute").style("z-index",1001);return t}}var _;(function(t){t["Intrachromosomal"]="#1B9E77";t["Interchromosomal"]="#6A3D9A"})(_||(_={}));class H{static getColor(t,e){if(t!=e){return _.Interchromosomal.valueOf()}else{return _.Intrachromosomal.valueOf()}}}class U{render(t,e){let n=0;if(e.length>0){n=e[0].target.radius;const s=new F(n,2,"#6464641A");s.render(t)}const i=G().radius(n);const a=t.selectAll(".chord").data(e);const o=j.create();a.enter().append("path").attr("class","chord").attr("d",i).attr("fill",(t=>H.getColor(t.source.positionInChromosome.chromosome,t.target.positionInChromosome.chromosome))).on("mouseover",((t,e)=>{const n=s({holder:o.d});this.createTooltip(n,e);o.show(t.x,t.y)})).on("mouseout",(()=>{o.clear();o.hide()}))}createTooltip(t,e){{const[e,s]=t.addRow();e.text("Data type");s.append("span").style("margin-left","5px").text("Fusion transcript")}{const s=e.source.positionInChromosome;const n=e.target.positionInChromosome;const[i,a]=t.addRow();i.text("Position");a.append("span").style("margin-left","5px").text(` ${e.source.gene?e.source.gene:""} ${s.chromosome}:${s.position} ${e.source.strand=="+"?"forward":"reverse"} > `+` ${e.target.gene?e.target.gene:""} ${n.chromosome}:${n.position} ${e.target.strand=="+"?"forward":"reverse"} `)}}}class q{constructor(t,e){this.renders=t;this.legendRenderer=e;this.fusionRenderer=new U}render(t,e){const s=t.append("div").style("display","inline-block").style("font-family","Arial");const n=s.append("svg").attr("id","sjpp_disco_plot").attr("data-testid","sjpp_disco_plot").attr("width",e.width).attr("height",e.height+e.legendHeight);const i=n.append("g").attr("class","mainG").attr("transform",`translate(${e.settings.rings.labelLinesInnerRadius+e.settings.rings.labelsToLinesDistance+100},${e.height/2})`);for(const[t,s]of this.renders){const n=e.getElements(t);const a=e.getCollisions(t);s.render(i,n,a)}this.fusionRenderer.render(i,e.fusions);this.legendRenderer.render(i,e.legend,-1*(e.settings.rings.labelLinesInnerRadius+e.settings.rings.labelsToLinesDistance+50),e.width,e.height/2)}}class X{constructor(e){this.discoApp=e;this.downloadClickListener=t=>{const e=this.discoApp.state.settings.downloadImgName||"disco.plot";const s=document.createElement("a");document.body.appendChild(s);s.addEventListener("click",(()=>{const n=new XMLSerializer;const i=new Blob([n.serializeToString(t)],{type:"image/svg+xml"});s.download=e+".svg";s.href=URL.createObjectURL(i);document.body.removeChild(s)}),false);s.click()};this.geneClickListener=(e,s)=>t(this,void 0,void 0,(function*(){const{filter:t,filter0:n}=this.discoApp.app.getState().termfilter;const i={holder:this.discoApp.app.opts.holder,genome:this.discoApp.app.opts.state.args.genome,nobox:true,query:e,tklst:[{type:"mds3",dslabel:this.discoApp.app.opts.state.dslabel,hlaachange:s.join(","),filter0:n,filterObj:t}]};const a=yield import("./app-b369b169.js").then((function(t){return t.c3}));yield a.default(i)}))}}class K{constructor(t,e,s){this.chromosomes=[];this.chromosomesOrder=[];this.keysArray=[];this.totalSizeArray=[];this.chrSizesArray=[];const n=s||e;this.settings=t;this.chromosomesOrder=[];let i=0;this.totalPadAngle=Object.keys(n).length*this.settings.padAngle;this.totalChromosomesAngle=2*Math.PI-this.totalPadAngle;for(const t in n){const e=t.slice(0,3)==="chr"?t.slice(3):t;this.chromosomesOrder.push(t);this.keysArray.push(e);this.totalSizeArray.push(i);this.chrSizesArray.push(n[t]);i+=n[t]}this.totalSize=i;let a=0;for(let t=0;t<this.keysArray.length;t++){const e=this.totalChromosomesAngle*(this.chrSizesArray[t]/i);const s=t==0?this.settings.padAngle/2:a+this.settings.padAngle;const n=t==0?this.settings.padAngle/2+e:a+this.settings.padAngle+e;const o={start:this.totalSizeArray[t],size:this.chrSizesArray[t],factor:1,startAngle:s,endAngle:n,angle:(s+n)/2,innerRadius:this.settings.chromosomeInnerRadius,outerRadius:this.settings.chromosomeInnerRadius+this.settings.chromosomeWidth,color:"#AAA",text:this.keysArray[t]};this.chromosomes.push(o);if(o.endAngle!=null){a=o.endAngle}}}}class J{constructor(t,e){this.sampleName=t;this.prioritizedGenes=e}map(t){return{dt:t.dt,mname:t.mname,mClass:t.class,gene:t.gene,chr:t.chr,ref:t.ref,alt:t.alt,position:t.pos?t.pos:t.position,poschr:t.poschr,posbins:t.posbins,poslabel:t.poslabel,sampleName:this.sampleName,ssm_id:t.ssm_id,start:t.start,stop:t.stop,value:t.value,segmean:t.segmean,isPrioritized:this.prioritizedGenes.some((e=>e==t.gene)),chrA:t.chrA,chrB:t.chrB,geneA:t.geneA,geneB:t.geneB,posA:t.posA,posB:t.posB,strandA:t.strandA,strandB:t.strandB}}}class Q{map(t,e){return this.calculatePercentileForPositivesAndNegatives(t,e)}calculatePercentileForPositivesAndNegatives(t,e){const s=t.filter((t=>t>0));const n=t.filter((t=>t<0)).map((t=>-1*t));let i=NaN;let a=NaN;if(s.length>0){i=this.calculatePercentile(s,e)}if(n.length>0){a=-1*this.calculatePercentile(n,e)}return{positive:i,negative:a}}calculatePercentile(t,e){if(t.length===0){throw new Error("Array must contain at least one element.")}const s=t.sort(((t,e)=>t-e));const n=e/100*(s.length-1);const i=Math.floor(n);const a=Math.ceil(n);const o=n-i;if(i===a){return s[i]}return s[i]+o*(s[a]-s[i])}}class Y{constructor(t,e,s,l=[]){this.labelData=[];this.nonExonicSnvData=[];this.nonExonicInnerRadius=0;this.snvRingDataMap=new Map;this.snvInnerRadius=0;this.snvData=[];this.bpx=0;this.onePxArcAngle=0;this.filteredSnvData=[];this.lohData=[];this.lohInnerRadius=0;this.cnvData=[];this.cnvInnerRadius=0;this.fusionData=[];this.fusionRadius=0;this.hasPrioritizedGenes=false;this.cnvLossMaxValue=0;this.cnvGainMaxValue=0;this.percentilePositive=0;this.percentileNegative=0;this.cnvMaxPercentileAbs=0;this.lohMaxValue=undefined;this.lohMinValue=undefined;this.snvFilter=t=>t.dt==n;this.fusionFilter=t=>t.dt==i||t.dt==a;this.cnvFilter=t=>t.dt==o;this.lohFilter=t=>t.dt==r;this.compareData=(t,e)=>{const s=this.reference.chromosomesOrder.indexOf(t.chr)-this.reference.chromosomesOrder.indexOf(e.chr);if(s!=0){return s}const n=t.pos?t.pos:t.start;const i=e.pos?e.pos:e.start;return n-i};this.settings=t;this.reference=e;this.sample=s;this.lastInnerRadious=this.settings.rings.chromosomeInnerRadius;this.gainCapped=this.settings.Disco.cnvCapping;this.lossCapped=-1*this.settings.Disco.cnvCapping;this.nonExonicFilter=e=>{if(l.length>0&&this.settings.Disco.prioritizeGeneLabelsByGeneSets){return l.includes(e.gene)&&t.rings.nonExonicFilterValues.includes(yt.snvClassLayer[e.mClass])}else{return t.rings.nonExonicFilterValues.includes(yt.snvClassLayer[e.mClass])}};this.snvRingFilter=e=>{if(l.length>0&&this.settings.Disco.prioritizeGeneLabelsByGeneSets){return l.includes(e.gene)&&t.rings.snvRingFilters.includes(yt.snvClassLayer[e.mClass])}else{return t.rings.snvRingFilters.includes(yt.snvClassLayer[e.mClass])}};this.dataObjectMapper=new J(s,l)}map(t){const e=[];t.forEach((t=>{const s=this.reference.chromosomesOrder.indexOf(t.chr);const l=this.reference.chromosomesOrder.indexOf(t.chrA);const c=this.reference.chromosomesOrder.indexOf(t.chrB);if(t.dt==n){if(s!=-1&&this.snvData.length<this.settings.snv.maxMutationCount){this.addData(t,e)}}else if(t.dt==i||t.dt==a){if(l!=-1&&c!=-1){this.addData(t,e)}}else if([o,r].includes(Number(t.dt))){this.addData(t,e)}else{throw Error("Unknown mutation type!")}}));const s=e.sort(this.compareData);if(this.settings.rings.nonExonicRingEnabled){s.forEach((t=>{this.filterNonExonicSnvData(t)}))}if(this.nonExonicSnvData.length>0){this.nonExonicInnerRadius=this.lastInnerRadious-this.settings.rings.nonExonicRingWidth;this.lastInnerRadious=this.nonExonicInnerRadius}s.forEach((t=>{this.filterSnvs(t)}));s.forEach((t=>{this.filterLohs(t)}));if(this.lohData.length>0){this.lohInnerRadius=this.lastInnerRadious-this.settings.rings.lohRingWidth;this.lastInnerRadious=this.lohInnerRadius}s.forEach((t=>{this.filterCnvs(t)}));if(this.cnvData.length>0){this.cnvInnerRadius=this.lastInnerRadious-this.settings.rings.cnvRingWidth;this.lastInnerRadious=this.cnvInnerRadius;this.cappedCnvMaxAbsValue=Math.min(this.settings.Disco.cnvCapping,Math.max(Math.abs(Y.capMaxValue(this.cnvLossMaxValue,this.gainCapped,this.lossCapped)),Math.abs(Y.capMaxValue(this.cnvGainMaxValue,this.gainCapped,this.lossCapped))));const t=(new Q).map(this.cnvData.map((t=>t.value)),this.settings.Disco.cnvPercentile);this.percentilePositive=Y.capMaxValue(t.positive,this.gainCapped,this.lossCapped);this.percentileNegative=Y.capMaxValue(t.negative,this.gainCapped,this.lossCapped);this.cnvMaxPercentileAbs=Math.min(this.settings.Disco.cnvCapping,Math.max(this.percentilePositive,Math.abs(this.percentileNegative)))}s.forEach((t=>{this.filterFusion(t)}));if(this.fusionData.length>0){this.fusionRadius=this.lastInnerRadious}const l={labelData:this.labelData,nonExonicSnvData:this.nonExonicSnvData,nonExonicInnerRadius:this.nonExonicInnerRadius,snvRingDataMap:this.snvRingDataMap,snvInnerRadius:this.snvInnerRadius,snvData:this.snvData,bpx:this.bpx,onePxArcAngle:this.onePxArcAngle,filteredSnvData:this.filteredSnvData,lohData:this.lohData,lohInnerRadius:this.lohInnerRadius,cnvData:this.cnvData,cnvInnerRadius:this.cnvInnerRadius,fusionData:this.fusionData,fusionRadius:this.fusionRadius,hasPrioritizedGenes:this.hasPrioritizedGenes,cnvGainMaxValue:this.cnvGainMaxValue,cnvLossMaxValue:this.cnvLossMaxValue,cappedCnvMaxAbsValue:this.cappedCnvMaxAbsValue,percentilePositive:this.percentilePositive,percentileNegative:this.percentileNegative,cnvMaxPercentileAbs:this.cnvMaxPercentileAbs,lohMaxValue:this.lohMaxValue,lohMinValue:this.lohMinValue};return l}addData(t,e){const s=this.dataObjectMapper.map(t);if(s.isPrioritized){this.hasPrioritizedGenes=true}e.push(s)}filterNonExonicSnvData(t){if(this.snvFilter(t)){if(this.settings.rings.nonExonicRingEnabled&&this.nonExonicFilter(t)){this.nonExonicSnvData.push(t)}}}filterSnvs(t){if(this.snvFilter(t)){this.snvData.push(t);if(this.snvRingFilter(t)){if(this.snvInnerRadius==0){this.snvInnerRadius=this.lastInnerRadious-this.settings.rings.snvRingWidth;this.lastInnerRadious=this.snvInnerRadius;this.bpx=Math.floor(this.reference.totalSize/(this.reference.totalChromosomesAngle*this.snvInnerRadius));this.onePxArcAngle=1/this.snvInnerRadius}this.filteredSnvData.push(t);this.labelData.push(t);const e=this.calculateArcAngle(t);let s=this.snvRingDataMap.get(e);if(!s){s=new Array}s.push(t);this.snvRingDataMap.set(e,s)}}}filterFusion(t){if(this.fusionFilter(t)){t.isPrioritized=true;this.fusionData.push(t);this.labelData.push(t)}}filterLohs(t){if(this.lohFilter(t)){if(this.lohMaxValue==undefined||this.lohMaxValue<t.value){this.lohMaxValue=t.segmean}if(this.lohMinValue==undefined||this.lohMinValue>t.value){this.lohMinValue=t.segmean}this.lohData.push(t)}}filterCnvs(t){if(this.cnvFilter(t)){if(this.cnvGainMaxValue==undefined||this.cnvGainMaxValue<t.value){this.cnvGainMaxValue=t.value}if(this.cnvLossMaxValue==undefined||this.cnvLossMaxValue>t.value){this.cnvLossMaxValue=t.value}this.cnvData.push(t)}}calculateArcAngle(t){const e=this.reference.chromosomes[this.reference.chromosomesOrder.findIndex((e=>t.chr==e))];const s=Math.floor(t.position/this.bpx);return e.startAngle+s*this.onePxArcAngle}static capMaxValue(t,e,s){if(t&&Math.sign(t)==1){return t>e?e:t}if(Math.sign(t)==-1){return t<s?s:t}return 0}static capMinValue(t,e=1){if(Math.sign(t)==1){return t>e?t:e}if(Math.sign(t)==-1){return t<-1*e?t:-1*e}return 1}}class Z{constructor(t,e,s,n,i,a,o,r,l){this.snvTitle=t;this.cnvTitle=e;this.lohTitle=s;this.fusionTitle=n;this.snvClassMap=i;this.cnvClassMap=a;this.cnvRenderingType=o;this.lohLegend=l;this.fusionLegend=r}legendCount(){return(this.snvClassMap.size>0?1:0)+(this.cnvClassMap.size>0?1:0)+(this.lohLegend?1:0)+(this.fusionLegend?1:0)}}class tt{constructor(t,e,s,n,i){this.source=t;this.target=e;this.genes=s;this.count=n;this.endpts=i}}class et{constructor(t,e,s,n,i,a,o,r){this.startAngle=t;this.endAngle=e;this.radius=s;this.gene=n;this.value=i;this.genes=a;this.positionInChromosome=o;this.strand=r}}class st{constructor(t,e,s){this.radius=t;this.sampleName=e;this.reference=s}map(t){const e=[];t.forEach((t=>{const s=new Set;s.add(t.geneA);s.add(t.geneB);const n=new et(this.calculateStartAngle(t.chrA,t.posA),this.calculateEndAngle(t.chrA,t.posA),this.radius,t.geneA,t.value,s,{chromosome:t.chrA,position:t.posA},t.strandA);const i=new et(this.calculateStartAngle(t.chrB,t.posB),this.calculateEndAngle(t.chrB,t.posB),this.radius,t.geneB,t.value,s,{chromosome:t.chrB,position:t.posB},t.strandB);const a=new tt(n,i,"genes",-1,"Endpoints");e.push(a)}));return e}calculateStartAngle(t,e){const s=this.reference.chromosomesOrder.indexOf(t);const n=this.reference.chromosomes[s];return n.startAngle+(n.endAngle-n.startAngle)*(Number(e)/n.size)-.01}calculateEndAngle(t,e){const s=this.reference.chromosomesOrder.indexOf(t);const n=this.reference.chromosomes[s];return.01+n.startAngle+(n.endAngle-n.startAngle)*(Number(e)/n.size)}}class nt{static provide(t){const e=Math.min(Math.max(t,0),1);const s=Math.round(e*255);return`rgb(${s}, ${s}, ${s})`}}class it{constructor(t,e){this.minValue=t;this.maxValue=e;this.colorStartValue=nt.provide(t);this.colorEndValue=nt.provide(e)}}var at;(function(t){t[t["CHROMOSOME"]=0]="CHROMOSOME";t[t["LABEL"]=1]="LABEL";t[t["NONEXONICSNV"]=2]="NONEXONICSNV";t[t["SNV"]=3]="SNV";t[t["CNV"]=4]="CNV";t[t["LOH"]=5]="LOH";t[t["FUSION"]=6]="FUSION"})(at||(at={}));class ot{constructor(t,e,s,n,i,a,o){this.settings=t;this.rings=e;this.legend=s;this.fusions=n;this.genesetName=a;this.width=1.2*(this.settings.horizontalPadding+this.settings.rings.labelLinesInnerRadius+this.settings.rings.labelsToLinesDistance);this.height=2*(this.settings.rings.labelLinesInnerRadius+this.settings.rings.labelsToLinesDistance+this.settings.verticalPadding);this.legendHeight=this.calculateLegendHeight(s);this.snvDataLength=i.snvData.length;this.filteredSnvDataLength=i.filteredSnvData.length;this.snvDataLengthAll=o;this.cnvMaxValue=i.cnvGainMaxValue;this.cnvMinValue=i.cnvLossMaxValue;this.cappedCnvMaxAbsValue=i.cappedCnvMaxAbsValue;this.negativePercentile80=i.percentileNegative;this.positivePercentile80=i.percentilePositive}getElements(t){switch(t){case at.CHROMOSOME:return this.rings.chromosomesRing?this.rings.chromosomesRing.elements:[];case at.LABEL:return this.rings.labelsRing.elementsToDisplay;case at.NONEXONICSNV:return this.rings.nonExonicArcRing?this.rings.nonExonicArcRing.elements:[];case at.SNV:return this.rings.snvArcRing?this.rings.snvArcRing.elements:[];case at.CNV:return this.rings.cnvArcRing?this.rings.cnvArcRing.elements:[];case at.LOH:return this.rings.lohArcRing?this.rings.lohArcRing.elements:[];default:throw new Error(`ringType ${t} not defined`)}}getCollisions(t){if(t==at.LABEL){return this.rings.labelsRing.collisions}else{return undefined}}calculateLegendHeight(t){const e=this.settings.legend.rowHeight;return e*t.legendCount()}}class rt{constructor(t,e,s){this.innerRadius=t;this.outerRadius=t+e;this.width=e;this.elements=s}}class lt{constructor(){const t={};for(const e in l){t[l[e].label]=l[e];t[e]=l[e]}this.mlabel=t}static getInstance(){if(!lt.instance){lt.instance=new lt}return lt.instance}}class ct{constructor(t,e,s){this.snvType=t;this.color=e;this.count=s}}class ht{constructor(t,e,s,n){this.snvClassMap=new Map;this.svnInnerRadius=t;this.svnWidth=e;this.sampleName=s;this.reference=n;this.bpx=Math.floor(this.reference.totalSize/(this.reference.totalChromosomesAngle*t));this.onePxArcAngle=1/t}map(t){const e=[];for(const s of t.keys()){const n=t.get(s);if(n){const t=n.length;for(let i=0;i<n.length;i++){const a=n[i];const o=this.snvClassMap.get(a.mClass);if(o){this.snvClassMap.set(a.mClass,this.createSnvLegend(a.mClass,++o.count))}else{this.snvClassMap.set(a.mClass,this.createSnvLegend(a.mClass,1))}const r=s;const l=s+this.onePxArcAngle;const c=lt.getInstance().mlabel?lt.getInstance().mlabel[a.mClass]:undefined;const h={startAngle:r,endAngle:l,innerRadius:this.svnInnerRadius+i*this.svnWidth/t,outerRadius:this.svnInnerRadius+(i+1)*this.svnWidth/t,color:c.color,text:a.gene,dataClass:c.label,mname:a.mname,chr:a.chr,pos:a.position,sampleName:[a.sampleName]};e.push(h)}}}return e}createSnvLegend(t,e){const s=lt.getInstance().mlabel[t];return new ct(s.label,s.color,e)}}class dt{constructor(t,e,s,n){this.text=t;this.cnvType=e;this.color=s;this.value=n}}var pt;(function(t){t[t["Loss"]=0]="Loss";t[t["Gain"]=1]="Gain";t[t["Cap"]=2]="Cap"})(pt||(pt={}));var ut;(function(t){t["heatmap"]="heatmap";t["bar"]="bar"})(ut||(ut={}));class gt{static getColor(t,e,s=0){const n=e.cnv;const i=e.Disco.cnvRenderingType==ut.heatmap?e.Disco.cnvCapping:s;const a=e.Disco.cnvRenderingType==ut.heatmap?-1*e.Disco.cnvCapping:-1*s;if(t<a){return n.cappedLossColor}else if(t>=a&&t<=0){return n.lossColor}else if(t>0&&t<=i){return n.ampColor}else{return n.cappedAmpColor}}}class mt{constructor(t,e,s,n,i,a=0,o=0,r=0,l=0,c="",h){this.cnvClassMap=new Map;this.cnvInnerRadius=t;this.cnvWidth=e;this.settings=s;this.sampleName=n;this.reference=i;this.cnvMaxValue=a;this.cnvMinValue=o;this.cnvMaxAbsValue=r;this.cnvAbsPercentile=l;this.cnvUnit=c;this.cnvRenderingType=h;this.gainCapped=Math.min(l,this.settings.Disco.cnvCapping);this.lossCapped=-1*Math.min(l,this.settings.Disco.cnvCapping);this.lossOnly=a<=0;this.gainOnly=o>=0;this.onePxArcAngle=1/this.cnvInnerRadius;const d=new dt("Max",a>0?pt.Gain:pt.Loss,this.getColor(a),a);const p=new dt("Min",o>0?pt.Gain:pt.Loss,this.getColor(o),o);const u=new dt("Capping",pt.Loss,this.getColor(o>0?o:a),this.settings.Disco.cnvCapping);this.cnvClassMap.set(pt.Gain,d);this.cnvClassMap.set(pt.Loss,p);this.cnvClassMap.set(pt.Cap,u)}map(t){const e=[];t.forEach((t=>{let s=this.calculateStartAngle(t);let n=this.calculateEndAngle(t);if(n-s<this.onePxArcAngle){const t=this.onePxArcAngle-(n-s);s=s-t/2;n=s+t/2}const i=this.calculateInnerRadius(t);const a=this.calculateOuterRadius(t);const o=this.getColor(t.value);const r={startAngle:s,endAngle:n,innerRadius:i,outerRadius:a,color:o,text:t.gene,chr:t.chr,start:t.start,stop:t.stop,value:t.value,unit:this.cnvUnit,sampleName:[this.sampleName]};e.push(r)}));return e}calculateStartAngle(t){const e=this.reference.chromosomesOrder.indexOf(t.chr);const s=this.reference.chromosomes[e];return s.startAngle+(s.endAngle-s.startAngle)*(Number(t.start)/s.size)}calculateEndAngle(t){const e=this.reference.chromosomesOrder.indexOf(t.chr);const s=this.reference.chromosomes[e];return s.startAngle+(s.endAngle-s.startAngle)*(Number(t.stop)/s.size)}getColor(t){return gt.getColor(t,this.settings,this.cnvAbsPercentile)}calculateInnerRadius(t){if(this.cnvRenderingType==ut.heatmap){return this.cnvInnerRadius}if(this.gainOnly){return this.cnvInnerRadius}if(this.lossOnly){const e=this.cnvInnerRadius+this.cnvWidth;return e+Y.capMinValue(this.cnvWidth*Y.capMaxValue(t.value,this.gainCapped,this.lossCapped)/this.cnvAbsPercentile)}const e=this.cnvInnerRadius+this.cnvWidth/2;if(Math.sign(t.value)==1){return e}if(Math.sign(t.value)==-1){return e+Y.capMinValue(Y.capMaxValue(t.value,this.gainCapped,this.lossCapped)/this.cnvAbsPercentile*(this.cnvWidth/2))}return 1}calculateOuterRadius(t){const e=this.cnvInnerRadius+this.cnvWidth;if(this.cnvRenderingType==ut.heatmap){return e}if(this.gainOnly){return this.cnvInnerRadius+Y.capMinValue(this.cnvWidth*Y.capMaxValue(t.value,this.gainCapped,this.lossCapped)/this.cnvAbsPercentile)}if(this.lossOnly){return e}const s=this.cnvInnerRadius+this.cnvWidth/2;if(Math.sign(t.value)==1){return s+Y.capMinValue(Y.capMaxValue(t.value,this.gainCapped,this.lossCapped)/this.cnvMaxAbsValue*(this.cnvWidth/2))}if(Math.sign(t.value)==-1){return s}return 1}}class ft{constructor(t,e){this.points=new Array;this.points=t;this.color=e}}class vt{static createLabel(t,e,s,n,i,a,o,r,l,c,h=false,d,p,u){const g=(t+e)/2;const m=g-Math.PI/2;const f=`rotate(${g*180/Math.PI-90}) translate(${n})${g>Math.PI?"rotate(180)":""}`;const v=g>Math.PI?"end":"";const A=s;const x=n-d;const M=[];const R={x:A*Math.cos(m),y:A*Math.sin(m)};const b={x:x*Math.cos(m),y:x*Math.sin(m)};M.push(R);M.push(b);const C=new ft(M,o);const y={startAngle:t,endAngle:e,innerRadius:s,outerRadius:n,angle:g,value:i,text:a,color:o,transform:f,textAnchor:v,ccAngle:m,line:C,isPrioritized:h,start:c,stop:c,chr:l,mutationsTooltip:p?[p]:undefined,fusionTooltip:u?[u]:undefined};return y}static createMovedLabel(t,e){const s=t.startAngle+e;const n=t.endAngle+e;const i=(s+n)/2;const a=i-Math.PI/2;const o=t.innerRadius;const r=t.outerRadius-2;const l=(r-o)/3;const c=Math.cos(t.ccAngle);const h=Math.sin(t.ccAngle);const d=Math.cos(t.ccAngle+e);const p=Math.sin(t.ccAngle+e);const u=[];const g={x:o*c,y:o*h};const m={x:(o+l)*c,y:(o+l)*h};const f={x:(o+2*l)*d,y:(o+2*l)*p};const v={x:(o+3*l)*d,y:(o+3*l)*p};u.push(g);u.push(m);u.push(f);u.push(v);const A=new ft(u,t.color);const x="rotate("+(i*180/Math.PI-90)+")"+"translate("+t.outerRadius+")"+(i>Math.PI?"rotate(180)":"");const M=i>Math.PI?"end":"";const R=t.mutationsTooltip?t.mutationsTooltip[0].color:t.fusionTooltip?t.fusionTooltip[0].color:undefined;const b={startAngle:s,endAngle:n,innerRadius:t.innerRadius,outerRadius:t.outerRadius,angle:i,value:t.value,text:t.text,transform:x,textAnchor:M,ccAngle:a,color:R,line:A,isPrioritized:t.isPrioritized,start:t.start,stop:t.stop,chr:t.chr,mutationsTooltip:t.mutationsTooltip,fusionTooltip:t.fusionTooltip};return b}}class At{constructor(t,e,s,n=0){this.labelMap=new Map;this.settings=t;this.sampleName=e;this.reference=s;this.cnvMaxPercentileAbs=n}map(t,e=[]){const s=this.settings.rings.labelLinesInnerRadius;const a=s+this.settings.rings.labelsToLinesDistance;t.forEach((t=>{if(t.dt==n){const e=this.calculateStartAngle(t.chr,t.position);const n=this.calculateEndAngle(t.chr,t.position);const i=lt.getInstance().mlabel?lt.getInstance().mlabel[t.mClass]:undefined;this.addLabelOrMutation(t,t.gene,t.mname,e,n,s,a,i.color,i.label)}if(t.dt==i){const e=H.getColor(t.chrA,t.chrB);if(t.geneA){const n=this.calculateStartAngle(t.chrA,t.posA);const i=this.calculateEndAngle(t.chrA,t.posA);this.addLabelOrFusion(t,t.geneA,t.posA,n,i,s,a,e)}if(t.geneB&&t.geneA!=t.geneB){const n=this.calculateStartAngle(t.chrB,t.posB);const i=this.calculateEndAngle(t.chrB,t.posB);this.addLabelOrFusion(t,t.geneB,t.posB,n,i,s,a,e)}}}));const o=Array.from(this.labelMap.values());o.forEach((t=>{e.forEach((e=>{if(t.stop>=e.start&&e.stop>=t.start&&t.chr==e.chr){const s={value:e.value,color:gt.getColor(e.value,this.settings,this.cnvMaxPercentileAbs),chr:e.chr,start:e.start,stop:e.stop};if(t.cnvTooltip){t.cnvTooltip.push(s)}else{t.cnvTooltip=[];t.cnvTooltip.push(s)}}}))}));return Array.from(this.labelMap.values())}addLabelOrMutation(t,e,s,n,i,a,o,r,l){const c=this.labelMap.get(e);const h={mname:s,color:r,dataClass:l,chr:t.chr,position:t.position};if(!c){this.labelMap.set(e,vt.createLabel(n,i,a,o,t.value,e,r,l,t.chr,t.position,t.isPrioritized,this.settings.rings.labelsToLinesGap,h))}else{if(c.mutationsTooltip){c.start=Math.min(c.start,t.position);c.stop=Math.max(c.stop,t.position);c.mutationsTooltip.push(h)}else{c.mutationsTooltip=[];c.start=Math.min(c.start,t.position);c.stop=Math.max(c.stop,t.position);c.mutationsTooltip.push(h)}}}addLabelOrFusion(t,e,s,n,i,a,o,r){const l=this.labelMap.get(e);const c={color:r,chrA:t.chrA,chrB:t.chrB,posA:t.posA,posB:t.posB,geneA:t.geneA,geneB:t.geneB,strandA:t.strandA,strandB:t.strandB};if(!l){this.labelMap.set(e,vt.createLabel(n,i,a,o,t.value,e,r,"Fusion transcript",t.chr,t.position,t.isPrioritized,this.settings.rings.labelsToLinesGap,undefined,c))}else{if(l.fusionTooltip){l.start=Math.min(l.start,s);l.stop=Math.max(l.stop,s);l.fusionTooltip.push(c)}else{l.fusionTooltip=[];l.start=Math.min(l.start,s);l.stop=Math.max(l.stop,s);l.fusionTooltip.push(c)}}}calculateStartAngle(t,e){const s=this.reference.chromosomesOrder.findIndex((e=>e==t));const n=this.reference.chromosomes[s];return n.startAngle+(n.endAngle-n.startAngle)*(Number(e)/n.size)}calculateEndAngle(t,e){const s=this.reference.chromosomesOrder.findIndex((e=>e==t));const n=this.reference.chromosomes[s];return n.startAngle+(n.endAngle-n.startAngle)*(Number(e)/n.size)}}class xt extends rt{constructor(t,e,s){super(t.rings.labelLinesInnerRadius,t.rings.labelsToLinesDistance,e.sort(((t,e)=>t.startAngle<e.startAngle?-1:t.startAngle>e.startAngle?1:0)));this.elementsToDisplay=[];this.settings=t;this.hasPrioritizedGenes=s;const n=2*Math.PI*(t.rings.labelLinesInnerRadius+t.rings.labelsToLinesDistance);this.overlapAngle=this.settings.label.overlapAngleFactor*this.settings.label.fontSize/n;this.calculateCollisions()}calculateCollisions(){this.collisions=[];let t=[];t=this.elements.filter((t=>t.isPrioritized));if(this.settings.label.prioritizeGeneLabelsByGeneSets){this.elementsToDisplay=this.getLabelsWithPrioritizedGenes(t)}else if(this.hasPrioritizedGenes){const t=this.elements.filter((t=>t.isPrioritized));const e=this.getLabelsWithPrioritizedGenes(t);const s=this.elements.filter((t=>!t.isPrioritized));const n=[...s,...e].sort(((t,e)=>t.startAngle-e.startAngle));this.elementsToDisplay=this.getAllLabels(n)}else{this.elementsToDisplay=this.getLabelsWithPrioritizedGenes(this.elements)}}getLabelsWithPrioritizedGenes(t){const e=[];let s={endAngle:0};t.forEach(((t,n)=>{if(n==0){e.push(t);s=t}else{const n=s.endAngle-t.startAngle+this.overlapAngle;if(n>0&&n<this.settings.label.maxDeltaAngle){const i=vt.createMovedLabel(t,n);e===null||e===void 0?void 0:e.push(i);s=i}if(n<=0){e.push(t);s=t}}}));return e}getAllLabels(t){var e;const s=[];let n={endAngle:0};const i=t.length;let a=-1;for(let o=0;o<t.length;o++){const r=t[o];if(r.isPrioritized){s.push(r);a=o;n=r;continue}if(o==0){if(i>1){if(this.isElementOverlappingNextCancerGene(t,a,r,0)){continue}s.push(r);n=r}continue}const l=n.endAngle-r.startAngle+this.overlapAngle;if(l>0&&l<this.settings.label.maxDeltaAngle){if(o==length-1){s.push(r);continue}if(this.isElementOverlappingNextCancerGene(t,a,r,l)){continue}const i=vt.createMovedLabel(r,l);(e=this.collisions)===null||e===void 0?void 0:e.push(i);s.push(r);n=i}if(l<=0){if(this.isElementOverlappingNextCancerGene(t,a,r,0)){continue}s.push(r);n=r}}return s}isElementOverlappingNextCancerGene(t,e,s,n){const i=this.getNextLabelWithCancerGene(t,e);if(i){const t=s.endAngle+n-i.startAngle+this.overlapAngle;if(t>0){return true}}return false}getNextLabelWithCancerGene(t,e){return t.find(((t,s)=>t.isPrioritized&&s>e))}}class Mt{constructor(t,e,s,n){this.nonExonicInnerRadius=t;this.nonExonicWidht=e;this.sampleName=s;this.reference=n;this.onePxArcAngle=1/t}map(t){const e=this.nonExonicInnerRadius;const s=e+this.nonExonicWidht;const n=[];t.forEach((t=>{const i=lt.getInstance().mlabel?lt.getInstance().mlabel[t.mClass]:undefined;const a=this.calculateStartAngle(t);const o=this.calculateEndAngle(t);const r={startAngle:a,endAngle:o,innerRadius:e,outerRadius:s,color:i.color,text:t.gene,dataClass:i.label,mname:t.mname,chr:t.chr,pos:t.position,sampleName:[t.sampleName]};n.push(r)}));return n}calculateStartAngle(t){const e=this.reference.chromosomesOrder.indexOf(t.chr);const s=this.reference.chromosomes[e];return s.startAngle+(s.endAngle-s.startAngle)*(Number(t.position)/s.size)-this.onePxArcAngle}calculateEndAngle(t){const e=this.reference.chromosomesOrder.indexOf(t.chr);const s=this.reference.chromosomes[e];return this.onePxArcAngle+s.startAngle+(s.endAngle-s.startAngle)*(Number(t.position)/s.size)}}class Rt{constructor(t,e,s,n){this.lohInnerRadius=t;this.lohWidth=e;this.sampleName=s;this.reference=n}map(t){const e=[];t.forEach((t=>{const s=this.calculateStartAngle(t);const n=this.calculateEndAngle(t);const i=this.lohInnerRadius;const a=i+this.lohWidth;const o=nt.provide(t.segmean);const r={startAngle:s,endAngle:n,innerRadius:i,outerRadius:a,color:o,text:t.gene,chr:t.chr,start:t.start,stop:t.stop,value:t.segmean};e.push(r)}));return e}calculateStartAngle(t){const e=this.reference.chromosomesOrder.indexOf(t.chr);const s=this.reference.chromosomes[e];return s.startAngle+(s.endAngle-s.startAngle)*(Number(t.start)/s.size)}calculateEndAngle(t){const e=this.reference.chromosomesOrder.indexOf(t.chr);const s=this.reference.chromosomes[e];return s.startAngle+(s.endAngle-s.startAngle)*(Number(t.stop)/s.size)}}class bt{constructor(t,e,s,n,i,a){this.labelsRing=t;this.chromosomesRing=e;this.nonExonicArcRing=s;this.snvArcRing=n;this.cnvArcRing=i;this.lohArcRing=a}}class Ct{constructor(t,e,s,n,i){this.nonExonicArcRing=undefined;this.settings=t;this.dataMapper=e;this.reference=s;this.sampleName=n;this.genesetName=i}map(t){const e=this.dataMapper.map(t);const s=new At(this.settings,this.sampleName,this.reference,e.cnvMaxPercentileAbs);const i=s.map(e.labelData,e.cnvData);const a=new xt(this.settings,i,e.hasPrioritizedGenes);const o=new rt(this.settings.rings.chromosomeInnerRadius,this.settings.rings.chromosomeWidth,this.reference.chromosomes);const r=new Mt(e.nonExonicInnerRadius,this.settings.rings.nonExonicRingWidth,this.sampleName,this.reference);const l=r.map(e.nonExonicSnvData);if(l.length>0){this.nonExonicArcRing=new rt(e.nonExonicInnerRadius,this.settings.rings.nonExonicRingWidth,l)}this.snvArcsMapper=new ht(e.snvInnerRadius,this.settings.rings.snvRingWidth,this.sampleName,this.reference);const c=this.snvArcsMapper.map(e.snvRingDataMap);if(c.length>0){this.snvArcRing=new rt(e.snvInnerRadius,this.settings.rings.snvRingWidth,c)}const h=new Rt(e.lohInnerRadius,this.settings.rings.lohRingWidth,this.sampleName,this.reference);const d=h.map(e.lohData);if(d.length>0){this.lohArcRing=new rt(e.lohInnerRadius,this.settings.rings.lohRingWidth,d)}this.cnvArcsMapper=new mt(e.cnvInnerRadius,this.settings.rings.cnvRingWidth,this.settings,this.sampleName,this.reference,e.percentilePositive,e.percentileNegative,e.cappedCnvMaxAbsValue,e.cnvMaxPercentileAbs,this.settings.cnv.unit,this.settings.Disco.cnvRenderingType);const p=this.cnvArcsMapper.map(e.cnvData);if(p.length>0){this.cnvArcRing=new rt(e.cnvInnerRadius,this.settings.rings.cnvRingWidth,p)}const u=new st(e.fusionRadius,this.sampleName,this.reference);const g=u.map(e.fusionData);let m;if(this.settings.legend.lohLegendEnabled&&e.lohMinValue&&e.lohMaxValue){m=new it(e.lohMinValue,e.lohMaxValue)}const f=new Z(this.settings.legend.snvTitle,this.settings.legend.cnvTitle,this.settings.legend.lohTitle,this.settings.legend.fusionTitle,this.snvArcsMapper?this.snvArcsMapper.snvClassMap:new Map,this.cnvArcsMapper?this.cnvArcsMapper.cnvClassMap:new Map,this.settings.Disco.cnvRenderingType,g.length>0,m);const v=new bt(a,o,this.nonExonicArcRing,this.snvArcRing,this.cnvArcRing,this.lohArcRing);return new ot(this.settings,v,f,g,e,this.genesetName,t.filter((t=>t.dt==n)).length)}}class yt{constructor(t){this.settings=t}map(t){var e,s;const n=t.args.chromosomes;const i=t.args.genome.majorchr;const a=t.args.sampleName;const o=t.args.genome;const r=((e=o===null||o===void 0?void 0:o.geneset)===null||e===void 0?void 0:e[0])?o.geneset[0].lst:[];const l=((s=o===null||o===void 0?void 0:o.geneset)===null||s===void 0?void 0:s[0])?o.geneset[0].name:"";const c=t.args.data;const h=new K(this.settings,i,n);const d=new Y(this.settings,h,a,r);return new Ct(this.settings,d,h,a,l).map(c)}}yt.snvClassLayer={M:"exonic",E:"exonic",F:"exonic",N:"exonic",S:"exonic",D:"exonic",I:"exonic",P:"exonic",L:"exonic",Utr3:"exonic",Utr5:"exonic",ProteinAltering:"exonic",mnv:"non-exonic",ITD:"non-exonic",insertion:"non-exonic",deletion:"non-exonic",Intron:"non-exonic",X:"non-exonic",noncoding:"non-exonic"};class wt{constructor(t){this.cappedCnvMaxAbsValue=t}map(t){const e=[];let s=0;if(t.snvClassMap){this.mapSnv(t,e,s++)}if(t.cnvRenderingType==ut.heatmap){this.mapCnvHeatmap(t,e,s++)}else if(t.cnvRenderingType==ut.bar){if(t.cnvClassMap){this.mapCnvBar(t,e,s++)}}if(t.lohLegend){this.mapLoh(t,e,s++)}if(t.fusionLegend){this.mapFusion(t,e,s++)}return e}mapSnv(t,e,s){const n=[];let i=0;for(const[e,s]of t.snvClassMap){n.push({termid:t.snvTitle,key:e,text:`${s.snvType} (${s.count})`,color:s.color,order:i++,border:"1px solid #ccc"})}e.push({name:t.snvTitle,order:s,items:n})}mapCnvBar(t,e,s){if(!t.cnvClassMap)return;const n=t.cnvClassMap.get(pt.Gain);const i=t.cnvClassMap.get(pt.Loss);const a=t.cnvClassMap.get(pt.Cap);if(n&&i&&a){let o=0;const r=[];if(n.value>0){r.push({termid:t.cnvTitle,key:pt.Gain,text:`Max: ${n.value}`,color:n.color,order:o++,border:"1px solid #ccc"})}if(i.value<0){r.push({termid:t.cnvTitle,key:pt.Loss,text:`Min: ${i.value}`,color:i.color,order:o++,border:"1px solid #ccc"})}r.push({termid:t.cnvTitle,key:pt.Cap,text:`Capping: ${a.value}`,color:a.color,order:o++,border:"1px solid #ccc"});e.push({name:t.cnvTitle,order:s,items:r})}}mapCnvHeatmap(t,e,s){if(!t.cnvClassMap)return;const n=t.cnvClassMap.get(pt.Gain);const i=t.cnvClassMap.get(pt.Loss);const a=t.cnvClassMap.get(pt.Cap);if(n&&i&&a){let o=0;const r=[];if(n.value>0){r.push({termid:t.cnvTitle,key:pt.Gain,text:"Copy number gain",width:100,domain:[0,1],minLabel:0,maxLabel:n.value,order:o++,isLegendItem:true,dt:4,scale:c([0,1],["white",n.color])})}if(i.value<0){r.push({termid:t.cnvTitle,key:pt.Loss,text:"Copy number loss",width:100,domain:[0,1],minLabel:0,maxLabel:i.value,order:o++,isLegendItem:true,dt:4,scale:c([0,1],["white",i.color])})}r.push({termid:t.cnvTitle,key:pt.Cap,text:`Capping: ${a.value}`,color:a.color,order:o++,border:"1px solid #ccc"});e.push({name:t.cnvTitle,order:s,items:r})}}mapLoh(t,e,s){if(!t.lohLegend)return;const n=[];n.push({termid:t.lohTitle,key:"min",text:"min",color:t.lohLegend.colorStartValue,order:0,border:"1px solid #ccc"});n.push({termid:t.lohTitle,key:"max",text:"max",color:t.lohLegend.colorEndValue,order:1,border:"1px solid #ccc"});e.push({name:t.lohTitle,order:s,items:n})}mapFusion(t,e,s){const n=[];n.push({termid:t.fusionTitle,key:_.Interchromosomal,text:"Interchromosomal",color:_.Interchromosomal.valueOf(),order:0,border:"1px solid #ccc"});n.push({termid:t.fusionTitle,key:_.Intrachromosomal,text:"Intrachromosomal",color:_.Intrachromosomal.valueOf(),order:1,border:"1px solid #ccc"});e.push({name:t.fusionTitle,order:s,items:n})}}class It{constructor(t=0,e){this.fontSize=e;this.legendJSONMapper=new wt(t)}render(t,e,s,n,i){const a=v({holder:t.append("g").attr("data-testid","sjpp_disco_plot_legend"),rectFillFxn:t=>t.color,iconStroke:"#aaa"});const o={xOffset:s};const r=this.legendJSONMapper.map(e);a(r,{settings:Object.assign({},{svgw:n,svgh:i,dimensions:o,fontsize:this.fontSize})})}}class Lt{constructor(t,e,s){this.padAngle=t;this.innerRadius=e;this.outerRadius=s}render(t,e){const s=W().padAngle(this.padAngle).value((t=>t.size)).sort(null);const n=s(e);const i=g().innerRadius(this.innerRadius).outerRadius(this.outerRadius);const a=t.append("g").attr("data-testid","sjpp_chromosomes_arc_group");a.selectAll("path").data(n).enter().append("path").attr("d",i).attr("fill","black");a.selectAll("text").data(n).enter().append("text").attr("transform",(t=>`translate(${i.centroid(t)}) rotate(${t.data.angle*180/Math.PI-90})${t.data.angle>Math.PI?"rotate(180)":""}`)).attr("dy","0.35em").attr("text-anchor","middle").text((t=>t.data.text)).style("fill","white")}}class Dt{constructor(t,e){this.animationDuration=t;this.geneClickListener=e}render(t,e,n){const i=t.append("g");const a=x().x((t=>t.x)).y((t=>t.y));const o=j.create();i.selectAll(".group").data(e).enter().append("g").attr("class","group").each(((t,e,n)=>{const i=h(n[e]);i.append("text").attr("class","chord-text").attr("dy",".35em").attr("transform",t.transform).style("text-anchor",t.textAnchor).style("font-size","12px").style("fill",t.color).style("cursor","pointer").text(t.text).on("click",(()=>{if(t.mutationsTooltip){this.geneClickListener(t.text,t.mutationsTooltip.map((t=>t.mname)))}})).on("mouseover",(e=>{const n=s({holder:o.d});this.createTooltip(n,t);o.show(e.x,e.y)})).on("mouseout",(()=>{o.clear();o.hide()}));i.append("path").attr("class","chord-tick").datum(t.line.points).style("stroke",t.color).style("fill","none").attr("d",a)}));i.selectAll(".group").each(((t,e,s)=>{const i=n?n.find((e=>e.text===t.text)):undefined;if(i){const t=h(s[e]);t.selectAll(".chord-text").datum(i).transition().duration(this.animationDuration).attr("transform",i.transform).style("text-anchor",i.textAnchor);t.selectAll(".chord-tick").datum(i.line.points).transition().duration(this.animationDuration).style("fill","none").attr("d",a)}}))}createTooltip(t,e){if(e.mutationsTooltip){const[s,n]=t.addRow();s.text("Gene");n.append("span").style("margin-left","5px").text(e.text);e.mutationsTooltip.forEach((e=>{{const[s,n]=t.addRow();s.text("Consequence");n.append("span").text(e.mname);n.append("span").style("margin-left","5px").style("color",e.color).text(e.dataClass)}{const[s,n]=t.addRow();s.text("Mutation");n.append("span").text(`${e.chr}:${e.position}`)}}))}if(e.fusionTooltip){const[s,n]=t.addRow();s.text("Data type");n.append("span").text("Fusion transcript");e.fusionTooltip.forEach((e=>{const[s,n]=t.addRow();s.text("Break points");n.append("span").text(` ${e.geneA?e.geneA:""} ${e.chrA}:${e.posA} \n\t\t\t\t\t\t${e.strandA=="+"?"forward":"reverse"} > `+`${e.geneB?e.geneB:""} ${e.chrB}:${e.posB} ${e.strandB=="+"?"forward":"reverse"} `)}))}if(e.cnvTooltip){e.cnvTooltip.forEach((e=>{const[s,n]=t.addRow();s.text("CNV");n.append("span").style("color",e.color).text(e.value).append("span").style("margin-left","5px").text(`${e.chr}:${e.start}-${e.stop}`)}))}}}function Tt(t={}){const e={downloadImgName:"disco.plot",Disco:{cnvCapping:5,isOpen:false,prioritizeGeneLabelsByGeneSets:false,showPrioritizeGeneLabelsByGeneSets:false,cnvRenderingType:ut.heatmap,cnvPercentile:80},rings:{nonExonicRingWidth:20,snvRingWidth:20,lohRingWidth:20,cnvRingWidth:30,snvRingFilters:["exonic"],chromosomeInnerRadius:190,chromosomeWidth:20,labelLinesInnerRadius:210,labelsToLinesDistance:30,labelsToLinesGap:2,nonExonicRingEnabled:true,nonExonicFilterValues:["non-exonic"]},verticalPadding:70,horizontalPadding:500,layerScaler:1,padAngle:.002,label:{fontSize:12,maxDeltaAngle:.05,animationDuration:1e3,overlapAngleFactor:5},cnv:{capping:5,ampColor:"#D6683C",lossColor:"#67a9cf",cappedAmpColor:"#8B0000",cappedLossColor:"#00008B",unit:"Unit"},snv:{maxMutationCount:1e4},legend:{snvTitle:"SNV",cnvTitle:"CNV",lohTitle:"LOH",fusionTitle:"SV",lohLegendEnabled:true,fontSize:12,rowHeight:48},menu:{padding:5}};return d(e,t)}class Pt{constructor(t){this.geneClickListener=t}render(t,e){const i=g();const a=t.append("g");const o=j.create();a.selectAll("path").data(e).enter().append("path").attr("d",(t=>i(t))).attr("fill",(t=>t.color)).on("mouseover",((t,e)=>{const i=s({holder:o.d});const a=structuredClone(e);a.dt=n;a.class=e.dataClass;a.gene=a.text;{const[t,e]=i.addRow();t.text("Consequence");e.append("span").text(a.mname);e.append("span").style("margin-left","5px").style("color",a.color).style("font-size",".8em").text(a.dataClass)}{const[t,e]=i.addRow();t.text(a.ref&&a.alt?"Mutation":"Position");e.append("span").text(`${a.chr}:${a.pos+1} ${a.ref&&a.alt?a.ref+">"+a.alt:""}`)}if(a.gene){const[t,e]=i.addRow();t.text("Gene");e.text(a.gene)}if(a.occurrence>1){const[t,e]=i.addRow();t.text("Occurrence");e.text(a.occurrence)}o.show(t.x,t.y)})).on("mouseout",(()=>{o.clear();o.hide()})).on("click",((t,e)=>{this.geneClickListener(e.text,[e.mname])}))}}class Ot{constructor(t,e){this.svnWidth=t;this.geneClickListener=e}render(t,e){if(e.length>0){const s=e[0].innerRadius;const n=new F(s,this.svnWidth,"#6464641A");n.render(t)}const i=g();const a=t.append("g");const o=j.create();a.selectAll("path").data(e).enter().append("path").attr("d",(t=>i(t))).attr("fill",(t=>t.color)).on("mouseover",((t,e)=>{const i=s({holder:o.d});const a=structuredClone(e);a.dt=n;a.class=e.dataClass;a.gene=a.text;{const[t,e]=i.addRow();t.text("Consequence");e.append("span").text(a.mname);e.append("span").style("margin-left","5px").style("color",a.color).style("font-size",".8em").text(a.dataClass)}{const[t,e]=i.addRow();t.text(a.ref&&a.alt?"Mutation":"Position");e.append("span").text(`${a.chr}:${a.pos+1} ${a.ref&&a.alt?a.ref+">"+a.alt:""}`)}if(a.gene){const[t,e]=i.addRow();t.text("Gene");e.text(a.gene)}if(a.occurrence>1){const[t,e]=i.addRow();t.text("Occurrence");e.text(a.occurrence)}o.show(t.x,t.y)})).on("mouseout",(()=>{o.clear();o.hide()})).on("click",((t,e)=>{this.geneClickListener(e.text,[e.mname])}))}}class Nt{render(t,e){const n=g();const i=t.append("g");const a=j.create();i.selectAll("path").data(e).enter().append("path").attr("d",(t=>n(t))).attr("fill",(t=>t.color)).on("mouseover",((t,e)=>{const n=s({holder:a.d});const i=structuredClone(e);i.dt=r;i.gene=i.text;{const[t,e]=n.addRow();t.text("Data type");e.append("span").style("margin-left","5px").text("Loss of Heterozygosity")}const[o,l]=n.addRow();o.text("Position");l.append("span").text(`${e.chr}:${e.start}-${e.stop}`);a.show(t.x,t.y)})).on("mouseout",(()=>{a.clear();a.hide()}))}}class Et{render(t,e){const n=g();const i=t.append("g");const a=j.create();i.selectAll("path").data(e).enter().append("path").attr("d",(t=>n(t))).attr("fill",(t=>t.color)).on("mouseover",((t,e)=>{const n=structuredClone(e);n.dt=o;n.samples=[{sample_id:e.sampleName}];n.gene=n.text;const i=s({holder:a.d});{const[t,e]=i.addRow();t.text("Copy number change");e.html(`<span style="background:${n.color}"> </span> ${n.value}`)}{const[t,e]=i.addRow();t.text("Position");e.text(n.chr+":"+n.start+"-"+n.stop)}{const[t,e]=i.addRow();t.text("Unit");e.text(n.value)}a.show(t.x,t.y)})).on("mouseout",(()=>{a.clear();a.hide()}))}}class Vt{constructor(t=0,e=0){this.positivePercentile80=t;this.negativePercentile80=e}render(t,e){const n=g();const i=t.append("g");const a=j.create();i.selectAll("path").data(e).enter().append("path").attr("d",(t=>n(t))).attr("fill",(t=>c([this.negativePercentile80,0,this.positivePercentile80],[t.color,"white",t.color]).clamp(true)(t.value))).on("mouseover",((t,e)=>{const n=s({holder:a.d});const i=structuredClone(e);i.dt=o;i.samples=[{sample_id:e.sampleName}];i.gene=i.text;{const[t,e]=n.addRow();t.text("Copy number change");e.html(`<span style="background:${i.color}"> </span> ${i.value}`)}{const[t,e]=n.addRow();t.text("Position");e.text(i.chr+":"+i.start+"-"+i.stop)}{const[t,e]=n.addRow();t.text("Unit");e.text(i.value)}a.show(t.x,t.y)})).on("mouseout",(()=>{a.clear();a.hide()}))}}class St{constructor(t){this.recreateViewModel=false;this.type="Disco";this.opts=t;this.isOpen=false;this.discoInteractions=new X(this)}init(){return t(this,void 0,void 0,(function*(){const t=this.app.getState();const e=t.plots.find((t=>t.id===this.id)).settings;this.stateViewModelMapper=new yt(e);this.viewModel=this.stateViewModelMapper.map(t);const s=this.opts.holder;const n=s.append("div").style("display","inline-block").style("vertical-align","top");const i=n.append("div");const a=n.append("div");const o=this.getConfigInputsOptions(this.viewModel);this.features=yield u({topbar:R({app:this.app,id:this.id,downloadHandler:()=>this.discoInteractions.downloadClickListener(s.select('svg[id="sjpp_disco_plot"]').node()),callback:()=>this.toggleVisibility(this.isOpen),isOpen:()=>this.isOpen,holder:i}),config:b({app:this.app,id:this.id,holder:a,isOpen:()=>this.isOpen,inputs:o})})}))}getConfigInputsOptions(t){const e=[];if(t.settings.Disco.showPrioritizeGeneLabelsByGeneSets){const s=[{boxLabel:t.genesetName,label:`Filter mutations`,type:"checkbox",chartType:"Disco",settingsKey:"prioritizeGeneLabelsByGeneSets",title:`Only show mutations for ${t.genesetName} genes`}];e.push(...s)}const s=[{label:"CNV capping",type:"number",chartType:"Disco",settingsKey:"cnvCapping",title:"Cnv capping",min:0},{boxLabel:"",label:"CNV rendering type",type:"radio",chartType:"Disco",settingsKey:"cnvRenderingType",title:"CNV rendering type",options:[{label:"Heatmap",value:ut.heatmap},{label:"Bar",value:ut.bar}]},{label:"CNV percentile",type:"number",chartType:"Disco",settingsKey:"cnvPercentile",title:"Cnv percentile",min:1,max:100}];e.push(...s);return e}main(){return t(this,void 0,void 0,(function*(){const t=this.state.settings;this.isOpen=t.Disco.isOpen;if(this.recreateViewModel){this.stateViewModelMapper=new yt(t);this.viewModel=this.stateViewModelMapper.map(this.app.getState())}this.recreateViewModel=true;if(this.viewModel){const e=this.opts.holder;e.select('div[id="sjpp_disco_plot_holder_div"]').remove();const s=e.append("div").attr("id","sjpp_disco_plot_holder_div").style("display","inline-block");const n=this.app.getState();for(const t in this.features){this.features[t].update({state:this.state,appState:n})}const i=new It(this.viewModel.cappedCnvMaxAbsValue,t.label.fontSize);const a=new q(this.getRingRenderers(t,this.viewModel,this.discoInteractions.geneClickListener),i);a.render(s,this.viewModel)}}))}getState(t){return t.plots.find((t=>t.id===this.id))}getRingRenderers(t,e,s){const n=new Lt(t.padAngle,t.rings.chromosomeInnerRadius,t.rings.chromosomeInnerRadius+t.rings.chromosomeWidth);const i=new Dt(t.label.animationDuration,s);const a=new Pt(s);const o=new Ot(t.rings.snvRingWidth,s);const r=t.Disco.cnvRenderingType===ut.heatmap?new Vt(e.positivePercentile80,e.negativePercentile80):new Et;const l=new Nt;const c=new Map;c.set(at.CHROMOSOME,n);c.set(at.LABEL,i);c.set(at.NONEXONICSNV,a);c.set(at.SNV,o);c.set(at.CNV,r);c.set(at.LOH,l);return c}toggleVisibility(t){this.app.dispatch({type:"plot_edit",id:this.opts.id,config:{settings:{Disco:{isOpen:!t}}}})}}const zt=p(St);const Bt=zt;function Gt(e){return t(this,void 0,void 0,(function*(){return{chartType:"Disco",subfolder:"disco",extension:"ts",settings:Tt(e.overrides)}}))}export{Bt as componentInit,zt as discoInit,Gt as getPlotConfig};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{_ as t}from"./tslib.es6-c3c2d88f.js";import{m as e,a as l,b as n,c as i,f as a,e as o}from"./uiUtils-f1bd2bcc.js";import{T as s}from"./toggleButtons-dbdbad01.js";import{y as p,aT as c}from"./app-b369b169.js";import{launch as d}from"./launch.adhoc-abca6af3.js";import"./plot.app-30c4b8e5.js";import"./recover-49e09de0.js";import"./termsetting-33ea66f1.js";import"path";import"./FilterRxComp-701a1480.js";import"./table-29d5a973.js";import"./partjson.esm-b3f1fc21.js";import"./termdb.bins-8b656cc3.js";import"./FilterStateless-54c0b763.js";import"./app-3320ab6f.js";import"./termInfo-bf99a37e.js";import"./genesearch-a4e19f0d.js";import"./checkbox-96437f4d.js";import"./rehydrateFilter-12d118cb.js";function r(t,n,i){const a=t.append("div").style("margin","20px 20px 20px 40px").style("font-family","'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif").style("place-items","center left").style("overflow","hidden").classed("sjpp-app-ui",true).classed("sjpp-disco-ui",true);const o={data:[]};e(a,"Select Genome").style("font-size","1.15em").style("padding","10px 0px").style("color","#003366");m(a,n,o);e(a,"Provide Data").style("font-size","1.15em").style("padding","10px 0px 5px 0px").style("color","#003366");a.append("div").style("opacity",.75).style("padding","10px 10px 15px 20px").style("width","65vw").style("line-height","1.5em").html('<p>The plot accepts multiple data types. Input fields for each data type are available in the tabs below. Upload a file or paste data in at least one data type tab and click "Create Disco Plot". <a href="https://proteinpaint.stjude.org/ppdemo/hg38/disco/discoDemoData.tar.gz" target="Demo data">Download example files</a></p>');const s=a.append("div").style("margin-left","2vw");y(s,o);const p=a.append("div").style("display","flex").style("align-items","center").style("padding","15px 0px");h(p,o,n,a,t);l(p,o,".disco_input");if(i)window["doms"]=o;return o}function m(t,e,l){const i=t.append("div").style("margin-left","40px");const a=n(i,e).style("border","1px solid rgb(138, 177, 212)");l.genome=a.node()}function y(e,l){const n=[{label:"SNV Indel",active:true,callback:(e,n)=>t(this,void 0,void 0,(function*(){n.key="snv";const t=`<ol>\n\t\t\t\t\t<li>chr</li>\n\t\t\t\t\t<li>position</li>\n\t\t\t\t\t<li>gene</li>\n\t\t\t\t\t<li>aachange</li>\n\t\t\t\t\t<li>class</li></ol>\n\t\t\t\t\t<p>Example:</p>\n<pre style="margin-left: 10px;">\nchr1\t226252135\tH3F3A\tK28M\tM\nchr2\t98765432\tTestGene\tTestMutation\tF\n</pre>`;f(n,l,t)}))},{label:"SV",active:false,callback:(e,n)=>t(this,void 0,void 0,(function*(){n.key="sv";const t=`<ol>\n\t\t\t\t\t<li>chrA</li>\n\t\t\t\t\t<li>posA</li>\n\t\t\t\t\t<li>geneA (optional)</li>\n\t\t\t\t\t<li>chrB</li>\n\t\t\t\t\t<li>posB</li>\n\t\t\t\t\t<li>geneB (optional)</li>\n\t\t\t\t</ol>\n\t\t\t\t<p>Example (with genes):</p>\n<pre style="margin-left: 10px;">\nchr6\t3067605\tMDC1\tchr12\t61521661\tKMT2D\n</pre>\n\t\t\t\t<p>Example (without genes):</p>\n<pre style="margin-left: 10px;">\nchr6\t3067605\tchr12\t61521661\n</pre>`;f(n,l,t)}))},{label:"CNV",active:false,callback:(e,n)=>t(this,void 0,void 0,(function*(){n.key="cnv";const t=`<ol>\n\t\t\t\t<li>chr</li>\n\t\t\t\t<li>start</li>\n\t\t\t\t<li>stop</li>\n\t\t\t\t<li>value</li>\n\t\t\t\t</ol>\n\t\t\t\t<p>Example:</p>\n<pre style="margin-left: 10px;">\nchr1\t1\t100000000\t0.5\nchr1\t100000000\t200000000\t-0.5\n</pre>`;f(n,l,t)}))}];new s({holder:e,tabs:n,tabsPosition:"vertical",linePosition:"right"}).main()}function f(t,e,l){t.contentHolder.style("border","none").style("display","block").style("padding-left","30px");b(t,e);t.contentHolder.append("div").style("padding","15px 0px 0px 10px").style("opacity",.75).text(`Provide ${t.label} data in tab delimited format with the following columns:`).append("span").html(l);delete t.callback}function b(e,l){const n=95;const i=[{label:"Select File",active:true,width:n,callback:(n,i)=>t(this,void 0,void 0,(function*(){const t=e.key;i.contentHolder.style("border","none").style("display","block");c(i.contentHolder);i.contentHolder.append("div").style("padding","0px 0px 5px 15px").style("opacity",.65).text(`Select a local file`);x(i,l,t);delete i.callback}))},{label:"Paste Data",active:false,width:n,callback:(n,i)=>t(this,void 0,void 0,(function*(){const t=e.key;i.contentHolder.style("border","none").style("display","block");c(i.contentHolder);u(i,l,t);delete i.callback}))}];new s({holder:e.contentHolder,tabs:i}).main()}function x(t,e,l){const n=t.contentHolder.append("div").style("display","inline-block");const i=a(n).classed("disco_input",true);i.on("change",(t=>{const n=t.target.files[0];const i=new FileReader;i.onload=t=>{e.data[l+"Text"]=t.target.result};i.readAsText(n,"utf8")}))}function u(e,l,n){const i=e.contentHolder.append("div").style("display","block");const a=o({div:i,cols:50}).style("border","1px solid rgb(138, 177, 212)").style("margin","0px 0px 0px 20px").classed("disco_input",true).on("keyup",(()=>t(this,void 0,void 0,(function*(){l.data[n+"Text"]=a.property("value").trim()}))))}function h(t,e,l,n,a){const o=i({div:t,text:"Create Disco Plot"});const s=t.append("div");o.style("margin-right","10px").style("font-size","16px").classed("sjpp-ui-submitBtn",true).attr("type","submit").on("click",(()=>{if(!e.data||e.data==undefined){const t=s.append("div").style("display","inline-block").style("max-width","20vw");p(t,"Please provide data");setTimeout((()=>t.remove()),2e3)}else{const t=l[e.genome.options[e.genome.selectedIndex].text];n.remove();d(e.data,t,a);v(a,l)}}))}function v(t,e){t.append("button").html("« Back").on("click",(()=>{t.selectAll("*").remove();r(t,e,false)}))}export{r as init_discoplotUI};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as e,R as t,V as n,a as r,M as o,E as i}from"./sampleScatter.rendererThree-
|
|
1
|
+
import{P as e,R as t,V as n,a as r,M as o,E as i}from"./sampleScatter.rendererThree-0b12ac61.js";import"./app-b369b169.js";const s=new e;const a=new t;const c=new n;const l=new r;const p=new r;const u=new r;const d=new o;class f extends i{constructor(e,t,n){super();n.style.touchAction="none";let r=null,o=null;const i=[];const f=this;function m(){n.addEventListener("pointermove",E);n.addEventListener("pointerdown",g);n.addEventListener("pointerup",j);n.addEventListener("pointerleave",j)}function v(){n.removeEventListener("pointermove",E);n.removeEventListener("pointerdown",g);n.removeEventListener("pointerup",j);n.removeEventListener("pointerleave",j);n.style.cursor=""}function h(){v()}function y(){return e}function b(){return a}function E(m){if(f.enabled===false)return;x(m);a.setFromCamera(c,t);if(r){if(a.ray.intersectPlane(s,p)){r.position.copy(p.sub(l).applyMatrix4(d))}f.dispatchEvent({type:"drag",object:r});return}if(m.pointerType==="mouse"||m.pointerType==="pen"){i.length=0;a.setFromCamera(c,t);a.intersectObjects(e,true,i);if(i.length>0){const e=i[0].object;s.setFromNormalAndCoplanarPoint(t.getWorldDirection(s.normal),u.setFromMatrixPosition(e.matrixWorld));if(o!==e&&o!==null){f.dispatchEvent({type:"hoveroff",object:o});n.style.cursor="auto";o=null}if(o!==e){f.dispatchEvent({type:"hoveron",object:e});n.style.cursor="pointer";o=e}}else{if(o!==null){f.dispatchEvent({type:"hoveroff",object:o});n.style.cursor="auto";o=null}}}}function g(o){if(f.enabled===false)return;x(o);i.length=0;a.setFromCamera(c,t);a.intersectObjects(e,true,i);if(i.length>0){r=f.transformGroup===true?e[0]:i[0].object;s.setFromNormalAndCoplanarPoint(t.getWorldDirection(s.normal),u.setFromMatrixPosition(r.matrixWorld));if(a.ray.intersectPlane(s,p)){d.copy(r.parent.matrixWorld).invert();l.copy(p).sub(u.setFromMatrixPosition(r.matrixWorld))}n.style.cursor="move";f.dispatchEvent({type:"dragstart",object:r})}}function j(){if(f.enabled===false)return;if(r){f.dispatchEvent({type:"dragend",object:r});r=null}n.style.cursor=o?"pointer":"auto"}function x(e){const t=n.getBoundingClientRect();c.x=(e.clientX-t.left)/t.width*2-1;c.y=-(e.clientY-t.top)/t.height*2+1}m();this.enabled=true;this.transformGroup=false;this.activate=m;this.deactivate=v;this.dispose=h;this.getObjects=y;this.getRaycaster=b}}export{f as DragControls};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{_ as e}from"./tslib.es6-
|
|
1
|
+
import{_ as e}from"./tslib.es6-c3c2d88f.js";import{h as t}from"./app-b369b169.js";import{c as i,a as n}from"./_commonjsHelpers-318dc0aa.js";var r=i((function(e){
|
|
2
2
|
//! openseadragon 4.1.1
|
|
3
3
|
//! Built on 2024-04-01
|
|
4
4
|
//! Git commit: v4.1.1-0-f90d9814
|