@sjcrh/proteinpaint-client 2.63.0 → 2.63.2
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/README.md +9 -7
- package/dist/{2dmaf-70c0b6bb.js → 2dmaf-0cabb4a4.js} +1 -1
- package/dist/{ColorScale-b44d51ef.js → ColorScale-9800a609.js} +1 -1
- package/dist/{DEanalysis-b86d0874.js → DEanalysis-567989ff.js} +1 -1
- package/dist/{Disco-16cd51c0.js → Disco-5d1404ce.js} +1 -1
- package/dist/{Disco.UI-a38a12e6.js → Disco.UI-54228bb6.js} +1 -1
- package/dist/{DragControls-0c173a20.js → DragControls-a05737c2.js} +1 -1
- package/dist/{DziViewer-5c2d68e7.js → DziViewer-3f466d90.js} +2 -2
- package/dist/{FilterRxComp-0e75dd8d.js → FilterRxComp-fc769f34.js} +1 -1
- package/dist/{FilterStateless-ad3df967.js → FilterStateless-8f30f856.js} +1 -1
- package/dist/{HicApp-bcf8330c.js → HicApp-aac413df.js} +1 -1
- package/dist/{OrbitControls-c33cf781.js → OrbitControls-8b7f91ca.js} +1 -1
- package/dist/app-59194db0.js +1 -0
- package/dist/{app-f91922b4.js → app-71453429.js} +1 -1
- package/dist/{app-bfce9bf5.js → app-fb676934.js} +1 -1
- package/dist/app.js +1 -1
- package/dist/{bam-95f36008.js → bam-e7f6baea.js} +1 -1
- package/dist/{barchart-e2af00a8.js → barchart-ef4874c8.js} +1 -1
- package/dist/{barchart.events-272fd122.js → barchart.events-e24facf7.js} +1 -1
- package/dist/{bars.renderer-f0e5af5a.js → bars.renderer-c46d3f44.js} +1 -1
- package/dist/{block-ec76524e.js → block-4f585abe.js} +1 -1
- package/dist/block.lazyload-6f83d057.js +1 -0
- package/dist/{block.legend-f8cad7e4.js → block.legend-cec87c6f.js} +1 -1
- package/dist/{block.mds-20655637.js → block.mds-f5a11c42.js} +1 -1
- package/dist/{block.mds.cnv-5feb86a0.js → block.mds.cnv-25423c1e.js} +1 -1
- package/dist/{block.mds.expressionrank-c7043f35.js → block.mds.expressionrank-fc1996d5.js} +1 -1
- package/dist/{block.mds.expressionstat-4bf457f3.js → block.mds.expressionstat-45b6bf47.js} +1 -1
- package/dist/{block.mds.geneboxplot-132e5fe6.js → block.mds.geneboxplot-037df46d.js} +1 -1
- package/dist/{block.mds.junction-1f9810df.js → block.mds.junction-00161de6.js} +1 -1
- package/dist/{block.mds.svcnv-094c416f.js → block.mds.svcnv-0c257af4.js} +1 -1
- package/dist/{block.mds.svcnv.share-bb976e02.js → block.mds.svcnv.share-c0b9dfad.js} +1 -1
- package/dist/{block.mds2-7045e32c.js → block.mds2-9009f8d8.js} +1 -1
- package/dist/{block.svg-d8d76ba7.js → block.svg-86bbfcb0.js} +1 -1
- package/dist/{block.tk.aicheck-317d04bd.js → block.tk.aicheck-a5697794.js} +1 -1
- package/dist/{block.tk.ase-d1577ec1.js → block.tk.ase-ad1be47c.js} +1 -1
- package/dist/{block.tk.bam-3cdc13a0.js → block.tk.bam-14339d16.js} +1 -1
- package/dist/{block.tk.bedgraphdot-5304e06c.js → block.tk.bedgraphdot-efe19e56.js} +1 -1
- package/dist/{block.tk.bigwig.ui-0c96dce5.js → block.tk.bigwig.ui-a92f286b.js} +1 -1
- package/dist/{block.tk.hicstraw-39d89269.js → block.tk.hicstraw-57fbbe61.js} +1 -1
- package/dist/{block.tk.junction-b45b3a95.js → block.tk.junction-64c39cd5.js} +1 -1
- package/dist/{block.tk.junction.textmatrixui-6ec019e1.js → block.tk.junction.textmatrixui-09e5e02f.js} +1 -1
- package/dist/{block.tk.ld-5c54e58b.js → block.tk.ld-f681d099.js} +1 -1
- package/dist/{block.tk.menu-30a2c3a5.js → block.tk.menu-2563364c.js} +1 -1
- package/dist/{block.tk.pgv-7ff2dfaf.js → block.tk.pgv-9dfc00c0.js} +1 -1
- package/dist/{boxplot-7de25274.js → boxplot-a2e1ace0.js} +1 -1
- package/dist/brainImaging-21701238.js +1 -0
- package/dist/{brush-db0ed33a.js → brush-bb4566a3.js} +1 -1
- package/dist/{categorical-bc309399.js → categorical-a00f4ffc.js} +1 -1
- package/dist/{condition-f0eb2343.js → condition-2034db37.js} +1 -1
- package/dist/{controls-8d4972c8.js → controls-0467d2ec.js} +1 -1
- package/dist/{controls.btns-bad9e4cf.js → controls.btns-ad7b28a2.js} +1 -1
- package/dist/{controls.config-e0f394cb.js → controls.config-6cf816fb.js} +1 -1
- package/dist/{controls.divide-d8ac5a9b.js → controls.divide-3c0d52d7.js} +1 -1
- package/dist/{controls.overlay-3ac8773d.js → controls.overlay-3a55c2ec.js} +1 -1
- package/dist/{controls.term1-008f4be4.js → controls.term1-59f4cd60.js} +1 -1
- package/dist/cuminc-8d21132b.js +1 -0
- package/dist/{customdata.inputui-58cd9b32.js → customdata.inputui-40ba6d7f.js} +1 -1
- package/dist/{dataDownload-91da6dd6.js → dataDownload-bfa92dad.js} +1 -1
- package/dist/{databrowser.ui-c50862e4.js → databrowser.ui-4799f04d.js} +1 -1
- package/dist/{density-7c3f91eb.js → density-4c2b53f6.js} +1 -1
- package/dist/{dictionary-48a38837.js → dictionary-89e860ee.js} +1 -1
- package/dist/{drag-c354e2c6.js → drag-88d451b4.js} +1 -1
- package/dist/{e2pca-3bba91fa.js → e2pca-8a3f2566.js} +1 -1
- package/dist/{ep-144d8973.js → ep-5399c5cc.js} +1 -1
- package/dist/{fusion.parse-ae1253f4.js → fusion.parse-fc25e5bd.js} +1 -1
- package/dist/{geneExpClustering-96d09008.js → geneExpClustering-a916ebda.js} +1 -1
- package/dist/{geneExpression-d6494fd3.js → geneExpression-501e95c0.js} +1 -1
- package/dist/{geneExpression-9ca2da4f.js → geneExpression-9047481a.js} +1 -1
- package/dist/{geneExpression-be9b5da2.js → geneExpression-da4b50f0.js} +1 -1
- package/dist/{geneORA-85850143.js → geneORA-ffb2497e.js} +1 -1
- package/dist/{geneVariant-3df05e0c.js → geneVariant-7ab521d6.js} +1 -1
- package/dist/{geneVariant-3d674865.js → geneVariant-d79431a2.js} +1 -1
- package/dist/{genefusion.ui-3e2a3a73.js → genefusion.ui-3ce190c7.js} +1 -1
- package/dist/{geneset-3b761b2c.js → geneset-3522bcda.js} +1 -1
- package/dist/{genomeBrowser-2105a98f.js → genomeBrowser-9b72eb22.js} +1 -1
- package/dist/{genomeBrowser.controls-f9b9bf42.js → genomeBrowser.controls-bef8bf99.js} +1 -1
- package/dist/{groupsetting-4901d033.js → groupsetting-574ad150.js} +1 -1
- package/dist/{hierCluster-a7ff7f5a.js → hierCluster-3b14b2b3.js} +1 -1
- package/dist/{hierCluster.config-3d124abf.js → hierCluster.config-f8686a30.js} +1 -1
- package/dist/{hierCluster.interactivity-3463cc0b.js → hierCluster.interactivity-3b5f1e81.js} +1 -1
- package/dist/{hierCluster.renderers-668d0075.js → hierCluster.renderers-9f9a7cad.js} +1 -1
- package/dist/{html.legend-3e428f9e.js → html.legend-ef8066dd.js} +1 -1
- package/dist/{imagePlot-6d89200c.js → imagePlot-095b9a92.js} +1 -1
- package/dist/{lasso-393c1570.js → lasso-ef63631b.js} +1 -1
- package/dist/{launch.adhoc-9c59874e.js → launch.adhoc-1b356f97.js} +1 -1
- package/dist/{legacyDataset-26ead9cc.js → legacyDataset-056e9d4c.js} +1 -1
- package/dist/{log-4d74231e.js → log-ca1e2a74.js} +1 -1
- package/dist/{lollipop-59f65024.js → lollipop-6ad9ec3c.js} +1 -1
- package/dist/{maf-72e5b7da.js → maf-dfada1c8.js} +1 -1
- package/dist/{maftimeline-ed8aaae8.js → maftimeline-1b715a01.js} +1 -1
- package/dist/{matrix-3d09a31f.js → matrix-3fae58f8.js} +1 -1
- package/dist/matrix.cells-3620eb3a.js +1 -0
- package/dist/{matrix.cluster-acdfc6a7.js → matrix.cluster-15b8a865.js} +1 -1
- package/dist/{matrix.config-cd01ebbd.js → matrix.config-8247bea5.js} +1 -1
- package/dist/{matrix.controls-86eb8d5c.js → matrix.controls-dea65894.js} +1 -1
- package/dist/{matrix.data-e2d7ac16.js → matrix.data-121a1a8c.js} +1 -1
- package/dist/{matrix.dom-e5f91cc0.js → matrix.dom-83c5fa39.js} +1 -1
- package/dist/{matrix.groups-f1969b5c.js → matrix.groups-2e1202ef.js} +1 -1
- package/dist/{matrix.interactivity-92bc8332.js → matrix.interactivity-2b076155.js} +1 -1
- package/dist/{matrix.layout-29a8f334.js → matrix.layout-8dc54c05.js} +1 -1
- package/dist/{matrix.legend-8c28039e.js → matrix.legend-e0078739.js} +1 -1
- package/dist/matrix.renderers-0c8eddc9.js +1 -0
- package/dist/{matrix.serieses-e079f04a.js → matrix.serieses-2898da6b.js} +1 -1
- package/dist/{matrix.sort-e1f83454.js → matrix.sort-249d4a35.js} +1 -1
- package/dist/{matrix.sorterUi-2025f39d.js → matrix.sorterUi-d26208c8.js} +1 -1
- package/dist/{mavb-37fffd68.js → mavb-9a6fa2e9.js} +1 -1
- package/dist/{mds.fimo-68f0eaf5.js → mds.fimo-ce97371c.js} +1 -1
- package/dist/{mds.samplescatterplot-362f3591.js → mds.samplescatterplot-a54b9e93.js} +1 -1
- package/dist/{mds.survivalplot-f5bda05a.js → mds.survivalplot-c5093f73.js} +1 -1
- package/dist/{mdsjsonform-7f0b6cc7.js → mdsjsonform-09b4e1cb.js} +1 -1
- package/dist/metaboliteIntensity-eeb5ad12.js +1 -0
- package/dist/niceNumLabels-ddb76164.js +1 -0
- package/dist/{nodrag-777a34a5.js → nodrag-bed2488c.js} +1 -1
- package/dist/{numeric-2eb8c25b.js → numeric-d5536b1c.js} +1 -1
- package/dist/numeric.binary-d67da945.js +1 -0
- package/dist/numeric.continuous-9a0c88bc.js +1 -0
- package/dist/numeric.discrete-921f7097.js +1 -0
- package/dist/numeric.spline-649308d5.js +1 -0
- package/dist/{numeric.toggle-5316211b.js → numeric.toggle-52789fd2.js} +1 -1
- package/dist/{oncomatrix-cd9fa01b.js → oncomatrix-6950c48c.js} +1 -1
- package/dist/{parseData-1bfa9946.js → parseData-480d1ff3.js} +1 -1
- package/dist/{plot.2dvaf-1ed153c1.js → plot.2dvaf-1ecc4bbc.js} +1 -1
- package/dist/plot.app-c841507a.js +1 -0
- package/dist/{plot.barplot-61742e94.js → plot.barplot-24140b0f.js} +1 -1
- package/dist/{plot.boxplot-fe966ac3.js → plot.boxplot-87fe8ab2.js} +1 -1
- package/dist/{plot.brainImaging-d2c23bb7.js → plot.brainImaging-325ebded.js} +1 -1
- package/dist/{plot.disco-70d493f4.js → plot.disco-621d1b8e.js} +1 -1
- package/dist/{plot.dzi-14e6fdc4.js → plot.dzi-3a7e478e.js} +1 -1
- package/dist/{plot.ssgq-9d364d41.js → plot.ssgq-1949c207.js} +1 -1
- package/dist/{plot.vaf2cov-4d28015b.js → plot.vaf2cov-d03c6409.js} +1 -1
- package/dist/{profileBarchart-c104f8e2.js → profileBarchart-11755d7c.js} +1 -1
- package/dist/{profileHome-a555583d.js → profileHome-9c5e266b.js} +1 -1
- package/dist/{profilePlot-5ce5b6a0.js → profilePlot-8ee3034a.js} +1 -1
- package/dist/{profilePolar-610213d4.js → profilePolar-9fe70c32.js} +1 -1
- package/dist/{profileRadar-fddb18f7.js → profileRadar-0e744181.js} +1 -1
- package/dist/{profileRadarFacility-2c2db1dd.js → profileRadarFacility-102544c5.js} +1 -1
- package/dist/{recover-a08c8d01.js → recover-b1ec4fed.js} +1 -1
- package/dist/{regression.inputs-5718cf72.js → regression.inputs-ad548745.js} +1 -1
- package/dist/{regression.inputs.values.table-d587c1cf.js → regression.inputs.values.table-1618447a.js} +1 -1
- package/dist/{regression.results-748024be.js → regression.results-25008028.js} +1 -1
- package/dist/{renderPvalueTable-c435aefd.js → renderPvalueTable-46056189.js} +1 -1
- package/dist/sampleScatter-47dd82cb.js +1 -0
- package/dist/{sampleScatter.interactivity-e9c30652.js → sampleScatter.interactivity-cfa3451d.js} +1 -1
- package/dist/{sampleScatter.rendererThree-3e6c032e.js → sampleScatter.rendererThree-c5321d24.js} +2 -2
- package/dist/{sampleView-d6a91293.js → sampleView-30b97c7d.js} +1 -1
- package/dist/{samplelst-821ec148.js → samplelst-2bdc1b9d.js} +1 -1
- package/dist/{samplematrix-7aa0a780.js → samplematrix-4f0ec523.js} +1 -1
- package/dist/{scatter-2e2c76f4.js → scatter-8a337eeb.js} +1 -1
- package/dist/{selectGenomeWithTklst-51cd21a4.js → selectGenomeWithTklst-895106fb.js} +1 -1
- package/dist/{singleCellPlot-c7347a27.js → singleCellPlot-360eaec6.js} +1 -1
- package/dist/{singlecell-a668bb17.js → singlecell-29c1cbb1.js} +1 -1
- package/dist/{singlecell-7c851ef8.js → singlecell-75f8af89.js} +1 -1
- package/dist/{snplocus-fe6f4ba1.js → snplocus-0cafa73c.js} +1 -1
- package/dist/{snplst-751cea95.js → snplst-2284d5ce.js} +1 -1
- package/dist/{spliceevent.a53ss.diagram-b157f95d.js → spliceevent.a53ss.diagram-44ccabf9.js} +1 -1
- package/dist/{spliceevent.exonskip.diagram-071a3467.js → spliceevent.exonskip.diagram-c8d1bdf0.js} +1 -1
- package/dist/spliceevent.exonskip.getdefault-9fe16119.js +1 -0
- package/dist/{spliceevent.noeventdiagram-1c731f35.js → spliceevent.noeventdiagram-5e244090.js} +1 -1
- package/dist/{spliceevent.phrase-7a3bfb00.js → spliceevent.phrase-186eb050.js} +1 -1
- package/dist/{stattable-a7713026.js → stattable-886f7dad.js} +1 -1
- package/dist/{style.gdc-40ec2784.js → style.gdc-4ac9b96b.js} +1 -1
- package/dist/{summary-592d8f81.js → summary-ee2045a5.js} +1 -1
- package/dist/{sunburst-452df940.js → sunburst-bbff8818.js} +1 -1
- package/dist/survival-04e279f8.js +1 -0
- package/dist/{survival-450b6df4.js → survival-d7bd3c6b.js} +1 -1
- package/dist/{svg.download-56529955.js → svg.download-54c99186.js} +1 -1
- package/dist/{svg.legend-c82b153f.js → svg.legend-28652faa.js} +1 -1
- package/dist/{svgraph-3c5cd8d2.js → svgraph-a12d89da.js} +1 -1
- package/dist/{svmr-3dd531ef.js → svmr-248055c8.js} +1 -1
- package/dist/{table-d6c411fd.js → table-1dae543a.js} +1 -1
- package/dist/{table-bf604c50.js → table-b4a61573.js} +1 -1
- package/dist/{termInfo-96285f4a.js → termInfo-4c759483.js} +1 -1
- package/dist/{termsetting-9a7511e6.js → termsetting-636d2271.js} +1 -1
- package/dist/{tk-6a8e5bb0.js → tk-741d4674.js} +1 -1
- package/dist/{tp.ui-221efed6.js → tp.ui-23151bb1.js} +1 -1
- package/dist/{tvs.density-9fdae0cc.js → tvs.density-9fe0c7fd.js} +1 -1
- package/dist/{tvs.geneVariant-149e25b7.js → tvs.geneVariant-1b179327.js} +1 -1
- package/dist/tvs.numeric-b4cfc975.js +1 -0
- package/dist/{tvs.samplelst-a38e9c2b.js → tvs.samplelst-681358bc.js} +1 -1
- package/dist/{uiUtils-a6de7f14.js → uiUtils-74700a01.js} +1 -1
- package/dist/{variantBrowser-05375469.js → variantBrowser-910b4bcd.js} +1 -1
- package/dist/{vcf-58904308.js → vcf-16ba1e06.js} +1 -1
- package/dist/{violin-c1b78717.js → violin-a41b2e2b.js} +1 -1
- package/dist/{violin.interactivity-534d6993.js → violin.interactivity-bcf0ccc2.js} +1 -1
- package/dist/{violin.renderer-16540fb8.js → violin.renderer-149310eb.js} +1 -1
- package/dist/{violinRenderer-688abcb2.js → violinRenderer-71c9f3ab.js} +1 -1
- package/dist/{viridis-d3cf2713.js → viridis-81de7bcd.js} +1 -1
- package/dist/{y-2d48b9e4.js → y-76c7da8c.js} +1 -1
- package/dist/{zoom-2d4ede33.js → zoom-a40839cf.js} +1 -1
- package/package.json +7 -7
- package/dist/app-de19f41c.js +0 -1
- package/dist/block.lazyload-ebd949e4.js +0 -1
- package/dist/brainImaging-007edaa3.js +0 -1
- package/dist/cuminc-72257faf.js +0 -1
- package/dist/matrix.cells-a5157233.js +0 -1
- package/dist/matrix.renderers-3b8dfd04.js +0 -1
- package/dist/metaboliteIntensity-512257f3.js +0 -1
- package/dist/niceNumLabels-8fdc6507.js +0 -1
- package/dist/numeric.binary-0a3b17d2.js +0 -1
- package/dist/numeric.continuous-f77038de.js +0 -1
- package/dist/numeric.discrete-b977e88f.js +0 -1
- package/dist/numeric.spline-d64b1abe.js +0 -1
- package/dist/plot.app-91a1d78d.js +0 -1
- package/dist/sampleScatter-031f47de.js +0 -1
- package/dist/spliceevent.exonskip.getdefault-93feb627.js +0 -1
- package/dist/survival-6a4c4f12.js +0 -1
- package/dist/tvs.numeric-f9ce58bc.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{az as e,q as t,aS as s}from"./app-f91922b4.js";import{controlsInit as i}from"./controls-8d4972c8.js";import{g as a}from"./FilterRxComp-0e75dd8d.js";import"./controls.btns-bad9e4cf.js";import"./controls.config-e0f394cb.js";import"./controls.overlay-3ac8773d.js";import"./termsetting-9a7511e6.js";import"path";import"./controls.term1-008f4be4.js";import"./controls.divide-d8ac5a9b.js";import"./table-d6c411fd.js";const o="root";const l=15;class n{constructor(e){this.opts=e;this.type="sampleView";this.setDom(e);m(this);c(this)}setDom(e){const t=e.holder.append("div").style("display","flex").style("flex-wrap","wrap").style("justify-content","flex-start").style("width","110vw");const s=t.insert("div").style("display","inline-block");const i=t.insert("div").style("display","inline-block").style("vertical-align","top");const a=t.append("div").style("display","inline-block").style("margin-top","10px");const o=i.insert("div").style("display","inline-block").style("padding","20px");const l=i.insert("div").style("padding","10px");const n=l.append("table").style("border-collapse","collapse");const r=n.append("thead");this.dom={header:e.header,holder:e.holder,controlsDiv:s,sampleDiv:o,tableDiv:l,table:n,thead:r,theadrow:r.append("tr"),tbody:n.append("tbody"),plotsDiv:a}}async init(e){this.termsByCohort={};await this.setSampleSelect(e);const t=this.getState(e);const s=t.termdbConfig.queries;await this.setControls(s)}async setSampleSelect(e){const t=e.plots.find((e=>e.id===this.id));const s=this.dom.sampleDiv;if(this.dom.header)this.dom.header.html(`Sample View`);if(t.samples){s.insert("label").style("vertical-align","top").html("Samples:");const e=s.insert("select").style("margin","0px 5px").property("multiple",true).attr("id","select");e.selectAll("option").data(t.samples).enter().append("option").attr("value",(e=>e.sampleId)).property("selected",((e,t)=>t<l)).html(((e,t)=>e.sampleName));this.dom.noteDiv=s.insert("div").style("display","none").style("vertical-align","top").style("font-size","0.8em").style("color","#aaa").html(`*Note that only ${l} samples can be selected.<br/> Navigate through the list to view all the samples.`);if(t.samples.length>l)this.dom.noteDiv.style("display","inline-block");e.on("change",(s=>{const i=e.node().options;const a=[];let o=0;for(const e of i){if(e.selected){if(o<l){const s=Number(e.value);const i=t.samples.find((e=>e.sampleId==s)).sampleName;const l={sampleId:s,sampleName:i};a.push(l);o++}else e.selected=false}}this.app.dispatch({type:"plot_edit",id:this.id,config:{samples:a}})}))}else{this.samplesData=await this.app.vocabApi.getSamplesByName({filter:a(e.termfilter?.filter)});const i=e=>{if(this.samplesData[e]){const t=y(this.samplesData,e);this.app.dispatch({type:"plot_edit",id:this.id,config:{samples:t}})}else{this.dom.tableDiv.style("display","none");for(const e of this.discoPlots)e.style("display","none");for(const e of this.singleSamplePlots)e.style("display","none");for(const e of this.brainPlots)e.style("display","none")}};const o=f(this.dom.sampleDiv,this.samplesData,i);this.sample=t.sample||{sampleId:this.samplesData[o].id,sampleName:o};this.dom.downloadbt=s.insert("button").style("margin-left","10px").style("vertical-align","top").text("Download").on("click",(e=>{this.downloadData()}));this.dom.messageDiv=s.insert("div").style("display","inline-block").style("display","none").style("vertical-align","top").html(" Downloading data ...")}}getState(e){const t=e.plots?.find((e=>e.id===this.id));let s=t.samples||y(this.samplesData,this.sample.sampleName);if(t.samples?.length>15)s=t.samples.filter(((e,t)=>t<15));const i=e.termdbConfig.queries;const a={config:t,termfilter:e.termfilter,activeCohort:t.activeCohort,terms:t.terms,expandedTermIds:t.expandedTermIds,samples:s,singleSampleGenomeQuantification:i?.singleSampleGenomeQuantification,singleSampleMutation:i?.singleSampleMutation,NIdata:i?.NIdata,hasVerifiedToken:this.app.vocabApi.hasVerifiedToken(),tokenVerificationPayload:this.app.vocabApi.tokenVerificationPayload,termdbConfig:e.termdbConfig,vocab:e.vocab};if(e.termdbConfig.selectCohort){a.toSelectCohort=true;const t=e.termdbConfig.selectCohort.values[a.activeCohort];if(t){a.cohortValuelst=t.keys}}return a}async main(){if(this.mayRequireToken())return;this.config=structuredClone(this.state.config);this.settings=this.state.config.settings.sampleView;await this.renderPlots(this.state,this.state.samples);this.showVisiblePlots();this.termsById=this.getTermsById(this.state);this.sampleDataByTermId={};const e=this.termsById[o];e.terms=await this.requestTermRecursive(e);this.orderedVisibleTerms=this.getOrderedVisibleTerms(e);this.dom.table.style("display",this.settings.showDictionary?"block":"none");if(this.settings.showDictionary)this.renderSampleDictionary()}async setControls(e){this.dom.controlsDiv.selectAll("*").remove();const t=JSON.parse(sessionStorage.getItem("optionalFeatures")||`{}`)?.showBrainImaging;const s=[{boxLabel:"Visible",label:"Dictionary",type:"checkbox",chartType:"sampleView",settingsKey:"showDictionary",title:`Option to show/hide dictionary table with sample values`}];if(e?.singleSampleMutation){s.push({boxLabel:"Visible",label:"Disco plot",type:"checkbox",chartType:"sampleView",settingsKey:"showDisco",title:`Option to show/hide disco plots`})}if(e?.singleSampleGenomeQuantification){s.push({boxLabel:"Visible",label:"Single sample",type:"checkbox",chartType:"sampleView",settingsKey:"showSingleSample",title:`Option to show/hide single sample plots`})}if(e?.images){s.push({boxLabel:"Visible",label:"Images",type:"checkbox",chartType:"sampleView",settingsKey:"showImages",title:`Option to show/hide images`})}if(e?.NIdata&&t){s.push({boxLabel:"Visible",label:"brain imaging",type:"checkbox",chartType:"sampleView",settingsKey:"showBrain",title:`Option to show/hide brain imaging`})}this.components={controls:await i({app:this.app,id:this.id,holder:this.dom.controlsDiv,inputs:s})}}getTermsById(e){if(!(e.activeCohort in this.termsByCohort)){this.termsByCohort[e.activeCohort]={[o]:{id:o,__tree_isroot:true}}}return this.termsByCohort[e.activeCohort]}async requestTermRecursive(e,t=[o]){const s=await this.app.vocabApi.getTermChildren(e,this.state.toSelectCohort?this.state.cohortValuelst:null);if(s.error)throw s.error;if(!s.lst||s.lst.length==0){return[]}const i=[];const a=t.slice(-1)[0];for(const e of s.lst){e.parent_id=a;const s=[...t];const o=structuredClone(e);o.ancestry=s;i.push(o);if(!o.isleaf&&this.config.expandedTermIds.includes(o.id)){o.terms=await this.requestTermRecursive(o,[...s,e.id]);if(this.state.samples)await this.fillSampleData(o.terms)}else{const e=this.termsById[o.id];if(this.state.samples)await this.fillSampleData([o]);if(e&&e.terms){o.terms=e.terms}}this.termsById[o.id]=o}return i}getOrderedVisibleTerms(e){const t=Object.values(this.termsById).filter(this.isVisibleTermId.bind(this));const s=[];this.sortVisibleTerms(this.termsById[o],t,s);return s}isVisibleTermId(e){if(e.parent_id==o)return true;if(!e.ancestry)return false;for(const t of e.ancestry){if(t===o)continue;if(!this.config.expandedTermIds.includes(t))return false}return true}sortVisibleTerms(e,t,s=[]){const i=[];const a=[];for(const s of t){if(s.parent_id==e.id){a.push(s)}else i.push(s)}t.splice(0,t.length,...i);if(t.length){for(const e of a){s.push(e);if(!e.isleaf&&t.length){this.sortVisibleTerms(e,t,s)}}}else{s.push(...a)}}async fillSampleData(e){const t=[];for(const s of e)t.push(s.id);for(const e of this.state.samples){const s=await this.app.vocabApi.getSingleSampleData({sampleId:e.sampleId,term_ids:t});if("error"in s)throw s.error;if(!this.sampleDataByTermId[e.sampleId])this.sampleDataByTermId[e.sampleId]={};for(const t in s)this.sampleDataByTermId[e.sampleId][t]=s[t]}}async downloadData(){this.dom.messageDiv.style("display","block");this.dom.downloadbt.style("display","none");const e=`samples.tsv`;const t={};let s="Sample";for(const e of this.state.samples){t[e.sampleId]=await this.app.vocabApi.getSingleSampleData({sampleId:e.sampleId});s+=`\t${e.sampleName}`}s+="\n";const i=this.state.samples[0].sampleId;for(const e in t[i]){const a=t[i][e].term;s+=`${a.name}`;for(const e in t){const i=t[e];let o=r(a,i);if(o==null)o="Missing";s+=`\t${o}`}s+="\n"}const a="data:text/tsv;charset=utf-8,"+encodeURIComponent(s);const o=document.createElement("a");o.setAttribute("href",a);o.setAttribute("download",e);document.body.appendChild(o);o.click();o.remove();this.dom.messageDiv.style("display","none");this.dom.downloadbt.style("display","inline-block")}mayRequireToken(){if(this.state.hasVerifiedToken){this.dom.holder.style("display","block");return false}else{const e=this.state.tokenVerificationPayload;const t=e?.error=="Missing access"&&this.state.termdbConfig.dataDownloadCatch?.missingAccess;const s=t?.message?.replace("MISSING-ACCESS-LINK",t?.links[e?.linkKey]);const i=this.state.termdbConfig.dataDownloadCatch?.helpLink;this.dom.holder.style("color","#e44").style("padding","10px").html(s||(this.state.tokenVerificationMessage||"Requires sign-in")+(i?` <a href='${i}' target=_blank>Tutorial</a>`:""));return true}}showVisiblePlots(){this.dom.sampleDiv.style("display",this.settings.showDictionary?"inline-block":"none");for(const e of this.discoPlots)if(this.settings.showDisco)e.style("display",this.state.samples.length==1?"inline-block":"table-cell");else e.style("display","none");for(const e of this.singleSamplePlots)if(this.settings.showSingleSample)e.style("display",this.state.samples.length==1?"inline-block":"table-cell");else e.style("display","none");for(const e of this.brainPlots)if(this.settings.showBrain)e.style("display",this.state.samples.length==1?"inline-block":"table-cell");else e.style("display","none");for(const e of this.imagePlots)if(this.settings.showImages)e.style("display",this.state.samples.length==1?"inline-block":"table-cell");else e.style("display","none")}async renderPlots(e,t){this.dom.plotsDiv.selectAll("*").remove();const s=this.dom.plotsDiv;this.discoPlots=[];this.singleSamplePlots=[];this.brainPlots=[];this.imagePlots=[];if(e.termdbConfig?.queries?.singleSampleMutation){let i=s.append("div");for(const s of t){const t=i.append("div").style("display","inline-block");this.discoPlots.push(t);if(this.state.samples.length>1)t.insert("div").style("font-weight","bold").style("padding-left","20px").text(s.sampleName);const a=await import("./plot.disco-70d493f4.js");a.default(e.termdbConfig,e.vocab.dslabel,{sample_id:s.sampleName},t,this.app.opts.genome)}}if(e.termdbConfig.queries?.singleSampleGenomeQuantification){for(const i in e.termdbConfig.queries.singleSampleGenomeQuantification){let a=s.append("div");for(const s of t){const t=i.match(/[A-Z][a-z]+|[0-9]+/g).join(" ");const o=a.insert("div").style("display","table-cell").style("padding","20px");this.singleSamplePlots.push(o);if(this.state.samples.length>1)o.insert("div").style("font-weight","bold").text(`${s.sampleName} ${t}`);const l=await import("./plot.ssgq-9d364d41.js");await l.plotSingleSampleGenomeQuantification(e.termdbConfig,e.vocab.dslabel,i,{sample_id:s.sampleName},o.insert("div"),this.app.opts.genome)}}}const i=JSON.parse(sessionStorage.getItem("optionalFeatures")||`{}`)?.showBrainImaging;if(e.termdbConfig.queries?.NIdata&&i){for(const i in e.termdbConfig.queries?.NIdata){let a=s.append("div");for(const s of t){const t=a.insert("div").style("display","inline-block");this.brainPlots.push(t);if(this.state.samples.length>1)t.insert("div").style("font-weight","bold").style("padding-left","20px").text(s.sampleName);const o=await import("./plot.brainImaging-d2c23bb7.js");o.default(e.termdbConfig,e.vocab.dslabel,i,{sample_id:s.sampleName},t,this.app.opts.genome)}}}if(e.termdbConfig?.queries?.images){let i=s.append("div");for(const s of t){const t=i.append("div").style("display","inline-block");this.imagePlots.push(t);if(this.state.samples.length>1)t.insert("div").style("font-weight","bold").style("padding-left","20px").text(s.sampleName);const a=await import("./imagePlot-6d89200c.js");a.renderImagePlot(e,t,s)}}}}function r(e,t){let s=t[e.id]?.value;if(s==null||s==undefined||s=="undefined")return null;if(e.type=="float"||e.type=="integer"){s=e.values?.[s]?.label||e.values?.[s]?.key||s;if(isNaN(s))return s;return s%1==0?s.toString():s.toFixed(2).toString()}if(e.type=="categorical")return e.values[s]?.label||e.values[s]?.key;if(e.type=="condition"){const t=s.toString().split(" ");let[i,a]=t;a=e.values[a].label||e.values[a].key;return`Max grade: ${a}, Time to event: ${Number(i).toFixed(1)} years`}if(e.type=="survival"){const t=s.split(" ");let[i,a]=t;a=e.values?.[a]?.label||e.values?.[a]?.key||a;return`${a} after ${Number(i).toFixed(1)} years`}return null}const p=e(n);const d=p;function c(e){e.renderSampleDictionary=function(){const t=[];for(const s of e.state.samples)t.push(e.sampleDataByTermId[s.sampleId]);e.renderTHead(["",...e.state.samples.map((e=>e.sampleName))]);const s=e.orderedVisibleTerms.map(((e,s)=>[{term:e},...t.map((t=>({term:e,sample:t})))]));e.renderTBody(s)};e.renderTHead=function(t){const s=e.dom.theadrow.selectAll("th").data(t);s.exit().remove();s.html(e.getThHtml);s.enter().append("th").style("padding","5px 10px").style("text-align","end").html(e.getThHtml)};e.getThHtml=e=>e;e.renderTBody=function(t){const s=e.dom.tbody.selectAll("tr").data(t);s.exit().remove();s.each(e.renderTr);s.enter().append("tr").each(e.renderTr)};e.renderTr=function(s,i){const a=t(this).selectAll("td").data(s,(e=>e));a.exit().remove();a.each(e.renderTd);a.enter().append("td").style("border-bottom","solid 1px rgb(245,245,245)").style("text-align",((e,t)=>t===0?"left":"center")).style("padding","2px 10px").each(e.renderTd)};e.renderTd=function(s,i){if(!s.sample){e.renderTerm(t(this));return}s.sample;const a=s.term;const o=a.type=="integer"||a.type=="float";const l=r(s.term,s.sample);const n=t(this).datum(s).style("text-align","end").style("padding","5px 10px").html(s.sample[s.term.id]?.label||l);if(o)n.append("button").style("margin-left","5px").text("Plot").on("click",(t=>{const s={id:a.id,q:{mode:"continuous"}};e.app.dispatch({type:"plot_create",config:{chartType:"violin",term:s,value:l}})}))};e.renderTerm=function(t){const s=t.datum();if(!t.select("span").size()){const s=t.append("span");s.append("button").style("border-width",0).style("border-radius","5px").style("width","28px").style("height","28px").style("cursor","pointer");s.append("span").style("margin-left",`3px`).style("cursor","pointer");t.on("click",e.toggleTerm)}const i=(s.term.ancestry.length-1)*24;const a=t.select(":scope>span").style("margin-left",`${i}px`);a.select("button").style("display",s.term.isleaf?"none":"").html(e.config.expandedTermIds.includes(s.term.id)?"-":"+");a.select("span").html(s.term.name);return}}function m(e){e.toggleTerm=function(){const s=t(this).datum();if(s.term.isleaf)return;const i=e.config.expandedTermIds.slice();const a=i.indexOf(s.term.id);if(a==-1)i.push(s.term.id);else i.splice(a,1);e.app.dispatch({type:"plot_edit",id:e.id,config:{expandedTermIds:i}})}}async function h(e){const t={sampleView:{showDictionary:true,showDisco:true,showSingleSample:true,showBrain:true,showImages:true}};const i={activeCohort:0,sample:null,expandedTermIds:[o],settings:t};return s(i,e)}function f(e,t,s,i){const a=100;const o=[];for(const e in t)if(t[e].type=="root"||t[e].type==null)o.push(e);const l=o.length>1e4;if(o.length==0)return;const n=o[0];const r=e.append("input").attr("list","sampleDatalist").property("autocomplete","off").attr("placeholder",n).style("width","400px");const p=e.append("datalist").attr("id","sampleDatalist");d(o);r.on("keyup",(e=>{p.selectAll("*").remove();const t=r.node().value.toLowerCase();if(i)i(t);const s=[];for(const e of o){if(e.toLowerCase().startsWith(t))s.push(e);if(s.length==a&&o.length>1e4)break}for(const e of o){if(e.toLowerCase().includes(t)&&!s.includes(e))s.push(e);if(s.length==a&&o.length>1e4)break}if(s.length>1||s.length==1&&r.node().value!=s[0])d(s)}));r.on("change",(e=>{const t=r.node().value;s(t)}));function d(e){p.selectAll("option").data(e.filter(((e,t)=>t<a))).enter().append("option").attr("value",(e=>e)).attr("label",((t,s)=>c(t)+(s+1==a?l?`Showing first ${s+1} hits`:`Showing ${s+1} of ${e.length} hits`:s+1===e.length&&s>0?` (Found ${e.length} hits)`:"")))}function c(e){const s=y(t,e);return s.map((e=>e.sampleName)).join(" > ")}return n}function y(e,t){let s=t;const i=Object.values(e);let a=i.find((e=>e.ancestor_name==s));while(a){s=a.name;a=i.find((e=>e.ancestor_name==s))}let o=e[s];if(!o)return[];const l=[{sampleId:o.id,sampleName:o.name}];while(o.ancestor_name){if(e[o.ancestor_name]?.type!="root")l.unshift({sampleId:o.ancestor_id,sampleName:o.ancestor_name});o=e[o.ancestor_name]}return l}export{d as componentInit,h as getPlotConfig,y as getSamplesRelated,r as getTermValue,p as sampleViewInit,f as searchSampleInput};
|
|
1
|
+
import{az as e,q as t,aS as s}from"./app-71453429.js";import{controlsInit as i}from"./controls-0467d2ec.js";import{g as a}from"./FilterRxComp-fc769f34.js";import"./controls.btns-ad7b28a2.js";import"./controls.config-6cf816fb.js";import"./controls.overlay-3a55c2ec.js";import"./termsetting-636d2271.js";import"path";import"./controls.term1-59f4cd60.js";import"./controls.divide-3c0d52d7.js";import"./table-1dae543a.js";const o="root";const l=15;class n{constructor(e){this.opts=e;this.type="sampleView";this.setDom(e);m(this);c(this)}setDom(e){const t=e.holder.append("div").style("display","flex").style("flex-wrap","wrap").style("justify-content","flex-start").style("width","110vw");const s=t.insert("div").style("display","inline-block");const i=t.insert("div").style("display","inline-block").style("vertical-align","top");const a=t.append("div").style("display","inline-block").style("margin-top","10px");const o=i.insert("div").style("display","inline-block").style("padding","20px");const l=i.insert("div").style("padding","10px");const n=l.append("table").style("border-collapse","collapse");const r=n.append("thead");this.dom={header:e.header,holder:e.holder,controlsDiv:s,sampleDiv:o,tableDiv:l,table:n,thead:r,theadrow:r.append("tr"),tbody:n.append("tbody"),plotsDiv:a}}async init(e){this.termsByCohort={};await this.setSampleSelect(e);const t=this.getState(e);const s=t.termdbConfig.queries;await this.setControls(s)}async setSampleSelect(e){const t=e.plots.find((e=>e.id===this.id));const s=this.dom.sampleDiv;if(this.dom.header)this.dom.header.html(`Sample View`);if(t.samples){s.insert("label").style("vertical-align","top").html("Samples:");const e=s.insert("select").style("margin","0px 5px").property("multiple",true).attr("id","select");e.selectAll("option").data(t.samples).enter().append("option").attr("value",(e=>e.sampleId)).property("selected",((e,t)=>t<l)).html(((e,t)=>e.sampleName));this.dom.noteDiv=s.insert("div").style("display","none").style("vertical-align","top").style("font-size","0.8em").style("color","#aaa").html(`*Note that only ${l} samples can be selected.<br/> Navigate through the list to view all the samples.`);if(t.samples.length>l)this.dom.noteDiv.style("display","inline-block");e.on("change",(s=>{const i=e.node().options;const a=[];let o=0;for(const e of i){if(e.selected){if(o<l){const s=Number(e.value);const i=t.samples.find((e=>e.sampleId==s)).sampleName;const l={sampleId:s,sampleName:i};a.push(l);o++}else e.selected=false}}this.app.dispatch({type:"plot_edit",id:this.id,config:{samples:a}})}))}else{this.samplesData=await this.app.vocabApi.getSamplesByName({filter:a(e.termfilter?.filter)});const i=e=>{if(this.samplesData[e]){const t=y(this.samplesData,e);this.app.dispatch({type:"plot_edit",id:this.id,config:{samples:t}})}else{this.dom.tableDiv.style("display","none");for(const e of this.discoPlots)e.style("display","none");for(const e of this.singleSamplePlots)e.style("display","none");for(const e of this.brainPlots)e.style("display","none")}};const o=f(this.dom.sampleDiv,this.samplesData,i);this.sample=t.sample||{sampleId:this.samplesData[o].id,sampleName:o};this.dom.downloadbt=s.insert("button").style("margin-left","10px").style("vertical-align","top").text("Download").on("click",(e=>{this.downloadData()}));this.dom.messageDiv=s.insert("div").style("display","inline-block").style("display","none").style("vertical-align","top").html(" Downloading data ...")}}getState(e){const t=e.plots?.find((e=>e.id===this.id));let s=t.samples||y(this.samplesData,this.sample.sampleName);if(t.samples?.length>15)s=t.samples.filter(((e,t)=>t<15));const i=e.termdbConfig.queries;const a={config:t,termfilter:e.termfilter,activeCohort:t.activeCohort,terms:t.terms,expandedTermIds:t.expandedTermIds,samples:s,singleSampleGenomeQuantification:i?.singleSampleGenomeQuantification,singleSampleMutation:i?.singleSampleMutation,NIdata:i?.NIdata,hasVerifiedToken:this.app.vocabApi.hasVerifiedToken(),tokenVerificationPayload:this.app.vocabApi.tokenVerificationPayload,termdbConfig:e.termdbConfig,vocab:e.vocab};if(e.termdbConfig.selectCohort){a.toSelectCohort=true;const t=e.termdbConfig.selectCohort.values[a.activeCohort];if(t){a.cohortValuelst=t.keys}}return a}async main(){if(this.mayRequireToken())return;this.config=structuredClone(this.state.config);this.settings=this.state.config.settings.sampleView;await this.renderPlots(this.state,this.state.samples);this.showVisiblePlots();this.termsById=this.getTermsById(this.state);this.sampleDataByTermId={};const e=this.termsById[o];e.terms=await this.requestTermRecursive(e);this.orderedVisibleTerms=this.getOrderedVisibleTerms(e);this.dom.table.style("display",this.settings.showDictionary?"block":"none");if(this.settings.showDictionary)this.renderSampleDictionary()}async setControls(e){this.dom.controlsDiv.selectAll("*").remove();const t=JSON.parse(sessionStorage.getItem("optionalFeatures")||`{}`)?.showBrainImaging;const s=[{boxLabel:"Visible",label:"Dictionary",type:"checkbox",chartType:"sampleView",settingsKey:"showDictionary",title:`Option to show/hide dictionary table with sample values`}];if(e?.singleSampleMutation){s.push({boxLabel:"Visible",label:"Disco plot",type:"checkbox",chartType:"sampleView",settingsKey:"showDisco",title:`Option to show/hide disco plots`})}if(e?.singleSampleGenomeQuantification){s.push({boxLabel:"Visible",label:"Single sample",type:"checkbox",chartType:"sampleView",settingsKey:"showSingleSample",title:`Option to show/hide single sample plots`})}if(e?.images){s.push({boxLabel:"Visible",label:"Images",type:"checkbox",chartType:"sampleView",settingsKey:"showImages",title:`Option to show/hide images`})}if(e?.NIdata&&t){s.push({boxLabel:"Visible",label:"brain imaging",type:"checkbox",chartType:"sampleView",settingsKey:"showBrain",title:`Option to show/hide brain imaging`})}this.components={controls:await i({app:this.app,id:this.id,holder:this.dom.controlsDiv,inputs:s})}}getTermsById(e){if(!(e.activeCohort in this.termsByCohort)){this.termsByCohort[e.activeCohort]={[o]:{id:o,__tree_isroot:true}}}return this.termsByCohort[e.activeCohort]}async requestTermRecursive(e,t=[o]){const s=await this.app.vocabApi.getTermChildren(e,this.state.toSelectCohort?this.state.cohortValuelst:null);if(s.error)throw s.error;if(!s.lst||s.lst.length==0){return[]}const i=[];const a=t.slice(-1)[0];for(const e of s.lst){e.parent_id=a;const s=[...t];const o=structuredClone(e);o.ancestry=s;i.push(o);if(!o.isleaf&&this.config.expandedTermIds.includes(o.id)){o.terms=await this.requestTermRecursive(o,[...s,e.id]);if(this.state.samples)await this.fillSampleData(o.terms)}else{const e=this.termsById[o.id];if(this.state.samples)await this.fillSampleData([o]);if(e&&e.terms){o.terms=e.terms}}this.termsById[o.id]=o}return i}getOrderedVisibleTerms(e){const t=Object.values(this.termsById).filter(this.isVisibleTermId.bind(this));const s=[];this.sortVisibleTerms(this.termsById[o],t,s);return s}isVisibleTermId(e){if(e.parent_id==o)return true;if(!e.ancestry)return false;for(const t of e.ancestry){if(t===o)continue;if(!this.config.expandedTermIds.includes(t))return false}return true}sortVisibleTerms(e,t,s=[]){const i=[];const a=[];for(const s of t){if(s.parent_id==e.id){a.push(s)}else i.push(s)}t.splice(0,t.length,...i);if(t.length){for(const e of a){s.push(e);if(!e.isleaf&&t.length){this.sortVisibleTerms(e,t,s)}}}else{s.push(...a)}}async fillSampleData(e){const t=[];for(const s of e)t.push(s.id);for(const e of this.state.samples){const s=await this.app.vocabApi.getSingleSampleData({sampleId:e.sampleId,term_ids:t});if("error"in s)throw s.error;if(!this.sampleDataByTermId[e.sampleId])this.sampleDataByTermId[e.sampleId]={};for(const t in s)this.sampleDataByTermId[e.sampleId][t]=s[t]}}async downloadData(){this.dom.messageDiv.style("display","block");this.dom.downloadbt.style("display","none");const e=`samples.tsv`;const t={};let s="Sample";for(const e of this.state.samples){t[e.sampleId]=await this.app.vocabApi.getSingleSampleData({sampleId:e.sampleId});s+=`\t${e.sampleName}`}s+="\n";const i=this.state.samples[0].sampleId;for(const e in t[i]){const a=t[i][e].term;s+=`${a.name}`;for(const e in t){const i=t[e];let o=r(a,i);if(o==null)o="Missing";s+=`\t${o}`}s+="\n"}const a="data:text/tsv;charset=utf-8,"+encodeURIComponent(s);const o=document.createElement("a");o.setAttribute("href",a);o.setAttribute("download",e);document.body.appendChild(o);o.click();o.remove();this.dom.messageDiv.style("display","none");this.dom.downloadbt.style("display","inline-block")}mayRequireToken(){if(this.state.hasVerifiedToken){this.dom.holder.style("display","block");return false}else{const e=this.state.tokenVerificationPayload;const t=e?.error=="Missing access"&&this.state.termdbConfig.dataDownloadCatch?.missingAccess;const s=t?.message?.replace("MISSING-ACCESS-LINK",t?.links[e?.linkKey]);const i=this.state.termdbConfig.dataDownloadCatch?.helpLink;this.dom.holder.style("color","#e44").style("padding","10px").html(s||(this.state.tokenVerificationMessage||"Requires sign-in")+(i?` <a href='${i}' target=_blank>Tutorial</a>`:""));return true}}showVisiblePlots(){this.dom.sampleDiv.style("display",this.settings.showDictionary?"inline-block":"none");for(const e of this.discoPlots)if(this.settings.showDisco)e.style("display",this.state.samples.length==1?"inline-block":"table-cell");else e.style("display","none");for(const e of this.singleSamplePlots)if(this.settings.showSingleSample)e.style("display",this.state.samples.length==1?"inline-block":"table-cell");else e.style("display","none");for(const e of this.brainPlots)if(this.settings.showBrain)e.style("display",this.state.samples.length==1?"inline-block":"table-cell");else e.style("display","none");for(const e of this.imagePlots)if(this.settings.showImages)e.style("display",this.state.samples.length==1?"inline-block":"table-cell");else e.style("display","none")}async renderPlots(e,t){this.dom.plotsDiv.selectAll("*").remove();const s=this.dom.plotsDiv;this.discoPlots=[];this.singleSamplePlots=[];this.brainPlots=[];this.imagePlots=[];if(e.termdbConfig?.queries?.singleSampleMutation){let i=s.append("div");for(const s of t){const t=i.append("div").style("display","inline-block");this.discoPlots.push(t);if(this.state.samples.length>1)t.insert("div").style("font-weight","bold").style("padding-left","20px").text(s.sampleName);const a=await import("./plot.disco-621d1b8e.js");a.default(e.termdbConfig,e.vocab.dslabel,{sample_id:s.sampleName},t,this.app.opts.genome)}}if(e.termdbConfig.queries?.singleSampleGenomeQuantification){for(const i in e.termdbConfig.queries.singleSampleGenomeQuantification){let a=s.append("div");for(const s of t){const t=i.match(/[A-Z][a-z]+|[0-9]+/g).join(" ");const o=a.insert("div").style("display","table-cell").style("padding","20px");this.singleSamplePlots.push(o);if(this.state.samples.length>1)o.insert("div").style("font-weight","bold").text(`${s.sampleName} ${t}`);const l=await import("./plot.ssgq-1949c207.js");await l.plotSingleSampleGenomeQuantification(e.termdbConfig,e.vocab.dslabel,i,{sample_id:s.sampleName},o.insert("div"),this.app.opts.genome)}}}const i=JSON.parse(sessionStorage.getItem("optionalFeatures")||`{}`)?.showBrainImaging;if(e.termdbConfig.queries?.NIdata&&i){for(const i in e.termdbConfig.queries?.NIdata){let a=s.append("div");for(const s of t){const t=a.insert("div").style("display","inline-block");this.brainPlots.push(t);if(this.state.samples.length>1)t.insert("div").style("font-weight","bold").style("padding-left","20px").text(s.sampleName);const o=await import("./plot.brainImaging-325ebded.js");o.default(e.termdbConfig,e.vocab.dslabel,i,{sample_id:s.sampleName},t,this.app.opts.genome)}}}if(e.termdbConfig?.queries?.images){let i=s.append("div");for(const s of t){const t=i.append("div").style("display","inline-block");this.imagePlots.push(t);if(this.state.samples.length>1)t.insert("div").style("font-weight","bold").style("padding-left","20px").text(s.sampleName);const a=await import("./imagePlot-095b9a92.js");a.renderImagePlot(e,t,s)}}}}function r(e,t){let s=t[e.id]?.value;if(s==null||s==undefined||s=="undefined")return null;if(e.type=="float"||e.type=="integer"){s=e.values?.[s]?.label||e.values?.[s]?.key||s;if(isNaN(s))return s;return s%1==0?s.toString():s.toFixed(2).toString()}if(e.type=="categorical")return e.values[s]?.label||e.values[s]?.key;if(e.type=="condition"){const t=s.toString().split(" ");let[i,a]=t;a=e.values[a].label||e.values[a].key;return`Max grade: ${a}, Time to event: ${Number(i).toFixed(1)} years`}if(e.type=="survival"){const t=s.split(" ");let[i,a]=t;a=e.values?.[a]?.label||e.values?.[a]?.key||a;return`${a} after ${Number(i).toFixed(1)} years`}return null}const p=e(n);const d=p;function c(e){e.renderSampleDictionary=function(){const t=[];for(const s of e.state.samples)t.push(e.sampleDataByTermId[s.sampleId]);e.renderTHead(["",...e.state.samples.map((e=>e.sampleName))]);const s=e.orderedVisibleTerms.map(((e,s)=>[{term:e},...t.map((t=>({term:e,sample:t})))]));e.renderTBody(s)};e.renderTHead=function(t){const s=e.dom.theadrow.selectAll("th").data(t);s.exit().remove();s.html(e.getThHtml);s.enter().append("th").style("padding","5px 10px").style("text-align","end").html(e.getThHtml)};e.getThHtml=e=>e;e.renderTBody=function(t){const s=e.dom.tbody.selectAll("tr").data(t);s.exit().remove();s.each(e.renderTr);s.enter().append("tr").each(e.renderTr)};e.renderTr=function(s,i){const a=t(this).selectAll("td").data(s,(e=>e));a.exit().remove();a.each(e.renderTd);a.enter().append("td").style("border-bottom","solid 1px rgb(245,245,245)").style("text-align",((e,t)=>t===0?"left":"center")).style("padding","2px 10px").each(e.renderTd)};e.renderTd=function(s,i){if(!s.sample){e.renderTerm(t(this));return}s.sample;const a=s.term;const o=a.type=="integer"||a.type=="float";const l=r(s.term,s.sample);const n=t(this).datum(s).style("text-align","end").style("padding","5px 10px").html(s.sample[s.term.id]?.label||l);if(o)n.append("button").style("margin-left","5px").text("Plot").on("click",(t=>{const s={id:a.id,q:{mode:"continuous"}};e.app.dispatch({type:"plot_create",config:{chartType:"violin",term:s,value:l}})}))};e.renderTerm=function(t){const s=t.datum();if(!t.select("span").size()){const s=t.append("span");s.append("button").style("border-width",0).style("border-radius","5px").style("width","28px").style("height","28px").style("cursor","pointer");s.append("span").style("margin-left",`3px`).style("cursor","pointer");t.on("click",e.toggleTerm)}const i=(s.term.ancestry.length-1)*24;const a=t.select(":scope>span").style("margin-left",`${i}px`);a.select("button").style("display",s.term.isleaf?"none":"").html(e.config.expandedTermIds.includes(s.term.id)?"-":"+");a.select("span").html(s.term.name);return}}function m(e){e.toggleTerm=function(){const s=t(this).datum();if(s.term.isleaf)return;const i=e.config.expandedTermIds.slice();const a=i.indexOf(s.term.id);if(a==-1)i.push(s.term.id);else i.splice(a,1);e.app.dispatch({type:"plot_edit",id:e.id,config:{expandedTermIds:i}})}}async function h(e){const t={sampleView:{showDictionary:true,showDisco:true,showSingleSample:true,showBrain:true,showImages:true}};const i={activeCohort:0,sample:null,expandedTermIds:[o],settings:t};return s(i,e)}function f(e,t,s,i){const a=100;const o=[];for(const e in t)if(t[e].type=="root"||t[e].type==null)o.push(e);const l=o.length>1e4;if(o.length==0)return;const n=o[0];const r=e.append("input").attr("list","sampleDatalist").property("autocomplete","off").attr("placeholder",n).style("width","400px");const p=e.append("datalist").attr("id","sampleDatalist");d(o);r.on("keyup",(e=>{p.selectAll("*").remove();const t=r.node().value.toLowerCase();if(i)i(t);const s=[];for(const e of o){if(e.toLowerCase().startsWith(t))s.push(e);if(s.length==a&&o.length>1e4)break}for(const e of o){if(e.toLowerCase().includes(t)&&!s.includes(e))s.push(e);if(s.length==a&&o.length>1e4)break}if(s.length>1||s.length==1&&r.node().value!=s[0])d(s)}));r.on("change",(e=>{const t=r.node().value;s(t)}));function d(e){p.selectAll("option").data(e.filter(((e,t)=>t<a))).enter().append("option").attr("value",(e=>e)).attr("label",((t,s)=>c(t)+(s+1==a?l?`Showing first ${s+1} hits`:`Showing ${s+1} of ${e.length} hits`:s+1===e.length&&s>0?` (Found ${e.length} hits)`:"")))}function c(e){const s=y(t,e);return s.map((e=>e.sampleName)).join(" > ")}return n}function y(e,t){let s=t;const i=Object.values(e);let a=i.find((e=>e.ancestor_name==s));while(a){s=a.name;a=i.find((e=>e.ancestor_name==s))}let o=e[s];if(!o)return[];const l=[{sampleId:o.id,sampleName:o.name}];while(o.ancestor_name){if(e[o.ancestor_name]?.type!="root")l.unshift({sampleId:o.ancestor_id,sampleName:o.ancestor_name});o=e[o.ancestor_name]}return l}export{d as componentInit,h as getPlotConfig,y as getSamplesRelated,r as getTermValue,p as sampleViewInit,f as searchSampleInput};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{b as e}from"./termsetting-
|
|
1
|
+
import{b as e}from"./termsetting-636d2271.js";import{r as t}from"./table-1dae543a.js";import"./app-71453429.js";import"path";import"./FilterRxComp-fc769f34.js";function i(t){return{showEditMenu(e){var i,o,s,n,a;e.selectAll("*").remove();if(((i=t.vocabApi.termdbConfig)===null||i===void 0?void 0:i.displaySampleIds)&&t.vocabApi.hasVerifiedToken()){const i=t.q.groups;for(const t of i){const i=e.append("div").style("display","inline-block").style("vertical-align","top");const o=(e,i)=>{t.values[e].checked=i.checked};const s=t.in?t.name:`${t.name} will exclude these samples`;l(i,s,t,o)}e.append("div").append("div").style("display","inline-block").style("float","right").style("padding","6px 20px").append("button").attr("class","sjpp_apply_btn sja_filter_tag_btn").text("Apply").on("click",(()=>{for(const e of i)e.values=e.values.filter((e=>!("checked"in e)||e.checked));t.runCallback()}))}else{const i=t.vocabApi.tokenVerificationPayload;const l=(i===null||i===void 0?void 0:i.error)=="Missing access"&&((o=t.vocabApi.termdbConfig.dataDownloadCatch)===null||o===void 0?void 0:o.missingAccess);const p=i&&((s=l===null||l===void 0?void 0:l.message)===null||s===void 0?void 0:s.replace("MISSING-ACCESS-LINK",l===null||l===void 0?void 0:l.links[i.linkKey||""]));const d=(a=(n=t.vocabApi.termdbConfig)===null||n===void 0?void 0:n.dataDownloadCatch)===null||a===void 0?void 0:a.helpLink;e.append("div").style("color","#e44").style("padding","10px").html(p||(t.vocabApi.tokenVerificationMessage||"Requires sign-in")+(d?` <a href='${d}' target=_blank>Tutorial</a>`:""))}},getPillStatus(){},getPillName(i){return e(t,i)}}}function l(e,i,l,o){e.style("padding","6px").append("div").style("margin","10px").style("font-size","0.8rem").html(`<b> ${i}</b>.`);const s=[];for(const e of l.values)s.push([{value:e.sample}]);const n=[{label:"Sample"}];t({rows:s,columns:n,div:e,maxWidth:"30vw",maxHeight:"40vh",noButtonCallback:o,striped:false,showHeader:false,selectAll:true,columnButtons:undefined,buttons:undefined})}function o(e){if(!e.q.type)e.q.type="custom-samplelst";if(!e.q.groups)e.q.groups=[];if(e.q.groups.length==0){for(const t in e.term.values){const i=e.term.values[t];e.q.groups.push({name:t,inuse:i.inuse,values:i.list})}}}export{o as fillTW,i as getHandler};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{E as t,L as e,a0 as s,M as i,o as a,bb as n,a2 as o,S as l,X as r,P as c,c as p,l as h,bc as d,am as f,an as u,bd as m,af as y,be as g,I as v,K as b,J as _,p as x,b8 as w,m as k,_ as z,d as q,g as j,h as M,O as E,N as A}from"./app-f91922b4.js";import{v as F}from"./vcf-58904308.js";function C(t,e){t.menu.d.append("div").attr("class","sja_menuoption").text("Sort").on("click",(()=>{t.menu.hide();if(e.sort){return}for(const e of t.features){if(e.isgenevalue)delete e.sort}e.sort=1;t.draw_matrix()}))}function L(t,e,s){{const i=t.menu.d.append("div").style("margin","10px");i.append("span").html("CNV log2(ratio) cutoff ");i.append("input").property("value",s.valuecutoff||0).attr("type","number").style("width","50px").on("keyup",(i=>{if(i.code!="Enter"&&i.code!="NumpadEnter")return;let a=Number.parseFloat(i.target.value);if(!a||a<0){a=0}if(a==0){if(s.valuecutoff){s.valuecutoff=0;t.update_singlefeature(e)}return}if(s.valuecutoff){if(s.valuecutoff==a);else{s.valuecutoff=a;t.update_singlefeature(e)}}else{s.valuecutoff=a;t.update_singlefeature(e)}}));i.append("div").style("font-size",".7em").style("opacity",.5).html("Only show CNV with absolute log2(ratio) no less than cutoff.<br>Set to 0 to cancel.")}{const i=t.menu.d.append("div").style("margin","10px");i.append("span").html("CNV segment size limit ");i.append("input").property("value",s.focalsizelimit||0).attr("type","number").style("width","100px").on("keyup",(i=>{if(i.code!="Enter"&&i.code!="NumpadEnter")return;let a=Number.parseInt(i.target.value);if(!a||a<0){a=0}if(a==0){if(s.focalsizelimit){s.focalsizelimit=0;t.update_singlefeature(e)}return}if(s.focalsizelimit){if(s.focalsizelimit==a);else{s.focalsizelimit=a;t.update_singlefeature(e)}}else{s.focalsizelimit=a;t.update_singlefeature(e)}}));i.append("span").text("bp");i.append("div").style("font-size",".7em").style("opacity",.5).html("Limit the CNV segment length to show only focal events.<br>Set to 0 to cancel.")}}function S(t,e,s){{const i=t.menu.d.append("div").style("margin","10px");i.append("span").html("LOH segmean cutoff ");i.append("input").property("value",s.valuecutoff||0).attr("type","number").style("width","50px").on("keyup",(i=>{if(i.code!="Enter"&&i.code!="NumpadEnter")return;let a=Number.parseFloat(i.target.value);if(!a||a<0){a=0}if(a==0){if(s.valuecutoff){s.valuecutoff=0;t.update_singlefeature(e)}return}if(s.valuecutoff){if(s.valuecutoff==a);else{s.valuecutoff=a;t.update_singlefeature(e)}}else{s.valuecutoff=a;t.update_singlefeature(e)}}));i.append("div").style("font-size",".7em").style("opacity",.5).html("Only show LOH with segmean no less than cutoff.<br>Set to 0 to cancel.")}{const i=t.menu.d.append("div").style("margin","10px");i.append("span").html("LOH segment size limit ");i.append("input").property("value",s.focalsizelimit||0).attr("type","number").style("width","100px").on("keyup",(i=>{if(i.code!="Enter"&&i.code!="NumpadEnter")return;let a=Number.parseInt(i.target.value);if(!a||a<0){a=0}if(a==0){if(s.focalsizelimit){s.focalsizelimit=0;t.update_singlefeature(e)}return}if(s.focalsizelimit){if(s.focalsizelimit==a);else{s.focalsizelimit=a;t.update_singlefeature(e)}}else{s.focalsizelimit=a;t.update_singlefeature(e)}}));i.append("span").text("bp");i.append("div").style("font-size",".7em").style("opacity",.5).html("Limit the LOH segment length to show only focal events.<br>Set to 0 to cancel.")}}function N(s,i){{const a=s.menu.d.append("div").style("margin","10px").style("border","solid 1px #ededed");const n=()=>{s.update_singlefeature(i);s.menu.hide()};const o=a.append("table").style("margin","10px").style("border-spacing","1px");const l=o.append("tbody");{const t=l.append("tr");t.append("td").style("opacity",.5).text("CNV");t.append("td").attr("class","sja_menuoption").text(i.cnv.hidden?"Show":"Hide").on("click",(()=>{i.cnv.hidden=!i.cnv.hidden;n()}));t.append("td").attr("class","sja_menuoption").text("Show only").on("click",(()=>{V(i);delete i.cnv.hidden;n()}));const e=t.append("td");if(!i.cnv.hidden){e.attr("class","sja_menuoption").style("font-size",".8em").text("CONFIG").on("click",(()=>{s.menu.clear();L(s,i,i.cnv)}))}}{const t=l.append("tr");t.append("td").style("opacity",.5).text("LOH");t.append("td").attr("class","sja_menuoption").text(i.loh.hidden?"Show":"Hide").on("click",(()=>{i.loh.hidden=!i.loh.hidden;n()}));t.append("td").attr("class","sja_menuoption").text("Show only").on("click",(()=>{V(i);delete i.loh.hidden;n()}));const e=t.append("td");if(!i.loh.hidden){e.attr("class","sja_menuoption").style("font-size",".8em").text("CONFIG").on("click",(()=>{s.menu.clear();S(s,i,i.loh)}))}}{const t=l.append("tr");t.append("td").style("opacity",.5).text("ITD");t.append("td").attr("class","sja_menuoption").text(i.itd.hidden?"Show":"Hide").on("click",(()=>{i.itd.hidden=!i.itd.hidden;n()}));t.append("td").attr("class","sja_menuoption").text("Show only").on("click",(()=>{V(i);delete i.itd.hidden;n()}));t.append("td");if(!i.itd.hidden);}{const t=l.append("tr");t.append("td").style("opacity",.5).text("SV");t.append("td").attr("class","sja_menuoption").text(i.sv.hidden?"Show":"Hide").on("click",(()=>{i.sv.hidden=!i.sv.hidden;n()}));t.append("td").attr("class","sja_menuoption").text("Show only").on("click",(()=>{V(i);delete i.sv.hidden;n()}));t.append("td");if(!i.sv.hidden);}{const t=l.append("tr");t.append("td").style("opacity",.5).text("Fusion");t.append("td").attr("class","sja_menuoption").text(i.fusion.hidden?"show":"hide").on("click",(()=>{i.fusion.hidden=!i.fusion.hidden;n()}));t.append("td").attr("class","sja_menuoption").text("show only").on("click",(()=>{V(i);delete i.fusion.hidden;n()}));t.append("td");if(!i.fusion.hidden);}o.append("tbody").append("tr").append("td").attr("colspan",4).style("padding-top","10px").append("span").style("font-size",".8em").text("List SNV/indel").attr("class","sja_clbtext").on("click",(()=>{if(r.style("display")=="none"){r.style("display","table-row-group")}else{r.style("display","none")}}));const r=o.append("tbody").style("display","none");for(const s in t){const a=t[s];if(a.dt!=e){continue}const o=r.append("tr");o.append("td").style("opacity",.5).text(a.label);o.append("td").attr("class","sja_menuoption").text(i.snvindel.excludeclasses[s]?"Show":"Hide").on("click",(()=>{if(i.snvindel.excludeclasses[s]){delete i.snvindel.excludeclasses[s]}else{i.snvindel.excludeclasses[s]=1}n()}));o.append("td").attr("class","sja_menuoption").text("Show only").on("click",(()=>{V(i);delete i.snvindel.excludeclasses[s];n()}));o.append("td")}a.append("div").style("margin","10px").append("span").style("font-size",".8em").text("Show all classes").attr("class","sja_clbtext").on("click",(()=>{i.cnv.hidden=false;i.loh.hidden=false;i.itd.hidden=false;i.sv.hidden=false;i.fusion.hidden=false;i.snvindel.excludeclasses={};n()}))}}function V(s){s.cnv.hidden=true;s.loh.hidden=true;s.itd.hidden=true;s.sv.hidden=true;s.fusion.hidden=true;s.snvindel.excludeclasses={};for(const i in t){if(t[i].dt==e)s.snvindel.excludeclasses[i]=1}}function T(t,e){if(!t.mds||!t.mds.survivalplot)return;e.append("span").style("margin-right","20px").style("font-size",".8em").text("SURVIVAL PLOT").attr("class","sja_clbtext").on("click",(e=>{t.menu.clear().showunder(e.target);I(t)}))}async function I(t){const e=t.features.filter((t=>t.ismutation));try{if(e.length!=2)throw"only works with two genomic features.";await O(t,e[0],e[1])}catch(e){t.menu.d.append("div").style("margin","20px").text("Cannot make survival plot: "+(e.message||e))}}async function O(t,e,i){const a=[],n=[],o=[];for(const s of t.samples){const t=e.items.find((t=>t.sample==s.name));const l=i.items.find((t=>t.sample==s.name));if(t){if(l)o.push(s.name);else a.push(s.name)}else{n.push(s.name)}}const l={renderplot:1,samplerule:{full:{},mutated_sets:[{name:e.label+" mutated (n="+a.length+")",samplenames:a},{name:i.label+" mutated (n="+n.length+")",samplenames:n},{name:e.label+" and "+i.label+" mutated (n="+o.length+")",samplenames:o}]}};if(t.limitsamplebyeitherannotation){l.samplerule.full={byattr:1,key:t.limitsamplebyeitherannotation[0].key,value:t.limitsamplebyeitherannotation[0].value,immutable:1}}const r=s({x:100,y:100});r.header.text((t.limitsamplebyeitherannotation?t.limitsamplebyeitherannotation[0].value+" ":"")+"survival by "+e.label+" and "+i.label+" mutation status");const c=await import("./mds.survivalplot-f5bda05a.js");c.init({mds:t.mds,genome:t.genome,plotlist:[l]},r.body)}const B="na";const R="#D6683C";const U="#67a9cf";const H="#095873";const D="#858585";const G="#858585";const P=8;class X{constructor(t){for(const e in t){this[e]=t[e]}if(this.debugmode)window.smat=this;this.tip=new i({padding:"0px",hideXmute:1,hideYmute:1});this.menu=new i({padding:"0px"});this.errdiv=this.holder.append("div");if(!this.iscustom){try{if(!this.dslabel)throw"not custom data but dslabel is missing";this.mds=this.genome.datasets[this.dslabel];if(!this.mds)throw"invalid dataset name: "+this.dslabel;if(!this.mds.isMds)throw"improper dataset: "+this.dslabel}catch(t){this.error(t)}}Q(this);if(this.header){this.holder.append("div").style("margin-bottom","20px").html(this.header)}this.wait_div=this.holder.append("div");this.wait_div.style("display","block").text("Loading...");this.svg=this.holder.append("svg");this.validate_config().then((()=>this.get_features())).catch((t=>{if(typeof t=="string"){this.error(t)}else{this.error(t.message);if(t.stack)console.log(t.stack)}}))}error(t){a(this.errdiv,t)}async validate_config(){if(this.iscustom){if(!this.querykey2tracks)throw"querykey2tracks missing for custom dataset";let t=true;for(const e in this.querykey2tracks){const s=this.querykey2tracks[e];if(!s.file&&!s.url)throw"no file or url for a custom track by key "+e;if(!s.type)throw"missing type for member track by key "+e;if(!n(s.type))throw"invalid type for a member track: "+s.type;t=false}if(t)throw"no custom tracks from querykey2tracks";let e;for(const t in this.querykey2tracks){const s=this.querykey2tracks[t];if(s.type==o.mdsvcf){e=s}}if(e){await this.may_init_customvcf(e)}}else{if(this.mds.mdsIsUninitiated){const t=await l(`getDataset?genome=${this.genome.name}&dsname=${this.mds.label}`);if(t.error)throw t.error;if(!t.ds)throw"ds missing";Object.assign(this.mds,t.ds);delete this.mds.mdsIsUninitiated}}if(this.limitsamplebyeitherannotation){if(!Array.isArray(this.limitsamplebyeitherannotation))throw"limitsamplebyeitherannotation must be an array";this.legendtable.append("tr");for(const t of this.limitsamplebyeitherannotation){if(!t.key)throw".key missing from an element of limitsamplebyeitherannotation";if(!t.value)throw".value missing from an element of limitsamplebyeitherannotation"}this.showlegend_limitsample()}const t=this.legendtable.append("tr");t.append("td").style("opacity",.5).style("text-align","right").text("CNV cutoff");this.legendtable.cnv_td=t.append("td");const e=this.legendtable.append("tr");e.append("td").style("opacity",.5).style("text-align","right").text("LOH cutoff");this.legendtable.loh_td=e.append("td");if(this.limitbysamplesetgroup){if(!Array.isArray(this.limitbysamplesetgroup.samples))throw".limitbysamplesetgroup.samples is not array"}if(!this.rowspace)this.rowspace=1;if(!this.colspace)this.colspace=1;if(!this.rowlabspace)this.rowlabspace=5;if(!this.collabspace)this.collabspace=5;if(!this.rowlabticksize)this.rowlabticksize=5;if(!this.collabticksize)this.collabticksize=5;if(!this.features)throw"missing features[]";if(!Array.isArray(this.features))throw"features must be an array";if(this.features[0].height)this.ori_feature_height=this.features[0].height;if(this.features[0].width)this.ori_feature_width=this.features[0].width;for(const t of this.features){await this.validate_feature(t)}}showlegend_limitsample(){if(!this.limitsamplebyeitherannotation)return}feature_parseposition_maygene(t){return Promise.resolve().then((()=>{if(t.position){const e=r(t.position,this.genome);if(e){t.chr=e.chr;t.start=e.start;t.stop=e.stop}}if(t.chr){const e=c(this.genome,t.chr,t.start,t.stop);if(e){throw'feature "'+t.label+'" position error: '+e}else{return}}if(!t.genename)throw"position required for a feature: no position or genename given";return p("/genelookup",{input:t.genename,genome:this.genome.name,deep:1}).then((e=>{if(e.error)throw e.error;if(!e.gmlst||e.gmlst.length==0)throw"no gene can be found for "+t.genename;const s=[];for(const t of e.gmlst){let e=true;for(const i of s){if(t.chr==i.chr&&Math.max(t.start,i.start)<Math.min(t.stop,i.stop)){e=false;i.start=Math.min(i.start,t.start);i.stop=Math.max(i.stop,t.stop);break}}if(e){s.push({chr:t.chr,start:t.start,stop:t.stop})}}if(s.length>1){a(this.errdiv,"multiple regions found for gene "+t.genename+" you'd better specify one in feature")}t.chr=s[0].chr;t.start=s[0].start;t.stop=s[0].stop}))}))}validate_feature(e){return Promise.resolve().then((()=>{e.id=Math.random().toString();const s=this.legendtable.append("tr");e.legend_tr=s;if(e.isgenevalue){if(!e.genename)throw".genename missing for isgenevalue feature";e.label=e.genename+" expression";if(this.dslabel){if(!e.querykey)throw".querykey missing for isgenevalue feature while loading from official dataset"}if(!e.scale)e.scale={auto:1};if(e.missingvalue==undefined)e.missingvalue=0;s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");if(!e.width)e.width=20;if(!e.color)e.color=H;return this.feature_parseposition_maygene(e)}if(e.iscnv){if(this.dslabel){if(!e.querykey)throw".querykey missing for iscnv feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" CNV"}s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");if(!e.width)e.width=40;if(!e.colorgain)e.colorgain=R;if(!e.colorloss)e.colorloss=U;return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" CNV";e.coordscale=h().domain([e.start,e.stop]).range([0,this.features_on_rows?e.height:e.width])}))}if(e.isloh){if(this.dslabel){if(!e.querykey)throw".querykey missing for isloh feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" LOH"}s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");if(!e.width)e.width=40;if(!e.color)e.color=D;return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" LOH";e.coordscale=h().domain([e.start,e.stop]).range([0,this.features_on_rows?e.height:e.width])}))}if(e.isvcf){if(this.dslabel){if(!e.querykey)throw".querykey missing for isvcf feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" SNV/indel"}s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");if(!e.width)e.width=20;if(!e.snvindel)e.snvindel={};return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" SNV/indel"}))}if(e.isitd){if(this.dslabel){if(!e.querykey)throw".querykey missing for isitd feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" ITD"}if(!e.width)e.width=20;if(!e.color)e.color=t[d].color;s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");e.legendholder.append("div").style("width","20px").html(" ").style("background",e.color);return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" ITD"}))}if(e.issvfusion){if(this.dslabel){if(!e.querykey)throw".querykey missing for issvfusion feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" SV/fusion"}if(!e.width)e.width=20;if(!e.color)e.color=G;s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" SV/fusion"}))}if(e.issvcnv){if(this.dslabel){if(!e.querykey)throw".querykey missing for issvcnv feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" CNV/SV"}s.append("td").text(e.label).style("color","#858585").style("text-align","right");e.legendholder=s.append("td");K(e);return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" CNV/SV"}))}if(e.ismutation){if(this.dslabel){if(!e.querykeylst)throw".querykeylst missing for ismutation feature";if(!Array.isArray(e.querykeylst))throw".querykeylst[] should be array for ismutation feature";if(e.querykeylst.length==0)throw"querykeylst[] empty array for ismutation feature"}if(!e.label&&e.genename){e.label=e.genename+" mutation"}s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");K(e);return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" mutation";e.coordscale=h().domain([e.start,e.stop]).range([0,this.features_on_rows?e.height:e.width])}))}if(e.issampleattribute){if(!this.dslabel)throw".dslabel missing: sampleattribute only works for official dataset";if(!e.key)throw".key missing for issampleattribute feature";if(!e.label)e.label=e.key;if(this.mds&&this.mds.sampleAttribute&&this.mds.sampleAttribute.attributes){const t=this.mds.sampleAttribute.attributes[e.key];if(t){e.values=t.values}}if(!e.values){e.values={}}e.assignmissingcolor=f(u);if(!e.width&&!this.features_on_rows)e.width=20;else if(!e.height&&this.features_on_rows)e.height=50;s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");return Promise.resolve()}throw"unknown feature type in validating feature"}))}get_features(t){this.max_cnv=0;this.min_cnv=0;this.max_loh=0;this.min_loh=0;const e={genome:this.genome.name,limitsamplebyeitherannotation:this.limitsamplebyeitherannotation,features:(t||this.features).map(Y)};if(this.limitbysamplesetgroup){e.sampleset=this.limitbysamplesetgroup.samples}if(this.iscustom){e.iscustom=1;e.querykey2tracks={};for(const t of e.features){if(t.querykey){e.querykey2tracks[t.querykey]=this.querykey2tracks[t.querykey]}else if(t.querykeylst){for(const s of t.querykeylst)e.querykey2tracks[s]=this.querykey2tracks[s]}}}else{e.dslabel=this.mds.label}return p("/samplematrix",e).then((t=>{if(t.error){for(const t of e.features){const e=this.features.find((e=>e.id==t.id));if(e)e.items=[]}throw t.error}for(const e of t.results){const t=this.features.find((t=>t.id==e.id));if(!t)throw"feature not found: "+t.id;t.items=e.items;this.prep_featuredata(t)}this.draw_matrix();this.make_legend();this.wait_div.style("display","none")}))}update_singlefeature(t){this.get_features([t]).catch((t=>{if(typeof t=="string"){this.error(t)}else{this.error(t.message);if(t.stack)console.log(t.stack)}}))}addnewfeature_update(t){this.features.push(t);this.validate_feature(t).then((()=>this.get_features([t]))).catch((t=>{this.error(typeof t=="string"?t:t.message);if(t.stack)console.log(t.stack)}))}prep_featuredata(t){if(t.isgenevalue){t.scale.maxv=0;t.scale.minv=0;for(const e of t.items){t.scale.maxv=Math.max(t.scale.maxv,e.value)}return}if(t.iscnv){const e=[],s=[];for(const i of t.items){if(i.value>0){e.push(i.value)}else{s.push(-i.value)}}const i=m(e,0);const a=m(s,0);t.maxabslogratio=Math.max(i,a);if(t.maxabslogratio>this.max_cnv)this.max_cnv=t.maxabslogratio;return}if(t.isloh){const e=t.items.map((t=>t.segmean));t.minvalue=0;t.maxvalue=Math.max(...e);if(t.maxvalue>this.max_loh)this.max_loh=t.maxvalue;return}if(t.isvcf){return}if(t.isitd){return}if(t.issvfusion){return}if(t.issvcnv||t.ismutation){const e=[],s=[];let i=0;for(const a of t.items){if(a.dt==y){if(a.value>0){e.push(a.value)}else{s.push(-a.value)}}else if(a.dt==g){i=Math.max(a.segmean,i)}}if(e.length+s.length>0){const i=m(e,0);const a=m(s,0);t.cnv.maxabslogratio=Math.max(i,a);if(t.cnv.maxabslogratio>this.max_cnv){this.max_cnv=t.cnv.maxabslogratio;this.min_cnv=-t.cnv.maxabslogratio;this.cnv_colorloss=t.cnv.colorloss;this.cnv_colorgain=t.cnv.colorgain}}if(i){t.loh.minvalue=0;t.loh.maxvalue=i;if(t.loh.maxvalue>this.max_loh)this.max_loh=t.loh.maxvalue;this.loh_color=t.loh.color}return}if(t.issampleattribute){for(const e of t.items){if(!t.values[e.value]){t.values[e.value]={name:e.value,color:t.assignmissingcolor(e.value)}}}return}throw"unknown feature type in preparing feature data"}make_legend(){for(const s of this.features){const i=s.legendholder;i.selectAll("*").remove();if(s.isgenevalue){i.append("span").text(s.scale.minv.toFixed(3));i.append("div").style("margin","2px 10px").style("display","inline-block").style("width","100px").style("height","15px").style("background","linear-gradient( to right, white, "+s.color+")");i.append("span").text(s.scale.maxv.toFixed(3));continue}if(s.iscnv){i.append("span").html('Gain <span style="background:'+s.colorgain+';color:white;padding:1px 5px">'+s.maxabslogratio.toFixed(3)+"</span> "+'Loss <span style="background:'+s.colorloss+';color:white;padding:1px 5px">-'+s.maxabslogratio.toFixed(3)+"</span>");continue}if(s.isloh){i.append("span").text(s.minvalue.toFixed(3));i.append("div").style("margin","2px 10px").style("display","inline-block").style("width","100px").style("height","15px").style("background","linear-gradient( to right, white, "+s.color+")");i.append("span").text(s.maxvalue.toFixed(3));continue}if(s.isvcf){const e=new Set;for(const t of s.items){if(t.class){e.add(t.class)}}for(const s of e){const e=i.append("div").style("display","inline-block").style("margin-right","10px");e.append("span").style("background",t[s].color).style("margin-right","2px").html(" ");e.append("span").text(t[s].label).style("color",t[s].color)}continue}if(s.isitd){continue}if(s.issvfusion){continue}if(s.issvcnv||s.ismutation){const a=new Map;let n=0;let o=0;let l=0;for(const t of s.items){if(t.dt==e){if(t.class&&t.sampledata){if(!a.has(t.class)){a.set(t.class,0)}a.set(t.class,a.get(t.class)+t.sampledata.length)}}else if(t.dt==v){n++}else if(t.dt==b){o++}else if(t.dt==_){l++}}if(a.size+n+o+l>0){const e=i.append("div").style("margin-bottom","5px").style("white-space","nowrap");for(const[s,i]of a){const a=t[s];const n=e.append("div").style("display","inline-block").style("margin-right","20px");n.append("span").attr("class","sja_mcdot").style("background",a.color).text(i);n.append("span").text(a.label).style("color",a.color)}if(n){const t=e.append("div").style("display","inline-block").style("margin-right","20px");t.append("span").attr("class","sja_mcdot").style("background",s.itd.color).text(n);t.append("span").text("ITD")}if(o){const t=e.append("div").style("display","inline-block").style("margin-right","20px");t.append("span").attr("class","sja_mcdot").style("background",s.sv.color).text(o);t.append("span").text("SV")}if(l){const t=e.append("div").style("display","inline-block").style("margin-right","20px");t.append("span").attr("class","sja_mcdot").style("background",s.fusion.color).text(l);t.append("span").text("Fusion")}}continue}if(s.issampleattribute){const t=new Map;for(const e of this.samples){const i=s.items.find((t=>t.sample==e.name));if(i){t.set(i.value,(t.get(i.value)||0)+1)}}for(const[e,a]of t){const t=i.append("div").style("display","inline-block").style("margin-right","20px");t.append("span").attr("class","sja_mcdot").style("background",s.values[e].color).text(a);t.append("span").text(s.values[e].name)}continue}throw"unknown feature type in making legend"}this.makeGlobalCnvLohLegend()}makeGlobalCnvLohLegend(){const t=[{type:"cnv",legend_label:"CNV log2(ratio): "},{type:"loh",legend_label:"LOH seg.mean: "}];const e=parseFloat(this.min_cnv.toFixed(3));const s=parseFloat(this.max_cnv.toFixed(3));const i=parseFloat(this.min_loh.toFixed(3));const a=parseFloat(this.max_loh.toFixed(3));let n=false;t.forEach((t=>{let o=t.type=="cnv"?this.min_cnv:this.min_loh;let l=t.type=="cnv"?this.max_cnv:this.max_loh;const r=t.type=="cnv"?this.legendtable.cnv_td:this.legendtable.loh_td;const c=r.append("div").style("margin-bottom","5px");c.append("span").text(t.legend_label);const p=c.append("span").text(o.toFixed(3));const h=c.append("input").attr("type","text").attr("size",8).style("display","none").property("value",o.toFixed(3));if(t.type=="cnv"){c.append("div").style("margin","4px 0 1px 10px").style("display","inline-block").style("width","50px").style("height","15px").style("background","linear-gradient( to right,"+this.cnv_colorloss+",white)")}c.append("div").style("margin","4px 10px 1px 10px").style("margin-left",t.type=="cnv"?"0":"10px").style("display","inline-block").style("width",t.type=="cnv"?"50px":"100px").style("height","15px").style("background","linear-gradient( to right, white, "+(t.type=="cnv"?this.cnv_colorgain:this.loh_color)+")");const d=c.append("span").text(l.toFixed(3));const f=c.append("input").attr("type","text").attr("size",8).style("display","none").property("value",l.toFixed(3));const u=c.append("button").style("margin","2px 5px").style("padding","3px 10px").text("Edit").on("click",(()=>{p.style("display","none");d.style("display","none");h.style("display","inline-block");f.style("display","inline-block");u.style("display","none");m.style("display","inline-block")}));const m=c.append("button").style("display","none").style("margin","2px 5px").style("padding","3px 10px").text("Submit").on("click",(()=>{if(t.type=="cnv"){this.min_cnv=o=h.property("value");this.max_cnv=l=f.property("value");if(this.min_cnv!=e||this.max_cnv!=s)n=true}else{this.min_loh=o=parseFloat(h.property("value"));this.max_loh=l=parseFloat(f.property("value"));if(this.min_loh!=i||this.max_loh!=a)n=true}p.style("display","inline-block").text(parseFloat(o).toFixed(3));d.style("display","inline-block").text(parseFloat(l).toFixed(3));h.style("display","none");f.style("display","none");u.style("display","inline-block");m.style("display","none");y.style("display",n?"inline-block":"none");this.draw_matrix()}));const y=c.append("button").style("display","none").style("margin","2px 5px").style("padding","3px 10px").text("Reset").on("click",(()=>{if(t.type=="cnv"){this.min_cnv=o=e;this.max_cnv=l=s}else{this.min_loh=o=i;this.max_loh=l=a}p.text(parseFloat(o).toFixed(3));d.text(parseFloat(l).toFixed(3));h.property("value",parseFloat(o).toFixed(3));f.property("value",parseFloat(l).toFixed(3));y.style("display","none");n=false;this.draw_matrix()}));y.style("display","none")}))}gatherSamplesFromFeatureData(){const t=new Map;for(const s of this.features){if(s.donotaddsample){continue}if(s.isgenevalue||s.iscnv||s.isloh||s.isitd||s.issvfusion||s.issvcnv){for(const e of s.items){if(!t.has(e.sample)){t.set(e.sample,{})}}}else if(s.isvcf){for(const i of s.items){if(i.dt==e){if(!i.sampledata)continue;for(const e of i.sampledata){if(!t.has(e.sampleobj.name)){t.set(e.sampleobj.name,{})}}}else{console.error("unsupported dt from isvcf: "+i.dt)}}}else if(s.ismutation){for(const i of s.items){if(i.dt==e){if(!i.sampledata)continue;for(const e of i.sampledata){if(!t.has(e.sampleobj.name)){t.set(e.sampleobj.name,{})}}}else{if(!i.sample)continue;if(!t.has(i.sample)){t.set(i.sample,{})}}}}else if(s.issampleattribute){for(const e of s.items){if(!t.has(e.sample)){t.set(e.sample,{})}}}else{console.error("unknown feature type from this.data")}}const s=Math.min(18,Math.max(1,Math.ceil(800/t.size)));this.samples=[];for(const[e,i]of t){if(!this.features_on_rows)i.height=s;else i.width=s;i.name=e;this.samples.push(i)}}draw_matrix(){this.svg.selectAll("*").remove();const t=this.svg.append("g");this.gatherSamplesFromFeatureData();this.sortsamplesbyfeatures();const e=this.features_on_rows?this.features:this.samples;const s=this.features_on_rows?this.samples:this.features;let i=0,a=0;for(const s of e){s.g=t.append("g").attr("transform","translate(0,"+i+")");i+=s.height+this.rowspace;if(s.height>=P){s.g.append("text").attr("font-family",x).attr("font-size",Math.min(16,s.height)).attr("text-anchor","end").attr("dominant-baseline","central").attr("x",-this.rowlabspace-this.rowlabticksize).attr("y",s.height/2).text(this.features_on_rows?s.label+(s.count?" ("+s.count+")":""):s.name).each((function(){a=Math.max(a,this.getBBox().width)})).attr("class","sja_clbtext").on("mouseover",(()=>{this.features_on_rows?this.showTip_feature(s):this.showTip_sample(s)})).on("mouseout",(()=>{this.tip.hide()})).on("click",(()=>{if(this.features_on_rows)this.showMenu_feature(s)}));s.g.append("line").attr("x1",-this.rowlabticksize).attr("y1",s.height/2).attr("y2",s.height/2).attr("stroke","black").attr("shape-rendering","crispEdges")}}let n=0,o=0;for(const e of s){const s=t.append("g").attr("transform","translate("+(n+e.width/2)+",-"+(this.collabspace+this.collabticksize)+")");n+=e.width+this.colspace;const i=s.append("text").attr("font-family",x).attr("font-size",Math.min(16,e.width-2)).attr("dominant-baseline","central").attr("transform","rotate(-90)").text(this.features_on_rows?e.name:e.label+(e.count?" ("+e.count+")":"")).each((function(){o=Math.max(o,this.getBBox().width)})).on("mouseover",(()=>{this.features_on_rows?this.showTip_sample(e):this.showTip_feature(e)})).on("mouseout",(()=>{this.tip.hide()})).on("click",(()=>{if(!this.features_on_rows)this.showMenu_feature(e)}));if(e.isgenevalue){i.attr("fill",e.color)}s.append("line").attr("y1",this.collabspace).attr("y2",this.collabspace+this.collabticksize).attr("stroke","black").attr("shape-rendering","crispEdges")}for(const t of e){let e=0;for(const i of s){const s=this.features_on_rows?i:t;const a=this.features_on_rows?t:i;const n=t.g.append("g").attr("transform","translate("+e+",0)");e+=i.width+this.colspace;if(a.isgenevalue){this.drawCell_isgenevalue(s,a,n)}else if(a.iscnv){this.drawCell_iscnv(s,a,n)}else if(a.isloh){this.drawCell_isloh(s,a,n)}else if(a.isvcf){this.drawCell_isvcf(s,a,n)}else if(a.isitd){this.drawCell_isitd(s,a,n)}else if(a.issvfusion){this.drawCell_issvfusion(s,a,n)}else if(a.issvcnv||a.ismutation){this.drawCell_ismutation(s,a,n)}else if(a.issampleattribute){this.drawCell_issampleattribute(s,a,n)}else{console.error("unknown feature type when drawing cell")}}}t.attr("transform","translate("+(a+this.rowlabspace+this.rowlabticksize)+","+(o+this.collabspace+this.collabticksize)+")");this.svg.attr("width",a+this.rowlabspace+this.rowlabticksize+s.reduce(((t,e)=>t+e.width),0)+s.length*this.colspace).attr("height",o+this.collabspace+this.collabticksize+e.reduce(((t,e)=>t+e.height),0)+e.length*this.rowspace)}drawCell_isgenevalue(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.find((e=>e.sample==t.name));if(!n){this.drawEmptycell(t,e,s);return}const o=s.append("rect").attr("width",a).attr("height",i).attr("fill",e.color).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}));if(n.value<e.scale.maxv){o.attr("fill-opacity",n.value/e.scale.maxv)}}drawCell_iscnv(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.filter((e=>e.sample==t.name));if(n.length==0){this.drawEmptycell(t,e,s);return}for(const i of n){const a=e.coordscale(Math.max(e.start,i.start));const n=e.coordscale(Math.min(e.stop,i.stop));const o=this.max_cnv;s.append("rect").attr("x",a).attr("width",Math.max(1,n-a)).attr("height",t.height).attr("fill",i.value>0?e.colorgain:e.colorloss).attr("fill-opacity",Math.abs(i.value/o)).attr("shape-rendering","crispEdges")}s.append("rect").attr("fill","white").attr("fill-opacity",0).attr("width",a).attr("height",i).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}))}drawCell_isloh(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.filter((e=>e.sample==t.name));if(n.length==0){this.drawEmptycell(t,e,s);return}for(const t of n){const n=e.coordscale(Math.max(e.start,t.start));const o=e.coordscale(Math.min(e.stop,t.stop));const l=this.max_loh-this.min_loh;s.append("rect").attr("x",this.features_on_rows?0:n).attr("y",this.features_on_rows?n:0).attr("width",this.features_on_rows?a:Math.max(1,o-n)).attr("height",this.features_on_rows?Math.max(1,o-n):i).attr("fill",e.color).attr("fill-opacity",(t.segmean-this.min_loh)/l).attr("shape-rendering","crispEdges")}s.append("rect").attr("fill","white").attr("fill-opacity",0).attr("width",a).attr("height",i).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}))}drawCell_isvcf(e,s,i){const a=this.features_on_rows?s.height:e.height;const n=this.features_on_rows?e.width:s.width;const o=$(s,e);if(o.length==0){this.drawEmptycell(e,s,i);return}const l=new Map;for(const t of o){if(!l.has(t.class)){l.set(t.class,0)}l.set(t.class,l.get(t.class)+1)}let r=0;for(const[e,s]of l){const l=s/o.length*this.features_on_rows?a:n;i.append("rect").attr("x",this.features_on_rows?0:r).attr("y",this.features_on_rows?r:0).attr("width",this.features_on_rows?n:l).attr("height",this.features_on_rows?l:a).attr("fill",t[e].color).attr("shape-rendering","crispEdges");r+=l}i.append("rect").attr("fill","white").attr("fill-opacity",0).attr("width",n).attr("height",a).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(t=>{t.target.setAttribute("stroke-opacity",1);this.showTip_cell(e,s)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(e,s)}))}drawCell_isitd(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.find((e=>e.sample==t.name));if(!n){this.drawEmptycell(t,e,s);return}s.append("rect").attr("width",a).attr("height",i).attr("fill",e.color).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}))}drawCell_issampleattribute(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.find((e=>e.sample==t.name));if(!n){this.drawEmptycell(t,e,s);return}s.append("rect").attr("width",a).attr("height",i).attr("fill",e.values[n.value].color).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}))}drawCell_issvfusion(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.find((e=>e.sample==t.name));if(!n){this.drawEmptycell(t,e,s);return}s.append("rect").attr("width",a).attr("height",i).attr("fill",e.color).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}))}drawCell_ismutation(e,s,i){const[a,n,o,l,r,c]=J(s,e);const p=this.features_on_rows?s.height:e.height;const h=this.features_on_rows?e.width:s.width;if(a.length+n.length+o.length+l.length+r.length+c.length==0){this.drawEmptycell(e,s,i);return}let d=false;if(this.ismutation_allsymbolic){d=true}else if(this.ismutation_allnotsymbolic);else{if(p<=4){d=true}}if(d){this.drawCell_ismutation_symbolic(e,s,i,a,n,o,l,r,c)}else{if(n.length){for(const t of n){const e=s.coordscale(Math.max(s.start,t.start));const a=s.coordscale(Math.min(s.stop,t.stop));const n=this.max_loh-this.min_loh;i.append("rect").attr("x",this.features_on_rows?0:e).attr("y",this.features_on_rows?e:0).attr("width",this.features_on_rows?h:Math.max(1,a-e)).attr("height",this.features_on_rows?Math.max(1,a-e):p).attr("fill",s.loh.color).attr("fill-opacity",(t.segmean-this.min_loh)/n).attr("shape-rendering","crispEdges")}}if(a.length){for(const t of a){const e=s.coordscale(Math.max(s.start,t.start));const a=s.coordscale(Math.min(s.stop,t.stop));const n=t.value>0?this.max_cnv:this.min_cnv;i.append("rect").attr("x",this.features_on_rows?0:e).attr("y",this.features_on_rows?e:0).attr("width",this.features_on_rows?h:Math.max(1,a-e)).attr("height",this.features_on_rows?Math.max(1,a-e):p).attr("fill",t.value>0?s.cnv.colorgain:s.cnv.colorloss).attr("fill-opacity",Math.abs(t.value/n)).attr("shape-rendering","crispEdges")}}if(o.length){for(const t of o){const e=s.coordscale(Math.max(s.start,t.start));const a=s.coordscale(Math.min(s.stop,t.stop));i.append("rect").attr("x",this.features_on_rows?0:e).attr("y",this.features_on_rows?e:0).attr("width",this.features_on_rows?h:Math.max(1,a-e)).attr("height",this.features_on_rows?Math.max(1,a-e):p).attr("fill",s.itd.color).attr("shape-rendering","crispEdges")}}if(l.length){i.append("circle").attr("cx",h/2).attr("cy",p/2).attr("r",Math.min(h,p)/2).attr("stroke",s.sv.color).attr("fill","none")}if(r.length){i.append("circle").attr("cx",h/2).attr("cy",p/2).attr("r",Math.min(h,p)/2).attr("stroke",s.fusion.color).attr("fill","none")}if(c.length){const e=c[0];const s=i.append("g").attr("transform","translate("+h/2+","+p/2+")");const a=t[e.m.class].color;const n=Math.min(h,p)/2;s.append("line").attr("x1",-n).attr("x2",n).attr("y1",-n).attr("y2",n).attr("stroke","white").attr("stroke-width",3);s.append("line").attr("x1",-n).attr("x2",n).attr("y1",n).attr("y2",-n).attr("stroke","white").attr("stroke-width",3);s.append("line").attr("x1",-n).attr("x2",n).attr("y1",-n).attr("y2",n).attr("stroke",a);s.append("line").attr("x1",-n).attr("x2",n).attr("y1",n).attr("y2",-n).attr("stroke",a)}}i.append("rect").attr("width",h).attr("height",p).attr("fill","white").attr("fill-opacity",0).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(t=>{t.target.setAttribute("stroke-opacity",1);this.showTip_cell(e,s)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(e,s)}))}drawCell_ismutation_symbolic(e,s,i,a,n,o,l,r,c){const p=this.features_on_rows?s.height:e.height;const h=this.features_on_rows?e.width:s.width;const d=this.max_loh-this.min_loh;const f=[];if(a.length){for(const t of a){const e=t.value>0?this.max_cnv:this.min_cnv;let i;if(t.value>0){i={color:s.cnv.colorgain}}else{i={color:s.cnv.colorloss}}i.opacity=Math.abs(t.value/e);f.push(i)}}if(n.length){for(const t of n){f.push({color:s.loh.color,opacity:(t.segmean-this.min_loh)/d})}}if(o.length){for(const t of o){f.push({color:s.itd.color})}}if(l.length){for(const t of l){f.push({color:s.sv.color})}}if(r.length){for(const t of r){f.push({color:s.fusion.color})}}if(c.length){for(const e of c){f.push({color:t[e.m.class].color})}}const u=this.features_on_rows?p/f.length:h/f.length;let m=0;for(const t of f){const e=i.append("rect").attr("x",this.features_on_rows?0:m).attr("y",this.features_on_rows?m:0).attr("width",this.features_on_rows?h:u).attr("height",this.features_on_rows?u:p).attr("fill",t.color).attr("shape-rendering","crispEdges");if(t.opacity)e.attr("opacity",t.opacity);m+=u}}async click_cell(t,e){try{let i;if(this.iscustom){i={iscustom:true,type:o.mdssvcnv,singlesample:{name:t.name}};for(const t in this.querykey2tracks){const e=this.querykey2tracks[t];if(e.type==o.mdssvcnv){i.name=e.name||"Custom tk";i.file=e.file;i.url=e.url;i.indexURL=e.indexURL}else if(e.type==o.mdsvcf){i.checkvcf={file:e.file,url:e.url,indexURL:e.indexURL}}else if(e.type==o.mdsexpression){i.checkexpressionrank={file:e.file,url:e.url,indexURL:e.indexURL}}}}else{if(!this.mds)throw"not custom but .mds{} missing";for(const e in this.mds.queries){const s=this.mds.queries[e];if(s.type==o.mdssvcnv){i={mds:this.mds,querykey:e,singlesample:{name:t.name}};for(const t in s)i[t]=s[t];break}}}if(!i)throw"cannot find a svcnv tk";i.bplengthUpperLimit=0;const a=s({x:100,y:100});const n={jwt:this.jwt,hostURL:this.hostURL,nobox:1,genome:this.genome,holder:a.body,chr:e.chr,start:e.start,stop:e.stop,tklst:[]};w(this.genome,n.tklst);n.tklst.push(i);if(!this.iscustom){if(!this.dslabel)throw"not custom but dslabel missing";const e={genome:this.genome.name,dslabel:this.dslabel,querykey:i.querykey,gettrack4singlesample:t.name};const s=await p("/mdssvcnv",e);if(s.error)throw"Error checking for assay track: "+s.error;if(s.tracks){for(const t of s.tracks)n.tklst.push(t)}}const l=await import("./block-ec76524e.js").then((function(t){return t.c}));new l.Block(n)}catch(t){window.alert(t.message||t);if(t.stack)console.log(t.stack)}}showTip_feature(t){this.tip.clear();this.tipContent_feature(t,this.tip.d);this.tip.showunder(event.target)}showMenu_feature(t){this.menu.showunder(event.target).clear();this.tipContent_feature(t,this.menu.d);this.menu.d.append("div").attr("class","sja_menuoption").text("Remove this feature").on("click",(()=>{this.menu.hide();t.legend_tr.remove();this.features.splice(this.features.findIndex((e=>e.id==t.id)),1);this.draw_matrix()}));if(t.isgenevalue)return C(this,t);if(t.iscnv)return L(this,t,t);if(t.isloh)return S(this,t,t);if(t.ismutation)return N(this,t);if(t.isitd){return}if(t.issvfusion){return}if(t.issvcnv){return}if(t.issampleattribute){return}}tipContent_feature(t,e){e.append("div").text(t.label).style("opacity",.5).style("font-size",".7em").style("margin","10px");if(t.isgenevalue||t.iscnv||t.isloh||t.isitd||t.issvfusion){e.append("div").html(t.chr+":"+t.start+"-"+t.stop+" "+k(t.stop-t.start)).style("font-size",".7em").style("opacity",.5).style("margin","0px 10px 10px 10px")}else if(t.issvcnv||t.ismutation){if(!t.genename){e.append("div").html(t.chr+":"+t.start+"-"+t.stop+" "+k(t.stop-t.start)).style("font-size",".7em").style("opacity",.5).style("margin","0px 10px 10px 10px")}}else if(t.issampleattribute){e.append("div").text(t.label)}if(t.isgenevalue){e.append("div").text("Min: "+t.scale.minv+", max: "+t.scale.maxv).style("font-size",".7em").style("opacity",.5).style("margin","0px 10px 10px 10px")}}showTip_sample(e){this.tip.clear().d.append("div").text(e.name).style("padding","10px").style("font-size",".7em");const s=[];for(const i of this.features){if(s.length>10){s.push({k:"more",v:"..."});break}if(i.isgenevalue){const t=i.items.find((t=>t.sample==e.name));s.push({k:i.label,v:t?t.value:B});continue}if(i.iscnv){const t=i.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=B}else{const e=t.map((t=>"<div>"+t.chr+":"+t.start+"-"+t.stop+" "+'<span style="font-size:.7em">'+k(t.stop-t.start)+"</span> "+'<span style="font-size:.8em;background:'+(t.value>0?i.colorgain:i.colorloss)+';color:white;padding:1px 5px">'+t.value+"</span>"+"</div>"));a=e.join("")}s.push({k:i.label,v:a});continue}if(i.isloh){const t=i.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=B}else{const e=t.map((t=>"<div>"+t.chr+":"+t.start+"-"+t.stop+" "+'<span style="font-size:.7em">'+k(t.stop-t.start)+"</span> "+'<span style="font-size:.8em;background:'+i.color+';color:white;padding:1px 5px">'+t.segmean+"</span>"+"</div>"));a=e.join("")}s.push({k:i.label,v:a});continue}if(i.isvcf){const a=$(i,e);let n;if(a.length==0){n=B}else{n=a.map((e=>'<div><span style="color:'+t[e.class].color+'">'+e.mname+"</span> "+'<span style="font-size:.7em;opacity:.5">'+t[e.class].label+"</span>"+"</div>")).join("")}s.push({k:i.label,v:n});continue}if(i.isitd){const t=i.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=B}else{a='<div style="background:'+i.color+';width:20px"> </div>'}s.push({k:i.label,v:a});continue}if(i.issvfusion){const t=i.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=B}else{a='<div style="background:'+i.color+';width:20px"> </div>'}s.push({k:i.label,v:a});continue}if(i.issvcnv){continue}if(i.ismutation){continue}if(i.issampleattribute){const t=i.items.find((t=>t.sample==e.name));if(t){s.push({k:i.label,v:t.value})}continue}console.error("sample tooltip: Unknown feature type")}z(this.tip.d,s);this.tip.show(event.clientX,event.clientY)}showTip_cell(e,s){const i=[{k:"sample",v:e.name}];if(s.isgenevalue){const t=s.items.find((t=>t.sample==e.name));i.push({k:s.label,v:t?t.value:B})}else if(s.iscnv){const t=s.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=B}else{const e=t.map((t=>"<div>"+t.chr+":"+t.start+"-"+t.stop+" "+'<span style="font-size:.7em">'+k(t.stop-t.start)+"</span> "+'<span style="font-size:.8em;background:'+(t.value>0?s.colorgain:s.colorloss)+';color:white;padding:1px 5px">'+t.value+"</span>"+"</div>"));a=e.join("")}i.push({k:s.label,v:a})}else if(s.isloh){const t=s.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=B}else{const e=t.map((t=>"<div>"+t.chr+":"+t.start+"-"+t.stop+" "+'<span style="font-size:.7em">'+k(t.stop-t.start)+"</span> "+'<span style="font-size:.8em;background:'+s.color+';color:white;padding:1px 5px">'+t.segmean+"</span>"+"</div>"));a=e.join("")}i.push({k:s.label,v:a})}else if(s.isvcf){const a=$(s,e);let n;if(a.length==0){n=B}else{n=a.map((e=>'<div><span style="color:'+t[e.class].color+'">'+e.mname+"</span> "+'<span style="font-size:.7em;opacity:.5">'+t[e.class].label+"</span>"+"</div>")).join("")}i.push({k:s.label,v:n})}else if(s.isitd){const t=s.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=B}else{const e=t.map((t=>"<div>"+t.chr+":"+t.start+"-"+t.stop+" "+"</div>"));a=e.join("")}i.push({k:s.label,v:a})}else if(s.issvfusion){const t=s.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=B}else{const e=t.map((t=>"<div>"+t.chrA+":"+t.posA+" - "+t.chrB+":"+t.posB+" "+"</div>"));a=e.join("")}i.push({k:s.label,v:a})}else if(s.issvcnv||s.ismutation){const[a,n,o,l,r,c]=J(s,e);if(a.length){i.push({k:(s.genename||s.label)+" CNV",v:a.map((t=>"<div>"+'<span style="background:'+(t.value>0?s.cnv.colorgain:s.cnv.colorloss)+';color:white;padding:0px 3px">'+t.value+"</span> "+'<span style="font-size:.8em">'+t.chr+":"+t.start+"-"+t.stop+" "+k(t.stop-t.start)+"</span>"+"</div>")).join("")})}if(n.length){i.push({k:(s.genename||s.label)+" LOH",v:n.map((t=>"<div>"+'<span style="background:'+s.loh.color+';color:white;padding:0px 3px">'+t.segmean+"</span> "+'<span style="font-size:.8em">'+t.chr+":"+t.start+"-"+t.stop+" "+k(t.stop-t.start)+"</span>"+"</div>")).join("")})}if(o.length){i.push({k:(s.genename||s.label)+" ITD",v:o.map((t=>'<div style="font-size:.8em">'+t.chr+":"+t.start+"-"+t.stop+"</div>")).join("")})}if(l.length){i.push({k:(s.genename||s.label)+" SV",v:l.map((t=>"<div>"+t.chrA+":"+t.posA+","+t.strandA+" > "+t.chrB+":"+t.posB+","+t.strandB+"</div>")).join("")})}if(r.length){i.push({k:(s.genename||s.label)+" fusion",v:r.map((t=>"<div>"+t.chrA+":"+t.posA+","+t.strandA+" > "+t.chrB+":"+t.posB+","+t.strandB+"</div>")).join("")})}if(c.length){i.push({k:(s.genename||s.label)+" SNV/indel",v:c.map((e=>{const s=t[e.m.class];return"<div>"+'<span style="color:'+s.color+'">'+(e.m.mname||"")+"</span> "+'<span style="font-size:.7em;opacity:.5">'+s.label+"</span>"+"</div>"})).join("")})}}else if(s.issampleattribute){const t=s.items.find((t=>t.sample==e.name));if(t){i.push({k:s.label,v:t.value})}}else{console.error("cell tooltip: unknown feature type")}this.tip.clear();z(this.tip.d,i);this.tip.show(event.clientX,event.clientY)}sortsamplesbyfeatures(){const t=this.features.find((t=>t.isgenevalue&&t.sort));if(t&&t.items){const e=new Map;for(const s of t.items){e.set(s.sample,s.value)}this.samples.sort(((s,i)=>{const a=e.has(s.name)?e.get(s.name):t.missingvalue;const n=e.has(i.name)?e.get(i.name):t.missingvalue;return n-a}))}}may_init_customvcf(t){if(t.info)return;const e=["genome="+this.genome.name];if(t.file){e.push("file="+t.file)}else{e.push("url="+t.url);if(t.indexURL)e.push("indexURL="+t.indexURL)}return q("vcfheader?"+e.join("&")).then((e=>{const[s,i,a,n]=F(e.metastr.split("\n"));if(n)throw"Error parsing VCF meta lines: "+n.join("; ");t.info=s;t.format=i;t.samples=a;t.nochr=e.nochr}))}drawEmptycell(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;if(i<5)return;s.append("line").attr("x2",a).attr("y2",i).attr("stroke","#ededed")}}function Y(t){if(t.isgenevalue){return{id:t.id,isgenevalue:1,querykey:t.querykey,genename:t.genename,chr:t.chr,start:t.start,stop:t.stop}}if(t.iscnv){return{id:t.id,iscnv:1,querykey:t.querykey,chr:t.chr,start:t.start,stop:t.stop,valuecutoff:t.valuecutoff,focalsizelimit:t.focalsizelimit}}if(t.isloh){return{id:t.id,isloh:1,querykey:t.querykey,chr:t.chr,start:t.start,stop:t.stop,valuecutoff:t.valuecutoff,focalsizelimit:t.focalsizelimit}}if(t.isvcf){return{id:t.id,isvcf:1,querykey:t.querykey,chr:t.chr,start:t.start,stop:t.stop,snvindel:{excludeclasses:t.snvindel.excludeclasses}}}if(t.isitd){return{id:t.id,isitd:1,querykey:t.querykey,chr:t.chr,start:t.start,stop:t.stop}}if(t.issvfusion){return{id:t.id,issvfusion:1,querykey:t.querykey,chr:t.chr,start:t.start,stop:t.stop}}if(t.issvcnv||t.ismutation){const e={id:t.id,chr:t.chr,start:t.start,stop:t.stop,cnv:{hidden:t.cnv.hidden,valuecutoff:t.cnv.valuecutoff,focalsizelimit:t.cnv.focalsizelimit},loh:{hidden:t.loh.hidden,valuecutoff:t.loh.valuecutoff,focalsizelimit:t.loh.focalsizelimit},itd:{hidden:t.itd.hidden},sv:{hidden:t.sv.hidden},fusion:{hidden:t.fusion.hidden},snvindel:{excludeclasses:t.snvindel.excludeclasses}};if(t.issvcnv){e.issvcnv=1;e.querykey=t.querykey}else{e.ismutation=1;e.querykeylst=t.querykeylst}return e}if(t.issampleattribute){return{id:t.id,issampleattribute:1,key:t.key}}throw"unknown feature type in making request parameter"}function $(t,s){const i=[];for(const a of t.items){if(a.dt==e){if(a.sampledata.findIndex((t=>t.sampleobj.name==s.name))!=-1){i.push(a)}}else{console.error("getitemforsample_vcf: unknown dt")}}return i}function J(t,s){const i=[],a=[],n=[],o=[],l=[],r=[];for(const c of t.items){if(c.dt==e){if(!c.sampledata)continue;const t=c.sampledata.find((t=>t.sampleobj.name==s.name));if(!t)continue;r.push({m:c,m_sample:t});continue}if(c.sample!=s.name)continue;if(c.dt==y){i.push(c)}else if(c.dt==g){a.push(c)}else if(c.dt==v){n.push(c)}else if(c.dt==b){o.push(c)}else if(c.dt==_){l.push(c)}else{console.error("unknown dt: "+c.dt)}}return[i,a,n,o,l,r]}function K(e){if(!e.width)e.width=20;if(!e.cnv)e.cnv={};if(!e.cnv.valuecutoff)e.cnv.valuecutoff=.2;if(!Number.isInteger(e.cnv.focalsizelimit))e.cnv.focalsizelimit=2e6;if(!e.cnv.colorgain)e.cnv.colorgain=R;if(!e.cnv.colorloss)e.cnv.colorloss=U;if(!e.loh)e.loh={};if(!e.loh.valuecutoff)e.loh.valuecutoff=.1;if(!Number.isInteger(e.loh.focalsizelimit))e.loh.focalsizelimit=2e6;if(!e.loh.color)e.loh.color=D;if(!e.itd)e.itd={};if(!e.itd.color)e.itd.color=t[d].color;if(!e.sv)e.sv={};if(!e.sv.color)e.sv.color=G;if(!e.fusion)e.fusion={};if(!e.fusion.color)e.fusion.color=G;if(!e.snvindel)e.snvindel={};if(!e.snvindel.excludeclasses)e.snvindel.excludeclasses={}}function Q(t){const e=t.holder.append("div").style("margin-bottom","5px");const s=t.holder.append("div").style("margin-bottom","20px");e.append("span").style("margin-right","20px").style("font-size",".8em").text("LEGEND").attr("class","sja_clbtext").on("click",(()=>{if(t.legendtable.style("display")=="none"){j(t.legendtable)}else{M(t.legendtable)}}));t.legendtable=s.append("table").style("border-top","solid 1px #ededed").style("border-bottom","solid 1px #ededed").style("border-spacing","10px").style("display","none");e.append("span").style("margin-right","20px").style("font-size",".8em").text("CONFIG").attr("class","sja_clbtext").on("click",(()=>{if(i.style("display")=="none"){j(i)}else{M(i)}}));const i=s.append("div").style("border-top","solid 1px #ededed").style("border-bottom","solid 1px #ededed").style("display","none");const a=i.append("div").style("margin","5px");a.append("div").style("vertical-align","top").style("display","inline-block").html("Show features as ");const n=a.append("div").style("display","inline-block");const o=[{value:"symbol",text:"CNV on genomic location, others as symbol"},{value:"proportion",text:"All features as porportion"}];o.forEach((e=>{const s=n.append("div");s.append("input").attr("type","radio").attr("id",e.value).attr("name","mutaion_display").attr("value",e.value).property("checked",e.value=="symbol"&&t.ismutation_allsymbolic===undefined&&t.ismutation_allnotsymbolic===undefined?1:e.value=="symbol"&&t.ismutation_allnotsymbolic?1:e.value=="proportion"&&t.ismutation_allsymbolic?1:0).on("change",(function(){if(e.value=="symbol"&&t.ismutation_allnotsymbolic)return;else if(e.value=="proportion"&&t.ismutation_allsymbolic)return;else if(e.value=="symbol"){delete t.ismutation_allsymbolic;t.ismutation_allnotsymbolic=true}else if(e.value=="proportion"){t.ismutation_allsymbolic=true;delete t.ismutation_allnotsymbolic}else{return}t.draw_matrix()}));s.append("label").attr("for",e.value).text(e.text)}));const l=i.append("div").style("margin","5px");l.append("div").style("vertical-align","top").style("display","inline-block").html("Layout of Matrix ");const r=l.append("div").style("display","inline-block");const c=[{value:"gene_on_row",text:"Genes as Rows"},{value:"sam_on_row",text:"Samples as Rows"}];c.forEach((e=>{const s=r.append("div");s.append("input").attr("type","radio").attr("id",e.value).attr("name","layout").attr("value",e.value).property("checked",e.value=="gene_on_row"&&t.features_on_rows?1:e.value=="sam_on_row"&&!t.features_on_rows?1:0).on("change",(function(){if(e.value=="gene_on_row"&&t.features_on_rows)return;else if(e.value=="sam_on_row"&&!t.features_on_rows)return;else if(e.value=="gene_on_row"){t.features_on_rows=true;if(t.ori_feature_width)t.features.forEach((e=>e.height=t.ori_feature_width))}else{t.features_on_rows=false;if(t.ori_feature_height)t.features.forEach((e=>e.width=t.ori_feature_height))}t.draw_matrix()}));s.append("label").attr("for",e.value).text(e.text)}));e.append("span").style("margin-right","20px").style("font-size",".8em").text("DATA").attr("class","sja_clbtext").on("click",(()=>{W(t)}));T(t,e)}function W(t){const e=["sample\tfeature\tvarianttype\tvariant"];for(const s of t.samples){for(const i of t.features){for(const t of i.items){if(t.sample&&t.sample==s.name||t.sampledata&&t.sampledata.findIndex((t=>t.sampleobj.name==s.name))!=-1){e.push(s.name+"\t"+i.label+"\t"+E[t.dt]+"\t"+Z(t))}}}}A("Matrix data",[{text:e.join("\n")}])}function Z(s){if(s.dt==e)return s.mname+" "+t[s.class].label+" "+s.chr+"."+s.pos+"."+s.ref+"."+s.alt;if(s.dt==_||s.dt==b)return s.chrA+"."+s.posA+"."+(s.strandA||"")+" > "+s.chrB+"."+s.posB+"."+(s.strandB||"");if(s.dt==y)return s.chr+":"+s.start+"-"+s.stop+", log2(ratio): "+s.value;if(s.dt==g)return s.chr+":"+s.start+"-"+s.stop+", log2(ratio): "+s.segmean;if(s.dt==v)return s.chr+":"+s.start+"-"+s.stop;return""}export{X as Samplematrix};
|
|
1
|
+
import{E as t,L as e,a0 as s,M as i,o as a,bb as n,a2 as o,S as l,X as r,P as c,c as p,l as h,bc as d,am as f,an as u,bd as m,af as y,be as g,I as v,K as b,J as _,p as x,b8 as w,m as k,_ as z,d as q,g as j,h as M,O as E,N as A}from"./app-71453429.js";import{v as F}from"./vcf-16ba1e06.js";function C(t,e){t.menu.d.append("div").attr("class","sja_menuoption").text("Sort").on("click",(()=>{t.menu.hide();if(e.sort){return}for(const e of t.features){if(e.isgenevalue)delete e.sort}e.sort=1;t.draw_matrix()}))}function L(t,e,s){{const i=t.menu.d.append("div").style("margin","10px");i.append("span").html("CNV log2(ratio) cutoff ");i.append("input").property("value",s.valuecutoff||0).attr("type","number").style("width","50px").on("keyup",(i=>{if(i.code!="Enter"&&i.code!="NumpadEnter")return;let a=Number.parseFloat(i.target.value);if(!a||a<0){a=0}if(a==0){if(s.valuecutoff){s.valuecutoff=0;t.update_singlefeature(e)}return}if(s.valuecutoff){if(s.valuecutoff==a);else{s.valuecutoff=a;t.update_singlefeature(e)}}else{s.valuecutoff=a;t.update_singlefeature(e)}}));i.append("div").style("font-size",".7em").style("opacity",.5).html("Only show CNV with absolute log2(ratio) no less than cutoff.<br>Set to 0 to cancel.")}{const i=t.menu.d.append("div").style("margin","10px");i.append("span").html("CNV segment size limit ");i.append("input").property("value",s.focalsizelimit||0).attr("type","number").style("width","100px").on("keyup",(i=>{if(i.code!="Enter"&&i.code!="NumpadEnter")return;let a=Number.parseInt(i.target.value);if(!a||a<0){a=0}if(a==0){if(s.focalsizelimit){s.focalsizelimit=0;t.update_singlefeature(e)}return}if(s.focalsizelimit){if(s.focalsizelimit==a);else{s.focalsizelimit=a;t.update_singlefeature(e)}}else{s.focalsizelimit=a;t.update_singlefeature(e)}}));i.append("span").text("bp");i.append("div").style("font-size",".7em").style("opacity",.5).html("Limit the CNV segment length to show only focal events.<br>Set to 0 to cancel.")}}function S(t,e,s){{const i=t.menu.d.append("div").style("margin","10px");i.append("span").html("LOH segmean cutoff ");i.append("input").property("value",s.valuecutoff||0).attr("type","number").style("width","50px").on("keyup",(i=>{if(i.code!="Enter"&&i.code!="NumpadEnter")return;let a=Number.parseFloat(i.target.value);if(!a||a<0){a=0}if(a==0){if(s.valuecutoff){s.valuecutoff=0;t.update_singlefeature(e)}return}if(s.valuecutoff){if(s.valuecutoff==a);else{s.valuecutoff=a;t.update_singlefeature(e)}}else{s.valuecutoff=a;t.update_singlefeature(e)}}));i.append("div").style("font-size",".7em").style("opacity",.5).html("Only show LOH with segmean no less than cutoff.<br>Set to 0 to cancel.")}{const i=t.menu.d.append("div").style("margin","10px");i.append("span").html("LOH segment size limit ");i.append("input").property("value",s.focalsizelimit||0).attr("type","number").style("width","100px").on("keyup",(i=>{if(i.code!="Enter"&&i.code!="NumpadEnter")return;let a=Number.parseInt(i.target.value);if(!a||a<0){a=0}if(a==0){if(s.focalsizelimit){s.focalsizelimit=0;t.update_singlefeature(e)}return}if(s.focalsizelimit){if(s.focalsizelimit==a);else{s.focalsizelimit=a;t.update_singlefeature(e)}}else{s.focalsizelimit=a;t.update_singlefeature(e)}}));i.append("span").text("bp");i.append("div").style("font-size",".7em").style("opacity",.5).html("Limit the LOH segment length to show only focal events.<br>Set to 0 to cancel.")}}function N(s,i){{const a=s.menu.d.append("div").style("margin","10px").style("border","solid 1px #ededed");const n=()=>{s.update_singlefeature(i);s.menu.hide()};const o=a.append("table").style("margin","10px").style("border-spacing","1px");const l=o.append("tbody");{const t=l.append("tr");t.append("td").style("opacity",.5).text("CNV");t.append("td").attr("class","sja_menuoption").text(i.cnv.hidden?"Show":"Hide").on("click",(()=>{i.cnv.hidden=!i.cnv.hidden;n()}));t.append("td").attr("class","sja_menuoption").text("Show only").on("click",(()=>{V(i);delete i.cnv.hidden;n()}));const e=t.append("td");if(!i.cnv.hidden){e.attr("class","sja_menuoption").style("font-size",".8em").text("CONFIG").on("click",(()=>{s.menu.clear();L(s,i,i.cnv)}))}}{const t=l.append("tr");t.append("td").style("opacity",.5).text("LOH");t.append("td").attr("class","sja_menuoption").text(i.loh.hidden?"Show":"Hide").on("click",(()=>{i.loh.hidden=!i.loh.hidden;n()}));t.append("td").attr("class","sja_menuoption").text("Show only").on("click",(()=>{V(i);delete i.loh.hidden;n()}));const e=t.append("td");if(!i.loh.hidden){e.attr("class","sja_menuoption").style("font-size",".8em").text("CONFIG").on("click",(()=>{s.menu.clear();S(s,i,i.loh)}))}}{const t=l.append("tr");t.append("td").style("opacity",.5).text("ITD");t.append("td").attr("class","sja_menuoption").text(i.itd.hidden?"Show":"Hide").on("click",(()=>{i.itd.hidden=!i.itd.hidden;n()}));t.append("td").attr("class","sja_menuoption").text("Show only").on("click",(()=>{V(i);delete i.itd.hidden;n()}));t.append("td");if(!i.itd.hidden);}{const t=l.append("tr");t.append("td").style("opacity",.5).text("SV");t.append("td").attr("class","sja_menuoption").text(i.sv.hidden?"Show":"Hide").on("click",(()=>{i.sv.hidden=!i.sv.hidden;n()}));t.append("td").attr("class","sja_menuoption").text("Show only").on("click",(()=>{V(i);delete i.sv.hidden;n()}));t.append("td");if(!i.sv.hidden);}{const t=l.append("tr");t.append("td").style("opacity",.5).text("Fusion");t.append("td").attr("class","sja_menuoption").text(i.fusion.hidden?"show":"hide").on("click",(()=>{i.fusion.hidden=!i.fusion.hidden;n()}));t.append("td").attr("class","sja_menuoption").text("show only").on("click",(()=>{V(i);delete i.fusion.hidden;n()}));t.append("td");if(!i.fusion.hidden);}o.append("tbody").append("tr").append("td").attr("colspan",4).style("padding-top","10px").append("span").style("font-size",".8em").text("List SNV/indel").attr("class","sja_clbtext").on("click",(()=>{if(r.style("display")=="none"){r.style("display","table-row-group")}else{r.style("display","none")}}));const r=o.append("tbody").style("display","none");for(const s in t){const a=t[s];if(a.dt!=e){continue}const o=r.append("tr");o.append("td").style("opacity",.5).text(a.label);o.append("td").attr("class","sja_menuoption").text(i.snvindel.excludeclasses[s]?"Show":"Hide").on("click",(()=>{if(i.snvindel.excludeclasses[s]){delete i.snvindel.excludeclasses[s]}else{i.snvindel.excludeclasses[s]=1}n()}));o.append("td").attr("class","sja_menuoption").text("Show only").on("click",(()=>{V(i);delete i.snvindel.excludeclasses[s];n()}));o.append("td")}a.append("div").style("margin","10px").append("span").style("font-size",".8em").text("Show all classes").attr("class","sja_clbtext").on("click",(()=>{i.cnv.hidden=false;i.loh.hidden=false;i.itd.hidden=false;i.sv.hidden=false;i.fusion.hidden=false;i.snvindel.excludeclasses={};n()}))}}function V(s){s.cnv.hidden=true;s.loh.hidden=true;s.itd.hidden=true;s.sv.hidden=true;s.fusion.hidden=true;s.snvindel.excludeclasses={};for(const i in t){if(t[i].dt==e)s.snvindel.excludeclasses[i]=1}}function T(t,e){if(!t.mds||!t.mds.survivalplot)return;e.append("span").style("margin-right","20px").style("font-size",".8em").text("SURVIVAL PLOT").attr("class","sja_clbtext").on("click",(e=>{t.menu.clear().showunder(e.target);I(t)}))}async function I(t){const e=t.features.filter((t=>t.ismutation));try{if(e.length!=2)throw"only works with two genomic features.";await O(t,e[0],e[1])}catch(e){t.menu.d.append("div").style("margin","20px").text("Cannot make survival plot: "+(e.message||e))}}async function O(t,e,i){const a=[],n=[],o=[];for(const s of t.samples){const t=e.items.find((t=>t.sample==s.name));const l=i.items.find((t=>t.sample==s.name));if(t){if(l)o.push(s.name);else a.push(s.name)}else{n.push(s.name)}}const l={renderplot:1,samplerule:{full:{},mutated_sets:[{name:e.label+" mutated (n="+a.length+")",samplenames:a},{name:i.label+" mutated (n="+n.length+")",samplenames:n},{name:e.label+" and "+i.label+" mutated (n="+o.length+")",samplenames:o}]}};if(t.limitsamplebyeitherannotation){l.samplerule.full={byattr:1,key:t.limitsamplebyeitherannotation[0].key,value:t.limitsamplebyeitherannotation[0].value,immutable:1}}const r=s({x:100,y:100});r.header.text((t.limitsamplebyeitherannotation?t.limitsamplebyeitherannotation[0].value+" ":"")+"survival by "+e.label+" and "+i.label+" mutation status");const c=await import("./mds.survivalplot-c5093f73.js");c.init({mds:t.mds,genome:t.genome,plotlist:[l]},r.body)}const B="na";const R="#D6683C";const U="#67a9cf";const H="#095873";const D="#858585";const G="#858585";const P=8;class X{constructor(t){for(const e in t){this[e]=t[e]}if(this.debugmode)window.smat=this;this.tip=new i({padding:"0px",hideXmute:1,hideYmute:1});this.menu=new i({padding:"0px"});this.errdiv=this.holder.append("div");if(!this.iscustom){try{if(!this.dslabel)throw"not custom data but dslabel is missing";this.mds=this.genome.datasets[this.dslabel];if(!this.mds)throw"invalid dataset name: "+this.dslabel;if(!this.mds.isMds)throw"improper dataset: "+this.dslabel}catch(t){this.error(t)}}Q(this);if(this.header){this.holder.append("div").style("margin-bottom","20px").html(this.header)}this.wait_div=this.holder.append("div");this.wait_div.style("display","block").text("Loading...");this.svg=this.holder.append("svg");this.validate_config().then((()=>this.get_features())).catch((t=>{if(typeof t=="string"){this.error(t)}else{this.error(t.message);if(t.stack)console.log(t.stack)}}))}error(t){a(this.errdiv,t)}async validate_config(){if(this.iscustom){if(!this.querykey2tracks)throw"querykey2tracks missing for custom dataset";let t=true;for(const e in this.querykey2tracks){const s=this.querykey2tracks[e];if(!s.file&&!s.url)throw"no file or url for a custom track by key "+e;if(!s.type)throw"missing type for member track by key "+e;if(!n(s.type))throw"invalid type for a member track: "+s.type;t=false}if(t)throw"no custom tracks from querykey2tracks";let e;for(const t in this.querykey2tracks){const s=this.querykey2tracks[t];if(s.type==o.mdsvcf){e=s}}if(e){await this.may_init_customvcf(e)}}else{if(this.mds.mdsIsUninitiated){const t=await l(`getDataset?genome=${this.genome.name}&dsname=${this.mds.label}`);if(t.error)throw t.error;if(!t.ds)throw"ds missing";Object.assign(this.mds,t.ds);delete this.mds.mdsIsUninitiated}}if(this.limitsamplebyeitherannotation){if(!Array.isArray(this.limitsamplebyeitherannotation))throw"limitsamplebyeitherannotation must be an array";this.legendtable.append("tr");for(const t of this.limitsamplebyeitherannotation){if(!t.key)throw".key missing from an element of limitsamplebyeitherannotation";if(!t.value)throw".value missing from an element of limitsamplebyeitherannotation"}this.showlegend_limitsample()}const t=this.legendtable.append("tr");t.append("td").style("opacity",.5).style("text-align","right").text("CNV cutoff");this.legendtable.cnv_td=t.append("td");const e=this.legendtable.append("tr");e.append("td").style("opacity",.5).style("text-align","right").text("LOH cutoff");this.legendtable.loh_td=e.append("td");if(this.limitbysamplesetgroup){if(!Array.isArray(this.limitbysamplesetgroup.samples))throw".limitbysamplesetgroup.samples is not array"}if(!this.rowspace)this.rowspace=1;if(!this.colspace)this.colspace=1;if(!this.rowlabspace)this.rowlabspace=5;if(!this.collabspace)this.collabspace=5;if(!this.rowlabticksize)this.rowlabticksize=5;if(!this.collabticksize)this.collabticksize=5;if(!this.features)throw"missing features[]";if(!Array.isArray(this.features))throw"features must be an array";if(this.features[0].height)this.ori_feature_height=this.features[0].height;if(this.features[0].width)this.ori_feature_width=this.features[0].width;for(const t of this.features){await this.validate_feature(t)}}showlegend_limitsample(){if(!this.limitsamplebyeitherannotation)return}feature_parseposition_maygene(t){return Promise.resolve().then((()=>{if(t.position){const e=r(t.position,this.genome);if(e){t.chr=e.chr;t.start=e.start;t.stop=e.stop}}if(t.chr){const e=c(this.genome,t.chr,t.start,t.stop);if(e){throw'feature "'+t.label+'" position error: '+e}else{return}}if(!t.genename)throw"position required for a feature: no position or genename given";return p("/genelookup",{input:t.genename,genome:this.genome.name,deep:1}).then((e=>{if(e.error)throw e.error;if(!e.gmlst||e.gmlst.length==0)throw"no gene can be found for "+t.genename;const s=[];for(const t of e.gmlst){let e=true;for(const i of s){if(t.chr==i.chr&&Math.max(t.start,i.start)<Math.min(t.stop,i.stop)){e=false;i.start=Math.min(i.start,t.start);i.stop=Math.max(i.stop,t.stop);break}}if(e){s.push({chr:t.chr,start:t.start,stop:t.stop})}}if(s.length>1){a(this.errdiv,"multiple regions found for gene "+t.genename+" you'd better specify one in feature")}t.chr=s[0].chr;t.start=s[0].start;t.stop=s[0].stop}))}))}validate_feature(e){return Promise.resolve().then((()=>{e.id=Math.random().toString();const s=this.legendtable.append("tr");e.legend_tr=s;if(e.isgenevalue){if(!e.genename)throw".genename missing for isgenevalue feature";e.label=e.genename+" expression";if(this.dslabel){if(!e.querykey)throw".querykey missing for isgenevalue feature while loading from official dataset"}if(!e.scale)e.scale={auto:1};if(e.missingvalue==undefined)e.missingvalue=0;s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");if(!e.width)e.width=20;if(!e.color)e.color=H;return this.feature_parseposition_maygene(e)}if(e.iscnv){if(this.dslabel){if(!e.querykey)throw".querykey missing for iscnv feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" CNV"}s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");if(!e.width)e.width=40;if(!e.colorgain)e.colorgain=R;if(!e.colorloss)e.colorloss=U;return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" CNV";e.coordscale=h().domain([e.start,e.stop]).range([0,this.features_on_rows?e.height:e.width])}))}if(e.isloh){if(this.dslabel){if(!e.querykey)throw".querykey missing for isloh feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" LOH"}s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");if(!e.width)e.width=40;if(!e.color)e.color=D;return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" LOH";e.coordscale=h().domain([e.start,e.stop]).range([0,this.features_on_rows?e.height:e.width])}))}if(e.isvcf){if(this.dslabel){if(!e.querykey)throw".querykey missing for isvcf feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" SNV/indel"}s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");if(!e.width)e.width=20;if(!e.snvindel)e.snvindel={};return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" SNV/indel"}))}if(e.isitd){if(this.dslabel){if(!e.querykey)throw".querykey missing for isitd feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" ITD"}if(!e.width)e.width=20;if(!e.color)e.color=t[d].color;s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");e.legendholder.append("div").style("width","20px").html(" ").style("background",e.color);return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" ITD"}))}if(e.issvfusion){if(this.dslabel){if(!e.querykey)throw".querykey missing for issvfusion feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" SV/fusion"}if(!e.width)e.width=20;if(!e.color)e.color=G;s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" SV/fusion"}))}if(e.issvcnv){if(this.dslabel){if(!e.querykey)throw".querykey missing for issvcnv feature while loading from official dataset"}if(!e.label&&e.genename){e.label=e.genename+" CNV/SV"}s.append("td").text(e.label).style("color","#858585").style("text-align","right");e.legendholder=s.append("td");K(e);return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" CNV/SV"}))}if(e.ismutation){if(this.dslabel){if(!e.querykeylst)throw".querykeylst missing for ismutation feature";if(!Array.isArray(e.querykeylst))throw".querykeylst[] should be array for ismutation feature";if(e.querykeylst.length==0)throw"querykeylst[] empty array for ismutation feature"}if(!e.label&&e.genename){e.label=e.genename+" mutation"}s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");K(e);return this.feature_parseposition_maygene(e).then((()=>{if(!e.label)e.label=e.chr+":"+e.start+"-"+e.stop+" mutation";e.coordscale=h().domain([e.start,e.stop]).range([0,this.features_on_rows?e.height:e.width])}))}if(e.issampleattribute){if(!this.dslabel)throw".dslabel missing: sampleattribute only works for official dataset";if(!e.key)throw".key missing for issampleattribute feature";if(!e.label)e.label=e.key;if(this.mds&&this.mds.sampleAttribute&&this.mds.sampleAttribute.attributes){const t=this.mds.sampleAttribute.attributes[e.key];if(t){e.values=t.values}}if(!e.values){e.values={}}e.assignmissingcolor=f(u);if(!e.width&&!this.features_on_rows)e.width=20;else if(!e.height&&this.features_on_rows)e.height=50;s.append("td").text(e.label).style("opacity",.5).style("text-align","right");e.legendholder=s.append("td");return Promise.resolve()}throw"unknown feature type in validating feature"}))}get_features(t){this.max_cnv=0;this.min_cnv=0;this.max_loh=0;this.min_loh=0;const e={genome:this.genome.name,limitsamplebyeitherannotation:this.limitsamplebyeitherannotation,features:(t||this.features).map(Y)};if(this.limitbysamplesetgroup){e.sampleset=this.limitbysamplesetgroup.samples}if(this.iscustom){e.iscustom=1;e.querykey2tracks={};for(const t of e.features){if(t.querykey){e.querykey2tracks[t.querykey]=this.querykey2tracks[t.querykey]}else if(t.querykeylst){for(const s of t.querykeylst)e.querykey2tracks[s]=this.querykey2tracks[s]}}}else{e.dslabel=this.mds.label}return p("/samplematrix",e).then((t=>{if(t.error){for(const t of e.features){const e=this.features.find((e=>e.id==t.id));if(e)e.items=[]}throw t.error}for(const e of t.results){const t=this.features.find((t=>t.id==e.id));if(!t)throw"feature not found: "+t.id;t.items=e.items;this.prep_featuredata(t)}this.draw_matrix();this.make_legend();this.wait_div.style("display","none")}))}update_singlefeature(t){this.get_features([t]).catch((t=>{if(typeof t=="string"){this.error(t)}else{this.error(t.message);if(t.stack)console.log(t.stack)}}))}addnewfeature_update(t){this.features.push(t);this.validate_feature(t).then((()=>this.get_features([t]))).catch((t=>{this.error(typeof t=="string"?t:t.message);if(t.stack)console.log(t.stack)}))}prep_featuredata(t){if(t.isgenevalue){t.scale.maxv=0;t.scale.minv=0;for(const e of t.items){t.scale.maxv=Math.max(t.scale.maxv,e.value)}return}if(t.iscnv){const e=[],s=[];for(const i of t.items){if(i.value>0){e.push(i.value)}else{s.push(-i.value)}}const i=m(e,0);const a=m(s,0);t.maxabslogratio=Math.max(i,a);if(t.maxabslogratio>this.max_cnv)this.max_cnv=t.maxabslogratio;return}if(t.isloh){const e=t.items.map((t=>t.segmean));t.minvalue=0;t.maxvalue=Math.max(...e);if(t.maxvalue>this.max_loh)this.max_loh=t.maxvalue;return}if(t.isvcf){return}if(t.isitd){return}if(t.issvfusion){return}if(t.issvcnv||t.ismutation){const e=[],s=[];let i=0;for(const a of t.items){if(a.dt==y){if(a.value>0){e.push(a.value)}else{s.push(-a.value)}}else if(a.dt==g){i=Math.max(a.segmean,i)}}if(e.length+s.length>0){const i=m(e,0);const a=m(s,0);t.cnv.maxabslogratio=Math.max(i,a);if(t.cnv.maxabslogratio>this.max_cnv){this.max_cnv=t.cnv.maxabslogratio;this.min_cnv=-t.cnv.maxabslogratio;this.cnv_colorloss=t.cnv.colorloss;this.cnv_colorgain=t.cnv.colorgain}}if(i){t.loh.minvalue=0;t.loh.maxvalue=i;if(t.loh.maxvalue>this.max_loh)this.max_loh=t.loh.maxvalue;this.loh_color=t.loh.color}return}if(t.issampleattribute){for(const e of t.items){if(!t.values[e.value]){t.values[e.value]={name:e.value,color:t.assignmissingcolor(e.value)}}}return}throw"unknown feature type in preparing feature data"}make_legend(){for(const s of this.features){const i=s.legendholder;i.selectAll("*").remove();if(s.isgenevalue){i.append("span").text(s.scale.minv.toFixed(3));i.append("div").style("margin","2px 10px").style("display","inline-block").style("width","100px").style("height","15px").style("background","linear-gradient( to right, white, "+s.color+")");i.append("span").text(s.scale.maxv.toFixed(3));continue}if(s.iscnv){i.append("span").html('Gain <span style="background:'+s.colorgain+';color:white;padding:1px 5px">'+s.maxabslogratio.toFixed(3)+"</span> "+'Loss <span style="background:'+s.colorloss+';color:white;padding:1px 5px">-'+s.maxabslogratio.toFixed(3)+"</span>");continue}if(s.isloh){i.append("span").text(s.minvalue.toFixed(3));i.append("div").style("margin","2px 10px").style("display","inline-block").style("width","100px").style("height","15px").style("background","linear-gradient( to right, white, "+s.color+")");i.append("span").text(s.maxvalue.toFixed(3));continue}if(s.isvcf){const e=new Set;for(const t of s.items){if(t.class){e.add(t.class)}}for(const s of e){const e=i.append("div").style("display","inline-block").style("margin-right","10px");e.append("span").style("background",t[s].color).style("margin-right","2px").html(" ");e.append("span").text(t[s].label).style("color",t[s].color)}continue}if(s.isitd){continue}if(s.issvfusion){continue}if(s.issvcnv||s.ismutation){const a=new Map;let n=0;let o=0;let l=0;for(const t of s.items){if(t.dt==e){if(t.class&&t.sampledata){if(!a.has(t.class)){a.set(t.class,0)}a.set(t.class,a.get(t.class)+t.sampledata.length)}}else if(t.dt==v){n++}else if(t.dt==b){o++}else if(t.dt==_){l++}}if(a.size+n+o+l>0){const e=i.append("div").style("margin-bottom","5px").style("white-space","nowrap");for(const[s,i]of a){const a=t[s];const n=e.append("div").style("display","inline-block").style("margin-right","20px");n.append("span").attr("class","sja_mcdot").style("background",a.color).text(i);n.append("span").text(a.label).style("color",a.color)}if(n){const t=e.append("div").style("display","inline-block").style("margin-right","20px");t.append("span").attr("class","sja_mcdot").style("background",s.itd.color).text(n);t.append("span").text("ITD")}if(o){const t=e.append("div").style("display","inline-block").style("margin-right","20px");t.append("span").attr("class","sja_mcdot").style("background",s.sv.color).text(o);t.append("span").text("SV")}if(l){const t=e.append("div").style("display","inline-block").style("margin-right","20px");t.append("span").attr("class","sja_mcdot").style("background",s.fusion.color).text(l);t.append("span").text("Fusion")}}continue}if(s.issampleattribute){const t=new Map;for(const e of this.samples){const i=s.items.find((t=>t.sample==e.name));if(i){t.set(i.value,(t.get(i.value)||0)+1)}}for(const[e,a]of t){const t=i.append("div").style("display","inline-block").style("margin-right","20px");t.append("span").attr("class","sja_mcdot").style("background",s.values[e].color).text(a);t.append("span").text(s.values[e].name)}continue}throw"unknown feature type in making legend"}this.makeGlobalCnvLohLegend()}makeGlobalCnvLohLegend(){const t=[{type:"cnv",legend_label:"CNV log2(ratio): "},{type:"loh",legend_label:"LOH seg.mean: "}];const e=parseFloat(this.min_cnv.toFixed(3));const s=parseFloat(this.max_cnv.toFixed(3));const i=parseFloat(this.min_loh.toFixed(3));const a=parseFloat(this.max_loh.toFixed(3));let n=false;t.forEach((t=>{let o=t.type=="cnv"?this.min_cnv:this.min_loh;let l=t.type=="cnv"?this.max_cnv:this.max_loh;const r=t.type=="cnv"?this.legendtable.cnv_td:this.legendtable.loh_td;const c=r.append("div").style("margin-bottom","5px");c.append("span").text(t.legend_label);const p=c.append("span").text(o.toFixed(3));const h=c.append("input").attr("type","text").attr("size",8).style("display","none").property("value",o.toFixed(3));if(t.type=="cnv"){c.append("div").style("margin","4px 0 1px 10px").style("display","inline-block").style("width","50px").style("height","15px").style("background","linear-gradient( to right,"+this.cnv_colorloss+",white)")}c.append("div").style("margin","4px 10px 1px 10px").style("margin-left",t.type=="cnv"?"0":"10px").style("display","inline-block").style("width",t.type=="cnv"?"50px":"100px").style("height","15px").style("background","linear-gradient( to right, white, "+(t.type=="cnv"?this.cnv_colorgain:this.loh_color)+")");const d=c.append("span").text(l.toFixed(3));const f=c.append("input").attr("type","text").attr("size",8).style("display","none").property("value",l.toFixed(3));const u=c.append("button").style("margin","2px 5px").style("padding","3px 10px").text("Edit").on("click",(()=>{p.style("display","none");d.style("display","none");h.style("display","inline-block");f.style("display","inline-block");u.style("display","none");m.style("display","inline-block")}));const m=c.append("button").style("display","none").style("margin","2px 5px").style("padding","3px 10px").text("Submit").on("click",(()=>{if(t.type=="cnv"){this.min_cnv=o=h.property("value");this.max_cnv=l=f.property("value");if(this.min_cnv!=e||this.max_cnv!=s)n=true}else{this.min_loh=o=parseFloat(h.property("value"));this.max_loh=l=parseFloat(f.property("value"));if(this.min_loh!=i||this.max_loh!=a)n=true}p.style("display","inline-block").text(parseFloat(o).toFixed(3));d.style("display","inline-block").text(parseFloat(l).toFixed(3));h.style("display","none");f.style("display","none");u.style("display","inline-block");m.style("display","none");y.style("display",n?"inline-block":"none");this.draw_matrix()}));const y=c.append("button").style("display","none").style("margin","2px 5px").style("padding","3px 10px").text("Reset").on("click",(()=>{if(t.type=="cnv"){this.min_cnv=o=e;this.max_cnv=l=s}else{this.min_loh=o=i;this.max_loh=l=a}p.text(parseFloat(o).toFixed(3));d.text(parseFloat(l).toFixed(3));h.property("value",parseFloat(o).toFixed(3));f.property("value",parseFloat(l).toFixed(3));y.style("display","none");n=false;this.draw_matrix()}));y.style("display","none")}))}gatherSamplesFromFeatureData(){const t=new Map;for(const s of this.features){if(s.donotaddsample){continue}if(s.isgenevalue||s.iscnv||s.isloh||s.isitd||s.issvfusion||s.issvcnv){for(const e of s.items){if(!t.has(e.sample)){t.set(e.sample,{})}}}else if(s.isvcf){for(const i of s.items){if(i.dt==e){if(!i.sampledata)continue;for(const e of i.sampledata){if(!t.has(e.sampleobj.name)){t.set(e.sampleobj.name,{})}}}else{console.error("unsupported dt from isvcf: "+i.dt)}}}else if(s.ismutation){for(const i of s.items){if(i.dt==e){if(!i.sampledata)continue;for(const e of i.sampledata){if(!t.has(e.sampleobj.name)){t.set(e.sampleobj.name,{})}}}else{if(!i.sample)continue;if(!t.has(i.sample)){t.set(i.sample,{})}}}}else if(s.issampleattribute){for(const e of s.items){if(!t.has(e.sample)){t.set(e.sample,{})}}}else{console.error("unknown feature type from this.data")}}const s=Math.min(18,Math.max(1,Math.ceil(800/t.size)));this.samples=[];for(const[e,i]of t){if(!this.features_on_rows)i.height=s;else i.width=s;i.name=e;this.samples.push(i)}}draw_matrix(){this.svg.selectAll("*").remove();const t=this.svg.append("g");this.gatherSamplesFromFeatureData();this.sortsamplesbyfeatures();const e=this.features_on_rows?this.features:this.samples;const s=this.features_on_rows?this.samples:this.features;let i=0,a=0;for(const s of e){s.g=t.append("g").attr("transform","translate(0,"+i+")");i+=s.height+this.rowspace;if(s.height>=P){s.g.append("text").attr("font-family",x).attr("font-size",Math.min(16,s.height)).attr("text-anchor","end").attr("dominant-baseline","central").attr("x",-this.rowlabspace-this.rowlabticksize).attr("y",s.height/2).text(this.features_on_rows?s.label+(s.count?" ("+s.count+")":""):s.name).each((function(){a=Math.max(a,this.getBBox().width)})).attr("class","sja_clbtext").on("mouseover",(()=>{this.features_on_rows?this.showTip_feature(s):this.showTip_sample(s)})).on("mouseout",(()=>{this.tip.hide()})).on("click",(()=>{if(this.features_on_rows)this.showMenu_feature(s)}));s.g.append("line").attr("x1",-this.rowlabticksize).attr("y1",s.height/2).attr("y2",s.height/2).attr("stroke","black").attr("shape-rendering","crispEdges")}}let n=0,o=0;for(const e of s){const s=t.append("g").attr("transform","translate("+(n+e.width/2)+",-"+(this.collabspace+this.collabticksize)+")");n+=e.width+this.colspace;const i=s.append("text").attr("font-family",x).attr("font-size",Math.min(16,e.width-2)).attr("dominant-baseline","central").attr("transform","rotate(-90)").text(this.features_on_rows?e.name:e.label+(e.count?" ("+e.count+")":"")).each((function(){o=Math.max(o,this.getBBox().width)})).on("mouseover",(()=>{this.features_on_rows?this.showTip_sample(e):this.showTip_feature(e)})).on("mouseout",(()=>{this.tip.hide()})).on("click",(()=>{if(!this.features_on_rows)this.showMenu_feature(e)}));if(e.isgenevalue){i.attr("fill",e.color)}s.append("line").attr("y1",this.collabspace).attr("y2",this.collabspace+this.collabticksize).attr("stroke","black").attr("shape-rendering","crispEdges")}for(const t of e){let e=0;for(const i of s){const s=this.features_on_rows?i:t;const a=this.features_on_rows?t:i;const n=t.g.append("g").attr("transform","translate("+e+",0)");e+=i.width+this.colspace;if(a.isgenevalue){this.drawCell_isgenevalue(s,a,n)}else if(a.iscnv){this.drawCell_iscnv(s,a,n)}else if(a.isloh){this.drawCell_isloh(s,a,n)}else if(a.isvcf){this.drawCell_isvcf(s,a,n)}else if(a.isitd){this.drawCell_isitd(s,a,n)}else if(a.issvfusion){this.drawCell_issvfusion(s,a,n)}else if(a.issvcnv||a.ismutation){this.drawCell_ismutation(s,a,n)}else if(a.issampleattribute){this.drawCell_issampleattribute(s,a,n)}else{console.error("unknown feature type when drawing cell")}}}t.attr("transform","translate("+(a+this.rowlabspace+this.rowlabticksize)+","+(o+this.collabspace+this.collabticksize)+")");this.svg.attr("width",a+this.rowlabspace+this.rowlabticksize+s.reduce(((t,e)=>t+e.width),0)+s.length*this.colspace).attr("height",o+this.collabspace+this.collabticksize+e.reduce(((t,e)=>t+e.height),0)+e.length*this.rowspace)}drawCell_isgenevalue(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.find((e=>e.sample==t.name));if(!n){this.drawEmptycell(t,e,s);return}const o=s.append("rect").attr("width",a).attr("height",i).attr("fill",e.color).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}));if(n.value<e.scale.maxv){o.attr("fill-opacity",n.value/e.scale.maxv)}}drawCell_iscnv(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.filter((e=>e.sample==t.name));if(n.length==0){this.drawEmptycell(t,e,s);return}for(const i of n){const a=e.coordscale(Math.max(e.start,i.start));const n=e.coordscale(Math.min(e.stop,i.stop));const o=this.max_cnv;s.append("rect").attr("x",a).attr("width",Math.max(1,n-a)).attr("height",t.height).attr("fill",i.value>0?e.colorgain:e.colorloss).attr("fill-opacity",Math.abs(i.value/o)).attr("shape-rendering","crispEdges")}s.append("rect").attr("fill","white").attr("fill-opacity",0).attr("width",a).attr("height",i).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}))}drawCell_isloh(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.filter((e=>e.sample==t.name));if(n.length==0){this.drawEmptycell(t,e,s);return}for(const t of n){const n=e.coordscale(Math.max(e.start,t.start));const o=e.coordscale(Math.min(e.stop,t.stop));const l=this.max_loh-this.min_loh;s.append("rect").attr("x",this.features_on_rows?0:n).attr("y",this.features_on_rows?n:0).attr("width",this.features_on_rows?a:Math.max(1,o-n)).attr("height",this.features_on_rows?Math.max(1,o-n):i).attr("fill",e.color).attr("fill-opacity",(t.segmean-this.min_loh)/l).attr("shape-rendering","crispEdges")}s.append("rect").attr("fill","white").attr("fill-opacity",0).attr("width",a).attr("height",i).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}))}drawCell_isvcf(e,s,i){const a=this.features_on_rows?s.height:e.height;const n=this.features_on_rows?e.width:s.width;const o=$(s,e);if(o.length==0){this.drawEmptycell(e,s,i);return}const l=new Map;for(const t of o){if(!l.has(t.class)){l.set(t.class,0)}l.set(t.class,l.get(t.class)+1)}let r=0;for(const[e,s]of l){const l=s/o.length*this.features_on_rows?a:n;i.append("rect").attr("x",this.features_on_rows?0:r).attr("y",this.features_on_rows?r:0).attr("width",this.features_on_rows?n:l).attr("height",this.features_on_rows?l:a).attr("fill",t[e].color).attr("shape-rendering","crispEdges");r+=l}i.append("rect").attr("fill","white").attr("fill-opacity",0).attr("width",n).attr("height",a).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(t=>{t.target.setAttribute("stroke-opacity",1);this.showTip_cell(e,s)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(e,s)}))}drawCell_isitd(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.find((e=>e.sample==t.name));if(!n){this.drawEmptycell(t,e,s);return}s.append("rect").attr("width",a).attr("height",i).attr("fill",e.color).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}))}drawCell_issampleattribute(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.find((e=>e.sample==t.name));if(!n){this.drawEmptycell(t,e,s);return}s.append("rect").attr("width",a).attr("height",i).attr("fill",e.values[n.value].color).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}))}drawCell_issvfusion(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;const n=e.items.find((e=>e.sample==t.name));if(!n){this.drawEmptycell(t,e,s);return}s.append("rect").attr("width",a).attr("height",i).attr("fill",e.color).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(s=>{s.target.setAttribute("stroke-opacity",1);this.showTip_cell(t,e)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(t,e)}))}drawCell_ismutation(e,s,i){const[a,n,o,l,r,c]=J(s,e);const p=this.features_on_rows?s.height:e.height;const h=this.features_on_rows?e.width:s.width;if(a.length+n.length+o.length+l.length+r.length+c.length==0){this.drawEmptycell(e,s,i);return}let d=false;if(this.ismutation_allsymbolic){d=true}else if(this.ismutation_allnotsymbolic);else{if(p<=4){d=true}}if(d){this.drawCell_ismutation_symbolic(e,s,i,a,n,o,l,r,c)}else{if(n.length){for(const t of n){const e=s.coordscale(Math.max(s.start,t.start));const a=s.coordscale(Math.min(s.stop,t.stop));const n=this.max_loh-this.min_loh;i.append("rect").attr("x",this.features_on_rows?0:e).attr("y",this.features_on_rows?e:0).attr("width",this.features_on_rows?h:Math.max(1,a-e)).attr("height",this.features_on_rows?Math.max(1,a-e):p).attr("fill",s.loh.color).attr("fill-opacity",(t.segmean-this.min_loh)/n).attr("shape-rendering","crispEdges")}}if(a.length){for(const t of a){const e=s.coordscale(Math.max(s.start,t.start));const a=s.coordscale(Math.min(s.stop,t.stop));const n=t.value>0?this.max_cnv:this.min_cnv;i.append("rect").attr("x",this.features_on_rows?0:e).attr("y",this.features_on_rows?e:0).attr("width",this.features_on_rows?h:Math.max(1,a-e)).attr("height",this.features_on_rows?Math.max(1,a-e):p).attr("fill",t.value>0?s.cnv.colorgain:s.cnv.colorloss).attr("fill-opacity",Math.abs(t.value/n)).attr("shape-rendering","crispEdges")}}if(o.length){for(const t of o){const e=s.coordscale(Math.max(s.start,t.start));const a=s.coordscale(Math.min(s.stop,t.stop));i.append("rect").attr("x",this.features_on_rows?0:e).attr("y",this.features_on_rows?e:0).attr("width",this.features_on_rows?h:Math.max(1,a-e)).attr("height",this.features_on_rows?Math.max(1,a-e):p).attr("fill",s.itd.color).attr("shape-rendering","crispEdges")}}if(l.length){i.append("circle").attr("cx",h/2).attr("cy",p/2).attr("r",Math.min(h,p)/2).attr("stroke",s.sv.color).attr("fill","none")}if(r.length){i.append("circle").attr("cx",h/2).attr("cy",p/2).attr("r",Math.min(h,p)/2).attr("stroke",s.fusion.color).attr("fill","none")}if(c.length){const e=c[0];const s=i.append("g").attr("transform","translate("+h/2+","+p/2+")");const a=t[e.m.class].color;const n=Math.min(h,p)/2;s.append("line").attr("x1",-n).attr("x2",n).attr("y1",-n).attr("y2",n).attr("stroke","white").attr("stroke-width",3);s.append("line").attr("x1",-n).attr("x2",n).attr("y1",n).attr("y2",-n).attr("stroke","white").attr("stroke-width",3);s.append("line").attr("x1",-n).attr("x2",n).attr("y1",-n).attr("y2",n).attr("stroke",a);s.append("line").attr("x1",-n).attr("x2",n).attr("y1",n).attr("y2",-n).attr("stroke",a)}}i.append("rect").attr("width",h).attr("height",p).attr("fill","white").attr("fill-opacity",0).attr("stroke","#ccc").attr("stroke-opacity",0).attr("shape-rendering","crispEdges").on("mouseover",(t=>{t.target.setAttribute("stroke-opacity",1);this.showTip_cell(e,s)})).on("mouseout",(t=>{t.target.setAttribute("stroke-opacity",0);this.tip.hide()})).on("click",(()=>{this.click_cell(e,s)}))}drawCell_ismutation_symbolic(e,s,i,a,n,o,l,r,c){const p=this.features_on_rows?s.height:e.height;const h=this.features_on_rows?e.width:s.width;const d=this.max_loh-this.min_loh;const f=[];if(a.length){for(const t of a){const e=t.value>0?this.max_cnv:this.min_cnv;let i;if(t.value>0){i={color:s.cnv.colorgain}}else{i={color:s.cnv.colorloss}}i.opacity=Math.abs(t.value/e);f.push(i)}}if(n.length){for(const t of n){f.push({color:s.loh.color,opacity:(t.segmean-this.min_loh)/d})}}if(o.length){for(const t of o){f.push({color:s.itd.color})}}if(l.length){for(const t of l){f.push({color:s.sv.color})}}if(r.length){for(const t of r){f.push({color:s.fusion.color})}}if(c.length){for(const e of c){f.push({color:t[e.m.class].color})}}const u=this.features_on_rows?p/f.length:h/f.length;let m=0;for(const t of f){const e=i.append("rect").attr("x",this.features_on_rows?0:m).attr("y",this.features_on_rows?m:0).attr("width",this.features_on_rows?h:u).attr("height",this.features_on_rows?u:p).attr("fill",t.color).attr("shape-rendering","crispEdges");if(t.opacity)e.attr("opacity",t.opacity);m+=u}}async click_cell(t,e){try{let i;if(this.iscustom){i={iscustom:true,type:o.mdssvcnv,singlesample:{name:t.name}};for(const t in this.querykey2tracks){const e=this.querykey2tracks[t];if(e.type==o.mdssvcnv){i.name=e.name||"Custom tk";i.file=e.file;i.url=e.url;i.indexURL=e.indexURL}else if(e.type==o.mdsvcf){i.checkvcf={file:e.file,url:e.url,indexURL:e.indexURL}}else if(e.type==o.mdsexpression){i.checkexpressionrank={file:e.file,url:e.url,indexURL:e.indexURL}}}}else{if(!this.mds)throw"not custom but .mds{} missing";for(const e in this.mds.queries){const s=this.mds.queries[e];if(s.type==o.mdssvcnv){i={mds:this.mds,querykey:e,singlesample:{name:t.name}};for(const t in s)i[t]=s[t];break}}}if(!i)throw"cannot find a svcnv tk";i.bplengthUpperLimit=0;const a=s({x:100,y:100});const n={jwt:this.jwt,hostURL:this.hostURL,nobox:1,genome:this.genome,holder:a.body,chr:e.chr,start:e.start,stop:e.stop,tklst:[]};w(this.genome,n.tklst);n.tklst.push(i);if(!this.iscustom){if(!this.dslabel)throw"not custom but dslabel missing";const e={genome:this.genome.name,dslabel:this.dslabel,querykey:i.querykey,gettrack4singlesample:t.name};const s=await p("/mdssvcnv",e);if(s.error)throw"Error checking for assay track: "+s.error;if(s.tracks){for(const t of s.tracks)n.tklst.push(t)}}const l=await import("./block-4f585abe.js").then((function(t){return t.c}));new l.Block(n)}catch(t){window.alert(t.message||t);if(t.stack)console.log(t.stack)}}showTip_feature(t){this.tip.clear();this.tipContent_feature(t,this.tip.d);this.tip.showunder(event.target)}showMenu_feature(t){this.menu.showunder(event.target).clear();this.tipContent_feature(t,this.menu.d);this.menu.d.append("div").attr("class","sja_menuoption").text("Remove this feature").on("click",(()=>{this.menu.hide();t.legend_tr.remove();this.features.splice(this.features.findIndex((e=>e.id==t.id)),1);this.draw_matrix()}));if(t.isgenevalue)return C(this,t);if(t.iscnv)return L(this,t,t);if(t.isloh)return S(this,t,t);if(t.ismutation)return N(this,t);if(t.isitd){return}if(t.issvfusion){return}if(t.issvcnv){return}if(t.issampleattribute){return}}tipContent_feature(t,e){e.append("div").text(t.label).style("opacity",.5).style("font-size",".7em").style("margin","10px");if(t.isgenevalue||t.iscnv||t.isloh||t.isitd||t.issvfusion){e.append("div").html(t.chr+":"+t.start+"-"+t.stop+" "+k(t.stop-t.start)).style("font-size",".7em").style("opacity",.5).style("margin","0px 10px 10px 10px")}else if(t.issvcnv||t.ismutation){if(!t.genename){e.append("div").html(t.chr+":"+t.start+"-"+t.stop+" "+k(t.stop-t.start)).style("font-size",".7em").style("opacity",.5).style("margin","0px 10px 10px 10px")}}else if(t.issampleattribute){e.append("div").text(t.label)}if(t.isgenevalue){e.append("div").text("Min: "+t.scale.minv+", max: "+t.scale.maxv).style("font-size",".7em").style("opacity",.5).style("margin","0px 10px 10px 10px")}}showTip_sample(e){this.tip.clear().d.append("div").text(e.name).style("padding","10px").style("font-size",".7em");const s=[];for(const i of this.features){if(s.length>10){s.push({k:"more",v:"..."});break}if(i.isgenevalue){const t=i.items.find((t=>t.sample==e.name));s.push({k:i.label,v:t?t.value:B});continue}if(i.iscnv){const t=i.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=B}else{const e=t.map((t=>"<div>"+t.chr+":"+t.start+"-"+t.stop+" "+'<span style="font-size:.7em">'+k(t.stop-t.start)+"</span> "+'<span style="font-size:.8em;background:'+(t.value>0?i.colorgain:i.colorloss)+';color:white;padding:1px 5px">'+t.value+"</span>"+"</div>"));a=e.join("")}s.push({k:i.label,v:a});continue}if(i.isloh){const t=i.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=B}else{const e=t.map((t=>"<div>"+t.chr+":"+t.start+"-"+t.stop+" "+'<span style="font-size:.7em">'+k(t.stop-t.start)+"</span> "+'<span style="font-size:.8em;background:'+i.color+';color:white;padding:1px 5px">'+t.segmean+"</span>"+"</div>"));a=e.join("")}s.push({k:i.label,v:a});continue}if(i.isvcf){const a=$(i,e);let n;if(a.length==0){n=B}else{n=a.map((e=>'<div><span style="color:'+t[e.class].color+'">'+e.mname+"</span> "+'<span style="font-size:.7em;opacity:.5">'+t[e.class].label+"</span>"+"</div>")).join("")}s.push({k:i.label,v:n});continue}if(i.isitd){const t=i.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=B}else{a='<div style="background:'+i.color+';width:20px"> </div>'}s.push({k:i.label,v:a});continue}if(i.issvfusion){const t=i.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=B}else{a='<div style="background:'+i.color+';width:20px"> </div>'}s.push({k:i.label,v:a});continue}if(i.issvcnv){continue}if(i.ismutation){continue}if(i.issampleattribute){const t=i.items.find((t=>t.sample==e.name));if(t){s.push({k:i.label,v:t.value})}continue}console.error("sample tooltip: Unknown feature type")}z(this.tip.d,s);this.tip.show(event.clientX,event.clientY)}showTip_cell(e,s){const i=[{k:"sample",v:e.name}];if(s.isgenevalue){const t=s.items.find((t=>t.sample==e.name));i.push({k:s.label,v:t?t.value:B})}else if(s.iscnv){const t=s.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=B}else{const e=t.map((t=>"<div>"+t.chr+":"+t.start+"-"+t.stop+" "+'<span style="font-size:.7em">'+k(t.stop-t.start)+"</span> "+'<span style="font-size:.8em;background:'+(t.value>0?s.colorgain:s.colorloss)+';color:white;padding:1px 5px">'+t.value+"</span>"+"</div>"));a=e.join("")}i.push({k:s.label,v:a})}else if(s.isloh){const t=s.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=B}else{const e=t.map((t=>"<div>"+t.chr+":"+t.start+"-"+t.stop+" "+'<span style="font-size:.7em">'+k(t.stop-t.start)+"</span> "+'<span style="font-size:.8em;background:'+s.color+';color:white;padding:1px 5px">'+t.segmean+"</span>"+"</div>"));a=e.join("")}i.push({k:s.label,v:a})}else if(s.isvcf){const a=$(s,e);let n;if(a.length==0){n=B}else{n=a.map((e=>'<div><span style="color:'+t[e.class].color+'">'+e.mname+"</span> "+'<span style="font-size:.7em;opacity:.5">'+t[e.class].label+"</span>"+"</div>")).join("")}i.push({k:s.label,v:n})}else if(s.isitd){const t=s.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=B}else{const e=t.map((t=>"<div>"+t.chr+":"+t.start+"-"+t.stop+" "+"</div>"));a=e.join("")}i.push({k:s.label,v:a})}else if(s.issvfusion){const t=s.items.filter((t=>t.sample==e.name));let a;if(t.length==0){a=B}else{const e=t.map((t=>"<div>"+t.chrA+":"+t.posA+" - "+t.chrB+":"+t.posB+" "+"</div>"));a=e.join("")}i.push({k:s.label,v:a})}else if(s.issvcnv||s.ismutation){const[a,n,o,l,r,c]=J(s,e);if(a.length){i.push({k:(s.genename||s.label)+" CNV",v:a.map((t=>"<div>"+'<span style="background:'+(t.value>0?s.cnv.colorgain:s.cnv.colorloss)+';color:white;padding:0px 3px">'+t.value+"</span> "+'<span style="font-size:.8em">'+t.chr+":"+t.start+"-"+t.stop+" "+k(t.stop-t.start)+"</span>"+"</div>")).join("")})}if(n.length){i.push({k:(s.genename||s.label)+" LOH",v:n.map((t=>"<div>"+'<span style="background:'+s.loh.color+';color:white;padding:0px 3px">'+t.segmean+"</span> "+'<span style="font-size:.8em">'+t.chr+":"+t.start+"-"+t.stop+" "+k(t.stop-t.start)+"</span>"+"</div>")).join("")})}if(o.length){i.push({k:(s.genename||s.label)+" ITD",v:o.map((t=>'<div style="font-size:.8em">'+t.chr+":"+t.start+"-"+t.stop+"</div>")).join("")})}if(l.length){i.push({k:(s.genename||s.label)+" SV",v:l.map((t=>"<div>"+t.chrA+":"+t.posA+","+t.strandA+" > "+t.chrB+":"+t.posB+","+t.strandB+"</div>")).join("")})}if(r.length){i.push({k:(s.genename||s.label)+" fusion",v:r.map((t=>"<div>"+t.chrA+":"+t.posA+","+t.strandA+" > "+t.chrB+":"+t.posB+","+t.strandB+"</div>")).join("")})}if(c.length){i.push({k:(s.genename||s.label)+" SNV/indel",v:c.map((e=>{const s=t[e.m.class];return"<div>"+'<span style="color:'+s.color+'">'+(e.m.mname||"")+"</span> "+'<span style="font-size:.7em;opacity:.5">'+s.label+"</span>"+"</div>"})).join("")})}}else if(s.issampleattribute){const t=s.items.find((t=>t.sample==e.name));if(t){i.push({k:s.label,v:t.value})}}else{console.error("cell tooltip: unknown feature type")}this.tip.clear();z(this.tip.d,i);this.tip.show(event.clientX,event.clientY)}sortsamplesbyfeatures(){const t=this.features.find((t=>t.isgenevalue&&t.sort));if(t&&t.items){const e=new Map;for(const s of t.items){e.set(s.sample,s.value)}this.samples.sort(((s,i)=>{const a=e.has(s.name)?e.get(s.name):t.missingvalue;const n=e.has(i.name)?e.get(i.name):t.missingvalue;return n-a}))}}may_init_customvcf(t){if(t.info)return;const e=["genome="+this.genome.name];if(t.file){e.push("file="+t.file)}else{e.push("url="+t.url);if(t.indexURL)e.push("indexURL="+t.indexURL)}return q("vcfheader?"+e.join("&")).then((e=>{const[s,i,a,n]=F(e.metastr.split("\n"));if(n)throw"Error parsing VCF meta lines: "+n.join("; ");t.info=s;t.format=i;t.samples=a;t.nochr=e.nochr}))}drawEmptycell(t,e,s){const i=this.features_on_rows?e.height:t.height;const a=this.features_on_rows?t.width:e.width;if(i<5)return;s.append("line").attr("x2",a).attr("y2",i).attr("stroke","#ededed")}}function Y(t){if(t.isgenevalue){return{id:t.id,isgenevalue:1,querykey:t.querykey,genename:t.genename,chr:t.chr,start:t.start,stop:t.stop}}if(t.iscnv){return{id:t.id,iscnv:1,querykey:t.querykey,chr:t.chr,start:t.start,stop:t.stop,valuecutoff:t.valuecutoff,focalsizelimit:t.focalsizelimit}}if(t.isloh){return{id:t.id,isloh:1,querykey:t.querykey,chr:t.chr,start:t.start,stop:t.stop,valuecutoff:t.valuecutoff,focalsizelimit:t.focalsizelimit}}if(t.isvcf){return{id:t.id,isvcf:1,querykey:t.querykey,chr:t.chr,start:t.start,stop:t.stop,snvindel:{excludeclasses:t.snvindel.excludeclasses}}}if(t.isitd){return{id:t.id,isitd:1,querykey:t.querykey,chr:t.chr,start:t.start,stop:t.stop}}if(t.issvfusion){return{id:t.id,issvfusion:1,querykey:t.querykey,chr:t.chr,start:t.start,stop:t.stop}}if(t.issvcnv||t.ismutation){const e={id:t.id,chr:t.chr,start:t.start,stop:t.stop,cnv:{hidden:t.cnv.hidden,valuecutoff:t.cnv.valuecutoff,focalsizelimit:t.cnv.focalsizelimit},loh:{hidden:t.loh.hidden,valuecutoff:t.loh.valuecutoff,focalsizelimit:t.loh.focalsizelimit},itd:{hidden:t.itd.hidden},sv:{hidden:t.sv.hidden},fusion:{hidden:t.fusion.hidden},snvindel:{excludeclasses:t.snvindel.excludeclasses}};if(t.issvcnv){e.issvcnv=1;e.querykey=t.querykey}else{e.ismutation=1;e.querykeylst=t.querykeylst}return e}if(t.issampleattribute){return{id:t.id,issampleattribute:1,key:t.key}}throw"unknown feature type in making request parameter"}function $(t,s){const i=[];for(const a of t.items){if(a.dt==e){if(a.sampledata.findIndex((t=>t.sampleobj.name==s.name))!=-1){i.push(a)}}else{console.error("getitemforsample_vcf: unknown dt")}}return i}function J(t,s){const i=[],a=[],n=[],o=[],l=[],r=[];for(const c of t.items){if(c.dt==e){if(!c.sampledata)continue;const t=c.sampledata.find((t=>t.sampleobj.name==s.name));if(!t)continue;r.push({m:c,m_sample:t});continue}if(c.sample!=s.name)continue;if(c.dt==y){i.push(c)}else if(c.dt==g){a.push(c)}else if(c.dt==v){n.push(c)}else if(c.dt==b){o.push(c)}else if(c.dt==_){l.push(c)}else{console.error("unknown dt: "+c.dt)}}return[i,a,n,o,l,r]}function K(e){if(!e.width)e.width=20;if(!e.cnv)e.cnv={};if(!e.cnv.valuecutoff)e.cnv.valuecutoff=.2;if(!Number.isInteger(e.cnv.focalsizelimit))e.cnv.focalsizelimit=2e6;if(!e.cnv.colorgain)e.cnv.colorgain=R;if(!e.cnv.colorloss)e.cnv.colorloss=U;if(!e.loh)e.loh={};if(!e.loh.valuecutoff)e.loh.valuecutoff=.1;if(!Number.isInteger(e.loh.focalsizelimit))e.loh.focalsizelimit=2e6;if(!e.loh.color)e.loh.color=D;if(!e.itd)e.itd={};if(!e.itd.color)e.itd.color=t[d].color;if(!e.sv)e.sv={};if(!e.sv.color)e.sv.color=G;if(!e.fusion)e.fusion={};if(!e.fusion.color)e.fusion.color=G;if(!e.snvindel)e.snvindel={};if(!e.snvindel.excludeclasses)e.snvindel.excludeclasses={}}function Q(t){const e=t.holder.append("div").style("margin-bottom","5px");const s=t.holder.append("div").style("margin-bottom","20px");e.append("span").style("margin-right","20px").style("font-size",".8em").text("LEGEND").attr("class","sja_clbtext").on("click",(()=>{if(t.legendtable.style("display")=="none"){j(t.legendtable)}else{M(t.legendtable)}}));t.legendtable=s.append("table").style("border-top","solid 1px #ededed").style("border-bottom","solid 1px #ededed").style("border-spacing","10px").style("display","none");e.append("span").style("margin-right","20px").style("font-size",".8em").text("CONFIG").attr("class","sja_clbtext").on("click",(()=>{if(i.style("display")=="none"){j(i)}else{M(i)}}));const i=s.append("div").style("border-top","solid 1px #ededed").style("border-bottom","solid 1px #ededed").style("display","none");const a=i.append("div").style("margin","5px");a.append("div").style("vertical-align","top").style("display","inline-block").html("Show features as ");const n=a.append("div").style("display","inline-block");const o=[{value:"symbol",text:"CNV on genomic location, others as symbol"},{value:"proportion",text:"All features as porportion"}];o.forEach((e=>{const s=n.append("div");s.append("input").attr("type","radio").attr("id",e.value).attr("name","mutaion_display").attr("value",e.value).property("checked",e.value=="symbol"&&t.ismutation_allsymbolic===undefined&&t.ismutation_allnotsymbolic===undefined?1:e.value=="symbol"&&t.ismutation_allnotsymbolic?1:e.value=="proportion"&&t.ismutation_allsymbolic?1:0).on("change",(function(){if(e.value=="symbol"&&t.ismutation_allnotsymbolic)return;else if(e.value=="proportion"&&t.ismutation_allsymbolic)return;else if(e.value=="symbol"){delete t.ismutation_allsymbolic;t.ismutation_allnotsymbolic=true}else if(e.value=="proportion"){t.ismutation_allsymbolic=true;delete t.ismutation_allnotsymbolic}else{return}t.draw_matrix()}));s.append("label").attr("for",e.value).text(e.text)}));const l=i.append("div").style("margin","5px");l.append("div").style("vertical-align","top").style("display","inline-block").html("Layout of Matrix ");const r=l.append("div").style("display","inline-block");const c=[{value:"gene_on_row",text:"Genes as Rows"},{value:"sam_on_row",text:"Samples as Rows"}];c.forEach((e=>{const s=r.append("div");s.append("input").attr("type","radio").attr("id",e.value).attr("name","layout").attr("value",e.value).property("checked",e.value=="gene_on_row"&&t.features_on_rows?1:e.value=="sam_on_row"&&!t.features_on_rows?1:0).on("change",(function(){if(e.value=="gene_on_row"&&t.features_on_rows)return;else if(e.value=="sam_on_row"&&!t.features_on_rows)return;else if(e.value=="gene_on_row"){t.features_on_rows=true;if(t.ori_feature_width)t.features.forEach((e=>e.height=t.ori_feature_width))}else{t.features_on_rows=false;if(t.ori_feature_height)t.features.forEach((e=>e.width=t.ori_feature_height))}t.draw_matrix()}));s.append("label").attr("for",e.value).text(e.text)}));e.append("span").style("margin-right","20px").style("font-size",".8em").text("DATA").attr("class","sja_clbtext").on("click",(()=>{W(t)}));T(t,e)}function W(t){const e=["sample\tfeature\tvarianttype\tvariant"];for(const s of t.samples){for(const i of t.features){for(const t of i.items){if(t.sample&&t.sample==s.name||t.sampledata&&t.sampledata.findIndex((t=>t.sampleobj.name==s.name))!=-1){e.push(s.name+"\t"+i.label+"\t"+E[t.dt]+"\t"+Z(t))}}}}A("Matrix data",[{text:e.join("\n")}])}function Z(s){if(s.dt==e)return s.mname+" "+t[s.class].label+" "+s.chr+"."+s.pos+"."+s.ref+"."+s.alt;if(s.dt==_||s.dt==b)return s.chrA+"."+s.posA+"."+(s.strandA||"")+" > "+s.chrB+"."+s.posB+"."+(s.strandB||"");if(s.dt==y)return s.chr+":"+s.start+"-"+s.stop+", log2(ratio): "+s.value;if(s.dt==g)return s.chr+":"+s.start+"-"+s.stop+", log2(ratio): "+s.segmean;if(s.dt==v)return s.chr+":"+s.start+"-"+s.stop;return""}export{X as Samplematrix};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{az as t,q as e,l as s,aS as a,aU as i}from"./app-
|
|
1
|
+
import{az as t,q as e,l as s,aS as a,aU as i}from"./app-71453429.js";import{controlsInit as r}from"./controls-0467d2ec.js";import{o as n}from"./FilterRxComp-fc769f34.js";import{c as o,b as c}from"./axis-6cb4f314.js";import"./controls.btns-ad7b28a2.js";import"./controls.config-6cf816fb.js";import"./controls.overlay-3a55c2ec.js";import"./termsetting-636d2271.js";import"path";import"./table-1dae543a.js";import"./controls.term1-59f4cd60.js";import"./controls.divide-3c0d52d7.js";class l{constructor(t){this.type="scatter"}async init(){const t=this.opts.controls?this.opts.holder:this.opts.holder.append("div");this.dom={header:this.opts.header,controls:this.opts.controls?null:holder.append("div"),div:t};this.settings={};if(this.dom.header)this.dom.header.html("Scatter Plot");await this.setControls();h(this);p(this)}async setControls(){if(this.opts.controls){this.opts.controls.on("downloadClick.boxplot",this.download)}else{this.components={controls:await r({app:this.app,id:this.id,holder:this.dom.controls.attr("class","pp-termdb-plot-controls"),inputs:["term1","overlay","divideBy"]})};this.components.controls.on("downloadClick.boxplot",this.download)}}getState(t){const e=t.plots.find((t=>t.id===this.id));if(!e){throw`No plot with id='${this.id}' found. Did you set this.id before this.api = getComponentApi(this)?`}return{activeCohort:t.activeCohort,termfilter:t.termfilter,config:{term:e.term,term0:e.term0,term2:e.term2,settings:{common:e.settings.common,scatter:JSON.parse(JSON.stringify(e.settings.scatter))}}}}async main(){try{this.config=structuredClone(this.state.config);if(this.dom.header)this.dom.header.html(this.config.term.term.name+" vs "+this.config.term2.term.name);a(this.settings,this.state.config.settings.scatter);if(!this.pj)this.pj=m(this);const t=this.getDataRequestOpts();this.currData=await this.app.vocabApi.getNestedChartSeriesData(t);this.app.vocabApi.syncTermData(this.state.config,this.currData);this.pj.refresh({data:this.currData.rows});this.render()}catch(t){throw t}}getDataRequestOpts(){const t=this.config;const e={chartType:"scatter",term:t.term,filter:this.state.termfilter.filter};if(t.term2)e.term2=t.term2;if(t.term0)e.term0=t.term0;if(this.state.ssid)e.ssid=this.state.ssid;return e}}const d=t(l);function p(t){t.render=function(){const e=t.dom.div.selectAll(".pp-scatter-chart").data(t.pj.tree.charts,(t=>t.chartId));e.exit().remove();e.each(t.updateCharts);e.enter().each(t.addCharts);t.dom.div.style("display","block");t.dom.div.on("mouseover",t.mouseover).on("mouseout",t.mouseout)};t.addCharts=function(s){const i=t.settings;const r=e(this).append("div").attr("class","pp-scatter-chart").style("opacity",0).style("width",i.svgw+50+"px").style("display","inline-block").style("margin",i.chartMargin+"px").style("top",0).style("left",0).style("text-align","left").style("border","1px solid #eee").style("box-shadow","0px 0px 1px 0px #ccc").style("background",s.color);r.append("div").attr("class","sjpcb-scatter-title").style("text-align","center").style("width",i.svgw+50+"px").style("height",i.chartTitleDivHt+"px").style("font-weight","600").style("margin","5px").datum(s.chartId).html(s.chartId);const n=r.append("svg").attr("class","pp-scatter-svg");a(n,s,i,0);r.transition().duration(i.duration).style("opacity",1)};t.updateCharts=function(s){const i=t.settings;const r=e(this);r.transition().duration(i.duration).style("width",i.svgw+50+"px").style("background",s.color);r.select(".sjpcb-scatter-title").style("width",i.svgw+50).style("height",i.chartTitleDivHt+"px").datum(s.chartId).html(s.chartId);r.selectAll(".sjpcb-lock-icon").style("display",i.scale=="byChart"?"block":"none");r.selectAll(".sjpcb-unlock-icon").style("display",i.scale=="byChart"?"none":"block");a(r.select("svg"),s,i,i.duration)};function a(t,s,a,o){t.transition().duration(o).attr("width",a.svgw).attr("height",a.svgh).style("overflow","visible").style("padding-left","20px");const[c,l,d,p,h,m]=i(t);c.attr("transform","translate("+a.svgPadding.left+","+a.svgPadding.top+")");const g=c.selectAll(".sjpcb-scatter-series").data(s.serieses,(t=>t&&t[0]?t[0].seriesId:""));g.exit().remove();g.each((function(t,i){r(e(this),s,t,i,a,a.duration)}));g.enter().append("g").attr("class","sjpcb-scatter-series").each((function(t,i){r(e(this),s,t,i,a,o)}));n(d,h,p,m,a,s)}function i(t){let e,s,a,i,r,n;if(!t.select(".sjpcb-scatter-mainG").size()){e=t.append("g").attr("class","sjpcb-scatter-mainG");s=e.append("g").attr("class","sjpcb-scatter-axis");a=s.append("g").attr("class","sjpcb-scatter-x-axis");i=s.append("g").attr("class","sjpcb-scatter-y-axis");r=s.append("g").attr("class","sjpcb-scatter-x-title");n=s.append("g").attr("class","sjpcb-scatter-y-title")}else{e=t.select(".sjpcb-scatter-mainG");s=e.select(".sjpcb-scatter-axis");a=s.select(".sjpcb-scatter-x-axis");i=s.select(".sjpcb-scatter-y-axis");r=s.select(".sjpcb-scatter-x-title");n=s.select(".sjpcb-scatter-y-title")}return[e,s,a,i,r,n]}function r(t,e,s,a,i,r){t.selectAll("circle").remove();const n=t.selectAll("circle").data(s.data,(t=>t.x));n.exit().remove();n.transition().duration(r).attr("r",i.radius).attr("cx",(t=>t.scaledX)).attr("cy",(t=>t.scaledY)).style("fill-opacity",i.fillOpacity);n.enter().append("circle").attr("r",i.radius).attr("cx",(t=>t.scaledX)).attr("cy",(t=>t.scaledY)).style("fill-opacity",i.fillOpacity).transition().duration(r)}function n(e,a,i,r,n,l){e.attr("transform","translate(0,"+(n.svgh-n.svgPadding.top-n.svgPadding.bottom)+")").call(o(l.xScale).ticks(5));i.call(c(s().domain(l.yScale.domain()).range([0,n.svgh-n.svgPadding.top-n.svgPadding.bottom])).ticks(5));a.select("text, title").remove();const d=t.config.term.term.name.length>24?t.config.term.term.name.slice(0,20)+"...":t.config.term.term.name;const p=a.attr("transform","translate("+(n.svgw-n.svgPadding.left-n.svgPadding.right)/2+","+(n.svgh-n.axisTitleFontSize)+")").append("text").style("text-anchor","middle").style("font-size",n.axisTitleFontSize+"px").text(d+(t.config.term.term.unit?", "+t.config.term.term.unit:""));p.append("title").text(t.config.term.term.name);const h=t.config.term2.term.name.length>24?t.config.term2.term.name.slice(0,20)+"...":t.config.term2.term.name;r.select("text, title").remove();const m=r.attr("transform","translate("+(-n.svgPadding.left/2-n.axisTitleFontSize)+","+(n.svgh-n.svgPadding.top-n.svgPadding.bottom)/2+")rotate(-90)").append("text").style("text-anchor","middle").style("font-size",n.axisTitleFontSize+"px").text(h+(t.config.term2.term.unit?", "+t.config.term2.term.unit:""));m.append("title").text(t.config.term2.term.name)}}function h(t){t.mouseover=function(e){if(e.target.tagName=="circle"){const s=e.target.__data__;const a=[`<tr><td style='padding:3px; color:#aaa'>X:</td><td style='padding:3px; text-align:center'>${s.x}</td></tr>`,`<tr><td style='padding:3px; color:#aaa'>Y:</td><td style='padding:3px; text-align:center'>${s.y}</td></tr>`];t.app.tip.show(e.clientX,e.clientY).d.html(`<table class='sja_simpletable'>${a.join("\n")}</table>`)}else{t.app.tip.hide()}};t.mouseout=function(){t.app.tip.hide()};t.download=()=>{if(!t.state||!t.state.isVisible)return;const s=[];const a={x:undefined,y:undefined};const r=[];let n=0,o=0,c=0;let l=0,d=0;t.dom.div.selectAll(".sjpcb-scatter-mainG").each((function(){s.push(this);const t=this.getBBox();if(t.width>n)n=t.width;if(t.height>o)o=t.height;const i=Math.round(this.parentNode.parentNode.getBoundingClientRect().y);if(!d){l=i;d++}else if(Math.abs(i-l)<5){d++}const p=e(this).attr("transform").split("translate(")[1].split(")")[0].split(",").map((t=>+t.trim()));if(a.x===undefined||p[0]>a.x)a.x=+p[0];if(a.y===undefined||p[1]>a.y)a.y=+p[1];const h=this.parentNode.parentNode.firstChild;const m=h.getBoundingClientRect();if(m.width>n)n=m.width;if(m.height>c)c=m.height;r.push({text:h.innerText,styles:window.getComputedStyle(h)})}));n+=30;o+=30;const p=document.createElementNS("http://www.w3.org/2000/svg","svg");e(p).style("display","block").style("opacity",1).attr("width",d*n).attr("height",Math.floor(s.length/d)*o);const h=window.getComputedStyle(document.querySelector(".pp-scatter-svg"));const m=e(p);for(const t of h){if(t.startsWith("font"))m.style(t,h.getPropertyValue(t))}s.forEach(((t,s)=>{const i=t.cloneNode(true);const l=s%d;const h=Math.floor(s/d);const m={x:l*n+a.x,y:h*o+a.y};const g=e(p).append("text").attr("transform","translate("+m.x+","+m.y+")").text(r[s].text);for(const t of r[s].styles){if(t.startsWith("font"))g.style(t,r[s].styles.getPropertyValue(t))}e(i).attr("transform","translate("+m.x+","+(m.y+c)+")");p.appendChild(i)}));const g=t.plot.term.term.name+" scatter";i(p,g)}}function m(t){const e=t.settings;const a=new n({template:{yMin:">$val2",yMax:"<$val2",charts:[{chartId:"@key",chc:"@key",xMin:">$val1",xMax:"<$val1",yMin:">$val2",yMax:"<$val2","__:xScale":"=xScale()","__:yScale":"=yScale()",serieses:[{chartId:"@parent.@parent.@key",seriesId:"@key",data:[{"__:chc":"@parent.@parent.chc","__:seriesId":"@parent.@parent.seriesId",x:"$val1",y:"$val2","_1:scaledX":"=scaledX()","_1:scaledY":"=scaledY()"},"$val2"]},"-"]},"$val0"]},"=":{xScale(t,a){return s().domain([a.self.xMin,a.self.xMax]).range([0,e.svgw-e.svgPadding.left-e.svgPadding.right])},scaledX(t,e){return e.context.context.context.parent.xScale(e.self.x)},scaledY(t,e){return e.context.context.context.parent.yScale(e.self.y)},yScale(t,a){const i=a.self.yMax;const r=e.scale=="byChart"?[i,0]:[a.root.yMax,0];return s().domain(r).range([0,e.svgh-e.svgPadding.top-e.svgPadding.bottom])}}});return a}export{d as scatterInit,p as setRenderers};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{M as t,aC as e,ba as n,b8 as s}from"./app-
|
|
1
|
+
import{M as t,aC as e,ba as n,b8 as s}from"./app-71453429.js";const o=new t({padding:""});const r=60;async function a(t,a,i){a.style("margin","40px 20px 20px 20px");const p=a.append("div");p.append("p").text("To launch view, press ENTER at gene search.").style("opacity",.3);const l=a.append("div");const d=c(p,i).on("change",u);let f,h;const m=p.append("span").style("margin-left","10px");const g=p.append("button").style("display","none").style("margin-top","20px").style("padding","10px 15px").style("border-radius","30px").text("Launch ProteinPaint").on("click",x);u();function u(){m.selectAll("*").remove();const t=d.node();h=i[t.options[t.selectedIndex].innerHTML];const n={genome:h,tip:o,row:m,allowVariant:true,callback:()=>g.style("display","block")};f=e(n)}async function x(){try{p.remove();const e={nobox:1,genome:h,holder:l,tklst:t.selectGenomeWithTklst};const o=f;if(o.chr){const[t,s]=n(h,[o.chr]);if(t+s==0)throw"Invalid chromosome name: "+o.chr;const a=t?"chr"+o.chr:o.chr;if(Number.isInteger(o.pos)){if(!o.ref)throw"Reference allele missing from variant string";if(!o.alt)throw"Alternative allele missing from variant string";e.chr=a;e.start=o.pos-r;e.stop=o.pos+r;for(const t of e.tklst){if(t.type=="bam"){t.variants=[{chr:a,pos:o.pos-1,ref:o.ref,alt:o.alt}]}}}else{if(!Number.isInteger(o.start)||!Number.isInteger(o.stop))throw"non-integer start/stop";e.chr=a;e.start=o.start;e.stop=o.stop}}else{const t=h.defaultcoord;e.chr=t.chr;e.start=t.start;e.stop=t.stop}s(h,e.tklst);const a=await import("./block-4f585abe.js").then((function(t){return t.c}));new a.Block(e)}catch(t){window.alert(t.message||t)}}}function c(t,e){const n=t.append("select");for(const t in e){n.append("option").text(t)}return n}export{a as init};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{S as t,ac as e,az as s,aS as o,M as i,q as l,aF as n,l as a}from"./app-f91922b4.js";import{d as r}from"./zoom-2d4ede33.js";import{r as p}from"./table-d6c411fd.js";import{controlsInit as c}from"./controls-8d4972c8.js";import{d}from"./svg.download-56529955.js";import{c as h,b as m}from"./axis-6cb4f314.js";import"./pointer-c7475677.js";import"./nodrag-777a34a5.js";import"./controls.btns-bad9e4cf.js";import"./controls.config-e0f394cb.js";import"./controls.overlay-3ac8773d.js";import"./termsetting-9a7511e6.js";import"path";import"./FilterRxComp-0e75dd8d.js";import"./controls.term1-008f4be4.js";import"./controls.divide-d8ac5a9b.js";const f=9;const g=300;class y{constructor(){this.type="singleCellPlot";this.tip=new i({padding:"4px",offsetX:10,offsetY:0});this.tip.d.style("max-height","300px").style("overflow","scroll").style("font-size","0.9em");window.sc=this}async init(t){t.plots.find((t=>t.id===this.id));const e=this.opts.holder.insert("div").style("display","inline-block");this.mainDiv=this.opts.holder.insert("div").style("display","inline-block").style("vertical-align","top");this.tableOnPlot=t.nav?.header_mode=="hidden";if(this.tableOnPlot){this.sampleDiv=this.mainDiv.insert("div").style("display","inline-block").style("padding","10px");await x(this.sampleDiv,this,t)}const s=80;this.axisOffset={x:s,y:30};const o=e.attr("class","pp-termdb-plot-controls").style("display","inline-block");const n=this.tableOnPlot?this.opts.holder.append("div"):this.mainDiv.append("div");n.style("display","flex").style("flex-wrap","wrap").style("justify-content","flex-start").style("width","92vw");this.dom={header:this.opts.header,loadingDiv:this.opts.holder.append("div").style("position","absolute").style("left","45%").style("top","60%"),tip:new i({padding:"0px"}),tooltip:new i({padding:"2px",offsetX:10,offsetY:0}),controlsHolder:o,tableDiv:n};this.settings={};await this.setControls();document.addEventListener("scroll",(t=>this?.tip?.hide()));l(".sjpp-output-sandbox-content").on("scroll",(t=>this.tip.hide()))}async setControls(){this.components={controls:await c({app:this.app,id:this.id,holder:this.dom.controlsHolder,inputs:[{label:"Chart width",type:"number",chartType:"singleCellPlot",settingsKey:"svgw",min:300,max:1e3},{label:"Chart height",type:"number",chartType:"singleCellPlot",settingsKey:"svgh",min:300,max:1e3},{label:"Show borders",type:"checkbox",chartType:"singleCellPlot",settingsKey:"showBorders",boxLabel:"Yes"}]})};this.components.controls.on("downloadClick.singleCellPlot",(()=>{for(const t of this.plots)d(t.svg,"plot.svg",this.opts.holder.node())}))}getState(t){const e=t.plots.find((t=>t.id===this.id));if(!e){throw`No plot with id='${this.id}' found. Did you set this.id before this.api = getComponentApi(this)?`}return{config:e,dslabel:t.vocab.dslabel,genome:t.vocab.genome,termdbConfig:t.termdbConfig}}async main(){this.config=structuredClone(this.state.config);this.dom.tableDiv.selectAll("*").remove();this.plots=[];o(this.settings,this.config.settings.singleCellPlot);this.legendRendered=false;const t={genome:this.state.genome,dslabel:this.state.dslabel};let e;if(this.state.config.sample){e=this.state.config.sample;t.sample=this.state.config.experimentID||this.state.config.sample}else{e=this.samples[0].sample;t.sample=this.samples[0].experiments?.[0]?.experimentID||this.samples[0].sample}this.renderPlots(t);if(this.dom.header)this.dom.header.html(`${e} Single Cell Data`)}async renderPlots(s){try{const e=await t("termdb/singlecellData",{body:s});if(e.error)throw e.error;for(const t of e.plots){this.renderPlot(t)}this.refName=e.refName}catch(t){if(t.stack)console.log(t.stack);e(this.mainDiv,t);return}}renderPlot(t){this.plots.push(t);let e=new Set(t.cells.map((t=>t.category)));e=Array.from(e).sort();const s=n(e.length+2);const o={};for(const i of e)o[i]=i=="ref"||i=="No"?"#F2F2F2":t.colorMap?.[i]?t.colorMap[i]:s(i);t.colorMap=o;this.initAxes(t);t.plotDiv=this.dom.tableDiv.append("div").style("display","inline-block").style("padding","10px").style("flex-grow",1);if(this.state.config.settings.singleCellPlot.showBorders)t.plotDiv.style("border","1px solid #aaa");this.renderLegend(t,o);const i=t.plotDiv.append("svg").attr("width",this.settings.svgw).attr("height",this.settings.svgh+40).on("click",(e=>this.showTooltip(e,t)));i.append("text").attr("transform",`translate(20, 30)`).style("font-weight","bold").text(`${t.name}`);t.svg=i;const l=r().scaleExtent([.5,10]).on("zoom",(e=>this.handleZoom(e,a,t))).filter((t=>{if(t.type==="wheel")return t.ctrlKey;return true}));i.call(l);const a=i.append("g");const p=a.selectAll("path").data(t.cells);p.enter().append("g").attr("transform",(e=>`translate(${t.xAxisScale(e.x)}, ${t.yAxisScale(e.y)+40})`)).append("circle").attr("r",1.5).attr("fill",(t=>o[t.category])).style("fill-opacity",(t=>this.config.hiddenClusters.includes(t.category)?0:.7))}handleZoom(t,e,s){e.attr("transform",t.transform);s.zoom=t.transform.scale(1).k}renderLegend(t,e){const s=t.plotDiv.append("svg").attr("width",250).attr("height",this.settings.svgh).style("vertical-align","top");if(this.state.termdbConfig.queries.singleCell.data.sameLegend&&this.legendRendered)return;this.legendRendered=true;const o=s.append("g").attr("transform",`translate(20, 50)`).style("font-size","0.8em");o.append("text").attr("transform",`translate(${0}, ${25})`).style("font-weight","bold").text(`${t.colorBy}`);const i=20;let l=50;let n=0;for(const s in e){const r=t.cells.filter((t=>t.category==s));const p=this.config.hiddenClusters.includes(s);const c=r.length;const d=e[s];const h=o.append("g").attr("transform",(t=>`translate(${n}, ${l})`));h.append("circle").attr("r",3).attr("fill",d);h.append("g").attr("transform",`translate(${n+10}, ${5})`).append("text").text(`${s=="ref"?this.state.termdbConfig.queries.singleCell.data.refName:s=="query"?this.state.config.sample:s} n=${c}`).style("text-decoration",p?"line-through":"none").on("click",(t=>a(this,t,s)));l+=i}function a(t,e,s,o){const i=e.target;const l=i.style["text-decoration"]=="line-through";i.style["text-decoration"]=l?"none":"line-through";let n=t.config.hiddenClusters;if(!l)n.push(s);else n.splice(n.indexOf(s),1);t.app.dispatch({type:"plot_edit",id:t.id,config:{hiddenClusters:n}})}}initAxes(t){const e=t.cells[0];const[s,o,i,l]=t.cells.reduce(((t,e)=>[e.x<t[0]?e.x:t[0],e.x>t[1]?e.x:t[1],e.y<t[2]?e.y:t[2],e.y>t[3]?e.y:t[3]]),[e.x,e.x,e.y,e.y]);const n=5;t.xAxisScale=a().domain([s,o]).range([0+n,this.settings.svgh-5]);t.axisBottom=h(t.xAxisScale);t.yAxisScale=a().domain([l,i]).range([0+n,this.settings.svgh-n]);t.axisLeft=m(t.yAxisScale);t.zoom=1}distance(t,e,s,o,i){const l=i.xAxisScale(s)-i.xAxisScale(t);const n=i.yAxisScale(o)-i.yAxisScale(e);const a=Math.sqrt(Math.pow(l,2)+Math.pow(n,2));return a}showTooltip(t,e){if(this.onClick&&t.type=="click"){this.onClick=false;this.tip.hide();return}if(t.target.tagName=="circle"){this.onClick=t.type=="click";const s=t.target.__data__;let o=10;o=o/e.zoom;const i=e.cells.filter((t=>{if(this.getOpacity(t)==0)return false;const i=this.distance(t.x,t.y,s.x,s.y,e);return i<o}));const l=[];for(const t of i){const e=s.category;let o=l.find((t=>t.id==e));if(!o){o={id:e,parentId:null,samples:[t],level:1,category:null,children:[]};l.push(o)}else{o.samples.push(t)}}const n=this.tip.clear();const a=n.d.append("table");for(const t of l){let s=a.append("tr");s.append("td").style("color","#aaa").text(e.colorBy);const o=t.id;const i=s.append("td");const l=i.append("svg").attr("width",150).attr("height",20);const n=10;const r=12;const p=l.append("g").attr("transform",`translate(${n}, ${r})`);p.append("circle").attr("fill",e.colorMap[o]).attr("r",4);l.append("g").attr("transform",`translate(${n+15}, ${r+4})`).append("text").text(o);s=a.append("tr");s.append("td").style("color","#aaa").text("cells");s.append("td").text(t.samples.length)}n.show(t.clientX,t.clientY,true,true)}else this.onMouseOut(t)}onMouseOut(t){this.tip.hide()}getOpacity(t){return this.config.hiddenClusters.includes(t.category)?0:1}}async function u(t,e){const s=t.append("div").style("padding","5px");x(s,e,e.state)}async function x(s,o,i){const l={genome:i.vocab.genome,dslabel:i.vocab.dslabel};let n;try{n=await t("termdb/singlecellSamples",{body:l});if(n.error)throw n.error}catch(t){e(s,t);return}const a=n.samples;a.sort(((t,e)=>{const s=t.primarySite?.localeCompare(e.primarySite);if(s==1||s==-1)return s;else return t.sample.localeCompare(e.sample)}));const[r,c]=await b(o,a,i);const d=[];let h="40vh";if(o.tableOnPlot){d.push(0);o.samples=a;h="30vh"}p({rows:r,columns:c,resize:true,singleMode:true,div:s,maxHeight:h,noButtonCallback:t=>{const e=r[t][0].value;const s={chartType:"singleCellPlot",sample:e};if(r[t][0].__experimentID){s.experimentID=r[t][0].__experimentID}if(o.tableOnPlot){o.app.dispatch({type:"plot_edit",id:o.id,config:s})}else{o.dom.tip.hide();o.app.dispatch({type:"plot_create",config:s})}},selectedRows:d})}async function b(t,e,s){const o=[];for(const t of e){if(t.experiments)for(const e of t.experiments){const i=[{value:t.sample,__experimentID:e.experimentID}];for(const e of s.termdbConfig.queries.singleCell.samples.sampleColumns||[]){i.push({value:t[e.termid]})}for(const e of s.termdbConfig.queries.singleCell.samples.experimentColumns||[]){i.push({value:t[e.label]})}i.push({value:e.experimentID});o.push(i)}else{const e=[{value:t.sample}];for(const o of s.termdbConfig.queries.singleCell.samples.sampleColumns||[]){e.push({value:t[o.termid]})}o.push(e)}}const i=[{label:s.termdbConfig.queries.singleCell.samples.firstColumnName||"Sample"}];for(const e of s.termdbConfig.queries.singleCell.samples.sampleColumns||[]){i.push({label:(await t.app.vocabApi.getterm(e.termid)).name,width:"15vw"})}for(const t of s.termdbConfig.queries.singleCell.samples.experimentColumns||[]){i.push({label:t.label,width:"20vw"})}if(e.some((t=>t.experiments))){i.push({label:"Experiment"})}return[o,i]}const v=s(y);const C=v;async function w(t,e){try{const e=D();const s={hiddenClusters:[],settings:{singleCellPlot:e}};const i=o(s,t);return i}catch(t){console.log(t);throw`${t} [singleCellPlot getPlotConfig()]`}}function D(){return{svgw:420,svgh:420,showBorders:false}}export{C as componentInit,D as getDefaultSingleCellSettings,w as getPlotConfig,u as makeChartBtnMenu,g as maxDotSize,f as minDotSize,v as scatterInit};
|
|
1
|
+
import{S as t,ac as e,az as s,aS as o,M as i,q as l,aF as n,l as a}from"./app-71453429.js";import{d as r}from"./zoom-a40839cf.js";import{r as p}from"./table-1dae543a.js";import{controlsInit as c}from"./controls-0467d2ec.js";import{d}from"./svg.download-54c99186.js";import{c as h,b as m}from"./axis-6cb4f314.js";import"./pointer-c7475677.js";import"./nodrag-bed2488c.js";import"./controls.btns-ad7b28a2.js";import"./controls.config-6cf816fb.js";import"./controls.overlay-3a55c2ec.js";import"./termsetting-636d2271.js";import"path";import"./FilterRxComp-fc769f34.js";import"./controls.term1-59f4cd60.js";import"./controls.divide-3c0d52d7.js";const f=9;const g=300;class y{constructor(){this.type="singleCellPlot";this.tip=new i({padding:"4px",offsetX:10,offsetY:0});this.tip.d.style("max-height","300px").style("overflow","scroll").style("font-size","0.9em");window.sc=this}async init(t){t.plots.find((t=>t.id===this.id));const e=this.opts.holder.insert("div").style("display","inline-block");this.mainDiv=this.opts.holder.insert("div").style("display","inline-block").style("vertical-align","top");this.tableOnPlot=t.nav?.header_mode=="hidden";if(this.tableOnPlot){this.sampleDiv=this.mainDiv.insert("div").style("display","inline-block").style("padding","10px");await x(this.sampleDiv,this,t)}const s=80;this.axisOffset={x:s,y:30};const o=e.attr("class","pp-termdb-plot-controls").style("display","inline-block");const n=this.tableOnPlot?this.opts.holder.append("div"):this.mainDiv.append("div");n.style("display","flex").style("flex-wrap","wrap").style("justify-content","flex-start").style("width","92vw");this.dom={header:this.opts.header,loadingDiv:this.opts.holder.append("div").style("position","absolute").style("left","45%").style("top","60%"),tip:new i({padding:"0px"}),tooltip:new i({padding:"2px",offsetX:10,offsetY:0}),controlsHolder:o,tableDiv:n};this.settings={};await this.setControls();document.addEventListener("scroll",(t=>this?.tip?.hide()));l(".sjpp-output-sandbox-content").on("scroll",(t=>this.tip.hide()))}async setControls(){this.components={controls:await c({app:this.app,id:this.id,holder:this.dom.controlsHolder,inputs:[{label:"Chart width",type:"number",chartType:"singleCellPlot",settingsKey:"svgw",min:300,max:1e3},{label:"Chart height",type:"number",chartType:"singleCellPlot",settingsKey:"svgh",min:300,max:1e3},{label:"Show borders",type:"checkbox",chartType:"singleCellPlot",settingsKey:"showBorders",boxLabel:"Yes"}]})};this.components.controls.on("downloadClick.singleCellPlot",(()=>{for(const t of this.plots)d(t.svg,"plot.svg",this.opts.holder.node())}))}getState(t){const e=t.plots.find((t=>t.id===this.id));if(!e){throw`No plot with id='${this.id}' found. Did you set this.id before this.api = getComponentApi(this)?`}return{config:e,dslabel:t.vocab.dslabel,genome:t.vocab.genome,termdbConfig:t.termdbConfig}}async main(){this.config=structuredClone(this.state.config);this.dom.tableDiv.selectAll("*").remove();this.plots=[];o(this.settings,this.config.settings.singleCellPlot);this.legendRendered=false;const t={genome:this.state.genome,dslabel:this.state.dslabel};let e;if(this.state.config.sample){e=this.state.config.sample;t.sample=this.state.config.experimentID||this.state.config.sample}else{e=this.samples[0].sample;t.sample=this.samples[0].experiments?.[0]?.experimentID||this.samples[0].sample}this.renderPlots(t);if(this.dom.header)this.dom.header.html(`${e} Single Cell Data`)}async renderPlots(s){try{const e=await t("termdb/singlecellData",{body:s});if(e.error)throw e.error;for(const t of e.plots){this.renderPlot(t)}this.refName=e.refName}catch(t){if(t.stack)console.log(t.stack);e(this.mainDiv,t);return}}renderPlot(t){this.plots.push(t);let e=new Set(t.cells.map((t=>t.category)));e=Array.from(e).sort();const s=n(e.length+2);const o={};for(const i of e)o[i]=i=="ref"||i=="No"?"#F2F2F2":t.colorMap?.[i]?t.colorMap[i]:s(i);t.colorMap=o;this.initAxes(t);t.plotDiv=this.dom.tableDiv.append("div").style("display","inline-block").style("padding","10px").style("flex-grow",1);if(this.state.config.settings.singleCellPlot.showBorders)t.plotDiv.style("border","1px solid #aaa");this.renderLegend(t,o);const i=t.plotDiv.append("svg").attr("width",this.settings.svgw).attr("height",this.settings.svgh+40).on("click",(e=>this.showTooltip(e,t)));i.append("text").attr("transform",`translate(20, 30)`).style("font-weight","bold").text(`${t.name}`);t.svg=i;const l=r().scaleExtent([.5,10]).on("zoom",(e=>this.handleZoom(e,a,t))).filter((t=>{if(t.type==="wheel")return t.ctrlKey;return true}));i.call(l);const a=i.append("g");const p=a.selectAll("path").data(t.cells);p.enter().append("g").attr("transform",(e=>`translate(${t.xAxisScale(e.x)}, ${t.yAxisScale(e.y)+40})`)).append("circle").attr("r",1.5).attr("fill",(t=>o[t.category])).style("fill-opacity",(t=>this.config.hiddenClusters.includes(t.category)?0:.7))}handleZoom(t,e,s){e.attr("transform",t.transform);s.zoom=t.transform.scale(1).k}renderLegend(t,e){const s=t.plotDiv.append("svg").attr("width",250).attr("height",this.settings.svgh).style("vertical-align","top");if(this.state.termdbConfig.queries.singleCell.data.sameLegend&&this.legendRendered)return;this.legendRendered=true;const o=s.append("g").attr("transform",`translate(20, 50)`).style("font-size","0.8em");o.append("text").attr("transform",`translate(${0}, ${25})`).style("font-weight","bold").text(`${t.colorBy}`);const i=20;let l=50;let n=0;for(const s in e){const r=t.cells.filter((t=>t.category==s));const p=this.config.hiddenClusters.includes(s);const c=r.length;const d=e[s];const h=o.append("g").attr("transform",(t=>`translate(${n}, ${l})`));h.append("circle").attr("r",3).attr("fill",d);h.append("g").attr("transform",`translate(${n+10}, ${5})`).append("text").text(`${s=="ref"?this.state.termdbConfig.queries.singleCell.data.refName:s=="query"?this.state.config.sample:s} n=${c}`).style("text-decoration",p?"line-through":"none").on("click",(t=>a(this,t,s)));l+=i}function a(t,e,s,o){const i=e.target;const l=i.style["text-decoration"]=="line-through";i.style["text-decoration"]=l?"none":"line-through";let n=t.config.hiddenClusters;if(!l)n.push(s);else n.splice(n.indexOf(s),1);t.app.dispatch({type:"plot_edit",id:t.id,config:{hiddenClusters:n}})}}initAxes(t){const e=t.cells[0];const[s,o,i,l]=t.cells.reduce(((t,e)=>[e.x<t[0]?e.x:t[0],e.x>t[1]?e.x:t[1],e.y<t[2]?e.y:t[2],e.y>t[3]?e.y:t[3]]),[e.x,e.x,e.y,e.y]);const n=5;t.xAxisScale=a().domain([s,o]).range([0+n,this.settings.svgh-5]);t.axisBottom=h(t.xAxisScale);t.yAxisScale=a().domain([l,i]).range([0+n,this.settings.svgh-n]);t.axisLeft=m(t.yAxisScale);t.zoom=1}distance(t,e,s,o,i){const l=i.xAxisScale(s)-i.xAxisScale(t);const n=i.yAxisScale(o)-i.yAxisScale(e);const a=Math.sqrt(Math.pow(l,2)+Math.pow(n,2));return a}showTooltip(t,e){if(this.onClick&&t.type=="click"){this.onClick=false;this.tip.hide();return}if(t.target.tagName=="circle"){this.onClick=t.type=="click";const s=t.target.__data__;let o=10;o=o/e.zoom;const i=e.cells.filter((t=>{if(this.getOpacity(t)==0)return false;const i=this.distance(t.x,t.y,s.x,s.y,e);return i<o}));const l=[];for(const t of i){const e=s.category;let o=l.find((t=>t.id==e));if(!o){o={id:e,parentId:null,samples:[t],level:1,category:null,children:[]};l.push(o)}else{o.samples.push(t)}}const n=this.tip.clear();const a=n.d.append("table");for(const t of l){let s=a.append("tr");s.append("td").style("color","#aaa").text(e.colorBy);const o=t.id;const i=s.append("td");const l=i.append("svg").attr("width",150).attr("height",20);const n=10;const r=12;const p=l.append("g").attr("transform",`translate(${n}, ${r})`);p.append("circle").attr("fill",e.colorMap[o]).attr("r",4);l.append("g").attr("transform",`translate(${n+15}, ${r+4})`).append("text").text(o);s=a.append("tr");s.append("td").style("color","#aaa").text("cells");s.append("td").text(t.samples.length)}n.show(t.clientX,t.clientY,true,true)}else this.onMouseOut(t)}onMouseOut(t){this.tip.hide()}getOpacity(t){return this.config.hiddenClusters.includes(t.category)?0:1}}async function u(t,e){const s=t.append("div").style("padding","5px");x(s,e,e.state)}async function x(s,o,i){const l={genome:i.vocab.genome,dslabel:i.vocab.dslabel};let n;try{n=await t("termdb/singlecellSamples",{body:l});if(n.error)throw n.error}catch(t){e(s,t);return}const a=n.samples;a.sort(((t,e)=>{const s=t.primarySite?.localeCompare(e.primarySite);if(s==1||s==-1)return s;else return t.sample.localeCompare(e.sample)}));const[r,c]=await b(o,a,i);const d=[];let h="40vh";if(o.tableOnPlot){d.push(0);o.samples=a;h="30vh"}p({rows:r,columns:c,resize:true,singleMode:true,div:s,maxHeight:h,noButtonCallback:t=>{const e=r[t][0].value;const s={chartType:"singleCellPlot",sample:e};if(r[t][0].__experimentID){s.experimentID=r[t][0].__experimentID}if(o.tableOnPlot){o.app.dispatch({type:"plot_edit",id:o.id,config:s})}else{o.dom.tip.hide();o.app.dispatch({type:"plot_create",config:s})}},selectedRows:d})}async function b(t,e,s){const o=[];for(const t of e){if(t.experiments)for(const e of t.experiments){const i=[{value:t.sample,__experimentID:e.experimentID}];for(const e of s.termdbConfig.queries.singleCell.samples.sampleColumns||[]){i.push({value:t[e.termid]})}for(const e of s.termdbConfig.queries.singleCell.samples.experimentColumns||[]){i.push({value:t[e.label]})}i.push({value:e.experimentID});o.push(i)}else{const e=[{value:t.sample}];for(const o of s.termdbConfig.queries.singleCell.samples.sampleColumns||[]){e.push({value:t[o.termid]})}o.push(e)}}const i=[{label:s.termdbConfig.queries.singleCell.samples.firstColumnName||"Sample"}];for(const e of s.termdbConfig.queries.singleCell.samples.sampleColumns||[]){i.push({label:(await t.app.vocabApi.getterm(e.termid)).name,width:"15vw"})}for(const t of s.termdbConfig.queries.singleCell.samples.experimentColumns||[]){i.push({label:t.label,width:"20vw"})}if(e.some((t=>t.experiments))){i.push({label:"Experiment"})}return[o,i]}const v=s(y);const C=v;async function w(t,e){try{const e=D();const s={hiddenClusters:[],settings:{singleCellPlot:e}};const i=o(s,t);return i}catch(t){console.log(t);throw`${t} [singleCellPlot getPlotConfig()]`}}function D(){return{svgw:420,svgh:420,showBorders:false}}export{C as componentInit,D as getDefaultSingleCellSettings,w as getPlotConfig,u as makeChartBtnMenu,g as maxDotSize,f as minDotSize,v as scatterInit};
|