@sjcrh/proteinpaint-client 2.40.3 → 2.40.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{2dmaf-93305274.js → 2dmaf-d2169e7e.js} +1 -1
- package/dist/DEanalysis-019810dc.js +1 -0
- package/dist/{Disco-3aa18301.js → Disco-b46120d3.js} +1 -1
- package/dist/{Disco.UI-4e17d9c5.js → Disco.UI-9b4a3627.js} +1 -1
- package/dist/{DragControls-ea09f816.js → DragControls-de1e8925.js} +1 -1
- package/dist/{OrbitControls-0aa2aadd.js → OrbitControls-7c29140c.js} +1 -1
- package/dist/{app-3f91f0f7.js → app-42d73775.js} +1 -1
- package/dist/app-a7320861.js +1 -0
- package/dist/{app-accefd2f.js → app-cad839f0.js} +1 -1
- package/dist/app.js +1 -1
- package/dist/{barchart-876dc3b9.js → barchart-9d39d8f1.js} +1 -1
- package/dist/{barchart.events-0b288629.js → barchart.events-566d095d.js} +1 -1
- package/dist/{bars.renderer-a0a81adb.js → bars.renderer-1bf469a0.js} +1 -1
- package/dist/{block-2ef33a5d.js → block-1d17abf3.js} +1 -1
- package/dist/{block.ds.gmcustomdata-100b74c0.js → block.ds.gmcustomdata-72f79bbe.js} +1 -1
- package/dist/block.lazyload-5b3a5666.js +1 -0
- package/dist/{block.legend-ea0967e8.js → block.legend-8e7cb1a6.js} +1 -1
- package/dist/{block.mds-3ad56623.js → block.mds-221326cd.js} +1 -1
- package/dist/{block.mds.cnv-2535c08e.js → block.mds.cnv-65fad651.js} +1 -1
- package/dist/{block.mds.expressionrank-046d897c.js → block.mds.expressionrank-40074fb4.js} +1 -1
- package/dist/{block.mds.expressionstat-af82688c.js → block.mds.expressionstat-bf8bc805.js} +1 -1
- package/dist/{block.mds.geneboxplot-2961335f.js → block.mds.geneboxplot-ad433e8a.js} +1 -1
- package/dist/{block.mds.junction-c263e63e.js → block.mds.junction-0254cffe.js} +1 -1
- package/dist/{block.mds.svcnv-9f95ce3e.js → block.mds.svcnv-73d538c5.js} +1 -1
- package/dist/{block.mds.svcnv.share-01948c45.js → block.mds.svcnv.share-e00a3699.js} +1 -1
- package/dist/{block.mds2-77fdedfa.js → block.mds2-d6d2551a.js} +1 -1
- package/dist/{block.svg-33b1a5a3.js → block.svg-6366aae1.js} +1 -1
- package/dist/{block.tk.aicheck-ef2d2f9f.js → block.tk.aicheck-d95a9650.js} +1 -1
- package/dist/{block.tk.ase-1fe64cd6.js → block.tk.ase-bf0cfa6b.js} +1 -1
- package/dist/{block.tk.bam-6a2a7c13.js → block.tk.bam-62b64e13.js} +1 -1
- package/dist/{block.tk.bam.gdc-5f05c118.js → block.tk.bam.gdc-3915db0f.js} +1 -1
- package/dist/{block.tk.bedgraphdot-32146ae0.js → block.tk.bedgraphdot-fc686891.js} +1 -1
- package/dist/{block.tk.bigwig.ui-d54e7afe.js → block.tk.bigwig.ui-555519ed.js} +1 -1
- package/dist/block.tk.hicstraw-58b5f07a.js +1 -0
- package/dist/{block.tk.junction-1c3f1aa9.js → block.tk.junction-47572330.js} +1 -1
- package/dist/{block.tk.junction.textmatrixui-05a68e34.js → block.tk.junction.textmatrixui-dc5a64d3.js} +1 -1
- package/dist/{block.tk.ld-daca40fa.js → block.tk.ld-b90ed4ea.js} +1 -1
- package/dist/{block.tk.menu-046e094b.js → block.tk.menu-26f22f12.js} +1 -1
- package/dist/{block.tk.pgv-478d593d.js → block.tk.pgv-a4c81f4c.js} +1 -1
- package/dist/{boxplot-85a13407.js → boxplot-c4d37016.js} +1 -1
- package/dist/{brush-909f9f6b.js → brush-926e2c93.js} +1 -1
- package/dist/{categorical-b3f62183.js → categorical-1a084c6c.js} +1 -1
- package/dist/{condition-34b91ab5.js → condition-ff87bd19.js} +1 -1
- package/dist/{controls-6bb3b02a.js → controls-78d417dd.js} +1 -1
- package/dist/{controls.btns-b40a3be5.js → controls.btns-17384076.js} +1 -1
- package/dist/{controls.config-64d29648.js → controls.config-29830317.js} +1 -1
- package/dist/{controls.divide-167e4bea.js → controls.divide-4fd6f2c7.js} +1 -1
- package/dist/{controls.overlay-57ae7dd8.js → controls.overlay-32808574.js} +1 -1
- package/dist/{controls.term1-3864a9e3.js → controls.term1-b41715fa.js} +1 -1
- package/dist/{cuminc-0b82c1e7.js → cuminc-5f67c93f.js} +1 -1
- package/dist/{dataDownload-1f1395e1.js → dataDownload-0d1b63d1.js} +1 -1
- package/dist/{databrowser.ui-2785d5f7.js → databrowser.ui-a2ac3051.js} +1 -1
- package/dist/{density-7425a82e.js → density-367804f5.js} +1 -1
- package/dist/{densityplot-787f3559.js → densityplot-dd724999.js} +1 -1
- package/dist/{dictionary-80caef7f.js → dictionary-17e05fa4.js} +1 -1
- package/dist/{drag-acc21aa6.js → drag-a09ac2ff.js} +1 -1
- package/dist/{e2pca-8ba7f340.js → e2pca-664e282c.js} +1 -1
- package/dist/{ep-00be00b4.js → ep-2db58f86.js} +1 -1
- package/dist/{filter-3f751701.js → filter-d70ef7ac.js} +1 -1
- package/dist/{fusion.parse-a611f9b3.js → fusion.parse-41c96053.js} +1 -1
- package/dist/{gdc.maf-ec3562a3.js → gdc.maf-cba55cf9.js} +1 -1
- package/dist/{gdc.singleCell-81875fcd.js → gdc.singleCell-07d56cf5.js} +1 -1
- package/dist/{geneExpression-66235015.js → geneExpression-6d9e7d0c.js} +1 -1
- package/dist/{geneSearch4GDCmds3-340ecb0b.js → geneSearch4GDCmds3-b2215bb5.js} +1 -1
- package/dist/{geneVariant-63843be0.js → geneVariant-43fde047.js} +1 -1
- package/dist/genefusion.ui-ea27a841.js +1 -0
- package/dist/{geneset-3353905a.js → geneset-754998dd.js} +1 -1
- package/dist/{genesetEdit-c84ebac0.js → genesetEdit-649e8a72.js} +1 -1
- package/dist/{genomeBrowser-89d10695.js → genomeBrowser-800a16a0.js} +1 -1
- package/dist/{genomeBrowser.controls-3096ff7d.js → genomeBrowser.controls-3dc0c2fa.js} +1 -1
- package/dist/{groupsetting-ffbcad38.js → groupsetting-5858c618.js} +1 -1
- package/dist/hic.straw-434f4eb7.js +1 -0
- package/dist/{hierCluster-18bfe13c.js → hierCluster-3e0a84cd.js} +1 -1
- package/dist/{html.legend-5319a742.js → html.legend-addd7f41.js} +1 -1
- package/dist/{lasso-876300f7.js → lasso-8bbbbf78.js} +1 -1
- package/dist/launch.adhoc-06294b93.js +1 -0
- package/dist/launchGdcHierCluster-b8aad08b.js +1 -0
- package/dist/launchGdcMatrix-47f20141.js +1 -0
- package/dist/{legacyDataset-06f1cd57.js → legacyDataset-dfbeff6f.js} +1 -1
- package/dist/{log-21584a23.js → log-f0b440eb.js} +1 -1
- package/dist/{maftimeline-55aa48ff.js → maftimeline-dc90c4de.js} +1 -1
- package/dist/{matrix-ab84c3b0.js → matrix-ec9c7dbe.js} +1 -1
- package/dist/{matrix.cells-21ab3b02.js → matrix.cells-b07dab6c.js} +1 -1
- package/dist/{matrix.cluster-075e70d6.js → matrix.cluster-7a054ab8.js} +1 -1
- package/dist/{matrix.config-be1ad712.js → matrix.config-3236a58c.js} +1 -1
- package/dist/{matrix.controls-038b1e52.js → matrix.controls-9c0f1bf0.js} +1 -1
- package/dist/{matrix.data-e98df0cd.js → matrix.data-45394aa8.js} +1 -1
- package/dist/{matrix.dom-942efb7a.js → matrix.dom-41b1fdb8.js} +1 -1
- package/dist/{matrix.interactivity-7aad6509.js → matrix.interactivity-795e0a6d.js} +1 -1
- package/dist/{matrix.layout-63528a8d.js → matrix.layout-198105e8.js} +1 -1
- package/dist/{matrix.legend-597304ac.js → matrix.legend-a64c0d04.js} +1 -1
- package/dist/{matrix.renderers-7fba9785.js → matrix.renderers-6c58ae0b.js} +1 -1
- package/dist/{matrix.serieses-2021129d.js → matrix.serieses-cb26cac5.js} +1 -1
- package/dist/{mavb-2fbef286.js → mavb-6e2a35b7.js} +1 -1
- package/dist/{mds.fimo-b262dceb.js → mds.fimo-8590f756.js} +1 -1
- package/dist/{mds.samplescatterplot-cb2737e9.js → mds.samplescatterplot-e10101ca.js} +1 -1
- package/dist/{mds.survivalplot-2c64f277.js → mds.survivalplot-b75c4563.js} +1 -1
- package/dist/{mdsjsonform-e3ab9933.js → mdsjsonform-8abf7f6a.js} +1 -1
- package/dist/{nodrag-aa5a604f.js → nodrag-f6663074.js} +1 -1
- package/dist/{numeric-49a40ec9.js → numeric-24717efb.js} +1 -1
- package/dist/{numeric.binary-ec3d2d5b.js → numeric.binary-654a9509.js} +1 -1
- package/dist/{numeric.continuous-231716e0.js → numeric.continuous-7fc70f6d.js} +1 -1
- package/dist/{numeric.discrete-0fd01d9e.js → numeric.discrete-827e4c09.js} +1 -1
- package/dist/{numeric.spline-c1903d50.js → numeric.spline-3313d0cb.js} +1 -1
- package/dist/{numeric.toggle-f9f363ce.js → numeric.toggle-6b12f881.js} +1 -1
- package/dist/{plot.2dvaf-0caf4641.js → plot.2dvaf-f14264e6.js} +1 -1
- package/dist/plot.app-fd35d881.js +1 -0
- package/dist/{plot.barplot-956aef56.js → plot.barplot-f32340fb.js} +1 -1
- package/dist/{plot.boxplot-94e3687f.js → plot.boxplot-51efd552.js} +1 -1
- package/dist/{plot.disco-6f98370b.js → plot.disco-64a059a1.js} +1 -1
- package/dist/{plot.ssgq-0808af19.js → plot.ssgq-9b6afa16.js} +1 -1
- package/dist/{plot.vaf2cov-7397c1f6.js → plot.vaf2cov-f77d37cd.js} +1 -1
- package/dist/{polar-c90065ec.js → polar-cb31636d.js} +1 -1
- package/dist/{profileBarchart-554edc8e.js → profileBarchart-7a06aca0.js} +1 -1
- package/dist/{profileHome-92b9d216.js → profileHome-c7a5fd4f.js} +1 -1
- package/dist/{profilePlot-85b4a014.js → profilePlot-289cc082.js} +1 -1
- package/dist/{profilePolar-73f348a4.js → profilePolar-3d794b4e.js} +1 -1
- package/dist/{profileRadar-f364cad1.js → profileRadar-fc20a4c9.js} +1 -1
- package/dist/{profileRadarFacility-43fcdf2e.js → profileRadarFacility-673c7d2a.js} +1 -1
- package/dist/{recover-e43c08f6.js → recover-aaa8c3c9.js} +1 -1
- package/dist/{regression.inputs-0c45aaa1.js → regression.inputs-f019ce49.js} +1 -1
- package/dist/{regression.inputs.values.table-585e0908.js → regression.inputs.values.table-745f009f.js} +1 -1
- package/dist/{regression.results-08be0f7d.js → regression.results-d6b3f6c8.js} +1 -1
- package/dist/{renderPvalueTable-37bf8da0.js → renderPvalueTable-91dfdbc8.js} +1 -1
- package/dist/{sampleScatter-cfdcfaf1.js → sampleScatter-8ff0b341.js} +1 -1
- package/dist/{sampleScatter.interactivity-0546dd5d.js → sampleScatter.interactivity-b9c38354.js} +1 -1
- package/dist/{sampleScatter.rendererThree-d3cafc37.js → sampleScatter.rendererThree-22c0c6aa.js} +2 -2
- package/dist/{sampleView-1a386748.js → sampleView-87e3a2d1.js} +1 -1
- package/dist/{samplelst-9be80a7e.js → samplelst-68f413df.js} +1 -1
- package/dist/{samplematrix-85d1c53f.js → samplematrix-7e902f7d.js} +1 -1
- package/dist/{scatter-c11c372f.js → scatter-75df9e93.js} +1 -1
- package/dist/{selectGenomeWithTklst-211fc8db.js → selectGenomeWithTklst-35489f82.js} +1 -1
- package/dist/{singleCellPlot-6ddefcb6.js → singleCellPlot-e29e4ef6.js} +1 -1
- package/dist/{singlecell-de9e3a1f.js → singlecell-82d7602e.js} +1 -1
- package/dist/{snplocus-5e58fa9a.js → snplocus-31dda555.js} +1 -1
- package/dist/{snplst-1ec1325a.js → snplst-ac484932.js} +1 -1
- package/dist/{spliceevent.a53ss.diagram-a41745fd.js → spliceevent.a53ss.diagram-eea05ed0.js} +1 -1
- package/dist/{spliceevent.exonskip.diagram-c7bfc1c6.js → spliceevent.exonskip.diagram-6555dbcc.js} +1 -1
- package/dist/spliceevent.exonskip.getdefault-01be151e.js +1 -0
- package/dist/{spliceevent.noeventdiagram-24032ee1.js → spliceevent.noeventdiagram-e1ffda26.js} +1 -1
- package/dist/{spliceevent.phrase-06afd461.js → spliceevent.phrase-e4b3d7e8.js} +1 -1
- package/dist/{stattable-0125fe2b.js → stattable-e13865df.js} +1 -1
- package/dist/{style.gdc-c3dfb645.js → style.gdc-ad9a5ffe.js} +1 -1
- package/dist/{summary-01aa7206.js → summary-d995b5ff.js} +1 -1
- package/dist/{sunburst-42078053.js → sunburst-9ea2a757.js} +1 -1
- package/dist/survival-23edb2e1.js +1 -0
- package/dist/{survival-414990ea.js → survival-4ed59aa5.js} +1 -1
- package/dist/{svg.download-7a407dac.js → svg.download-fec27f29.js} +1 -1
- package/dist/{svg.legend-9c9964d8.js → svg.legend-2498cf4b.js} +1 -1
- package/dist/{svgraph-415ea988.js → svgraph-01d91c28.js} +1 -1
- package/dist/{svmr-5974efa4.js → svmr-824f2c94.js} +1 -1
- package/dist/{table-32f4dd7a.js → table-af4e3d97.js} +1 -1
- package/dist/{table-7eb0e58b.js → table-fe7980cf.js} +1 -1
- package/dist/{termInfo-fd650b28.js → termInfo-3c0bb880.js} +1 -1
- package/dist/{termsetting-dcdfb7f9.js → termsetting-b86fec90.js} +1 -1
- package/dist/{tk-9b42407f.js → tk-67967e05.js} +1 -1
- package/dist/{tp.ui-db2ccca6.js → tp.ui-be343b6d.js} +1 -1
- package/dist/{tvs.density-4eac887b.js → tvs.density-96887a86.js} +1 -1
- package/dist/{tvs.geneVariant-2a3a6dac.js → tvs.geneVariant-cfe1d7b4.js} +1 -1
- package/dist/{tvs.numeric-4eb1b6a9.js → tvs.numeric-6471ccb6.js} +1 -1
- package/dist/{tvs.samplelst-42eeb46d.js → tvs.samplelst-08308373.js} +1 -1
- package/dist/{uiUtils-40d44b1a.js → uiUtils-7318ef28.js} +1 -1
- package/dist/{variantBrowser-753e36be.js → variantBrowser-9c007cf7.js} +1 -1
- package/dist/{vcf-94f86759.js → vcf-f06d375d.js} +1 -1
- package/dist/{violin-aa3c729e.js → violin-1ea49d5c.js} +1 -1
- package/dist/{violin.interactivity-a256aca2.js → violin.interactivity-41b8d607.js} +1 -1
- package/dist/{violin.renderer-14c2b28f.js → violin.renderer-719c808d.js} +1 -1
- package/dist/{viridis-06a8965c.js → viridis-da051ee8.js} +1 -1
- package/dist/{y-a9109585.js → y-99e1f2bb.js} +1 -1
- package/dist/{zoom-c4d23f63.js → zoom-f73106e4.js} +1 -1
- package/package.json +1 -1
- package/dist/DEanalysis-d0061779.js +0 -1
- package/dist/app-907e4feb.js +0 -1
- package/dist/block.lazyload-81707b4b.js +0 -1
- package/dist/block.tk.hicstraw-37016af5.js +0 -1
- package/dist/genefusion.ui-a84e7887.js +0 -1
- package/dist/hic.straw-cfa6d072.js +0 -1
- package/dist/launch.adhoc-f3c06528.js +0 -1
- package/dist/launchGdcHierCluster-946e74f7.js +0 -1
- package/dist/launchGdcMatrix-c1cb94fb.js +0 -1
- package/dist/plot.app-dd74a823.js +0 -1
- package/dist/spliceevent.exonskip.getdefault-60970457.js +0 -1
- package/dist/survival-28322963.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{M as t,bi as e,bj as s,o as a,E as n,bf as i,p as r,l,f as o,a as c,ay as p,aR as h,q as d,w as f,$ as u}from"./app-3f91f0f7.js";import{d as m,c as y,b as g}from"./axis-6cb4f314.js";import{s as x,b,e as k,a as v,f as _,d as D,c as w,S as T}from"./symbol-fc7cbd41.js";import"path";import"./math-2fb199c6.js";import"./constant-426a1483.js";class N{constructor(t){this.opts=t;this.anchorType=t.anchorType;this.shareheight=t.shareheight;this.sharewidth=t.sharewidth;const e="x"in t?t.x:0;const s="y"in t?t.y:0;this.settings={visible:true,opacity:.3,x:e,y:s,xOffset:t.axiswidth+t.sp+t.sample2height,yOffset:t.shareheight,currX:t.axiswidth+t.sp+t.sample2height+e,currY:t.shareheight-s,strokeWidth:"strokeWidth"in t?t.strokeWidth:5,stroke:"stroke"in t?t.stroke:"red",xarmlen:"xarmlen"in t?t.xarmlen:25};this.addControls(this.anchorType?null:this.opts.headerdiv)}setWrapper(t){this.opts.wrapper=t}addControls(e=null){if(e){e.append("button").text("Anchors").on("click",(t=>{this.anchormenu.showunder(t.target);this.xInput.property("value",(this.settings.x/this.sharewidth).toFixed(2));this.yInput.property("value",(this.settings.y/this.sharewidth).toFixed(2))}))}this.anchormenu=new t({border:"solid 1px black"});this.anchormenu.d.style("text-align","center");this.addCoordInput();this.addColorInput();this.addOpacityInput();if(!this.anchorType)this.addSubmitBtns();else this.addDeleteBtn()}addColorInput(){const t=this.anchormenu.d.append("div");t.append("label").html("Color: ");this.strokeInput=t.append("input");this.strokeInput.attr("this.anchorType","text").property("value",this.settings.stroke).style("width","50px")}addOpacityInput(){const t=this.anchormenu.d.append("div");t.append("label").html("Opacity: ");this.opacityInput=t.append("input");this.opacityInput.attr("this.anchorType","number").attr("min",0).attr("max",1).attr("step",.01).property("value",this.settings.opacity).style("width","50px")}addSubmitBtns(){if(this.anchorType)return;const t=this.anchormenu.d.append("div");t.append("label").html("Add Anchor: ");t.append("button").html("R").on("click",(()=>{new R(this.getSettings("r"));this.anchormenu.hide()}));t.append("button").html("D").on("click",(()=>{new R(this.getSettings("d"));this.anchormenu.hide()}));t.append("button").html("X").on("click",(()=>{new R(this.getSettings("x"));this.anchormenu.hide()}));t.append("button").html("synced").on("click",(()=>{new R(this.getSettings("synced"));this.anchormenu.hide()}))}getSettings(t){return Object.assign({},this.opts,{anchorType:t,opacity:this.opacityInput.property("value"),x:this.xInput.property("value")*this.sharewidth,y:this.yInput.property("value")*this.shareheight,stroke:this.strokeInput.property("value")})}addCoordInput(){const t=this.anchormenu.d.append("div");t.append("label").html("X: ");this.xInput=t.append("input");this.xInput.attr("this.anchorType","number").attr("min",0).attr("max",1).attr("step",.01).property("value",0).style("width","80px");const e=this.anchormenu.d.append("div");e.append("label").html("Y: ");this.yInput=e.append("input");this.yInput.attr("this.anchorType","number").attr("min",0).attr("max",1).attr("step",.01).property("value",0).style("width","80px")}addDeleteBtn(){if(!this.anchorType)return;const t=this.anchormenu.d.append("div");t.append("button").html("Delete").on("click",(()=>{this.g_anchor.remove();this.anchormenu.hide()}))}}class R extends N{constructor(t){super(t);this.render();this.strokeInput.on("change",(()=>{this.settings.stroke=this.strokeInput.property("value");this.g_anchor.style("stroke",this.settings.stroke);this.anchormenu.hide()}));this.opacityInput.on("change",(()=>{this.settings.opacity=input.property("value");this.g_anchor.style("opacity",this.settings.opacity);this.anchormenu.hide()}));this.xInput.on("change",(()=>{this.settings.x=+this.xInput.property("value")*this.sharewidth;this.settings.currX=this.settings.x+this.settings.xOffset;if(this.d_anchor){this.d_anchor.transition().duration(1e3).attr("x1",this.settings.currX).attr("x2",this.settings.currX)}if(this.x_anchor){this.x_anchor.transition().duration(1e3).attr("transform","translate("+this.settings.currX+","+this.settings.currY+")")}this.anchormenu.hide()}));this.yInput.on("change",(()=>{this.settings.y=+this.yInput.property("value")*this.shareheight;this.settings.currY=-this.settings.y+this.settings.yOffset;if(this.r_anchor){this.r_anchor.transition().duration(1e3).attr("y1",this.settings.currY).attr("y2",this.settings.currY)}if(this.x_anchor){this.x_anchor.transition().duration(1e3).attr("transform","translate("+this.settings.currX+","+this.settings.currY+")")}this.anchormenu.hide()}))}render(){this.g_anchor=this.opts.wrapper.append("g").style("stroke",this.settings.stroke).style("opacity",this.settings.opacity).style("display",this.settings.visible?"":"none").style("stroke-width",this.settings.strokeWidth).on("click",this.anchorType=="synced"?null:t=>{this.anchormenu.showunder(t.target)});this.renderD();this.renderR();this.renderX()}renderD(){if(!["synced","d"].includes(this.anchorType))return;this.d_anchor=this.g_anchor.append("line");const t=this.opts;this.updateD(t.shareheight+t.sp2,t.shareheight+t.sample1height)}updateD(t,e){if(!["synced","d"].includes(this.anchorType))return;this.settings.D={y1:t,y2:e};this.d_anchor.attr("x1",this.settings.currX).attr("x2",this.settings.currX).attr("y1",t).attr("y2",e)}renderR(){if(!["synced","r"].includes(this.anchorType))return;this.r_anchor=this.g_anchor.append("line");const t=this.opts;this.updateR(t.axiswidth+t.sp,t.sample2height+t.sp)}updateR(t,e){if(!["synced","r"].includes(this.anchorType))return;this.settings.R={x1:t,x2:e};this.r_anchor.attr("x1",t).attr("x2",e).attr("y1",this.settings.currY).attr("y2",this.settings.currY)}renderX(){if(!["synced","x"].includes(this.anchorType))return;this.x_anchor=this.g_anchor.append("g").attr("transform","translate("+this.settings.currX+","+this.settings.currY+")");this.bindXDrag();this.x_anchor.append("circle").attr("cx",0).attr("cy",0).attr("r",this.settings.xarmlen).style("opacity",0);this.x_anchor.append("line").attr("x1",-this.settings.xarmlen).attr("x2",this.settings.xarmlen).attr("y1",0).attr("y2",0);this.x_anchor.append("line").attr("x1",0).attr("x2",0).attr("y1",this.settings.xarmlen).attr("y2",-this.settings.xarmlen)}bindXDrag(){if(!["synced"].includes(this.anchorType))return;this.x_anchor.on("mousedown",(t=>{const e=t.clientX;const s=t.clientY;let a=this.settings.currX,n=this.settings.currY;this.x_anchor.on("mousemove",(t=>{a=this.settings.currX-e+t.clientX;n=this.settings.currY-s+t.clientY;this.r_anchor.attr("y1",n).attr("y2",n);this.d_anchor.attr("x1",a).attr("x2",a);this.x_anchor.attr("transform","translate("+a+","+n+")")})).on("mouseup",(t=>{this.x_anchor.on("mousemove",null);a=this.settings.currX-e+t.clientX;n=this.settings.currY-s+t.clientY;if(a==this.settings.currX&&n==this.settings.currY){this.g_anchor.remove();return}this.settings.x=a<this.settings.xOffset?0:a-this.settings.xOffset;this.settings.y=n>this.settings.yOffset?0:-(n-this.settings.yOffset);this.settings.currX=this.settings.x+this.settings.xOffset;this.settings.currY=-this.settings.y+this.settings.yOffset;this.r_anchor.transition().duration(100).attr("y1",this.settings.currY).attr("y2",this.settings.currY);this.d_anchor.transition().duration(100).attr("x1",this.settings.currX).attr("x2",this.settings.currX);this.x_anchor.transition().duration(100).attr("transform","translate("+this.settings.currX+","+this.settings.currY+")")})).on("mouseleave",(()=>{this.x_anchor.on("mousemove",null)}))}))}}const I="#f9766c";const M="#609cff";const X="#01b937";const B={circle:x,cross:b,diamond:k,square:v,star:_,triangle:D,wye:w};const F={path:t=>t.symbol,circle:t=>!t.symbol};const Y={path:t=>t.symbol,ellipse:t=>!t.symbol};function A(t,a){let n,i,r,l,o,c;if(a!==undefined)[i,r,l,o,c]=e(a,t);else{[n,i,r,l,o,c]=s(100,100,t);n.header.text("2DMAF: mutant allele fraction plot between a pair of samples");n.body.style("margin","10px")}i.append("div").style("margin-top","20px").html("<ul>"+'<li><a href="https://docs.google.com/document/d/1anyEDMcW1lTSf8399Li2G9r57V-Fqp2591WvoODY7n4/edit#heading=h.mne2ecmp9m13" target=_blank>File format</a></li>'+'<li>To define samples differently than "Diagnosis/Relapse", <a href=https://plus.google.com/+XinZhou_s/posts/WqBVvmd3wYR target=_blank>see how</a>.</li>'+"</ul>");i.append("p").html("<a href=https://proteinpaint.stjude.org/ppdemo/hg19/2dmaf/2dmaf.txt target=_blank>Example file</a>");function p(t,e){o.style("color",e?"red":"black").html(t)}const h=()=>{l.selectAll("*").remove();const e=l.append("input").attr("type","file").on("change",(e=>{const s=e.target.files[0];if(!s){h();return}if(!s.size){p("Invalid file "+s.name);h();return}const a=new FileReader;a.onload=e=>{const a=r.options[r.selectedIndex].innerHTML;const n=C(e.target.result.trim().split(/\r?\n/),t[a],s.name,c);if(n){p(n,1);h();return}i.remove();l.remove();o.remove()};a.onerror=function(){p("Error reading file "+s.name,1);h();return};a.readAsText(s,"utf8")}));setTimeout((()=>e.node().focus()),1100)};h()}function z(t,e){if(!t.genome){a(e,".genome missing for 2dmaf");return}if(!t.input){a(e,".input missing for 2dmaf");return}const s=C(t.input.trim().split(/\r?\n/),t.genome,t.datasetname||"unnamed dataset",e);if(s){a(e,"2DMAF data error: "+s)}}function C(t,e,s,a){const[r,l,o]=O(t[0].trim());if(r){return r}const c={};const p={};const h={};const d={good:0,purity1set:false,purity2set:false,pairsetname:{}};const f=[];const u={};for(const t in n){u[n[t].label.toUpperCase()]=t}for(let e=1;e<t.length;e++){if(t[e]=="")continue;if(t[e][0]=="#"){if(t[e].startsWith("##samplename")){const s=t[e].trim().split(/[\s\t]+/);if(s.length==4){d.pairsetname[s[1]]={1:s[2],2:s[3]}}else{return"Line "+(e+1)+': invalid samplename line: must be "##samplename [patient] [sample1] [sample2]"'}}continue}const s=t[e].trim().split("\t");const a={};for(let t=0;t<l.length;t++){if(s[t]!=undefined&&s[t]!=""){a[l[t]]=s[t]}}if(!a.sample){return"Line "+(e+1)+": missing sample"}if(a.chr){if(a.chr.indexOf("chr")!=0){a.chr="chr"+a.chr}}if(a.chrstart){a.chrstart=Number.parseInt(a.chrstart);if(Number.isNaN(a.chrstart)){return"Line "+(e+1)+": invalid chromosome position"}}if(a.Dcnvloh){a.Dcnvlohraw=a.Dcnvloh;const t=a.Dcnvloh.toLowerCase();if(t=="yes"||t!="diploid"&&t!="haploid"){a.Dcnvloh=true}else{a.Dcnvloh=false}}if(a.Rcnvloh){a.Rcnvlohraw=a.Rcnvloh;const t=a.Rcnvloh.toLowerCase();if(t=="yes"||t!="diploid"&&t!="haploid"){a.Rcnvloh=true}else{a.Rcnvloh=false}}if(!a.call_d){f.push([e,"missing call_d",s]);continue}if(a.call_d!="somatic"&&a.call_d!="wildtype"){f.push([e,"call_d is neither somatic nor wildtype",s]);continue}if(!a.call_r){f.push([e,"missing call_r",s]);continue}if(a.call_r!="somatic"&&a.call_r!="wildtype"){f.push([e,"call_r is neither somatic nor wildtype",s]);continue}if(a.call_d=="somatic"){if(a.call_r=="somatic"){a.set_share=true}else{a.set_1=true}}else{if(a.call_r=="somatic"){a.set_2=true}}if(!a.type){f.push([e,"missing type",s]);continue}const i=a.type.toLowerCase();if(i=="snv"||i=="snp"||i=="mnv"||i=="complex"){a.issnv=true}else if(i=="indel"||i=="ins"||i=="del"){a.isindel=true}else{f.push([e,"type must be either SNV or INDEL",s]);continue}let r="MinD.D";let o=Number.parseInt(a[r]);if(Number.isNaN(o)||o<0){f.push([e,"invalid "+r+" value",s]);continue}a[r]=o;r="TinD.D";o=Number.parseInt(a[r]);if(Number.isNaN(o)||o<0){f.push([e,"invalid "+r+" value",s]);continue}a[r]=o;if(a["TinD.D"]<a["MinD.D"]){f.push([e,"TinD.D value lower than MinD.D",s]);continue}r="MinN.D";if(r in a){o=Number.parseInt(a[r]);if(Number.isNaN(o)||o<0){delete a[r]}else{a[r]=o}}r="TinN.D";if(r in a){o=Number.parseInt(a[r]);if(Number.isNaN(o)||o<0){delete a[r]}else{a[r]=o}}r="MinD.R";o=Number.parseInt(a[r]);if(Number.isNaN(o)||o<0){f.push([e,"invalid "+r+" value",s]);continue}a[r]=o;r="TinD.R";o=Number.parseInt(a[r]);if(Number.isNaN(o)||o<0){f.push([e,"invalid "+r+" value",s]);continue}a[r]=o;if(a["TinD.R"]<a["MinD.R"]){f.push([e,"TinD.R value lower than MinD.R",s]);continue}r="MinN.R";if(r in a){o=Number.parseInt(a[r]);if(Number.isNaN(o)||o<0){delete a[r]}else{a[r]=o}}r="TinN.R";if(r in a){o=Number.parseInt(a[r]);if(Number.isNaN(o)||o<0){delete a[r]}else{a[r]=o}}if(a.symbol){if(!B[a.symbol]){f.push([e,"Invalid symbol value='"+a.symbol+"'",s]);continue}}if(a.class){const t=a.class.toUpperCase();if(t in u){a.class=u[t]}else{f.push([e,"invalid mutation class "+a.class,s]);continue}}a.style={fill:a.issnv?"white":"black",fillhl:a.class?n[a.class].color:"#ccc",stroke:a.chr=="chrX"?"black":a.issnv?"black":"none",strokehl:a.class?n[a.class].color:"black",fillopacity:a.issnv?0:.2,strokeopacity:.2};if(a["TinD.D"]>0){a.maf1=a["MinD.D"]/a["TinD.D"]}if(a["TinD.R"]>0){a.maf2=a["MinD.R"]/a["TinD.R"]}p[a.sample]=1;if(a.gene){h[a.gene]=1}if(!(a.sample in c)){c[a.sample]={name:a.sample,shown:false,header:l,mlst:[]}}const m=c[a.sample];m.mlst.push(a);if(a.purity1){let t=Number.parseFloat(a.purity1);if(Number.isNaN(t)){f.push([e,"diagnosis tumor purity should be a number"]);t=0}else{if(t>1){t/=100}}if(t>0){if(m.purity1==undefined){m.purity1=t;d.purity1set=true}else if(m.purity1!=t){f.push([e,"diagnosis tumor purity value "+t+" is different from existing value "+m.purity1+" in "+a.sample,s])}}}if(a.purity2){let t=Number.parseFloat(a.purity2);if(Number.isNaN(t)){f.push([e,"relapse tumor purity should be a number"]);t=0}else{if(t>1){t/=100}}if(t>0){if(m.purity2==undefined){m.purity2=t;d.purity2set=true}else if(m.purity2!=t){f.push([e,"relapse tumor purity value "+t+" is different from existing value "+m.purity2+" in "+a.sample,s])}}}d.good++}if(f.length>0){i(l,f)}if(d.good==0){return"No valid data."}a.append("p").text("File: "+s);let m=0;for(const t in h)m++;const y=16;const g=a.append("table");const x=g.append("tr");const b=x.append("td").attr("valign","top");b.append("div").html('<div style="display:inline-block;width:'+y+"px;height:"+y+"px;background-color:"+I+'"></div> Diagnosis only '+'<div style="display:inline-block;width:'+y+"px;height:"+y+"px;background-color:"+X+'"></div> Shared '+'<div style="display:inline-block;width:'+y+"px;height:"+y+"px;background-color:"+M+'"></div> Relapse only');const k=b.append("div").style("margin-top","10px").style("height","200px").style("width","300px").style("padding","5px").style("overflow-y","scroll").style("resize","both").style("border","solid 1px #ccc");b.append("div").style("margin-top","10px").style("height","200px").style("width","300px").style("padding","5px").style("overflow-y","scroll").style("resize","both").style("border","solid 1px #ccc");const v=x.append("td").style("vertical-align","top");for(const t in c){const e=d.pairsetname[t];if(e){c[t].setname=e}else{c[t].setname={1:"Diagnosis",2:"Relapse"}}}const _={genome:e,pairs:c,color1:I,color2:M,colorshare:X,rowh:y,peoplewidth:150,genewidth:150,showholder:v,genelimit:Math.min(20,m),purity1set:d.purity1set,purity2set:d.purity2set};E(_,k)}function O(t){const e=t.toLowerCase().split("\t");const s=t.split("\t");if(s.length<=1){return["invalid file header"]}const a=(...t)=>{for(const s of t){const t=e.indexOf(s);if(t!=-1)return t}return-1};let i=a("person","sample","samplename","patient");if(i==-1)return["sample missing from header"];s[i]="sample";i=a("type");if(i==-1)return["type missing from header"];s[i]="type";i=a("mind.d1_g1","mind.d","mind");if(i==-1)return["MinD.D missing from header"];s[i]="MinD.D";i=a("tind.d1_g1","tind.d","tind");if(i==-1)return["TinD.D missing from header"];s[i]="TinD.D";i=a("mind.r1_g1","mind.r","minr");if(i==-1)return["MinD.R missing from header"];s[i]="MinD.R";i=a("tind.r1_g1","tind.r","tinr");if(i==-1)return["TinD.R missing from header"];s[i]="TinD.R";i=a("call_d1_g1","call_d");if(i==-1)return["call_d missing from header"];s[i]="call_d";i=a("call_r1_g1","call_r");if(i==-1)return["call_r missing from header"];s[i]="call_r";i=a("genename","gene");if(i==-1)return["gene missing from header"];s[i]="gene";i=a("amino_acid_change","annovar_sj_aachange","aachange","protein_change");if(i==-1)return["amino_acid_change missing from header"];s[i]="mname";i=a("class","mclass","variant_class","variant_classification","annovar_sj_class");if(i==-1)return["variant_class missing from header"];s[i]="class";i=a("chromosome","chr");if(i==-1)return["chromosome missing from header"];s[i]="chr";i=a("start","start_position","wu_hg19_pos","chr_position");if(i==-1)return["start missing from header"];s[i]="chrstart";i=a("minn.d1_g1","minn.d");if(i!=-1)s[i]="MinN.D";i=a("tinn.d1_g1","tinn.d");if(i!=-1)s[i]="TinN.D";i=a("minn.r1_g1","minn.r");if(i!=-1)s[i]="MinN.R";i=a("tinn.r1_g1","tinn.r");if(i!=-1)s[i]="TinN.R";i=a("mrna_accession","refseq_mrna_id","annovar_sj_filter_isoform","refseq");if(i!=-1)s[i]="isoform";i=a("primary_purity","purity_d");if(i!=-1)s[i]="purity1";i=a("relapse_purity","purity_r");if(i!=-1)s[i]="purity2";i=a("tag_d_cnvloh","cnvloh_d");if(i!=-1)s[i]="Dcnvloh";i=a("tag_r_cnvloh","cnvloh_r");if(i!=-1)s[i]="Rcnvloh";const r=[];for(const t of s){switch(t){case"Dcnvloh":r.push({label:"D. CNV/LOH",get:t=>t.Dcnvlohraw});break;case"Rcnvloh":r.push({label:"R. CNV/LOH",get:t=>t.Rcnvlohraw});break;case"type":r.push({label:"Type",get:t=>t.type});break;case"chr":break;case"chrstart":r.push({label:"Genome Loc.",get:t=>t.chr+":"+(t.chrstart+1)});break;case"class":r.push({label:"Class",get:t=>{if(t.class==p){return t.originalclasslabel?t.originalclasslabel:n[t.class].label}return n[t.class].label}});break;case"mname":r.push({label:"Mutation",get:t=>{let e=t.mname;if(!e)e=t.cdna_change;return e}});break;case"MinD.D":r.push({ismaf:true,width:60,height:14,readcountcredible:30,get:t=>t.maf_diagnosis,label:"D. tumor MAF",fill:"#F7483B",fillbg:"#FCBAB6"});break;case"TinD.D":break;case"MinD.R":r.push({ismaf:true,width:60,height:14,readcountcredible:30,get:t=>t.maf_relapse,label:"R. tumor MAF",fill:"#146EFF",fillbg:"#B6D5FC"});break;case"TinD.R":break;case"MinN.D":r.push({ismaf:true,width:60,height:14,readcountcredible:30,get:t=>t.maf_diagnosis_normal,label:"D. normal MAF",fill:"#F7483B",fillbg:"#FCBAB6"});break;case"TinN.D":break;case"MinN.R":r.push({ismaf:true,width:60,height:14,readcountcredible:30,get:t=>t.maf_relapse_normal,label:"R. normal MAF",fill:"#146EFF",fillbg:"#B6D5FC"});break;case"TinN.R":break;case"call_d":r.push({label:"D. call",get:t=>t.call_d});break;case"call_r":r.push({label:"R. call",get:t=>t.call_r});break;case"purity1":r.push({label:"D. purity",get:t=>t.purity1});break;case"purity2":r.push({label:"R. purity",get:t=>t.purity2});break;default:r.push({label:t,get:e=>e[t]})}}return[null,s,r]}function j(e,s){const a=new t({border:"solid 1px black"});const i=[];const o=[];const p=[];const f=s.mlst;const u=f[0].sample;const m=T();let x=0;let b={};const k={};for(const t of f){if(t["TinD.D"]>0){x=Math.max(x,t["TinD.D"])}if(t["TinD.R"]>0){x=Math.max(x,t["TinD.R"])}if(t.set_share){p.push(t)}else if(t.set_1){i.push(t)}else if(t.set_2){o.push(t)}if(!(t.class in k)){k[t.class]=0}if(t.symbol){if(!b[t.symbol]){b[t.symbol]={numlines:0,label:t.symbollabel,hidden:false}}b[t.symbol].numlines++}k[t.class]++}const v=Math.min(window.innerWidth,window.innerHeight);const _=50,D=v*.5,w=v*.5,R=w/2,I=D/2,M=_/3,X=R/5,A=Math.min(20,12*v/500),z=v/40,C=z*.7,O=3;const j=l().domain([0,x]).range([z/2,z]);const W=t=>Math.PI*Math.pow(j(t),2);for(const t of f){t.radius=Math.max(t["TinD.D"]?j(t["TinD.D"]):0,t["TinD.R"]?j(t["TinD.R"]):0)}const E=e.append("table");const H=E.append("tr");const q=H.append("td").style("vertical-align","top");const G=H.append("td").style("vertical-align","top");G.append("div").style("margin","10px").text("Name: "+u);const U=q.append("div");U.append("button").text("Hide").on("click",(()=>{s.shown=false;if(s.handle){s.handle.attr("font-weight","normal")}E.remove()}));const P=new N({axiswidth:_,sp:M,sp2:X,sample1height:R,sample2height:I,shareheight:w,sharewidth:D,headerdiv:U});U.append("button").text("Screenshot").on("click",(()=>{h(Z.node(),"2dmaf_"+s.name)}));{const t=U.append("select").on("change",(t=>{const e=t.target.options[t.target.selectedIndex].value;if(e=="all"){at.transition().attr("transform",(t=>t.posstring+" scale(1)"));ot.transition().attr("transform",(t=>t.posstring+" scale(1)"));dt.transition().attr("transform",(t=>t.posstring+" scale(1)"));return}at.transition().attr("transform",(t=>t.posstring+" scale("+(t.class==e?1:0)+")"));ot.transition().attr("transform",(t=>t.posstring+" scale("+(t.class==e?1:0)+")"));dt.transition().attr("transform",(t=>t.posstring+" scale("+(t.class==e?1:0)+")"))}));t.append("option").text("Show all mutation classes").property("value","all");const e=[];for(const t in k){e.push([t,k[t]])}e.sort(((t,e)=>e[1]-t[1]));for(const s of e){t.append("option").text((s[0]in n?n[s[0]].label:s[0])+" ("+s[1]+")").property("value",s[0])}}const Z=q.append("svg").attr("width",_+M+I+D+M*2).attr("height",_+M+R+w+M*2);const $=Z.append("g").attr("transform","translate("+M+","+M+")");P.setWrapper($.append("g"));const J=l().domain([0,1]).range([0,D]);const K=$.append("g").attr("transform","translate("+(_+M+I)+","+(w+R+M)+")").call(y().scale(J).tickSize(5));c({axis:K,showline:true,fontsize:A*.8});const Q=i.length+p.length;K.append("text").text(s.setname[1]+", n="+Q+(s.purity1?", purity="+s.purity1:"")).attr("x",D/2).attr("y",_-4).attr("text-anchor","middle").attr("font-size",A);const tt=l().domain([0,1]).range([w,0]);const et=$.append("g").attr("transform","translate("+_+",0)").call(g().scale(tt).tickSize(5));c({axis:et,showline:true,fontsize:A*.8});const st=o.length+p.length;et.append("text").text(s.setname[2]+", n="+st+(s.purity2?", purity="+s.purity2:"")).attr("transform","translate("+(A-_-10)+","+w/2+") rotate(-90)").attr("text-anchor","middle").attr("font-size",A);$.append("path").attr("d","M"+(_+M)+",0"+"h"+(I+D)+"v"+(w+R)+"h-"+D+"v-"+(R+w)+"M"+(_+M)+",0"+"v"+w+"h"+(I+D)+"M"+(_+M+I)+","+w+"l"+D+",-"+w).attr("fill","none").attr("stroke","black").attr("shape-rendering","crispEdges").attr("stroke-dasharray","5,5");const at=$.append("g").attr("transform","translate("+(_+M+I)+",0)").selectAll().data(p).enter().append("g").attr("transform",(t=>{t.posstring="translate("+J(t.maf1)+","+tt(t.maf2)+")";return t.posstring}));at.filter((t=>t.Dcnvloh)).append("circle").attr("cy",(t=>t.issnv?j(t["TinD.R"]):C/2)).attr("fill","#858585").attr("r",O);at.filter((t=>t.Rcnvloh)).append("circle").attr("cx",(t=>t.issnv?-j(t["TinD.D"]):-C/2)).attr("fill","#858585").attr("r",O);let nt=at;for(const t in Y){nt.filter(Y[t]).append(t).attr("rx",(t=>t.symbol?null:j(t["TinD.D"]))).attr("ry",(t=>t.symbol?null:j(t["TinD.R"]))).attr("d",(t=>!t.symbol?null:m.type(B[t.symbol]).size(W(t["TinD.D"])+W(t["TinD.R"])/2)())).attr("fill",(t=>t.style.fill)).attr("fill-opacity",(t=>t.style.fillopacity)).attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("stroke-dasharray",(t=>t.chr=="chrX"?"5,5":"none")).on("mouseover",((t,e)=>S(t,e,a))).on("mouseout",((t,e)=>L(t,e,a))).on("click",((t,e)=>V(t,s.header,e)))}nt.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",-3).attr("x2",3).attr("y2",3);nt.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",3).attr("x2",3).attr("y2",-3);const it=l().domain([0,x]).range([R-X,0]);const rt=$.append("g").attr("transform","translate("+(_+M+I)+","+(w+X)+")");const lt="#FFBEAD";rt.append("rect").attr("fill",lt).attr("fill-opacity",0).attr("x",0).attr("width",3).attr("height",R-X);c({axis:rt.call(g().scale(it).tickValues([0,x])),showline:true,fontsize:A*.8});rt.append("g").attr("transform","translate(-"+A/2+","+(R-X)/2+")").append("text").text("D total").attr("font-size",A*.8).attr("font-family",r).attr("fill","black").attr("text-anchor","middle").attr("dominant-baseline","middle").attr("transform","rotate(-90)");const ot=rt.selectAll().data(i).enter().append("g").attr("transform",(t=>{t.posstring="translate("+J(t.maf1)+","+it(t["TinD.D"])+")";return t.posstring}));ot.filter((t=>t.Dcnvloh)).append("circle").attr("cy",(t=>t.issnv?j(t["TinD.R"]):C/2)).attr("fill","#858585").attr("r",O);ot.filter((t=>t.Rcnvloh)).append("circle").attr("cx",(t=>t.issnv?-j(t["TinD.D"]):-C/2)).attr("fill","#858585").attr("r",O);nt=ot;for(const t in F){nt.filter(F[t]).append(t).attr("class",(t=>t.symbol?"twodmaf-"+t.symbol:null)).attr("r",(t=>t.symbol?null:j(t["TinD.R"]))).attr("d",(t=>!t.symbol?null:m.type(B[t.symbol]).size(W(t["TinD.R"]))())).attr("fill",(t=>t.style.fill)).attr("fill-opacity",(t=>t.style.fillopacity)).attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("stroke-dasharray",(t=>t.chr=="chrX"?"5,5":"none")).on("mouseover",((t,e)=>S(t,e,a))).on("mouseout",((t,e)=>L(t,e,a))).on("click",((t,e)=>V(t,s.header,e)))}nt.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",-3).attr("x2",3).attr("y2",3);nt.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",3).attr("x2",3).attr("y2",-3);const ct=l().domain([0,x]).range([0,I-X]);const pt=$.append("g").attr("transform","translate("+(_+M)+",0)");pt.append("rect").attr("fill",lt).attr("fill-opacity",0).attr("y",w).attr("width",I-X).attr("height",3);const ht=pt.append("g").attr("transform","translate(0,"+w+")").call(y().scale(ct).tickValues([0,x]));c({axis:ht,showline:true,fontsize:A*.8});pt.append("text").text("R total").attr("font-size",A*.8).attr("font-family",r).attr("fill","black").attr("x",(I-X)/2).attr("y",w+A).attr("text-anchor","middle");const dt=pt.selectAll().data(o).enter().append("g").attr("transform",(t=>{t.posstring="translate("+ct(t["TinD.R"])+","+tt(t.maf2)+")";return t.posstring}));dt.filter((t=>t.Dcnvloh)).append("circle").attr("cy",(t=>t.issnv?j(t["TinD.R"]):C/2)).attr("fill","#858585").attr("r",O);dt.filter((t=>t.Rcnvloh)).append("circle").attr("cx",(t=>t.issnv?-j(t["TinD.D"]):-C/2)).attr("fill","#858585").attr("r",O);nt=dt;for(const t in F){nt.filter(F[t]).append(t).attr("class",(t=>t.symbol?"twodmaf-"+t.symbol:null)).attr("r",(t=>t.symbol?null:j(t["TinD.D"]))).attr("d",(t=>!t.symbol?null:m.type(B[t.symbol]).size(W(t["TinD.R"]))())).attr("fill",(t=>t.style.fill)).attr("fill-opacity",(t=>t.style.fillopacity)).attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("stroke-dasharray",(t=>t.chr=="chrX"?"5,5":"none")).on("mouseover",((t,e)=>S(t,e,a))).on("mouseout",((t,e)=>L(t,e,a))).on("click",((t,e)=>V(t,s.header,e)))}nt.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",-3).attr("x2",3).attr("y2",3);nt.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",3).attr("x2",3).attr("y2",-3);const ft=$.append("g").attr("transform","translate(0,"+(w+X)+")");let ut=A;ft.append("text").text(u).attr("font-size",A).attr("y",ut);const mt=j(20),yt=j(x);ut+=A+yt;let gt;ft.append("text").text("SNV coverage").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));gt+=mt+10;ft.append("circle").attr("cx",gt).attr("cy",ut).attr("r",mt).attr("stroke","black").attr("fill","none");ft.append("text").text(20).attr("x",gt).attr("y",ut).attr("text-anchor","middle").attr("dominant-baseline","middle");gt+=mt+yt+10;ft.append("circle").attr("cx",gt).attr("cy",ut).attr("r",yt).attr("stroke","black").attr("fill","none");ft.append("text").text(x).attr("x",gt).attr("y",ut).attr("text-anchor","middle").attr("dominant-baseline","middle");ut+=yt+10;ft.append("text").text("Indel").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));ft.append("circle").attr("cx",gt+10+C/2).attr("cy",ut).attr("r",C/2).attr("fill","black").attr("fill-opacity",.3);ut+=30;ft.append("text").text("chrX").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));gt+=mt+10;ft.append("circle").attr("cx",gt).attr("cy",ut).attr("r",10).attr("stroke","black").attr("stroke-dasharray","5,5").attr("fill","none");ut+=30;ft.append("text").text("D. CNV/LOH").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));gt+=mt+10;ft.append("circle").attr("cx",gt).attr("cy",ut).attr("r",10).attr("stroke","black").attr("fill","none");ft.append("circle").attr("cx",gt).attr("cy",ut+10).attr("r",O).attr("fill","black");ut+=30;ft.append("text").text("R. CNV/LOH").attr("y",ut).attr("dominant-baseline","central").each((function(){gt=this.getBBox().width}));gt+=mt+10;ft.append("circle").attr("cx",gt).attr("cy",ut).attr("r",10).attr("stroke","black").attr("fill","none");ft.append("circle").attr("cx",gt-10).attr("cy",ut).attr("r",O).attr("fill","black");ut+=30;if(s.purity1!=undefined||s.purity2!=undefined){ft.append("text").text("Expected MAF").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));gt+=10;ft.append("rect").attr("fill",lt).attr("x",gt).attr("y",ut).attr("width",40).attr("height",3);ut+=30}const xt=Object.keys(b);if(xt.length){ft.append("text").text("Symbols").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));let t;for(const e in b){const s=b[e];const a=ft.append("g").on("click",(()=>{s.hidden=!s.hidden;Z.selectAll(".twodmaf-"+e).style("display",s.hidden?"none":"");n.style("text-decoration",s.hidden?"line-through":"")}));t=gt+20;a.append("path").attr("transform","translate("+t+","+ut+")").attr("d",m.type(B[e]).size(100)()).attr("stroke","black").attr("fill","none").each((function(){t+=this.getBBox().width}));const n=a.append("text").text(s.label?s.label+" ("+s.numlines+")":"").attr("y",ut+2).attr("x",t).attr("dominant-baseline","middle").style("text-decoration",s.hidden?"line-through":"");ut+=30}ut+=30}const bt={},kt={},vt={},_t={};for(const t of f){if(!t.gene)continue;if(!(t.gene in bt)){bt[t.gene]=[]}bt[t.gene].push(t);if(t.set_1){kt[t.gene]=1}else if(t.set_2){vt[t.gene]=1}else if(t.set_share){_t[t.gene]=1}}const Dt=[];for(const t in kt){Dt.push(t)}for(const t in vt){if(!(t in kt)){Dt.push(t)}}for(const t in _t){if(!(t in kt)&&!(t in vt)){Dt.push(t)}}const wt=G.append("div").style("height",w+R+"px").style("margin","10px").style("padding","10px").style("border","solid 1px #ccc").style("overflow-y","scroll").style("resize","both").append("table");{const t=wt.append("tr");t.append("td").text("Gene");t.append("td").text(s.setname[1]+" only");t.append("td").text(s.setname[2]+" only");t.append("td").text("Shared")}let Tt=true;for(const t of Dt){const e=wt.append("tr");if(Tt){e.style("background-color","#f3f3f3")}Tt=!Tt;e.append("td").text(t);let s=[];if(t in bt){s=bt[t]}const a=[],n=[],i=[];for(const t of s){if(t.set_share)i.push(t);else if(t.set_1)a.push(t);else if(t.set_2)n.push(t)}let r=e.append("td");if(a.length){for(const t of a){const e=r.append("div").attr("class","sja_clbtext").style("color",t.style.fillhl).text(t.mname||"").on("click",(e=>{Nt(e.target,t,ot)}));if(t.labelIsVisible){Nt(e.node(),t,ot)}}}r=e.append("td");if(n.length){for(const t of n){const e=r.append("div").attr("class","sja_clbtext").style("color",t.style.fillhl).text(t.mname||"").on("click",(e=>{Nt(e.target,t,dt)}));if(t.labelIsVisible){Nt(e.node(),t,ot)}}}r=e.append("td");if(i.length){for(const t of i){const e=r.append("div").attr("class","sja_clbtext").style("color",t.style.fillhl).text(t.mname||"").on("click",(e=>{Nt(e.target,t,at)}));if(t.labelIsVisible){Nt(e.node(),t,ot)}}}}function Nt(t,e,s){if(e.selected){t.style.border="";e.selected=false}else{t.style.border="solid 1px black";e.selected=true}const a=s.filter((t=>t.gene==e.gene&&t.class==e.class&&t.mname==e.mname));a.selectAll("rect").attr("fill-opacity",e.selected?.5:e.style.fillopacity).attr("fill",e.selected?e.style.fillhl:e.style.fill);a.selectAll("circle,ellipse,line").attr("stroke-opacity",e.selected?1:e.style.strokeopacity).attr("stroke",e.selected?e.style.strokehl:e.style.stroke).attr("stroke-width",e.selected?2:1);if(e.selected){let t=Math.max(20,e.radius),s=0;if((e.set_1||e.set_share)&&e.maf1>=.8){t=-e.radius;s=e.radius*2}const n=a.append("g").attr("class","sja_2dmaf_mlabel").attr("transform","translate("+t+","+s+")");let i;n.append("text").text(e.labelAs?e.labelAs:e.gene+" "+e.mname).attr("fill",e.style.fillhl).attr("dominant-baseline","middle").attr("text-anchor","start").attr("font-size",e.radius).each((function(){i=this.getBBox().width}));n.append("rect").attr("y",-e.radius/2).attr("width",i).attr("height",e.radius).attr("fill","black").attr("fill-opacity",0).on("mouseover",(t=>d(t.target).attr("fill-opacity",.2))).on("mouseout",(t=>d(t.target).attr("fill-opacity",0))).on("mousedown",(e=>{const a=t,i=s,r=e.clientX,l=e.clientY,o=d(document.body);o.on("mousemove",(e=>{e.preventDefault();t=a+e.clientX-r;s=i+e.clientY-l;n.attr("transform","translate("+t+","+s+")")}));o.on("mouseup",(()=>{o.on("mousemove",null).on("mouseup",null)}))}))}else{a.select(".sja_2dmaf_mlabel").remove()}}return E}function S(t,e,s){if(!e.selected){d(t.target).attr("fill",e.style.fillhl).attr("fill-opacity",.2)}s.clear();s.show(t.clientX,t.clientY);s.d.append("div").html((e.gene||"no gene")+' <span style="color:'+e.style.fillhl+'">'+(e.mname||"")+"</span>"+(e.class?' <span style="font-size:70%">'+n[e.class].label+"</span>":""))}function L(t,e,s){if(!e.selected){d(t.ele).attr("fill",e.style.fill).attr("fill-opacity",e.style.fillopacity).attr("stroke",e.style.stroke)}s.hide()}function V(t,e,s){const a=f({x:t.clientX+30,y:t.clientY-30});a.header.text((s.gene?s.gene:"No gene")+" "+(s.mname?s.mname:""));var n=[];for(let t=0;t<e.length;t++){n.push({k:e[t],v:s[e[t]]})}u(a.body,n)}function W(t,e){const s=t.pairs[e];if(s.shown){s.shown=false;s.holder.remove();if(s.handle){s.handle.attr("font-weight","normal")}}else{s.shown=true;if(s.holder){t.showholder.node().appendChild(s.holder.node())}else{s.holder=j(t.showholder,s)}if(s.handle){s.handle.attr("font-weight","bold")}}}function E(t,e){const s=[];for(const e in t.pairs){s.push([e,t.pairs[e].mlst.length])}e.selectAll("*").remove();const a=e.append("div").style("margin-bottom","5px");a.append("span").text(s.length+" individual"+(s.length>1?"s":""));const n=e.append("svg");const i=5,p=20,h=t.rowh;let d=0;for(const t of s){n.append("text").text(t[0]).attr("font-size",h).attr("font-family",r).each((function(){d=Math.max(d,this.getBBox().width)})).remove()}n.attr("width",d+i+t.peoplewidth+30).attr("height",p+i+h*s.length);s.sort(((t,e)=>e[1]-t[1]));let f=0;for(const e in t.pairs){f=Math.max(f,t.pairs[e].mlst.length)}const u=n.append("g").attr("transform","translate("+(d+i)+","+p+")").call(m().scale(l().domain([0,f]).range([0,t.peoplewidth])).tickFormat(o("d")).ticks(3));c({axis:u,showline:true,color:"black"});const y=t.peoplewidth/f;let g=p+i;for(const e of s){const s=e[0];t.pairs[s].handle=n.append("text").text(s).attr("class","sja_svgtext2").attr("font-size",h-2).attr("font-family",r).attr("x",d).attr("y",g+i+h/2).attr("text-anchor","end").on("click",(()=>{W(t,s)}));let a=0,l=0,o=0;for(const e of t.pairs[s].mlst){if(e.set_1)a++;else if(e.set_2)l++;else if(e.set_share)o++}const c=n.append("g").attr("transform","translate("+(d+i)+","+g+")");if(a>0){c.append("rect").attr("width",y*a).attr("height",h-1).attr("fill",t.color1)}if(o>0){c.append("rect").attr("x",y*a).attr("width",y*o).attr("height",h-1).attr("fill",t.colorshare)}if(l>0){c.append("rect").attr("x",y*(a+o)).attr("width",y*l).attr("height",h-1).attr("fill",t.color2)}g+=h}}export{z as d2mafparseinput,A as d2mafui};
|
|
1
|
+
import{M as t,bi as e,bj as s,o as a,E as n,bf as i,p as r,l,f as o,a as c,ay as p,aR as h,q as d,w as f,$ as u}from"./app-42d73775.js";import{d as m,c as y,b as g}from"./axis-6cb4f314.js";import{s as x,b,e as k,a as v,f as _,d as D,c as w,S as T}from"./symbol-fc7cbd41.js";import"path";import"./math-2fb199c6.js";import"./constant-426a1483.js";class N{constructor(t){this.opts=t;this.anchorType=t.anchorType;this.shareheight=t.shareheight;this.sharewidth=t.sharewidth;const e="x"in t?t.x:0;const s="y"in t?t.y:0;this.settings={visible:true,opacity:.3,x:e,y:s,xOffset:t.axiswidth+t.sp+t.sample2height,yOffset:t.shareheight,currX:t.axiswidth+t.sp+t.sample2height+e,currY:t.shareheight-s,strokeWidth:"strokeWidth"in t?t.strokeWidth:5,stroke:"stroke"in t?t.stroke:"red",xarmlen:"xarmlen"in t?t.xarmlen:25};this.addControls(this.anchorType?null:this.opts.headerdiv)}setWrapper(t){this.opts.wrapper=t}addControls(e=null){if(e){e.append("button").text("Anchors").on("click",(t=>{this.anchormenu.showunder(t.target);this.xInput.property("value",(this.settings.x/this.sharewidth).toFixed(2));this.yInput.property("value",(this.settings.y/this.sharewidth).toFixed(2))}))}this.anchormenu=new t({border:"solid 1px black"});this.anchormenu.d.style("text-align","center");this.addCoordInput();this.addColorInput();this.addOpacityInput();if(!this.anchorType)this.addSubmitBtns();else this.addDeleteBtn()}addColorInput(){const t=this.anchormenu.d.append("div");t.append("label").html("Color: ");this.strokeInput=t.append("input");this.strokeInput.attr("this.anchorType","text").property("value",this.settings.stroke).style("width","50px")}addOpacityInput(){const t=this.anchormenu.d.append("div");t.append("label").html("Opacity: ");this.opacityInput=t.append("input");this.opacityInput.attr("this.anchorType","number").attr("min",0).attr("max",1).attr("step",.01).property("value",this.settings.opacity).style("width","50px")}addSubmitBtns(){if(this.anchorType)return;const t=this.anchormenu.d.append("div");t.append("label").html("Add Anchor: ");t.append("button").html("R").on("click",(()=>{new R(this.getSettings("r"));this.anchormenu.hide()}));t.append("button").html("D").on("click",(()=>{new R(this.getSettings("d"));this.anchormenu.hide()}));t.append("button").html("X").on("click",(()=>{new R(this.getSettings("x"));this.anchormenu.hide()}));t.append("button").html("synced").on("click",(()=>{new R(this.getSettings("synced"));this.anchormenu.hide()}))}getSettings(t){return Object.assign({},this.opts,{anchorType:t,opacity:this.opacityInput.property("value"),x:this.xInput.property("value")*this.sharewidth,y:this.yInput.property("value")*this.shareheight,stroke:this.strokeInput.property("value")})}addCoordInput(){const t=this.anchormenu.d.append("div");t.append("label").html("X: ");this.xInput=t.append("input");this.xInput.attr("this.anchorType","number").attr("min",0).attr("max",1).attr("step",.01).property("value",0).style("width","80px");const e=this.anchormenu.d.append("div");e.append("label").html("Y: ");this.yInput=e.append("input");this.yInput.attr("this.anchorType","number").attr("min",0).attr("max",1).attr("step",.01).property("value",0).style("width","80px")}addDeleteBtn(){if(!this.anchorType)return;const t=this.anchormenu.d.append("div");t.append("button").html("Delete").on("click",(()=>{this.g_anchor.remove();this.anchormenu.hide()}))}}class R extends N{constructor(t){super(t);this.render();this.strokeInput.on("change",(()=>{this.settings.stroke=this.strokeInput.property("value");this.g_anchor.style("stroke",this.settings.stroke);this.anchormenu.hide()}));this.opacityInput.on("change",(()=>{this.settings.opacity=input.property("value");this.g_anchor.style("opacity",this.settings.opacity);this.anchormenu.hide()}));this.xInput.on("change",(()=>{this.settings.x=+this.xInput.property("value")*this.sharewidth;this.settings.currX=this.settings.x+this.settings.xOffset;if(this.d_anchor){this.d_anchor.transition().duration(1e3).attr("x1",this.settings.currX).attr("x2",this.settings.currX)}if(this.x_anchor){this.x_anchor.transition().duration(1e3).attr("transform","translate("+this.settings.currX+","+this.settings.currY+")")}this.anchormenu.hide()}));this.yInput.on("change",(()=>{this.settings.y=+this.yInput.property("value")*this.shareheight;this.settings.currY=-this.settings.y+this.settings.yOffset;if(this.r_anchor){this.r_anchor.transition().duration(1e3).attr("y1",this.settings.currY).attr("y2",this.settings.currY)}if(this.x_anchor){this.x_anchor.transition().duration(1e3).attr("transform","translate("+this.settings.currX+","+this.settings.currY+")")}this.anchormenu.hide()}))}render(){this.g_anchor=this.opts.wrapper.append("g").style("stroke",this.settings.stroke).style("opacity",this.settings.opacity).style("display",this.settings.visible?"":"none").style("stroke-width",this.settings.strokeWidth).on("click",this.anchorType=="synced"?null:t=>{this.anchormenu.showunder(t.target)});this.renderD();this.renderR();this.renderX()}renderD(){if(!["synced","d"].includes(this.anchorType))return;this.d_anchor=this.g_anchor.append("line");const t=this.opts;this.updateD(t.shareheight+t.sp2,t.shareheight+t.sample1height)}updateD(t,e){if(!["synced","d"].includes(this.anchorType))return;this.settings.D={y1:t,y2:e};this.d_anchor.attr("x1",this.settings.currX).attr("x2",this.settings.currX).attr("y1",t).attr("y2",e)}renderR(){if(!["synced","r"].includes(this.anchorType))return;this.r_anchor=this.g_anchor.append("line");const t=this.opts;this.updateR(t.axiswidth+t.sp,t.sample2height+t.sp)}updateR(t,e){if(!["synced","r"].includes(this.anchorType))return;this.settings.R={x1:t,x2:e};this.r_anchor.attr("x1",t).attr("x2",e).attr("y1",this.settings.currY).attr("y2",this.settings.currY)}renderX(){if(!["synced","x"].includes(this.anchorType))return;this.x_anchor=this.g_anchor.append("g").attr("transform","translate("+this.settings.currX+","+this.settings.currY+")");this.bindXDrag();this.x_anchor.append("circle").attr("cx",0).attr("cy",0).attr("r",this.settings.xarmlen).style("opacity",0);this.x_anchor.append("line").attr("x1",-this.settings.xarmlen).attr("x2",this.settings.xarmlen).attr("y1",0).attr("y2",0);this.x_anchor.append("line").attr("x1",0).attr("x2",0).attr("y1",this.settings.xarmlen).attr("y2",-this.settings.xarmlen)}bindXDrag(){if(!["synced"].includes(this.anchorType))return;this.x_anchor.on("mousedown",(t=>{const e=t.clientX;const s=t.clientY;let a=this.settings.currX,n=this.settings.currY;this.x_anchor.on("mousemove",(t=>{a=this.settings.currX-e+t.clientX;n=this.settings.currY-s+t.clientY;this.r_anchor.attr("y1",n).attr("y2",n);this.d_anchor.attr("x1",a).attr("x2",a);this.x_anchor.attr("transform","translate("+a+","+n+")")})).on("mouseup",(t=>{this.x_anchor.on("mousemove",null);a=this.settings.currX-e+t.clientX;n=this.settings.currY-s+t.clientY;if(a==this.settings.currX&&n==this.settings.currY){this.g_anchor.remove();return}this.settings.x=a<this.settings.xOffset?0:a-this.settings.xOffset;this.settings.y=n>this.settings.yOffset?0:-(n-this.settings.yOffset);this.settings.currX=this.settings.x+this.settings.xOffset;this.settings.currY=-this.settings.y+this.settings.yOffset;this.r_anchor.transition().duration(100).attr("y1",this.settings.currY).attr("y2",this.settings.currY);this.d_anchor.transition().duration(100).attr("x1",this.settings.currX).attr("x2",this.settings.currX);this.x_anchor.transition().duration(100).attr("transform","translate("+this.settings.currX+","+this.settings.currY+")")})).on("mouseleave",(()=>{this.x_anchor.on("mousemove",null)}))}))}}const I="#f9766c";const M="#609cff";const X="#01b937";const B={circle:x,cross:b,diamond:k,square:v,star:_,triangle:D,wye:w};const F={path:t=>t.symbol,circle:t=>!t.symbol};const Y={path:t=>t.symbol,ellipse:t=>!t.symbol};function A(t,a){let n,i,r,l,o,c;if(a!==undefined)[i,r,l,o,c]=e(a,t);else{[n,i,r,l,o,c]=s(100,100,t);n.header.text("2DMAF: mutant allele fraction plot between a pair of samples");n.body.style("margin","10px")}i.append("div").style("margin-top","20px").html("<ul>"+'<li><a href="https://docs.google.com/document/d/1anyEDMcW1lTSf8399Li2G9r57V-Fqp2591WvoODY7n4/edit#heading=h.mne2ecmp9m13" target=_blank>File format</a></li>'+'<li>To define samples differently than "Diagnosis/Relapse", <a href=https://plus.google.com/+XinZhou_s/posts/WqBVvmd3wYR target=_blank>see how</a>.</li>'+"</ul>");i.append("p").html("<a href=https://proteinpaint.stjude.org/ppdemo/hg19/2dmaf/2dmaf.txt target=_blank>Example file</a>");function p(t,e){o.style("color",e?"red":"black").html(t)}const h=()=>{l.selectAll("*").remove();const e=l.append("input").attr("type","file").on("change",(e=>{const s=e.target.files[0];if(!s){h();return}if(!s.size){p("Invalid file "+s.name);h();return}const a=new FileReader;a.onload=e=>{const a=r.options[r.selectedIndex].innerHTML;const n=C(e.target.result.trim().split(/\r?\n/),t[a],s.name,c);if(n){p(n,1);h();return}i.remove();l.remove();o.remove()};a.onerror=function(){p("Error reading file "+s.name,1);h();return};a.readAsText(s,"utf8")}));setTimeout((()=>e.node().focus()),1100)};h()}function z(t,e){if(!t.genome){a(e,".genome missing for 2dmaf");return}if(!t.input){a(e,".input missing for 2dmaf");return}const s=C(t.input.trim().split(/\r?\n/),t.genome,t.datasetname||"unnamed dataset",e);if(s){a(e,"2DMAF data error: "+s)}}function C(t,e,s,a){const[r,l,o]=O(t[0].trim());if(r){return r}const c={};const p={};const h={};const d={good:0,purity1set:false,purity2set:false,pairsetname:{}};const f=[];const u={};for(const t in n){u[n[t].label.toUpperCase()]=t}for(let e=1;e<t.length;e++){if(t[e]=="")continue;if(t[e][0]=="#"){if(t[e].startsWith("##samplename")){const s=t[e].trim().split(/[\s\t]+/);if(s.length==4){d.pairsetname[s[1]]={1:s[2],2:s[3]}}else{return"Line "+(e+1)+': invalid samplename line: must be "##samplename [patient] [sample1] [sample2]"'}}continue}const s=t[e].trim().split("\t");const a={};for(let t=0;t<l.length;t++){if(s[t]!=undefined&&s[t]!=""){a[l[t]]=s[t]}}if(!a.sample){return"Line "+(e+1)+": missing sample"}if(a.chr){if(a.chr.indexOf("chr")!=0){a.chr="chr"+a.chr}}if(a.chrstart){a.chrstart=Number.parseInt(a.chrstart);if(Number.isNaN(a.chrstart)){return"Line "+(e+1)+": invalid chromosome position"}}if(a.Dcnvloh){a.Dcnvlohraw=a.Dcnvloh;const t=a.Dcnvloh.toLowerCase();if(t=="yes"||t!="diploid"&&t!="haploid"){a.Dcnvloh=true}else{a.Dcnvloh=false}}if(a.Rcnvloh){a.Rcnvlohraw=a.Rcnvloh;const t=a.Rcnvloh.toLowerCase();if(t=="yes"||t!="diploid"&&t!="haploid"){a.Rcnvloh=true}else{a.Rcnvloh=false}}if(!a.call_d){f.push([e,"missing call_d",s]);continue}if(a.call_d!="somatic"&&a.call_d!="wildtype"){f.push([e,"call_d is neither somatic nor wildtype",s]);continue}if(!a.call_r){f.push([e,"missing call_r",s]);continue}if(a.call_r!="somatic"&&a.call_r!="wildtype"){f.push([e,"call_r is neither somatic nor wildtype",s]);continue}if(a.call_d=="somatic"){if(a.call_r=="somatic"){a.set_share=true}else{a.set_1=true}}else{if(a.call_r=="somatic"){a.set_2=true}}if(!a.type){f.push([e,"missing type",s]);continue}const i=a.type.toLowerCase();if(i=="snv"||i=="snp"||i=="mnv"||i=="complex"){a.issnv=true}else if(i=="indel"||i=="ins"||i=="del"){a.isindel=true}else{f.push([e,"type must be either SNV or INDEL",s]);continue}let r="MinD.D";let o=Number.parseInt(a[r]);if(Number.isNaN(o)||o<0){f.push([e,"invalid "+r+" value",s]);continue}a[r]=o;r="TinD.D";o=Number.parseInt(a[r]);if(Number.isNaN(o)||o<0){f.push([e,"invalid "+r+" value",s]);continue}a[r]=o;if(a["TinD.D"]<a["MinD.D"]){f.push([e,"TinD.D value lower than MinD.D",s]);continue}r="MinN.D";if(r in a){o=Number.parseInt(a[r]);if(Number.isNaN(o)||o<0){delete a[r]}else{a[r]=o}}r="TinN.D";if(r in a){o=Number.parseInt(a[r]);if(Number.isNaN(o)||o<0){delete a[r]}else{a[r]=o}}r="MinD.R";o=Number.parseInt(a[r]);if(Number.isNaN(o)||o<0){f.push([e,"invalid "+r+" value",s]);continue}a[r]=o;r="TinD.R";o=Number.parseInt(a[r]);if(Number.isNaN(o)||o<0){f.push([e,"invalid "+r+" value",s]);continue}a[r]=o;if(a["TinD.R"]<a["MinD.R"]){f.push([e,"TinD.R value lower than MinD.R",s]);continue}r="MinN.R";if(r in a){o=Number.parseInt(a[r]);if(Number.isNaN(o)||o<0){delete a[r]}else{a[r]=o}}r="TinN.R";if(r in a){o=Number.parseInt(a[r]);if(Number.isNaN(o)||o<0){delete a[r]}else{a[r]=o}}if(a.symbol){if(!B[a.symbol]){f.push([e,"Invalid symbol value='"+a.symbol+"'",s]);continue}}if(a.class){const t=a.class.toUpperCase();if(t in u){a.class=u[t]}else{f.push([e,"invalid mutation class "+a.class,s]);continue}}a.style={fill:a.issnv?"white":"black",fillhl:a.class?n[a.class].color:"#ccc",stroke:a.chr=="chrX"?"black":a.issnv?"black":"none",strokehl:a.class?n[a.class].color:"black",fillopacity:a.issnv?0:.2,strokeopacity:.2};if(a["TinD.D"]>0){a.maf1=a["MinD.D"]/a["TinD.D"]}if(a["TinD.R"]>0){a.maf2=a["MinD.R"]/a["TinD.R"]}p[a.sample]=1;if(a.gene){h[a.gene]=1}if(!(a.sample in c)){c[a.sample]={name:a.sample,shown:false,header:l,mlst:[]}}const m=c[a.sample];m.mlst.push(a);if(a.purity1){let t=Number.parseFloat(a.purity1);if(Number.isNaN(t)){f.push([e,"diagnosis tumor purity should be a number"]);t=0}else{if(t>1){t/=100}}if(t>0){if(m.purity1==undefined){m.purity1=t;d.purity1set=true}else if(m.purity1!=t){f.push([e,"diagnosis tumor purity value "+t+" is different from existing value "+m.purity1+" in "+a.sample,s])}}}if(a.purity2){let t=Number.parseFloat(a.purity2);if(Number.isNaN(t)){f.push([e,"relapse tumor purity should be a number"]);t=0}else{if(t>1){t/=100}}if(t>0){if(m.purity2==undefined){m.purity2=t;d.purity2set=true}else if(m.purity2!=t){f.push([e,"relapse tumor purity value "+t+" is different from existing value "+m.purity2+" in "+a.sample,s])}}}d.good++}if(f.length>0){i(l,f)}if(d.good==0){return"No valid data."}a.append("p").text("File: "+s);let m=0;for(const t in h)m++;const y=16;const g=a.append("table");const x=g.append("tr");const b=x.append("td").attr("valign","top");b.append("div").html('<div style="display:inline-block;width:'+y+"px;height:"+y+"px;background-color:"+I+'"></div> Diagnosis only '+'<div style="display:inline-block;width:'+y+"px;height:"+y+"px;background-color:"+X+'"></div> Shared '+'<div style="display:inline-block;width:'+y+"px;height:"+y+"px;background-color:"+M+'"></div> Relapse only');const k=b.append("div").style("margin-top","10px").style("height","200px").style("width","300px").style("padding","5px").style("overflow-y","scroll").style("resize","both").style("border","solid 1px #ccc");b.append("div").style("margin-top","10px").style("height","200px").style("width","300px").style("padding","5px").style("overflow-y","scroll").style("resize","both").style("border","solid 1px #ccc");const v=x.append("td").style("vertical-align","top");for(const t in c){const e=d.pairsetname[t];if(e){c[t].setname=e}else{c[t].setname={1:"Diagnosis",2:"Relapse"}}}const _={genome:e,pairs:c,color1:I,color2:M,colorshare:X,rowh:y,peoplewidth:150,genewidth:150,showholder:v,genelimit:Math.min(20,m),purity1set:d.purity1set,purity2set:d.purity2set};E(_,k)}function O(t){const e=t.toLowerCase().split("\t");const s=t.split("\t");if(s.length<=1){return["invalid file header"]}const a=(...t)=>{for(const s of t){const t=e.indexOf(s);if(t!=-1)return t}return-1};let i=a("person","sample","samplename","patient");if(i==-1)return["sample missing from header"];s[i]="sample";i=a("type");if(i==-1)return["type missing from header"];s[i]="type";i=a("mind.d1_g1","mind.d","mind");if(i==-1)return["MinD.D missing from header"];s[i]="MinD.D";i=a("tind.d1_g1","tind.d","tind");if(i==-1)return["TinD.D missing from header"];s[i]="TinD.D";i=a("mind.r1_g1","mind.r","minr");if(i==-1)return["MinD.R missing from header"];s[i]="MinD.R";i=a("tind.r1_g1","tind.r","tinr");if(i==-1)return["TinD.R missing from header"];s[i]="TinD.R";i=a("call_d1_g1","call_d");if(i==-1)return["call_d missing from header"];s[i]="call_d";i=a("call_r1_g1","call_r");if(i==-1)return["call_r missing from header"];s[i]="call_r";i=a("genename","gene");if(i==-1)return["gene missing from header"];s[i]="gene";i=a("amino_acid_change","annovar_sj_aachange","aachange","protein_change");if(i==-1)return["amino_acid_change missing from header"];s[i]="mname";i=a("class","mclass","variant_class","variant_classification","annovar_sj_class");if(i==-1)return["variant_class missing from header"];s[i]="class";i=a("chromosome","chr");if(i==-1)return["chromosome missing from header"];s[i]="chr";i=a("start","start_position","wu_hg19_pos","chr_position");if(i==-1)return["start missing from header"];s[i]="chrstart";i=a("minn.d1_g1","minn.d");if(i!=-1)s[i]="MinN.D";i=a("tinn.d1_g1","tinn.d");if(i!=-1)s[i]="TinN.D";i=a("minn.r1_g1","minn.r");if(i!=-1)s[i]="MinN.R";i=a("tinn.r1_g1","tinn.r");if(i!=-1)s[i]="TinN.R";i=a("mrna_accession","refseq_mrna_id","annovar_sj_filter_isoform","refseq");if(i!=-1)s[i]="isoform";i=a("primary_purity","purity_d");if(i!=-1)s[i]="purity1";i=a("relapse_purity","purity_r");if(i!=-1)s[i]="purity2";i=a("tag_d_cnvloh","cnvloh_d");if(i!=-1)s[i]="Dcnvloh";i=a("tag_r_cnvloh","cnvloh_r");if(i!=-1)s[i]="Rcnvloh";const r=[];for(const t of s){switch(t){case"Dcnvloh":r.push({label:"D. CNV/LOH",get:t=>t.Dcnvlohraw});break;case"Rcnvloh":r.push({label:"R. CNV/LOH",get:t=>t.Rcnvlohraw});break;case"type":r.push({label:"Type",get:t=>t.type});break;case"chr":break;case"chrstart":r.push({label:"Genome Loc.",get:t=>t.chr+":"+(t.chrstart+1)});break;case"class":r.push({label:"Class",get:t=>{if(t.class==p){return t.originalclasslabel?t.originalclasslabel:n[t.class].label}return n[t.class].label}});break;case"mname":r.push({label:"Mutation",get:t=>{let e=t.mname;if(!e)e=t.cdna_change;return e}});break;case"MinD.D":r.push({ismaf:true,width:60,height:14,readcountcredible:30,get:t=>t.maf_diagnosis,label:"D. tumor MAF",fill:"#F7483B",fillbg:"#FCBAB6"});break;case"TinD.D":break;case"MinD.R":r.push({ismaf:true,width:60,height:14,readcountcredible:30,get:t=>t.maf_relapse,label:"R. tumor MAF",fill:"#146EFF",fillbg:"#B6D5FC"});break;case"TinD.R":break;case"MinN.D":r.push({ismaf:true,width:60,height:14,readcountcredible:30,get:t=>t.maf_diagnosis_normal,label:"D. normal MAF",fill:"#F7483B",fillbg:"#FCBAB6"});break;case"TinN.D":break;case"MinN.R":r.push({ismaf:true,width:60,height:14,readcountcredible:30,get:t=>t.maf_relapse_normal,label:"R. normal MAF",fill:"#146EFF",fillbg:"#B6D5FC"});break;case"TinN.R":break;case"call_d":r.push({label:"D. call",get:t=>t.call_d});break;case"call_r":r.push({label:"R. call",get:t=>t.call_r});break;case"purity1":r.push({label:"D. purity",get:t=>t.purity1});break;case"purity2":r.push({label:"R. purity",get:t=>t.purity2});break;default:r.push({label:t,get:e=>e[t]})}}return[null,s,r]}function j(e,s){const a=new t({border:"solid 1px black"});const i=[];const o=[];const p=[];const f=s.mlst;const u=f[0].sample;const m=T();let x=0;let b={};const k={};for(const t of f){if(t["TinD.D"]>0){x=Math.max(x,t["TinD.D"])}if(t["TinD.R"]>0){x=Math.max(x,t["TinD.R"])}if(t.set_share){p.push(t)}else if(t.set_1){i.push(t)}else if(t.set_2){o.push(t)}if(!(t.class in k)){k[t.class]=0}if(t.symbol){if(!b[t.symbol]){b[t.symbol]={numlines:0,label:t.symbollabel,hidden:false}}b[t.symbol].numlines++}k[t.class]++}const v=Math.min(window.innerWidth,window.innerHeight);const _=50,D=v*.5,w=v*.5,R=w/2,I=D/2,M=_/3,X=R/5,A=Math.min(20,12*v/500),z=v/40,C=z*.7,O=3;const j=l().domain([0,x]).range([z/2,z]);const W=t=>Math.PI*Math.pow(j(t),2);for(const t of f){t.radius=Math.max(t["TinD.D"]?j(t["TinD.D"]):0,t["TinD.R"]?j(t["TinD.R"]):0)}const E=e.append("table");const H=E.append("tr");const q=H.append("td").style("vertical-align","top");const G=H.append("td").style("vertical-align","top");G.append("div").style("margin","10px").text("Name: "+u);const U=q.append("div");U.append("button").text("Hide").on("click",(()=>{s.shown=false;if(s.handle){s.handle.attr("font-weight","normal")}E.remove()}));const P=new N({axiswidth:_,sp:M,sp2:X,sample1height:R,sample2height:I,shareheight:w,sharewidth:D,headerdiv:U});U.append("button").text("Screenshot").on("click",(()=>{h(Z.node(),"2dmaf_"+s.name)}));{const t=U.append("select").on("change",(t=>{const e=t.target.options[t.target.selectedIndex].value;if(e=="all"){at.transition().attr("transform",(t=>t.posstring+" scale(1)"));ot.transition().attr("transform",(t=>t.posstring+" scale(1)"));dt.transition().attr("transform",(t=>t.posstring+" scale(1)"));return}at.transition().attr("transform",(t=>t.posstring+" scale("+(t.class==e?1:0)+")"));ot.transition().attr("transform",(t=>t.posstring+" scale("+(t.class==e?1:0)+")"));dt.transition().attr("transform",(t=>t.posstring+" scale("+(t.class==e?1:0)+")"))}));t.append("option").text("Show all mutation classes").property("value","all");const e=[];for(const t in k){e.push([t,k[t]])}e.sort(((t,e)=>e[1]-t[1]));for(const s of e){t.append("option").text((s[0]in n?n[s[0]].label:s[0])+" ("+s[1]+")").property("value",s[0])}}const Z=q.append("svg").attr("width",_+M+I+D+M*2).attr("height",_+M+R+w+M*2);const $=Z.append("g").attr("transform","translate("+M+","+M+")");P.setWrapper($.append("g"));const J=l().domain([0,1]).range([0,D]);const K=$.append("g").attr("transform","translate("+(_+M+I)+","+(w+R+M)+")").call(y().scale(J).tickSize(5));c({axis:K,showline:true,fontsize:A*.8});const Q=i.length+p.length;K.append("text").text(s.setname[1]+", n="+Q+(s.purity1?", purity="+s.purity1:"")).attr("x",D/2).attr("y",_-4).attr("text-anchor","middle").attr("font-size",A);const tt=l().domain([0,1]).range([w,0]);const et=$.append("g").attr("transform","translate("+_+",0)").call(g().scale(tt).tickSize(5));c({axis:et,showline:true,fontsize:A*.8});const st=o.length+p.length;et.append("text").text(s.setname[2]+", n="+st+(s.purity2?", purity="+s.purity2:"")).attr("transform","translate("+(A-_-10)+","+w/2+") rotate(-90)").attr("text-anchor","middle").attr("font-size",A);$.append("path").attr("d","M"+(_+M)+",0"+"h"+(I+D)+"v"+(w+R)+"h-"+D+"v-"+(R+w)+"M"+(_+M)+",0"+"v"+w+"h"+(I+D)+"M"+(_+M+I)+","+w+"l"+D+",-"+w).attr("fill","none").attr("stroke","black").attr("shape-rendering","crispEdges").attr("stroke-dasharray","5,5");const at=$.append("g").attr("transform","translate("+(_+M+I)+",0)").selectAll().data(p).enter().append("g").attr("transform",(t=>{t.posstring="translate("+J(t.maf1)+","+tt(t.maf2)+")";return t.posstring}));at.filter((t=>t.Dcnvloh)).append("circle").attr("cy",(t=>t.issnv?j(t["TinD.R"]):C/2)).attr("fill","#858585").attr("r",O);at.filter((t=>t.Rcnvloh)).append("circle").attr("cx",(t=>t.issnv?-j(t["TinD.D"]):-C/2)).attr("fill","#858585").attr("r",O);let nt=at;for(const t in Y){nt.filter(Y[t]).append(t).attr("rx",(t=>t.symbol?null:j(t["TinD.D"]))).attr("ry",(t=>t.symbol?null:j(t["TinD.R"]))).attr("d",(t=>!t.symbol?null:m.type(B[t.symbol]).size(W(t["TinD.D"])+W(t["TinD.R"])/2)())).attr("fill",(t=>t.style.fill)).attr("fill-opacity",(t=>t.style.fillopacity)).attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("stroke-dasharray",(t=>t.chr=="chrX"?"5,5":"none")).on("mouseover",((t,e)=>S(t,e,a))).on("mouseout",((t,e)=>L(t,e,a))).on("click",((t,e)=>V(t,s.header,e)))}nt.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",-3).attr("x2",3).attr("y2",3);nt.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",3).attr("x2",3).attr("y2",-3);const it=l().domain([0,x]).range([R-X,0]);const rt=$.append("g").attr("transform","translate("+(_+M+I)+","+(w+X)+")");const lt="#FFBEAD";rt.append("rect").attr("fill",lt).attr("fill-opacity",0).attr("x",0).attr("width",3).attr("height",R-X);c({axis:rt.call(g().scale(it).tickValues([0,x])),showline:true,fontsize:A*.8});rt.append("g").attr("transform","translate(-"+A/2+","+(R-X)/2+")").append("text").text("D total").attr("font-size",A*.8).attr("font-family",r).attr("fill","black").attr("text-anchor","middle").attr("dominant-baseline","middle").attr("transform","rotate(-90)");const ot=rt.selectAll().data(i).enter().append("g").attr("transform",(t=>{t.posstring="translate("+J(t.maf1)+","+it(t["TinD.D"])+")";return t.posstring}));ot.filter((t=>t.Dcnvloh)).append("circle").attr("cy",(t=>t.issnv?j(t["TinD.R"]):C/2)).attr("fill","#858585").attr("r",O);ot.filter((t=>t.Rcnvloh)).append("circle").attr("cx",(t=>t.issnv?-j(t["TinD.D"]):-C/2)).attr("fill","#858585").attr("r",O);nt=ot;for(const t in F){nt.filter(F[t]).append(t).attr("class",(t=>t.symbol?"twodmaf-"+t.symbol:null)).attr("r",(t=>t.symbol?null:j(t["TinD.R"]))).attr("d",(t=>!t.symbol?null:m.type(B[t.symbol]).size(W(t["TinD.R"]))())).attr("fill",(t=>t.style.fill)).attr("fill-opacity",(t=>t.style.fillopacity)).attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("stroke-dasharray",(t=>t.chr=="chrX"?"5,5":"none")).on("mouseover",((t,e)=>S(t,e,a))).on("mouseout",((t,e)=>L(t,e,a))).on("click",((t,e)=>V(t,s.header,e)))}nt.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",-3).attr("x2",3).attr("y2",3);nt.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",3).attr("x2",3).attr("y2",-3);const ct=l().domain([0,x]).range([0,I-X]);const pt=$.append("g").attr("transform","translate("+(_+M)+",0)");pt.append("rect").attr("fill",lt).attr("fill-opacity",0).attr("y",w).attr("width",I-X).attr("height",3);const ht=pt.append("g").attr("transform","translate(0,"+w+")").call(y().scale(ct).tickValues([0,x]));c({axis:ht,showline:true,fontsize:A*.8});pt.append("text").text("R total").attr("font-size",A*.8).attr("font-family",r).attr("fill","black").attr("x",(I-X)/2).attr("y",w+A).attr("text-anchor","middle");const dt=pt.selectAll().data(o).enter().append("g").attr("transform",(t=>{t.posstring="translate("+ct(t["TinD.R"])+","+tt(t.maf2)+")";return t.posstring}));dt.filter((t=>t.Dcnvloh)).append("circle").attr("cy",(t=>t.issnv?j(t["TinD.R"]):C/2)).attr("fill","#858585").attr("r",O);dt.filter((t=>t.Rcnvloh)).append("circle").attr("cx",(t=>t.issnv?-j(t["TinD.D"]):-C/2)).attr("fill","#858585").attr("r",O);nt=dt;for(const t in F){nt.filter(F[t]).append(t).attr("class",(t=>t.symbol?"twodmaf-"+t.symbol:null)).attr("r",(t=>t.symbol?null:j(t["TinD.D"]))).attr("d",(t=>!t.symbol?null:m.type(B[t.symbol]).size(W(t["TinD.R"]))())).attr("fill",(t=>t.style.fill)).attr("fill-opacity",(t=>t.style.fillopacity)).attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("stroke-dasharray",(t=>t.chr=="chrX"?"5,5":"none")).on("mouseover",((t,e)=>S(t,e,a))).on("mouseout",((t,e)=>L(t,e,a))).on("click",((t,e)=>V(t,s.header,e)))}nt.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",-3).attr("x2",3).attr("y2",3);nt.append("line").attr("stroke",(t=>t.style.stroke)).attr("stroke-opacity",(t=>t.style.strokeopacity)).attr("x1",-3).attr("y1",3).attr("x2",3).attr("y2",-3);const ft=$.append("g").attr("transform","translate(0,"+(w+X)+")");let ut=A;ft.append("text").text(u).attr("font-size",A).attr("y",ut);const mt=j(20),yt=j(x);ut+=A+yt;let gt;ft.append("text").text("SNV coverage").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));gt+=mt+10;ft.append("circle").attr("cx",gt).attr("cy",ut).attr("r",mt).attr("stroke","black").attr("fill","none");ft.append("text").text(20).attr("x",gt).attr("y",ut).attr("text-anchor","middle").attr("dominant-baseline","middle");gt+=mt+yt+10;ft.append("circle").attr("cx",gt).attr("cy",ut).attr("r",yt).attr("stroke","black").attr("fill","none");ft.append("text").text(x).attr("x",gt).attr("y",ut).attr("text-anchor","middle").attr("dominant-baseline","middle");ut+=yt+10;ft.append("text").text("Indel").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));ft.append("circle").attr("cx",gt+10+C/2).attr("cy",ut).attr("r",C/2).attr("fill","black").attr("fill-opacity",.3);ut+=30;ft.append("text").text("chrX").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));gt+=mt+10;ft.append("circle").attr("cx",gt).attr("cy",ut).attr("r",10).attr("stroke","black").attr("stroke-dasharray","5,5").attr("fill","none");ut+=30;ft.append("text").text("D. CNV/LOH").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));gt+=mt+10;ft.append("circle").attr("cx",gt).attr("cy",ut).attr("r",10).attr("stroke","black").attr("fill","none");ft.append("circle").attr("cx",gt).attr("cy",ut+10).attr("r",O).attr("fill","black");ut+=30;ft.append("text").text("R. CNV/LOH").attr("y",ut).attr("dominant-baseline","central").each((function(){gt=this.getBBox().width}));gt+=mt+10;ft.append("circle").attr("cx",gt).attr("cy",ut).attr("r",10).attr("stroke","black").attr("fill","none");ft.append("circle").attr("cx",gt-10).attr("cy",ut).attr("r",O).attr("fill","black");ut+=30;if(s.purity1!=undefined||s.purity2!=undefined){ft.append("text").text("Expected MAF").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));gt+=10;ft.append("rect").attr("fill",lt).attr("x",gt).attr("y",ut).attr("width",40).attr("height",3);ut+=30}const xt=Object.keys(b);if(xt.length){ft.append("text").text("Symbols").attr("y",ut).attr("dominant-baseline","middle").each((function(){gt=this.getBBox().width}));let t;for(const e in b){const s=b[e];const a=ft.append("g").on("click",(()=>{s.hidden=!s.hidden;Z.selectAll(".twodmaf-"+e).style("display",s.hidden?"none":"");n.style("text-decoration",s.hidden?"line-through":"")}));t=gt+20;a.append("path").attr("transform","translate("+t+","+ut+")").attr("d",m.type(B[e]).size(100)()).attr("stroke","black").attr("fill","none").each((function(){t+=this.getBBox().width}));const n=a.append("text").text(s.label?s.label+" ("+s.numlines+")":"").attr("y",ut+2).attr("x",t).attr("dominant-baseline","middle").style("text-decoration",s.hidden?"line-through":"");ut+=30}ut+=30}const bt={},kt={},vt={},_t={};for(const t of f){if(!t.gene)continue;if(!(t.gene in bt)){bt[t.gene]=[]}bt[t.gene].push(t);if(t.set_1){kt[t.gene]=1}else if(t.set_2){vt[t.gene]=1}else if(t.set_share){_t[t.gene]=1}}const Dt=[];for(const t in kt){Dt.push(t)}for(const t in vt){if(!(t in kt)){Dt.push(t)}}for(const t in _t){if(!(t in kt)&&!(t in vt)){Dt.push(t)}}const wt=G.append("div").style("height",w+R+"px").style("margin","10px").style("padding","10px").style("border","solid 1px #ccc").style("overflow-y","scroll").style("resize","both").append("table");{const t=wt.append("tr");t.append("td").text("Gene");t.append("td").text(s.setname[1]+" only");t.append("td").text(s.setname[2]+" only");t.append("td").text("Shared")}let Tt=true;for(const t of Dt){const e=wt.append("tr");if(Tt){e.style("background-color","#f3f3f3")}Tt=!Tt;e.append("td").text(t);let s=[];if(t in bt){s=bt[t]}const a=[],n=[],i=[];for(const t of s){if(t.set_share)i.push(t);else if(t.set_1)a.push(t);else if(t.set_2)n.push(t)}let r=e.append("td");if(a.length){for(const t of a){const e=r.append("div").attr("class","sja_clbtext").style("color",t.style.fillhl).text(t.mname||"").on("click",(e=>{Nt(e.target,t,ot)}));if(t.labelIsVisible){Nt(e.node(),t,ot)}}}r=e.append("td");if(n.length){for(const t of n){const e=r.append("div").attr("class","sja_clbtext").style("color",t.style.fillhl).text(t.mname||"").on("click",(e=>{Nt(e.target,t,dt)}));if(t.labelIsVisible){Nt(e.node(),t,ot)}}}r=e.append("td");if(i.length){for(const t of i){const e=r.append("div").attr("class","sja_clbtext").style("color",t.style.fillhl).text(t.mname||"").on("click",(e=>{Nt(e.target,t,at)}));if(t.labelIsVisible){Nt(e.node(),t,ot)}}}}function Nt(t,e,s){if(e.selected){t.style.border="";e.selected=false}else{t.style.border="solid 1px black";e.selected=true}const a=s.filter((t=>t.gene==e.gene&&t.class==e.class&&t.mname==e.mname));a.selectAll("rect").attr("fill-opacity",e.selected?.5:e.style.fillopacity).attr("fill",e.selected?e.style.fillhl:e.style.fill);a.selectAll("circle,ellipse,line").attr("stroke-opacity",e.selected?1:e.style.strokeopacity).attr("stroke",e.selected?e.style.strokehl:e.style.stroke).attr("stroke-width",e.selected?2:1);if(e.selected){let t=Math.max(20,e.radius),s=0;if((e.set_1||e.set_share)&&e.maf1>=.8){t=-e.radius;s=e.radius*2}const n=a.append("g").attr("class","sja_2dmaf_mlabel").attr("transform","translate("+t+","+s+")");let i;n.append("text").text(e.labelAs?e.labelAs:e.gene+" "+e.mname).attr("fill",e.style.fillhl).attr("dominant-baseline","middle").attr("text-anchor","start").attr("font-size",e.radius).each((function(){i=this.getBBox().width}));n.append("rect").attr("y",-e.radius/2).attr("width",i).attr("height",e.radius).attr("fill","black").attr("fill-opacity",0).on("mouseover",(t=>d(t.target).attr("fill-opacity",.2))).on("mouseout",(t=>d(t.target).attr("fill-opacity",0))).on("mousedown",(e=>{const a=t,i=s,r=e.clientX,l=e.clientY,o=d(document.body);o.on("mousemove",(e=>{e.preventDefault();t=a+e.clientX-r;s=i+e.clientY-l;n.attr("transform","translate("+t+","+s+")")}));o.on("mouseup",(()=>{o.on("mousemove",null).on("mouseup",null)}))}))}else{a.select(".sja_2dmaf_mlabel").remove()}}return E}function S(t,e,s){if(!e.selected){d(t.target).attr("fill",e.style.fillhl).attr("fill-opacity",.2)}s.clear();s.show(t.clientX,t.clientY);s.d.append("div").html((e.gene||"no gene")+' <span style="color:'+e.style.fillhl+'">'+(e.mname||"")+"</span>"+(e.class?' <span style="font-size:70%">'+n[e.class].label+"</span>":""))}function L(t,e,s){if(!e.selected){d(t.ele).attr("fill",e.style.fill).attr("fill-opacity",e.style.fillopacity).attr("stroke",e.style.stroke)}s.hide()}function V(t,e,s){const a=f({x:t.clientX+30,y:t.clientY-30});a.header.text((s.gene?s.gene:"No gene")+" "+(s.mname?s.mname:""));var n=[];for(let t=0;t<e.length;t++){n.push({k:e[t],v:s[e[t]]})}u(a.body,n)}function W(t,e){const s=t.pairs[e];if(s.shown){s.shown=false;s.holder.remove();if(s.handle){s.handle.attr("font-weight","normal")}}else{s.shown=true;if(s.holder){t.showholder.node().appendChild(s.holder.node())}else{s.holder=j(t.showholder,s)}if(s.handle){s.handle.attr("font-weight","bold")}}}function E(t,e){const s=[];for(const e in t.pairs){s.push([e,t.pairs[e].mlst.length])}e.selectAll("*").remove();const a=e.append("div").style("margin-bottom","5px");a.append("span").text(s.length+" individual"+(s.length>1?"s":""));const n=e.append("svg");const i=5,p=20,h=t.rowh;let d=0;for(const t of s){n.append("text").text(t[0]).attr("font-size",h).attr("font-family",r).each((function(){d=Math.max(d,this.getBBox().width)})).remove()}n.attr("width",d+i+t.peoplewidth+30).attr("height",p+i+h*s.length);s.sort(((t,e)=>e[1]-t[1]));let f=0;for(const e in t.pairs){f=Math.max(f,t.pairs[e].mlst.length)}const u=n.append("g").attr("transform","translate("+(d+i)+","+p+")").call(m().scale(l().domain([0,f]).range([0,t.peoplewidth])).tickFormat(o("d")).ticks(3));c({axis:u,showline:true,color:"black"});const y=t.peoplewidth/f;let g=p+i;for(const e of s){const s=e[0];t.pairs[s].handle=n.append("text").text(s).attr("class","sja_svgtext2").attr("font-size",h-2).attr("font-family",r).attr("x",d).attr("y",g+i+h/2).attr("text-anchor","end").on("click",(()=>{W(t,s)}));let a=0,l=0,o=0;for(const e of t.pairs[s].mlst){if(e.set_1)a++;else if(e.set_2)l++;else if(e.set_share)o++}const c=n.append("g").attr("transform","translate("+(d+i)+","+g+")");if(a>0){c.append("rect").attr("width",y*a).attr("height",h-1).attr("fill",t.color1)}if(o>0){c.append("rect").attr("x",y*a).attr("width",y*o).attr("height",h-1).attr("fill",t.colorshare)}if(l>0){c.append("rect").attr("x",y*(a+o)).attr("width",y*l).attr("height",h-1).attr("fill",t.color2)}g+=h}}export{z as d2mafparseinput,A as d2mafui};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{M as t,aO as a,az as e,l,a as s,$ as o,q as n}from"./app-42d73775.js";import{d as i,r}from"./table-fe7980cf.js";import{controlsInit as c}from"./controls-78d417dd.js";import{b as d,c as p}from"./axis-6cb4f314.js";import"path";import"./controls.btns-17384076.js";import"./controls.config-29830317.js";import"./controls.overlay-32808574.js";import"./termsetting-b86fec90.js";import"./filter-d70ef7ac.js";import"./controls.term1-b41715fa.js";import"./controls.divide-4fd6f2c7.js";const u="#ffa200";const g=new t;class h{constructor(){this.type="DEanalysis"}async init(t){t.plots.find((t=>t.id===this.id));const a=this.opts.holder.append("div").style("display","inline-block");const e=this.opts.holder.append("div").style("display","inline-block");this.dom={holder:e,header:this.opts.header,controlsDiv:a};const l=[{label:"P-value significance (linear scale)",type:"number",chartType:"DEanalysis",settingsKey:"pvalue",title:"P-value significance",min:0,max:1},{label:"Fold change (log scale)",type:"number",chartType:"DEanalysis",settingsKey:"foldchange",title:"Fold change",min:-10,max:10},{label:"P-value table",type:"checkbox",chartType:"DEanalysis",settingsKey:"pvaluetable",title:"Display table showing original and adjusted pvalues for all significant genes",boxLabel:""},{label:"P-value",type:"radio",chartType:"DEanalysis",settingsKey:"adjusted_original_pvalue",title:"Toggle between original and adjusted pvalues for volcano plot",options:[{label:"adjusted",value:"adjusted"},{label:"original",value:"original"}]}];this.components={controls:await c({app:this.app,id:this.id,holder:this.dom.controlsDiv,inputs:l})};this.components.controls.on("downloadClick.DEanalysis",(()=>{i(this.table_rows,this.table_cols)}))}getState(t){const a=t.plots.find((t=>t.id===this.id));if(!a)throw`No plot with id='${this.id}' found`;return{config:a}}async main(){this.config=JSON.parse(JSON.stringify(this.state.config));this.settings=this.config.settings.DEanalysis;const t=await this.app.vocabApi.runDEanalysis(this.state.config);this.dom.header.style("opacity",.6).style("padding-left","10px").style("font-size","0.75em").text("DIFFERENTIAL EXPRESSION");f(this.dom.holder,t.data,this,t.sample_size1,t.sample_size2)}}function f(t,a,e,o,n){t.selectAll("*").remove();let i=0,c=0,g=0,h=0;for(const t of a){i=Math.min(i,t.fold_change);c=Math.max(c,t.fold_change);if(t.adjusted_p_value==0){continue}else{g=Math.min(g,t.adjusted_p_value);h=Math.max(h,t.adjusted_p_value)}}let f,v,m,_,b,w,x=50,k=50,M;const E=t.append("svg");const D=E.append("g");const P=E.append("g");const z=E.append("text").text("log2(fold change)").attr("fill","black").attr("text-anchor","middle");const S=E.append("text").text("-log10(adjusted P value)").attr("fill","black").attr("text-anchor","middle");a.vo_dotarea=E.append("g");const N=a.vo_dotarea.append("rect").attr("stroke","#ededed").attr("fill","none").attr("shape-rendering","crispEdges");const T=l().domain([i,c]);const F=l().domain([g,h]);const O=a.vo_dotarea.selectAll().data(a).enter().append("g").each((function(t){t.vo_g=this}));const A=e.settings.foldchange;if(e.settings.pvalue==0)throw"p-value significance cannot be zero";const K=-Math.log10(e.settings.pvalue);const I=e.settings.adjusted_original_pvalue;let L=0;let $=0;e.table_rows=[];const C=O.append("circle").attr("stroke",(t=>{let a;if(I=="adjusted"&&t.adjusted_p_value>K&&Math.abs(t.fold_change)>A){a="red";L+=1;e.table_rows.push([{value:t.gene_name},{value:t.gene_symbol},{value:t.fold_change},{value:Math.pow(10,-t.original_p_value)},{value:Math.pow(10,-t.adjusted_p_value)}])}else if(I=="original"&&t.original_p_value>K&&Math.abs(t.fold_change)>A){a="red";L+=1;e.table_rows.push([{value:t.gene_name},{value:t.gene_symbol},{value:t.fold_change},{value:Math.pow(10,-t.original_p_value)},{value:Math.pow(10,-t.adjusted_p_value)}])}else{a="black";$+=1}return a})).attr("stroke-opacity",.2).attr("stroke-width",1).attr("fill",u).attr("fill-opacity",0).each((function(t){t.vo_circle=this})).on("mouseover",y).on("mouseout",j);e.table_rows.sort(((t,a)=>t[2].value-a[2].value)).reverse();const G=a.vo_dotarea.append("line").attr("stroke","#ccc").attr("shape-rendering","crispEdges");function J(t,e){m=t;_=e;f=Math.max(50,m/8);v=Math.max(50,_/8);M=Math.max(m,_)/80;const l=M*3;C.each((t=>{t.vo_radius=M}));b=Math.max(l,m/50);w=Math.max(l,_/50);D.attr("transform","translate("+f+","+x+")");P.attr("transform","translate("+(f+b)+","+(x+_+w)+")");z.attr("x",f+b+m/2).attr("y",x+_+w+v-5);S.attr("transform","translate(15,"+(x+_/2)+") rotate(-90)");a.vo_dotarea.attr("transform","translate("+(f+b)+","+x+")");N.attr("width",m).attr("height",_);T.range([0,m]);F.range([_,0]);O.attr("transform",(t=>"translate("+T(t.fold_change)+","+F(t.adjusted_p_value)+")"));C.attr("r",(t=>t.vo_radius));G.attr("x1",T(0)).attr("x2",T(0)).attr("y2",_);E.attr("width",f+b+m+k).attr("height",x+_+w+v);s({axis:D.call(d().scale(F)),color:"black",showline:true});s({axis:P.call(p().scale(T)),color:"black",showline:true})}J(400,400);if(a[0].adjusted_p_value!=undefined){t.append("div").style("margin","20px");g=0;h=0;let l;for(const t of a){let a;if(I=="adjusted"){a=t.adjusted_p_value}else{a=t.original_p_value}if(a==0)continue;g=Math.min(g,a);h=Math.max(h,a)}F.domain([g,h]);s({axis:D.call(d().scale(F)),color:"black",showline:true});O.attr("transform",(t=>{let a;if(I=="adjusted"){a=t.adjusted_p_value}else{a=t.original_p_value}return"translate("+T(t.fold_change)+","+F(a)+")"}));if(I=="adjusted"){l="-log10(adjusted P value)"}else{l="-log10(original P value)"}S.text(l);t.append("div").html("Percentage of significant genes:"+(L*100/(L+$)).toFixed(2)+"<br>Number of significant genes:"+L+"<br>Sample size of group1:"+o+"<br>Sample size of group2:"+n);e.table_cols=[{label:"Gene Name"},{label:"Gene Symbol"},{label:"log2 Fold change"},{label:"Original p-value (linear scale)"},{label:"Adjusted p-value (linear scale)"}];if(e.settings.pvaluetable==true){const a=t.append("div").html(`<br>DE analysis results`);r({columns:e.table_cols,rows:e.table_rows,div:a,showLines:true,maxHeight:"150vh",resize:true})}}return E}async function v(t,e){try{if(t.samplelst.groups.length!=2)throw"opts.samplelst.groups[].length!=2";if(t.samplelst.groups[0].values?.length<1)throw"group 1 not having >1 samples";if(t.samplelst.groups[1].values?.length<1)throw"group 2 not having >1 samples";const e={settings:{DEanalysis:{pvalue:.05,foldchange:2,pvaluetable:false,adjusted_original_pvalue:"adjusted"},controls:{isOpen:false}}};return a(e,t)}catch(t){throw`${t} [DEanalysis getPlotConfig()]`}}const m=e(h);const _=m;function b(t,a){a.prepPlot({config:{chartType:"DEanalysis"}})}function y(t,a){g.clear().show(t.clientX,t.clientY);const e=[{k:"gene_name",v:a.gene_name},{k:"gene_symbol",v:a.gene_symbol},{k:"log fold change",v:a.fold_change},{k:"log original p-value",v:a.original_p_value},{k:"log adjusted p-value",v:a.adjusted_p_value}];o(g.d,e);if(!a.ma_label){n(a.ma_circle).attr("fill-opacity",.9);n(a.vo_circle).attr("fill-opacity",.9)}}function j(t,a){g.hide();if(!a.ma_label){n(a.ma_circle).attr("fill-opacity",0);n(a.vo_circle).attr("fill-opacity",0)}}export{m as DEanalysisInit,_ as componentInit,v as getPlotConfig,b as makeChartBtnMenu};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{M as t,aP as e,L as s,J as n,K as i,af as o,b8 as r,E as a,q as l,aO as c,az as h}from"./app-3f91f0f7.js";import"./transform-f2cc07e6.js";import{d as u}from"./arc-3d6751aa.js";import{c as d,p}from"./constant-426a1483.js";import{s as g}from"./svg.legend-9c9964d8.js";import{a as m,l as f}from"./line-264f8f9e.js";import{t as v}from"./math-2fb199c6.js";import"path";function A(t,e){return e<t?-1:e>t?1:e>=t?0:NaN}function x(t){return t}function R(){var t=x,e=A,s=null,n=d(0),i=d(v),o=d(0);function r(r){var a,l=(r=m(r)).length,c,h,u=0,d=new Array(l),p=new Array(l),g=+n.apply(this,arguments),f=Math.min(v,Math.max(-v,i.apply(this,arguments)-g)),A,x=Math.min(Math.abs(f)/l,o.apply(this,arguments)),R=x*(f<0?-1:1),b;for(a=0;a<l;++a){if((b=p[d[a]=a]=+t(r[a],a,r))>0){u+=b}}if(e!=null)d.sort((function(t,s){return e(p[t],p[s])}));else if(s!=null)d.sort((function(t,e){return s(r[t],r[e])}));for(a=0,h=u?(f-l*R)/u:0;a<l;++a,g=A){c=d[a],b=p[c],A=g+(b>0?b*h:0)+R,p[c]={data:r[c],index:a,value:b,startAngle:g,endAngle:A,padAngle:x}}return p}r.value=function(e){return arguments.length?(t=typeof e==="function"?e:d(+e),r):t};r.sortValues=function(t){return arguments.length?(e=t,s=null,r):e};r.sort=function(t){return arguments.length?(s=t,e=null,r):s};r.startAngle=function(t){return arguments.length?(n=typeof t==="function"?t:d(+t),r):n};r.endAngle=function(t){return arguments.length?(i=typeof t==="function"?t:d(+t),r):i};r.padAngle=function(t){return arguments.length?(o=typeof t==="function"?t:d(+t),r):o};return r}var b=Math.abs;var M=Math.cos;var C=Math.sin;var y=Math.PI;var L=y/2;var I=1e-12;var w=Array.prototype.slice;function E(t){return function(){return t}}function D(t){return t.source}function O(t){return t.target}function S(t){return t.radius}function T(t){return t.startAngle}function N(t){return t.endAngle}function z(){return 0}function V(t){var e=D,s=O,n=S,i=S,o=T,r=N,a=z,l=null;function c(){var c,h=e.apply(this,arguments),u=s.apply(this,arguments),d=a.apply(this,arguments)/2,g=w.call(arguments),m=+n.apply(this,(g[0]=h,g)),f=o.apply(this,g)-L,v=r.apply(this,g)-L,A=+i.apply(this,(g[0]=u,g)),x=o.apply(this,g)-L,R=r.apply(this,g)-L;if(!l)l=c=p();if(d>I){if(b(v-f)>d*2+I)v>f?(f+=d,v-=d):(f-=d,v+=d);else f=v=(f+v)/2;if(b(R-x)>d*2+I)R>x?(x+=d,R-=d):(x-=d,R+=d);else x=R=(x+R)/2}l.moveTo(m*M(f),m*C(f));l.arc(0,0,m,f,v);if(f!==x||v!==R){if(t){var y=+t.apply(this,arguments),E=A-y,D=(x+R)/2;l.quadraticCurveTo(0,0,E*M(x),E*C(x));l.lineTo(A*M(D),A*C(D));l.lineTo(E*M(R),E*C(R))}else{l.quadraticCurveTo(0,0,A*M(x),A*C(x));l.arc(0,0,A,x,R)}}l.quadraticCurveTo(0,0,m*M(f),m*C(f));l.closePath();if(c)return l=null,c+""||null}if(t)c.headRadius=function(e){return arguments.length?(t=typeof e==="function"?e:E(+e),c):t};c.radius=function(t){return arguments.length?(n=i=typeof t==="function"?t:E(+t),c):n};c.sourceRadius=function(t){return arguments.length?(n=typeof t==="function"?t:E(+t),c):n};c.targetRadius=function(t){return arguments.length?(i=typeof t==="function"?t:E(+t),c):i};c.startAngle=function(t){return arguments.length?(o=typeof t==="function"?t:E(+t),c):o};c.endAngle=function(t){return arguments.length?(r=typeof t==="function"?t:E(+t),c):r};c.padAngle=function(t){return arguments.length?(a=typeof t==="function"?t:E(+t),c):a};c.source=function(t){return arguments.length?(e=t,c):e};c.target=function(t){return arguments.length?(s=t,c):s};c.context=function(t){return arguments.length?(l=t==null?null:t,c):l};return c}function k(){return V()}class B{constructor(t,e,s){this.radius=t;this.width=e;this.color=s}render(t){const e=u();const s={startAngle:0,endAngle:Math.PI*2,innerRadius:this.radius,outerRadius:this.radius+this.width,color:this.color,text:"No label"};const n=[];n.push(s);const i=t.append("g");i.selectAll("path").data(n).enter().append("path").attr("d",(t=>e(t))).attr("fill",(t=>t.color))}}class P{static create(){const e=new t({padding:5});e.d.style("border","1px solid #FFF").style("position","absolute").style("z-index",1001);return e}}var $;(function(t){t["Intrachromosomal"]="#1B9E77";t["Interchromosomal"]="#6A3D9A"})($||($={}));class G{static getColor(t,e){if(t!=e){return $.Interchromosomal.valueOf()}else{return $.Intrachromosomal.valueOf()}}}class W{render(t,e){let s=0;if(e.length>0){s=e[0].target.radius;const n=new B(s,2,"#6464641A");n.render(t)}const n=k().radius(s);const i=t.selectAll(".chord").data(e);const o=P.create();i.enter().append("path").attr("class","chord").attr("d",n).attr("fill",(t=>G.getColor(t.source.positionInChromosome.chromosome,t.target.positionInChromosome.chromosome))).on("mouseover",((t,e)=>{o.d.style("padding","2px").html(this.getTooltip(e));o.show(t.x,t.y)})).on("mouseout",(()=>{o.hide()}))}getTooltip(t){let e="";if(t.source.gene){e+=t.source.gene}const s=t.source.positionInChromosome;e+=` ${s.chromosome}:${s.position}<br />`;if(t.target.gene){e+=t.target.gene}const n=t.target.positionInChromosome;e+=` ${n.chromosome}:${n.position}`;return e}}class F{constructor(t){this.downloadClickListener=t}render(t,e){t.append("span").append("button").style("margin","2px 0 2px 30px").text("Download image").on("click",(()=>{const t=e.select("svg").node();this.downloadClickListener(t)}))}}class H{constructor(t){this.checkBoxClickListener=t}render(t,e,s,n,i,o){if(s){const s=t.append("span").append("input").attr("type","checkbox").attr("id","genes-checkbox").property("checked",e);t.append("label").attr("for","genes-checkbox").text(`Only show mutations for ${o} genes (${n} out of ${i} total)`);s.on("change",(()=>{this.checkBoxClickListener(s.property("checked"))}))}}}class j{constructor(t,e,s,n){this.renders=t;this.legendRenderer=e;this.fusionRenderer=new W;this.downloadButtonRenderer=new F(s);this.prioritizeGenesCheckboxRenderer=new H(n)}render(t,e){const s=t.append("div");s.append("div");const n=s.append("div").style("display","inline-block").style("font-family","Arial");const i=n.append("div");this.downloadButtonRenderer.render(i,n);this.prioritizeGenesCheckboxRenderer.render(i,e.settings.label.prioritizeGeneLabelsByGeneSets,e.settings.label.showPrioritizeGeneLabelsByGeneSets,e.settings.label.prioritizeGeneLabelsByGeneSets&&e.settings.label.showPrioritizeGeneLabelsByGeneSets?e.filteredSnvDataLength:e.snvDataLength,e.snvDataLength,e.genesetName);const o=n.append("svg").attr("width",e.width).attr("height",e.height+e.legendHeight);const r=o.append("g").attr("class","mainG").attr("transform",`translate(${e.settings.rings.labelLinesInnerRadius+e.settings.rings.labelsToLinesDistance+100},${e.height/2})`);for(const[t,s]of this.renders){const n=e.getElements(t);const i=e.getCollisions(t);s.render(r,n,i)}this.fusionRenderer.render(r,e.fusions);this.legendRenderer.render(r,e.legend,-1*(e.settings.rings.labelLinesInnerRadius+e.settings.rings.labelsToLinesDistance+50),e.width,e.height/2)}}class U{constructor(t){this.downloadImgName=t.state.settings.downloadImgName||"disco.plot";this.cappingClickCallback=(e,s)=>{const n=t.app.tip;n.clear();const i=t.app.tip.d;const o=i.append("span").html("Capping:").append("input").attr("type","number").on("change",(()=>{t.app.dispatch({type:"plot_edit",id:t.opts.id,config:{settings:{cnv:{capping:Number(o.property("value"))}}}});n.hide()}));const r=s.node().getBoundingClientRect();const a=r.left-20;const l=r.top-40;n.show(a,l)};this.downloadClickListener=t=>{const e=document.createElement("a");document.body.appendChild(e);e.addEventListener("click",(()=>{const s=new XMLSerializer;const n=new Blob([s.serializeToString(t)],{type:"image/svg+xml"});e.download=this.downloadImgName+".svg";e.href=URL.createObjectURL(n);document.body.removeChild(e)}),false);e.click()};this.geneClickListener=(s,n)=>e(this,void 0,void 0,(function*(){const e={holder:t.app.opts.holder,genome:t.app.opts.state.args.genome,nobox:true,query:s,tklst:[{type:"mds3",dslabel:t.app.opts.state.dslabel,hlaachange:n.join(",")}]};const i=yield import("./app-3f91f0f7.js").then((function(t){return t.b$}));yield i.default(e)}));this.prioritizeGenesCheckboxListener=e=>{t.app.dispatch({type:"plot_edit",id:t.opts.id,config:{settings:{label:{prioritizeGeneLabelsByGeneSets:e}}}})}}}class q{constructor(t,e,s){this.chromosomes=[];this.chromosomesOrder=[];this.keysArray=[];this.totalSizeArray=[];this.chrSizesArray=[];const n=s||e;this.settings=t;this.chromosomesOrder=[];let i=0;this.totalPadAngle=Object.keys(n).length*this.settings.padAngle;this.totalChromosomesAngle=2*Math.PI-this.totalPadAngle;for(const t in n){const e=t.slice(0,3)==="chr"?t.slice(3):t;this.chromosomesOrder.push(t);this.keysArray.push(e);this.totalSizeArray.push(i);this.chrSizesArray.push(n[t]);i+=n[t]}this.totalSize=i;let o=0;for(let t=0;t<this.keysArray.length;t++){const e=this.totalChromosomesAngle*(this.chrSizesArray[t]/i);const s=t==0?this.settings.padAngle/2:o+this.settings.padAngle;const n=t==0?this.settings.padAngle/2+e:o+this.settings.padAngle+e;const r={start:this.totalSizeArray[t],size:this.chrSizesArray[t],factor:1,startAngle:s,endAngle:n,angle:(s+n)/2,innerRadius:this.settings.chromosomeInnerRadius,outerRadius:this.settings.chromosomeInnerRadius+this.settings.chromosomeWidth,color:"#AAA",text:this.keysArray[t]};this.chromosomes.push(r);if(r.endAngle!=null){o=r.endAngle}}}}class X{constructor(t,e){this.sampleName=t;this.prioritizedGenes=e}map(t){return{dt:t.dt,mname:t.mname,mClass:t.class,gene:t.gene,chr:t.chr,ref:t.ref,alt:t.alt,position:t.pos?t.pos:t.position,poschr:t.poschr,posbins:t.posbins,poslabel:t.poslabel,sampleName:this.sampleName,ssm_id:t.ssm_id,start:t.start,stop:t.stop,value:t.value,segmean:t.segmean,isPrioritized:this.prioritizedGenes.some((e=>e==t.gene)),chrA:t.chrA,chrB:t.chrB,geneA:t.geneA,geneB:t.geneB,posA:t.posA,posB:t.posB,strandA:t.strandA,strandB:t.strandB}}}class _{constructor(t,e,a,l=[]){this.labelData=[];this.nonExonicSnvData=[];this.nonExonicInnerRadius=0;this.snvRingDataMap=new Map;this.snvInnerRadius=0;this.snvData=[];this.bpx=0;this.onePxArcAngle=0;this.filteredSnvData=[];this.lohData=[];this.lohInnerRadius=0;this.cnvData=[];this.cnvInnerRadius=0;this.fusionData=[];this.fusionRadius=0;this.hasPrioritizedGenes=false;this.cnvMaxValue=undefined;this.cnvMinValue=undefined;this.lohMaxValue=undefined;this.lohMinValue=undefined;this.snvFilter=t=>t.dt==s;this.fusionFilter=t=>t.dt==n||t.dt==i;this.cnvFilter=t=>t.dt==o;this.lohFilter=t=>t.dt==r;this.compareData=(t,e)=>{const s=this.reference.chromosomesOrder.indexOf(t.chr)-this.reference.chromosomesOrder.indexOf(e.chr);if(s!=0){return s}const n=t.pos?t.pos:t.start;const i=e.pos?e.pos:e.start;return n-i};this.settings=t;this.reference=e;this.sample=a;this.lastInnerRadious=this.settings.rings.chromosomeInnerRadius;this.nonExonicFilter=e=>{if(l.length>0&&this.settings.label.prioritizeGeneLabelsByGeneSets){return l.includes(e.gene)&&t.rings.nonExonicFilterValues.includes(xt.snvClassLayer[e.mClass])}else{return t.rings.nonExonicFilterValues.includes(xt.snvClassLayer[e.mClass])}};this.snvRingFilter=e=>{if(l.length>0&&this.settings.label.prioritizeGeneLabelsByGeneSets){return l.includes(e.gene)&&t.rings.snvRingFilters.includes(xt.snvClassLayer[e.mClass])}else{return t.rings.snvRingFilters.includes(xt.snvClassLayer[e.mClass])}};this.dataObjectMapper=new X(a,l)}map(t){const e=[];t.forEach((t=>{const a=this.reference.chromosomesOrder.indexOf(t.chr);const l=this.reference.chromosomesOrder.indexOf(t.chrA);const c=this.reference.chromosomesOrder.indexOf(t.chrB);if(t.dt==s){if(a!=-1&&this.snvData.length<this.settings.snv.maxMutationCount){this.addData(t,e)}}else if(t.dt==n||t.dt==i){if(l!=-1&&c!=-1){this.addData(t,e)}}else if([o,r].includes(Number(t.dt))){this.addData(t,e)}else{throw Error("Unknown mutation type!")}}));const a=e.sort(this.compareData);if(this.settings.rings.nonExonicRingEnabled){a.forEach((t=>{this.filterNonExonicSnvData(t)}))}if(this.nonExonicSnvData.length>0){this.nonExonicInnerRadius=this.lastInnerRadious-this.settings.rings.nonExonicRingWidth;this.lastInnerRadious=this.nonExonicInnerRadius}a.forEach((t=>{this.filterSnvs(t)}));a.forEach((t=>{this.filterLohs(t)}));if(this.lohData.length>0){this.lohInnerRadius=this.lastInnerRadious-this.settings.rings.lohRingWidth;this.lastInnerRadious=this.lohInnerRadius}a.forEach((t=>{this.filterCnvs(t)}));if(this.cnvData.length>0){this.cnvInnerRadius=this.lastInnerRadious-this.settings.rings.cnvRingWidth;this.lastInnerRadious=this.cnvInnerRadius}a.forEach((t=>{this.filterFusion(t)}));if(this.fusionData.length>0){this.fusionRadius=this.lastInnerRadious}const l={labelData:this.labelData,nonExonicSnvData:this.nonExonicSnvData,nonExonicInnerRadius:this.nonExonicInnerRadius,snvRingDataMap:this.snvRingDataMap,snvInnerRadius:this.snvInnerRadius,snvData:this.snvData,bpx:this.bpx,onePxArcAngle:this.onePxArcAngle,filteredSnvData:this.filteredSnvData,lohData:this.lohData,lohInnerRadius:this.lohInnerRadius,cnvData:this.cnvData,cnvInnerRadius:this.cnvInnerRadius,fusionData:this.fusionData,fusionRadius:this.fusionRadius,hasPrioritizedGenes:this.hasPrioritizedGenes,cnvMaxValue:this.cnvMaxValue,cnvMinValue:this.cnvMinValue,lohMaxValue:this.lohMaxValue,lohMinValue:this.lohMinValue};return l}addData(t,e){const s=this.dataObjectMapper.map(t);if(s.isPrioritized){this.hasPrioritizedGenes=true}e.push(s)}filterNonExonicSnvData(t){if(this.snvFilter(t)){if(this.settings.rings.nonExonicRingEnabled&&this.nonExonicFilter(t)){this.nonExonicSnvData.push(t)}}}filterSnvs(t){if(this.snvFilter(t)){this.snvData.push(t);if(this.snvRingFilter(t)){if(this.snvInnerRadius==0){this.snvInnerRadius=this.lastInnerRadious-this.settings.rings.snvRingWidth;this.lastInnerRadious=this.snvInnerRadius;this.bpx=Math.floor(this.reference.totalSize/(this.reference.totalChromosomesAngle*this.snvInnerRadius));this.onePxArcAngle=1/this.snvInnerRadius}this.filteredSnvData.push(t);this.labelData.push(t);const e=this.calculateArcAngle(t);let s=this.snvRingDataMap.get(e);if(!s){s=new Array}s.push(t);this.snvRingDataMap.set(e,s)}}}filterFusion(t){if(this.fusionFilter(t)){t.isPrioritized=true;this.fusionData.push(t);this.labelData.push(t)}}filterLohs(t){if(this.lohFilter(t)){if(this.lohMaxValue==undefined||this.lohMaxValue<t.value){this.lohMaxValue=t.segmean}if(this.lohMinValue==undefined||this.lohMinValue>t.value){this.lohMinValue=t.segmean}this.lohData.push(t)}}filterCnvs(t){if(this.cnvFilter(t)){if(this.cnvMaxValue==undefined||this.cnvMaxValue<t.value){this.cnvMaxValue=t.value}if(this.cnvMinValue==undefined||this.cnvMinValue>t.value){this.cnvMinValue=t.value}this.cnvData.push(t)}}calculateArcAngle(t){const e=this.reference.chromosomes[this.reference.chromosomesOrder.findIndex((e=>t.chr==e))];const s=Math.floor(t.position/this.bpx);return e.startAngle+s*this.onePxArcAngle}}class J{constructor(t,e,s,n,i,o,r,a){this.snvTitle=t;this.cnvTitle=e;this.lohTitle=s;this.fusionTitle=n;this.snvClassMap=i;this.cnvClassMap=o;this.lohLegend=a;this.fusionLegend=r}legendCount(){return(this.snvClassMap.size>0?1:0)+(this.cnvClassMap.size>0?1:0)+(this.lohLegend?1:0)+(this.fusionLegend?1:0)}}class K{constructor(t,e,s,n,i){this.source=t;this.target=e;this.genes=s;this.count=n;this.endpts=i}}class Q{constructor(t,e,s,n,i,o,r){this.startAngle=t;this.endAngle=e;this.radius=s;this.gene=n;this.value=i;this.genes=o;this.positionInChromosome=r}}class Y{constructor(t,e,s){this.radius=t;this.sampleName=e;this.reference=s}map(t){const e=[];t.forEach((t=>{const s=new Set;s.add(t.geneA);s.add(t.geneB);const n=new Q(this.calculateStartAngle(t.chrA,t.posA),this.calculateEndAngle(t.chrA,t.posA),this.radius,t.geneA,t.value,s,{chromosome:t.chrA,position:t.posA});const i=new Q(this.calculateStartAngle(t.chrB,t.posB),this.calculateEndAngle(t.chrB,t.posB),this.radius,t.geneB,t.value,s,{chromosome:t.chrB,position:t.posB});const o=new K(n,i,"genes",-1,"Endpoints");e.push(o)}));return e}calculateStartAngle(t,e){const s=this.reference.chromosomesOrder.indexOf(t);const n=this.reference.chromosomes[s];return n.startAngle+(n.endAngle-n.startAngle)*(Number(e)/n.size)-.01}calculateEndAngle(t,e){const s=this.reference.chromosomesOrder.indexOf(t);const n=this.reference.chromosomes[s];return.01+n.startAngle+(n.endAngle-n.startAngle)*(Number(e)/n.size)}}class Z{static provide(t){const e=Math.min(Math.max(t,0),1);const s=Math.round(e*255);return`rgb(${s}, ${s}, ${s})`}}class tt{constructor(t,e){this.minValue=t;this.maxValue=e;this.colorStartValue=Z.provide(t);this.colorEndValue=Z.provide(e)}}var et;(function(t){t[t["CHROMOSOME"]=0]="CHROMOSOME";t[t["LABEL"]=1]="LABEL";t[t["NONEXONICSNV"]=2]="NONEXONICSNV";t[t["SNV"]=3]="SNV";t[t["CNV"]=4]="CNV";t[t["LOH"]=5]="LOH";t[t["FUSION"]=6]="FUSION"})(et||(et={}));class st{constructor(t,e,s,n,i,o,r,a){this.settings=t;this.rings=e;this.legend=s;this.fusions=n;this.genesetName=r;this.width=1.2*(this.settings.horizontalPadding+this.settings.rings.labelLinesInnerRadius+this.settings.rings.labelsToLinesDistance);this.height=2*(this.settings.rings.labelLinesInnerRadius+this.settings.rings.labelsToLinesDistance+this.settings.verticalPadding);this.legendHeight=this.calculateLegendHeight(s);this.svnDataLength=o;this.filteredSnvDataLength=i;this.snvDataLength=a}getElements(t){switch(t){case et.CHROMOSOME:return this.rings.chromosomesRing?this.rings.chromosomesRing.elements:[];case et.LABEL:return this.rings.labelsRing.elementsToDisplay;case et.NONEXONICSNV:return this.rings.nonExonicArcRing?this.rings.nonExonicArcRing.elements:[];case et.SNV:return this.rings.snvArcRing?this.rings.snvArcRing.elements:[];case et.CNV:return this.rings.cnvArcRing?this.rings.cnvArcRing.elements:[];case et.LOH:return this.rings.lohArcRing?this.rings.lohArcRing.elements:[];default:throw new Error(`ringType ${t} not defined`)}}getCollisions(t){if(t==et.LABEL){return this.rings.labelsRing.collisions}else{return undefined}}calculateLegendHeight(t){const e=this.settings.legend.rowHeight;return e*t.legendCount()}}class nt{constructor(t,e,s){this.innerRadius=t;this.outerRadius=t+e;this.width=e;this.elements=s}}class it{constructor(){const t={};for(const e in a){t[a[e].label]=a[e];t[e]=a[e]}this.mlabel=t}static getInstance(){if(!it.instance){it.instance=new it}return it.instance}}class ot{constructor(t,e,s){this.snvType=t;this.color=e;this.count=s}}class rt{constructor(t,e,s,n){this.snvClassMap=new Map;this.svnInnerRadius=t;this.svnWidth=e;this.sampleName=s;this.reference=n;this.bpx=Math.floor(this.reference.totalSize/(this.reference.totalChromosomesAngle*t));this.onePxArcAngle=1/t}map(t){const e=[];for(const s of t.keys()){const n=t.get(s);if(n){const t=n.length;for(let i=0;i<n.length;i++){const o=n[i];const r=this.snvClassMap.get(o.mClass);if(r){this.snvClassMap.set(o.mClass,this.createSnvLegend(o.mClass,++r.count))}else{this.snvClassMap.set(o.mClass,this.createSnvLegend(o.mClass,1))}const a=s;const l=s+this.onePxArcAngle;const c=it.getInstance().mlabel?it.getInstance().mlabel[o.mClass]:undefined;const h={startAngle:a,endAngle:l,innerRadius:this.svnInnerRadius+i*this.svnWidth/t,outerRadius:this.svnInnerRadius+(i+1)*this.svnWidth/t,color:c.color,text:o.gene,dataClass:c.label,mname:o.mname,chr:o.chr,pos:o.position};e.push(h)}}}return e}createSnvLegend(t,e){const s=it.getInstance().mlabel[t];return new ot(s.label,s.color,e)}}class at{constructor(t,e,s,n){this.text=t;this.cnvType=e;this.color=s;this.value=n}}var lt;(function(t){t[t["Loss"]=0]="Loss";t[t["Gain"]=1]="Gain";t[t["Cap"]=2]="Cap"})(lt||(lt={}));class ct{static getColor(t,e){const s=e.cnv;const n=e.cnv.capping;const i=-1*e.cnv.capping;if(t<i){return s.cappedLossColor}else if(t>=i&&t<=0){return s.lossColor}else if(t>0&&t<=n){return s.ampColor}else{return s.cappedAmpColor}}}class ht{constructor(t,e,s,n,i,o=0,r=0,a=""){this.cnvClassMap=new Map;this.cnvInnerRadius=t;this.cnvWidth=e;this.settings=s;this.sampleName=n;this.reference=i;this.cnvMaxValue=o;this.cnvMinValue=r;this.cnvUnit=a;this.gainCapped=this.settings.cnv.capping;this.lossCapped=-1*this.settings.cnv.capping;this.lossOnly=o<=0;this.gainOnly=r>=0;this.onePxArcAngle=1/this.cnvInnerRadius;const l=new at("Max",o>0?lt.Gain:lt.Loss,this.getColor(o),o);const c=new at("Min",r>0?lt.Gain:lt.Loss,this.getColor(r),r);const h=new at("Capping",lt.Loss,this.getColor(r>0?r:o),this.settings.cnv.capping);this.cnvClassMap.set(lt.Gain,l);this.cnvClassMap.set(lt.Loss,c);this.cnvClassMap.set(lt.Cap,h);this.maxAbsValue=Math.max(Math.abs(this.capMaxValue(r)),Math.abs(this.capMaxValue(o)))}map(t){const e=[];t.forEach((t=>{let s=this.calculateStartAngle(t);let n=this.calculateEndAngle(t);if(n-s<this.onePxArcAngle){const t=this.onePxArcAngle-(n-s);s=s-t/2;n=s+t/2}const i=this.calculateInnerRadius(t);const o=this.calculateOuterRadius(t);const r=this.getColor(t.value);const a={startAngle:s,endAngle:n,innerRadius:i,outerRadius:o,color:r,text:t.gene,chr:t.chr,start:t.start,stop:t.stop,value:t.value,unit:this.cnvUnit};e.push(a)}));return e}calculateStartAngle(t){const e=this.reference.chromosomesOrder.indexOf(t.chr);const s=this.reference.chromosomes[e];return s.startAngle+(s.endAngle-s.startAngle)*(Number(t.start)/s.size)}calculateEndAngle(t){const e=this.reference.chromosomesOrder.indexOf(t.chr);const s=this.reference.chromosomes[e];return s.startAngle+(s.endAngle-s.startAngle)*(Number(t.stop)/s.size)}getColor(t){return ct.getColor(t,this.settings)}calculateInnerRadius(t){if(this.gainOnly){return this.cnvInnerRadius}if(this.lossOnly){const e=this.cnvInnerRadius+this.cnvWidth;return e-this.capMinValue(this.cnvWidth*this.capMaxValue(t.value)/this.maxAbsValue)}const e=this.cnvInnerRadius+this.cnvWidth/2;if(Math.sign(t.value)==1){return e}if(Math.sign(t.value)==-1){return e+this.capMinValue(this.capMaxValue(t.value)/this.maxAbsValue*(this.cnvWidth/2))}return 1}calculateOuterRadius(t){const e=this.cnvInnerRadius+this.cnvWidth;if(this.gainOnly){return this.cnvInnerRadius+this.capMinValue(this.cnvWidth*this.capMaxValue(t.value)/this.maxAbsValue)}if(this.lossOnly){return e}const s=this.cnvInnerRadius+this.cnvWidth/2;if(Math.sign(t.value)==1){return s+this.capMinValue(this.capMaxValue(t.value)/this.maxAbsValue*(this.cnvWidth/2))}if(Math.sign(t.value)==-1){return s}return 1}capMaxValue(t){if(Math.sign(t)==1){return t>this.gainCapped?this.gainCapped:t}if(Math.sign(t)==-1){return t<this.lossCapped?this.lossCapped:t}return 0}capMinValue(t,e=1){if(Math.sign(t)==1){return t>e?t:e}if(Math.sign(t)==-1){return t<-1*e?t:-1*e}return 1}}class ut{constructor(t,e){this.points=new Array;this.points=t;this.color=e}}class dt{static createLabel(t,e,s,n,i,o,r,a,l,c,h=false,u,d,p){const g=(t+e)/2;const m=g-Math.PI/2;const f=`rotate(${g*180/Math.PI-90}) translate(${n})${g>Math.PI?"rotate(180)":""}`;const v=g>Math.PI?"end":"";const A=s;const x=n-u;const R=[];const b={x:A*Math.cos(m),y:A*Math.sin(m)};const M={x:x*Math.cos(m),y:x*Math.sin(m)};R.push(b);R.push(M);const C=new ut(R,r);const y={startAngle:t,endAngle:e,innerRadius:s,outerRadius:n,angle:g,value:i,text:o,color:r,transform:f,textAnchor:v,ccAngle:m,line:C,isPrioritized:h,start:c,stop:c,chr:l,mutationsTooltip:d?[d]:undefined,fusionTooltip:p?[p]:undefined};return y}static createMovedLabel(t,e){const s=t.startAngle+e;const n=t.endAngle+e;const i=(s+n)/2;const o=i-Math.PI/2;const r=t.innerRadius;const a=t.outerRadius-2;const l=(a-r)/3;const c=Math.cos(t.ccAngle);const h=Math.sin(t.ccAngle);const u=Math.cos(t.ccAngle+e);const d=Math.sin(t.ccAngle+e);const p=[];const g={x:r*c,y:r*h};const m={x:(r+l)*c,y:(r+l)*h};const f={x:(r+2*l)*u,y:(r+2*l)*d};const v={x:(r+3*l)*u,y:(r+3*l)*d};p.push(g);p.push(m);p.push(f);p.push(v);const A=new ut(p,t.color);const x="rotate("+(i*180/Math.PI-90)+")"+"translate("+t.outerRadius+")"+(i>Math.PI?"rotate(180)":"");const R=i>Math.PI?"end":"";const b=t.mutationsTooltip?t.mutationsTooltip[0].color:t.fusionTooltip?t.fusionTooltip[0].color:undefined;const M={startAngle:s,endAngle:n,innerRadius:t.innerRadius,outerRadius:t.outerRadius,angle:i,value:t.value,text:t.text,transform:x,textAnchor:R,ccAngle:o,color:b,line:A,isPrioritized:t.isPrioritized,start:t.start,stop:t.stop,chr:t.chr,mutationsTooltip:t.mutationsTooltip,fusionTooltip:t.fusionTooltip};return M}}class pt{constructor(t,e,s){this.labelMap=new Map;this.settings=t;this.sampleName=e;this.reference=s}map(t,e=[]){const i=this.settings.rings.labelLinesInnerRadius;const o=i+this.settings.rings.labelsToLinesDistance;t.forEach((t=>{if(t.dt==s){const e=this.calculateStartAngle(t.chr,t.position);const s=this.calculateEndAngle(t.chr,t.position);const n=it.getInstance().mlabel?it.getInstance().mlabel[t.mClass]:undefined;this.addLabelOrMutation(t,t.gene,t.mname,e,s,i,o,n.color,n.label)}if(t.dt==n){const e=G.getColor(t.chrA,t.chrB);if(t.geneA){const s=this.calculateStartAngle(t.chrA,t.posA);const n=this.calculateEndAngle(t.chrA,t.posA);this.addLabelOrFusion(t,t.geneA,t.posA,s,n,i,o,e)}if(t.geneB&&t.geneA!=t.geneB){const s=this.calculateStartAngle(t.chrB,t.posB);const n=this.calculateEndAngle(t.chrB,t.posB);this.addLabelOrFusion(t,t.geneB,t.posB,s,n,i,o,e)}}}));const r=Array.from(this.labelMap.values());r.forEach((t=>{e.forEach((e=>{if(t.stop>=e.start&&e.stop>=t.start&&t.chr==e.chr){const s={value:e.value,color:ct.getColor(e.value,this.settings),chr:e.chr,start:e.start,stop:e.stop};if(t.cnvTooltip){t.cnvTooltip.push(s)}else{t.cnvTooltip=[];t.cnvTooltip.push(s)}}}))}));return Array.from(this.labelMap.values())}addLabelOrMutation(t,e,s,n,i,o,r,a,l){const c=this.labelMap.get(e);const h={mname:s,color:a,dataClass:l,chr:t.chr,position:t.position};if(!c){this.labelMap.set(e,dt.createLabel(n,i,o,r,t.value,e,a,l,t.chr,t.position,t.isPrioritized,this.settings.rings.labelsToLinesGap,h))}else{if(c.mutationsTooltip){c.start=Math.min(c.start,t.position);c.stop=Math.max(c.stop,t.position);c.mutationsTooltip.push(h)}else{c.mutationsTooltip=[];c.start=Math.min(c.start,t.position);c.stop=Math.max(c.stop,t.position);c.mutationsTooltip.push(h)}}}addLabelOrFusion(t,e,s,n,i,o,r,a){const l=this.labelMap.get(e);const c={color:a,chrA:t.chrA,chrB:t.chrB,posA:t.posA,posB:t.posB,geneA:t.geneA,geneB:t.geneB,strandA:t.strandA,strandB:t.strandB};if(!l){this.labelMap.set(e,dt.createLabel(n,i,o,r,t.value,e,a,"Fusion transcript",t.chr,t.position,t.isPrioritized,this.settings.rings.labelsToLinesGap,undefined,c))}else{if(l.fusionTooltip){l.start=Math.min(l.start,s);l.stop=Math.max(l.stop,s);l.fusionTooltip.push(c)}else{l.fusionTooltip=[];l.start=Math.min(l.start,s);l.stop=Math.max(l.stop,s);l.fusionTooltip.push(c)}}}calculateStartAngle(t,e){const s=this.reference.chromosomesOrder.findIndex((e=>e==t));const n=this.reference.chromosomes[s];return n.startAngle+(n.endAngle-n.startAngle)*(Number(e)/n.size)}calculateEndAngle(t,e){const s=this.reference.chromosomesOrder.findIndex((e=>e==t));const n=this.reference.chromosomes[s];return n.startAngle+(n.endAngle-n.startAngle)*(Number(e)/n.size)}}class gt extends nt{constructor(t,e,s){super(t.rings.labelLinesInnerRadius,t.rings.labelsToLinesDistance,e.sort(((t,e)=>t.startAngle<e.startAngle?-1:t.startAngle>e.startAngle?1:0)));this.elementsToDisplay=[];this.settings=t;this.hasPrioritizedGenes=s;const n=2*Math.PI*(t.rings.labelLinesInnerRadius+t.rings.labelsToLinesDistance);this.overlapAngle=this.settings.label.overlapAngleFactor*this.settings.label.fontSize/n;this.calculateCollisions()}calculateCollisions(){this.collisions=[];let t=[];t=this.elements.filter((t=>t.isPrioritized));if(this.settings.label.prioritizeGeneLabelsByGeneSets){this.elementsToDisplay=this.getLabelsWithPrioritizedGenes(t)}else if(this.hasPrioritizedGenes){const t=this.elements.filter((t=>t.isPrioritized));const e=this.getLabelsWithPrioritizedGenes(t);const s=this.elements.filter((t=>!t.isPrioritized));const n=[...s,...e].sort(((t,e)=>t.startAngle-e.startAngle));this.elementsToDisplay=this.getAllLabels(n)}else{this.elementsToDisplay=this.getLabelsWithPrioritizedGenes(this.elements)}}getLabelsWithPrioritizedGenes(t){const e=[];let s={endAngle:0};t.forEach(((t,n)=>{if(n==0){e.push(t);s=t}else{const n=s.endAngle-t.startAngle+this.overlapAngle;if(n>0&&n<this.settings.label.maxDeltaAngle){const i=dt.createMovedLabel(t,n);e===null||e===void 0?void 0:e.push(i);s=i}if(n<=0){e.push(t);s=t}}}));return e}getAllLabels(t){var e;const s=[];let n={endAngle:0};const i=t.length;let o=-1;for(let r=0;r<t.length;r++){const a=t[r];if(a.isPrioritized){s.push(a);o=r;n=a;continue}if(r==0){if(i>1){if(this.isElementOverlappingNextCancerGene(t,o,a,0)){continue}s.push(a);n=a}continue}const l=n.endAngle-a.startAngle+this.overlapAngle;if(l>0&&l<this.settings.label.maxDeltaAngle){if(r==length-1){s.push(a);continue}if(this.isElementOverlappingNextCancerGene(t,o,a,l)){continue}const i=dt.createMovedLabel(a,l);(e=this.collisions)===null||e===void 0?void 0:e.push(i);s.push(a);n=i}if(l<=0){if(this.isElementOverlappingNextCancerGene(t,o,a,0)){continue}s.push(a);n=a}}return s}isElementOverlappingNextCancerGene(t,e,s,n){const i=this.getNextLabelWithCancerGene(t,e);if(i){const t=s.endAngle+n-i.startAngle+this.overlapAngle;if(t>0){return true}}return false}getNextLabelWithCancerGene(t,e){return t.find(((t,s)=>t.isPrioritized&&s>e))}}class mt{constructor(t,e,s,n){this.nonExonicInnerRadius=t;this.nonExonicWidht=e;this.sampleName=s;this.reference=n;this.onePxArcAngle=1/t}map(t){const e=this.nonExonicInnerRadius;const s=e+this.nonExonicWidht;const n=[];t.forEach((t=>{const i=it.getInstance().mlabel?it.getInstance().mlabel[t.mClass]:undefined;const o=this.calculateStartAngle(t);const r=this.calculateEndAngle(t);const a={startAngle:o,endAngle:r,innerRadius:e,outerRadius:s,color:i.color,text:t.gene,dataClass:i.label,mname:t.mname,chr:t.chr,pos:t.position};n.push(a)}));return n}calculateStartAngle(t){const e=this.reference.chromosomesOrder.indexOf(t.chr);const s=this.reference.chromosomes[e];return s.startAngle+(s.endAngle-s.startAngle)*(Number(t.position)/s.size)-this.onePxArcAngle}calculateEndAngle(t){const e=this.reference.chromosomesOrder.indexOf(t.chr);const s=this.reference.chromosomes[e];return this.onePxArcAngle+s.startAngle+(s.endAngle-s.startAngle)*(Number(t.position)/s.size)}}class ft{constructor(t,e,s,n){this.lohInnerRadius=t;this.lohWidth=e;this.sampleName=s;this.reference=n}map(t){const e=[];t.forEach((t=>{const s=this.calculateStartAngle(t);const n=this.calculateEndAngle(t);const i=this.lohInnerRadius;const o=i+this.lohWidth;const r=Z.provide(t.segmean);const a={startAngle:s,endAngle:n,innerRadius:i,outerRadius:o,color:r,text:t.gene,chr:t.chr,start:t.start,stop:t.stop,value:t.segmean};e.push(a)}));return e}calculateStartAngle(t){const e=this.reference.chromosomesOrder.indexOf(t.chr);const s=this.reference.chromosomes[e];return s.startAngle+(s.endAngle-s.startAngle)*(Number(t.start)/s.size)}calculateEndAngle(t){const e=this.reference.chromosomesOrder.indexOf(t.chr);const s=this.reference.chromosomes[e];return s.startAngle+(s.endAngle-s.startAngle)*(Number(t.stop)/s.size)}}class vt{constructor(t,e,s,n,i,o){this.labelsRing=t;this.chromosomesRing=e;this.nonExonicArcRing=s;this.snvArcRing=n;this.cnvArcRing=i;this.lohArcRing=o}}class At{constructor(t,e,s,n,i){this.nonExonicArcRing=undefined;this.settings=t;this.dataMapper=e;this.reference=s;this.sampleName=n;this.genesetName=i}map(t){const e=this.dataMapper.map(t);const n=new pt(this.settings,this.sampleName,this.reference);const i=n.map(e.labelData,e.cnvData);const o=new gt(this.settings,i,e.hasPrioritizedGenes);const r=new nt(this.settings.rings.chromosomeInnerRadius,this.settings.rings.chromosomeWidth,this.reference.chromosomes);const a=new mt(e.nonExonicInnerRadius,this.settings.rings.nonExonicRingWidth,this.sampleName,this.reference);const l=a.map(e.nonExonicSnvData);if(l.length>0){this.nonExonicArcRing=new nt(e.nonExonicInnerRadius,this.settings.rings.nonExonicRingWidth,l)}this.snvArcsMapper=new rt(e.snvInnerRadius,this.settings.rings.snvRingWidth,this.sampleName,this.reference);const c=this.snvArcsMapper.map(e.snvRingDataMap);if(c.length>0){this.snvArcRing=new nt(e.snvInnerRadius,this.settings.rings.snvRingWidth,c)}const h=new ft(e.lohInnerRadius,this.settings.rings.lohRingWidth,this.sampleName,this.reference);const u=h.map(e.lohData);if(u.length>0){this.lohArcRing=new nt(e.lohInnerRadius,this.settings.rings.lohRingWidth,u)}this.cnvArcsMapper=new ht(e.cnvInnerRadius,this.settings.rings.cnvRingWidth,this.settings,this.sampleName,this.reference,e.cnvMaxValue,e.cnvMinValue,this.settings.cnv.unit);const d=this.cnvArcsMapper.map(e.cnvData);if(d.length>0){this.cnvArcRing=new nt(e.cnvInnerRadius,this.settings.rings.cnvRingWidth,d)}const p=new Y(e.fusionRadius,this.sampleName,this.reference);const g=p.map(e.fusionData);let m;if(this.settings.legend.lohLegendEnabled&&e.lohMinValue&&e.lohMaxValue){m=new tt(e.lohMinValue,e.lohMaxValue)}const f=new J(this.settings.legend.snvTitle,this.settings.legend.cnvTitle,this.settings.legend.lohTitle,this.settings.legend.fusionTitle,this.snvArcsMapper?this.snvArcsMapper.snvClassMap:new Map,this.cnvArcsMapper?this.cnvArcsMapper.cnvClassMap:new Map,g.length>0,m);const v=new vt(o,r,this.nonExonicArcRing,this.snvArcRing,this.cnvArcRing,this.lohArcRing);return new st(this.settings,v,f,g,e.filteredSnvData.length,e.snvData.length,this.genesetName,t.filter((t=>t.dt==s)).length)}}class xt{constructor(t){this.settings=t}map(t){var e,s;const n=t.args.chromosomes;const i=t.args.genome.majorchr;const o=t.args.sampleName;const r=t.args.genome;const a=((e=r===null||r===void 0?void 0:r.geneset)===null||e===void 0?void 0:e[0])?r.geneset[0].lst:[];const l=((s=r===null||r===void 0?void 0:r.geneset)===null||s===void 0?void 0:s[0])?r.geneset[0].name:"";const c=t.args.data;const h=new q(this.settings,i,n);const u=new _(this.settings,h,o,a);return new At(this.settings,u,h,o,l).map(c)}}xt.snvClassLayer={M:"exonic",E:"exonic",F:"exonic",N:"exonic",S:"exonic",D:"exonic",I:"exonic",P:"exonic",L:"exonic",Utr3:"exonic",Utr5:"exonic",mnv:"non-exonic",ITD:"non-exonic",insertion:"non-exonic",deletion:"non-exonic",Intron:"non-exonic",X:"non-exonic",noncoding:"non-exonic"};class Rt{constructor(t,e){this.cvnCapping=t;this.onClickCallback=e}map(t){const e=[];let s=0;if(t.snvClassMap){this.mapSnv(t,e,s++)}if(t.cnvClassMap){this.mapCnv(t,e,s++)}if(t.lohLegend){this.mapLoh(t,e,s++)}if(t.fusionLegend){this.mapFusion(t,e,s++)}return e}mapSnv(t,e,s){const n=[];let i=0;for(const[e,s]of t.snvClassMap){n.push({termid:t.snvTitle,key:e,text:`${s.snvType} (${s.count})`,color:s.color,order:i++,border:"1px solid #ccc"})}e.push({name:t.snvTitle,order:s,items:n})}mapCnv(t,e,s){if(!t.cnvClassMap)return;const n=t.cnvClassMap.get(lt.Gain);const i=t.cnvClassMap.get(lt.Loss);const o=t.cnvClassMap.get(lt.Cap);if(n&&i&&o){let r=0;const a=[];if(n.value>0){a.push({termid:t.cnvTitle,key:lt.Gain,text:`Max: ${n.value}`,color:n.color,order:r++,border:"1px solid #ccc"})}if(i.value<0){a.push({termid:t.cnvTitle,key:lt.Loss,text:`Min: ${i.value}`,color:i.color,order:r++,border:"1px solid #ccc"})}a.push({termid:t.cnvTitle,key:lt.Cap,text:`Capping: ${o.value}`,color:o.color,order:r++,border:"1px solid #ccc",onClickCallback:this.onClickCallback});e.push({name:t.cnvTitle,order:s,items:a})}}mapLoh(t,e,s){if(!t.lohLegend)return;const n=[];n.push({termid:t.lohTitle,key:"min",text:"min",color:t.lohLegend.colorStartValue,order:0,border:"1px solid #ccc"});n.push({termid:t.lohTitle,key:"max",text:"max",color:t.lohLegend.colorEndValue,order:1,border:"1px solid #ccc"});e.push({name:t.lohTitle,order:s,items:n})}mapFusion(t,e,s){const n=[];n.push({termid:t.fusionTitle,key:$.Interchromosomal,text:"Interchromosomal",color:$.Interchromosomal.valueOf(),order:0,border:"1px solid #ccc"});n.push({termid:t.fusionTitle,key:$.Intrachromosomal,text:"Intrachromosomal",color:$.Intrachromosomal.valueOf(),order:1,border:"1px solid #ccc"});e.push({name:t.fusionTitle,order:s,items:n})}}class bt{constructor(t,e,s){this.fontSize=e;this.legendJSONMapper=new Rt(t,s)}render(t,e,s,n,i){const o=g({holder:t.append("g"),rectFillFxn:t=>t.color,iconStroke:"#aaa"});const r={xOffset:s};const a=this.legendJSONMapper.map(e);o(a,{settings:Object.assign({},{svgw:n,svgh:i,dimensions:r,fontsize:this.fontSize})})}}class Mt{constructor(t,e,s){this.padAngle=t;this.innerRadius=e;this.outerRadius=s}render(t,e){const s=R().padAngle(this.padAngle).value((t=>t.size)).sort(null);const n=s(e);const i=u().innerRadius(this.innerRadius).outerRadius(this.outerRadius);const o=t.append("g");o.selectAll("path").data(n).enter().append("path").attr("d",i).attr("fill","black");o.selectAll("text").data(n).enter().append("text").attr("transform",(t=>`translate(${i.centroid(t)}) rotate(${t.data.angle*180/Math.PI-90})${t.data.angle>Math.PI?"rotate(180)":""}`)).attr("dy","0.35em").attr("text-anchor","middle").text((t=>t.data.text)).style("fill","white")}}class Ct{constructor(t,e){this.animationDuration=t;this.geneClickListener=e}render(t,e,s){const n=t.append("g");const i=f().x((t=>t.x)).y((t=>t.y));const o=P.create();n.selectAll(".group").data(e).enter().append("g").attr("class","group").each(((t,e,s)=>{const n=l(s[e]);n.append("text").attr("class","chord-text").attr("dy",".35em").attr("transform",t.transform).style("text-anchor",t.textAnchor).style("font-size","12px").style("fill",t.color).style("cursor","pointer").text(t.text).on("click",(()=>{if(t.mutationsTooltip){this.geneClickListener(t.text,t.mutationsTooltip.map((t=>t.mname)))}})).on("mouseover",(e=>{o.d.style("padding","2px").html(this.createTooltipHtml(t));o.show(e.x,e.y)})).on("mouseout",(()=>{o.hide()}));n.append("path").attr("class","chord-tick").datum(t.line.points).style("stroke",t.color).style("fill","none").attr("d",i)}));n.selectAll(".group").each(((t,e,n)=>{const o=s?s.find((e=>e.text===t.text)):undefined;if(o){const t=l(n[e]);t.selectAll(".chord-text").datum(o).transition().duration(this.animationDuration).attr("transform",o.transform).style("text-anchor",o.textAnchor);t.selectAll(".chord-tick").datum(o.line.points).transition().duration(this.animationDuration).style("fill","none").attr("d",i)}}))}createTooltipHtml(t){let e="";if(t.mutationsTooltip){e+=`Gene: ${t.text} <br />`;t.mutationsTooltip.forEach((t=>{e+=`Consequence: ${t.mname} <span style="color: ${t.color}" >${t.dataClass}</span> <br />Mutation: ${t.chr}:${t.position} <br />`}))}if(t.fusionTooltip){e+=`Data type: Fusion transcript <br />`;t.fusionTooltip.forEach((t=>{e+=`Break points: ${t.geneA?t.geneA:""} ${t.chrA}:${t.posA} ${t.strandA=="+"?"forward":"reverse"} > `+`${t.geneB?t.geneB:""} ${t.chrB}:${t.posB} ${t.strandB=="+"?"forward":"reverse"} <br /> `}))}if(t.cnvTooltip){t.cnvTooltip.forEach((t=>{e+=`CNV: <span style="color: ${t.color}">${t.value}</span> ${t.chr}:${t.start}-${t.stop}`}))}return e}}function yt(t={}){const e={downloadImgName:"disco.plot",rings:{nonExonicRingWidth:20,snvRingWidth:20,lohRingWidth:20,cnvRingWidth:30,snvRingFilters:["exonic"],chromosomeInnerRadius:190,chromosomeWidth:20,labelLinesInnerRadius:210,labelsToLinesDistance:30,labelsToLinesGap:2,nonExonicRingEnabled:true,nonExonicFilterValues:["non-exonic"]},verticalPadding:70,horizontalPadding:500,layerScaler:1,padAngle:.002,label:{fontSize:12,maxDeltaAngle:.05,animationDuration:1e3,overlapAngleFactor:5,prioritizeGeneLabelsByGeneSets:false,showPrioritizeGeneLabelsByGeneSets:false},cnv:{capping:5,ampColor:"#D6683C",lossColor:"#67a9cf",cappedAmpColor:"#8B0000",cappedLossColor:"#00008B",unit:"Unit"},snv:{maxMutationCount:1e4},legend:{snvTitle:"SNV",cnvTitle:"CNV",lohTitle:"LOH",fusionTitle:"SV",lohLegendEnabled:true,fontSize:12,rowHeight:48},menu:{padding:5}};return c(e,t)}class Lt{constructor(t){this.geneClickListener=t}render(t,e){const s=u();const n=t.append("g");const i=P.create();n.selectAll("path").data(e).enter().append("path").attr("d",(t=>s(t))).attr("fill",(t=>t.color)).on("mouseover",((t,e)=>{i.d.style("padding","2px").html(`Gene: ${e.text} <br />${e.mname} <br /> <span style="color:${e.color}">${e.dataClass}</span> <br /> ${e.chr}:${e.pos}`);i.show(t.x,t.y)})).on("mouseout",(()=>{i.hide()})).on("click",((t,e)=>{this.geneClickListener(e.text,[e.mname])}))}}class It{constructor(t,e){this.svnWidth=t;this.geneClickListener=e}render(t,e){if(e.length>0){const s=e[0].innerRadius;const n=new B(s,this.svnWidth,"#6464641A");n.render(t)}const s=u();const n=t.append("g");const i=P.create();n.selectAll("path").data(e).enter().append("path").attr("d",(t=>s(t))).attr("fill",(t=>t.color)).on("mouseover",((t,e)=>{i.d.style("padding","2px").html(`Gene: ${e.text} <br />${e.mname} <br /> <span style="color:${e.color}">${e.dataClass}</span> <br /> ${e.chr}:${e.pos}`);i.show(t.x,t.y)})).on("mouseout",(()=>{i.hide()})).on("click",((t,e)=>{this.geneClickListener(e.text,[e.mname])}))}}class wt{render(t,e){const s=u();const n=t.append("g");const i=P.create();n.selectAll("path").data(e).enter().append("path").attr("d",(t=>s(t))).attr("fill",(t=>t.color)).on("mouseover",((t,e)=>{i.d.style("padding","2px").html(`Loss of Heterozygosity <br /> ${e.chr}:${e.start}-${e.stop}`);i.show(t.x,t.y)})).on("mouseout",(()=>{i.hide()}))}}class Et{constructor(t){this.menuPadding=t}render(t,e){const s=u();const n=t.append("g");const i=P.create();n.selectAll("path").data(e).enter().append("path").attr("d",(t=>s(t))).attr("fill",(t=>t.color)).on("mouseover",((t,e)=>{i.d.style("padding","2px").html(`Copy Number Variation <br /> ${e.chr}:${e.start}-${e.stop} <br /> ${e.unit}: ${e.value} `);i.show(t.x,t.y)})).on("mouseout",(()=>{i.hide()}))}}class Dt{constructor(t){this.type="Disco";this.opts=t}getState(t){return t.plots.find((t=>t.id===this.id))}main(){return e(this,void 0,void 0,(function*(){const t=new U(this);const e=this.state.settings;const s=new xt(e);const n=s.map(this.app.getState());const i=this.opts.holder;i.selectAll("*").remove();const o=new bt(e.cnv.capping,e.label.fontSize,t.cappingClickCallback);const r=new j(this.getRingRenderers(e,t.geneClickListener),o,t.downloadClickListener,t.prioritizeGenesCheckboxListener);r.render(i,n)}))}getRingRenderers(t,e){const s=new Mt(t.padAngle,t.rings.chromosomeInnerRadius,t.rings.chromosomeInnerRadius+t.rings.chromosomeWidth);const n=new Ct(t.label.animationDuration,e);const i=new Lt(e);const o=new It(t.rings.snvRingWidth,e);const r=new Et(t.menu.padding);const a=new wt;const l=new Map;l.set(et.CHROMOSOME,s);l.set(et.LABEL,n);l.set(et.NONEXONICSNV,i);l.set(et.SNV,o);l.set(et.CNV,r);l.set(et.LOH,a);return l}}const Ot=h(Dt);const St=Ot;function Tt(t){return e(this,void 0,void 0,(function*(){return{chartType:"Disco",subfolder:"disco",extension:"ts",settings:yt(t.overrides)}}))}export{St as componentInit,Ot as discoInit,Tt as getPlotConfig};
|
|
1
|
+
import{M as t,aP as e,L as s,J as n,K as i,af as o,b8 as r,E as a,q as l,aO as c,az as h}from"./app-42d73775.js";import"./transform-f2cc07e6.js";import{d as u}from"./arc-3d6751aa.js";import{c as d,p}from"./constant-426a1483.js";import{s as g}from"./svg.legend-2498cf4b.js";import{a as m,l as f}from"./line-264f8f9e.js";import{t as v}from"./math-2fb199c6.js";import"path";function A(t,e){return e<t?-1:e>t?1:e>=t?0:NaN}function x(t){return t}function R(){var t=x,e=A,s=null,n=d(0),i=d(v),o=d(0);function r(r){var a,l=(r=m(r)).length,c,h,u=0,d=new Array(l),p=new Array(l),g=+n.apply(this,arguments),f=Math.min(v,Math.max(-v,i.apply(this,arguments)-g)),A,x=Math.min(Math.abs(f)/l,o.apply(this,arguments)),R=x*(f<0?-1:1),b;for(a=0;a<l;++a){if((b=p[d[a]=a]=+t(r[a],a,r))>0){u+=b}}if(e!=null)d.sort((function(t,s){return e(p[t],p[s])}));else if(s!=null)d.sort((function(t,e){return s(r[t],r[e])}));for(a=0,h=u?(f-l*R)/u:0;a<l;++a,g=A){c=d[a],b=p[c],A=g+(b>0?b*h:0)+R,p[c]={data:r[c],index:a,value:b,startAngle:g,endAngle:A,padAngle:x}}return p}r.value=function(e){return arguments.length?(t=typeof e==="function"?e:d(+e),r):t};r.sortValues=function(t){return arguments.length?(e=t,s=null,r):e};r.sort=function(t){return arguments.length?(s=t,e=null,r):s};r.startAngle=function(t){return arguments.length?(n=typeof t==="function"?t:d(+t),r):n};r.endAngle=function(t){return arguments.length?(i=typeof t==="function"?t:d(+t),r):i};r.padAngle=function(t){return arguments.length?(o=typeof t==="function"?t:d(+t),r):o};return r}var b=Math.abs;var M=Math.cos;var C=Math.sin;var y=Math.PI;var L=y/2;var I=1e-12;var w=Array.prototype.slice;function E(t){return function(){return t}}function D(t){return t.source}function O(t){return t.target}function S(t){return t.radius}function T(t){return t.startAngle}function N(t){return t.endAngle}function z(){return 0}function V(t){var e=D,s=O,n=S,i=S,o=T,r=N,a=z,l=null;function c(){var c,h=e.apply(this,arguments),u=s.apply(this,arguments),d=a.apply(this,arguments)/2,g=w.call(arguments),m=+n.apply(this,(g[0]=h,g)),f=o.apply(this,g)-L,v=r.apply(this,g)-L,A=+i.apply(this,(g[0]=u,g)),x=o.apply(this,g)-L,R=r.apply(this,g)-L;if(!l)l=c=p();if(d>I){if(b(v-f)>d*2+I)v>f?(f+=d,v-=d):(f-=d,v+=d);else f=v=(f+v)/2;if(b(R-x)>d*2+I)R>x?(x+=d,R-=d):(x-=d,R+=d);else x=R=(x+R)/2}l.moveTo(m*M(f),m*C(f));l.arc(0,0,m,f,v);if(f!==x||v!==R){if(t){var y=+t.apply(this,arguments),E=A-y,D=(x+R)/2;l.quadraticCurveTo(0,0,E*M(x),E*C(x));l.lineTo(A*M(D),A*C(D));l.lineTo(E*M(R),E*C(R))}else{l.quadraticCurveTo(0,0,A*M(x),A*C(x));l.arc(0,0,A,x,R)}}l.quadraticCurveTo(0,0,m*M(f),m*C(f));l.closePath();if(c)return l=null,c+""||null}if(t)c.headRadius=function(e){return arguments.length?(t=typeof e==="function"?e:E(+e),c):t};c.radius=function(t){return arguments.length?(n=i=typeof t==="function"?t:E(+t),c):n};c.sourceRadius=function(t){return arguments.length?(n=typeof t==="function"?t:E(+t),c):n};c.targetRadius=function(t){return arguments.length?(i=typeof t==="function"?t:E(+t),c):i};c.startAngle=function(t){return arguments.length?(o=typeof t==="function"?t:E(+t),c):o};c.endAngle=function(t){return arguments.length?(r=typeof t==="function"?t:E(+t),c):r};c.padAngle=function(t){return arguments.length?(a=typeof t==="function"?t:E(+t),c):a};c.source=function(t){return arguments.length?(e=t,c):e};c.target=function(t){return arguments.length?(s=t,c):s};c.context=function(t){return arguments.length?(l=t==null?null:t,c):l};return c}function k(){return V()}class B{constructor(t,e,s){this.radius=t;this.width=e;this.color=s}render(t){const e=u();const s={startAngle:0,endAngle:Math.PI*2,innerRadius:this.radius,outerRadius:this.radius+this.width,color:this.color,text:"No label"};const n=[];n.push(s);const i=t.append("g");i.selectAll("path").data(n).enter().append("path").attr("d",(t=>e(t))).attr("fill",(t=>t.color))}}class P{static create(){const e=new t({padding:5});e.d.style("border","1px solid #FFF").style("position","absolute").style("z-index",1001);return e}}var $;(function(t){t["Intrachromosomal"]="#1B9E77";t["Interchromosomal"]="#6A3D9A"})($||($={}));class G{static getColor(t,e){if(t!=e){return $.Interchromosomal.valueOf()}else{return $.Intrachromosomal.valueOf()}}}class W{render(t,e){let s=0;if(e.length>0){s=e[0].target.radius;const n=new B(s,2,"#6464641A");n.render(t)}const n=k().radius(s);const i=t.selectAll(".chord").data(e);const o=P.create();i.enter().append("path").attr("class","chord").attr("d",n).attr("fill",(t=>G.getColor(t.source.positionInChromosome.chromosome,t.target.positionInChromosome.chromosome))).on("mouseover",((t,e)=>{o.d.style("padding","2px").html(this.getTooltip(e));o.show(t.x,t.y)})).on("mouseout",(()=>{o.hide()}))}getTooltip(t){let e="";if(t.source.gene){e+=t.source.gene}const s=t.source.positionInChromosome;e+=` ${s.chromosome}:${s.position}<br />`;if(t.target.gene){e+=t.target.gene}const n=t.target.positionInChromosome;e+=` ${n.chromosome}:${n.position}`;return e}}class F{constructor(t){this.downloadClickListener=t}render(t,e){t.append("span").append("button").style("margin","2px 0 2px 30px").text("Download image").on("click",(()=>{const t=e.select("svg").node();this.downloadClickListener(t)}))}}class H{constructor(t){this.checkBoxClickListener=t}render(t,e,s,n,i,o){if(s){const s=t.append("span").append("input").attr("type","checkbox").attr("id","genes-checkbox").property("checked",e);t.append("label").attr("for","genes-checkbox").text(`Only show mutations for ${o} genes (${n} out of ${i} total)`);s.on("change",(()=>{this.checkBoxClickListener(s.property("checked"))}))}}}class j{constructor(t,e,s,n){this.renders=t;this.legendRenderer=e;this.fusionRenderer=new W;this.downloadButtonRenderer=new F(s);this.prioritizeGenesCheckboxRenderer=new H(n)}render(t,e){const s=t.append("div");s.append("div");const n=s.append("div").style("display","inline-block").style("font-family","Arial");const i=n.append("div");this.downloadButtonRenderer.render(i,n);this.prioritizeGenesCheckboxRenderer.render(i,e.settings.label.prioritizeGeneLabelsByGeneSets,e.settings.label.showPrioritizeGeneLabelsByGeneSets,e.settings.label.prioritizeGeneLabelsByGeneSets&&e.settings.label.showPrioritizeGeneLabelsByGeneSets?e.filteredSnvDataLength:e.snvDataLength,e.snvDataLength,e.genesetName);const o=n.append("svg").attr("width",e.width).attr("height",e.height+e.legendHeight);const r=o.append("g").attr("class","mainG").attr("transform",`translate(${e.settings.rings.labelLinesInnerRadius+e.settings.rings.labelsToLinesDistance+100},${e.height/2})`);for(const[t,s]of this.renders){const n=e.getElements(t);const i=e.getCollisions(t);s.render(r,n,i)}this.fusionRenderer.render(r,e.fusions);this.legendRenderer.render(r,e.legend,-1*(e.settings.rings.labelLinesInnerRadius+e.settings.rings.labelsToLinesDistance+50),e.width,e.height/2)}}class U{constructor(t){this.downloadImgName=t.state.settings.downloadImgName||"disco.plot";this.cappingClickCallback=(e,s)=>{const n=t.app.tip;n.clear();const i=t.app.tip.d;const o=i.append("span").html("Capping:").append("input").attr("type","number").on("change",(()=>{t.app.dispatch({type:"plot_edit",id:t.opts.id,config:{settings:{cnv:{capping:Number(o.property("value"))}}}});n.hide()}));const r=s.node().getBoundingClientRect();const a=r.left-20;const l=r.top-40;n.show(a,l)};this.downloadClickListener=t=>{const e=document.createElement("a");document.body.appendChild(e);e.addEventListener("click",(()=>{const s=new XMLSerializer;const n=new Blob([s.serializeToString(t)],{type:"image/svg+xml"});e.download=this.downloadImgName+".svg";e.href=URL.createObjectURL(n);document.body.removeChild(e)}),false);e.click()};this.geneClickListener=(s,n)=>e(this,void 0,void 0,(function*(){const e={holder:t.app.opts.holder,genome:t.app.opts.state.args.genome,nobox:true,query:s,tklst:[{type:"mds3",dslabel:t.app.opts.state.dslabel,hlaachange:n.join(",")}]};const i=yield import("./app-42d73775.js").then((function(t){return t.b$}));yield i.default(e)}));this.prioritizeGenesCheckboxListener=e=>{t.app.dispatch({type:"plot_edit",id:t.opts.id,config:{settings:{label:{prioritizeGeneLabelsByGeneSets:e}}}})}}}class q{constructor(t,e,s){this.chromosomes=[];this.chromosomesOrder=[];this.keysArray=[];this.totalSizeArray=[];this.chrSizesArray=[];const n=s||e;this.settings=t;this.chromosomesOrder=[];let i=0;this.totalPadAngle=Object.keys(n).length*this.settings.padAngle;this.totalChromosomesAngle=2*Math.PI-this.totalPadAngle;for(const t in n){const e=t.slice(0,3)==="chr"?t.slice(3):t;this.chromosomesOrder.push(t);this.keysArray.push(e);this.totalSizeArray.push(i);this.chrSizesArray.push(n[t]);i+=n[t]}this.totalSize=i;let o=0;for(let t=0;t<this.keysArray.length;t++){const e=this.totalChromosomesAngle*(this.chrSizesArray[t]/i);const s=t==0?this.settings.padAngle/2:o+this.settings.padAngle;const n=t==0?this.settings.padAngle/2+e:o+this.settings.padAngle+e;const r={start:this.totalSizeArray[t],size:this.chrSizesArray[t],factor:1,startAngle:s,endAngle:n,angle:(s+n)/2,innerRadius:this.settings.chromosomeInnerRadius,outerRadius:this.settings.chromosomeInnerRadius+this.settings.chromosomeWidth,color:"#AAA",text:this.keysArray[t]};this.chromosomes.push(r);if(r.endAngle!=null){o=r.endAngle}}}}class X{constructor(t,e){this.sampleName=t;this.prioritizedGenes=e}map(t){return{dt:t.dt,mname:t.mname,mClass:t.class,gene:t.gene,chr:t.chr,ref:t.ref,alt:t.alt,position:t.pos?t.pos:t.position,poschr:t.poschr,posbins:t.posbins,poslabel:t.poslabel,sampleName:this.sampleName,ssm_id:t.ssm_id,start:t.start,stop:t.stop,value:t.value,segmean:t.segmean,isPrioritized:this.prioritizedGenes.some((e=>e==t.gene)),chrA:t.chrA,chrB:t.chrB,geneA:t.geneA,geneB:t.geneB,posA:t.posA,posB:t.posB,strandA:t.strandA,strandB:t.strandB}}}class _{constructor(t,e,a,l=[]){this.labelData=[];this.nonExonicSnvData=[];this.nonExonicInnerRadius=0;this.snvRingDataMap=new Map;this.snvInnerRadius=0;this.snvData=[];this.bpx=0;this.onePxArcAngle=0;this.filteredSnvData=[];this.lohData=[];this.lohInnerRadius=0;this.cnvData=[];this.cnvInnerRadius=0;this.fusionData=[];this.fusionRadius=0;this.hasPrioritizedGenes=false;this.cnvMaxValue=undefined;this.cnvMinValue=undefined;this.lohMaxValue=undefined;this.lohMinValue=undefined;this.snvFilter=t=>t.dt==s;this.fusionFilter=t=>t.dt==n||t.dt==i;this.cnvFilter=t=>t.dt==o;this.lohFilter=t=>t.dt==r;this.compareData=(t,e)=>{const s=this.reference.chromosomesOrder.indexOf(t.chr)-this.reference.chromosomesOrder.indexOf(e.chr);if(s!=0){return s}const n=t.pos?t.pos:t.start;const i=e.pos?e.pos:e.start;return n-i};this.settings=t;this.reference=e;this.sample=a;this.lastInnerRadious=this.settings.rings.chromosomeInnerRadius;this.nonExonicFilter=e=>{if(l.length>0&&this.settings.label.prioritizeGeneLabelsByGeneSets){return l.includes(e.gene)&&t.rings.nonExonicFilterValues.includes(xt.snvClassLayer[e.mClass])}else{return t.rings.nonExonicFilterValues.includes(xt.snvClassLayer[e.mClass])}};this.snvRingFilter=e=>{if(l.length>0&&this.settings.label.prioritizeGeneLabelsByGeneSets){return l.includes(e.gene)&&t.rings.snvRingFilters.includes(xt.snvClassLayer[e.mClass])}else{return t.rings.snvRingFilters.includes(xt.snvClassLayer[e.mClass])}};this.dataObjectMapper=new X(a,l)}map(t){const e=[];t.forEach((t=>{const a=this.reference.chromosomesOrder.indexOf(t.chr);const l=this.reference.chromosomesOrder.indexOf(t.chrA);const c=this.reference.chromosomesOrder.indexOf(t.chrB);if(t.dt==s){if(a!=-1&&this.snvData.length<this.settings.snv.maxMutationCount){this.addData(t,e)}}else if(t.dt==n||t.dt==i){if(l!=-1&&c!=-1){this.addData(t,e)}}else if([o,r].includes(Number(t.dt))){this.addData(t,e)}else{throw Error("Unknown mutation type!")}}));const a=e.sort(this.compareData);if(this.settings.rings.nonExonicRingEnabled){a.forEach((t=>{this.filterNonExonicSnvData(t)}))}if(this.nonExonicSnvData.length>0){this.nonExonicInnerRadius=this.lastInnerRadious-this.settings.rings.nonExonicRingWidth;this.lastInnerRadious=this.nonExonicInnerRadius}a.forEach((t=>{this.filterSnvs(t)}));a.forEach((t=>{this.filterLohs(t)}));if(this.lohData.length>0){this.lohInnerRadius=this.lastInnerRadious-this.settings.rings.lohRingWidth;this.lastInnerRadious=this.lohInnerRadius}a.forEach((t=>{this.filterCnvs(t)}));if(this.cnvData.length>0){this.cnvInnerRadius=this.lastInnerRadious-this.settings.rings.cnvRingWidth;this.lastInnerRadious=this.cnvInnerRadius}a.forEach((t=>{this.filterFusion(t)}));if(this.fusionData.length>0){this.fusionRadius=this.lastInnerRadious}const l={labelData:this.labelData,nonExonicSnvData:this.nonExonicSnvData,nonExonicInnerRadius:this.nonExonicInnerRadius,snvRingDataMap:this.snvRingDataMap,snvInnerRadius:this.snvInnerRadius,snvData:this.snvData,bpx:this.bpx,onePxArcAngle:this.onePxArcAngle,filteredSnvData:this.filteredSnvData,lohData:this.lohData,lohInnerRadius:this.lohInnerRadius,cnvData:this.cnvData,cnvInnerRadius:this.cnvInnerRadius,fusionData:this.fusionData,fusionRadius:this.fusionRadius,hasPrioritizedGenes:this.hasPrioritizedGenes,cnvMaxValue:this.cnvMaxValue,cnvMinValue:this.cnvMinValue,lohMaxValue:this.lohMaxValue,lohMinValue:this.lohMinValue};return l}addData(t,e){const s=this.dataObjectMapper.map(t);if(s.isPrioritized){this.hasPrioritizedGenes=true}e.push(s)}filterNonExonicSnvData(t){if(this.snvFilter(t)){if(this.settings.rings.nonExonicRingEnabled&&this.nonExonicFilter(t)){this.nonExonicSnvData.push(t)}}}filterSnvs(t){if(this.snvFilter(t)){this.snvData.push(t);if(this.snvRingFilter(t)){if(this.snvInnerRadius==0){this.snvInnerRadius=this.lastInnerRadious-this.settings.rings.snvRingWidth;this.lastInnerRadious=this.snvInnerRadius;this.bpx=Math.floor(this.reference.totalSize/(this.reference.totalChromosomesAngle*this.snvInnerRadius));this.onePxArcAngle=1/this.snvInnerRadius}this.filteredSnvData.push(t);this.labelData.push(t);const e=this.calculateArcAngle(t);let s=this.snvRingDataMap.get(e);if(!s){s=new Array}s.push(t);this.snvRingDataMap.set(e,s)}}}filterFusion(t){if(this.fusionFilter(t)){t.isPrioritized=true;this.fusionData.push(t);this.labelData.push(t)}}filterLohs(t){if(this.lohFilter(t)){if(this.lohMaxValue==undefined||this.lohMaxValue<t.value){this.lohMaxValue=t.segmean}if(this.lohMinValue==undefined||this.lohMinValue>t.value){this.lohMinValue=t.segmean}this.lohData.push(t)}}filterCnvs(t){if(this.cnvFilter(t)){if(this.cnvMaxValue==undefined||this.cnvMaxValue<t.value){this.cnvMaxValue=t.value}if(this.cnvMinValue==undefined||this.cnvMinValue>t.value){this.cnvMinValue=t.value}this.cnvData.push(t)}}calculateArcAngle(t){const e=this.reference.chromosomes[this.reference.chromosomesOrder.findIndex((e=>t.chr==e))];const s=Math.floor(t.position/this.bpx);return e.startAngle+s*this.onePxArcAngle}}class J{constructor(t,e,s,n,i,o,r,a){this.snvTitle=t;this.cnvTitle=e;this.lohTitle=s;this.fusionTitle=n;this.snvClassMap=i;this.cnvClassMap=o;this.lohLegend=a;this.fusionLegend=r}legendCount(){return(this.snvClassMap.size>0?1:0)+(this.cnvClassMap.size>0?1:0)+(this.lohLegend?1:0)+(this.fusionLegend?1:0)}}class K{constructor(t,e,s,n,i){this.source=t;this.target=e;this.genes=s;this.count=n;this.endpts=i}}class Q{constructor(t,e,s,n,i,o,r){this.startAngle=t;this.endAngle=e;this.radius=s;this.gene=n;this.value=i;this.genes=o;this.positionInChromosome=r}}class Y{constructor(t,e,s){this.radius=t;this.sampleName=e;this.reference=s}map(t){const e=[];t.forEach((t=>{const s=new Set;s.add(t.geneA);s.add(t.geneB);const n=new Q(this.calculateStartAngle(t.chrA,t.posA),this.calculateEndAngle(t.chrA,t.posA),this.radius,t.geneA,t.value,s,{chromosome:t.chrA,position:t.posA});const i=new Q(this.calculateStartAngle(t.chrB,t.posB),this.calculateEndAngle(t.chrB,t.posB),this.radius,t.geneB,t.value,s,{chromosome:t.chrB,position:t.posB});const o=new K(n,i,"genes",-1,"Endpoints");e.push(o)}));return e}calculateStartAngle(t,e){const s=this.reference.chromosomesOrder.indexOf(t);const n=this.reference.chromosomes[s];return n.startAngle+(n.endAngle-n.startAngle)*(Number(e)/n.size)-.01}calculateEndAngle(t,e){const s=this.reference.chromosomesOrder.indexOf(t);const n=this.reference.chromosomes[s];return.01+n.startAngle+(n.endAngle-n.startAngle)*(Number(e)/n.size)}}class Z{static provide(t){const e=Math.min(Math.max(t,0),1);const s=Math.round(e*255);return`rgb(${s}, ${s}, ${s})`}}class tt{constructor(t,e){this.minValue=t;this.maxValue=e;this.colorStartValue=Z.provide(t);this.colorEndValue=Z.provide(e)}}var et;(function(t){t[t["CHROMOSOME"]=0]="CHROMOSOME";t[t["LABEL"]=1]="LABEL";t[t["NONEXONICSNV"]=2]="NONEXONICSNV";t[t["SNV"]=3]="SNV";t[t["CNV"]=4]="CNV";t[t["LOH"]=5]="LOH";t[t["FUSION"]=6]="FUSION"})(et||(et={}));class st{constructor(t,e,s,n,i,o,r,a){this.settings=t;this.rings=e;this.legend=s;this.fusions=n;this.genesetName=r;this.width=1.2*(this.settings.horizontalPadding+this.settings.rings.labelLinesInnerRadius+this.settings.rings.labelsToLinesDistance);this.height=2*(this.settings.rings.labelLinesInnerRadius+this.settings.rings.labelsToLinesDistance+this.settings.verticalPadding);this.legendHeight=this.calculateLegendHeight(s);this.svnDataLength=o;this.filteredSnvDataLength=i;this.snvDataLength=a}getElements(t){switch(t){case et.CHROMOSOME:return this.rings.chromosomesRing?this.rings.chromosomesRing.elements:[];case et.LABEL:return this.rings.labelsRing.elementsToDisplay;case et.NONEXONICSNV:return this.rings.nonExonicArcRing?this.rings.nonExonicArcRing.elements:[];case et.SNV:return this.rings.snvArcRing?this.rings.snvArcRing.elements:[];case et.CNV:return this.rings.cnvArcRing?this.rings.cnvArcRing.elements:[];case et.LOH:return this.rings.lohArcRing?this.rings.lohArcRing.elements:[];default:throw new Error(`ringType ${t} not defined`)}}getCollisions(t){if(t==et.LABEL){return this.rings.labelsRing.collisions}else{return undefined}}calculateLegendHeight(t){const e=this.settings.legend.rowHeight;return e*t.legendCount()}}class nt{constructor(t,e,s){this.innerRadius=t;this.outerRadius=t+e;this.width=e;this.elements=s}}class it{constructor(){const t={};for(const e in a){t[a[e].label]=a[e];t[e]=a[e]}this.mlabel=t}static getInstance(){if(!it.instance){it.instance=new it}return it.instance}}class ot{constructor(t,e,s){this.snvType=t;this.color=e;this.count=s}}class rt{constructor(t,e,s,n){this.snvClassMap=new Map;this.svnInnerRadius=t;this.svnWidth=e;this.sampleName=s;this.reference=n;this.bpx=Math.floor(this.reference.totalSize/(this.reference.totalChromosomesAngle*t));this.onePxArcAngle=1/t}map(t){const e=[];for(const s of t.keys()){const n=t.get(s);if(n){const t=n.length;for(let i=0;i<n.length;i++){const o=n[i];const r=this.snvClassMap.get(o.mClass);if(r){this.snvClassMap.set(o.mClass,this.createSnvLegend(o.mClass,++r.count))}else{this.snvClassMap.set(o.mClass,this.createSnvLegend(o.mClass,1))}const a=s;const l=s+this.onePxArcAngle;const c=it.getInstance().mlabel?it.getInstance().mlabel[o.mClass]:undefined;const h={startAngle:a,endAngle:l,innerRadius:this.svnInnerRadius+i*this.svnWidth/t,outerRadius:this.svnInnerRadius+(i+1)*this.svnWidth/t,color:c.color,text:o.gene,dataClass:c.label,mname:o.mname,chr:o.chr,pos:o.position};e.push(h)}}}return e}createSnvLegend(t,e){const s=it.getInstance().mlabel[t];return new ot(s.label,s.color,e)}}class at{constructor(t,e,s,n){this.text=t;this.cnvType=e;this.color=s;this.value=n}}var lt;(function(t){t[t["Loss"]=0]="Loss";t[t["Gain"]=1]="Gain";t[t["Cap"]=2]="Cap"})(lt||(lt={}));class ct{static getColor(t,e){const s=e.cnv;const n=e.cnv.capping;const i=-1*e.cnv.capping;if(t<i){return s.cappedLossColor}else if(t>=i&&t<=0){return s.lossColor}else if(t>0&&t<=n){return s.ampColor}else{return s.cappedAmpColor}}}class ht{constructor(t,e,s,n,i,o=0,r=0,a=""){this.cnvClassMap=new Map;this.cnvInnerRadius=t;this.cnvWidth=e;this.settings=s;this.sampleName=n;this.reference=i;this.cnvMaxValue=o;this.cnvMinValue=r;this.cnvUnit=a;this.gainCapped=this.settings.cnv.capping;this.lossCapped=-1*this.settings.cnv.capping;this.lossOnly=o<=0;this.gainOnly=r>=0;this.onePxArcAngle=1/this.cnvInnerRadius;const l=new at("Max",o>0?lt.Gain:lt.Loss,this.getColor(o),o);const c=new at("Min",r>0?lt.Gain:lt.Loss,this.getColor(r),r);const h=new at("Capping",lt.Loss,this.getColor(r>0?r:o),this.settings.cnv.capping);this.cnvClassMap.set(lt.Gain,l);this.cnvClassMap.set(lt.Loss,c);this.cnvClassMap.set(lt.Cap,h);this.maxAbsValue=Math.max(Math.abs(this.capMaxValue(r)),Math.abs(this.capMaxValue(o)))}map(t){const e=[];t.forEach((t=>{let s=this.calculateStartAngle(t);let n=this.calculateEndAngle(t);if(n-s<this.onePxArcAngle){const t=this.onePxArcAngle-(n-s);s=s-t/2;n=s+t/2}const i=this.calculateInnerRadius(t);const o=this.calculateOuterRadius(t);const r=this.getColor(t.value);const a={startAngle:s,endAngle:n,innerRadius:i,outerRadius:o,color:r,text:t.gene,chr:t.chr,start:t.start,stop:t.stop,value:t.value,unit:this.cnvUnit};e.push(a)}));return e}calculateStartAngle(t){const e=this.reference.chromosomesOrder.indexOf(t.chr);const s=this.reference.chromosomes[e];return s.startAngle+(s.endAngle-s.startAngle)*(Number(t.start)/s.size)}calculateEndAngle(t){const e=this.reference.chromosomesOrder.indexOf(t.chr);const s=this.reference.chromosomes[e];return s.startAngle+(s.endAngle-s.startAngle)*(Number(t.stop)/s.size)}getColor(t){return ct.getColor(t,this.settings)}calculateInnerRadius(t){if(this.gainOnly){return this.cnvInnerRadius}if(this.lossOnly){const e=this.cnvInnerRadius+this.cnvWidth;return e-this.capMinValue(this.cnvWidth*this.capMaxValue(t.value)/this.maxAbsValue)}const e=this.cnvInnerRadius+this.cnvWidth/2;if(Math.sign(t.value)==1){return e}if(Math.sign(t.value)==-1){return e+this.capMinValue(this.capMaxValue(t.value)/this.maxAbsValue*(this.cnvWidth/2))}return 1}calculateOuterRadius(t){const e=this.cnvInnerRadius+this.cnvWidth;if(this.gainOnly){return this.cnvInnerRadius+this.capMinValue(this.cnvWidth*this.capMaxValue(t.value)/this.maxAbsValue)}if(this.lossOnly){return e}const s=this.cnvInnerRadius+this.cnvWidth/2;if(Math.sign(t.value)==1){return s+this.capMinValue(this.capMaxValue(t.value)/this.maxAbsValue*(this.cnvWidth/2))}if(Math.sign(t.value)==-1){return s}return 1}capMaxValue(t){if(Math.sign(t)==1){return t>this.gainCapped?this.gainCapped:t}if(Math.sign(t)==-1){return t<this.lossCapped?this.lossCapped:t}return 0}capMinValue(t,e=1){if(Math.sign(t)==1){return t>e?t:e}if(Math.sign(t)==-1){return t<-1*e?t:-1*e}return 1}}class ut{constructor(t,e){this.points=new Array;this.points=t;this.color=e}}class dt{static createLabel(t,e,s,n,i,o,r,a,l,c,h=false,u,d,p){const g=(t+e)/2;const m=g-Math.PI/2;const f=`rotate(${g*180/Math.PI-90}) translate(${n})${g>Math.PI?"rotate(180)":""}`;const v=g>Math.PI?"end":"";const A=s;const x=n-u;const R=[];const b={x:A*Math.cos(m),y:A*Math.sin(m)};const M={x:x*Math.cos(m),y:x*Math.sin(m)};R.push(b);R.push(M);const C=new ut(R,r);const y={startAngle:t,endAngle:e,innerRadius:s,outerRadius:n,angle:g,value:i,text:o,color:r,transform:f,textAnchor:v,ccAngle:m,line:C,isPrioritized:h,start:c,stop:c,chr:l,mutationsTooltip:d?[d]:undefined,fusionTooltip:p?[p]:undefined};return y}static createMovedLabel(t,e){const s=t.startAngle+e;const n=t.endAngle+e;const i=(s+n)/2;const o=i-Math.PI/2;const r=t.innerRadius;const a=t.outerRadius-2;const l=(a-r)/3;const c=Math.cos(t.ccAngle);const h=Math.sin(t.ccAngle);const u=Math.cos(t.ccAngle+e);const d=Math.sin(t.ccAngle+e);const p=[];const g={x:r*c,y:r*h};const m={x:(r+l)*c,y:(r+l)*h};const f={x:(r+2*l)*u,y:(r+2*l)*d};const v={x:(r+3*l)*u,y:(r+3*l)*d};p.push(g);p.push(m);p.push(f);p.push(v);const A=new ut(p,t.color);const x="rotate("+(i*180/Math.PI-90)+")"+"translate("+t.outerRadius+")"+(i>Math.PI?"rotate(180)":"");const R=i>Math.PI?"end":"";const b=t.mutationsTooltip?t.mutationsTooltip[0].color:t.fusionTooltip?t.fusionTooltip[0].color:undefined;const M={startAngle:s,endAngle:n,innerRadius:t.innerRadius,outerRadius:t.outerRadius,angle:i,value:t.value,text:t.text,transform:x,textAnchor:R,ccAngle:o,color:b,line:A,isPrioritized:t.isPrioritized,start:t.start,stop:t.stop,chr:t.chr,mutationsTooltip:t.mutationsTooltip,fusionTooltip:t.fusionTooltip};return M}}class pt{constructor(t,e,s){this.labelMap=new Map;this.settings=t;this.sampleName=e;this.reference=s}map(t,e=[]){const i=this.settings.rings.labelLinesInnerRadius;const o=i+this.settings.rings.labelsToLinesDistance;t.forEach((t=>{if(t.dt==s){const e=this.calculateStartAngle(t.chr,t.position);const s=this.calculateEndAngle(t.chr,t.position);const n=it.getInstance().mlabel?it.getInstance().mlabel[t.mClass]:undefined;this.addLabelOrMutation(t,t.gene,t.mname,e,s,i,o,n.color,n.label)}if(t.dt==n){const e=G.getColor(t.chrA,t.chrB);if(t.geneA){const s=this.calculateStartAngle(t.chrA,t.posA);const n=this.calculateEndAngle(t.chrA,t.posA);this.addLabelOrFusion(t,t.geneA,t.posA,s,n,i,o,e)}if(t.geneB&&t.geneA!=t.geneB){const s=this.calculateStartAngle(t.chrB,t.posB);const n=this.calculateEndAngle(t.chrB,t.posB);this.addLabelOrFusion(t,t.geneB,t.posB,s,n,i,o,e)}}}));const r=Array.from(this.labelMap.values());r.forEach((t=>{e.forEach((e=>{if(t.stop>=e.start&&e.stop>=t.start&&t.chr==e.chr){const s={value:e.value,color:ct.getColor(e.value,this.settings),chr:e.chr,start:e.start,stop:e.stop};if(t.cnvTooltip){t.cnvTooltip.push(s)}else{t.cnvTooltip=[];t.cnvTooltip.push(s)}}}))}));return Array.from(this.labelMap.values())}addLabelOrMutation(t,e,s,n,i,o,r,a,l){const c=this.labelMap.get(e);const h={mname:s,color:a,dataClass:l,chr:t.chr,position:t.position};if(!c){this.labelMap.set(e,dt.createLabel(n,i,o,r,t.value,e,a,l,t.chr,t.position,t.isPrioritized,this.settings.rings.labelsToLinesGap,h))}else{if(c.mutationsTooltip){c.start=Math.min(c.start,t.position);c.stop=Math.max(c.stop,t.position);c.mutationsTooltip.push(h)}else{c.mutationsTooltip=[];c.start=Math.min(c.start,t.position);c.stop=Math.max(c.stop,t.position);c.mutationsTooltip.push(h)}}}addLabelOrFusion(t,e,s,n,i,o,r,a){const l=this.labelMap.get(e);const c={color:a,chrA:t.chrA,chrB:t.chrB,posA:t.posA,posB:t.posB,geneA:t.geneA,geneB:t.geneB,strandA:t.strandA,strandB:t.strandB};if(!l){this.labelMap.set(e,dt.createLabel(n,i,o,r,t.value,e,a,"Fusion transcript",t.chr,t.position,t.isPrioritized,this.settings.rings.labelsToLinesGap,undefined,c))}else{if(l.fusionTooltip){l.start=Math.min(l.start,s);l.stop=Math.max(l.stop,s);l.fusionTooltip.push(c)}else{l.fusionTooltip=[];l.start=Math.min(l.start,s);l.stop=Math.max(l.stop,s);l.fusionTooltip.push(c)}}}calculateStartAngle(t,e){const s=this.reference.chromosomesOrder.findIndex((e=>e==t));const n=this.reference.chromosomes[s];return n.startAngle+(n.endAngle-n.startAngle)*(Number(e)/n.size)}calculateEndAngle(t,e){const s=this.reference.chromosomesOrder.findIndex((e=>e==t));const n=this.reference.chromosomes[s];return n.startAngle+(n.endAngle-n.startAngle)*(Number(e)/n.size)}}class gt extends nt{constructor(t,e,s){super(t.rings.labelLinesInnerRadius,t.rings.labelsToLinesDistance,e.sort(((t,e)=>t.startAngle<e.startAngle?-1:t.startAngle>e.startAngle?1:0)));this.elementsToDisplay=[];this.settings=t;this.hasPrioritizedGenes=s;const n=2*Math.PI*(t.rings.labelLinesInnerRadius+t.rings.labelsToLinesDistance);this.overlapAngle=this.settings.label.overlapAngleFactor*this.settings.label.fontSize/n;this.calculateCollisions()}calculateCollisions(){this.collisions=[];let t=[];t=this.elements.filter((t=>t.isPrioritized));if(this.settings.label.prioritizeGeneLabelsByGeneSets){this.elementsToDisplay=this.getLabelsWithPrioritizedGenes(t)}else if(this.hasPrioritizedGenes){const t=this.elements.filter((t=>t.isPrioritized));const e=this.getLabelsWithPrioritizedGenes(t);const s=this.elements.filter((t=>!t.isPrioritized));const n=[...s,...e].sort(((t,e)=>t.startAngle-e.startAngle));this.elementsToDisplay=this.getAllLabels(n)}else{this.elementsToDisplay=this.getLabelsWithPrioritizedGenes(this.elements)}}getLabelsWithPrioritizedGenes(t){const e=[];let s={endAngle:0};t.forEach(((t,n)=>{if(n==0){e.push(t);s=t}else{const n=s.endAngle-t.startAngle+this.overlapAngle;if(n>0&&n<this.settings.label.maxDeltaAngle){const i=dt.createMovedLabel(t,n);e===null||e===void 0?void 0:e.push(i);s=i}if(n<=0){e.push(t);s=t}}}));return e}getAllLabels(t){var e;const s=[];let n={endAngle:0};const i=t.length;let o=-1;for(let r=0;r<t.length;r++){const a=t[r];if(a.isPrioritized){s.push(a);o=r;n=a;continue}if(r==0){if(i>1){if(this.isElementOverlappingNextCancerGene(t,o,a,0)){continue}s.push(a);n=a}continue}const l=n.endAngle-a.startAngle+this.overlapAngle;if(l>0&&l<this.settings.label.maxDeltaAngle){if(r==length-1){s.push(a);continue}if(this.isElementOverlappingNextCancerGene(t,o,a,l)){continue}const i=dt.createMovedLabel(a,l);(e=this.collisions)===null||e===void 0?void 0:e.push(i);s.push(a);n=i}if(l<=0){if(this.isElementOverlappingNextCancerGene(t,o,a,0)){continue}s.push(a);n=a}}return s}isElementOverlappingNextCancerGene(t,e,s,n){const i=this.getNextLabelWithCancerGene(t,e);if(i){const t=s.endAngle+n-i.startAngle+this.overlapAngle;if(t>0){return true}}return false}getNextLabelWithCancerGene(t,e){return t.find(((t,s)=>t.isPrioritized&&s>e))}}class mt{constructor(t,e,s,n){this.nonExonicInnerRadius=t;this.nonExonicWidht=e;this.sampleName=s;this.reference=n;this.onePxArcAngle=1/t}map(t){const e=this.nonExonicInnerRadius;const s=e+this.nonExonicWidht;const n=[];t.forEach((t=>{const i=it.getInstance().mlabel?it.getInstance().mlabel[t.mClass]:undefined;const o=this.calculateStartAngle(t);const r=this.calculateEndAngle(t);const a={startAngle:o,endAngle:r,innerRadius:e,outerRadius:s,color:i.color,text:t.gene,dataClass:i.label,mname:t.mname,chr:t.chr,pos:t.position};n.push(a)}));return n}calculateStartAngle(t){const e=this.reference.chromosomesOrder.indexOf(t.chr);const s=this.reference.chromosomes[e];return s.startAngle+(s.endAngle-s.startAngle)*(Number(t.position)/s.size)-this.onePxArcAngle}calculateEndAngle(t){const e=this.reference.chromosomesOrder.indexOf(t.chr);const s=this.reference.chromosomes[e];return this.onePxArcAngle+s.startAngle+(s.endAngle-s.startAngle)*(Number(t.position)/s.size)}}class ft{constructor(t,e,s,n){this.lohInnerRadius=t;this.lohWidth=e;this.sampleName=s;this.reference=n}map(t){const e=[];t.forEach((t=>{const s=this.calculateStartAngle(t);const n=this.calculateEndAngle(t);const i=this.lohInnerRadius;const o=i+this.lohWidth;const r=Z.provide(t.segmean);const a={startAngle:s,endAngle:n,innerRadius:i,outerRadius:o,color:r,text:t.gene,chr:t.chr,start:t.start,stop:t.stop,value:t.segmean};e.push(a)}));return e}calculateStartAngle(t){const e=this.reference.chromosomesOrder.indexOf(t.chr);const s=this.reference.chromosomes[e];return s.startAngle+(s.endAngle-s.startAngle)*(Number(t.start)/s.size)}calculateEndAngle(t){const e=this.reference.chromosomesOrder.indexOf(t.chr);const s=this.reference.chromosomes[e];return s.startAngle+(s.endAngle-s.startAngle)*(Number(t.stop)/s.size)}}class vt{constructor(t,e,s,n,i,o){this.labelsRing=t;this.chromosomesRing=e;this.nonExonicArcRing=s;this.snvArcRing=n;this.cnvArcRing=i;this.lohArcRing=o}}class At{constructor(t,e,s,n,i){this.nonExonicArcRing=undefined;this.settings=t;this.dataMapper=e;this.reference=s;this.sampleName=n;this.genesetName=i}map(t){const e=this.dataMapper.map(t);const n=new pt(this.settings,this.sampleName,this.reference);const i=n.map(e.labelData,e.cnvData);const o=new gt(this.settings,i,e.hasPrioritizedGenes);const r=new nt(this.settings.rings.chromosomeInnerRadius,this.settings.rings.chromosomeWidth,this.reference.chromosomes);const a=new mt(e.nonExonicInnerRadius,this.settings.rings.nonExonicRingWidth,this.sampleName,this.reference);const l=a.map(e.nonExonicSnvData);if(l.length>0){this.nonExonicArcRing=new nt(e.nonExonicInnerRadius,this.settings.rings.nonExonicRingWidth,l)}this.snvArcsMapper=new rt(e.snvInnerRadius,this.settings.rings.snvRingWidth,this.sampleName,this.reference);const c=this.snvArcsMapper.map(e.snvRingDataMap);if(c.length>0){this.snvArcRing=new nt(e.snvInnerRadius,this.settings.rings.snvRingWidth,c)}const h=new ft(e.lohInnerRadius,this.settings.rings.lohRingWidth,this.sampleName,this.reference);const u=h.map(e.lohData);if(u.length>0){this.lohArcRing=new nt(e.lohInnerRadius,this.settings.rings.lohRingWidth,u)}this.cnvArcsMapper=new ht(e.cnvInnerRadius,this.settings.rings.cnvRingWidth,this.settings,this.sampleName,this.reference,e.cnvMaxValue,e.cnvMinValue,this.settings.cnv.unit);const d=this.cnvArcsMapper.map(e.cnvData);if(d.length>0){this.cnvArcRing=new nt(e.cnvInnerRadius,this.settings.rings.cnvRingWidth,d)}const p=new Y(e.fusionRadius,this.sampleName,this.reference);const g=p.map(e.fusionData);let m;if(this.settings.legend.lohLegendEnabled&&e.lohMinValue&&e.lohMaxValue){m=new tt(e.lohMinValue,e.lohMaxValue)}const f=new J(this.settings.legend.snvTitle,this.settings.legend.cnvTitle,this.settings.legend.lohTitle,this.settings.legend.fusionTitle,this.snvArcsMapper?this.snvArcsMapper.snvClassMap:new Map,this.cnvArcsMapper?this.cnvArcsMapper.cnvClassMap:new Map,g.length>0,m);const v=new vt(o,r,this.nonExonicArcRing,this.snvArcRing,this.cnvArcRing,this.lohArcRing);return new st(this.settings,v,f,g,e.filteredSnvData.length,e.snvData.length,this.genesetName,t.filter((t=>t.dt==s)).length)}}class xt{constructor(t){this.settings=t}map(t){var e,s;const n=t.args.chromosomes;const i=t.args.genome.majorchr;const o=t.args.sampleName;const r=t.args.genome;const a=((e=r===null||r===void 0?void 0:r.geneset)===null||e===void 0?void 0:e[0])?r.geneset[0].lst:[];const l=((s=r===null||r===void 0?void 0:r.geneset)===null||s===void 0?void 0:s[0])?r.geneset[0].name:"";const c=t.args.data;const h=new q(this.settings,i,n);const u=new _(this.settings,h,o,a);return new At(this.settings,u,h,o,l).map(c)}}xt.snvClassLayer={M:"exonic",E:"exonic",F:"exonic",N:"exonic",S:"exonic",D:"exonic",I:"exonic",P:"exonic",L:"exonic",Utr3:"exonic",Utr5:"exonic",mnv:"non-exonic",ITD:"non-exonic",insertion:"non-exonic",deletion:"non-exonic",Intron:"non-exonic",X:"non-exonic",noncoding:"non-exonic"};class Rt{constructor(t,e){this.cvnCapping=t;this.onClickCallback=e}map(t){const e=[];let s=0;if(t.snvClassMap){this.mapSnv(t,e,s++)}if(t.cnvClassMap){this.mapCnv(t,e,s++)}if(t.lohLegend){this.mapLoh(t,e,s++)}if(t.fusionLegend){this.mapFusion(t,e,s++)}return e}mapSnv(t,e,s){const n=[];let i=0;for(const[e,s]of t.snvClassMap){n.push({termid:t.snvTitle,key:e,text:`${s.snvType} (${s.count})`,color:s.color,order:i++,border:"1px solid #ccc"})}e.push({name:t.snvTitle,order:s,items:n})}mapCnv(t,e,s){if(!t.cnvClassMap)return;const n=t.cnvClassMap.get(lt.Gain);const i=t.cnvClassMap.get(lt.Loss);const o=t.cnvClassMap.get(lt.Cap);if(n&&i&&o){let r=0;const a=[];if(n.value>0){a.push({termid:t.cnvTitle,key:lt.Gain,text:`Max: ${n.value}`,color:n.color,order:r++,border:"1px solid #ccc"})}if(i.value<0){a.push({termid:t.cnvTitle,key:lt.Loss,text:`Min: ${i.value}`,color:i.color,order:r++,border:"1px solid #ccc"})}a.push({termid:t.cnvTitle,key:lt.Cap,text:`Capping: ${o.value}`,color:o.color,order:r++,border:"1px solid #ccc",onClickCallback:this.onClickCallback});e.push({name:t.cnvTitle,order:s,items:a})}}mapLoh(t,e,s){if(!t.lohLegend)return;const n=[];n.push({termid:t.lohTitle,key:"min",text:"min",color:t.lohLegend.colorStartValue,order:0,border:"1px solid #ccc"});n.push({termid:t.lohTitle,key:"max",text:"max",color:t.lohLegend.colorEndValue,order:1,border:"1px solid #ccc"});e.push({name:t.lohTitle,order:s,items:n})}mapFusion(t,e,s){const n=[];n.push({termid:t.fusionTitle,key:$.Interchromosomal,text:"Interchromosomal",color:$.Interchromosomal.valueOf(),order:0,border:"1px solid #ccc"});n.push({termid:t.fusionTitle,key:$.Intrachromosomal,text:"Intrachromosomal",color:$.Intrachromosomal.valueOf(),order:1,border:"1px solid #ccc"});e.push({name:t.fusionTitle,order:s,items:n})}}class bt{constructor(t,e,s){this.fontSize=e;this.legendJSONMapper=new Rt(t,s)}render(t,e,s,n,i){const o=g({holder:t.append("g"),rectFillFxn:t=>t.color,iconStroke:"#aaa"});const r={xOffset:s};const a=this.legendJSONMapper.map(e);o(a,{settings:Object.assign({},{svgw:n,svgh:i,dimensions:r,fontsize:this.fontSize})})}}class Mt{constructor(t,e,s){this.padAngle=t;this.innerRadius=e;this.outerRadius=s}render(t,e){const s=R().padAngle(this.padAngle).value((t=>t.size)).sort(null);const n=s(e);const i=u().innerRadius(this.innerRadius).outerRadius(this.outerRadius);const o=t.append("g");o.selectAll("path").data(n).enter().append("path").attr("d",i).attr("fill","black");o.selectAll("text").data(n).enter().append("text").attr("transform",(t=>`translate(${i.centroid(t)}) rotate(${t.data.angle*180/Math.PI-90})${t.data.angle>Math.PI?"rotate(180)":""}`)).attr("dy","0.35em").attr("text-anchor","middle").text((t=>t.data.text)).style("fill","white")}}class Ct{constructor(t,e){this.animationDuration=t;this.geneClickListener=e}render(t,e,s){const n=t.append("g");const i=f().x((t=>t.x)).y((t=>t.y));const o=P.create();n.selectAll(".group").data(e).enter().append("g").attr("class","group").each(((t,e,s)=>{const n=l(s[e]);n.append("text").attr("class","chord-text").attr("dy",".35em").attr("transform",t.transform).style("text-anchor",t.textAnchor).style("font-size","12px").style("fill",t.color).style("cursor","pointer").text(t.text).on("click",(()=>{if(t.mutationsTooltip){this.geneClickListener(t.text,t.mutationsTooltip.map((t=>t.mname)))}})).on("mouseover",(e=>{o.d.style("padding","2px").html(this.createTooltipHtml(t));o.show(e.x,e.y)})).on("mouseout",(()=>{o.hide()}));n.append("path").attr("class","chord-tick").datum(t.line.points).style("stroke",t.color).style("fill","none").attr("d",i)}));n.selectAll(".group").each(((t,e,n)=>{const o=s?s.find((e=>e.text===t.text)):undefined;if(o){const t=l(n[e]);t.selectAll(".chord-text").datum(o).transition().duration(this.animationDuration).attr("transform",o.transform).style("text-anchor",o.textAnchor);t.selectAll(".chord-tick").datum(o.line.points).transition().duration(this.animationDuration).style("fill","none").attr("d",i)}}))}createTooltipHtml(t){let e="";if(t.mutationsTooltip){e+=`Gene: ${t.text} <br />`;t.mutationsTooltip.forEach((t=>{e+=`Consequence: ${t.mname} <span style="color: ${t.color}" >${t.dataClass}</span> <br />Mutation: ${t.chr}:${t.position} <br />`}))}if(t.fusionTooltip){e+=`Data type: Fusion transcript <br />`;t.fusionTooltip.forEach((t=>{e+=`Break points: ${t.geneA?t.geneA:""} ${t.chrA}:${t.posA} ${t.strandA=="+"?"forward":"reverse"} > `+`${t.geneB?t.geneB:""} ${t.chrB}:${t.posB} ${t.strandB=="+"?"forward":"reverse"} <br /> `}))}if(t.cnvTooltip){t.cnvTooltip.forEach((t=>{e+=`CNV: <span style="color: ${t.color}">${t.value}</span> ${t.chr}:${t.start}-${t.stop}`}))}return e}}function yt(t={}){const e={downloadImgName:"disco.plot",rings:{nonExonicRingWidth:20,snvRingWidth:20,lohRingWidth:20,cnvRingWidth:30,snvRingFilters:["exonic"],chromosomeInnerRadius:190,chromosomeWidth:20,labelLinesInnerRadius:210,labelsToLinesDistance:30,labelsToLinesGap:2,nonExonicRingEnabled:true,nonExonicFilterValues:["non-exonic"]},verticalPadding:70,horizontalPadding:500,layerScaler:1,padAngle:.002,label:{fontSize:12,maxDeltaAngle:.05,animationDuration:1e3,overlapAngleFactor:5,prioritizeGeneLabelsByGeneSets:false,showPrioritizeGeneLabelsByGeneSets:false},cnv:{capping:5,ampColor:"#D6683C",lossColor:"#67a9cf",cappedAmpColor:"#8B0000",cappedLossColor:"#00008B",unit:"Unit"},snv:{maxMutationCount:1e4},legend:{snvTitle:"SNV",cnvTitle:"CNV",lohTitle:"LOH",fusionTitle:"SV",lohLegendEnabled:true,fontSize:12,rowHeight:48},menu:{padding:5}};return c(e,t)}class Lt{constructor(t){this.geneClickListener=t}render(t,e){const s=u();const n=t.append("g");const i=P.create();n.selectAll("path").data(e).enter().append("path").attr("d",(t=>s(t))).attr("fill",(t=>t.color)).on("mouseover",((t,e)=>{i.d.style("padding","2px").html(`Gene: ${e.text} <br />${e.mname} <br /> <span style="color:${e.color}">${e.dataClass}</span> <br /> ${e.chr}:${e.pos}`);i.show(t.x,t.y)})).on("mouseout",(()=>{i.hide()})).on("click",((t,e)=>{this.geneClickListener(e.text,[e.mname])}))}}class It{constructor(t,e){this.svnWidth=t;this.geneClickListener=e}render(t,e){if(e.length>0){const s=e[0].innerRadius;const n=new B(s,this.svnWidth,"#6464641A");n.render(t)}const s=u();const n=t.append("g");const i=P.create();n.selectAll("path").data(e).enter().append("path").attr("d",(t=>s(t))).attr("fill",(t=>t.color)).on("mouseover",((t,e)=>{i.d.style("padding","2px").html(`Gene: ${e.text} <br />${e.mname} <br /> <span style="color:${e.color}">${e.dataClass}</span> <br /> ${e.chr}:${e.pos}`);i.show(t.x,t.y)})).on("mouseout",(()=>{i.hide()})).on("click",((t,e)=>{this.geneClickListener(e.text,[e.mname])}))}}class wt{render(t,e){const s=u();const n=t.append("g");const i=P.create();n.selectAll("path").data(e).enter().append("path").attr("d",(t=>s(t))).attr("fill",(t=>t.color)).on("mouseover",((t,e)=>{i.d.style("padding","2px").html(`Loss of Heterozygosity <br /> ${e.chr}:${e.start}-${e.stop}`);i.show(t.x,t.y)})).on("mouseout",(()=>{i.hide()}))}}class Et{constructor(t){this.menuPadding=t}render(t,e){const s=u();const n=t.append("g");const i=P.create();n.selectAll("path").data(e).enter().append("path").attr("d",(t=>s(t))).attr("fill",(t=>t.color)).on("mouseover",((t,e)=>{i.d.style("padding","2px").html(`Copy Number Variation <br /> ${e.chr}:${e.start}-${e.stop} <br /> ${e.unit}: ${e.value} `);i.show(t.x,t.y)})).on("mouseout",(()=>{i.hide()}))}}class Dt{constructor(t){this.type="Disco";this.opts=t}getState(t){return t.plots.find((t=>t.id===this.id))}main(){return e(this,void 0,void 0,(function*(){const t=new U(this);const e=this.state.settings;const s=new xt(e);const n=s.map(this.app.getState());const i=this.opts.holder;i.selectAll("*").remove();const o=new bt(e.cnv.capping,e.label.fontSize,t.cappingClickCallback);const r=new j(this.getRingRenderers(e,t.geneClickListener),o,t.downloadClickListener,t.prioritizeGenesCheckboxListener);r.render(i,n)}))}getRingRenderers(t,e){const s=new Mt(t.padAngle,t.rings.chromosomeInnerRadius,t.rings.chromosomeInnerRadius+t.rings.chromosomeWidth);const n=new Ct(t.label.animationDuration,e);const i=new Lt(e);const o=new It(t.rings.snvRingWidth,e);const r=new Et(t.menu.padding);const a=new wt;const l=new Map;l.set(et.CHROMOSOME,s);l.set(et.LABEL,n);l.set(et.NONEXONICSNV,i);l.set(et.SNV,o);l.set(et.CNV,r);l.set(et.LOH,a);return l}}const Ot=h(Dt);const St=Ot;function Tt(t){return e(this,void 0,void 0,(function*(){return{chartType:"Disco",subfolder:"disco",extension:"ts",settings:yt(t.overrides)}}))}export{St as componentInit,Ot as discoInit,Tt as getPlotConfig};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{aN as t,ac as e,aP as l,R as n}from"./app-
|
|
1
|
+
import{aN as t,ac as e,aP as l,R as n}from"./app-42d73775.js";import{m as i,a,b as o,c as s,f as p,e as c}from"./uiUtils-7318ef28.js";import{launch as d}from"./launch.adhoc-06294b93.js";import"path";import"./plot.app-fd35d881.js";import"./recover-aaa8c3c9.js";import"./filter-d70ef7ac.js";import"./table-fe7980cf.js";import"./samplelst-68f413df.js";import"./termsetting-b86fec90.js";function r(t,e,l){const n=t.append("div").style("margin","20px 20px 20px 40px").style("font-family","'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif").style("place-items","center left").style("overflow","hidden").classed("sjpp-app-ui",true).classed("sjpp-disco-ui",true);const o={data:[]};i(n,"Select Genome").style("font-size","1.15em").style("padding","10px 0px").style("color","#003366");y(n,e,o);i(n,"Provide Data").style("font-size","1.15em").style("padding","10px 0px 5px 0px").style("color","#003366");n.append("div").style("opacity",.75).style("padding","10px 10px 15px 20px").style("width","65vw").style("line-height","1.5em").html('<p>The plot accepts multiple data types. Input fields for each data type are available in the tabs below. Upload a file or paste data in at least one data type tab and click "Create Disco Plot". <a href="https://proteinpaint.stjude.org/ppdemo/hg38/disco/discoDemoData.tar.gz" target="Demo data">Download example files</a></p>');const s=n.append("div").style("margin-left","2vw");f(s,o);const p=n.append("div").style("display","flex").style("align-items","center").style("padding","15px 0px");h(p,o,e,n,t);a(p,o,".disco_input");if(l)window["doms"]=o;return o}function y(t,e,l){const n=t.append("div").style("margin-left","40px");const i=o(n,e).style("border","1px solid rgb(138, 177, 212)");l.genome=i.node()}function f(e,n){const i=[{label:"SNV Indel",active:true,callback:(t,e)=>l(this,void 0,void 0,(function*(){e.key="snv";const t=`<ol>\n\t\t\t\t\t<li>chr</li>\n\t\t\t\t\t<li>position</li>\n\t\t\t\t\t<li>gene</li>\n\t\t\t\t\t<li>aachange</li>\n\t\t\t\t\t<li>class</li></ol>\n\t\t\t\t\t<p>Example:</p>\n<pre style="margin-left: 10px;">\nchr1\t226252135\tH3F3A\tK28M\tM\nchr2\t98765432\tTestGene\tTestMutation\tF\n</pre>`;m(e,n,t)}))},{label:"SV",active:false,callback:(t,e)=>l(this,void 0,void 0,(function*(){e.key="sv";const t=`<ol>\n\t\t\t\t\t<li>chrA</li>\n\t\t\t\t\t<li>posA</li>\n\t\t\t\t\t<li>geneA (optional)</li>\n\t\t\t\t\t<li>chrB</li>\n\t\t\t\t\t<li>posB</li>\n\t\t\t\t\t<li>geneB (optional)</li>\n\t\t\t\t</ol>\n\t\t\t\t<p>Example (with genes):</p>\n<pre style="margin-left: 10px;">\nchr6\t3067605\tMDC1\tchr12\t61521661\tKMT2D\n</pre>\n\t\t\t\t<p>Example (without genes):</p>\n<pre style="margin-left: 10px;">\nchr6\t3067605\tchr12\t61521661\n</pre>`;m(e,n,t)}))},{label:"CNV",active:false,callback:(t,e)=>l(this,void 0,void 0,(function*(){e.key="cnv";const t=`<ol>\n\t\t\t\t<li>chr</li>\n\t\t\t\t<li>start</li>\n\t\t\t\t<li>stop</li>\n\t\t\t\t<li>value</li>\n\t\t\t\t</ol>\n\t\t\t\t<p>Example:</p>\n<pre style="margin-left: 10px;">\nchr1\t1\t100000000\t0.5\nchr1\t100000000\t200000000\t-0.5\n</pre>`;m(e,n,t)}))}];new t({holder:e,tabs:i,tabsPosition:"vertical",linePosition:"right"}).main()}function m(t,e,l){t.contentHolder.style("border","none").style("display","block").style("padding-left","30px");x(t,e);t.contentHolder.append("div").style("padding","15px 0px 0px 10px").style("opacity",.75).text(`Provide ${t.label} data in tab delimited format with the following columns:`).append("span").html(l);delete t.callback}function x(e,i){const a=95;const o=[{label:"Select File",active:true,width:a,callback:(t,a)=>l(this,void 0,void 0,(function*(){const t=e.key;a.contentHolder.style("border","none").style("display","block");n(a.contentHolder);a.contentHolder.append("div").style("padding","0px 0px 5px 15px").style("opacity",.65).text(`Select a local file`);u(a,i,t);delete a.callback}))},{label:"Paste Data",active:false,width:a,callback:(t,a)=>l(this,void 0,void 0,(function*(){const t=e.key;a.contentHolder.style("border","none").style("display","block");n(a.contentHolder);v(a,i,t);delete a.callback}))}];new t({holder:e.contentHolder,tabs:o}).main()}function u(t,e,l){const n=t.contentHolder.append("div").style("display","inline-block");const i=p(n).classed("disco_input",true);i.on("change",(t=>{const n=t.target.files[0];const i=new FileReader;i.onload=t=>{e.data[l+"Text"]=t.target.result};i.readAsText(n,"utf8")}))}function v(t,e,n){const i=t.contentHolder.append("div").style("display","block");const a=c({div:i,cols:50}).style("border","1px solid rgb(138, 177, 212)").style("margin","0px 0px 0px 20px").classed("disco_input",true).on("keyup",(()=>l(this,void 0,void 0,(function*(){e.data[n+"Text"]=a.property("value").trim()}))))}function h(t,l,n,i,a){const o=s({div:t,text:"Create Disco Plot"});const p=t.append("div");o.style("margin-right","10px").style("font-size","16px").classed("sjpp-ui-submitBtn",true).attr("type","submit").on("click",(()=>{if(!l.data||l.data==undefined){const t=p.append("div").style("display","inline-block").style("max-width","20vw");e(t,"Please provide data");setTimeout((()=>t.remove()),2e3)}else{const t=n[l.genome.options[l.genome.selectedIndex].text];i.remove();d(l.data,t,a);b(a,n)}}))}function b(t,e){t.append("button").html("« Back").on("click",(()=>{t.selectAll("*").remove();r(t,e,false)}))}export{r as init_discoplotUI};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{P as e,R as t,V as n,a as r,M as o,E as i}from"./sampleScatter.rendererThree-
|
|
1
|
+
import{P as e,R as t,V as n,a as r,M as o,E as i}from"./sampleScatter.rendererThree-22c0c6aa.js";import"./app-42d73775.js";import"path";const s=new e;const a=new t;const c=new n;const l=new r;const p=new r;const u=new r;const d=new o;class f extends i{constructor(e,t,n){super();n.style.touchAction="none";let r=null,o=null;const i=[];const f=this;function m(){n.addEventListener("pointermove",E);n.addEventListener("pointerdown",g);n.addEventListener("pointerup",j);n.addEventListener("pointerleave",j)}function v(){n.removeEventListener("pointermove",E);n.removeEventListener("pointerdown",g);n.removeEventListener("pointerup",j);n.removeEventListener("pointerleave",j);n.style.cursor=""}function h(){v()}function y(){return e}function b(){return a}function E(m){if(f.enabled===false)return;x(m);a.setFromCamera(c,t);if(r){if(a.ray.intersectPlane(s,p)){r.position.copy(p.sub(l).applyMatrix4(d))}f.dispatchEvent({type:"drag",object:r});return}if(m.pointerType==="mouse"||m.pointerType==="pen"){i.length=0;a.setFromCamera(c,t);a.intersectObjects(e,true,i);if(i.length>0){const e=i[0].object;s.setFromNormalAndCoplanarPoint(t.getWorldDirection(s.normal),u.setFromMatrixPosition(e.matrixWorld));if(o!==e&&o!==null){f.dispatchEvent({type:"hoveroff",object:o});n.style.cursor="auto";o=null}if(o!==e){f.dispatchEvent({type:"hoveron",object:e});n.style.cursor="pointer";o=e}}else{if(o!==null){f.dispatchEvent({type:"hoveroff",object:o});n.style.cursor="auto";o=null}}}}function g(o){if(f.enabled===false)return;x(o);i.length=0;a.setFromCamera(c,t);a.intersectObjects(e,true,i);if(i.length>0){r=f.transformGroup===true?e[0]:i[0].object;s.setFromNormalAndCoplanarPoint(t.getWorldDirection(s.normal),u.setFromMatrixPosition(r.matrixWorld));if(a.ray.intersectPlane(s,p)){d.copy(r.parent.matrixWorld).invert();l.copy(p).sub(u.setFromMatrixPosition(r.matrixWorld))}n.style.cursor="move";f.dispatchEvent({type:"dragstart",object:r})}}function j(){if(f.enabled===false)return;if(r){f.dispatchEvent({type:"dragend",object:r});r=null}n.style.cursor=o?"pointer":"auto"}function x(e){const t=n.getBoundingClientRect();c.x=(e.clientX-t.left)/t.width*2-1;c.y=-(e.clientY-t.top)/t.height*2+1}m();this.enabled=true;this.transformGroup=false;this.activate=m;this.deactivate=v;this.dispose=h;this.getObjects=y;this.getRaycaster=b}}export{f as DragControls};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{E as e,a as t,b as n,T as o,Q as a,S as i,V as s}from"./sampleScatter.rendererThree-d3cafc37.js";import"./app-3f91f0f7.js";import"path";const c={type:"change"};const r={type:"start"};const l={type:"end"};class m extends e{constructor(e,m){super();this.object=e;this.domElement=m;this.domElement.style.touchAction="none";this.enabled=true;this.target=new t;this.minDistance=0;this.maxDistance=Infinity;this.minZoom=0;this.maxZoom=Infinity;this.minPolarAngle=0;this.maxPolarAngle=Math.PI;this.minAzimuthAngle=-Infinity;this.maxAzimuthAngle=Infinity;this.enableDamping=false;this.dampingFactor=.05;this.enableZoom=true;this.zoomSpeed=1;this.enableRotate=true;this.rotateSpeed=1;this.enablePan=true;this.panSpeed=1;this.screenSpacePanning=true;this.keyPanSpeed=7;this.autoRotate=false;this.autoRotateSpeed=2;this.keys={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"};this.mouseButtons={LEFT:n.ROTATE,MIDDLE:n.DOLLY,RIGHT:n.PAN};this.touches={ONE:o.ROTATE,TWO:o.DOLLY_PAN};this.target0=this.target.clone();this.position0=this.object.position.clone();this.zoom0=this.object.zoom;this._domElementKeyEvents=null;this.getPolarAngle=function(){return d.phi};this.getAzimuthalAngle=function(){return d.theta};this.getDistance=function(){return this.object.position.distanceTo(this.target)};this.listenToKeyEvents=function(e){e.addEventListener("keydown",me);this._domElementKeyEvents=e};this.stopListenToKeyEvents=function(){this._domElementKeyEvents.removeEventListener("keydown",me);this._domElementKeyEvents=null};this.saveState=function(){u.target0.copy(u.target);u.position0.copy(u.object.position);u.zoom0=u.object.zoom};this.reset=function(){u.target.copy(u.target0);u.object.position.copy(u.position0);u.object.zoom=u.zoom0;u.object.updateProjectionMatrix();u.dispatchEvent(c);u.update();f=p.NONE};this.update=function(){const n=new t;const o=(new a).setFromUnitVectors(e.up,new t(0,1,0));const i=o.clone().invert();const s=new t;const r=new a;const l=2*Math.PI;return function e(){const t=u.object.position;n.copy(t).sub(u.target);n.applyQuaternion(o);d.setFromVector3(n);if(u.autoRotate&&f===p.NONE){x(I())}if(u.enableDamping){d.theta+=b.theta*u.dampingFactor;d.phi+=b.phi*u.dampingFactor}else{d.theta+=b.theta;d.phi+=b.phi}let a=u.minAzimuthAngle;let m=u.maxAzimuthAngle;if(isFinite(a)&&isFinite(m)){if(a<-Math.PI)a+=l;else if(a>Math.PI)a-=l;if(m<-Math.PI)m+=l;else if(m>Math.PI)m-=l;if(a<=m){d.theta=Math.max(a,Math.min(m,d.theta))}else{d.theta=d.theta>(a+m)/2?Math.max(a,d.theta):Math.min(m,d.theta)}}d.phi=Math.max(u.minPolarAngle,Math.min(u.maxPolarAngle,d.phi));d.makeSafe();d.radius*=E;d.radius=Math.max(u.minDistance,Math.min(u.maxDistance,d.radius));if(u.enableDamping===true){u.target.addScaledVector(g,u.dampingFactor)}else{u.target.add(g)}n.setFromSpherical(d);n.applyQuaternion(i);t.copy(u.target).add(n);u.object.lookAt(u.target);if(u.enableDamping===true){b.theta*=1-u.dampingFactor;b.phi*=1-u.dampingFactor;g.multiplyScalar(1-u.dampingFactor)}else{b.set(0,0,0);g.set(0,0,0)}E=1;if(y||s.distanceToSquared(u.object.position)>h||8*(1-r.dot(u.object.quaternion))>h){u.dispatchEvent(c);s.copy(u.object.position);r.copy(u.object.quaternion);y=false;return true}return false}}();this.dispose=function(){u.domElement.removeEventListener("contextmenu",fe);u.domElement.removeEventListener("pointerdown",ae);u.domElement.removeEventListener("pointercancel",se);u.domElement.removeEventListener("wheel",le);u.domElement.removeEventListener("pointermove",ie);u.domElement.removeEventListener("pointerup",se);if(u._domElementKeyEvents!==null){u._domElementKeyEvents.removeEventListener("keydown",me);u._domElementKeyEvents=null}};const u=this;const p={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6};let f=p.NONE;const h=1e-6;const d=new i;const b=new i;let E=1;const g=new t;let y=false;const O=new s;const P=new s;const T=new s;const v=new s;const A=new s;const L=new s;const w=new s;const N=new s;const j=new s;const M=[];const k={};function I(){return 2*Math.PI/60/60*u.autoRotateSpeed}function R(){return Math.pow(.95,u.zoomSpeed)}function x(e){b.theta-=e}function S(e){b.phi-=e}const Y=function(){const e=new t;return function t(n,o){e.setFromMatrixColumn(o,0);e.multiplyScalar(-n);g.add(e)}}();const D=function(){const e=new t;return function t(n,o){if(u.screenSpacePanning===true){e.setFromMatrixColumn(o,1)}else{e.setFromMatrixColumn(o,0);e.crossVectors(u.object.up,e)}e.multiplyScalar(n);g.add(e)}}();const _=function(){const e=new t;return function t(n,o){const a=u.domElement;if(u.object.isPerspectiveCamera){const t=u.object.position;e.copy(t).sub(u.target);let i=e.length();i*=Math.tan(u.object.fov/2*Math.PI/180);Y(2*n*i/a.clientHeight,u.object.matrix);D(2*o*i/a.clientHeight,u.object.matrix)}else if(u.object.isOrthographicCamera){Y(n*(u.object.right-u.object.left)/u.object.zoom/a.clientWidth,u.object.matrix);D(o*(u.object.top-u.object.bottom)/u.object.zoom/a.clientHeight,u.object.matrix)}else{console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.");u.enablePan=false}}}();function H(e){if(u.object.isPerspectiveCamera){E/=e}else if(u.object.isOrthographicCamera){u.object.zoom=Math.max(u.minZoom,Math.min(u.maxZoom,u.object.zoom*e));u.object.updateProjectionMatrix();y=true}else{console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.");u.enableZoom=false}}function K(e){if(u.object.isPerspectiveCamera){E*=e}else if(u.object.isOrthographicCamera){u.object.zoom=Math.max(u.minZoom,Math.min(u.maxZoom,u.object.zoom/e));u.object.updateProjectionMatrix();y=true}else{console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.");u.enableZoom=false}}function C(e){O.set(e.clientX,e.clientY)}function z(e){w.set(e.clientX,e.clientY)}function X(e){v.set(e.clientX,e.clientY)}function Z(e){P.set(e.clientX,e.clientY);T.subVectors(P,O).multiplyScalar(u.rotateSpeed);const t=u.domElement;x(2*Math.PI*T.x/t.clientHeight);S(2*Math.PI*T.y/t.clientHeight);O.copy(P);u.update()}function F(e){N.set(e.clientX,e.clientY);j.subVectors(N,w);if(j.y>0){H(R())}else if(j.y<0){K(R())}w.copy(N);u.update()}function U(e){A.set(e.clientX,e.clientY);L.subVectors(A,v).multiplyScalar(u.panSpeed);_(L.x,L.y);v.copy(A);u.update()}function V(e){if(e.deltaY<0){K(R())}else if(e.deltaY>0){H(R())}u.update()}function G(e){let t=false;switch(e.code){case u.keys.UP:if(e.ctrlKey||e.metaKey||e.shiftKey){S(2*Math.PI*u.rotateSpeed/u.domElement.clientHeight)}else{_(0,u.keyPanSpeed)}t=true;break;case u.keys.BOTTOM:if(e.ctrlKey||e.metaKey||e.shiftKey){S(-2*Math.PI*u.rotateSpeed/u.domElement.clientHeight)}else{_(0,-u.keyPanSpeed)}t=true;break;case u.keys.LEFT:if(e.ctrlKey||e.metaKey||e.shiftKey){x(2*Math.PI*u.rotateSpeed/u.domElement.clientHeight)}else{_(u.keyPanSpeed,0)}t=true;break;case u.keys.RIGHT:if(e.ctrlKey||e.metaKey||e.shiftKey){x(-2*Math.PI*u.rotateSpeed/u.domElement.clientHeight)}else{_(-u.keyPanSpeed,0)}t=true;break}if(t){e.preventDefault();u.update()}}function B(){if(M.length===1){O.set(M[0].pageX,M[0].pageY)}else{const e=.5*(M[0].pageX+M[1].pageX);const t=.5*(M[0].pageY+M[1].pageY);O.set(e,t)}}function W(){if(M.length===1){v.set(M[0].pageX,M[0].pageY)}else{const e=.5*(M[0].pageX+M[1].pageX);const t=.5*(M[0].pageY+M[1].pageY);v.set(e,t)}}function q(){const e=M[0].pageX-M[1].pageX;const t=M[0].pageY-M[1].pageY;const n=Math.sqrt(e*e+t*t);w.set(0,n)}function Q(){if(u.enableZoom)q();if(u.enablePan)W()}function J(){if(u.enableZoom)q();if(u.enableRotate)B()}function $(e){if(M.length==1){P.set(e.pageX,e.pageY)}else{const t=Ee(e);const n=.5*(e.pageX+t.x);const o=.5*(e.pageY+t.y);P.set(n,o)}T.subVectors(P,O).multiplyScalar(u.rotateSpeed);const t=u.domElement;x(2*Math.PI*T.x/t.clientHeight);S(2*Math.PI*T.y/t.clientHeight);O.copy(P)}function ee(e){if(M.length===1){A.set(e.pageX,e.pageY)}else{const t=Ee(e);const n=.5*(e.pageX+t.x);const o=.5*(e.pageY+t.y);A.set(n,o)}L.subVectors(A,v).multiplyScalar(u.panSpeed);_(L.x,L.y);v.copy(A)}function te(e){const t=Ee(e);const n=e.pageX-t.x;const o=e.pageY-t.y;const a=Math.sqrt(n*n+o*o);N.set(0,a);j.set(0,Math.pow(N.y/w.y,u.zoomSpeed));H(j.y);w.copy(N)}function ne(e){if(u.enableZoom)te(e);if(u.enablePan)ee(e)}function oe(e){if(u.enableZoom)te(e);if(u.enableRotate)$(e)}function ae(e){if(u.enabled===false)return;if(M.length===0){u.domElement.setPointerCapture(e.pointerId);u.domElement.addEventListener("pointermove",ie);u.domElement.addEventListener("pointerup",se)}he(e);if(e.pointerType==="touch"){ue(e)}else{ce(e)}}function ie(e){if(u.enabled===false)return;if(e.pointerType==="touch"){pe(e)}else{re(e)}}function se(e){de(e);if(M.length===0){u.domElement.releasePointerCapture(e.pointerId);u.domElement.removeEventListener("pointermove",ie);u.domElement.removeEventListener("pointerup",se)}u.dispatchEvent(l);f=p.NONE}function ce(e){let t;switch(e.button){case 0:t=u.mouseButtons.LEFT;break;case 1:t=u.mouseButtons.MIDDLE;break;case 2:t=u.mouseButtons.RIGHT;break;default:t=-1}switch(t){case n.DOLLY:if(u.enableZoom===false)return;z(e);f=p.DOLLY;break;case n.ROTATE:if(e.ctrlKey||e.metaKey||e.shiftKey){if(u.enablePan===false)return;X(e);f=p.PAN}else{if(u.enableRotate===false)return;C(e);f=p.ROTATE}break;case n.PAN:if(e.ctrlKey||e.metaKey||e.shiftKey){if(u.enableRotate===false)return;C(e);f=p.ROTATE}else{if(u.enablePan===false)return;X(e);f=p.PAN}break;default:f=p.NONE}if(f!==p.NONE){u.dispatchEvent(r)}}function re(e){switch(f){case p.ROTATE:if(u.enableRotate===false)return;Z(e);break;case p.DOLLY:if(u.enableZoom===false)return;F(e);break;case p.PAN:if(u.enablePan===false)return;U(e);break}}function le(e){if(u.enabled===false||u.enableZoom===false||f!==p.NONE)return;e.preventDefault();u.dispatchEvent(r);V(e);u.dispatchEvent(l)}function me(e){if(u.enabled===false||u.enablePan===false)return;G(e)}function ue(e){be(e);switch(M.length){case 1:switch(u.touches.ONE){case o.ROTATE:if(u.enableRotate===false)return;B();f=p.TOUCH_ROTATE;break;case o.PAN:if(u.enablePan===false)return;W();f=p.TOUCH_PAN;break;default:f=p.NONE}break;case 2:switch(u.touches.TWO){case o.DOLLY_PAN:if(u.enableZoom===false&&u.enablePan===false)return;Q();f=p.TOUCH_DOLLY_PAN;break;case o.DOLLY_ROTATE:if(u.enableZoom===false&&u.enableRotate===false)return;J();f=p.TOUCH_DOLLY_ROTATE;break;default:f=p.NONE}break;default:f=p.NONE}if(f!==p.NONE){u.dispatchEvent(r)}}function pe(e){be(e);switch(f){case p.TOUCH_ROTATE:if(u.enableRotate===false)return;$(e);u.update();break;case p.TOUCH_PAN:if(u.enablePan===false)return;ee(e);u.update();break;case p.TOUCH_DOLLY_PAN:if(u.enableZoom===false&&u.enablePan===false)return;ne(e);u.update();break;case p.TOUCH_DOLLY_ROTATE:if(u.enableZoom===false&&u.enableRotate===false)return;oe(e);u.update();break;default:f=p.NONE}}function fe(e){if(u.enabled===false)return;e.preventDefault()}function he(e){M.push(e)}function de(e){delete k[e.pointerId];for(let t=0;t<M.length;t++){if(M[t].pointerId==e.pointerId){M.splice(t,1);return}}}function be(e){let t=k[e.pointerId];if(t===undefined){t=new s;k[e.pointerId]=t}t.set(e.pageX,e.pageY)}function Ee(e){const t=e.pointerId===M[0].pointerId?M[1]:M[0];return k[t.pointerId]}u.domElement.addEventListener("contextmenu",fe);u.domElement.addEventListener("pointerdown",ae);u.domElement.addEventListener("pointercancel",se);u.domElement.addEventListener("wheel",le,{passive:false});this.update()}}export{m as OrbitControls};
|
|
1
|
+
import{E as e,a as t,b as n,T as o,Q as a,S as i,V as s}from"./sampleScatter.rendererThree-22c0c6aa.js";import"./app-42d73775.js";import"path";const c={type:"change"};const r={type:"start"};const l={type:"end"};class m extends e{constructor(e,m){super();this.object=e;this.domElement=m;this.domElement.style.touchAction="none";this.enabled=true;this.target=new t;this.minDistance=0;this.maxDistance=Infinity;this.minZoom=0;this.maxZoom=Infinity;this.minPolarAngle=0;this.maxPolarAngle=Math.PI;this.minAzimuthAngle=-Infinity;this.maxAzimuthAngle=Infinity;this.enableDamping=false;this.dampingFactor=.05;this.enableZoom=true;this.zoomSpeed=1;this.enableRotate=true;this.rotateSpeed=1;this.enablePan=true;this.panSpeed=1;this.screenSpacePanning=true;this.keyPanSpeed=7;this.autoRotate=false;this.autoRotateSpeed=2;this.keys={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"};this.mouseButtons={LEFT:n.ROTATE,MIDDLE:n.DOLLY,RIGHT:n.PAN};this.touches={ONE:o.ROTATE,TWO:o.DOLLY_PAN};this.target0=this.target.clone();this.position0=this.object.position.clone();this.zoom0=this.object.zoom;this._domElementKeyEvents=null;this.getPolarAngle=function(){return d.phi};this.getAzimuthalAngle=function(){return d.theta};this.getDistance=function(){return this.object.position.distanceTo(this.target)};this.listenToKeyEvents=function(e){e.addEventListener("keydown",me);this._domElementKeyEvents=e};this.stopListenToKeyEvents=function(){this._domElementKeyEvents.removeEventListener("keydown",me);this._domElementKeyEvents=null};this.saveState=function(){u.target0.copy(u.target);u.position0.copy(u.object.position);u.zoom0=u.object.zoom};this.reset=function(){u.target.copy(u.target0);u.object.position.copy(u.position0);u.object.zoom=u.zoom0;u.object.updateProjectionMatrix();u.dispatchEvent(c);u.update();f=p.NONE};this.update=function(){const n=new t;const o=(new a).setFromUnitVectors(e.up,new t(0,1,0));const i=o.clone().invert();const s=new t;const r=new a;const l=2*Math.PI;return function e(){const t=u.object.position;n.copy(t).sub(u.target);n.applyQuaternion(o);d.setFromVector3(n);if(u.autoRotate&&f===p.NONE){x(I())}if(u.enableDamping){d.theta+=b.theta*u.dampingFactor;d.phi+=b.phi*u.dampingFactor}else{d.theta+=b.theta;d.phi+=b.phi}let a=u.minAzimuthAngle;let m=u.maxAzimuthAngle;if(isFinite(a)&&isFinite(m)){if(a<-Math.PI)a+=l;else if(a>Math.PI)a-=l;if(m<-Math.PI)m+=l;else if(m>Math.PI)m-=l;if(a<=m){d.theta=Math.max(a,Math.min(m,d.theta))}else{d.theta=d.theta>(a+m)/2?Math.max(a,d.theta):Math.min(m,d.theta)}}d.phi=Math.max(u.minPolarAngle,Math.min(u.maxPolarAngle,d.phi));d.makeSafe();d.radius*=E;d.radius=Math.max(u.minDistance,Math.min(u.maxDistance,d.radius));if(u.enableDamping===true){u.target.addScaledVector(g,u.dampingFactor)}else{u.target.add(g)}n.setFromSpherical(d);n.applyQuaternion(i);t.copy(u.target).add(n);u.object.lookAt(u.target);if(u.enableDamping===true){b.theta*=1-u.dampingFactor;b.phi*=1-u.dampingFactor;g.multiplyScalar(1-u.dampingFactor)}else{b.set(0,0,0);g.set(0,0,0)}E=1;if(y||s.distanceToSquared(u.object.position)>h||8*(1-r.dot(u.object.quaternion))>h){u.dispatchEvent(c);s.copy(u.object.position);r.copy(u.object.quaternion);y=false;return true}return false}}();this.dispose=function(){u.domElement.removeEventListener("contextmenu",fe);u.domElement.removeEventListener("pointerdown",ae);u.domElement.removeEventListener("pointercancel",se);u.domElement.removeEventListener("wheel",le);u.domElement.removeEventListener("pointermove",ie);u.domElement.removeEventListener("pointerup",se);if(u._domElementKeyEvents!==null){u._domElementKeyEvents.removeEventListener("keydown",me);u._domElementKeyEvents=null}};const u=this;const p={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6};let f=p.NONE;const h=1e-6;const d=new i;const b=new i;let E=1;const g=new t;let y=false;const O=new s;const P=new s;const T=new s;const v=new s;const A=new s;const L=new s;const w=new s;const N=new s;const j=new s;const M=[];const k={};function I(){return 2*Math.PI/60/60*u.autoRotateSpeed}function R(){return Math.pow(.95,u.zoomSpeed)}function x(e){b.theta-=e}function S(e){b.phi-=e}const Y=function(){const e=new t;return function t(n,o){e.setFromMatrixColumn(o,0);e.multiplyScalar(-n);g.add(e)}}();const D=function(){const e=new t;return function t(n,o){if(u.screenSpacePanning===true){e.setFromMatrixColumn(o,1)}else{e.setFromMatrixColumn(o,0);e.crossVectors(u.object.up,e)}e.multiplyScalar(n);g.add(e)}}();const _=function(){const e=new t;return function t(n,o){const a=u.domElement;if(u.object.isPerspectiveCamera){const t=u.object.position;e.copy(t).sub(u.target);let i=e.length();i*=Math.tan(u.object.fov/2*Math.PI/180);Y(2*n*i/a.clientHeight,u.object.matrix);D(2*o*i/a.clientHeight,u.object.matrix)}else if(u.object.isOrthographicCamera){Y(n*(u.object.right-u.object.left)/u.object.zoom/a.clientWidth,u.object.matrix);D(o*(u.object.top-u.object.bottom)/u.object.zoom/a.clientHeight,u.object.matrix)}else{console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.");u.enablePan=false}}}();function H(e){if(u.object.isPerspectiveCamera){E/=e}else if(u.object.isOrthographicCamera){u.object.zoom=Math.max(u.minZoom,Math.min(u.maxZoom,u.object.zoom*e));u.object.updateProjectionMatrix();y=true}else{console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.");u.enableZoom=false}}function K(e){if(u.object.isPerspectiveCamera){E*=e}else if(u.object.isOrthographicCamera){u.object.zoom=Math.max(u.minZoom,Math.min(u.maxZoom,u.object.zoom/e));u.object.updateProjectionMatrix();y=true}else{console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.");u.enableZoom=false}}function C(e){O.set(e.clientX,e.clientY)}function z(e){w.set(e.clientX,e.clientY)}function X(e){v.set(e.clientX,e.clientY)}function Z(e){P.set(e.clientX,e.clientY);T.subVectors(P,O).multiplyScalar(u.rotateSpeed);const t=u.domElement;x(2*Math.PI*T.x/t.clientHeight);S(2*Math.PI*T.y/t.clientHeight);O.copy(P);u.update()}function F(e){N.set(e.clientX,e.clientY);j.subVectors(N,w);if(j.y>0){H(R())}else if(j.y<0){K(R())}w.copy(N);u.update()}function U(e){A.set(e.clientX,e.clientY);L.subVectors(A,v).multiplyScalar(u.panSpeed);_(L.x,L.y);v.copy(A);u.update()}function V(e){if(e.deltaY<0){K(R())}else if(e.deltaY>0){H(R())}u.update()}function G(e){let t=false;switch(e.code){case u.keys.UP:if(e.ctrlKey||e.metaKey||e.shiftKey){S(2*Math.PI*u.rotateSpeed/u.domElement.clientHeight)}else{_(0,u.keyPanSpeed)}t=true;break;case u.keys.BOTTOM:if(e.ctrlKey||e.metaKey||e.shiftKey){S(-2*Math.PI*u.rotateSpeed/u.domElement.clientHeight)}else{_(0,-u.keyPanSpeed)}t=true;break;case u.keys.LEFT:if(e.ctrlKey||e.metaKey||e.shiftKey){x(2*Math.PI*u.rotateSpeed/u.domElement.clientHeight)}else{_(u.keyPanSpeed,0)}t=true;break;case u.keys.RIGHT:if(e.ctrlKey||e.metaKey||e.shiftKey){x(-2*Math.PI*u.rotateSpeed/u.domElement.clientHeight)}else{_(-u.keyPanSpeed,0)}t=true;break}if(t){e.preventDefault();u.update()}}function B(){if(M.length===1){O.set(M[0].pageX,M[0].pageY)}else{const e=.5*(M[0].pageX+M[1].pageX);const t=.5*(M[0].pageY+M[1].pageY);O.set(e,t)}}function W(){if(M.length===1){v.set(M[0].pageX,M[0].pageY)}else{const e=.5*(M[0].pageX+M[1].pageX);const t=.5*(M[0].pageY+M[1].pageY);v.set(e,t)}}function q(){const e=M[0].pageX-M[1].pageX;const t=M[0].pageY-M[1].pageY;const n=Math.sqrt(e*e+t*t);w.set(0,n)}function Q(){if(u.enableZoom)q();if(u.enablePan)W()}function J(){if(u.enableZoom)q();if(u.enableRotate)B()}function $(e){if(M.length==1){P.set(e.pageX,e.pageY)}else{const t=Ee(e);const n=.5*(e.pageX+t.x);const o=.5*(e.pageY+t.y);P.set(n,o)}T.subVectors(P,O).multiplyScalar(u.rotateSpeed);const t=u.domElement;x(2*Math.PI*T.x/t.clientHeight);S(2*Math.PI*T.y/t.clientHeight);O.copy(P)}function ee(e){if(M.length===1){A.set(e.pageX,e.pageY)}else{const t=Ee(e);const n=.5*(e.pageX+t.x);const o=.5*(e.pageY+t.y);A.set(n,o)}L.subVectors(A,v).multiplyScalar(u.panSpeed);_(L.x,L.y);v.copy(A)}function te(e){const t=Ee(e);const n=e.pageX-t.x;const o=e.pageY-t.y;const a=Math.sqrt(n*n+o*o);N.set(0,a);j.set(0,Math.pow(N.y/w.y,u.zoomSpeed));H(j.y);w.copy(N)}function ne(e){if(u.enableZoom)te(e);if(u.enablePan)ee(e)}function oe(e){if(u.enableZoom)te(e);if(u.enableRotate)$(e)}function ae(e){if(u.enabled===false)return;if(M.length===0){u.domElement.setPointerCapture(e.pointerId);u.domElement.addEventListener("pointermove",ie);u.domElement.addEventListener("pointerup",se)}he(e);if(e.pointerType==="touch"){ue(e)}else{ce(e)}}function ie(e){if(u.enabled===false)return;if(e.pointerType==="touch"){pe(e)}else{re(e)}}function se(e){de(e);if(M.length===0){u.domElement.releasePointerCapture(e.pointerId);u.domElement.removeEventListener("pointermove",ie);u.domElement.removeEventListener("pointerup",se)}u.dispatchEvent(l);f=p.NONE}function ce(e){let t;switch(e.button){case 0:t=u.mouseButtons.LEFT;break;case 1:t=u.mouseButtons.MIDDLE;break;case 2:t=u.mouseButtons.RIGHT;break;default:t=-1}switch(t){case n.DOLLY:if(u.enableZoom===false)return;z(e);f=p.DOLLY;break;case n.ROTATE:if(e.ctrlKey||e.metaKey||e.shiftKey){if(u.enablePan===false)return;X(e);f=p.PAN}else{if(u.enableRotate===false)return;C(e);f=p.ROTATE}break;case n.PAN:if(e.ctrlKey||e.metaKey||e.shiftKey){if(u.enableRotate===false)return;C(e);f=p.ROTATE}else{if(u.enablePan===false)return;X(e);f=p.PAN}break;default:f=p.NONE}if(f!==p.NONE){u.dispatchEvent(r)}}function re(e){switch(f){case p.ROTATE:if(u.enableRotate===false)return;Z(e);break;case p.DOLLY:if(u.enableZoom===false)return;F(e);break;case p.PAN:if(u.enablePan===false)return;U(e);break}}function le(e){if(u.enabled===false||u.enableZoom===false||f!==p.NONE)return;e.preventDefault();u.dispatchEvent(r);V(e);u.dispatchEvent(l)}function me(e){if(u.enabled===false||u.enablePan===false)return;G(e)}function ue(e){be(e);switch(M.length){case 1:switch(u.touches.ONE){case o.ROTATE:if(u.enableRotate===false)return;B();f=p.TOUCH_ROTATE;break;case o.PAN:if(u.enablePan===false)return;W();f=p.TOUCH_PAN;break;default:f=p.NONE}break;case 2:switch(u.touches.TWO){case o.DOLLY_PAN:if(u.enableZoom===false&&u.enablePan===false)return;Q();f=p.TOUCH_DOLLY_PAN;break;case o.DOLLY_ROTATE:if(u.enableZoom===false&&u.enableRotate===false)return;J();f=p.TOUCH_DOLLY_ROTATE;break;default:f=p.NONE}break;default:f=p.NONE}if(f!==p.NONE){u.dispatchEvent(r)}}function pe(e){be(e);switch(f){case p.TOUCH_ROTATE:if(u.enableRotate===false)return;$(e);u.update();break;case p.TOUCH_PAN:if(u.enablePan===false)return;ee(e);u.update();break;case p.TOUCH_DOLLY_PAN:if(u.enableZoom===false&&u.enablePan===false)return;ne(e);u.update();break;case p.TOUCH_DOLLY_ROTATE:if(u.enableZoom===false&&u.enableRotate===false)return;oe(e);u.update();break;default:f=p.NONE}}function fe(e){if(u.enabled===false)return;e.preventDefault()}function he(e){M.push(e)}function de(e){delete k[e.pointerId];for(let t=0;t<M.length;t++){if(M[t].pointerId==e.pointerId){M.splice(t,1);return}}}function be(e){let t=k[e.pointerId];if(t===undefined){t=new s;k[e.pointerId]=t}t.set(e.pageX,e.pageY)}function Ee(e){const t=e.pointerId===M[0].pointerId?M[1]:M[0];return k[t.pointerId]}u.domElement.addEventListener("contextmenu",fe);u.domElement.addEventListener("pointerdown",ae);u.domElement.addEventListener("pointercancel",se);u.domElement.addEventListener("wheel",le,{passive:false});this.update()}}export{m as OrbitControls};
|