jbrowse-plugin-graphgenomeviewer 5.1.0 → 5.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -4
- package/dist/chunks/GbzBaseSyntenyAdapter-TQVDD3OC.js +8 -0
- package/dist/chunks/GbzBaseSyntenyAdapter-TQVDD3OC.js.map +7 -0
- package/dist/chunks/{GraphGenomeView-TKK67NXR.js → GraphGenomeView-AY2FO4P2.js} +2 -2
- package/dist/chunks/{GraphTrackSettingsDialog-RKZ5XIKY.js → GraphTrackSettingsDialog-QJXPMWYG.js} +2 -2
- package/dist/chunks/LinearGraphDisplay-GKVG72J4.js +2 -0
- package/dist/chunks/LinearGraphDisplay-GKVG72J4.js.map +7 -0
- package/dist/chunks/chunk-2V27PV25.js +3 -0
- package/dist/chunks/chunk-2V27PV25.js.map +7 -0
- package/dist/chunks/{chunk-C4ET3OW2.js → chunk-FNHKEAKB.js} +2 -2
- package/dist/chunks/{chunk-C4ET3OW2.js.map → chunk-FNHKEAKB.js.map} +2 -2
- package/dist/chunks/chunk-K5Z47YVI.js +2 -0
- package/dist/chunks/{chunk-ALTI7LTL.js.map → chunk-K5Z47YVI.js.map} +2 -2
- package/dist/chunks/{chunk-N2I4OWIA.js → chunk-LJZDHT2C.js} +2 -2
- package/dist/chunks/chunk-NWJN4C4V.js +2 -0
- package/dist/chunks/chunk-NWJN4C4V.js.map +7 -0
- package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +5 -5
- package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +4 -4
- package/package.json +2 -2
- package/src/GbzBaseSyntenyAdapter/GbzBaseSyntenyAdapter.test.ts +20 -38
- package/src/GbzBaseSyntenyAdapter/GbzBaseSyntenyAdapter.ts +14 -65
- package/src/GraphGenomeView/components/GenePins.tsx +25 -80
- package/src/GraphGenomeView/genes/geneFeatures.ts +46 -7
- package/src/GraphGenomeView/genes/genes.test.ts +88 -1
- package/src/GraphGenomeView/pane/graphViews.ts +36 -5
- package/src/GraphGenomeView/pane/loadActions.ts +5 -5
- package/src/GraphGenomeView/pane/paneBase.ts +3 -2
- package/src/LinearGraphDisplay/LinearGraphDisplay.test.ts +160 -92
- package/src/LinearGraphDisplay/components/LinearGraphDisplay.tsx +2 -12
- package/src/LinearGraphDisplay/denseWindow.ts +40 -0
- package/src/LinearGraphDisplay/model.ts +34 -94
- package/src/index.ts +0 -2
- package/src/version.ts +1 -1
- package/dist/chunks/GbzBaseSyntenyAdapter-C2IGNBR4.js +0 -4
- package/dist/chunks/GbzBaseSyntenyAdapter-C2IGNBR4.js.map +0 -7
- package/dist/chunks/LinearGraphDisplay-I2DJRM36.js +0 -2
- package/dist/chunks/LinearGraphDisplay-I2DJRM36.js.map +0 -7
- package/dist/chunks/chunk-2H7GDQ3R.js +0 -6
- package/dist/chunks/chunk-2H7GDQ3R.js.map +0 -7
- package/dist/chunks/chunk-AFYY6LQF.js +0 -3
- package/dist/chunks/chunk-AFYY6LQF.js.map +0 -7
- package/dist/chunks/chunk-ALTI7LTL.js +0 -2
- package/dist/chunks/chunk-BZOIENU5.js +0 -2
- package/dist/chunks/chunk-BZOIENU5.js.map +0 -7
- package/dist/chunks/chunk-YZAO5LPU.js +0 -2
- package/dist/chunks/chunk-YZAO5LPU.js.map +0 -7
- package/src/GetHaplotypeOverview.ts +0 -77
- package/src/HaplotypeOverview/HaplotypeOverviewCanvas.tsx +0 -203
- package/src/HaplotypeOverview/draw.test.ts +0 -136
- package/src/HaplotypeOverview/draw.ts +0 -433
- package/src/HaplotypeOverview/model.ts +0 -163
- /package/dist/chunks/{GraphGenomeView-TKK67NXR.js.map → GraphGenomeView-AY2FO4P2.js.map} +0 -0
- /package/dist/chunks/{GraphTrackSettingsDialog-RKZ5XIKY.js.map → GraphTrackSettingsDialog-QJXPMWYG.js.map} +0 -0
- /package/dist/chunks/{chunk-N2I4OWIA.js.map → chunk-LJZDHT2C.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{a as
|
|
2
|
-
`)){let r=n.endsWith("\r")?n.slice(0,-1):n;if(r.startsWith("H")){let[,...o]=r.split(" ");t.header.push(Ke(o))}else if(r.startsWith("S")){let[,o,...a]=r.split(" "),i,s,d,c=!1,m=a[0]??"*";/^\d+$/.test(m)?(i=+m,s=a[1]??"*",d=a.slice(2)):(c=!0,s=m,i=s==="*"?0:s.length,d=a.slice(1));let g=Ke(d);c&&"LN"in g&&(i=+g.LN),t.nodes.push({id:o,length:i,sequence:s,tags:g})}else if(r.startsWith("E")){let[,,o,a,,,,,i,...s]=r.split(" ");o&&a&&t.links.push({source:o.slice(0,-1),target:a.slice(0,-1),strand1:o.at(-1),strand2:a.at(-1),cigar:i??"*",tags:Ke(s)})}else if(r.startsWith("L")){let[,o,a,i,s,d,...c]=r.split(" ");o&&i&&s&&t.links.push({source:o,target:i,strand1:a,strand2:s,cigar:d??"*",tags:Ke(c)})}else if(r.startsWith("W")){let[,o,a,i,s,d,c,...m]=r.split(" ");o&&a&&i&&s&&d&&c&&t.walks.push({sample:o,haplotype:+a,contig:i,start:s==="*"?-1:+s,end:d==="*"?-1:+d,segments:vd(c),tags:Ke(m)})}else if(r.startsWith("P")){let[,o,a,...i]=r.split(" ");o&&a&&t.paths.push({name:o,path:a,rest:i})}}return t}function Gd(e){let t=new Map,n=new Map;function r(a,i){t.has(a)||t.set(a,i)}function o(a,i){r(a,i),n.set(a,(n.get(a)??0)+1)}for(let a of e.links)r(a.source,a.strand1==="-"?"-":"+"),r(a.target,a.strand2==="-"?"-":"+");for(let a of e.paths)for(let i of a.path.split(","))o(i.slice(0,-1),i.endsWith("-")?"-":"+");for(let a of e.walks)for(let i of a.segments)o(i.id,i.strand==="-"?"-":"+");return{canonical:t,traversals:n}}var ya=e=>e.start===-1?0:e.start;function Ld(e){return[...e.paths.map(t=>({...ee(t.name),steps:t.path.split(",").map(n=>({id:n.slice(0,-1),strand:n.endsWith("-")?"-":"+"}))})),...e.walks.map(t=>({name:`${t.sample}#${t.haplotype}#${t.contig}`,start:ya(t),steps:t.segments.map(n=>({id:n.id,strand:n.strand==="-"?"-":"+"}))}))]}function Ad(e){let t=e.tags.SM;if(typeof t!="string")return;let n=t.split(",").map(r=>r.trim()).filter(Boolean);return n.length>0?n:void 0}var qe=e=>typeof e=="number"&&e>0?e:void 0;function Td({tags:e,length:t}){let n=qe(e.RC)??qe(e.FC)??qe(e.KC);return qe(e.dp)??qe(e.DP)??(n!==void 0&&t>0?n/t:void 0)}function Pd(e,t,n){return{id:`${e.id}${t}`,name:e.id,length:e.length,depth:n,stable:An(e),samples:Ad(e)}}function wa(e,t="Imported GFA"){let n=[],r=[],{canonical:o,traversals:a}=Gd(e),i=u=>`${u}${o.get(u)??"+"}`;for(let u of e.nodes){let k=Td(u)??Math.max(a.get(u.id)??1,1);n.push(Pd(u,o.get(u.id)??"+",k))}for(let u of e.links)r.push({from:i(u.source),to:i(u.target),fromStrand:u.strand1==="-"?"-":"+",toStrand:u.strand2==="-"?"-":"+"});let s=[],d=new Map,c=(u,k)=>[u,k].sort().join("--");function m(u,k){for(let x=0;x<u.length-1;x++){let w=c(u[x],u[x+1]);d.has(w)||d.set(w,new Set),d.get(w).add(k)}}for(let u of e.paths){let k=u.path.split(",").map(x=>i(x.slice(0,-1)));s.push({name:u.name,nodeIds:k,start:ee(u.name).start}),m(k,u.name)}for(let u of e.walks){let k=u.segments.map(w=>i(w.id)),x=`${u.sample}#${u.haplotype}#${u.contig}`;s.push({name:x,nodeIds:k,start:ya(u),sample:u.sample,haplotype:u.haplotype,contig:u.contig}),m(k,x)}for(let u of r){let k=d.get(c(u.from,u.to));k&&k.size>0&&(u.pathIds=[...k])}let g=new Map(e.nodes.map(u=>[u.id,u.length])),p=e.paths.length>0||e.walks.length>0?Er(Ld(e),u=>g.get(u)??0):void 0;return{name:t,nodes:n,edges:r,paths:s.length>0?s:void 0,anchorPaths:p?.anchorPaths,pathVisits:p?.pathVisits,anchoredBy:n.some(u=>u.stable)?"tags":void 0}}var Nd="\0deletion:";function ka(e,t){let n=new Map(t.map(o=>[o.edgeIndex,`${Nd}${o.edgeIndex}`])),r=[];return e.edges.forEach((o,a)=>{let i=n.get(a);if(i===void 0)r.push(o);else{let{fromStrand:s,toStrand:d}=o;r.push({from:o.from,to:i,...s?{fromStrand:s}:{}},{from:i,to:o.to,...d?{toStrand:d}:{}})}}),{graph:{...e,nodes:[...e.nodes,...[...n.values()].map(o=>({id:o,name:o,length:0,depth:0}))],edges:r},routes:n,ids:new Set(n.values())}}function xa(e,t,n,r,o){let a=new Map(e.nodes.map(i=>[i.id,i.length]));return t.map(i=>{let s=i.bypassed.reduce((m,g)=>m+(a.get(g)??0),0),d=Math.max(o.minimumNodeLength,r(s)*.5),c=n.get(i.edgeIndex);return{id:c,name:c,length:Math.round(d*1e6/o.nodeLengthPerMegabase),depth:0}})}function Sa(e,t){let n={...e},r={};for(let[o,a]of t){let i=n[a];delete n[a],i?.length&&(r[o]=i)}return{nodePositions:n,deletionRoutes:r}}function Ra(e,t){let n=e.nodes.filter(w=>O(w)&&(t[w.id]?.length??0)>0);if(n.length<2)return t;let r=n.map(w=>{let h=t[w.id],v=h[Math.floor(h.length/2)];return{x:v.x,y:v.y,r:w.stable.start+w.length/2,w:w.length}}),o=r.reduce((w,h)=>w+h.w,0),a=r.reduce((w,h)=>w+h.x*h.w,0)/o,i=r.reduce((w,h)=>w+h.y*h.w,0)/o,s=r.reduce((w,h)=>w+h.r*h.w,0)/o,d=0,c=0;for(let w of r)d+=w.w*(w.x-a)*(w.r-s),c+=w.w*(w.y-i)*(w.r-s);let m=-Math.atan2(c,d),g=Math.cos(m),p=Math.sin(m),u={};for(let[w,h]of Object.entries(t))u[w]=h.map(v=>{let l=v.x-a,b=v.y-i;return{x:a+g*l-p*b,y:i+p*l+g*b}});let k=0,x=0;for(let w of e.nodes)if(!O(w))for(let h of u[w.id]??[])h.y>i?k++:x++;if(x>k)for(let w of Object.values(u))for(let h of w)h.y=2*i-h.y;return u}var Ma=30;function Cd(e,t){let{opts:n}=t,r=new Map(t.nodes.map(p=>[p.id,Rt(n,p.length)])),o=p=>r.get(p)??n.minimumNodeLength,a=e.nodes.filter(O).sort((p,u)=>p.stable.start-u.stable.start),i=new Map,s=0;for(let p of a)i.set(p.id,{x:s,y:0}),s+=o(p.id)+n.edgeLength;let d=mt(e),c=new Map(a.map(p=>[p.id,0])),m=a.map(p=>p.id);for(let p of m){let u=i.get(p),k=c.get(p)+1;for(let x of d.get(p)??[])c.has(x)||(c.set(x,k),i.set(x,{x:u.x+o(p)/2,y:Ma*k}),m.push(x))}let g=0;for(let p of e.nodes)i.has(p.id)||i.set(p.id,{x:g++*s/e.nodes.length,y:Ma*3});return i}function va(e,t){let n=Cd(e,t);return t.nodes.map(r=>({...r,...n.get(r.id)}))}function Ga(e,t,n={}){let r=Fr(wa(Tn(e),t),n.referencePath);if(r.nodes.length===0)throw new Error(`No graph segments in ${t}`);if(n.maxNodes!==void 0&&r.nodes.length>n.maxNodes)throw new Error(`Graph too large to draw: ${r.nodes.length.toLocaleString()} nodes (limit ${n.maxNodes.toLocaleString()}). Zoom in to a smaller region, or raise maxGraphNodes on this view.`);return r}var Id=15;function Ed(e,t,n){let r=e.nodes.some(O),o={...t,opts:{...t.opts,edgeLength:t.opts.edgeLength*(n.spacing??1)}};return{graph:{nodes:r?va(e,o):o.nodes,edges:e.edges},options:{quality:n.quality,linearLayout:n.linearLayout,...o.opts,componentSeparation:Id*(n.componentSeparation??1),...r?{rotateComponents:!1}:{}}}}function La(e,t){let n=e.nodes.some(O);return`${t.quality}|${t.linearLayout}|${t.bubbleSpread}|${t.spacing??1}|${t.componentSeparation??1}|${n}|${e.referencePath??""}`}async function Aa(e,t,n){let r=oo(t.bubbleSpread),o=ve(e),a=ka(e,o),i=Or(a.graph,a.ids),s={...i.graph,nodes:i.graph.nodes.filter(w=>!a.ids.has(w.id))},d=bn(s,r),{result:c,duration:m}=await n(Ed(i.graph,{...d,nodes:[...d.nodes,...xa(e,o,a.routes,no(s,r),d.opts)]},t)),g=bn(e,r),p=new Map(g.nodes.map(w=>[w.id,Rt(g.opts,w.length)])),u=$r(c.nodePositions,i.runs,w=>p.get(w)??0),{nodePositions:k,deletionRoutes:x}=Sa(e.nodes.some(O)?Ra(e,u):u,a.routes);return{result:{...c,nodePositions:k,stranded:!0,...o.length?{deletionRoutes:x,extent:Ta(x)}:{}},duration:m}}function Ta(e){let t=1/0,n=1/0,r=-1/0,o=-1/0;for(let a of Object.values(e))for(let i of a)t=Math.min(t,i.x),n=Math.min(n,i.y),r=Math.max(r,i.x),o=Math.max(o,i.y);return{minX:t,minY:n,maxX:r,maxY:o}}var $=40,Bd=1e-6,Fd=100;function Je(e){return Math.max(Bd,Math.min(Fd,e))}function Pn(e,t,n,r=$){let o=t-e.h*n;return r-e.minY*n+Math.max(0,o)/2}function Ze(e,t,n,r,{minScale:o=0,padLeft:a=$,padTop:i=$,padRight:s=$,padBottom:d=$}={}){let c=t-a-s,m=n-i-d;if(c<=0||m<=0||!(e.w>0||!r&&e.h>0))return;let g=e.w>0?c/e.w:1/0,p=e.h>0?m/e.h:1/0,u=Je(Math.max(o,r?g:Math.min(g,p))),k=c-e.w*u;return{scale:u,translateX:a-e.minX*u+Math.max(0,k)/2,translateY:Pn(e,m,r?1:u,i)}}function Dt(e,t={}){let{minX:n,minY:r,maxX:o,maxY:a}=Ta(e.nodePositions),{region:i}=t;e.referenceAxis&&i&&i.end>i.start&&(n=i.start,o=i.end);let s=t.extent??e.extent;return s&&(n=Math.min(n,s.minX??n),r=Math.min(r,s.minY??r),o=Math.max(o,s.maxX??o),a=Math.max(a,s.maxY??a)),{minX:n,minY:r,w:o-n,h:a-r}}function Te(e,t){return{scaleX:e,scaleY:t?1:e,pixelRows:t}}function Pa(e,t,n,r){return{minX:-e.translateX/t.scaleX,minY:-e.translateY/t.scaleY,maxX:(n-e.translateX)/t.scaleX,maxY:(r-e.translateY)/t.scaleY}}function Na(e,t){let n=(e.maxX-e.minX)*t,r=(e.maxY-e.minY)*t;return{minX:e.minX-n,minY:e.minY-r,maxX:e.maxX+n,maxY:e.maxY+r}}function Ca(e,t){return t.minX>=e.minX&&t.maxX<=e.maxX&&t.minY>=e.minY&&t.maxY<=e.maxY}function Ia(e,t,n,r,o){let a=Je(e.scale*t),i=a/e.scale;return{scale:a,translateX:n-(n-e.translateX)*i,translateY:o?e.translateY:r-(r-e.translateY)*i}}var R=y(oe(),1),Da=y(Ba(),1);var fe=y(oe(),1);function Fa(e){return t=>e.includes(t)?t:void 0}function Nn(e){return fe.types.snapshotProcessor(fe.types.maybe(fe.types.enumeration(e)),{preProcessor:Fa(e)})}function Cn(e,t){return fe.types.snapshotProcessor(fe.types.optional(fe.types.enumeration(e),t),{preProcessor:Fa(e)})}var Va=600,_t=160,Wt=[1,1,1,1],Ht=[.12,.12,.12,1],_a=([e,t,n])=>`rgb(${[e,t,n].map(r=>Math.round(r*255)).join(", ")})`,Wa=5,Pe=new Set(["tubemap","tubemapref"]),Ha=(0,$a.lazy)(()=>import("./chunks/ChooseWalksDialog-GVQLSGHX.js")),In=12,ja=[{value:"",label:"Off"},{value:"walk",label:"A panel per walk"},{value:"sample",label:"A row per sample, a column per haplotype"}],Od=R.types.snapshotProcessor(R.types.model("GraphFacet",{field:R.types.optional(R.types.enumeration(["","walk","sample"]),""),domain:R.types.optional(R.types.frozen(),[]),columns:R.types.maybe(R.types.number)}),{preProcessor:e=>vt(e)}),Xa=[{bp:0,label:"None"},{bp:3,label:"Under 3 bp"},{bp:10,label:"Under 10 bp"},{bp:50,label:"Under 50 bp, leaving structural variants"},{bp:1e3,label:"Under 1 kb"}],Oa=".segs.bed.gz";function za(e){if(typeof e.uri=="string")return e.uri;let n=e.segmentsLocation?.uri;return typeof n=="string"&&n.endsWith(Oa)?n.slice(0,-Oa.length):void 0}var En=1.4,Ya=1.6,Ua=150,Ka=1,Bn=40,Fn={nodeStrokes:[],nodeStrokeRuns:new Map,arrows:[],arrowRuns:new Map,edgeCurves:[],edgeCurveRuns:new Map};function le(...e){}var Qe=5e6;function be(e){return e>=1e6?`${+(e/1e6).toFixed(1)} Mb`:`${Math.round(e/1e3)} kb`}var qa=2e4;function Ne(e){return e&&"uri"in e&&e.uri?new URL(e.uri,e.baseUri??window.location.href).href:void 0}function On(e){return e.builtViewport!==void 0&&e.paintedViewport===e.builtViewport&&e.builtViewport.viewportDirty===e.viewportDirty&&!e.viewportRebuildPending}function et(e){let{width:t,height:n}=e.viewBox;return Pa(e,e.axisScale,t,n)}var Vt=new WeakMap,$d=4;function Ja(e){let t=Vt.get(e);return t||(t=new Map,Vt.set(e,t)),t}function Za(e,t){let n=Vt.get(e);n&&e!==t&&Vt.set(t,n)}function Qa(e,t,n){e.size>=$d&&e.delete(e.keys().next().value),e.set(t,n)}var ei=R.types.compose("GraphPane",(0,Da.RenderLifecycleMixin)(),R.types.model({layoutQuality:R.types.optional(R.types.number,2),linearLayout:R.types.optional(R.types.boolean,!1),layoutMode:Nn(yt),colorScheme:Nn(wt),bubbleSpread:Cn(ro,"auto"),nodeWidth:Cn(Ur,"depth"),showBubbles:R.types.optional(R.types.boolean,!1),showDeletionEdges:R.types.optional(R.types.boolean,!0),showGenes:R.types.optional(R.types.boolean,!0),showReferenceStrip:R.types.optional(R.types.boolean,!0),tubeMapFold:R.types.optional(R.types.number,0),geneTrackId:R.types.optional(R.types.string,""),repeatTrackId:R.types.optional(R.types.string,""),repeatKey:R.types.optional(R.types.string,""),walkRowSamples:R.types.maybe(R.types.frozen()),walkStrip:R.types.optional(R.types.boolean,!1),walkLayers:R.types.optional(R.types.frozen(),[]),facet:R.types.optional(Od,{}),referencePath:R.types.optional(R.types.string,""),showPerf:R.types.optional(R.types.boolean,!1),contigThickness:R.types.optional(R.types.number,6),connectorThickness:R.types.optional(R.types.number,2),darkMode:R.types.optional(R.types.boolean,!1),scale:R.types.optional(R.types.number,1),translateX:R.types.optional(R.types.number,0),translateY:R.types.optional(R.types.number,0),drawPaths:R.types.optional(R.types.boolean,!1),paneHeight:R.types.maybe(R.types.number),maxGraphNodes:R.types.optional(R.types.number,qa),colorDomain:R.types.maybe(R.types.frozen()),connectedViewId:R.types.maybe(R.types.string)})).volatile(()=>({graph:void 0,graphRegion:void 0,loadedReferencePath:void 0,layoutResult:void 0,legendSize:{width:0,height:0},indexBubbles:void 0,geneFeatures:void 0,walkGeneFeatures:void 0,repeatArrays:void 0,popStack:[],error:void 0,isLoading:!1,loadCanceled:!1,statusMessage:"",hoveredNode:null,hoveredRowWalks:[],hoveredBubble:null,pointerInPane:!1,stripHover:null,hoveredEdge:null,selectedNode:null,viewportDirty:0,positionsVersion:0,geometryVersion:0,builtViewport:void 0,paintedViewport:void 0,draggingNode:null,isPanning:!1,viewportOwner:"fit",viewportDirtyTimer:void 0,positionsDirtyFrame:0,lastFetchMs:void 0,readsShown:void 0,lastLayoutMs:void 0,lastGeometryMs:void 0,lastGeometryStrokeCount:void 0,viewportRebuildPending:!1}));var os=y(ie(),1),ge=y(oe(),1),_=y(ut(),1);function ti(e,t){let n=new Set(t),r=e.nodes.filter(d=>n.has(d.name)),o=new Set(r.map(d=>d.id)),a=new Map(e.nodes.map(d=>[d.id,d.length])),i=new Map,s=e.paths?.flatMap(d=>{let c=d.nodeIds.findIndex(p=>o.has(p));if(c<0)return[];let m=d.nodeIds.filter(p=>o.has(p));i.set(d.name,{first:c,nodeIds:m});let g=d.nodeIds.slice(0,c).reduce((p,u)=>p+(a.get(u)??0),0);return[{...d,nodeIds:m,...d.start===void 0?{}:{start:d.start+g}}]});return{name:e.name,nodes:r,edges:e.edges.filter(d=>o.has(d.from)&&o.has(d.to)),...s?.length?{paths:s}:{},anchorPaths:gt(e,i),pathVisits:e.pathVisits,anchoredBy:e.anchoredBy,referencePath:e.referencePath}}function ni(e,t){let n=new Set(e.nodes.filter(d=>O(d)&&xr(d,t)).map(d=>d.id)),r=e.paths??[];if(n.size===0||r.length===0)return e;let o=r.map(d=>{let c=-1,m=-1;return d.nodeIds.forEach((g,p)=>{n.has(g)&&(c<0&&(c=p),m=p)}),c<0?void 0:{first:c,last:m}});if(o.every((d,c)=>d?.first===0&&d.last===r[c].nodeIds.length-1))return e;let a=new Set,i=[],s=new Map;return r.forEach((d,c)=>{let m=o[c];if(m){let g=d.nodeIds.slice(m.first,m.last+1);for(let p of g)a.add(p);i.push({...d,nodeIds:g}),s.set(d.name,{first:m.first,nodeIds:g})}}),{...e,nodes:e.nodes.filter(d=>a.has(d.id)),edges:e.edges.filter(d=>a.has(d.from)&&a.has(d.to)),paths:i,pathVisits:e.pathVisits&&Dd(e.pathVisits,r,o,new Map(e.nodes.map(d=>[d.id,d.name]))),anchorPaths:gt(e,s)}}function Dd(e,t,n,r){let o=new Map,a=new Map;return t.forEach((i,s)=>{let d=ee(i.name).name,c=n[s];i.nodeIds.forEach((m,g)=>{let p=r.get(m)??m,u=e.get(p);if(!u)return;let k=`${d} ${p}`,x=o.get(k)??0;for(;x<u.length&&u[x].path!==d;)x++;let w=u[x];if(o.set(k,x+1),w&&c&&g>=c.first&&g<=c.last){let h=a.get(p);h?h.push(w):a.set(p,[w])}})}),a}function Vd(e,t,n){let r=ee(e.name).name,o=new Map,a=[],i=()=>({a:-1/0,b:1/0,detour:[],bp:0}),s=[i()];for(let d of e.nodeIds){let c=t.get(d);if(!c)continue;let m=o.get(c.name)??0;o.set(c.name,m+1);let g=n.get(`${r} ${c.name}`)?.[m]??Hr(c),p=s.at(-1),u=a.at(-1);if(O(c)){let k=c.stable.start,x=k+c.length,w=g!==(c.stable.strand??"+"),h=u!==void 0&&p.detour.length===0;h&&!u.inverted&&!w&&u.end===k?u.end=x:h&&u.inverted&&w&&u.start===x?u.start=k:(a.push({start:k,end:x,inverted:w}),s.push(i()))}else p.detour.push({node:c,strand:g}),p.bp+=c.length}return a.forEach((d,c)=>{s[c].b=d.start,s[c+1].a=d.end}),{path:e,runs:a,gaps:s}}function $n(e,t){return Number.isFinite(e.a)&&Number.isFinite(e.b)&&e.b>=e.a&&Math.max(e.b-e.a,e.bp)<t}function ri(e,t,n){let r=0,o=e.length;for(;r<o;){let a=r+o>>1;e[a]<=t?r=a+1:o=a}return r<e.length&&e[r]<n}function _d(e){let t=new Map;for(let n=1;n<e.length;n++){let r=e[n-1],o=e[n],a=r.stable.start+r.length;a!==o.stable.start&&(t.set(a,"reference-gap"),t.set(o.stable.start,"reference-gap"))}return t}function Wd(e,t,n){let r=(o,a)=>{Number.isFinite(o)&&!n.has(o)&&n.set(o,a)};for(let{runs:o,gaps:a}of e){let i=o[0],s=o.at(-1);i&&s&&(r(i.start,"walk-end"),r(s.end,"walk-end"));for(let d of o)d.inverted&&d.end-d.start>=t&&(r(d.start,"inversion"),r(d.end,"inversion"));for(let d of a)d.b<d.a?(r(d.a,"backward"),r(d.b,"backward")):$n(d,t)||(r(d.a,"variant"),r(d.b,"variant"))}for(let o=!0;o;){o=!1;let a=[...n.keys()].sort((s,d)=>s-d),i=e.flatMap(({runs:s,gaps:d})=>[...d.filter(c=>$n(c,t)).map(c=>[c.a,c.b]),...s.filter(c=>c.inverted&&c.end-c.start<t).map(c=>[c.start,c.end])]);for(let[s,d]of i)ri(a,s,d)&&(o||=!n.has(s)||!n.has(d),r(s,"overlap"),r(d,"overlap"))}return n}function Hd(e,t){let n=[],r=[],o=()=>{let a=r[0],i=r.at(-1);if(a&&i){let s=a.stable.start,d=i.stable.start+i.length,c=`${s}-${d}`;n.push({node:{id:`${c}+`,name:c,length:d-s,depth:0,stable:{refName:a.stable.refName,start:s,rank:0,strand:"+"}},members:r})}r=[]};for(let a of e)t.has(a.stable.start)&&o(),r.push(a);return o(),n}function oi(e,t){let n=e.nodes.filter(O).sort((f,G)=>f.stable.start-G.stable.start),r=e.paths??[];if(n.length===0||r.length===0)return;let o=new Map(e.nodes.map(f=>[f.id,f])),a=jr(e),i=r.map(f=>Vd(f,o,a)),s=Wd(i,t,_d(n)),d=[...s.keys()].sort((f,G)=>f-G),c=Hd(n,s),m=c.map(f=>f.node.stable.start),g=f=>{let G=0,S=m.length-1;for(;G<S;){let T=G+S+1>>1;m[T]<=f?G=T:S=T-1}return G},p=new Map,u=new Map;for(let f of c){p.set(f.node.id,f.members.map(G=>G.id));for(let G of f.members)u.set(G.id,f.node.id)}let k=new Map,x=f=>{let G=`${f.a} ${f.b} ${f.detour.map(T=>T.node.id+T.strand).join(",")}`,S=k.get(G);if(!S){let T=`r${k.size}`;S={id:`${T}+`,name:T,length:f.bp,depth:0,stable:{refName:n[0].stable.refName,start:Number.isFinite(f.a)?f.a:f.b,rank:1,strand:"+"}},k.set(G,S),p.set(S.id,f.detour.map(N=>N.node.id));for(let N of f.detour)u.has(N.node.id)||u.set(N.node.id,S.id)}return S},w=new Map,h=[],v=new Map,l=new Map,b=new Map;for(let{path:f,runs:G,gaps:S}of i){let T=[],N=[],I=!1,W=(L,z)=>{let A=T.at(-1);I&&A?.node===L&&A.strand===z||T.push({node:L,strand:z}),I=!0},E=L=>{I=!1,L.detour.length>0&&(W(x(L),"+"),I=!1)},J=L=>{(L.bp>0||L.b>L.a)&&N.push({start:L.a,end:L.b,bp:L.bp});let z=c[g(L.b>L.a?L.a:L.a-1)];for(let A of L.detour)u.has(A.node.id)||(u.set(A.node.id,z.node.id),p.get(z.node.id).push(A.node.id))};G.forEach((L,z)=>{let A=S[z];$n(A,t)&&!ri(d,A.a,A.b)?J(A):E(A);let P=g(L.start),C=g(L.end-1),D=L.end-L.start<t;if(L.inverted&&!D){I=!1;for(let B=C;B>=P;B--)W(c[B].node,"-");I=!1}else{L.inverted&&N.push({start:L.start,end:L.end,bp:L.end-L.start,inverted:!0});for(let B=P;B<=C;B++)W(c[B].node,"+")}}),E(S.at(-1));let Z=ee(f.name).name,re=0;T.forEach(({node:L,strand:z},A)=>{b.set(L.id,(b.get(L.id)??0)+1);let P=v.get(L.name)??[];P.push({path:Z,sample:f.sample??Z,start:re,strand:z}),v.set(L.name,P),re+=L.length;let C=T[A+1];if(C){let D=`${L.id}${z} ${C.node.id}${C.strand}`,B=l.get(D);B?B.pathIds.push(f.name):l.set(D,{from:L.id,to:C.node.id,fromStrand:z,toStrand:C.strand,pathIds:[f.name]})}}),h.push({...f,nodeIds:T.map(L=>L.node.id)}),w.set(f.name,N)}let M=[...c.map(f=>f.node),...k.values()].filter(f=>b.has(f.id)).map(f=>({...f,depth:b.get(f.id)}));return{graph:{...e,nodes:M,edges:[...l.values()],paths:h,pathVisits:v,reads:void 0},members:p,coarseOf:u,deviations:w,cuts:s}}var Ji=y(K(),1),ne=y(ie(),1),Zi=y(pd(),1),q=y(oe(),1);var st=y(ie(),1),qn=y(oe(),1);function jt(e,t,n){let r=new Map;for(let a of e.nodes)if(O(a)){let{refName:i}=a.stable;if(n[a.id]?.length){let s=r.get(i)??r.set(i,{nodes:[],reach:0}).get(i);s.nodes.push(a),s.reach=Math.max(s.reach,a.length)}}for(let{nodes:a}of r.values())a.sort((i,s)=>i.stable.start-s.stable.start);let o=[];for(let a of t){let i=r.get(a.refName);if(!i)continue;let s=[],d=[],c,m=1/0,g=0,p=(a.start+a.end)/2,{nodes:u,reach:k}=i;for(let x=Sr(u,a.start-k);x<u.length&&u[x].stable.start<a.end;x++){let w=u[x],h=w.stable.start,v=h+w.length;if(v<=a.start)continue;let l=n[w.id];g+=Math.min(v,a.end)-Math.max(h,a.start);let b=[];for(let G of a.exons){let S=Math.max(G.start,h),T=Math.min(G.end,v);if(T<=S)continue;let N=mn(l,(S-h)/w.length,(T-h)/w.length);N.length===1&&N.push({...N[0]}),b.push(ht(N))}b.length>0&&(s.push(...b),d.push({nodeId:w.id,d:b.join("")}));let M=Math.min(Math.max(p,h),v),f=Math.abs(M-p);if(f<m){m=f;let[G]=mn(l,(M-h)/w.length,(M-h)/w.length);c=G}}c&&o.push({gene:a,exons:s.join(""),exonsByNode:d,at:c,covered:g/(a.end-a.start)})}return o}var j=e=>+e.toFixed(1);function jd(e){let t=/^rgba?\(([^,]+),([^,]+),([^,)]+)(?:,([^)]+))?\)$/.exec(e.replaceAll(" ",""));if(!t)return{color:e,opacity:1};let n=t[4]===void 0?1:Number(t[4]);return{color:`rgb(${t[1]},${t[2]},${t[3]})`,opacity:n}}function Dn(e,t){let{color:n,opacity:r}=jd(t);return`${e}="${n}"${r<1?` ${e}-opacity="${j(r)}"`:""}`}var ai=.5,ii=.25;function si(e,t){let n=[],r=[],o=(c,m)=>{let g={d:`M${j(c)} ${j(m)}`,segments:0,x0:c,x1:c,y0:m,y1:m};return r.push(g),g},a=c=>{let m=r.at(-1)??o(c[0],c[1]);for(let g=0;g<c.length;g+=2)m.x0=Math.min(m.x0,c[g]),m.x1=Math.max(m.x1,c[g]),m.y0=Math.min(m.y0,c[g+1]),m.y1=Math.max(m.y1,c[g+1]);return m.segments++,m},i=c=>{let m=new Set;return r.map(g=>{if(!c||g.x1-g.x0>=ai||g.y1-g.y0>=ai)return g.d;let p=(g.x0+g.x1)/2,u=(g.y0+g.y1)/2,k=`${Math.round(p/ii)} ${Math.round(u/ii)}`;return g.segments===0||m.has(k)?"":(m.add(k),`M${j(p)} ${j(u)}h0`)}).join("")},s={canvas:void 0,fillStyle:"#000",strokeStyle:"#000",lineWidth:1,lineCap:"butt",lineJoin:"miter",beginPath(){r=[]},moveTo(c,m){o(c,m)},lineTo(c,m){a([c,m]).d+=`L${j(c)} ${j(m)}`},bezierCurveTo(c,m,g,p,u,k){a([c,m,g,p,u,k]).d+=`C${j(c)} ${j(m)} ${j(g)} ${j(p)} ${j(u)} ${j(k)}`},closePath(){let c=r.at(-1);c&&(c.d+="Z")},stroke(){let c=i(s.lineCap!=="butt");c&&n.push(`<path d="${c}" fill="none" ${Dn("stroke",s.strokeStyle)} stroke-width="${j(s.lineWidth)}" stroke-linecap="${s.lineCap}" stroke-linejoin="${s.lineJoin}"/>`)},fill(){let c=i(!1);c&&n.push(`<path d="${c}" ${Dn("fill",s.fillStyle)}/>`)},fillRect(c,m,g,p){n.push(`<rect x="${j(c)}" y="${j(m)}" width="${j(g)}" height="${j(p)}" ${Dn("fill",s.fillStyle)}/>`)}},d={width:e,height:t,style:{},getContext:()=>s};return s.canvas=d,{canvas:d,markup:()=>n.join("")}}var di="5.1.0";var ci=(e,t)=>!!e.referencePath&&ee(t).name===e.referencePath;function Xd(e,t){return(e.paths??[]).filter(n=>n.name===t).sort((n,r)=>(n.start??0)-(r.start??0))}function zd(e,t){let n=Xd(e,t),r=n[0];if(!r)return;let o=new Map(e.nodes.map(h=>[h.id,h])),a=new Map;e.edges.forEach((h,v)=>{a.set(`${h.from}>${h.to}`,v)});let i=h=>o.get(h)?.length??0,s=h=>h.nodeIds.reduce((v,l)=>v+i(l),0),d=n.reduce((h,v)=>h+s(v),0),c=r.start===void 0?void 0:{contig:r.contig??wr(ee(t).name),start:r.start,end:Math.max(...n.map(h=>(h.start??0)+s(h)))},m=c?c.end-c.start:d,g=new Set,p=new Set,u=new Map,k=0;for(let h of n)c&&(k=Math.max(k,(h.start??0)-c.start)),h.nodeIds.forEach((v,l)=>{if(g.add(v),l>0){let M=h.nodeIds[l-1],f=a.get(`${M}>${v}`)??a.get(`${v}>${M}`);f!==void 0&&p.add(f)}let b=i(v);u.has(v)||u.set(v,m>0?(k+b/2)/m:0),k+=b});let x=ci(e,t),w=x?[]:(e.paths??[]).filter(h=>ci(e,h.name));return{name:t,reference:x,range:c,nodeIds:g,edgeIndexes:p,progress:u,steps:n.reduce((h,v)=>h+v.nodeIds.length,0),bp:d,referenceBp:w.length>0?w.reduce((h,v)=>h+s(v),0):void 0}}function pi(e,t,n,r){let o=new Map(e.nodes.map(i=>[i.id,i])),a=new Map;for(let[i,s]of t.progress){let d=o.get(i),c=r?.midpoints.get(i),m=n.field==="progress"?s:r&&c!==void 0&&!(d?.stable&&d.stable.rank>0)?(c-r.start)/r.span:void 0;a.set(i,eo(n,m))}return a}function Yd(e,t){let n=new Set,r=0,o=e.referencePath;if(!o||t.reference)return{reversed:n,bp:r};let a=ee(t.name).name,i=new Map(e.nodes.map(s=>[s.id,s]));for(let s of t.progress.keys()){let d=i.get(s),c=d?e.pathVisits?.get(d.name):void 0,m=c?.find(p=>p.path===a)?.strand,g=c?.find(p=>p.path===o)?.strand;m&&g&&m!==g&&(n.add(s),r+=d.length)}return{reversed:n,bp:r}}function Xt(e,t,n){let r=new Set,o=t.filter(s=>!r.has(s.walk)&&r.add(s.walk)).flatMap(s=>{let d=zd(e,s.walk);return d?[{walk:d,layer:s}]:[]}).sort((s,d)=>Number(d.walk.reference)-Number(s.walk.reference));if(o.length===0)return;let a=0,i=o.map(({walk:s,layer:d})=>{let c=hn(d,s.reference,s.reference?0:a++,o.length===1),{reversed:m,bp:g}=Yd(e,s);return{...s,encoding:c,colors:pi(e,s,c,n),reversed:m,reversedBp:g}});return ui(i,n)}var Ud={field:"progress",scheme:"red"};function zt(e,t,n,r){return t.walks.map(o=>{let a=n.find(s=>s.walk===o.name)?.color,i=hn({walk:o.name,color:{...Ud,...a}},o.reference,0);return ui([{...o,encoding:i,colors:pi(e,o,i,r)}],r)})}function ui(e,t){return{walks:e,referenceDomain:t?{start:t.start,end:t.start+t.span}:void 0,nodeIds:new Set(e.flatMap(n=>[...n.nodeIds])),edgeIndexes:new Set(e.flatMap(n=>[...n.edgeIndexes])),names:new Set(e.map(n=>n.name))}}var fi='font-family="Helvetica, Arial, sans-serif" font-size="11"',Kd=48,qd=18,Jd=16,Zd=22,Qd="rgb(160,160,160)",bi="#daa520",yi="#1c1c22",ec=4,tc=1,nc=2;function ye(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function _n(e,t,n,r,o,a,i,s=1){let d=r.length>1?Kd:qd,c=r.length>1?`fill="url(#${e})"`:`fill="${r[0].color}"${s<1?` fill-opacity="${s}"`:""}`,m=r.length>1?`<linearGradient id="${e}">${r.map(p=>`<stop offset="${p.offset}" stop-color="${p.color}"/>`).join("")}</linearGradient>`:"";return{width:Math.max(d+5+(o.length+a.length)*6.2,(i?.length??0)*6.2),markup:`${m}<g transform="translate(${t} ${n})" ${fi}><rect y="5" width="${d}" height="8" rx="2" ${c}/><text x="${d+5}" y="13"><tspan font-weight="bold">${ye(o)}</tspan>${ye(a)}</text>${i?`<text y="28">${ye(i)}</text>`:""}</g>`}}function hi(e,t,n,r,o,a){let i=ko(r,a);return _n(e,t,n,fn(r.encoding),o,i.delta+i.outside+i.reversed,i.scale)}function rc(e,t){return e.replaceAll(/([ML])(-?[\d.e-]+),(-?[\d.e-]+)/g,(n,r,o,a)=>`${r}${+(Number(o)*t.scaleX+t.translateX).toFixed(1)},${+(Number(a)*t.scaleY+t.translateY).toFixed(1)}`)}function oc(e,t,n,r,o){return`<rect x="${e-n/2}" y="${t-11-4+2}" width="${n}" height="${17}" rx="3" fill="#fff" fill-opacity="0.85" stroke="${bi}"/><text x="${e}" y="${t}" font-family="Helvetica, Arial, sans-serif" font-size="${11}" fill="${yi}" text-anchor="middle"><tspan font-style="italic" font-weight="600">${ye(r)}</tspan>${o?ye(o):""}</text>`}function wi(e,t,n={}){let r=n.width??1200,o=n.height??800,a=n.region,i=n.colorDomain??a,s=n.walkRows,d=Dt(t,{region:n.fitToDrawing?void 0:a,extent:s&&t.extent?bt(s):void 0}),c=t.pixelRows??!1,m=new Map(e.nodes.map(A=>[A.id,A])),g=kt(n.colorScheme??"auto",e),p=g==="reference-position"&&!t.tubeMap?Ge(e,i):void 0,u=p&&{start:p.start,end:p.start+p.span},k=t.tubeMap?[]:ve(e),x=n.walks??[],w=x.some(A=>A.color?.field==="reference")?p??Ge(e,i):void 0,h=x.length>0&&!t.tubeMap?Xt(e,x,w):void 0,v=vt(n.facet),l=v.field&&h&&h.walks.length>1?zt(e,h,x,w):void 0,b=new Map((e.paths?.length?Ve(e.paths):[]).map(A=>[A.name,A.label])),M=A=>b.get(A)??A,f=n.referenceName??vr(e,a),G=h?.referenceDomain&&{...h.referenceDomain,name:f},S=n.contigThickness??6,T=n.nodeWidth??"depth",N=n.genes?.length&&!t.tubeMap&&!s?jt(e,n.genes,t.nodePositions):[],I=xt(e,m,S,T),W=0;function E(A,P,C,D){let B=[],pe=H=>{let Q=I.halfWidthPx(H)*2;return A?.nodeIds.has(H)?Math.max(Q,A.walks.length*ec):Q},Y=N.flatMap(H=>H.exonsByNode.map(({nodeId:Q,d:U})=>({d:rc(U,P),inner:pe(Q)+2*tc})));if(Y.length>0){let H=`exons${W++}`,Q=(U,pn,un)=>`<path d="${un}" fill="none" stroke="${U}" stroke-width="${pn}" stroke-linecap="round" stroke-linejoin="round"/>`;B.push(`<mask id="${H}" maskUnits="userSpaceOnUse" x="0" y="0" width="${C}" height="${D}">${Y.map(U=>Q("#fff",U.inner+2*nc,U.d)).join("")}${Y.map(U=>Q("#000",U.inner,U.d)).join("")}</mask><rect width="${C}" height="${D}" fill="${bi}" mask="url(#${H})"/>`)}let de=H=>({x:H.x*P.scaleX+P.translateX,y:H.y*P.scaleY+P.translateY}),Oe={width:C,height:D};for(let{item:H,x:Q,y:U,w:pn,text:un}of Vr(fo(N,de,S),Oe,Dr(Oe))){let cd=de(H.at).y+S/2;B.push(`<line x1="${Q}" x2="${Q}" y1="${U-11-2}" y2="${cd}" stroke="${yi}" stroke-width="0.8" stroke-opacity="0.6"/>`,oc(Q,U,pn,H.gene.name,un.slice(H.gene.name.length)))}s&&B.push(Le(xn(s,{...P,width:C,height:D},{ramp:u,rowGenes:n.rowGenes})));let Re=s?[s.reference,...s.rows].map((H,Q)=>({label:H.label,y:Q*20})):t.rowLabels??[];for(let{label:H,y:Q}of Re){let U=Q*P.scaleY+P.translateY;U>=0&&U<=D&&B.push(`<text x="6" y="${U+4}" ${fi} stroke="#fff" stroke-width="3" paint-order="stroke">${ye(H)}</text>`)}return B.join("")}function J(A,P,C){let D=Ze(d,P,C,c,l?{padLeft:12,padTop:12,padRight:12,padBottom:12}:{});if(!D)return"";let B=Te(D.scale,c),{canvas:pe,markup:Y}=si(P,C),de=new yo(pe);de.uploadGeometry(St({nodePositions:s?{}:t.nodePositions,graph:e,nodeById:m,colorScheme:g,contigThickness:S,connectorThickness:n.connectorThickness??2,drawPaths:!1,nodeWidth:T,highlight:A,axis:B,referenceRamp:p,deletions:new Map(k.map(Re=>[Re.edgeIndex,Re.bypassed])),deletionRoutes:t.deletionRoutes,stranded:t.stranded,hiddenEdges:new Set(n.showDeletionEdges?[]:k.map(Re=>Re.edgeIndex))}));let Oe={scaleX:B.scaleX,scaleY:B.scaleY,translateX:D.translateX,translateY:D.translateY};return de.updateTransform({...Oe,dpr:1}),de.render([1,1,1,1]),Y()+E(A,Oe,P,C)}let Z=[],re;if(l){let A=Gt(l.map(C=>C.walks[0].name),v.field||"walk",v.domain),P=Mt({count:A.count,bounds:d,pixelRows:c,width:r,room:o,columns:A.columns??v.columns});l.forEach((C,D)=>{let B=A.cells[D],pe=B%P.columns*(P.width+8),Y=Math.floor(B/P.columns)*(P.height+34+8),de=C.walks[0];Z.push(hi(`key${D}`,pe+6,Y+2,de,M(de.name),G).markup,`<svg x="${pe}" y="${Y+34}" width="${P.width}" height="${P.height}">${J(C,P.width,P.height)}</svg>`)}),re=P.total}else{let A=6,P=Y=>{Z.push(Y.markup),A+=Y.width+Jd};if(h&&(h.walks.forEach((Y,de)=>{P(hi(`key${de}`,A,2,Y,M(Y.name),G))}),P(_n("faded",A,2,[{offset:0,color:Qd}],"",`not on ${h.walks.length===1?M(h.walks[0].name):"these walks"}`,void 0,.3))),s){let Y=kn(wn(s,{ramp:u,genes:n.rowGenes?.size?n.rowGeneGaps:void 0}),A,2,"rows-key");P({width:Y.width,markup:Le(Y.tree)})}else!h&&p&&P(_n("ramp",A,2,fn({field:"reference",scheme:"rainbow"}),f?`${f} position`:"Reference position","",wo(f,p.start,p.start+p.span)));let C=Z.length>0?34:0,D=r-2*$,B=c||!(d.w>0)?d.h:d.h*D/d.w,pe=Math.max(160,Math.min(o-C,Math.ceil(B+2*$)));Z.push(`<svg y="${C}" width="${r}" height="${pe}">${J(h,r,pe)}</svg>`),re=C+pe}let L=n.walkStrip;if(L&&!s&&!t.tubeMap){let A=Tt(L.rows,{width:r}),P=kn(wn(L.rows,{ramp:u,genes:ho(A,L.rowGenes,L.rowGeneGaps)}),6,re+A.height,"strip-key");Z.push(`<line x1="0" x2="${r}" y1="${re+.5}" y2="${re+.5}" stroke="#ddd"/>`,`<svg y="${re}" width="${r}" height="${A.height}">${Le(xn(L.rows,A,{ramp:u,rowGenes:L.rowGenes,idPrefix:"strip"}))}${Le(go(L.rows,A,new Set(x.map(C=>C.walk))))}</svg>`,Le(P.tree)),re+=A.height+Zd}let z=JSON.stringify({generator:`@jbrowse/bandage-core@${di}`,...n.spec===void 0?{}:{spec:n.spec}});return`<svg xmlns="http://www.w3.org/2000/svg" width="${r}" height="${re}" viewBox="0 0 ${r} ${re}"><metadata>${ye(z)}</metadata><rect width="${r}" height="${re}" fill="#fff"/>${Z.join("")}</svg>
|
|
3
|
-
`}var ac=e=>e.bp1>e.bp0;function ki(e,t){let n=e.filter(ac);if(n.length===0){let a=e[0];return a?[{tx:a.x0,sx:t(a.bp0)}]:[]}let r=n.map(a=>({c:a,s0:t(a.bp0),s1:t(a.bp1),trimLeft:0,trimRight:0}));for(let a=0;a+1<r.length;a++){let i=r[a],s=r[a+1],c=Math.min(s.c.x0-i.c.x1,24)-(s.s0-i.s1);if(c>0){let m=(i.s1-i.s0)/2,g=(s.s1-s.s0)/2,p=Math.min(c/2,m),u=Math.min(c-p,g);p=Math.min(c-u,m),i.trimRight=p,s.trimLeft=u}}let o=[];for(let{c:a,s0:i,s1:s,trimLeft:d,trimRight:c}of r)o.push({tx:a.x0,sx:i+d},{tx:a.x1,sx:s-c});return o}function xi(e,t){let n=e.length;if(n===0)return t;let r=e[0],o=e[n-1];if(t<=r.tx)return r.sx+(t-r.tx);if(t>=o.tx)return o.sx+(t-o.tx);let a=0,i=n-1;for(;i-a>1;){let m=a+i>>1;e[m].tx<=t?a=m:i=m}let s=e[a],d=e[i],c=d.tx-s.tx;return c>0?s.sx+(t-s.tx)/c*(d.sx-s.sx):s.sx}var ic=.05,Ut=9;function sc(e,t){let{minY:n,maxY:r}=e.layout.bounds,o=r-n;return e.columns&&o>0?Math.max(ic,Math.min(1,t/o)):1}function Si(e,t){let{scaleX:n,translateX:r,translateY:o}=t,a=t.scaleY*sc(e,t.usableHeight),i=d=>(d-e.yOffset)*a+o,{columns:s}=e;if(s){let d=ki(s,c=>c*n+r);return{x:c=>xi(d,c),y:i,yScale:a}}return{x:d=>d*n+r,y:i,yScale:a}}function Ri(e,{x:t,y:n},r,o){let a=null;return e.layout.nodes.forEach(i=>{i.order>=0&&t(i.x-Ut)<=r&&r<=t(i.x+i.pixelWidth+Ut)&&n(i.y-Ut)<=o&&o<=n(i.y+i.contentHeight+Ut)&&(a=i.name)}),a}var Qt=y(K(),1),Yi=y(ie(),1),Ui=y(hd(),1),Kn=y(ut(),1);var Zt=y(K(),1),xe=y(ie(),1);var dc=.9,Wn=2,cc=1e3;function Mi(e,t,n,r=a=>a,o=[]){let a=new Map(e.nodes.map(s=>[s.name,s])),i=[];for(let s of t){let d=[],c=1/0,m=-1/0,g=1/0,p=[],u=[];for(let v of At(s)){let l=a.get(v),b=l&&n[l.id];if(!(!l||!b?.length)){if(O(l)&&(l.stable.start<s.start||l.stable.start>=s.end)){u.push(b[Math.floor(b.length/2)]);continue}p.push(l.id),d.push(ht(b.length===1?[b[0],b[0]]:b));for(let M of b)c=Math.min(c,M.x),m=Math.max(m,M.x),g=Math.min(g,M.y)}}if(p.length===0)continue;let k={x:(c+m)/2,y:g},x=u.length?{x:u.reduce((v,l)=>v+l.x,0)/u.length,y:u.reduce((v,l)=>v+l.y,0)/u.length}:k,w=new Map;for(let v of s.routes??[])for(let l of new Set(v.steps))w.set(l,(w.get(l)??0)+1);let h=[];for(let v of s.routes??[]){if(s.longestAlleleLength<cc)break;if(v.steps.length===0)continue;let l=Math.min(...v.steps.map(f=>w.get(f))),b,M=-1;for(let f of v.steps)if(w.get(f)===l)for(let G of n[f]??[]){let S=Math.hypot(G.x-x.x,G.y-x.y);S>M&&(M=S,b=G)}b&&h.push({route:v,at:b,text:pc(v,r)})}i.push({bubble:s,...Lt(s,o),path:d.join(""),labelAt:k,members:p.length,nodeIds:p,whole:p.length>=dc*e.nodes.length,routes:h})}return i}function pc(e,t){let n=[...new Set(e.walks.map(t))].sort(),r=n.slice(0,Wn).join(", "),o=n.length>Wn?` +${n.length-Wn}`:"";return`${r}${o} \xB7 ${so(e.bp)}`}function vi(e){if(!e.nodes.some(O))return[];let t=new Map(e.nodes.map(p=>[p.id,p])),n=Ir(e),r=new Map(n.map((p,u)=>[p,u])),o=new Int32Array(n.length+1),a=new Map,i=new Set;for(let p of e.edges){let u=r.get(p.from),k=r.get(p.to);if(u===void 0||k===void 0||u===k)continue;i.add(`${p.from}>${p.to}`).add(`${p.to}>${p.from}`);let[x,w]=u<k?[u,k]:[k,u];o[x+1]++,o[w]--;let[h,v]=u<k?[p.from,p.to]:[p.to,p.from];(a.get(h)??a.set(h,new Set).get(h)).add(v)}for(let p=1;p<o.length;p++)o[p]+=o[p-1];let s=e.nodes.filter(O).sort((p,u)=>p.stable.start-u.stable.start),d=new Set([s[0].id,s.at(-1).id]),c=s.map(p=>[p,r.get(p.id)]).filter(([p,u])=>d.has(p.id)||o[u]===0).sort(([p,u],[k,x])=>u-x||p.stable.start-k.stable.start),m=e.paths?.map(p=>{let u=new Map;return p.nodeIds.forEach((k,x)=>{u.has(k)||u.set(k,x)}),u}),g=[];for(let p=0;p+1<c.length;p++){let[u,k]=c[p],[x,w]=c[p+1],h=n.slice(k+1,w);if(h.length===0)continue;let v=new Map([[u.id,{min:0,max:0,n:1}]]);for(let E of[u.id,...h]){let J=v.get(E);if(J)for(let Z of a.get(E)??[]){if(r.get(Z)>w)continue;let L=Z===x.id?0:t.get(Z).length,z=v.get(Z);v.set(Z,{min:Math.min(z?.min??1/0,J.min+L),max:Math.max(z?.max??-1/0,J.max+L),n:Math.min(io,J.n+(z?.n??0))})}}let l=m&&uc(e,t,m,u.id,x.id),b=l?.n?l:void 0,M=b??v.get(x.id)??{min:0,max:0,n:0},f=l!==void 0&&l.left>0,G=u.stable.start+u.length,S=x.stable.start,T=[u.id,...h.filter(E=>O(t.get(E))),x.id],N=T.some((E,J)=>J>0&&!i.has(`${T[J-1]}>${E}`)),I=N||f,W=N&&!b;g.push({refName:u.stable.refName,start:G,end:S,segmentCount:h.length+2,pathCount:M.n,inversion:!1,shortestAlleleLength:W?S-G:M.min,longestAlleleLength:W?S-G:M.max,segments:[u,...h.map(E=>t.get(E)),x].map(E=>E.name).join(","),shortestAllele:void 0,longestAllele:void 0,partial:I,routes:b?.routes})}return g}function uc(e,t,n,r,o){let a=new Map,i=1/0,s=-1/0,d=0;return e.paths.forEach((c,m)=>{let g=n[m].get(r),p=n[m].get(o);if(g===void 0||p===void 0){(g!==void 0||p!==void 0)&&d++;return}let u=c.nodeIds.slice(Math.min(g,p)+1,Math.max(g,p));p<g&&u.reverse();let k=0;for(let h of u)k+=t.get(h)?.length??0;let x=u.join(","),w=a.get(x)??{steps:u,bp:k,walks:[]};w.walks.push(c.name),a.set(x,w),i=Math.min(i,k),s=Math.max(s,k)}),a.size||d?{min:i,max:s,n:a.size,left:d,routes:[...a.values()]}:void 0}var Gi=y(md(),1);function Li(e,t,n){if(t==="uniform"||t==="grey")return;let r={...qr(e),referenceRamp:n};return new Map(e.nodes.map((o,a)=>[o.id,(0,Gi.abgrToCssRgba)(Jr(o,a,t,r))]))}var rt=y(K(),1),ke=y(ie(),1);var Kt=y(K(),1),Ai=y(ie(),1),mc=/^[^#]+#\d+$/;function lc(e,t){let n=e.assemblyNameToPanSN??{},r=new Set(Object.values(n)),o={};for(let{name:a,aliases:i}of t){let s=i.find(d=>mc.test(d));s!==void 0&&!r.has(s)&&(o[a]=s)}return Object.keys(o).length===0?e:{...e,assemblyNameToPanSN:{...o,...n}}}function he(e,t){let n=(0,Kt.readConfObject)(t,"adapter");return n.type==="GbzBaseSyntenyAdapter"?lc(n,(0,Ai.getSession)(e).assemblyManager.assemblyList.map(r=>({name:(0,Kt.readConfObject)(r,"name"),aliases:(0,Kt.readConfObject)(r,"aliases")??[]}))):n}function Ti(e){let t=[];for(let n of[...e].sort((r,o)=>r.start-o.start)){let r=t.at(-1);r&&n.start<=r.end?r.end=Math.max(r.end,n.end):t.push({...n})}return t}function Pi(e){let t=[],n=new Map;for(let r of[...e].sort((o,a)=>o.start-a.start)){let o=`${r.refName} ${r.strand} ${r.name}`,a=n.get(o);if(a&&r.start<a.end)a.end=Math.max(a.end,r.end),a.exons=Ti([...a.exons,...r.exons]);else{let i={...r,exons:Ti(r.exons)};t.push(i),n.set(o,i)}}return t}var tt=new Set(["Gff3TabixAdapter","Gff3Adapter","BedTabixAdapter","BedAdapter","GtfTabixAdapter","GtfAdapter","BigBedAdapter","NCListAdapter"]),gc=/gene|refseq|gencode|ensembl|annotation/i,hc=new Set(["BedTabixAdapter","BedAdapter"]);function qt(e,t){if(t)return e.find(r=>r.trackId===t);let n=e.filter(r=>tt.has(r.adapterType));return n.find(r=>gc.test(`${r.trackId} ${r.name??""}`))??n.find(r=>!hc.has(r.adapterType))}function ce(e,t){return typeof e.get=="function"?e.get(t):e[t]}var fc=new Set(["exon","CDS","five_prime_UTR","three_prime_UTR","UTR"]);function Ni(e,t){let n=ce(e,"type");typeof n=="string"&&fc.has(n)&&t.push({start:ce(e,"start"),end:ce(e,"end")});let r=ce(e,"subfeatures");for(let o of r??[])Ni(o,t)}function bc(e){let t=[...e].sort((r,o)=>r.start-o.start),n=[];for(let r of t){let o=n.at(-1);o&&r.start<=o.end?o.end=Math.max(o.end,r.end):n.push({...r})}return n}function Hn(e){let t=[];for(let n of e){let r=ce(n,"gene_name")??ce(n,"name")??ce(n,"id"),o=ce(n,"start"),a=ce(n,"end");if(!r||!(a>o))continue;let i=[];Ni(n,i),t.push({name:r,refName:ce(n,"refName"),start:o,end:a,strand:ce(n,"strand")??0,exons:i.length?bc(i):[{start:o,end:a}]})}return Pi(t)}var zn=new Set(["BedAdapter","BedTabixAdapter","BigBedAdapter","VcfAdapter","VcfTabixAdapter"]),yc=/repeat|tandem|\bstr\b|vntr|trf|trgt|vamos|expansion|microsat/i;function Ci(e,t){return t?e.find(r=>r.trackId===t):e.filter(r=>zn.has(r.adapterType)).find(r=>yc.test(`${r.trackId} ${r.name??""}`))}function nt(e,t){return typeof e.get=="function"?e.get(t):e[t]}var Ii=/^\w+=[^;]*(;\w+=[^;]*)*$/;function wc(e){let t=nt(e,"name");if(!(typeof t!="string"||!Ii.test(t)))return Object.fromEntries(t.split(";").map(n=>{let r=n.indexOf("=");return[n.slice(0,r),n.slice(r+1)]}))}function ue(e,t){let n=nt(e,t);return n!==void 0?n:nt(e,"INFO")?.[t]??wc(e)?.[t]}var Ei=["RUS","MOTIFS","RU","motifs","motif","sequence","consensus"],kc=["RUL","period","PERIOD","consensusSize","unit","unitLength"],xc=["TRID","REPID","VARID","ID","name","id"];function Jt(e,t){for(let n of t){let r=ue(e,n),o=String((Array.isArray(r)?r[0]:r)??"").split(",")[0].trim();if(o!==""&&o!==".")return o}}var Bi=/^[ACGTURYSWKMBDHVN]+$/i;function Sc(e){let t=Number(Jt(e,kc));if(Number.isFinite(t)&&t>0)return Math.round(t);let n=Jt(e,Ei);return n&&Bi.test(n)?n.length:void 0}function we(e){return(Array.isArray(e)?e:String(e??"").split(",")).map(n=>{let r=n===""||n===null||n===void 0?NaN:Number(n);return Number.isFinite(r)?r:void 0})}function Xn(e){return(Array.isArray(e)?e:String(e??"").split(",")).map(n=>{let r=String(n??"").trim();return r===""||r==="."?void 0:r})}var jn="<CNV:TR>";function Rc(e){let t=Xn(nt(e,"ALT"));if(!t.includes(jn))return;let n=we(ue(e,"RN")),r=Xn(ue(e,"RUS")),o=we(ue(e,"RUL")),a=we(ue(e,"RUC")),i=we(ue(e,"RB")),s=0;return t.map((d,c)=>{let m=n[c]??(d===jn?1:0),g=0,p=0;for(let u=0;u<m;u++,s++){let k=r[s],x=o[s]??(k&&Bi.test(k)?k.length:void 0),w=a[s],h=i[s]??(x&&w!==void 0?Math.round(x*w):void 0);h!==void 0&&(g+=h,p++)}return d===jn&&m>0&&p===m?g:void 0})}function Mc(e,t,n){let r=e?.includes("|");return(e??"").split(/[/|]/).flatMap((o,a)=>{let i=Number(o),s=i>0?t[i-1]:n;return!Number.isInteger(i)||s===void 0?[]:[{bp:s,...r?{haplotype:a+1}:{}}]})}function vc(e,t,n){let r=nt(e,"samples"),o={};for(let[a,i]of Object.entries(r??{})){let s=we(i.SD),d=we(i.AL).flatMap((m,g)=>m!==void 0&&m>0?[s[g]===void 0?{bp:m}:{bp:m,spanningReads:s[g]}]:[]),c=d.length>0||!t?d:Mc(Xn(i.GT)[0],t,n);c.length>0&&(o[a]=c)}return Object.keys(o).length>0?o:void 0}function Gc(e,t){let n=ue(e,"start"),r=ue(e,"end"),o=we(ue(e,"SVLEN"))[0];return t&&o!==void 0?{start:n+1,end:n+1+o}:{start:n,end:r}}function Fi(e){let t=[];for(let n of e){let r=Rc(n),{start:o,end:a}=Gc(n,r!==void 0),i=Sc(n);if(!(a>o)||i===void 0)continue;let s=ue(n,"refName"),d=Jt(n,Ei),c=Jt(n,xc);t.push({key:`${s}:${o}-${a}`,name:(c&&!Ii.test(c)?c:void 0)??(d&&d.length<=12?`(${d})n`:`${s}:${(o+1).toLocaleString()}-${a.toLocaleString()}`),refName:s,start:o,end:a,unit:i,motif:d,calls:vc(n,r,a-o)})}return t.sort((n,r)=>n.start-r.start)}var Oi=ei.views(e=>({get defaultLayoutMode(){return"force"},get defaultColorScheme(){return"auto"},get hasPendingSource(){return!1},get canRetryLoad(){return!1},get sourceTrack(){try{return(0,ke.getContainingTrack)(e).configuration}catch{return}}})).views(e=>({get chosenLayoutMode(){return e.layoutMode??e.defaultLayoutMode},get chosenColorScheme(){return e.colorScheme??e.defaultColorScheme}})).views(e=>({get paneWidth(){return(0,ke.getContainingView)(e).width},get drawnGraph(){return e.layoutResult?.tubeMap?.coarse?.graph??e.graph}})).views(e=>({get nodeById(){if(e.drawnGraph){let t=new Map;for(let n of e.drawnGraph.nodes)t.set(n.id,n);return t}},get nodeLengths(){let t=new Map;for(let n of e.drawnGraph?.nodes??[])t.set(n.id,n.length);return t},get nodeCount(){return e.graph?.nodes.length??0},get edgeCount(){return e.graph?.edges.length??0},get pathCount(){return e.graph?.paths?.length??0},get hasGraph(){return e.graph!==void 0},get geometryPainted(){return On(e)},get showLoading(){return e.error===void 0&&(e.isLoading||e.hasPendingSource||e.graph!==void 0&&!On(e))},get canCancelLoad(){return e.isLoading&&!e.layoutResult},get usesLayoutEngine(){return e.graph?zr(e.chosenLayoutMode,e.graph):!1},get canAnchorLayout(){return e.graph?.nodes.some(t=>t.stable?.rank===0)??!1},get anchorPaths(){return e.graph?.anchorPaths??[]},get walkChoices(){let t=e.graph?.paths;return t?.length?Ve(t):[]},get effectiveDrawPaths(){return e.drawPaths&&ln(e.graph?.paths?.length??0)},get activeReferencePath(){return e.graph?.referencePath},get rampDomain(){return e.colorDomain??e.graphRegion},get walkRamp(){let{graph:t}=e;return t&&e.walkLayers.some(n=>n.color?.field==="reference")?Ge(t,this.rampDomain):void 0},get modeDrawsNodes(){return V(e.chosenLayoutMode).drawsNodes},get liftedWalkLayers(){return e.walkLayers.length>0||!this.modeDrawsNodes?e.walkLayers:e.hoveredRowWalks.map(t=>({walk:t}))},get walkLift(){let{graph:t}=e,n=this.liftedWalkLayers;return t&&n.length>0&&!e.layoutResult?.tubeMap?Xt(t,n,this.walkRamp):void 0},get facetPanels(){let{graph:t}=e,n=this.walkLift;return e.facet.field!==""&&this.modeDrawsNodes&&t&&n&&e.walkLayers.length>1&&n.walks.length>1?zt(t,n,e.walkLayers,this.walkRamp):void 0},get drawnWalks(){return this.facetPanels?.map(t=>t.walks[0])??this.walkLift?.walks??[]},get liftsWalks(){return!Pe.has(e.chosenLayoutMode)},get walkReference(){let t=this.walkLift?.referenceDomain;return t&&{...t,name:e.graphRegion?.refName}},walkLabel(t){return this.walkChoices.find(n=>n.name===t)?.label??t},get liftPaintsOffReference(){for(let t of this.walkLift?.walks??[])if(t.encoding.field!=="walk"){for(let n of t.colors.values())if(n===to)return!0}return!1},get liftedWalksLabel(){let t=this.walkLift?.walks??[];return t.length===1?this.walkLabel(t[0].name):"these walks"},get effectiveColorScheme(){return e.layoutResult?.tubeMap&&(this.tubeMapReads||e.chosenColorScheme==="auto")?"uniform":kt(e.chosenColorScheme,e.graph)},get tubeMapReads(){return(e.layoutResult?.tubeMap?.layout.reads.length??0)>0},get colorSchemeLock(){return this.walkLift?{value:"By walk",why:"Each lifted walk colours its own lane: set it under the menu, Walk, Colour"}:this.tubeMapReads?{value:"By strand",why:"Reads take the reds and blues, so the tube map leaves its nodes clear"}:void 0},get nodePositions(){return e.layoutResult?.nodePositions},get labelsNodeSizes(){return!e.layoutResult?.tubeMap&&!this.walkLift},get rowLabels(){return e.layoutResult?.rowLabels??[]},get alleleDeletions(){return e.layoutResult?.alleleDeletions??[]},get deletionRoutes(){return e.layoutResult?.deletionRoutes},get stranded(){return e.layoutResult?.stranded},get pixelRows(){return e.layoutResult?.pixelRows??!1},get zoomPercent(){return`${(e.scale*100).toFixed(1)}%`},get isDefaultViewport(){return e.scale===1&&e.translateX===0&&e.translateY===0}})).views(e=>({get poppedFrom(){return e.popStack.at(-1)},get derivedBubbles(){return e.graph?vi(e.graph):[]}})).views(e=>({get bubbles(){return e.indexBubbles?.length?e.indexBubbles:e.derivedBubbles}})).views(e=>({get cutHaplotypes(){},get sourceGfaLocation(){},get sourceAdapter(){let t=e.sourceTrack;return t?he(e,t):void 0},get sourceTrackId(){let t=e.sourceTrack;return t?(0,rt.readConfObject)(t,"trackId"):void 0},get assemblyTrackChoices(){let t=e.graphRegion;return t?(0,ke.getSession)(e).tracks.filter(n=>(0,rt.readConfObject)(n,"assemblyNames").includes(t.assemblyName)).map(n=>({trackId:n.trackId,name:(0,rt.readConfObject)(n,"name"),adapterType:(0,rt.readConfObject)(n,"adapter").type})):[]}})).views(e=>({get geneTrackChoices(){return e.assemblyTrackChoices.filter(t=>tt.has(t.adapterType))},get repeatTrackChoices(){return e.assemblyTrackChoices.filter(t=>zn.has(t.adapterType))},get repeatChoices(){return e.repeatArrays??[]}})).views(e=>({get repeatTrack(){return Ci(e.repeatTrackChoices,e.repeatTrackId)},get selectedRepeat(){return e.repeatChoices.find(t=>t.key===e.repeatKey)},get backbone(){return e.graph?Mr(e.graph):void 0},get cutWalkRows(){return e.graph?gn(e.graph,e.graphRegion):void 0},assemblySpellings(t){let{assemblyManager:n}=(0,ke.getSession)(e),r=n.has(t)?n.get(t):void 0,o=e.sourceAdapter?.assemblyNameToPanSN??{},a=[t,...r?[r.name,...r.aliases]:[]];return{name:t,aliases:[...a,...a.flatMap(i=>o[i]??[])]}},get drawsLoadedReference(){let t=e.graph;return t?.anchoredBy==="tags"||t?.referencePath!==void 0&&t.referencePath===e.loadedReferencePath}})).views(e=>({get geneAssembly(){let t=e.graphRegion;return t?e.assemblySpellings(t.assemblyName):void 0}})).views(e=>({get backboneGenes(){let{backbone:t,geneAssembly:n,geneFeatures:r}=e,o=e.drawsLoadedReference||n!==void 0&&Gr(t,[n])!==void 0;return t&&r&&o?Ar(r,t):void 0}})).views(e=>({get nodeNeighbors(){return e.drawnGraph?mt(e.drawnGraph):void 0},get nodeInk(){return xt(e.drawnGraph,e.nodeById,e.contigThickness,e.nodeWidth)},get deletions(){return e.graph&&this.drawsNodes?ve(e.graph):[]},get walkRowBars(){if(e.chosenLayoutMode!=="walkrows"||!e.graph)return;let t=e.selectedRepeat,n=t?gn(e.graph,t,t.unit):e.cutWalkRows;if(!n)return;let r=ft(n.rows,e.walkRowSamples),[o,...a]=Do([n.reference,...r],t?.calls);return{...n,reference:o,rows:a}},get drawsNodes(){return!e.layoutResult?.tubeMap&&!this.walkRowBars},get drawnRowLabels(){let t=this.walkRowBars;return t?[t.reference,...t.rows].map((n,r)=>({label:n.label,y:r*20})):e.rowLabels},get fitPadLeft(){return Math.max($,...this.drawnRowLabels.map(t=>_r(t.label,0).x1+6))},get genePins(){le(e.positionsVersion);let t=e.layoutResult?.nodePositions;return e.showGenes&&this.drawsNodes&&e.graph&&e.backboneGenes&&t?jt(e.graph,e.backboneGenes,t):[]},get bubbleHalos(){le(e.positionsVersion);let t=e.layoutResult?.nodePositions;if(!e.showBubbles||!this.drawsNodes||!e.graph||!t)return[];let n=new Map(e.walkChoices.map(r=>[r.name,r.label]));return Mi(e.graph,e.bubbles,t,r=>n.get(r)??r,e.repeatArrays)},get referenceRamp(){return e.effectiveColorScheme==="reference-position"&&e.drawnGraph?Ge(e.drawnGraph,e.rampDomain):void 0},get assemblyNames(){let t=e.graphRegion;return t?[t.assemblyName]:[]},get scaleX(){return Te(e.scale,e.pixelRows).scaleX},get scaleY(){return Te(e.scale,e.pixelRows).scaleY},get axisScale(){return Te(e.scale,e.pixelRows)},get layoutBounds(){let t=e.layoutResult,n=this.walkRowBars;return t?Dt(t,{region:e.popStack.length===0?e.graphRegion:void 0,extent:n&&t.extent?bt(n):void 0}):void 0}})).views(e=>({get geneTrack(){return qt(e.geneTrackChoices,e.geneTrackId)},get deletionEdgeIndexes(){return new Map(e.deletions.map(t=>[t.edgeIndex,t.bypassed]))},get hiddenEdgeIndexes(){return new Set(e.showDeletionEdges?[]:e.deletions.map(t=>t.edgeIndex))},get referenceRampDomain(){let t=e.referenceRamp;return t?{start:t.start,end:t.start+t.span}:void 0},get referenceRampOffKeys(){let t=e.referenceRamp,n=e.layoutResult,r=n?.tubeMap?n.nodePositions:void 0,o=!1,a=!1;if(t&&e.drawnGraph)for(let i of e.drawnGraph.nodes)r&&!r[i.id]||(t.midpoints.has(i.id)?i.stable&&i.stable.rank>0&&(o=!0):a=!0);return{offReference:o,unplaced:a}},get tubeMapNodeColors(){let t=e.drawnGraph;return e.layoutResult?.tubeMap&&t?Li(t,e.effectiveColorScheme,e.referenceRamp):void 0},get tubeMapTubeColors(){let t=e.layoutResult?.tubeMap?.pathColors,n=t&&this.tubeMapNodeColors?t.map((a,i)=>Wr(i,t.length)):t,r=new Set(e.hoveredRowWalks),o=e.drawnGraph?.paths;return n&&o&&r.size>0?n.map((a,i)=>r.has(o[i]?.name??"")?a:Kr):n},nodeSpan(t){let{nodeById:n,nodeNeighbors:r}=e;return n&&r?Me({nodeId:t,nodeById:n,neighbors:r}):void 0}})).views(e=>({get pathLegend(){let t=e.graph?.paths,n=e.layoutResult?.tubeMap;return(e.drawPaths||n)&&t&&ln(t.length)?Ve(t,e.tubeMapTubeColors):[]},get hoveredSpan(){let t=e.hoveredNode,n=e.hoveredBubble;return t!==null?e.nodeSpan(t):n?{start:n.start,end:n.end}:void 0}})).views(e=>({get hoverHighlight(){let t=e.graphRegion,n=e.hoveredSpan;return t&&n?{refName:t.refName,assemblyName:t.assemblyName,...n}:void 0}}));var Yn=y(K(),1);function te(e){return typeof e=="object"&&e!==null}function Lc(e){return te(e)&&e.type==="LinearGenomeView"&&typeof e.id=="string"&&typeof e.navToLocString=="function"&&Array.isArray(e.assemblyNames)}function ot(e){return e.flatMap(t=>te(t)&&Array.isArray(t.views)?[t,...t.views]:[t])}function at({views:e,connectedViewId:t,assemblyName:n}){let r=ot(e).filter(a=>Lc(a)).filter(a=>a.assemblyNames.includes(n));return r.find(a=>a.id===t)??(r.length===1?r[0]:void 0)}function it(e,t){let n=e.assemblyManager;return n?.has(t)?n.get(t)?.name??t:t}function Di(e,t,n){n.catch(r=>{console.error(`[GraphGenomeView] ${t}`,r),e.notifyError?.(`${t}: ${r}`,r)})}var Ac=1e3;function Un(e,t=Ac){let n=Math.max(0,Math.ceil((t-(e.end-e.start))/2));return{...e,start:Math.max(0,e.start-n),end:e.end+n}}function Vi(e,t){return t?e.map(n=>n.rank===0?{...n,sample:t.assemblyName,haplotype:void 0,refName:t.refName,start:t.start,end:t.end}:n):e}function _i({session:e,location:t,assembly:n,connectedViewId:r,tracks:o=[]}){let a=at({views:e.views,connectedViewId:r,assemblyName:n}),i;return a?(Di(e,`Could not show ${n} ${je(t)}`,Promise.resolve(a.navToLocString(Et(t),n))),i=a.id):i=e.addView("LinearGenomeView",{displayName:`${n} \u2014 ${je(t)}`,init:{assembly:n,loc:Et(t),tracks:o}}).id,i}function Wi({session:e,location:t,assembly:n,connectedViewId:r}){let o=at({views:e.views,connectedViewId:r,assemblyName:n});return o&&e.addHighlight?.({refName:t.refName,start:t.start,end:t.end,assemblyName:n}),o!==void 0}function $i(e,t){if(t===void 0)return[];let n=e.tracks.find(o=>(0,Yn.readConfObject)(o,"trackId")===t),r=n?(0,Yn.readConfObject)(n,"assemblyNames"):[];return Array.isArray(r)?r.filter(o=>typeof o=="string").map(o=>it(e,o)):[]}function Hi({session:e,contributors:t,trackId:n,graphTrackId:r}){let o=$i(e,r),a=$i(e,n),i=t.filter(c=>a.includes(c.sample)),s=i.length>=2?i:t,d={init:{views:s.map(c=>({assembly:c.sample,loc:Et(c),...r!==void 0&&o.includes(c.sample)?{tracks:[r]}:{}})),tracks:n?s.slice(1).map(()=>[n]):[],collapseEmptyRows:!0}};e.launchView?Di(e,"Could not open the synteny view",e.launchView("LinearSyntenyView",d)):e.addView("LinearSyntenyView",d)}var ji=Oi.views(e=>({get contributingAssemblies(){let t=e.graph,n=t?kr(t):[];return t?Vo(t,{maxGap:n.length>0?Rr(n):1/0}):[]}})).views(e=>({get assemblyResolver(){let{assemblyManager:t}=(0,xe.getSession)(e),n=e.sourceAdapter?.assemblyNameToPanSN,r=new Map(Object.entries(n??{}).map(([a,i])=>[i,a])),o=a=>a!==void 0&&t.has(a)?t.get(a)?.name??a:void 0;return a=>o(r.get(a))??o(a)},get geneTracksByAssembly(){let t=new Map;for(let n of(0,xe.getSession)(e).tracks){let r=(0,Zt.readConfObject)(n,"adapter").type;if(!tt.has(r))continue;let o={trackId:n.trackId,name:(0,Zt.readConfObject)(n,"name"),adapterType:r};for(let a of(0,Zt.readConfObject)(n,"assemblyNames")){let i=it((0,xe.getSession)(e),a);t.set(i,[...t.get(i)??[],o])}}return new Map([...t].flatMap(([n,r])=>{let o=qt(r,"");return o?[[n,o]]:[]}))}})).views(e=>({get launchableAssemblies(){return _o(Vi(e.contributingAssemblies,e.graphRegion),e.assemblyResolver)},get canHighlightInLinearView(){let t=e.graphRegion;return t!==void 0&&at({views:[...(0,xe.getSession)(e).views],connectedViewId:e.connectedViewId,assemblyName:t.assemblyName})!==void 0},nodeLaunchTargets(t){let n=e.nodeById?.get(t),r=n?We(n):void 0,o=r?He(e.assemblyResolver,r):void 0,a=e.graphRegion,i=e.nodeById,s=e.nodeNeighbors,d=a&&i&&s?Me({nodeId:t,nodeById:i,neighbors:s}):void 0,c=a&&d?{sample:a.assemblyName,haplotype:void 0,refName:a.refName,...d}:void 0;return{own:r&&o?{location:Un(r),assembly:o}:void 0,reference:a&&c?{location:Un(c),assembly:a.assemblyName}:void 0,highlight:a&&c?{location:c,assembly:a.assemblyName}:void 0}}})).views(e=>({get host(){let t;try{t=(0,xe.getContainingView)(e)}catch{return}return Io(t)?t:void 0}}));var Xi=ji.views(e=>({get walkStripShown(){return e.walkStrip&&!e.host&&e.modeDrawsNodes&&!e.layoutResult?.tubeMap&&!e.walkRowBars&&e.popStack.length===0&&(e.graph?.paths?.length??0)>1},get walkStripRows(){let t=this.walkStripShown?e.cutWalkRows:void 0;return t?{...t,rows:ft(t.rows,e.walkRowSamples)}:void 0},get walkStripFrame(){let t=this.walkStripRows;if(t)return Tt(t,{width:e.paneWidth})},get cutsWholeWalks(){return V(e.chosenLayoutMode).wholeWalks||e.walkStrip&&!e.host},get walkStripMarks(){let t=this.walkStripRows,n=e.hoveredNode??e.selectedNode,r=n===null?void 0:e.nodeById?.get(n);return t&&r&&e.graph?mo(e.graph,[t.reference,...t.rows],r):[]},get walkStripLocator(){let t=e.stripHover?e.hoveredNode:null;return t===null?void 0:It(e.nodePositions?.[t],n=>({x:n.x*e.scaleX+e.translateX,y:n.y*e.scaleY+e.translateY}))}})).views(e=>({get walkGeneReads(){let t=e.walkRowBars??e.walkStripRows;if(!t||!e.showGenes)return;let n=[],r=0,o=0;for(let a of t.rows){if(!a.axis){o++;continue}let i=He(e.assemblyResolver,{sample:a.sample,haplotype:a.haplotype===void 0?void 0:`${a.sample}#${a.haplotype}`}),s=i?e.geneTracksByAssembly.get(i):void 0;if(!i||!s){r++;continue}n.push({row:a.name,trackId:s.trackId,region:{assemblyName:i,refName:a.axis.contig,...yn(a.axis,a.bp)}})}return{reads:n.slice(0,Bn),gaps:{untracked:r,unplaced:o,unread:Math.max(0,n.length-Bn)}}},get walkRowGeneGaps(){return this.walkGeneReads?.gaps},walkRowAt(t,n){let r=e.walkRowBars;if(!r)return;let o=Math.round((n-e.translateY)/(20*e.scaleY)),a=[r.reference,...r.rows][o],i=o*20*e.scaleY+e.translateY,s=(t-e.translateX)/e.scaleX-r.origin;return a&&Math.abs(n-i)<=po/2+2&&s>=0&&s<=a.bp?o:void 0},walkRowLaunchTarget(t,n=e.walkRowBars){let r=n?[n.reference,...n.rows][t]:void 0;if(!r?.axis)return;let o=r.haplotype===void 0?void 0:`${r.sample}#${r.haplotype}`,a=t===0?e.graphRegion?.assemblyName:He(e.assemblyResolver,{sample:r.sample,haplotype:o});return{label:r.label,assembly:a,location:{sample:r.sample,haplotype:o,refName:r.axis.contig,...yn(r.axis,r.bp)}}},get walkRowGenes(){let t=e.walkRowBars??e.walkStripRows;if(!t||!e.showGenes)return;let n=new Map(e.walkGeneFeatures??[]);return e.geneFeatures&&n.set(t.reference.name,e.geneFeatures),n.size?uo([t.reference,...t.rows],n):void 0}}));var zi=Xi.views(e=>({get xIsReferenceBp(){return e.layoutResult?.referenceAxis===!0&&V(e.chosenLayoutMode).cutMargins}})).views(e=>({get hostPlacesX(){let{host:t,graphRegion:n}=e;return t!==void 0&&t.initialized&&n!==void 0&&e.xIsReferenceBp&&e.popStack.length===0&&!t.dynamicBlocks.contentBlocks.some(r=>r.refName===n.refName&&r.reversed)}})).views(e=>({get hostFrame(){let{host:t,graphRegion:n}=e;return e.hostPlacesX&&t&&n?_e(t,n):void 0},get tubeMapPicture(){let t=e.layoutResult?.tubeMap;return t?Lo(t.layout):void 0},get tubeMapReference(){let t=e.layoutResult?.tubeMap;return t&&e.drawnGraph?So(e.drawnGraph,t.layout):void 0},get tubeMapDeviations(){let t=e.layoutResult?.tubeMap?.coarse,n=e.layoutResult?.tubeMap?.layout;return t&&n?$o(t.graph,n,t.deviations):[]},get tubeMapReferenceNodes(){let t=e.layoutResult;return t?.tubeMap&&!t.referenceAxis&&e.drawnGraph?Mo(e.drawnGraph,t.tubeMap.layout):void 0}})).views(e=>({get tubeMapGenes(){let t=e.tubeMapReference;return e.showGenes&&!e.host&&t&&e.backboneGenes?Po(t,e.backboneGenes):[]},get referenceStripApplies(){return!!e.host?.initialized&&!!e.layoutResult&&e.drawsNodes&&!e.hostPlacesX&&!e.facetPanels}})).views(e=>({get referenceStripBlocks(){let{graph:t}=e;return e.showReferenceStrip&&e.referenceStripApplies&&t?Bo(t,{colorScheme:e.effectiveColorScheme,referenceRamp:e.referenceRamp,walks:e.walkLift?.walks}):[]},get referenceStripFrame(){let{host:t,graphRegion:n}=e;return t?.initialized&&n?_e(t,n):void 0}})).views(e=>({get referenceStripShown(){return e.referenceStripBlocks.length>0&&e.referenceStripFrame!==void 0},get referenceStripOverhangs(){let t=e.referenceStripFrame;if(!t||e.referenceStripBlocks.length===0)return!1;let{left:n,right:r}=Fo(e.referenceStripBlocks,t,e.paneWidth);return n>0||r>0},get referenceStripFaded(){return e.referenceStripBlocks.some(t=>t.faded)}})).views(e=>({get referenceStripLit(){if(!e.referenceStripShown)return;let t=a=>({x:a.x*e.scaleX+e.translateX,y:a.y*e.scaleY+e.translateY}),n=e.hoveredNode===null?e.hoveredBubble:null;if(n){let a=e.bubbleHalos.find(i=>ao(i.bubble,n));return{start:n.start,end:n.end,anchor:a?t(a.labelAt):void 0}}let r=e.hoveredNode??e.selectedNode,o=r===null?void 0:e.nodeSpan(r);return o&&r!==null?{...o,anchor:It(e.nodePositions?.[r],t)}:void 0},referenceStripNodeAt(t,n){let r=e.referenceStripFrame;return e.referenceStripShown&&r?Oo(e.referenceStripBlocks,r,t,n):void 0},get paperCss(){return _a(e.darkMode?Ht:Wt)},get referenceStripZonePx(){return e.referenceStripShown?Eo:0}}));var Ki=zi.views(e=>({get paneCeiling(){return Math.max(_t,e.paneHeight??Va)},get fitPadTopBase(){let t=Co(e.tubeMapGenes);return $+Math.max(0,t-1)*No+e.referenceStripZonePx},get legendRoom(){let t=e.layoutBounds,{width:n,height:r}=e.legendSize;if(!t||t.w<=0||n===0||e.facetPanels||e.tubeMapReads)return;if(e.hostPlacesX)return"top";let o=this.fitPadTopBase,a=e.host?this.canvasHeight:this.paneCeiling,i=m=>(e.paneWidth-e.fitPadLeft-m)/t.w,s=m=>e.pixelRows?t.h+m+$<=a?1/0:0:(a-m-$)/t.h,d=Math.min(i(n+2*Ae),s(o));return Math.min(i($),s(o+r+Ae))>=d?"top":"right"},get fitPadTop(){return this.fitPadTopBase+(this.legendRoom==="top"?e.legendSize.height+Ae:0)},get fitPadRight(){return this.legendRoom==="right"?Math.max($,e.legendSize.width+2*Ae):$},get minFitScale(){let t=e.layoutBounds,n=e.layoutResult,r=n?.tubeMap?.layout.tracks[0]?.width;return t&&t.h>0&&r&&!n.referenceAxis?Math.min(Wa/r,(this.paneCeiling-this.fitPadTop-$)/t.h):0},get facetSpec(){let{field:t,domain:n,columns:r}=e.facet;return t===""?void 0:n.length===0&&r===void 0?t:{field:t,domain:[...n],...r===void 0?{}:{columns:r}}},get facetPlacement(){let t=e.facetPanels,{field:n,domain:r}=e.facet;return t?Gt(t.map(o=>o.walks[0].name),e.hostPlacesX||n===""?"walk":n,r):void 0},facetGridIn(t){let n=this.facetPlacement,r=e.layoutBounds;return n&&r&&r.w>0?Mt({count:n.count,bounds:r,pixelRows:e.pixelRows,width:e.paneWidth,room:t,columns:e.hostPlacesX?1:n.columns??e.facet.columns}):void 0},get facetGrid(){return this.facetGridIn(e.host?this.canvasHeight:this.paneCeiling)},get canvasHeight(){let t=e.layoutBounds,n=e.paneWidth-$-this.fitPadRight,r=this.paneCeiling;if(!t)return r;let o=this.facetGrid;if(o)return Math.max(_t,o.total);let a=Math.max(_t,e.legendSize.height+2*Ae+e.referenceStripZonePx);return e.pixelRows?Math.min(r,Math.max(a,t.h+this.fitPadTop+$)):t.w>0&&n>0?Math.min(r,Math.max(a,t.h*Math.max(n/t.w,this.minFitScale)+this.fitPadTop+$)):r},get viewBox(){let t=this.facetGrid;return t?{width:t.width,height:t.height}:{width:e.paneWidth,height:this.canvasHeight}},get fittedTransform(){let t=e.layoutBounds,n=this.facetGrid;return t?n?Ze(t,n.width,n.height,e.pixelRows,{padLeft:12,padTop:12,padRight:12,padBottom:12}):Ze(t,e.paneWidth,this.canvasHeight,e.pixelRows,{minScale:this.minFitScale,padLeft:e.fitPadLeft,padTop:this.fitPadTop,padRight:this.fitPadRight}):void 0}})).views(e=>({viewportToBuild(){return Na(et(e),Ka)},applyHighlights(t){let{hoveredNode:n,hoveredEdge:r,selectedNode:o}=e,a=new Map;o!==null&&a.set(o,Ya),n!==null&&n!==o&&a.set(n,En),t.setNodeHighlights(a),t.setEdgeHighlight(r,En)},paint(t){let n=(0,Ui.getDpr)();t.updateTransform({scaleX:e.scaleX*n,scaleY:e.scaleY*n,translateX:e.translateX*n,translateY:e.translateY*n,dpr:n}),t.render(e.referenceStripShown?[0,0,0,0]:e.darkMode?Ht:Wt)}})).views(e=>({buildDrawing(t,n){let{nodePositions:r,graph:o,nodeById:a}=e;if(!r||!o||!a)return;le(e.viewportDirty,e.positionsVersion);let i=(0,Kn.untracked)(()=>e.viewportToBuild());return{batch:St({nodePositions:e.walkRowBars?{}:r,graph:o,nodeById:a,colorScheme:e.effectiveColorScheme,contigThickness:e.contigThickness,connectorThickness:e.connectorThickness,drawPaths:n,nodeWidth:e.nodeWidth,highlight:t,axis:(0,Kn.untracked)(()=>e.axisScale),linearLayout:e.linearLayout,viewportBounds:i,referenceRamp:e.referenceRamp,deletions:e.deletionEdgeIndexes,deletionRoutes:e.deletionRoutes,stranded:e.stranded,hiddenEdges:e.hiddenEdgeIndexes,version:e.positionsVersion}),viewportBounds:i}},get overlayLabels(){return bo(e)},hoveredOn(t){let n=e.hoveredNode,r=n?e.nodeById?.get(n):void 0;return r?xo(t,r.id,r.length)??"not on this walk":void 0},figureSpec(){let t=e.graphRegion,n=e.sourceAdapter,r=n?.assemblyNameToPanSN,o=t&&`${t.refName}:${t.start}-${t.end}`,a=Ne(e.sourceGfaLocation),i=n?.type==="GbzBaseSyntenyAdapter"?Ne(n.gbzDbLocation):void 0,s=a?{gfa:a,region:o}:i&&t&&o?{gbz:{db:i,index:Ne(n.haplotypeIndexLocation),region:o,haplotypes:e.cutHaplotypes?.map(p=>r?.[p]??p),referenceSample:n.referenceSample||r?.[t.assemblyName]||t.assemblyName,context:n.context,snarls:e.cutsWholeWalks?"overlapping":n.subgraphSnarls}}:void 0;if(!s)return;let d=e.showGenes?e.geneTrack:void 0,c=d?(0,Yi.getSession)(e).tracks.find(p=>p.trackId===d.trackId):void 0,m=c?(0,Qt.expandTabixShorthand)((0,Qt.readConfObject)(c,"adapter"),"gffGzLocation"):void 0,g=m?.type==="Gff3TabixAdapter"?{file:Ne(m.gffGzLocation),index:Ne(m.index?.location),format:"gff3"}:void 0;return JSON.parse(JSON.stringify({...s,genes:g?.file&&g.index?g:void 0,referencePath:e.referencePath||void 0,layout:e.chosenLayoutMode,quality:e.layoutQuality,bubbleSpread:e.bubbleSpread,walks:e.walkLayers.length?e.walkLayers.map(p=>p.color?p:p.walk):void 0,facet:e.walkLayers.length>1?e.facetSpec:void 0,walkStrip:e.walkStripShown||void 0,walkRowSamples:e.walkStripShown?e.walkRowSamples:void 0,width:e.paneWidth,height:e.paneCeiling,colorScheme:e.chosenColorScheme,nodeWidth:e.nodeWidth,showDeletionEdges:e.showDeletionEdges||void 0}))},get figureUnavailable(){return e.layoutResult?e.drawsNodes||e.walkRowBars?void 0:`${V(e.chosenLayoutMode).label} draws a picture of its own, which the SVG export does not`:"Nothing is drawn yet"},get figureSpecUnavailable(){return e.drawsNodes?this.figureSpec()?void 0:"bandage-figure reads a graph cut from a gbz-base track or a GFA url":`bandage-figure draws no ${V(e.chosenLayoutMode).label} layout`},figure(){let{graph:t,layoutResult:n}=e;return t&&n&&!this.figureUnavailable?wi(t,n,{width:e.paneWidth,height:e.paneCeiling,walks:e.walkLayers,facet:e.facetSpec,colorScheme:e.effectiveColorScheme,nodeWidth:e.nodeWidth,showDeletionEdges:e.showDeletionEdges,contigThickness:e.contigThickness,connectorThickness:e.connectorThickness,region:e.graphRegion,colorDomain:e.colorDomain,fitToDrawing:e.popStack.length>0,genes:e.showGenes?e.backboneGenes:void 0,walkRows:e.walkRowBars,rowGenes:e.walkRowGenes,rowGeneGaps:e.walkRowGeneGaps,walkStrip:e.walkStripRows&&{rows:e.walkStripRows,rowGenes:e.walkRowGenes,rowGeneGaps:e.walkRowGeneGaps},spec:this.figureSpec()}):void 0},get tubeMapFrame(){let t=e.layoutResult?.tubeMap;return t?Si(t,{scaleX:e.scaleX,translateX:e.translateX,scaleY:e.scaleY,translateY:e.translateY,usableHeight:e.canvasHeight-e.fitPadTop-$}):void 0}})).views(e=>({get tubeMapRulerBoxes(){let t=e.tubeMapReference;return t&&!e.hostPlacesX?Ro(t):void 0},get connectorZoneBottom(){let t=e.tubeMapPicture,n=e.tubeMapFrame;return t&&n?n.y(t.bounds.minY)-2:0},get tubeMapConnectors(){let t=e.tubeMapReferenceNodes,n=e.tubeMapFrame,{host:r,graphRegion:o}=e,a=t&&n&&r?.initialized&&o?_e(r,o):void 0;return t&&n&&a?vo(t,i=>i*a.scale+a.translateX,n.x,e.paneWidth):[]}})).views(e=>({get tubeMapKeys(){let t=e.layoutResult,n=t?.tubeMap?.layout.reads??[],r=e.tubeMapPicture,o=e.tubeMapFrame,a=r&&o&&Ao(o.yScale)?r.mismatches.filter(i=>To(i,{x:o.x,width:e.paneWidth})):[];return{logWidths:t?.tubeMap!==void 0&&!t.referenceAxis,foldBp:e.tubeMapDeviations.length>0?e.tubeMapFold:void 0,forwardReads:n.some(i=>!i.is_reverse),reverseReads:n.some(i=>i.is_reverse),mismatches:new Set(a.map(i=>i.kind))}},tubeMapNodeAt(t,n){let r=e.layoutResult?.tubeMap,o=e.tubeMapFrame;return(r&&o?Ri(r,o,t,n):null)??Go(e.tubeMapConnectors,e.connectorZoneBottom,t,n)??null}}));var qi=Ki.actions(e=>({setError(t){e.error=t,e.isLoading=!1,e.statusMessage=""},finishLoading(){e.isLoading=!1,e.statusMessage=""},setStatusMessage(t){e.statusMessage=t},setFetchMs(t){e.lastFetchMs=t},setLayoutMs(t){e.lastLayoutMs=t},setGeometryMetrics(t,n,r){e.lastGeometryMs=t,e.lastGeometryStrokeCount=n,e.builtViewport={...r,viewportDirty:e.viewportDirty},e.geometryVersion++},markPainted(){e.paintedViewport=e.builtViewport},setLayoutQuality(t){e.layoutQuality=t},setLinearLayout(t){e.linearLayout=t},setLayoutMode(t){e.layoutMode=t},setReferencePath(t){e.referencePath=t;let n=e.graph;if(n?.anchoredBy==="paths"){let r=lt(n,t);Za(n,r),e.graph=r}},setDrawPaths(t){e.drawPaths=t},setShowPerf(t){e.showPerf=t},setColorScheme(t){e.colorScheme=t},setBubbleSpread(t){e.bubbleSpread=t},setNodeWidth(t){e.nodeWidth=t},setShowBubbles(t){e.showBubbles=t},setShowDeletionEdges(t){e.showDeletionEdges=t},setShowGenes(t){e.showGenes=t},setShowReferenceStrip(t){e.showReferenceStrip=t},setTubeMapFold(t){e.tubeMapFold=t},setGeneTrackId(t){e.geneTrackId=t},setRepeatTrackId(t){e.repeatTrackId=t},setRepeatKey(t){e.repeatKey=t},setWalkLayers(t){e.walkLayers=t},liftWalks(t){let n=new Map(e.walkLayers.map(r=>[r.walk,r]));e.walkLayers=t.map(r=>n.get(r)??{walk:r})},setFacet(t){t!==e.facet.field&&(e.facet.domain=[]),e.facet.field=t},setFacetColumns(t){e.facet.columns=t},toggleWalk(t){let n=e.walkLayers;e.walkLayers=n.some(r=>r.walk===t)?n.filter(r=>r.walk!==t):[...n,{walk:t}]},setWalkColor(t,n){e.walkLayers=e.walkLayers.map(r=>r.walk===t?{...r,color:{...r.color,...n}}:r)},setPaneHeight(t){e.paneHeight=t},setWalkRowSamples(t){e.walkRowSamples=t},pairWithLinearView(t){let n=e.connectedViewId;n!==void 0&&ot([...(0,st.getSession)(e).views]).some(o=>o.id===n)||(e.connectedViewId=t)},setHoveredNode(t){e.hoveredNode=t},setHoveredRowWalks(t){t.join(`
|
|
1
|
+
import{a as Sr,b as Rr,c as Mr,d as Lr,e as Gr,n as it}from"./chunks/chunk-FNHKEAKB.js";import{a as ud}from"./chunks/chunk-KWAXLUPQ.js";import{a as md,d as Tr,g as Ar,h as Nr}from"./chunks/chunk-4T7DPQTR.js";import{a as oe}from"./chunks/chunk-J4OLMLS5.js";import{A as Zr,B as Qr,Ba as Ao,C as cn,Da as No,E as kt,Ea as Po,F as xt,Fa as vo,G as St,Ga as Co,H as ao,Ha as Io,I as Rt,Ja as Bo,K as io,Ka as Eo,L as Mt,La as Fo,M as fe,Ma as $o,Na as Gt,P as so,Pa as Do,S as un,Sa as Vo,T as co,Ta as $e,U as mn,Ua as _o,Va as De,W as ln,Wa as Wo,X as gn,Xa as Tt,Y as po,Ya as Ve,Z as uo,_ as Lt,_a as Oo,a as gr,ab as Ho,b as st,ba as mo,c as ld,ca as lo,d as dt,da as hn,e as Me,ea as go,f as vr,fa as ho,g as Wr,ha as fo,j as Or,k as mt,ka as Te,l as sn,m as lt,ma as bo,n as Hr,na as yo,o as gt,oa as fd,p as jr,pa as wo,q as _,qa as ko,r as Yr,ra as xo,sa as So,t as Ge,ta as Ro,u as Ur,ua as Mo,v as Kr,w as yt,x as qr,xa as Lo,y as Jr,ya as Go,z as dn,za as To}from"./chunks/chunk-NWJN4C4V.js";import{I as an,K as _r,L as Fe,M as Xr,N as ht,O as ft,Q as zr,T as bt,U as wt,V as pn,W as eo,Y as to,Z as no,_ as bd,a as Z,b as Cr,c as Ir,d as ct,e as Br,f as pt,g as ut,r as Le,s as Er,t as Fr,u as on,v as $r,w as Dr,x as Vr}from"./chunks/chunk-K5Z47YVI.js";import{b as ro,d as oo}from"./chunks/chunk-UQEPPJEO.js";import"./chunks/chunk-SCMIJAAX.js";import{a as br,b as D,d as yr,e as wr,g as kr,h as xr}from"./chunks/chunk-7BKUWQE5.js";import{a as hr,d as fr}from"./chunks/chunk-KULNKXPT.js";import{a as re}from"./chunks/chunk-FCWXYIFC.js";import{a as Ee}from"./chunks/chunk-J6KYLXRD.js";import{a as Be,b as Pr,c as gd,d as hd}from"./chunks/chunk-TYJTJGPO.js";import{a as ne,b as w}from"./chunks/chunk-FY3BTKY4.js";var Xo=ne((tp,jo)=>{jo.exports=JBrowseExports["@jbrowse/core/Plugin"]});var Pt=ne((op,zo)=>{zo.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/AdapterType"]});var U=ne((ap,Yo)=>{Yo.exports=JBrowseExports["@jbrowse/core/configuration"]});var wn=ne((pp,qo)=>{qo.exports=JBrowseExports["@jbrowse/core/data_adapters/dataAdapterCache"]});var le=ne((up,Jo)=>{Jo.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes"]});var da=ne((yp,sa)=>{sa.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/ViewType"]});var pa=ne((wp,ca)=>{ca.exports=JBrowseExports["@jbrowse/core/util/withLaunchInput"]});var ma=ne((kp,ua)=>{ua.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/models"]});var va=ne((Up,Pa)=>{Pa.exports=JBrowseExports["@jbrowse/render-core/RenderLifecycleMixin"]});var Li=ne((pm,Mi)=>{Mi.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/renderers/util/serializableFilterChain"]});var Ss=ne((eh,xs)=>{xs.exports=JBrowseExports["@jbrowse/core/pluggableElementTypes/DisplayType"]});var Ms=ne((th,Rs)=>{Rs.exports=JBrowseExports["@jbrowse/display-kit/trackHeightConfigSchemaFields"]});var Ns=ne((ah,As)=>{As.exports=JBrowseExports["@jbrowse/display-kit/TrackHeightMixin"]});var vs=ne((ih,Ps)=>{Ps.exports=JBrowseExports["@jbrowse/render-core/displayPhase"]});var id=w(Xo(),1),sd=w(oe(),1);var At=w(Be(),1),Nt=(0,gr.createSvgIcon)([(0,At.jsx)("circle",{cx:"7.2",cy:"14.4",r:"3.2"},"0"),(0,At.jsx)("circle",{cx:"14.8",cy:"18",r:"2"},"1"),(0,At.jsx)("circle",{cx:"15.2",cy:"8.8",r:"4.8"},"2")],"BubbleChart");var Ko=w(Pt(),1);var fn=w(U(),1),bn=w(re(),1),yd=(0,fn.ConfigurationSchema)("GbzBaseSyntenyAdapter",{assemblyNames:{type:"stringArray",defaultValue:[]},gbzDbLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.gbz.db",locationType:"UriLocation"}},haplotypeIndexLocation:{type:"fileLocation",defaultValue:{uri:"",locationType:"UriLocation"}},readsLocation:{type:"fileLocation",defaultValue:{uri:"",locationType:"UriLocation"}},readsIndex:(0,fn.ConfigurationSchema)("GbzBaseReadsIndex",{indexType:{model:bn.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:"",locationType:"UriLocation"}}}),subgraphSnarls:{type:"stringEnum",model:bn.types.enumeration("SnarlOutput",["none","contained","overlapping"]),defaultValue:it.snarls},referenceSample:{type:"string",defaultValue:""},assemblyNameToPanSN:{type:"frozen",defaultValue:{}},context:{type:"number",defaultValue:it.context,advanced:!0},nodeLimit:{type:"number",defaultValue:it.limit,advanced:!0}},{explicitlyTyped:!0,preProcessSnapshot:e=>{let{uri:t,baseUri:n,reads:r}=e;return{...e,...t?{gbzDbLocation:{uri:t,baseUri:n}}:{},...typeof r=="string"?{readsLocation:{uri:r,baseUri:n},...r.endsWith(".gz")?{readsIndex:{location:{uri:`${r}.tbi`,baseUri:n}}}:{}}:{}}}}),Uo=yd;function yn(e){e.addAdapterType(()=>new Ko.default({name:"GbzBaseSyntenyAdapter",displayName:"gbz-base pangenome adapter",configSchema:Uo,adapterCapabilities:["getSubgraph","headerLanes","lanePairsOnAnchor"],adapterMetadata:{category:"Synteny adapters"},getAdapterClass:()=>import("./chunks/GbzBaseSyntenyAdapter-TQVDD3OC.js").then(t=>t.default)}))}var Zo=w(wn(),1),Qo=w(le(),1);function wd(e){return"getReads"in e&&typeof e.getReads=="function"}var kd=e=>typeof e=="object"&&e!==null&&Object.entries(e).some(([t,n])=>["uri","localPath","blobId"].includes(t)&&typeof n=="string"&&n!=="");function ea(e){return typeof e.reads=="string"&&e.reads!==""||kd(e.readsLocation)}var _e=class extends Qo.RpcMethodType{constructor(){super(...arguments);this.name="GetGraphReads"}async execute(n){let{adapterConfig:r,nodeNames:o,sessionId:a,signal:i}=n,{dataAdapter:s}=await(0,Zo.getAdapter)(this.pluginManager,a,r);return wd(s)?s.getReads(o,{signal:i}):{records:[],total:0}}};var ta=w(wn(),1),na=w(le(),1);function xd(e){return"getSubgraph"in e&&typeof e.getSubgraph=="function"}var We=class extends na.RpcMethodTypeWithRenameRegion{constructor(){super(...arguments);this.name="GetSubgraph"}async execute(n){let{adapterConfig:r,region:o,sessionId:a,opts:i,signal:s}=n,{dataAdapter:d}=await(0,ta.getAdapter)(this.pluginManager,a,r);return xd(d)?d.getSubgraph(o,{...i,signal:s}):(console.warn(`[GetSubgraph] ${d.constructor.name} does not implement getSubgraph`),"")}};var ra=w(Ee(),1),oa=w(le(),1),aa=w(re(),1),Sd=(0,ra.lazy)(()=>import("./chunks/AddTrackWorkflow-U3UNCVXJ.js"));function kn(e){e.addAddTrackWorkflowType(()=>new oa.AddTrackWorkflowType({name:"Pangenome graph track",displayName:"Add pangenome graph track",ReactComponent:Sd,stateModel:aa.types.model({})}))}var xn;function Sn(){return xn??=import("./chunks/bandage-layout-UCRW4G4J.js").then(e=>e.default()).catch(e=>{throw xn=void 0,e}),xn}var ia=w(le(),1),Oe=class extends ia.RpcMethodType{constructor(){super(...arguments);this.name="GraphComputeLayout"}async execute(n){let{graph:r,options:o,statusCallback:a}=n;a?.("Loading layout engine");let i=await Sn();a?.("Computing layout");let s=performance.now(),d=i.computeLayout(r,o),c=performance.now()-s;return{result:d,duration:c}}};var bs=w(Ee(),1),ys=w(da(),1),ws=w(pa(),1);var gs=w(ma(),1),hs=w(oe(),1),X=w(re(),1),fs=w(st(),1);var ps=w(Pr(),1),Se=w(oe(),1);var Ba=w(Ee(),1);function Rd(e,t){let n=e.indexOf(":"),r=e.indexOf(":",n+1);if(n!==-1&&r!==-1){let o=e.slice(0,n),a=e.slice(n+1,r),i=e.slice(r+1);a==="i"||a==="f"?t[o]=+i:a==="Z"&&(t[o]=i)}}function He(e){let t={};for(let n of e)Rd(n,t);return t}function Rn(e){let{SN:t,SO:n,SR:r}=e.tags;return typeof t=="string"&&typeof n=="number"&&typeof r=="number"?{refName:t,start:n,rank:r}:void 0}var la=62,Md=60;function Ld(e){let t=[],n="+",r=0;function o(a){a>r&&t.push({id:e.slice(r,a),strand:n})}for(let a=0;a<e.length;a++){let i=e.charCodeAt(a);(i===la||i===Md)&&(o(a),n=i===la?"+":"-",r=a+1)}return o(e.length),t}function Mn(e){let t={nodes:[],links:[],paths:[],walks:[],header:[],id:""};for(let n of e.split(`
|
|
2
|
+
`)){let r=n.endsWith("\r")?n.slice(0,-1):n;if(r.startsWith("H")){let[,...o]=r.split(" ");t.header.push(He(o))}else if(r.startsWith("S")){let[,o,...a]=r.split(" "),i,s,d,c=!1,m=a[0]??"*";/^\d+$/.test(m)?(i=+m,s=a[1]??"*",d=a.slice(2)):(c=!0,s=m,i=s==="*"?0:s.length,d=a.slice(1));let g=He(d);c&&"LN"in g&&(i=+g.LN),t.nodes.push({id:o,length:i,sequence:s,tags:g})}else if(r.startsWith("E")){let[,,o,a,,,,,i,...s]=r.split(" ");o&&a&&t.links.push({source:o.slice(0,-1),target:a.slice(0,-1),strand1:o.at(-1),strand2:a.at(-1),cigar:i??"*",tags:He(s)})}else if(r.startsWith("L")){let[,o,a,i,s,d,...c]=r.split(" ");o&&i&&s&&t.links.push({source:o,target:i,strand1:a,strand2:s,cigar:d??"*",tags:He(c)})}else if(r.startsWith("W")){let[,o,a,i,s,d,c,...m]=r.split(" ");o&&a&&i&&s&&d&&c&&t.walks.push({sample:o,haplotype:+a,contig:i,start:s==="*"?-1:+s,end:d==="*"?-1:+d,segments:Ld(c),tags:He(m)})}else if(r.startsWith("P")){let[,o,a,...i]=r.split(" ");o&&a&&t.paths.push({name:o,path:a,rest:i})}}return t}function Gd(e){let t=new Map,n=new Map;function r(a,i){t.has(a)||t.set(a,i)}function o(a,i){r(a,i),n.set(a,(n.get(a)??0)+1)}for(let a of e.links)r(a.source,a.strand1==="-"?"-":"+"),r(a.target,a.strand2==="-"?"-":"+");for(let a of e.paths)for(let i of a.path.split(","))o(i.slice(0,-1),i.endsWith("-")?"-":"+");for(let a of e.walks)for(let i of a.segments)o(i.id,i.strand==="-"?"-":"+");return{canonical:t,traversals:n}}var ga=e=>e.start===-1?0:e.start;function Td(e){return[...e.paths.map(t=>({...Z(t.name),steps:t.path.split(",").map(n=>({id:n.slice(0,-1),strand:n.endsWith("-")?"-":"+"}))})),...e.walks.map(t=>({name:`${t.sample}#${t.haplotype}#${t.contig}`,start:ga(t),steps:t.segments.map(n=>({id:n.id,strand:n.strand==="-"?"-":"+"}))}))]}function Ad(e){let t=e.tags.SM;if(typeof t!="string")return;let n=t.split(",").map(r=>r.trim()).filter(Boolean);return n.length>0?n:void 0}var je=e=>typeof e=="number"&&e>0?e:void 0;function Nd({tags:e,length:t}){let n=je(e.RC)??je(e.FC)??je(e.KC);return je(e.dp)??je(e.DP)??(n!==void 0&&t>0?n/t:void 0)}function Pd(e,t,n){return{id:`${e.id}${t}`,name:e.id,length:e.length,depth:n,stable:Rn(e),samples:Ad(e)}}function ha(e,t="Imported GFA"){let n=[],r=[],{canonical:o,traversals:a}=Gd(e),i=u=>`${u}${o.get(u)??"+"}`;for(let u of e.nodes){let y=Nd(u)??Math.max(a.get(u.id)??1,1);n.push(Pd(u,o.get(u.id)??"+",y))}for(let u of e.links)r.push({from:i(u.source),to:i(u.target),fromStrand:u.strand1==="-"?"-":"+",toStrand:u.strand2==="-"?"-":"+"});let s=[],d=new Map,c=(u,y)=>[u,y].sort().join("--");function m(u,y){for(let x=0;x<u.length-1;x++){let k=c(u[x],u[x+1]);d.has(k)||d.set(k,new Set),d.get(k).add(y)}}for(let u of e.paths){let y=u.path.split(",").map(x=>i(x.slice(0,-1)));s.push({name:u.name,nodeIds:y,start:Z(u.name).start}),m(y,u.name)}for(let u of e.walks){let y=u.segments.map(k=>i(k.id)),x=`${u.sample}#${u.haplotype}#${u.contig}`;s.push({name:x,nodeIds:y,start:ga(u),sample:u.sample,haplotype:u.haplotype,contig:u.contig}),m(y,x)}for(let u of r){let y=d.get(c(u.from,u.to));y&&y.size>0&&(u.pathIds=[...y])}let g=new Map(e.nodes.map(u=>[u.id,u.length])),p=e.paths.length>0||e.walks.length>0?Cr(Td(e),u=>g.get(u)??0):void 0;return{name:t,nodes:n,edges:r,paths:s.length>0?s:void 0,anchorPaths:p?.anchorPaths,pathVisits:p?.pathVisits,anchoredBy:n.some(u=>u.stable)?"tags":void 0}}var vd="\0deletion:";function fa(e,t){let n=new Map(t.map(o=>[o.edgeIndex,`${vd}${o.edgeIndex}`])),r=[];return e.edges.forEach((o,a)=>{let i=n.get(a);if(i===void 0)r.push(o);else{let{fromStrand:s,toStrand:d}=o;r.push({from:o.from,to:i,...s?{fromStrand:s}:{}},{from:i,to:o.to,...d?{toStrand:d}:{}})}}),{graph:{...e,nodes:[...e.nodes,...[...n.values()].map(o=>({id:o,name:o,length:0,depth:0}))],edges:r},routes:n,ids:new Set(n.values())}}function ba(e,t,n,r,o){let a=new Map(e.nodes.map(i=>[i.id,i.length]));return t.map(i=>{let s=i.bypassed.reduce((m,g)=>m+(a.get(g)??0),0),d=Math.max(o.minimumNodeLength,r(s)*.5),c=n.get(i.edgeIndex);return{id:c,name:c,length:Math.round(d*1e6/o.nodeLengthPerMegabase),depth:0}})}function ya(e,t){let n={...e},r={};for(let[o,a]of t){let i=n[a];delete n[a],i?.length&&(r[o]=i)}return{nodePositions:n,deletionRoutes:r}}function wa(e,t){let n=e.nodes.filter(k=>D(k)&&(t[k.id]?.length??0)>0);if(n.length<2)return t;let r=n.map(k=>{let h=t[k.id],R=h[Math.floor(h.length/2)];return{x:R.x,y:R.y,r:k.stable.start+k.length/2,w:k.length}}),o=r.reduce((k,h)=>k+h.w,0),a=r.reduce((k,h)=>k+h.x*h.w,0)/o,i=r.reduce((k,h)=>k+h.y*h.w,0)/o,s=r.reduce((k,h)=>k+h.r*h.w,0)/o,d=0,c=0;for(let k of r)d+=k.w*(k.x-a)*(k.r-s),c+=k.w*(k.y-i)*(k.r-s);let m=-Math.atan2(c,d),g=Math.cos(m),p=Math.sin(m),u={};for(let[k,h]of Object.entries(t))u[k]=h.map(R=>{let l=R.x-a,b=R.y-i;return{x:a+g*l-p*b,y:i+p*l+g*b}});let y=0,x=0;for(let k of e.nodes)if(!D(k))for(let h of u[k.id]??[])h.y>i?y++:x++;if(x>y)for(let k of Object.values(u))for(let h of k)h.y=2*i-h.y;return u}var ka=30;function Cd(e,t){let{opts:n}=t,r=new Map(t.nodes.map(p=>[p.id,wt(n,p.length)])),o=p=>r.get(p)??n.minimumNodeLength,a=e.nodes.filter(D).sort((p,u)=>p.stable.start-u.stable.start),i=new Map,s=0;for(let p of a)i.set(p.id,{x:s,y:0}),s+=o(p.id)+n.edgeLength;let d=dt(e),c=new Map(a.map(p=>[p.id,0])),m=a.map(p=>p.id);for(let p of m){let u=i.get(p),y=c.get(p)+1;for(let x of d.get(p)??[])c.has(x)||(c.set(x,y),i.set(x,{x:u.x+o(p)/2,y:ka*y}),m.push(x))}let g=0;for(let p of e.nodes)i.has(p.id)||i.set(p.id,{x:g++*s/e.nodes.length,y:ka*3});return i}function xa(e,t){let n=Cd(e,t);return t.nodes.map(r=>({...r,...n.get(r.id)}))}function Sa(e,t,n={}){let r=Br(ha(Mn(e),t),n.referencePath);if(r.nodes.length===0)throw new Error(`No graph segments in ${t}`);if(n.maxNodes!==void 0&&r.nodes.length>n.maxNodes)throw new Error(`Graph too large to draw: ${r.nodes.length.toLocaleString()} nodes (limit ${n.maxNodes.toLocaleString()}). Zoom in to a smaller region, or raise maxGraphNodes on this view.`);return r}var Id=15;function Bd(e,t,n){let r=e.nodes.some(D),o={...t,opts:{...t.opts,edgeLength:t.opts.edgeLength*(n.spacing??1)}};return{graph:{nodes:r?xa(e,o):o.nodes,edges:e.edges},options:{quality:n.quality,linearLayout:n.linearLayout,...o.opts,componentSeparation:Id*(n.componentSeparation??1),...r?{rotateComponents:!1}:{}}}}function Ra(e,t){let n=e.nodes.some(D);return`${t.quality}|${t.linearLayout}|${t.bubbleSpread}|${t.spacing??1}|${t.componentSeparation??1}|${n}|${e.referencePath??""}`}async function Ma(e,t,n){let r=no(t.bubbleSpread),o=Le(e),a=fa(e,o),i=Er(a.graph,a.ids),s={...i.graph,nodes:i.graph.nodes.filter(k=>!a.ids.has(k.id))},d=pn(s,r),{result:c,duration:m}=await n(Bd(i.graph,{...d,nodes:[...d.nodes,...ba(e,o,a.routes,eo(s,r),d.opts)]},t)),g=pn(e,r),p=new Map(g.nodes.map(k=>[k.id,wt(g.opts,k.length)])),u=Fr(c.nodePositions,i.runs,k=>p.get(k)??0),{nodePositions:y,deletionRoutes:x}=ya(e.nodes.some(D)?wa(e,u):u,a.routes);return{result:{...c,nodePositions:y,stranded:!0,...o.length?{deletionRoutes:x,extent:La(x)}:{}},duration:m}}function La(e){let t=1/0,n=1/0,r=-1/0,o=-1/0;for(let a of Object.values(e))for(let i of a)t=Math.min(t,i.x),n=Math.min(n,i.y),r=Math.max(r,i.x),o=Math.max(o,i.y);return{minX:t,minY:n,maxX:r,maxY:o}}var $=40,Ed=1e-6,Fd=100;function Xe(e){return Math.max(Ed,Math.min(Fd,e))}function Ln(e,t,n,r=$){let o=t-e.h*n;return r-e.minY*n+Math.max(0,o)/2}function ze(e,t,n,r,{minScale:o=0,padLeft:a=$,padTop:i=$,padRight:s=$,padBottom:d=$}={}){let c=t-a-s,m=n-i-d;if(c<=0||m<=0||!(e.w>0||!r&&e.h>0))return;let g=e.w>0?c/e.w:1/0,p=e.h>0?m/e.h:1/0,u=Xe(Math.max(o,r?g:Math.min(g,p))),y=c-e.w*u;return{scale:u,translateX:a-e.minX*u+Math.max(0,y)/2,translateY:Ln(e,m,r?1:u,i)}}function vt(e,t={}){let{minX:n,minY:r,maxX:o,maxY:a}=La(e.nodePositions),{region:i}=t;e.referenceAxis&&i&&i.end>i.start&&(n=i.start,o=i.end);let s=t.extent??e.extent;return s&&(n=Math.min(n,s.minX??n),r=Math.min(r,s.minY??r),o=Math.max(o,s.maxX??o),a=Math.max(a,s.maxY??a)),{minX:n,minY:r,w:o-n,h:a-r}}function Ae(e,t){return{scaleX:e,scaleY:t?1:e,pixelRows:t}}function Ga(e,t,n,r){return{minX:-e.translateX/t.scaleX,minY:-e.translateY/t.scaleY,maxX:(n-e.translateX)/t.scaleX,maxY:(r-e.translateY)/t.scaleY}}function Ta(e,t){let n=(e.maxX-e.minX)*t,r=(e.maxY-e.minY)*t;return{minX:e.minX-n,minY:e.minY-r,maxX:e.maxX+n,maxY:e.maxY+r}}function Aa(e,t){return t.minX>=e.minX&&t.maxX<=e.maxX&&t.minY>=e.minY&&t.maxY<=e.maxY}function Na(e,t,n,r,o){let a=Xe(e.scale*t),i=a/e.scale;return{scale:a,translateX:n-(n-e.translateX)*i,translateY:o?e.translateY:r-(r-e.translateY)*i}}var M=w(re(),1),Ea=w(va(),1);var be=w(re(),1);function Ca(e){return t=>e.includes(t)?t:void 0}function Gn(e){return be.types.snapshotProcessor(be.types.maybe(be.types.enumeration(e)),{preProcessor:Ca(e)})}function Tn(e,t){return be.types.snapshotProcessor(be.types.optional(be.types.enumeration(e),t),{preProcessor:Ca(e)})}var Fa=600,It=160,Bt=[1,1,1,1],Et=[.12,.12,.12,1],$a=([e,t,n])=>`rgb(${[e,t,n].map(r=>Math.round(r*255)).join(", ")})`,Da=5,Ne=new Set(["tubemap","tubemapref"]),Va=(0,Ba.lazy)(()=>import("./chunks/ChooseWalksDialog-GVQLSGHX.js")),An=12,_a=[{value:"",label:"Off"},{value:"walk",label:"A panel per walk"},{value:"sample",label:"A row per sample, a column per haplotype"}],$d=M.types.snapshotProcessor(M.types.model("GraphFacet",{field:M.types.optional(M.types.enumeration(["","walk","sample"]),""),domain:M.types.optional(M.types.frozen(),[]),columns:M.types.maybe(M.types.number)}),{preProcessor:e=>xt(e)}),Wa=[{bp:0,label:"None"},{bp:3,label:"Under 3 bp"},{bp:10,label:"Under 10 bp"},{bp:50,label:"Under 50 bp, leaving structural variants"},{bp:1e3,label:"Under 1 kb"}],Ia=".segs.bed.gz";function Oa(e){if(typeof e.uri=="string")return e.uri;let n=e.segmentsLocation?.uri;return typeof n=="string"&&n.endsWith(Ia)?n.slice(0,-Ia.length):void 0}var Nn=1.4,Ha=1.6,ja=150,Xa=1,Pn=40,vn={nodeStrokes:[],nodeStrokeRuns:new Map,arrows:[],arrowRuns:new Map,edgeCurves:[],edgeCurveRuns:new Map};function ue(...e){}var Ye=5e6;function ye(e){return e>=1e6?`${+(e/1e6).toFixed(1)} Mb`:`${Math.round(e/1e3)} kb`}var za=2e4;function Pe(e){return e&&"uri"in e&&e.uri?new URL(e.uri,e.baseUri??window.location.href).href:void 0}function Cn(e){return e.builtViewport!==void 0&&e.paintedViewport===e.builtViewport&&e.builtViewport.viewportDirty===e.viewportDirty&&!e.viewportRebuildPending}function Ue(e){let{width:t,height:n}=e.viewBox;return Ga(e,e.axisScale,t,n)}var Ct=new WeakMap,Dd=4;function Ya(e){let t=Ct.get(e);return t||(t=new Map,Ct.set(e,t)),t}function Ua(e,t){let n=Ct.get(e);n&&e!==t&&Ct.set(t,n)}function Ka(e,t,n){e.size>=Dd&&e.delete(e.keys().next().value),e.set(t,n)}var qa=M.types.compose("GraphPane",(0,Ea.RenderLifecycleMixin)(),M.types.model({layoutQuality:M.types.optional(M.types.number,2),linearLayout:M.types.optional(M.types.boolean,!1),layoutMode:Gn(gt),colorScheme:Gn(ht),bubbleSpread:Tn(to,"auto"),nodeWidth:Tn(zr,"depth"),showBubbles:M.types.optional(M.types.boolean,!1),showDeletionEdges:M.types.optional(M.types.boolean,!0),showGenes:M.types.optional(M.types.boolean,!0),showReferenceStrip:M.types.optional(M.types.boolean,!0),tubeMapFold:M.types.optional(M.types.number,0),geneTrackId:M.types.optional(M.types.string,""),repeatTrackId:M.types.optional(M.types.string,""),repeatKey:M.types.optional(M.types.string,""),walkRowSamples:M.types.maybe(M.types.frozen()),walkStrip:M.types.optional(M.types.boolean,!1),walkLayers:M.types.optional(M.types.frozen(),[]),facet:M.types.optional($d,{}),referencePath:M.types.optional(M.types.string,""),showPerf:M.types.optional(M.types.boolean,!1),contigThickness:M.types.optional(M.types.number,6),connectorThickness:M.types.optional(M.types.number,2),darkMode:M.types.optional(M.types.boolean,!1),scale:M.types.optional(M.types.number,1),translateX:M.types.optional(M.types.number,0),translateY:M.types.optional(M.types.number,0),drawPaths:M.types.optional(M.types.boolean,!1),paneHeight:M.types.maybe(M.types.number),maxGraphNodes:M.types.optional(M.types.number,za),colorDomain:M.types.maybe(M.types.frozen()),connectedViewId:M.types.maybe(M.types.string)})).volatile(()=>({graph:void 0,graphRegion:void 0,loadedReferencePath:void 0,layoutResult:void 0,legendSize:{width:0,height:0},indexBubbles:void 0,geneTrackFeatures:void 0,walkGeneFeatures:void 0,repeatArrays:void 0,popStack:[],error:void 0,isLoading:!1,loadCanceled:!1,statusMessage:"",hoveredNode:null,hoveredRowWalks:[],hoveredBubble:null,pointerInPane:!1,stripHover:null,hoveredEdge:null,selectedNode:null,viewportDirty:0,positionsVersion:0,geometryVersion:0,builtViewport:void 0,paintedViewport:void 0,draggingNode:null,isPanning:!1,viewportOwner:"fit",viewportDirtyTimer:void 0,positionsDirtyFrame:0,lastFetchMs:void 0,readsShown:void 0,lastLayoutMs:void 0,lastGeometryMs:void 0,lastGeometryStrokeCount:void 0,viewportRebuildPending:!1}));var os=w(oe(),1),me=w(re(),1),W=w(st(),1);function Ja(e,t){let n=new Set(t),r=e.nodes.filter(d=>n.has(d.name)),o=new Set(r.map(d=>d.id)),a=new Map(e.nodes.map(d=>[d.id,d.length])),i=new Map,s=e.paths?.flatMap(d=>{let c=d.nodeIds.findIndex(p=>o.has(p));if(c<0)return[];let m=d.nodeIds.filter(p=>o.has(p));i.set(d.name,{first:c,nodeIds:m});let g=d.nodeIds.slice(0,c).reduce((p,u)=>p+(a.get(u)??0),0);return[{...d,nodeIds:m,...d.start===void 0?{}:{start:d.start+g}}]});return{name:e.name,nodes:r,edges:e.edges.filter(d=>o.has(d.from)&&o.has(d.to)),...s?.length?{paths:s}:{},anchorPaths:pt(e,i),pathVisits:e.pathVisits,anchoredBy:e.anchoredBy,referencePath:e.referencePath}}function Za(e,t){let n=new Set(e.nodes.filter(d=>D(d)&&wr(d,t)).map(d=>d.id)),r=e.paths??[];if(n.size===0||r.length===0)return e;let o=r.map(d=>{let c=-1,m=-1;return d.nodeIds.forEach((g,p)=>{n.has(g)&&(c<0&&(c=p),m=p)}),c<0?void 0:{first:c,last:m}});if(o.every((d,c)=>d?.first===0&&d.last===r[c].nodeIds.length-1))return e;let a=new Set,i=[],s=new Map;return r.forEach((d,c)=>{let m=o[c];if(m){let g=d.nodeIds.slice(m.first,m.last+1);for(let p of g)a.add(p);i.push({...d,nodeIds:g}),s.set(d.name,{first:m.first,nodeIds:g})}}),{...e,nodes:e.nodes.filter(d=>a.has(d.id)),edges:e.edges.filter(d=>a.has(d.from)&&a.has(d.to)),paths:i,pathVisits:e.pathVisits&&Vd(e.pathVisits,r,o,new Map(e.nodes.map(d=>[d.id,d.name]))),anchorPaths:pt(e,s)}}function Vd(e,t,n,r){let o=new Map,a=new Map;return t.forEach((i,s)=>{let d=Z(i.name).name,c=n[s];i.nodeIds.forEach((m,g)=>{let p=r.get(m)??m,u=e.get(p);if(!u)return;let y=`${d} ${p}`,x=o.get(y)??0;for(;x<u.length&&u[x].path!==d;)x++;let k=u[x];if(o.set(y,x+1),k&&c&&g>=c.first&&g<=c.last){let h=a.get(p);h?h.push(k):a.set(p,[k])}})}),a}function _d(e,t,n){let r=Z(e.name).name,o=new Map,a=[],i=()=>({a:-1/0,b:1/0,detour:[],bp:0}),s=[i()];for(let d of e.nodeIds){let c=t.get(d);if(!c)continue;let m=o.get(c.name)??0;o.set(c.name,m+1);let g=n.get(`${r} ${c.name}`)?.[m]??Wr(c),p=s.at(-1),u=a.at(-1);if(D(c)){let y=c.stable.start,x=y+c.length,k=g!==(c.stable.strand??"+"),h=u!==void 0&&p.detour.length===0;h&&!u.inverted&&!k&&u.end===y?u.end=x:h&&u.inverted&&k&&u.start===x?u.start=y:(a.push({start:y,end:x,inverted:k}),s.push(i()))}else p.detour.push({node:c,strand:g}),p.bp+=c.length}return a.forEach((d,c)=>{s[c].b=d.start,s[c+1].a=d.end}),{path:e,runs:a,gaps:s}}function In(e,t){return Number.isFinite(e.a)&&Number.isFinite(e.b)&&e.b>=e.a&&Math.max(e.b-e.a,e.bp)<t}function Qa(e,t,n){let r=0,o=e.length;for(;r<o;){let a=r+o>>1;e[a]<=t?r=a+1:o=a}return r<e.length&&e[r]<n}function Wd(e){let t=new Map;for(let n=1;n<e.length;n++){let r=e[n-1],o=e[n],a=r.stable.start+r.length;a!==o.stable.start&&(t.set(a,"reference-gap"),t.set(o.stable.start,"reference-gap"))}return t}function Od(e,t,n){let r=(o,a)=>{Number.isFinite(o)&&!n.has(o)&&n.set(o,a)};for(let{runs:o,gaps:a}of e){let i=o[0],s=o.at(-1);i&&s&&(r(i.start,"walk-end"),r(s.end,"walk-end"));for(let d of o)d.inverted&&d.end-d.start>=t&&(r(d.start,"inversion"),r(d.end,"inversion"));for(let d of a)d.b<d.a?(r(d.a,"backward"),r(d.b,"backward")):In(d,t)||(r(d.a,"variant"),r(d.b,"variant"))}for(let o=!0;o;){o=!1;let a=[...n.keys()].sort((s,d)=>s-d),i=e.flatMap(({runs:s,gaps:d})=>[...d.filter(c=>In(c,t)).map(c=>[c.a,c.b]),...s.filter(c=>c.inverted&&c.end-c.start<t).map(c=>[c.start,c.end])]);for(let[s,d]of i)Qa(a,s,d)&&(o||=!n.has(s)||!n.has(d),r(s,"overlap"),r(d,"overlap"))}return n}function Hd(e,t){let n=[],r=[],o=()=>{let a=r[0],i=r.at(-1);if(a&&i){let s=a.stable.start,d=i.stable.start+i.length,c=`${s}-${d}`;n.push({node:{id:`${c}+`,name:c,length:d-s,depth:0,stable:{refName:a.stable.refName,start:s,rank:0,strand:"+"}},members:r})}r=[]};for(let a of e)t.has(a.stable.start)&&o(),r.push(a);return o(),n}function ei(e,t){let n=e.nodes.filter(D).sort((f,G)=>f.stable.start-G.stable.start),r=e.paths??[];if(n.length===0||r.length===0)return;let o=new Map(e.nodes.map(f=>[f.id,f])),a=Or(e),i=r.map(f=>_d(f,o,a)),s=Od(i,t,Wd(n)),d=[...s.keys()].sort((f,G)=>f-G),c=Hd(n,s),m=c.map(f=>f.node.stable.start),g=f=>{let G=0,S=m.length-1;for(;G<S;){let N=G+S+1>>1;m[N]<=f?G=N:S=N-1}return G},p=new Map,u=new Map;for(let f of c){p.set(f.node.id,f.members.map(G=>G.id));for(let G of f.members)u.set(G.id,f.node.id)}let y=new Map,x=f=>{let G=`${f.a} ${f.b} ${f.detour.map(N=>N.node.id+N.strand).join(",")}`,S=y.get(G);if(!S){let N=`r${y.size}`;S={id:`${N}+`,name:N,length:f.bp,depth:0,stable:{refName:n[0].stable.refName,start:Number.isFinite(f.a)?f.a:f.b,rank:1,strand:"+"}},y.set(G,S),p.set(S.id,f.detour.map(v=>v.node.id));for(let v of f.detour)u.has(v.node.id)||u.set(v.node.id,S.id)}return S},k=new Map,h=[],R=new Map,l=new Map,b=new Map;for(let{path:f,runs:G,gaps:S}of i){let N=[],v=[],C=!1,O=(T,z)=>{let A=N.at(-1);C&&A?.node===T&&A.strand===z||N.push({node:T,strand:z}),C=!0},E=T=>{C=!1,T.detour.length>0&&(O(x(T),"+"),C=!1)},q=T=>{(T.bp>0||T.b>T.a)&&v.push({start:T.a,end:T.b,bp:T.bp});let z=c[g(T.b>T.a?T.a:T.a-1)];for(let A of T.detour)u.has(A.node.id)||(u.set(A.node.id,z.node.id),p.get(z.node.id).push(A.node.id))};G.forEach((T,z)=>{let A=S[z];In(A,t)&&!Qa(d,A.a,A.b)?q(A):E(A);let P=g(T.start),B=g(T.end-1),V=T.end-T.start<t;if(T.inverted&&!V){C=!1;for(let F=B;F>=P;F--)O(c[F].node,"-");C=!1}else{T.inverted&&v.push({start:T.start,end:T.end,bp:T.end-T.start,inverted:!0});for(let F=P;F<=B;F++)O(c[F].node,"+")}}),E(S.at(-1));let J=Z(f.name).name,te=0;N.forEach(({node:T,strand:z},A)=>{b.set(T.id,(b.get(T.id)??0)+1);let P=R.get(T.name)??[];P.push({path:J,sample:f.sample??J,start:te,strand:z}),R.set(T.name,P),te+=T.length;let B=N[A+1];if(B){let V=`${T.id}${z} ${B.node.id}${B.strand}`,F=l.get(V);F?F.pathIds.push(f.name):l.set(V,{from:T.id,to:B.node.id,fromStrand:z,toStrand:B.strand,pathIds:[f.name]})}}),h.push({...f,nodeIds:N.map(T=>T.node.id)}),k.set(f.name,v)}let L=[...c.map(f=>f.node),...y.values()].filter(f=>b.has(f.id)).map(f=>({...f,depth:b.get(f.id)}));return{graph:{...e,nodes:L,edges:[...l.values()],paths:h,pathVisits:R,reads:void 0},members:p,coarseOf:u,deviations:k,cuts:s}}var Ji=w(U(),1),ee=w(oe(),1),Zi=w(ud(),1),K=w(re(),1);var nt=w(oe(),1),Un=w(re(),1);function Ft(e,t,n){let r=new Map;for(let a of e.nodes)if(br(a)){let{refName:i}=a.stable;if(n[a.id]?.length){let s=r.get(i)??r.set(i,{nodes:[],reach:0}).get(i);s.nodes.push(a),s.reach=Math.max(s.reach,a.length)}}for(let{nodes:a}of r.values())a.sort((i,s)=>i.stable.start-s.stable.start);let o=[];for(let a of t){let i=r.get(a.refName);if(!i)continue;let s=[],d=[],c=new Set,m,g=1/0,p=0,u=(a.start+a.end)/2,{nodes:y,reach:x}=i;for(let k=kr(y,a.start-x);k<y.length&&y[k].stable.start<a.end;k++){let h=y[k],R=h.stable.start,l=R+h.length;if(l<=a.start)continue;let b=n[h.id];c.add(h.id),p+=Math.min(l,a.end)-Math.max(R,a.start);let L=[];for(let S of a.exons){let N=Math.max(S.start,R),v=Math.min(S.end,l);if(v<=N)continue;let C=on(b,(N-R)/h.length,(v-R)/h.length);C.length===1&&C.push({...C[0]}),L.push(ut(C))}L.length>0&&(s.push(...L),d.push({nodeId:h.id,d:L.join("")}));let f=Math.min(Math.max(u,R),l),G=Math.abs(f-u);if(G<g){g=G;let[S]=on(b,(f-R)/h.length,(f-R)/h.length);m=S}}m&&o.push({gene:a,exons:s.join(""),exonsByNode:d,nodeIds:c,at:m,covered:p/(a.end-a.start)})}return o}var j=e=>+e.toFixed(1);function jd(e){let t=/^rgba?\(([^,]+),([^,]+),([^,)]+)(?:,([^)]+))?\)$/.exec(e.replaceAll(" ",""));if(!t)return{color:e,opacity:1};let n=t[4]===void 0?1:Number(t[4]);return{color:`rgb(${t[1]},${t[2]},${t[3]})`,opacity:n}}function Bn(e,t){let{color:n,opacity:r}=jd(t);return`${e}="${n}"${r<1?` ${e}-opacity="${j(r)}"`:""}`}var ti=.5,ni=.25;function ri(e,t){let n=[],r=[],o=(c,m)=>{let g={d:`M${j(c)} ${j(m)}`,segments:0,x0:c,x1:c,y0:m,y1:m};return r.push(g),g},a=c=>{let m=r.at(-1)??o(c[0],c[1]);for(let g=0;g<c.length;g+=2)m.x0=Math.min(m.x0,c[g]),m.x1=Math.max(m.x1,c[g]),m.y0=Math.min(m.y0,c[g+1]),m.y1=Math.max(m.y1,c[g+1]);return m.segments++,m},i=c=>{let m=new Set;return r.map(g=>{if(!c||g.x1-g.x0>=ti||g.y1-g.y0>=ti)return g.d;let p=(g.x0+g.x1)/2,u=(g.y0+g.y1)/2,y=`${Math.round(p/ni)} ${Math.round(u/ni)}`;return g.segments===0||m.has(y)?"":(m.add(y),`M${j(p)} ${j(u)}h0`)}).join("")},s={canvas:void 0,fillStyle:"#000",strokeStyle:"#000",lineWidth:1,lineCap:"butt",lineJoin:"miter",beginPath(){r=[]},moveTo(c,m){o(c,m)},lineTo(c,m){a([c,m]).d+=`L${j(c)} ${j(m)}`},bezierCurveTo(c,m,g,p,u,y){a([c,m,g,p,u,y]).d+=`C${j(c)} ${j(m)} ${j(g)} ${j(p)} ${j(u)} ${j(y)}`},closePath(){let c=r.at(-1);c&&(c.d+="Z")},stroke(){let c=i(s.lineCap!=="butt");c&&n.push(`<path d="${c}" fill="none" ${Bn("stroke",s.strokeStyle)} stroke-width="${j(s.lineWidth)}" stroke-linecap="${s.lineCap}" stroke-linejoin="${s.lineJoin}"/>`)},fill(){let c=i(!1);c&&n.push(`<path d="${c}" ${Bn("fill",s.fillStyle)}/>`)},fillRect(c,m,g,p){n.push(`<rect x="${j(c)}" y="${j(m)}" width="${j(g)}" height="${j(p)}" ${Bn("fill",s.fillStyle)}/>`)}},d={width:e,height:t,style:{},getContext:()=>s};return s.canvas=d,{canvas:d,markup:()=>n.join("")}}var oi="5.2.0";var ai=(e,t)=>!!e.referencePath&&Z(t).name===e.referencePath;function Xd(e,t){return(e.paths??[]).filter(n=>n.name===t).sort((n,r)=>(n.start??0)-(r.start??0))}function zd(e,t){let n=Xd(e,t),r=n[0];if(!r)return;let o=new Map(e.nodes.map(h=>[h.id,h])),a=new Map;e.edges.forEach((h,R)=>{a.set(`${h.from}>${h.to}`,R)});let i=h=>o.get(h)?.length??0,s=h=>h.nodeIds.reduce((R,l)=>R+i(l),0),d=n.reduce((h,R)=>h+s(R),0),c=r.start===void 0?void 0:{contig:r.contig??fr(Z(t).name),start:r.start,end:Math.max(...n.map(h=>(h.start??0)+s(h)))},m=c?c.end-c.start:d,g=new Set,p=new Set,u=new Map,y=0;for(let h of n)c&&(y=Math.max(y,(h.start??0)-c.start)),h.nodeIds.forEach((R,l)=>{if(g.add(R),l>0){let L=h.nodeIds[l-1],f=a.get(`${L}>${R}`)??a.get(`${R}>${L}`);f!==void 0&&p.add(f)}let b=i(R);u.has(R)||u.set(R,m>0?(y+b/2)/m:0),y+=b});let x=ai(e,t),k=x?[]:(e.paths??[]).filter(h=>ai(e,h.name));return{name:t,reference:x,range:c,nodeIds:g,edgeIndexes:p,progress:u,steps:n.reduce((h,R)=>h+R.nodeIds.length,0),bp:d,referenceBp:k.length>0?k.reduce((h,R)=>h+s(R),0):void 0}}function ii(e,t,n,r){let o=new Map(e.nodes.map(i=>[i.id,i])),a=new Map;for(let[i,s]of t.progress){let d=o.get(i),c=r?.midpoints.get(i),m=n.field==="progress"?s:r&&c!==void 0&&!(d?.stable&&d.stable.rank>0)?(c-r.start)/r.span:void 0;a.set(i,Zr(n,m))}return a}function Yd(e,t){let n=new Set,r=0,o=e.referencePath;if(!o||t.reference)return{reversed:n,bp:r};let a=Z(t.name).name,i=new Map(e.nodes.map(s=>[s.id,s]));for(let s of t.progress.keys()){let d=i.get(s),c=d?e.pathVisits?.get(d.name):void 0,m=c?.find(p=>p.path===a)?.strand,g=c?.find(p=>p.path===o)?.strand;m&&g&&m!==g&&(n.add(s),r+=d.length)}return{reversed:n,bp:r}}function $t(e,t,n){let r=new Set,o=t.filter(s=>!r.has(s.walk)&&r.add(s.walk)).flatMap(s=>{let d=zd(e,s.walk);return d?[{walk:d,layer:s}]:[]}).sort((s,d)=>Number(d.walk.reference)-Number(s.walk.reference));if(o.length===0)return;let a=0,i=o.map(({walk:s,layer:d})=>{let c=dn(d,s.reference,s.reference?0:a++,o.length===1),{reversed:m,bp:g}=Yd(e,s);return{...s,encoding:c,colors:ii(e,s,c,n),reversed:m,reversedBp:g}});return si(i,n)}var Ud={field:"progress",scheme:"red"};function Dt(e,t,n,r){return t.walks.map(o=>{let a=n.find(s=>s.walk===o.name)?.color,i=dn({walk:o.name,color:{...Ud,...a}},o.reference,0);return si([{...o,encoding:i,colors:ii(e,o,i,r)}],r)})}function si(e,t){return{walks:e,referenceDomain:t?{start:t.start,end:t.start+t.span}:void 0,nodeIds:new Set(e.flatMap(n=>[...n.nodeIds])),edgeIndexes:new Set(e.flatMap(n=>[...n.edgeIndexes])),names:new Set(e.map(n=>n.name))}}var Dn='font-family="Helvetica, Arial, sans-serif" font-size="11"',Kd=48,_t=18,qd=16,Jd=22,Zd="rgb(160,160,160)",ui="#1c1c22";function we(e){return e.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""")}function $n(e,t,n,r,o,a,i,s=1){let d=r.length>1?Kd:_t,c=r.length>1?`fill="url(#${e})"`:`fill="${r[0].color}"${s<1?` fill-opacity="${s}"`:""}`,m=r.length>1?`<linearGradient id="${e}">${r.map(p=>`<stop offset="${p.offset}" stop-color="${p.color}"/>`).join("")}</linearGradient>`:"";return{width:Math.max(d+5+(o.length+a.length)*6.2,(i?.length??0)*6.2),markup:`${m}<g transform="translate(${t} ${n})" ${Dn}><rect y="5" width="${d}" height="8" rx="2" ${c}/><text x="${d+5}" y="13"><tspan font-weight="bold">${we(o)}</tspan>${we(a)}</text>${i?`<text y="28">${we(i)}</text>`:""}</g>`}}function Qd(e,t){return{width:_t+5+4*6.2,markup:`<g transform="translate(${e} ${t})" ${Dn}><rect x="1" y="4" width="${_t-2}" height="10" rx="4" fill="none" stroke="${hn}" stroke-width="2"/><text x="${_t+5}" y="13">exon</text></g>`}}function pi(e,t,n,r,o,a){let i=xo(r,a);return $n(e,t,n,cn(r.encoding),o,i.delta+i.outside+i.reversed,i.scale)}function ec(e,t){return e.replaceAll(/([ML])(-?[\d.e-]+),(-?[\d.e-]+)/g,(n,r,o,a)=>`${r}${+(Number(o)*t.scaleX+t.translateX).toFixed(1)},${+(Number(a)*t.scaleY+t.translateY).toFixed(1)}`)}function tc(e,t,n,r,o){return`<rect x="${e-n/2}" y="${t-11-4+2}" width="${n}" height="${17}" rx="3" fill="#fff" fill-opacity="0.85" stroke="${hn}"/><text x="${e}" y="${t}" font-family="Helvetica, Arial, sans-serif" font-size="${11}" fill="${ui}" text-anchor="middle"><tspan font-style="italic" font-weight="600">${we(r)}</tspan>${o?we(o):""}</text>`}function mi(e,t,n={}){let r=n.width??1200,o=n.height??800,a=n.region,i=n.colorDomain??a,s=n.walkRows,d=vt(t,{region:n.fitToDrawing?void 0:a,extent:s&&t.extent?lt(s):void 0}),c=t.pixelRows??!1,m=new Map(e.nodes.map(A=>[A.id,A])),g=ft(n.colorScheme??"auto",e),p=g==="reference-position"&&!t.tubeMap?Ge(e,i):void 0,u=p&&{start:p.start,end:p.start+p.span},y=t.tubeMap?[]:Le(e),x=n.walks??[],k=x.some(A=>A.color?.field==="reference")?p??Ge(e,i):void 0,h=x.length>0&&!t.tubeMap?$t(e,x,k):void 0,R=xt(n.facet),l=R.field&&h&&h.walks.length>1?Dt(e,h,x,k):void 0,b=new Map((e.paths?.length?Fe(e.paths):[]).map(A=>[A.name,A.label])),L=A=>b.get(A)??A,f=n.referenceName??Rr(e,a),G=h?.referenceDomain&&{...h.referenceDomain,name:f},S=n.contigThickness??6,N=n.nodeWidth??"depth",v=n.genes?.length&&!t.tubeMap&&!s?Ft(e,n.genes,t.nodePositions):[],C=bt(e,m,S,N),O=0;function E(A,P,B,V){let F=[],se=ho(go(v,C.halfWidthPx,A,Y=>ec(Y,P)),{id:`exons${O++}`,width:B,height:V});se&&F.push(fe(se));let H=Y=>({x:Y.x*P.scaleX+P.translateX,y:Y.y*P.scaleY+P.translateY}),de={width:B,height:V};for(let{item:Y,x:he,y:Re,w:dd,text:cd}of Dr(bo(v,H,S,fo(t.nodePositions,P)),de,$r(de))){let pd=H(Y.at).y+S/2;F.push(`<line x1="${he}" x2="${he}" y1="${Re-11-2}" y2="${pd}" stroke="${ui}" stroke-width="0.8" stroke-opacity="0.6"/>`,tc(he,Re,dd,Y.gene.name,cd.slice(Y.gene.name.length)))}s&&F.push(fe(gn(s,{...P,width:B,height:V},{ramp:u,rowGenes:n.rowGenes})));let at=s?[s.reference,...s.rows].map((Y,he)=>({label:Y.label,y:he*20})):t.rowLabels??[];for(let{label:Y,y:he}of at){let Re=he*P.scaleY+P.translateY;Re>=0&&Re<=V&&F.push(`<text x="6" y="${Re+4}" ${Dn} stroke="#fff" stroke-width="3" paint-order="stroke">${we(Y)}</text>`)}return F.join("")}function q(A,P,B){let V=ze(d,P,B,c,l?{padLeft:12,padTop:12,padRight:12,padBottom:12}:{});if(!V)return"";let F=Ae(V.scale,c),{canvas:se,markup:H}=ri(P,B),de=new wo(se);de.uploadGeometry(yt({nodePositions:s?{}:t.nodePositions,graph:e,nodeById:m,colorScheme:g,contigThickness:S,connectorThickness:n.connectorThickness??2,drawPaths:!1,nodeWidth:N,highlight:A,axis:F,referenceRamp:p,deletions:new Map(y.map(Y=>[Y.edgeIndex,Y.bypassed])),deletionRoutes:t.deletionRoutes,stranded:t.stranded,hiddenEdges:new Set(n.showDeletionEdges?[]:y.map(Y=>Y.edgeIndex))}));let at={scaleX:F.scaleX,scaleY:F.scaleY,translateX:V.translateX,translateY:V.translateY};return de.updateTransform({...at,dpr:1}),de.render([1,1,1,1]),H()+E(A,at,P,B)}let J=[],te;if(l){let A=St(l.map(B=>B.walks[0].name),R.field||"walk",R.domain),P=kt({count:A.count,bounds:d,pixelRows:c,width:r,room:o,columns:A.columns??R.columns});l.forEach((B,V)=>{let F=A.cells[V],se=F%P.columns*(P.width+8),H=Math.floor(F/P.columns)*(P.height+34+8),de=B.walks[0];J.push(pi(`key${V}`,se+6,H+2,de,L(de.name),G).markup,`<svg x="${se}" y="${H+34}" width="${P.width}" height="${P.height}">${q(B,P.width,P.height)}</svg>`)}),te=P.total}else{let A=6,P=H=>{J.push(H.markup),A+=H.width+qd};if(h&&(h.walks.forEach((H,de)=>{P(pi(`key${de}`,A,2,H,L(H.name),G))}),P($n("faded",A,2,[{offset:0,color:Zd}],"",`not on ${h.walks.length===1?L(h.walks[0].name):"these walks"}`,void 0,.3))),s){let H=ln(mn(s,{ramp:u,genes:n.rowGenes?.size?n.rowGeneGaps:void 0}),A,2,"rows-key");P({width:H.width,markup:fe(H.tree)})}else!h&&p&&P($n("ramp",A,2,cn({field:"reference",scheme:"rainbow"}),f?`${f} position`:"Reference position","",ko(f,p.start,p.start+p.span)));v.some(H=>H.exonsByNode.length>0)&&P(Qd(A,2));let B=J.length>0?34:0,V=r-2*$,F=c||!(d.w>0)?d.h:d.h*V/d.w,se=Math.max(160,Math.min(o-B,Math.ceil(F+2*$)));J.push(`<svg y="${B}" width="${r}" height="${se}">${q(h,r,se)}</svg>`),te=B+se}let T=n.walkStrip;if(T&&!s&&!t.tubeMap){let A=Lt(T.rows,{width:r}),P=ln(mn(T.rows,{ramp:u,genes:lo(A,T.rowGenes,T.rowGeneGaps)}),6,te+A.height,"strip-key");J.push(`<line x1="0" x2="${r}" y1="${te+.5}" y2="${te+.5}" stroke="#ddd"/>`,`<svg y="${te}" width="${r}" height="${A.height}">${fe(gn(T.rows,A,{ramp:u,rowGenes:T.rowGenes,idPrefix:"strip"}))}${fe(mo(T.rows,A,new Set(x.map(B=>B.walk))))}</svg>`,fe(P.tree)),te+=A.height+Jd}let z=JSON.stringify({generator:`@jbrowse/bandage-core@${oi}`,...n.spec===void 0?{}:{spec:n.spec}});return`<svg xmlns="http://www.w3.org/2000/svg" width="${r}" height="${te}" viewBox="0 0 ${r} ${te}"><metadata>${we(z)}</metadata><rect width="${r}" height="${te}" fill="#fff"/>${J.join("")}</svg>
|
|
3
|
+
`}var nc=e=>e.bp1>e.bp0;function li(e,t){let n=e.filter(nc);if(n.length===0){let a=e[0];return a?[{tx:a.x0,sx:t(a.bp0)}]:[]}let r=n.map(a=>({c:a,s0:t(a.bp0),s1:t(a.bp1),trimLeft:0,trimRight:0}));for(let a=0;a+1<r.length;a++){let i=r[a],s=r[a+1],c=Math.min(s.c.x0-i.c.x1,24)-(s.s0-i.s1);if(c>0){let m=(i.s1-i.s0)/2,g=(s.s1-s.s0)/2,p=Math.min(c/2,m),u=Math.min(c-p,g);p=Math.min(c-u,m),i.trimRight=p,s.trimLeft=u}}let o=[];for(let{c:a,s0:i,s1:s,trimLeft:d,trimRight:c}of r)o.push({tx:a.x0,sx:i+d},{tx:a.x1,sx:s-c});return o}function gi(e,t){let n=e.length;if(n===0)return t;let r=e[0],o=e[n-1];if(t<=r.tx)return r.sx+(t-r.tx);if(t>=o.tx)return o.sx+(t-o.tx);let a=0,i=n-1;for(;i-a>1;){let m=a+i>>1;e[m].tx<=t?a=m:i=m}let s=e[a],d=e[i],c=d.tx-s.tx;return c>0?s.sx+(t-s.tx)/c*(d.sx-s.sx):s.sx}var rc=.05,Wt=9;function oc(e,t){let{minY:n,maxY:r}=e.layout.bounds,o=r-n;return e.columns&&o>0?Math.max(rc,Math.min(1,t/o)):1}function hi(e,t){let{scaleX:n,translateX:r,translateY:o}=t,a=t.scaleY*oc(e,t.usableHeight),i=d=>(d-e.yOffset)*a+o,{columns:s}=e;if(s){let d=li(s,c=>c*n+r);return{x:c=>gi(d,c),y:i,yScale:a}}return{x:d=>d*n+r,y:i,yScale:a}}function fi(e,{x:t,y:n},r,o){let a=null;return e.layout.nodes.forEach(i=>{i.order>=0&&t(i.x-Wt)<=r&&r<=t(i.x+i.pixelWidth+Wt)&&n(i.y-Wt)<=o&&o<=n(i.y+i.contentHeight+Wt)&&(a=i.name)}),a}var Ut=w(U(),1),Yi=w(oe(),1),Ui=w(fd(),1),Yn=w(st(),1);function bi(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.horizontalScroll=="function"&&typeof t.zoomTo=="function"&&"coarseDynamicBlocks"in t&&"dynamicBlocks"in t}function yi(e){return e.reduce((t,n)=>t&&t.end-t.start>=n.end-n.start?t:n,void 0)}function Ke(e,t){let n=yi(e.dynamicBlocks.contentBlocks.filter(a=>a.refName===t.refName&&a.assemblyName===t.assemblyName)),{bpPerPx:r}=e;if(!n||!(r>0))return;let o=n.offsetPx-e.offsetPx;return n.reversed?{scale:-1/r,translateX:o+n.end/r}:{scale:1/r,translateX:o-n.start/r}}function Ot(e){let t=yi(e.dynamicBlocks.contentBlocks),n=t?.displayedRegionIndex===void 0?void 0:e.displayedRegions[t.displayedRegionIndex];return t&&e.bpPerPx>0?{refName:t.refName,assemblyName:t.assemblyName,start:t.start,end:t.end,bpPerPx:e.bpPerPx,span:e.bpPerPx*e.width,regionStart:n?.start??t.start,regionEnd:n?.end??t.end}:void 0}function Vn(e,t,n=!0){let r=e.end-e.start,o=n?Math.max(0,Math.min(e.span,(t-r)/2)):0,a=Math.max(e.regionStart,Math.floor(e.start-o)),i=Math.min(e.regionEnd,Math.ceil(e.end+o)),s=i-a-t;return s>0&&(a+=Math.floor(s/2),i-=Math.ceil(s/2)),{refName:e.refName,assemblyName:e.assemblyName,start:a,end:i}}function wi(e,t,n=!0){if(e?.refName!==t.refName||e.assemblyName!==t.assemblyName)return!1;if(n)return e.start<=t.start+1&&t.end<=e.end+1;let r=Vn(t,1/0,!1);return Math.abs(e.start-r.start)<1&&Math.abs(e.end-r.end)<1}var Yt=w(U(),1),xe=w(oe(),1);var ac=.9,_n=2,ic=1e3;function ki(e,t,n,r=a=>a,o=[]){let a=new Map(e.nodes.map(s=>[s.name,s])),i=[];for(let s of t){let d=[],c=1/0,m=-1/0,g=1/0,p=[],u=[];for(let R of Mt(s)){let l=a.get(R),b=l&&n[l.id];if(!(!l||!b?.length)){if(D(l)&&(l.stable.start<s.start||l.stable.start>=s.end)){u.push(b[Math.floor(b.length/2)]);continue}p.push(l.id),d.push(ut(b.length===1?[b[0],b[0]]:b));for(let L of b)c=Math.min(c,L.x),m=Math.max(m,L.x),g=Math.min(g,L.y)}}if(p.length===0)continue;let y={x:(c+m)/2,y:g},x=u.length?{x:u.reduce((R,l)=>R+l.x,0)/u.length,y:u.reduce((R,l)=>R+l.y,0)/u.length}:y,k=new Map;for(let R of s.routes??[])for(let l of new Set(R.steps))k.set(l,(k.get(l)??0)+1);let h=[];for(let R of s.routes??[]){if(s.longestAlleleLength<ic)break;if(R.steps.length===0)continue;let l=Math.min(...R.steps.map(f=>k.get(f))),b,L=-1;for(let f of R.steps)if(k.get(f)===l)for(let G of n[f]??[]){let S=Math.hypot(G.x-x.x,G.y-x.y);S>L&&(L=S,b=G)}b&&h.push({route:R,at:b,text:sc(R,r)})}i.push({bubble:s,...Rt(s,o),path:d.join(""),labelAt:y,members:p.length,nodeIds:p,whole:p.length>=ac*e.nodes.length,routes:h})}return i}function sc(e,t){let n=[...new Set(e.walks.map(t))].sort(),r=n.slice(0,_n).join(", "),o=n.length>_n?` +${n.length-_n}`:"";return`${r}${o} \xB7 ${ao(e.bp)}`}function xi(e){if(!e.nodes.some(D))return[];let t=new Map(e.nodes.map(p=>[p.id,p])),n=vr(e),r=new Map(n.map((p,u)=>[p,u])),o=new Int32Array(n.length+1),a=new Map,i=new Set;for(let p of e.edges){let u=r.get(p.from),y=r.get(p.to);if(u===void 0||y===void 0||u===y)continue;i.add(`${p.from}>${p.to}`).add(`${p.to}>${p.from}`);let[x,k]=u<y?[u,y]:[y,u];o[x+1]++,o[k]--;let[h,R]=u<y?[p.from,p.to]:[p.to,p.from];(a.get(h)??a.set(h,new Set).get(h)).add(R)}for(let p=1;p<o.length;p++)o[p]+=o[p-1];let s=e.nodes.filter(D).sort((p,u)=>p.stable.start-u.stable.start),d=new Set([s[0].id,s.at(-1).id]),c=s.map(p=>[p,r.get(p.id)]).filter(([p,u])=>d.has(p.id)||o[u]===0).sort(([p,u],[y,x])=>u-x||p.stable.start-y.stable.start),m=e.paths?.map(p=>{let u=new Map;return p.nodeIds.forEach((y,x)=>{u.has(y)||u.set(y,x)}),u}),g=[];for(let p=0;p+1<c.length;p++){let[u,y]=c[p],[x,k]=c[p+1],h=n.slice(y+1,k);if(h.length===0)continue;let R=new Map([[u.id,{min:0,max:0,n:1}]]);for(let E of[u.id,...h]){let q=R.get(E);if(q)for(let J of a.get(E)??[]){if(r.get(J)>k)continue;let T=J===x.id?0:t.get(J).length,z=R.get(J);R.set(J,{min:Math.min(z?.min??1/0,q.min+T),max:Math.max(z?.max??-1/0,q.max+T),n:Math.min(oo,q.n+(z?.n??0))})}}let l=m&&dc(e,t,m,u.id,x.id),b=l?.n?l:void 0,L=b??R.get(x.id)??{min:0,max:0,n:0},f=l!==void 0&&l.left>0,G=u.stable.start+u.length,S=x.stable.start,N=[u.id,...h.filter(E=>D(t.get(E))),x.id],v=N.some((E,q)=>q>0&&!i.has(`${N[q-1]}>${E}`)),C=v||f,O=v&&!b;g.push({refName:u.stable.refName,start:G,end:S,segmentCount:h.length+2,pathCount:L.n,inversion:!1,shortestAlleleLength:O?S-G:L.min,longestAlleleLength:O?S-G:L.max,segments:[u,...h.map(E=>t.get(E)),x].map(E=>E.name).join(","),shortestAllele:void 0,longestAllele:void 0,partial:C,routes:b?.routes})}return g}function dc(e,t,n,r,o){let a=new Map,i=1/0,s=-1/0,d=0;return e.paths.forEach((c,m)=>{let g=n[m].get(r),p=n[m].get(o);if(g===void 0||p===void 0){(g!==void 0||p!==void 0)&&d++;return}let u=c.nodeIds.slice(Math.min(g,p)+1,Math.max(g,p));p<g&&u.reverse();let y=0;for(let h of u)y+=t.get(h)?.length??0;let x=u.join(","),k=a.get(x)??{steps:u,bp:y,walks:[]};k.walks.push(c.name),a.set(x,k),i=Math.min(i,y),s=Math.max(s,y)}),a.size||d?{min:i,max:s,n:a.size,left:d,routes:[...a.values()]}:void 0}var Si=w(ld(),1);function Ri(e,t,n){if(t==="uniform"||t==="grey")return;let r={...Ur(e),referenceRamp:n};return new Map(e.nodes.map((o,a)=>[o.id,(0,Si.abgrToCssRgba)(Kr(o,a,t,r))]))}var Ze=w(U(),1),Fi=w(Li(),1),pe=w(oe(),1);var Ht=w(U(),1),Gi=w(oe(),1),cc=/^[^#]+#\d+$/;function pc(e,t){let n=e.assemblyNameToPanSN??{},r=new Set(Object.values(n)),o={};for(let{name:a,aliases:i}of t){let s=i.find(d=>cc.test(d));s!==void 0&&!r.has(s)&&(o[a]=s)}return Object.keys(o).length===0?e:{...e,assemblyNameToPanSN:{...o,...n}}}function ge(e,t){let n=(0,Ht.readConfObject)(t,"adapter");return n.type==="GbzBaseSyntenyAdapter"?pc(n,(0,Gi.getSession)(e).assemblyManager.assemblyList.map(r=>({name:(0,Ht.readConfObject)(r,"name"),aliases:(0,Ht.readConfObject)(r,"aliases")??[]}))):n}function Ti(e){let t=[];for(let n of[...e].sort((r,o)=>r.start-o.start)){let r=t.at(-1);r&&n.start<=r.end?r.end=Math.max(r.end,n.end):t.push({...n})}return t}function Ai(e){let t=[],n=new Map;for(let r of[...e].sort((o,a)=>o.start-a.start)){let o=`${r.refName} ${r.strand} ${r.name}`,a=n.get(o);if(a&&r.start<a.end)a.end=Math.max(a.end,r.end),a.exons=Ti([...a.exons,...r.exons]);else{let i={...r,exons:Ti(r.exons)};t.push(i),n.set(o,i)}}return t}var Wn=w(U(),1),qe=new Set(["Gff3TabixAdapter","Gff3Adapter","BedTabixAdapter","BedAdapter","GtfTabixAdapter","GtfAdapter","BigBedAdapter","NCListAdapter"]),uc=/gene|refseq|gencode|ensembl|annotation/i,mc=new Set(["BedTabixAdapter","BedAdapter"]);function jt(e,t){if(t)return e.find(r=>r.trackId===t);let n=e.filter(r=>qe.has(r.adapterType));return n.find(r=>uc.test(`${r.trackId} ${r.name??""}`))??n.find(r=>!mc.has(r.adapterType))}function Ni(e,t){let n=e.tracks?.find(r=>(0,Wn.readConfObject)(r.configuration,"trackId")===t)?.displays[0];return n?(0,Wn.readConfObject)(n.configuration,"filter")??[]:[]}var lc=new Set(["chromosome","region","contig","supercontig","scaffold"]);function ie(e,t){return typeof e.get=="function"?e.get(t):e[t]}var gc=new Set(["exon","CDS","five_prime_UTR","three_prime_UTR","UTR"]);function Pi(e,t){let n=ie(e,"type");typeof n=="string"&&gc.has(n)&&t.push({start:ie(e,"start"),end:ie(e,"end")});let r=ie(e,"subfeatures");for(let o of r??[])Pi(o,t)}function hc(e){let t=[...e].sort((r,o)=>r.start-o.start),n=[];for(let r of t){let o=n.at(-1);o&&r.start<=o.end?o.end=Math.max(o.end,r.end):n.push({...r})}return n}function Xt(e){let t=[];for(let n of e){let r=ie(n,"gene_name")??ie(n,"name")??ie(n,"gene"),o=ie(n,"start"),a=ie(n,"end");if(!r||!(a>o)||lc.has(ie(n,"type")))continue;let i=[];Pi(n,i),t.push({name:r,refName:ie(n,"refName"),start:o,end:a,strand:ie(n,"strand")??0,exons:i.length?hc(i):[{start:o,end:a}]})}return Ai(t)}var jn=new Set(["BedAdapter","BedTabixAdapter","BigBedAdapter","VcfAdapter","VcfTabixAdapter"]),fc=/repeat|tandem|\bstr\b|vntr|trf|trgt|vamos|expansion|microsat/i;function vi(e,t){return t?e.find(r=>r.trackId===t):e.filter(r=>jn.has(r.adapterType)).find(r=>fc.test(`${r.trackId} ${r.name??""}`))}function Je(e,t){return typeof e.get=="function"?e.get(t):e[t]}var Ci=/^\w+=[^;]*(;\w+=[^;]*)*$/;function bc(e){let t=Je(e,"name");if(!(typeof t!="string"||!Ci.test(t)))return Object.fromEntries(t.split(";").map(n=>{let r=n.indexOf("=");return[n.slice(0,r),n.slice(r+1)]}))}function ce(e,t){let n=Je(e,t);return n!==void 0?n:Je(e,"INFO")?.[t]??bc(e)?.[t]}var Ii=["RUS","MOTIFS","RU","motifs","motif","sequence","consensus"],yc=["RUL","period","PERIOD","consensusSize","unit","unitLength"],wc=["TRID","REPID","VARID","ID","name","id"];function zt(e,t){for(let n of t){let r=ce(e,n),o=String((Array.isArray(r)?r[0]:r)??"").split(",")[0].trim();if(o!==""&&o!==".")return o}}var Bi=/^[ACGTURYSWKMBDHVN]+$/i;function kc(e){let t=Number(zt(e,yc));if(Number.isFinite(t)&&t>0)return Math.round(t);let n=zt(e,Ii);return n&&Bi.test(n)?n.length:void 0}function ke(e){return(Array.isArray(e)?e:String(e??"").split(",")).map(n=>{let r=n===""||n===null||n===void 0?NaN:Number(n);return Number.isFinite(r)?r:void 0})}function Hn(e){return(Array.isArray(e)?e:String(e??"").split(",")).map(n=>{let r=String(n??"").trim();return r===""||r==="."?void 0:r})}var On="<CNV:TR>";function xc(e){let t=Hn(Je(e,"ALT"));if(!t.includes(On))return;let n=ke(ce(e,"RN")),r=Hn(ce(e,"RUS")),o=ke(ce(e,"RUL")),a=ke(ce(e,"RUC")),i=ke(ce(e,"RB")),s=0;return t.map((d,c)=>{let m=n[c]??(d===On?1:0),g=0,p=0;for(let u=0;u<m;u++,s++){let y=r[s],x=o[s]??(y&&Bi.test(y)?y.length:void 0),k=a[s],h=i[s]??(x&&k!==void 0?Math.round(x*k):void 0);h!==void 0&&(g+=h,p++)}return d===On&&m>0&&p===m?g:void 0})}function Sc(e,t,n){let r=e?.includes("|");return(e??"").split(/[/|]/).flatMap((o,a)=>{let i=Number(o),s=i>0?t[i-1]:n;return!Number.isInteger(i)||s===void 0?[]:[{bp:s,...r?{haplotype:a+1}:{}}]})}function Rc(e,t,n){let r=Je(e,"samples"),o={};for(let[a,i]of Object.entries(r??{})){let s=ke(i.SD),d=ke(i.AL).flatMap((m,g)=>m!==void 0&&m>0?[s[g]===void 0?{bp:m}:{bp:m,spanningReads:s[g]}]:[]),c=d.length>0||!t?d:Sc(Hn(i.GT)[0],t,n);c.length>0&&(o[a]=c)}return Object.keys(o).length>0?o:void 0}function Mc(e,t){let n=ce(e,"start"),r=ce(e,"end"),o=ke(ce(e,"SVLEN"))[0];return t&&o!==void 0?{start:n+1,end:n+1+o}:{start:n,end:r}}function Ei(e){let t=[];for(let n of e){let r=xc(n),{start:o,end:a}=Mc(n,r!==void 0),i=kc(n);if(!(a>o)||i===void 0)continue;let s=ce(n,"refName"),d=zt(n,Ii),c=zt(n,wc);t.push({key:`${s}:${o}-${a}`,name:(c&&!Ci.test(c)?c:void 0)??(d&&d.length<=12?`(${d})n`:`${s}:${(o+1).toLocaleString()}-${a.toLocaleString()}`),refName:s,start:o,end:a,unit:i,motif:d,calls:Rc(n,r,a-o)})}return t.sort((n,r)=>n.start-r.start)}var $i=qa.views(e=>({get defaultLayoutMode(){return"force"},get defaultColorScheme(){return"auto"},get hasPendingSource(){return!1},get canRetryLoad(){return!1},get sourceTrack(){try{return(0,pe.getContainingTrack)(e).configuration}catch{return}}})).views(e=>({get chosenLayoutMode(){return e.layoutMode??e.defaultLayoutMode},get chosenColorScheme(){return e.colorScheme??e.defaultColorScheme}})).views(e=>({get paneWidth(){return(0,pe.getContainingView)(e).width},get drawnGraph(){return e.layoutResult?.tubeMap?.coarse?.graph??e.graph}})).views(e=>({get nodeById(){if(e.drawnGraph){let t=new Map;for(let n of e.drawnGraph.nodes)t.set(n.id,n);return t}},get nodeLengths(){let t=new Map;for(let n of e.drawnGraph?.nodes??[])t.set(n.id,n.length);return t},get nodeCount(){return e.graph?.nodes.length??0},get edgeCount(){return e.graph?.edges.length??0},get pathCount(){return e.graph?.paths?.length??0},get hasGraph(){return e.graph!==void 0},get geometryPainted(){return Cn(e)},get showLoading(){return e.error===void 0&&(e.isLoading||e.hasPendingSource||e.graph!==void 0&&!Cn(e))},get canCancelLoad(){return e.isLoading&&!e.layoutResult},get usesLayoutEngine(){return e.graph?jr(e.chosenLayoutMode,e.graph):!1},get canAnchorLayout(){return e.graph?.nodes.some(t=>t.stable?.rank===0)??!1},get anchorPaths(){return e.graph?.anchorPaths??[]},get walkChoices(){let t=e.graph?.paths;return t?.length?Fe(t):[]},get effectiveDrawPaths(){return e.drawPaths&&an(e.graph?.paths?.length??0)},get activeReferencePath(){return e.graph?.referencePath},get rampDomain(){return e.colorDomain??e.graphRegion},get walkRamp(){let{graph:t}=e;return t&&e.walkLayers.some(n=>n.color?.field==="reference")?Ge(t,this.rampDomain):void 0},get modeDrawsNodes(){return _(e.chosenLayoutMode).drawsNodes},get liftedWalkLayers(){return e.walkLayers.length>0||!this.modeDrawsNodes?e.walkLayers:e.hoveredRowWalks.map(t=>({walk:t}))},get walkLift(){let{graph:t}=e,n=this.liftedWalkLayers;return t&&n.length>0&&!e.layoutResult?.tubeMap?$t(t,n,this.walkRamp):void 0},get facetPanels(){let{graph:t}=e,n=this.walkLift;return e.facet.field!==""&&this.modeDrawsNodes&&t&&n&&e.walkLayers.length>1&&n.walks.length>1?Dt(t,n,e.walkLayers,this.walkRamp):void 0},get drawnWalks(){return this.facetPanels?.map(t=>t.walks[0])??this.walkLift?.walks??[]},get liftsWalks(){return!Ne.has(e.chosenLayoutMode)},get walkReference(){let t=this.walkLift?.referenceDomain;return t&&{...t,name:e.graphRegion?.refName}},walkLabel(t){return this.walkChoices.find(n=>n.name===t)?.label??t},get liftPaintsOffReference(){for(let t of this.walkLift?.walks??[])if(t.encoding.field!=="walk"){for(let n of t.colors.values())if(n===Qr)return!0}return!1},get liftedWalksLabel(){let t=this.walkLift?.walks??[];return t.length===1?this.walkLabel(t[0].name):"these walks"},get effectiveColorScheme(){return e.layoutResult?.tubeMap&&(this.tubeMapReads||e.chosenColorScheme==="auto")?"uniform":ft(e.chosenColorScheme,e.graph)},get tubeMapReads(){return(e.layoutResult?.tubeMap?.layout.reads.length??0)>0},get colorSchemeLock(){return this.walkLift?{value:"By walk",why:"Each lifted walk colours its own lane: set it under the menu, Walk, Colour"}:this.tubeMapReads?{value:"By strand",why:"Reads take the reds and blues, so the tube map leaves its nodes clear"}:void 0},get nodePositions(){return e.layoutResult?.nodePositions},get labelsNodeSizes(){return!e.layoutResult?.tubeMap&&!this.walkLift},get rowLabels(){return e.layoutResult?.rowLabels??[]},get alleleDeletions(){return e.layoutResult?.alleleDeletions??[]},get deletionRoutes(){return e.layoutResult?.deletionRoutes},get stranded(){return e.layoutResult?.stranded},get pixelRows(){return e.layoutResult?.pixelRows??!1},get zoomPercent(){return`${(e.scale*100).toFixed(1)}%`},get isDefaultViewport(){return e.scale===1&&e.translateX===0&&e.translateY===0}})).views(e=>({get poppedFrom(){return e.popStack.at(-1)},get derivedBubbles(){return e.graph?xi(e.graph):[]}})).views(e=>({get bubbles(){return e.indexBubbles?.length?e.indexBubbles:e.derivedBubbles}})).views(e=>({get cutHaplotypes(){},get sourceGfaLocation(){},get sourceAdapter(){let t=e.sourceTrack;return t?ge(e,t):void 0},get sourceTrackId(){let t=e.sourceTrack;return t?(0,Ze.readConfObject)(t,"trackId"):void 0},get assemblyTrackChoices(){let t=e.graphRegion;return t?(0,pe.getSession)(e).tracks.filter(n=>(0,Ze.readConfObject)(n,"assemblyNames").includes(t.assemblyName)).map(n=>({trackId:n.trackId,name:(0,Ze.readConfObject)(n,"name"),adapterType:(0,Ze.readConfObject)(n,"adapter").type})):[]}})).views(e=>({get geneTrackChoices(){return e.assemblyTrackChoices.filter(t=>qe.has(t.adapterType))},get repeatTrackChoices(){return e.assemblyTrackChoices.filter(t=>jn.has(t.adapterType))},get repeatChoices(){return e.repeatArrays??[]}})).views(e=>({get repeatTrack(){return vi(e.repeatTrackChoices,e.repeatTrackId)},get geneTrack(){return jt(e.geneTrackChoices,e.geneTrackId)},get selectedRepeat(){return e.repeatChoices.find(t=>t.key===e.repeatKey)},get backbone(){return e.graph?Sr(e.graph):void 0},get cutWalkRows(){return e.graph?sn(e.graph,e.graphRegion):void 0},assemblySpellings(t){let{assemblyManager:n}=(0,pe.getSession)(e),r=n.has(t)?n.get(t):void 0,o=e.sourceAdapter?.assemblyNameToPanSN??{},a=[t,...r?[r.name,...r.aliases]:[]];return{name:t,aliases:[...a,...a.flatMap(i=>o[i]??[])]}},get drawsLoadedReference(){let t=e.graph;return t?.anchoredBy==="tags"||t?.referencePath!==void 0&&t.referencePath===e.loadedReferencePath}})).views(e=>({get geneAssembly(){let t=e.graphRegion;return t?e.assemblySpellings(t.assemblyName):void 0},get geneLaneFilter(){let t;try{t=(0,pe.getContainingView)(e)}catch{return}let n=Ni(t,e.geneTrack?.trackId);return n.length?new Fi.default({filters:n,jexl:(0,pe.getEnv)(e).pluginManager.jexl}):void 0},get geneFeatures(){let t=e.geneTrackFeatures,n=this.geneLaneFilter;return t?Xt(n?t.filter(r=>n.passes(r)):t):void 0}})).views(e=>({get backboneGenes(){let{backbone:t,geneAssembly:n,geneFeatures:r}=e,o=e.drawsLoadedReference||n!==void 0&&Mr(t,[n])!==void 0;return t&&r&&o?Gr(r,t):void 0}})).views(e=>({get nodeNeighbors(){return e.drawnGraph?dt(e.drawnGraph):void 0},get nodeInk(){return bt(e.drawnGraph,e.nodeById,e.contigThickness,e.nodeWidth)},get deletions(){return e.graph&&this.drawsNodes?Le(e.graph):[]},get walkRowBars(){if(e.chosenLayoutMode!=="walkrows"||!e.graph)return;let t=e.selectedRepeat,n=t?sn(e.graph,t,t.unit):e.cutWalkRows;if(!n)return;let r=mt(n.rows,e.walkRowSamples),[o,...a]=Vo([n.reference,...r],t?.calls);return{...n,reference:o,rows:a}},get drawsNodes(){return!e.layoutResult?.tubeMap&&!this.walkRowBars},get drawnRowLabels(){let t=this.walkRowBars;return t?[t.reference,...t.rows].map((n,r)=>({label:n.label,y:r*20})):e.rowLabels},get fitPadLeft(){return Math.max($,...this.drawnRowLabels.map(t=>Vr(t.label,0).x1+6))},get genePins(){ue(e.positionsVersion);let t=e.layoutResult?.nodePositions;return e.showGenes&&this.drawsNodes&&e.graph&&e.backboneGenes&&t?Ft(e.graph,e.backboneGenes,t):[]},get bubbleHalos(){ue(e.positionsVersion);let t=e.layoutResult?.nodePositions;if(!e.showBubbles||!this.drawsNodes||!e.graph||!t)return[];let n=new Map(e.walkChoices.map(r=>[r.name,r.label]));return ki(e.graph,e.bubbles,t,r=>n.get(r)??r,e.repeatArrays)},get referenceRamp(){return e.effectiveColorScheme==="reference-position"&&e.drawnGraph?Ge(e.drawnGraph,e.rampDomain):void 0},get assemblyNames(){let t=e.graphRegion;return t?[t.assemblyName]:[]},get scaleX(){return Ae(e.scale,e.pixelRows).scaleX},get scaleY(){return Ae(e.scale,e.pixelRows).scaleY},get axisScale(){return Ae(e.scale,e.pixelRows)},get layoutBounds(){let t=e.layoutResult,n=this.walkRowBars;return t?vt(t,{region:e.popStack.length===0?e.graphRegion:void 0,extent:n&&t.extent?lt(n):void 0}):void 0}})).views(e=>({get deletionEdgeIndexes(){return new Map(e.deletions.map(t=>[t.edgeIndex,t.bypassed]))},get hiddenEdgeIndexes(){return new Set(e.showDeletionEdges?[]:e.deletions.map(t=>t.edgeIndex))},get referenceRampDomain(){let t=e.referenceRamp;return t?{start:t.start,end:t.start+t.span}:void 0},get referenceRampOffKeys(){let t=e.referenceRamp,n=e.layoutResult,r=n?.tubeMap?n.nodePositions:void 0,o=!1,a=!1;if(t&&e.drawnGraph)for(let i of e.drawnGraph.nodes)r&&!r[i.id]||(t.midpoints.has(i.id)?i.stable&&i.stable.rank>0&&(o=!0):a=!0);return{offReference:o,unplaced:a}},get tubeMapNodeColors(){let t=e.drawnGraph;return e.layoutResult?.tubeMap&&t?Ri(t,e.effectiveColorScheme,e.referenceRamp):void 0},get tubeMapTubeColors(){let t=e.layoutResult?.tubeMap?.pathColors,n=t&&this.tubeMapNodeColors?t.map((a,i)=>_r(i,t.length)):t,r=new Set(e.hoveredRowWalks),o=e.drawnGraph?.paths;return n&&o&&r.size>0?n.map((a,i)=>r.has(o[i]?.name??"")?a:Yr):n},nodeSpan(t){let{nodeById:n,nodeNeighbors:r}=e;return n&&r?Me({nodeId:t,nodeById:n,neighbors:r}):void 0}})).views(e=>({get pathLegend(){let t=e.graph?.paths,n=e.layoutResult?.tubeMap;return(e.drawPaths||n)&&t&&an(t.length)?Fe(t,e.tubeMapTubeColors):[]},get hoveredSpan(){let t=e.hoveredNode,n=e.hoveredBubble;return t!==null?e.nodeSpan(t):n?{start:n.start,end:n.end}:void 0}})).views(e=>({get hoverHighlight(){let t=e.graphRegion,n=e.hoveredSpan;return t&&n?{refName:t.refName,assemblyName:t.assemblyName,...n}:void 0}}));var Xn=w(U(),1);function Q(e){return typeof e=="object"&&e!==null}function Lc(e){return Q(e)&&e.type==="LinearGenomeView"&&typeof e.id=="string"&&typeof e.navToLocString=="function"&&Array.isArray(e.assemblyNames)}function Qe(e){return e.flatMap(t=>Q(t)&&Array.isArray(t.views)?[t,...t.views]:[t])}function et({views:e,connectedViewId:t,assemblyName:n}){let r=Qe(e).filter(a=>Lc(a)).filter(a=>a.assemblyNames.includes(n));return r.find(a=>a.id===t)??(r.length===1?r[0]:void 0)}function tt(e,t){let n=e.assemblyManager;return n?.has(t)?n.get(t)?.name??t:t}function Vi(e,t,n){n.catch(r=>{console.error(`[GraphGenomeView] ${t}`,r),e.notifyError?.(`${t}: ${r}`,r)})}var Gc=1e3;function zn(e,t=Gc){let n=Math.max(0,Math.ceil((t-(e.end-e.start))/2));return{...e,start:Math.max(0,e.start-n),end:e.end+n}}function _i(e,t){return t?e.map(n=>n.rank===0?{...n,sample:t.assemblyName,haplotype:void 0,refName:t.refName,start:t.start,end:t.end}:n):e}function Wi({session:e,location:t,assembly:n,connectedViewId:r,tracks:o=[]}){let a=et({views:e.views,connectedViewId:r,assemblyName:n}),i;return a?(Vi(e,`Could not show ${n} ${Ve(t)}`,Promise.resolve(a.navToLocString(Tt(t),n))),i=a.id):i=e.addView("LinearGenomeView",{displayName:`${n} \u2014 ${Ve(t)}`,init:{assembly:n,loc:Tt(t),tracks:o}}).id,i}function Oi({session:e,location:t,assembly:n,connectedViewId:r}){let o=et({views:e.views,connectedViewId:r,assemblyName:n});return o&&e.addHighlight?.({refName:t.refName,start:t.start,end:t.end,assemblyName:n}),o!==void 0}function Di(e,t){if(t===void 0)return[];let n=e.tracks.find(o=>(0,Xn.readConfObject)(o,"trackId")===t),r=n?(0,Xn.readConfObject)(n,"assemblyNames"):[];return Array.isArray(r)?r.filter(o=>typeof o=="string").map(o=>tt(e,o)):[]}function Hi({session:e,contributors:t,trackId:n,graphTrackId:r}){let o=Di(e,r),a=Di(e,n),i=t.filter(c=>a.includes(c.sample)),s=i.length>=2?i:t,d={init:{views:s.map(c=>({assembly:c.sample,loc:Tt(c),...r!==void 0&&o.includes(c.sample)?{tracks:[r]}:{}})),tracks:n?s.slice(1).map(()=>[n]):[],collapseEmptyRows:!0}};e.launchView?Vi(e,"Could not open the synteny view",e.launchView("LinearSyntenyView",d)):e.addView("LinearSyntenyView",d)}var ji=$i.views(e=>({get contributingAssemblies(){let t=e.graph,n=t?yr(t):[];return t?_o(t,{maxGap:n.length>0?xr(n):1/0}):[]}})).views(e=>({get assemblyResolver(){let{assemblyManager:t}=(0,xe.getSession)(e),n=e.sourceAdapter?.assemblyNameToPanSN,r=new Map(Object.entries(n??{}).map(([a,i])=>[i,a])),o=a=>a!==void 0&&t.has(a)?t.get(a)?.name??a:void 0;return a=>o(r.get(a))??o(a)},get geneTracksByAssembly(){let t=new Map;for(let n of(0,xe.getSession)(e).tracks){let r=(0,Yt.readConfObject)(n,"adapter").type;if(!qe.has(r))continue;let o={trackId:n.trackId,name:(0,Yt.readConfObject)(n,"name"),adapterType:r};for(let a of(0,Yt.readConfObject)(n,"assemblyNames")){let i=tt((0,xe.getSession)(e),a);t.set(i,[...t.get(i)??[],o])}}return new Map([...t].flatMap(([n,r])=>{let o=jt(r,"");return o?[[n,o]]:[]}))}})).views(e=>({get launchableAssemblies(){return Wo(_i(e.contributingAssemblies,e.graphRegion),e.assemblyResolver)},get canHighlightInLinearView(){let t=e.graphRegion;return t!==void 0&&et({views:[...(0,xe.getSession)(e).views],connectedViewId:e.connectedViewId,assemblyName:t.assemblyName})!==void 0},nodeLaunchTargets(t){let n=e.nodeById?.get(t),r=n?$e(n):void 0,o=r?De(e.assemblyResolver,r):void 0,a=e.graphRegion,i=e.nodeById,s=e.nodeNeighbors,d=a&&i&&s?Me({nodeId:t,nodeById:i,neighbors:s}):void 0,c=a&&d?{sample:a.assemblyName,haplotype:void 0,refName:a.refName,...d}:void 0;return{own:r&&o?{location:zn(r),assembly:o}:void 0,reference:a&&c?{location:zn(c),assembly:a.assemblyName}:void 0,highlight:a&&c?{location:c,assembly:a.assemblyName}:void 0}}})).views(e=>({get host(){let t;try{t=(0,xe.getContainingView)(e)}catch{return}return bi(t)?t:void 0}}));var Xi=ji.views(e=>({get walkStripShown(){return e.walkStrip&&!e.host&&e.modeDrawsNodes&&!e.layoutResult?.tubeMap&&!e.walkRowBars&&e.popStack.length===0&&(e.graph?.paths?.length??0)>1},get walkStripRows(){let t=this.walkStripShown?e.cutWalkRows:void 0;return t?{...t,rows:mt(t.rows,e.walkRowSamples)}:void 0},get walkStripFrame(){let t=this.walkStripRows;if(t)return Lt(t,{width:e.paneWidth})},get cutsWholeWalks(){return _(e.chosenLayoutMode).wholeWalks||e.walkStrip&&!e.host},get walkStripMarks(){let t=this.walkStripRows,n=e.hoveredNode??e.selectedNode,r=n===null?void 0:e.nodeById?.get(n);return t&&r&&e.graph?po(e.graph,[t.reference,...t.rows],r):[]},get walkStripLocator(){let t=e.stripHover?e.hoveredNode:null;return t===null?void 0:Gt(e.nodePositions?.[t],n=>({x:n.x*e.scaleX+e.translateX,y:n.y*e.scaleY+e.translateY}))}})).views(e=>({get walkGeneReads(){let t=e.walkRowBars??e.walkStripRows;if(!t||!e.showGenes)return;let n=[],r=0,o=0;for(let a of t.rows){if(!a.axis){o++;continue}let i=De(e.assemblyResolver,{sample:a.sample,haplotype:a.haplotype===void 0?void 0:`${a.sample}#${a.haplotype}`}),s=i?e.geneTracksByAssembly.get(i):void 0;if(!i||!s){r++;continue}n.push({row:a.name,trackId:s.trackId,region:{assemblyName:i,refName:a.axis.contig,...un(a.axis,a.bp)}})}return{reads:n.slice(0,Pn),gaps:{untracked:r,unplaced:o,unread:Math.max(0,n.length-Pn)}}},get walkRowGeneGaps(){return this.walkGeneReads?.gaps},walkRowAt(t,n){let r=e.walkRowBars;if(!r)return;let o=Math.round((n-e.translateY)/(20*e.scaleY)),a=[r.reference,...r.rows][o],i=o*20*e.scaleY+e.translateY,s=(t-e.translateX)/e.scaleX-r.origin;return a&&Math.abs(n-i)<=so/2+2&&s>=0&&s<=a.bp?o:void 0},walkRowLaunchTarget(t,n=e.walkRowBars){let r=n?[n.reference,...n.rows][t]:void 0;if(!r?.axis)return;let o=r.haplotype===void 0?void 0:`${r.sample}#${r.haplotype}`,a=t===0?e.graphRegion?.assemblyName:De(e.assemblyResolver,{sample:r.sample,haplotype:o});return{label:r.label,assembly:a,location:{sample:r.sample,haplotype:o,refName:r.axis.contig,...un(r.axis,r.bp)}}},get walkRowGenes(){let t=e.walkRowBars??e.walkStripRows;if(!t||!e.showGenes)return;let n=new Map(e.walkGeneFeatures??[]);return e.geneFeatures&&n.set(t.reference.name,e.geneFeatures),n.size?co([t.reference,...t.rows],n):void 0}}));var zi=Xi.views(e=>({get xIsReferenceBp(){return e.layoutResult?.referenceAxis===!0&&_(e.chosenLayoutMode).cutMargins}})).views(e=>({get hostPlacesX(){let{host:t,graphRegion:n}=e;return t!==void 0&&t.initialized&&n!==void 0&&e.xIsReferenceBp&&e.popStack.length===0&&!t.dynamicBlocks.contentBlocks.some(r=>r.refName===n.refName&&r.reversed)}})).views(e=>({get hostFrame(){let{host:t,graphRegion:n}=e;return e.hostPlacesX&&t&&n?Ke(t,n):void 0},get tubeMapPicture(){let t=e.layoutResult?.tubeMap;return t?Ao(t.layout):void 0},get tubeMapReference(){let t=e.layoutResult?.tubeMap;return t&&e.drawnGraph?Ro(e.drawnGraph,t.layout):void 0},get tubeMapDeviations(){let t=e.layoutResult?.tubeMap?.coarse,n=e.layoutResult?.tubeMap?.layout;return t&&n?Do(t.graph,n,t.deviations):[]},get tubeMapReferenceNodes(){let t=e.layoutResult;return t?.tubeMap&&!t.referenceAxis&&e.drawnGraph?Lo(e.drawnGraph,t.tubeMap.layout):void 0}})).views(e=>({get tubeMapGenes(){let t=e.tubeMapReference;return e.showGenes&&!e.host&&t&&e.backboneGenes?vo(t,e.backboneGenes):[]},get referenceStripApplies(){return!!e.host?.initialized&&!!e.layoutResult&&e.drawsNodes&&!e.hostPlacesX&&!e.facetPanels}})).views(e=>({get referenceStripBlocks(){let{graph:t}=e;return e.showReferenceStrip&&e.referenceStripApplies&&t?Eo(t,{colorScheme:e.effectiveColorScheme,referenceRamp:e.referenceRamp,walks:e.walkLift?.walks}):[]},get referenceStripFrame(){let{host:t,graphRegion:n}=e;return t?.initialized&&n?Ke(t,n):void 0}})).views(e=>({get referenceStripShown(){return e.referenceStripBlocks.length>0&&e.referenceStripFrame!==void 0},get referenceStripOverhangs(){let t=e.referenceStripFrame;if(!t||e.referenceStripBlocks.length===0)return!1;let{left:n,right:r}=Fo(e.referenceStripBlocks,t,e.paneWidth);return n>0||r>0},get referenceStripFaded(){return e.referenceStripBlocks.some(t=>t.faded)}})).views(e=>({get referenceStripLit(){if(!e.referenceStripShown)return;let t=a=>({x:a.x*e.scaleX+e.translateX,y:a.y*e.scaleY+e.translateY}),n=e.hoveredNode===null?e.hoveredBubble:null;if(n){let a=e.bubbleHalos.find(i=>ro(i.bubble,n));return{start:n.start,end:n.end,anchor:a?t(a.labelAt):void 0}}let r=e.hoveredNode??e.selectedNode,o=r===null?void 0:e.nodeSpan(r);return o&&r!==null?{...o,anchor:Gt(e.nodePositions?.[r],t)}:void 0},referenceStripNodeAt(t,n){let r=e.referenceStripFrame;return e.referenceStripShown&&r?$o(e.referenceStripBlocks,r,t,n):void 0},get paperCss(){return $a(e.darkMode?Et:Bt)},get referenceStripZonePx(){return e.referenceStripShown?Bo:0}}));var Ki=zi.views(e=>({get paneCeiling(){return Math.max(It,e.paneHeight??Fa)},get fitPadTopBase(){let t=Io(e.tubeMapGenes);return $+Math.max(0,t-1)*Co+e.referenceStripZonePx},get legendRoom(){let t=e.layoutBounds,{width:n,height:r}=e.legendSize;if(!t||t.w<=0||n===0||e.facetPanels||e.tubeMapReads)return;if(e.hostPlacesX)return"top";let o=this.fitPadTopBase,a=e.host?this.canvasHeight:this.paneCeiling,i=m=>(e.paneWidth-e.fitPadLeft-m)/t.w,s=m=>e.pixelRows?t.h+m+$<=a?1/0:0:(a-m-$)/t.h,d=Math.min(i(n+2*Te),s(o));return Math.min(i($),s(o+r+Te))>=d?"top":"right"},get fitPadTop(){return this.fitPadTopBase+(this.legendRoom==="top"?e.legendSize.height+Te:0)},get fitPadRight(){return this.legendRoom==="right"?Math.max($,e.legendSize.width+2*Te):$},get minFitScale(){let t=e.layoutBounds,n=e.layoutResult,r=n?.tubeMap?.layout.tracks[0]?.width;return t&&t.h>0&&r&&!n.referenceAxis?Math.min(Da/r,(this.paneCeiling-this.fitPadTop-$)/t.h):0},get facetSpec(){let{field:t,domain:n,columns:r}=e.facet;return t===""?void 0:n.length===0&&r===void 0?t:{field:t,domain:[...n],...r===void 0?{}:{columns:r}}},get facetPlacement(){let t=e.facetPanels,{field:n,domain:r}=e.facet;return t?St(t.map(o=>o.walks[0].name),e.hostPlacesX||n===""?"walk":n,r):void 0},facetGridIn(t){let n=this.facetPlacement,r=e.layoutBounds;return n&&r&&r.w>0?kt({count:n.count,bounds:r,pixelRows:e.pixelRows,width:e.paneWidth,room:t,columns:e.hostPlacesX?1:n.columns??e.facet.columns}):void 0},get facetGrid(){return this.facetGridIn(e.host?this.canvasHeight:this.paneCeiling)},get canvasHeight(){let t=e.layoutBounds,n=e.paneWidth-$-this.fitPadRight,r=this.paneCeiling;if(!t)return r;let o=this.facetGrid;if(o)return Math.max(It,o.total);let a=Math.max(It,e.legendSize.height+2*Te+e.referenceStripZonePx);return e.pixelRows?Math.min(r,Math.max(a,t.h+this.fitPadTop+$)):t.w>0&&n>0?Math.min(r,Math.max(a,t.h*Math.max(n/t.w,this.minFitScale)+this.fitPadTop+$)):r},get viewBox(){let t=this.facetGrid;return t?{width:t.width,height:t.height}:{width:e.paneWidth,height:this.canvasHeight}},get fittedTransform(){let t=e.layoutBounds,n=this.facetGrid;return t?n?ze(t,n.width,n.height,e.pixelRows,{padLeft:12,padTop:12,padRight:12,padBottom:12}):ze(t,e.paneWidth,this.canvasHeight,e.pixelRows,{minScale:this.minFitScale,padLeft:e.fitPadLeft,padTop:this.fitPadTop,padRight:this.fitPadRight}):void 0}})).views(e=>({viewportToBuild(){return Ta(Ue(e),Xa)},applyHighlights(t){let{hoveredNode:n,hoveredEdge:r,selectedNode:o}=e,a=new Map;o!==null&&a.set(o,Ha),n!==null&&n!==o&&a.set(n,Nn),t.setNodeHighlights(a),t.setEdgeHighlight(r,Nn)},paint(t){let n=(0,Ui.getDpr)();t.updateTransform({scaleX:e.scaleX*n,scaleY:e.scaleY*n,translateX:e.translateX*n,translateY:e.translateY*n,dpr:n}),t.render(e.referenceStripShown?[0,0,0,0]:e.darkMode?Et:Bt)}})).views(e=>({buildDrawing(t,n){let{nodePositions:r,graph:o,nodeById:a}=e;if(!r||!o||!a)return;ue(e.viewportDirty,e.positionsVersion);let i=(0,Yn.untracked)(()=>e.viewportToBuild());return{batch:yt({nodePositions:e.walkRowBars?{}:r,graph:o,nodeById:a,colorScheme:e.effectiveColorScheme,contigThickness:e.contigThickness,connectorThickness:e.connectorThickness,drawPaths:n,nodeWidth:e.nodeWidth,highlight:t,axis:(0,Yn.untracked)(()=>e.axisScale),linearLayout:e.linearLayout,viewportBounds:i,referenceRamp:e.referenceRamp,deletions:e.deletionEdgeIndexes,deletionRoutes:e.deletionRoutes,stranded:e.stranded,hiddenEdges:e.hiddenEdgeIndexes,version:e.positionsVersion}),viewportBounds:i}},get overlayLabels(){return yo(e)},hoveredOn(t){let n=e.hoveredNode,r=n?e.nodeById?.get(n):void 0;return r?So(t,r.id,r.length)??"not on this walk":void 0},figureSpec(){let t=e.graphRegion,n=e.sourceAdapter,r=n?.assemblyNameToPanSN,o=t&&`${t.refName}:${t.start}-${t.end}`,a=Pe(e.sourceGfaLocation),i=n?.type==="GbzBaseSyntenyAdapter"?Pe(n.gbzDbLocation):void 0,s=a?{gfa:a,region:o}:i&&t&&o?{gbz:{db:i,index:Pe(n.haplotypeIndexLocation),region:o,haplotypes:e.cutHaplotypes?.map(p=>r?.[p]??p),referenceSample:n.referenceSample||r?.[t.assemblyName]||t.assemblyName,context:n.context,snarls:e.cutsWholeWalks?"overlapping":n.subgraphSnarls}}:void 0;if(!s)return;let d=e.showGenes?e.geneTrack:void 0,c=d?(0,Yi.getSession)(e).tracks.find(p=>p.trackId===d.trackId):void 0,m=c?(0,Ut.expandTabixShorthand)((0,Ut.readConfObject)(c,"adapter"),"gffGzLocation"):void 0,g=m?.type==="Gff3TabixAdapter"?{file:Pe(m.gffGzLocation),index:Pe(m.index?.location),format:"gff3"}:void 0;return JSON.parse(JSON.stringify({...s,genes:g?.file&&g.index?g:void 0,referencePath:e.referencePath||void 0,layout:e.chosenLayoutMode,quality:e.layoutQuality,bubbleSpread:e.bubbleSpread,walks:e.walkLayers.length?e.walkLayers.map(p=>p.color?p:p.walk):void 0,facet:e.walkLayers.length>1?e.facetSpec:void 0,walkStrip:e.walkStripShown||void 0,walkRowSamples:e.walkStripShown?e.walkRowSamples:void 0,width:e.paneWidth,height:e.paneCeiling,colorScheme:e.chosenColorScheme,nodeWidth:e.nodeWidth,showDeletionEdges:e.showDeletionEdges||void 0}))},get figureUnavailable(){return e.layoutResult?e.drawsNodes||e.walkRowBars?void 0:`${_(e.chosenLayoutMode).label} draws a picture of its own, which the SVG export does not`:"Nothing is drawn yet"},get figureSpecUnavailable(){return e.drawsNodes?this.figureSpec()?void 0:"bandage-figure reads a graph cut from a gbz-base track or a GFA url":`bandage-figure draws no ${_(e.chosenLayoutMode).label} layout`},figure(){let{graph:t,layoutResult:n}=e;return t&&n&&!this.figureUnavailable?mi(t,n,{width:e.paneWidth,height:e.paneCeiling,walks:e.walkLayers,facet:e.facetSpec,colorScheme:e.effectiveColorScheme,nodeWidth:e.nodeWidth,showDeletionEdges:e.showDeletionEdges,contigThickness:e.contigThickness,connectorThickness:e.connectorThickness,region:e.graphRegion,colorDomain:e.colorDomain,fitToDrawing:e.popStack.length>0,genes:e.showGenes?e.backboneGenes:void 0,walkRows:e.walkRowBars,rowGenes:e.walkRowGenes,rowGeneGaps:e.walkRowGeneGaps,walkStrip:e.walkStripRows&&{rows:e.walkStripRows,rowGenes:e.walkRowGenes,rowGeneGaps:e.walkRowGeneGaps},spec:this.figureSpec()}):void 0},get tubeMapFrame(){let t=e.layoutResult?.tubeMap;return t?hi(t,{scaleX:e.scaleX,translateX:e.translateX,scaleY:e.scaleY,translateY:e.translateY,usableHeight:e.canvasHeight-e.fitPadTop-$}):void 0}})).views(e=>({get tubeMapRulerBoxes(){let t=e.tubeMapReference;return t&&!e.hostPlacesX?Mo(t):void 0},get connectorZoneBottom(){let t=e.tubeMapPicture,n=e.tubeMapFrame;return t&&n?n.y(t.bounds.minY)-2:0},get tubeMapConnectors(){let t=e.tubeMapReferenceNodes,n=e.tubeMapFrame,{host:r,graphRegion:o}=e,a=t&&n&&r?.initialized&&o?Ke(r,o):void 0;return t&&n&&a?Go(t,i=>i*a.scale+a.translateX,n.x,e.paneWidth):[]}})).views(e=>({get tubeMapKeys(){let t=e.layoutResult,n=t?.tubeMap?.layout.reads??[],r=e.tubeMapPicture,o=e.tubeMapFrame,a=r&&o&&No(o.yScale)?r.mismatches.filter(i=>Po(i,{x:o.x,width:e.paneWidth})):[];return{logWidths:t?.tubeMap!==void 0&&!t.referenceAxis,foldBp:e.tubeMapDeviations.length>0?e.tubeMapFold:void 0,forwardReads:n.some(i=>!i.is_reverse),reverseReads:n.some(i=>i.is_reverse),mismatches:new Set(a.map(i=>i.kind))}},tubeMapNodeAt(t,n){let r=e.layoutResult?.tubeMap,o=e.tubeMapFrame;return(r&&o?fi(r,o,t,n):null)??To(e.tubeMapConnectors,e.connectorZoneBottom,t,n)??null}}));var qi=Ki.actions(e=>({setError(t){e.error=t,e.isLoading=!1,e.statusMessage=""},finishLoading(){e.isLoading=!1,e.statusMessage=""},setStatusMessage(t){e.statusMessage=t},setFetchMs(t){e.lastFetchMs=t},setLayoutMs(t){e.lastLayoutMs=t},setGeometryMetrics(t,n,r){e.lastGeometryMs=t,e.lastGeometryStrokeCount=n,e.builtViewport={...r,viewportDirty:e.viewportDirty},e.geometryVersion++},markPainted(){e.paintedViewport=e.builtViewport},setLayoutQuality(t){e.layoutQuality=t},setLinearLayout(t){e.linearLayout=t},setLayoutMode(t){e.layoutMode=t},setReferencePath(t){e.referencePath=t;let n=e.graph;if(n?.anchoredBy==="paths"){let r=ct(n,t);Ua(n,r),e.graph=r}},setDrawPaths(t){e.drawPaths=t},setShowPerf(t){e.showPerf=t},setColorScheme(t){e.colorScheme=t},setBubbleSpread(t){e.bubbleSpread=t},setNodeWidth(t){e.nodeWidth=t},setShowBubbles(t){e.showBubbles=t},setShowDeletionEdges(t){e.showDeletionEdges=t},setShowGenes(t){e.showGenes=t},setShowReferenceStrip(t){e.showReferenceStrip=t},setTubeMapFold(t){e.tubeMapFold=t},setGeneTrackId(t){e.geneTrackId=t},setRepeatTrackId(t){e.repeatTrackId=t},setRepeatKey(t){e.repeatKey=t},setWalkLayers(t){e.walkLayers=t},liftWalks(t){let n=new Map(e.walkLayers.map(r=>[r.walk,r]));e.walkLayers=t.map(r=>n.get(r)??{walk:r})},setFacet(t){t!==e.facet.field&&(e.facet.domain=[]),e.facet.field=t},setFacetColumns(t){e.facet.columns=t},toggleWalk(t){let n=e.walkLayers;e.walkLayers=n.some(r=>r.walk===t)?n.filter(r=>r.walk!==t):[...n,{walk:t}]},setWalkColor(t,n){e.walkLayers=e.walkLayers.map(r=>r.walk===t?{...r,color:{...r.color,...n}}:r)},setPaneHeight(t){e.paneHeight=t},setWalkRowSamples(t){e.walkRowSamples=t},pairWithLinearView(t){let n=e.connectedViewId;n!==void 0&&Qe([...(0,nt.getSession)(e).views]).some(o=>o.id===n)||(e.connectedViewId=t)},setHoveredNode(t){e.hoveredNode=t},setHoveredRowWalks(t){t.join(`
|
|
4
4
|
`)!==e.hoveredRowWalks.join(`
|
|
5
|
-
`)&&(e.hoveredRowWalks=t)},setHoveredBubble(t){e.hoveredBubble=t},setPointerInPane(t){e.pointerInPane=t},setWalkStrip(t){e.walkStrip=t,e.stripHover=null},setStripHover(t){e.stripHover=t;let n=e.walkStripRows,r=e.walkStripFrame,o=t&&n?[n.reference,...n.rows].find(i=>i.name===t.row):void 0,a=o&&r&&e.graph?lo(e.graph,o,t.offset,r.scaleX):void 0;e.hoveredNode=a??null},setLegendSize(t){e.legendSize=t},setHoveredEdge(t){e.hoveredEdge=t},setSelectedNode(t){e.selectedNode=t},setDraggingNode(t){e.draggingNode=t},setPanning(t){e.isPanning=t},stopDragging(){e.draggingNode=null,e.isPanning=!1},clearInteractionState(){e.hoveredNode=null,e.hoveredBubble=null,e.hoveredEdge=null,e.selectedNode=null,e.draggingNode=null,e.isPanning=!1},showNodeDetails(t){let n=e.nodeById?.get(t),r=e.nodeById,o=e.nodeNeighbors;if(n&&r&&o){let a=(0,st.getSession)(e),i=e.graphRegion,s=i?Me({nodeId:t,nodeById:r,neighbors:o}):void 0;(0,st.isSessionModelWithWidgets)(a)&&a.showWidget(a.addWidget("BaseFeatureWidget","baseFeature",{featureData:{id:n.id,name:n.name,length:n.length,depth:n.depth,rank:n.stable?.rank,stableName:n.stable?.refName,contributingAssembly:We(n)?.sample,contributingHaplotype:We(n)?.haplotype,sampleCount:n.samples?.length,samples:n.samples,...i&&s?{refName:i.refName,assemblyName:i.assemblyName,start:s.start,end:s.end}:{}}}))}},setTransform(t,n,r){let{host:o}=e;e.viewportOwner==="host"&&o?o.horizontalScroll(e.translateX-n):(e.viewportOwner="user",e.scale=Je(t),e.translateX=n),e.translateY=r},zoom(t,n,r){let{host:o}=e;if(e.viewportOwner==="host"&&o){o.zoomTo(o.bpPerPx/t,n);return}e.viewportOwner="user";let a=Ia(e,t,n,r,e.pixelRows);e.scale=a.scale,e.translateX=a.translateX,e.translateY=a.translateY},setViewportDirty(){e.viewportRebuildPending=!1,e.viewportDirty++},setPositionsDirty(){e.positionsVersion++},zoomToFit(){if(e.viewportOwner==="host"){let n=e.layoutBounds,r=e.facetGrid!==void 0,o=r?12:$,a=r?12:e.fitPadTop,i=e.viewBox.height-a-o;n&&i>0&&(e.translateY=Pn(n,i,e.scaleY,a));return}let t=e.fittedTransform;t&&(e.scale=t.scale,e.translateX=t.translateX,e.translateY=t.translateY)},clearPerfMetrics(){e.lastFetchMs=void 0,e.lastLayoutMs=void 0,e.lastGeometryMs=void 0,e.lastGeometryStrokeCount=void 0,e.builtViewport=void 0}})).actions(e=>({hostTransform(t,n){let r=e.viewportOwner!=="host";r&&(e.viewportOwner="host"),e.scale=t,e.translateX=n,r&&e.zoomToFit()},refitView(){e.viewportOwner==="user"&&(e.viewportOwner="fit"),e.zoomToFit()},releaseHost(){e.viewportOwner==="host"&&(e.xIsReferenceBp?e.viewportOwner="user":(e.viewportOwner="fit",e.zoomToFit()))}})).actions(e=>{function t(){clearTimeout(e.viewportDirtyTimer),e.viewportRebuildPending=!0,e.viewportDirtyTimer=setTimeout(()=>{(0,qn.isAlive)(e)&&e.setViewportDirty()},Ua)}function n(){cancelAnimationFrame(e.positionsDirtyFrame),e.positionsDirtyFrame=requestAnimationFrame(()=>{(0,qn.isAlive)(e)&&e.setPositionsDirty()})}return{moveNode(r,o,a){let i=e.layoutResult?.nodePositions;if(i?.[r]){for(let s of i[r])s.x+=o,s.y+=a;n()}},scheduleViewportDirty:t}});var Qi=qi.actions(e=>{let t;function n(l){let{rpcManager:b}=(0,ne.getSession)(e);return b.call((0,ne.getRpcSessionId)(e),"GraphComputeLayout",{...l,signal:t?.signal,statusCallback:M=>{e.setStatusMessage((0,ne.statusMessageText)(M)??"")}})}function r(l){return La(l,{quality:e.layoutQuality,linearLayout:e.linearLayout,bubbleSpread:e.bubbleSpread})}function*o(l){let b=performance.now(),M=Pe.has(e.chosenLayoutMode),f=e.graphRegion,G=M&&f?ni(l,f):l,S=M&&e.tubeMapFold>0&&!G.reads?oi(G,e.tubeMapFold):void 0,T=V(e.chosenLayoutMode).run(S?.graph??G,e.graphRegion,e.host?e.layoutResult?.sampleRows:void 0);if(T)return{result:S&&T.tubeMap?{...T,tubeMap:{...T.tubeMap,coarse:S}}:T,duration:performance.now()-b};let N=Ja(l),I=r(l),W=N.get(I);if(W)return{result:W,duration:performance.now()-b};let E=yield Aa(l,{quality:e.layoutQuality,linearLayout:e.linearLayout,bubbleSpread:e.bubbleSpread},n);return Qa(N,I,E.result),E}let a=0,i=new Map;function*s(l){let b=++a,M=()=>e.graph===l&&b===a,f=t?.signal,G;try{G=yield*o(l)}catch(T){if(!M()||f?.aborted)return!1;throw T}let S=M();return S&&(e.layoutResult=G.result,e.setLayoutMs(G.duration)),S}function d(l,b){let M=l.anchorPaths;return l.anchoredBy==="paths"&&M?(Lr(l,e.assemblySpellings(b.assemblyName))??Br(M,b.assemblyName))?.name:void 0}function*c(l,b,M,f=!1,G){let S=t?.signal;e.setStatusMessage("Parsing GFA");let T=Ga(l,b,{referencePath:e.referencePath||M?.assemblyName,maxNodes:e.maxGraphNodes}),N=M?d(T,M):void 0,I=!e.referencePath&&N!==void 0&&N!==T.referencePath?lt(T,N):T;if(G){e.setStatusMessage("Reading alignments");try{let{records:E,total:J}=yield G(I);I.reads=E,e.readsShown={shown:E.length,total:J}}catch(E){if(S?.aborted)return;console.warn("[GraphGenomeView] no reads for this graph",E),e.readsShown=void 0}if(S?.aborted)return}else e.readsShown=void 0;let W=f?e.selectedNode:null;e.graph=I,e.graphRegion=M,e.loadedReferencePath=N,e.indexBubbles=void 0,e.geneFeatures=void 0,e.walkGeneFeatures=void 0,i.clear(),e.repeatArrays=void 0,e.popStack=[],e.clearInteractionState(),W!==null&&e.nodeById?.has(W)&&(e.selectedNode=W),e.setStatusMessage("Computing layout"),yield*s(I)}let m=0;function g(){let l=++m;return t?.abort(),t=new AbortController,e.loadCanceled=!1,{isLive:()=>l===m,signal:t.signal}}function*p(l,b,M){let f=za(l);if(!(l.type!=="RgfaTabixAdapter"||f===void 0))try{let G=yield(0,ne.getSession)(e).rpcManager.call((0,ne.getRpcSessionId)(e),"CoreGetFeatures",{adapterConfig:{type:"MinigraphBubbleAdapter",uri:`${f}.bubbles.bed.gz`,baseUri:l.baseUri,assemblyNameToPanSN:l.assemblyNameToPanSN},regions:[b]});M()&&(e.indexBubbles=G.map(S=>({refName:b.refName,start:S.get("start"),end:S.get("end"),segmentCount:S.get("segmentCount"),pathCount:S.get("pathCount")??0,inversion:S.get("inversion"),shortestAlleleLength:S.get("shortestAlleleLength"),longestAlleleLength:S.get("longestAlleleLength"),segments:S.get("segments"),shortestAllele:void 0,longestAllele:void 0})))}catch(G){console.warn("[GraphGenomeView] no bubble index for this graph",G)}}function*u(l,b,M){let f=(0,ne.getSession)(e),G=l?f.tracks.find(S=>S.trackId===l):void 0;if(G)try{return yield f.rpcManager.call((0,ne.getRpcSessionId)(e),"CoreGetFeatures",{adapterConfig:(0,Ji.readConfObject)(G,"adapter"),regions:[b]})}catch(S){console.warn(`[GraphGenomeView] no ${M} for this graph`,S);return}}function*k(l,b){let M=yield*u(e.geneTrack?.trackId,l,"genes");M&&b()&&(e.geneFeatures=Hn(M))}function*x(l,b){let M=yield*u(e.repeatTrack?.trackId,l,"repeats");M&&b()&&(e.repeatArrays=Fi(M))}function*w(l,b,M){let{isLive:f,signal:G}=g();e.isLoading=!0,e.error=void 0;try{let S=typeof b=="string"?b:yield b(G);f()&&(yield*c(S,l,M))}catch(S){f()&&(console.error("[GraphGenomeView.loadWholeGFA]",S),e.error=S)}finally{f()&&e.finishLoading()}return f()}function h(){t?.abort(),t=void 0,m++,a++}function v(){h(),e.graph=void 0,e.graphRegion=void 0,e.loadedReferencePath=void 0,e.layoutResult=void 0,e.indexBubbles=void 0,e.geneFeatures=void 0,e.walkGeneFeatures=void 0,i.clear(),e.repeatArrays=void 0,e.readsShown=void 0,e.popStack=[],e.error=void 0,e.isLoading=!1,e.loadCanceled=!1,e.statusMessage="",e.clearInteractionState(),e.clearPerfMetrics()}return{clearGraph(){v()},cancelLoad(){e.canCancelLoad&&(v(),e.loadCanceled=!0)},stopLoad(){h(),e.isLoading=!1,e.statusMessage="",e.loadCanceled=!0},beforeDestroy(){h()},loadGFA:(0,q.flow)(function*(l,b="Imported GFA"){yield*w(b,l)}),loadGFAFromLocation:(0,q.flow)(function*(l,b){e.setStatusMessage("Fetching GFA");let M=yield*w("uri"in l?l.uri.split("/").pop()??"GFA":"GFA",f=>(0,Zi.openLocation)(l).readFile({encoding:"utf8",signal:f}),b);b&&M&&e.graph&&(yield*x(b,()=>e.graphRegion===b))}),cutSubgraph:(0,q.flow)(function*(l,b,M={}){let{isLive:f,signal:G}=g();e.isLoading=!0,e.error=void 0,e.setStatusMessage("Fetching subgraph");try{let S=performance.now(),T=yield(0,ne.getSession)(e).rpcManager.call((0,ne.getRpcSessionId)(e),"GetSubgraph",{adapterConfig:l,region:b,opts:M,signal:G});if(!f())return;if(e.setFetchMs(performance.now()-S),!T)throw new Error("Adapter returned no GFA \u2014 region may be outside indexed data or the adapter does not implement getSubgraph");if(yield*c(T,je(b),b,!0,na(l)?N=>(0,ne.getSession)(e).rpcManager.call((0,ne.getRpcSessionId)(e),"GetGraphReads",{adapterConfig:l,nodeNames:N.nodes.map(I=>I.name),signal:G}):void 0),!f())return;e.setStatusMessage("Reading annotations"),yield Promise.all([M.tier==="coarse"?void 0:(0,q.flow)(p)(l,b,f),(0,q.flow)(k)(b,f),(0,q.flow)(x)(b,f)])}catch(S){f()&&(console.error("[GraphGenomeView.cutSubgraph]",S),e.error=S)}finally{f()&&e.finishLoading()}}),reloadRepeats:(0,q.flow)(function*(){let l=e.graphRegion,b=e.repeatTrack?.trackId;l&&(yield*x(l,()=>e.graphRegion===l&&e.repeatTrack?.trackId===b))}),loadWalkGenes:(0,q.flow)(function*(){let l=e.walkGeneReads?.reads??[],b=JSON.stringify(l),M=e.graph,f=new Map;yield Promise.all(l.map(({row:G,trackId:S,region:T})=>(0,q.flow)(function*(){let N=`${S} ${T.refName}:${T.start}-${T.end}`,I=i.get(N);if(!I){let W=yield*u(S,T,"haplotype genes");if(!W)return;I=Hn(W).map(E=>({...E,refName:T.refName})),i.set(N,I)}f.set(G,I)})())),(0,q.isAlive)(e)&&e.graph===M&&JSON.stringify(e.walkGeneReads?.reads??[])===b&&(e.walkGeneFeatures=l.length?f:void 0)}),reloadGenes:(0,q.flow)(function*(){i.clear();let l=e.graphRegion,b=e.geneTrack?.trackId;l&&(yield*k(l,()=>e.graphRegion===l&&e.geneTrack?.trackId===b))}),popBubble:(0,q.flow)(function*(l){let b=e.graph;if(!b)return;let M=ti(b,At(l));if(M.nodes.length===0){(0,ne.getSession)(e).notify("None of the segments of this bubble are in the cut; widen the graph context to open it","info");return}let{isLive:f}=g();e.popStack=[...e.popStack,{graph:b,layoutMode:e.chosenLayoutMode,label:b.name,indexBubbles:e.indexBubbles}],e.indexBubbles=void 0;let G=`${co[Lt(l,e.repeatArrays).kind]} at ${l.refName}:${l.start.toLocaleString()}`;e.graph={...M,name:G},e.clearInteractionState(),e.viewportOwner="fit",e.isLoading=!0;try{(yield*s(e.graph))&&e.finishLoading()}catch(S){f()&&(e.error=S,e.finishLoading())}}),unpopBubble:(0,q.flow)(function*(){let l=e.poppedFrom;if(l){e.popStack=e.popStack.slice(0,-1),e.graph=l.graph,e.layoutMode=l.layoutMode,e.indexBubbles=l.indexBubbles,e.clearInteractionState(),e.viewportOwner="fit",e.isLoading=!0;try{(yield*s(l.graph))&&e.finishLoading()}catch(b){e.error=b,e.finishLoading()}}}),recomputeLayout:(0,q.flow)(function*(){let l=e.graph;if(l){e.isLoading=!0,e.setStatusMessage("Computing layout");try{(yield*s(l))&&e.finishLoading()}catch(b){console.error("[GraphGenomeView.recomputeLayout]",b),e.error=b,e.finishLoading()}}})}});function Tc(e){return te(e)&&typeof e.get=="function"}function Pc(e){let t=Tc(e)?e.get("name"):te(e)?e.name:void 0;return typeof t=="string"?t:void 0}function es(e){let t;if(te(e)&&te(e.hoverPosition)){let{refName:n,coord:r,coord0:o,assemblyName:a}=e.hoverPosition;typeof n=="string"&&typeof r=="number"&&(t={refName:n,coord:typeof o=="number"?o:r-1,assemblyName:typeof a=="string"?a:void 0,featureName:Pc(e.hoverFeature)})}return t}function ts(e,t){return(e.assemblyName===void 0||e.assemblyName===t.assemblyName)&&e.refName===t.refName&&e.coord>=t.start&&e.coord<t.end}function ns({hover:e,nodes:t}){let n,r;for(let o of t)o.name===e.featureName?n=o.id:r===void 0&&O(o)&&e.coord>=o.stable.start&&e.coord<o.stable.start+o.length&&(r=o.id);return n??r??null}var Nc=/^(.+) HP(\d+)$/,Cc=/^(.+)\.(\d+)$/;function Ic(e){let t=Nc.exec(e),n=Cc.exec(e);return[...t?[{sample:t[1],haplotype:String(Number(t[2])+1)}]:[],...n?[{sample:n[1],haplotype:n[2]}]:[],{sample:e,haplotype:void 0}]}function Ec(e){return ee(e).name.split("#")[1]}function rs(e,t){let n=t.map(r=>r.name);for(let{sample:r,haplotype:o}of Ic(e)){let a=n.filter(i=>yr(ee(i).name)===r&&(o===void 0||Ec(i)===o));if(a.length>0)return a}return[]}var as=Qi.actions(e=>({startRenderingBackend(t){if(!e.autorunsInstalled){(0,ge.addDisposer)(e,(0,_.autorun)(()=>{e.fittedTransform&&(0,_.untracked)(()=>e.viewportOwner==="fit")&&e.zoomToFit()})),(0,ge.addDisposer)(e,(0,_.reaction)(()=>{let r=e.facetGrid;return r?`${e.facet.field} ${e.facetPanels?.length} ${r.columns}`:""},()=>{e.refitView()})),(0,ge.addDisposer)(e,(0,_.reaction)(()=>({graph:e.graph,reads:JSON.stringify(e.walkGeneReads?.reads??[])}),()=>{e.loadWalkGenes()},{fireImmediately:!0,equals:(r,o)=>r.graph===o.graph&&r.reads===o.reads})),(0,ge.addDisposer)(e,(0,_.reaction)(()=>e.fitPadTop,()=>{e.viewportOwner==="host"&&e.zoomToFit()})),(0,ge.addDisposer)(e,(0,_.autorun)(()=>{let r=es((0,os.getSession)(e).hovered);(0,_.untracked)(()=>{let o=e.graphRegion,a=e.graph,i=r&&o&&ts(r,o)?r:void 0,s=i?.featureName&&a?.paths?rs(i.featureName,a.paths):[];o&&a&&!e.pointerInPane&&e.setHoveredNode(i&&s.length===0?ns({hover:i,nodes:a.nodes}):null),e.setHoveredRowWalks(s)})})),(0,ge.addDisposer)(e,(0,_.reaction)(()=>`${e.scale}-${e.translateX}-${e.translateY}`,()=>{e.setHoveredNode(null),e.setHoveredBubble(null),e.setHoveredEdge(null)},{name:"GraphClearHoverOnViewportChange"}));let n=!0;(0,ge.addDisposer)(e,(0,_.autorun)(()=>{let{scale:r}=e,o=et(e);if(n){n=!1;return}let a=(0,_.untracked)(()=>e.builtViewport);a?.scale===r&&Ca(a.bounds,o)||e.scheduleViewportDirty()})),(0,ge.addDisposer)(e,(0,_.autorun)(()=>{let r=e.currentRenderingBackend;le(e.geometryVersion),r&&(e.applyHighlights(r),e.renderNow())}))}e.attachRenderingBackend(t,()=>({upload:n=>{if(n.resize(e.paneWidth,e.canvasHeight),e.layoutResult?.tubeMap)return le(e.viewportDirty),n.uploadGeometry(Fn),e.setGeometryMetrics(0,0,{scale:(0,_.untracked)(()=>e.scale),bounds:(0,_.untracked)(()=>et(e))}),!0;if(e.facetPanels)return le(e.viewportDirty),n.uploadGeometry(Fn),e.setGeometryMetrics(0,0,{scale:(0,_.untracked)(()=>e.scale),bounds:(0,_.untracked)(()=>e.viewportToBuild())}),!0;let r=performance.now(),o=e.buildDrawing(e.walkLift,e.effectiveDrawPaths);return o?(n.uploadGeometry(o.batch),e.setGeometryMetrics(performance.now()-r,o.batch.nodeStrokes.length,{scale:(0,_.untracked)(()=>e.scale),bounds:o.viewportBounds}),!0):!1},render:n=>e.nodePositions?(e.paint(n),e.markPainted(),!0):!1,releaseTargets:n=>{n.releaseOffscreenTargets()}}))}})).actions(e=>({switchLayout(t){return e.setLayoutMode(t),e.recomputeLayout()},retryLoad(){},afterAttach(){e.isDefaultViewport||(e.viewportOwner="user")}}));var en=y(K(),1),Bc="FeatureTrack";function is({session:e,assemblyName:t,first:n}){let r=[];for(let o of e.tracks){let a=(0,en.readConfObject)(o,"type"),i=(0,en.readConfObject)(o,"assemblyNames"),s=(0,en.readConfObject)(o,"trackId");a===Bc&&Array.isArray(i)&&i.includes(t)&&typeof s=="string"&&s!==n&&r.push(s)}return n?[n,...r]:r}var tn=y(K(),1),ss=y(ud(),1),nn=y(oe(),1);var Fc="SyntenyTrack",Oc="Synteny adapters";function $c(e){if((0,tn.readConfObject)(e,"type")===Fc)return!0;let t=e.adapter?.type;if(typeof t!="string"||!(0,nn.isStateTreeNode)(e))return!1;let{pluginManager:n}=(0,nn.getEnv)(e);return!!n?.hasAdapterType(t)&&n.getAdapterType(t).adapterMetadata?.category===Oc}function ds(e,t){let n=new Set(t),r=[];for(let o of e.tracks){let a=(0,tn.readConfObject)(o,"assemblyNames"),i=(0,tn.readConfObject)(o,"trackId");if($c(o)&&typeof i=="string"&&Array.isArray(a)){let s=a.filter(d=>typeof d=="string"&&n.has(it(e,d))).length;s>=2&&r.push({trackId:i,name:(0,ss.getTrackName)(o,e),coverage:s})}}return r.sort((o,a)=>a.coverage-o.coverage)}function cs(e,t,n="image/svg+xml"){let r=URL.createObjectURL(new Blob([e],{type:n})),o=document.createElement("a");o.href=r,o.download=t,o.click(),setTimeout(()=>{URL.revokeObjectURL(r)},0)}var us=as.actions(e=>({showInLinearView(t){let n=(0,Se.getSession)(e),r=t.assembly===e.graphRegion?.assemblyName,o=_i({session:n,location:t.location,assembly:t.assembly,connectedViewId:e.connectedViewId,tracks:is({session:n,assemblyName:t.assembly,first:r?e.sourceTrackId:void 0})});r&&e.pairWithLinearView(o)},highlightInLinearView(t){Wi({session:(0,Se.getSession)(e),location:t.location,assembly:t.assembly,connectedViewId:e.connectedViewId})},showSyntenyView(t){Hi({session:(0,Se.getSession)(e),contributors:e.launchableAssemblies,trackId:t,graphTrackId:e.sourceTrackId})}})).views(e=>({get syntenyLaunchTracks(){let t=e.launchableAssemblies.map(n=>n.sample);return t.length>=2?ds((0,Se.getSession)(e),t):[]}})).views(e=>({graphMenuItems(){let t=e.walkChoices;return[{label:"Layout",subMenu:Xr.map(n=>({type:"radio",label:n.label,checked:e.chosenLayoutMode===n.value,disabled:e.graph?!n.available(e.graph):!1,onClick:()=>{e.switchLayout(n.value)}}))},{label:"Color",subMenu:Yr.map(n=>({type:"radio",label:n.label,checked:e.chosenColorScheme===n.value,onClick:()=>{e.setColorScheme(n.value)}}))},...t.length>0&&e.liftsWalks?[{label:"Walk",subMenu:[{label:"None",onClick:()=>{e.setWalkLayers([])}},...e.walkLayers.length>1&&e.modeDrawsNodes?[{label:"Side by side",subMenu:ja.map(({value:n,label:r})=>({type:"radio",label:r,checked:e.facet.field===n,onClick:()=>{e.setFacet(n)}}))}]:[],...e.facetPanels&&e.facet.field==="walk"&&!e.hostPlacesX?[{label:"Columns",subMenu:[void 0,...e.facetPanels.map((n,r)=>r+1)].map(n=>({type:"radio",label:n===void 0?"Auto":`${n}`,checked:e.facet.columns===n,onClick:()=>{e.setFacetColumns(n)}}))}]:[],...t.length>In?[{label:"Choose walks...",onClick:()=>{(0,Se.getSession)(e).queueDialog(n=>[Ha,{model:e,onClose:n}])}}]:[],...(t.length>In?t.filter(n=>e.walkLayers.some(r=>r.walk===n.name)):t).map(n=>({type:"checkbox",label:n.label,checked:e.walkLayers.some(r=>r.walk===n.name),onClick:()=>{e.toggleWalk(n.name)}})),...e.drawnWalks.map(n=>({label:`Colour ${e.walkLabel(n.name)}`,subMenu:[{type:"subHeader",label:"Colour by"},...Zr.map(r=>({type:"radio",label:r.label,checked:n.encoding.field===r.value,onClick:()=>{e.setWalkColor(n.name,{field:r.value})}})),{type:"subHeader",label:"Palette"},...Qr.filter(r=>r.value!=="rainbow"||n.encoding.field==="reference").map(r=>({type:"radio",label:r.label,checked:n.encoding.scheme===r.value,onClick:()=>{e.setWalkColor(n.name,{scheme:r.value})}}))]}))]}]:[],...Pe.has(e.chosenLayoutMode)?[{label:"Fold variants",subMenu:Xa.map(({bp:n,label:r})=>({type:"radio",label:r,checked:e.tubeMapFold===n,disabled:n>0&&e.graph?.reads!==void 0,onClick:()=>{e.setTubeMapFold(n),e.recomputeLayout()}}))}]:[],...e.chosenLayoutMode==="walkrows"&&e.repeatChoices.length>0?[{label:"Repeat",subMenu:[{type:"radio",label:"Whole window",checked:e.repeatKey==="",onClick:()=>{e.setRepeatKey("")}},...e.repeatChoices.map(({key:n,name:r,unit:o})=>({type:"radio",label:`${r} \xB7 ${o.toLocaleString()} bp unit`,checked:e.repeatKey===n,onClick:()=>{e.setRepeatKey(n)}}))]}]:[],...e.hostPlacesX?[]:[{label:"Zoom in",onClick:()=>{e.zoom(1.5,e.viewBox.width/2,e.viewBox.height/2)}},{label:"Zoom out",onClick:()=>{e.zoom(1/1.5,e.viewBox.width/2,e.viewBox.height/2)}},{label:"Zoom to fit",onClick:()=>{e.zoomToFit()}}],{type:"checkbox",label:"Mark bubbles",checked:e.showBubbles,onClick:()=>{e.setShowBubbles(!e.showBubbles)}},{type:"checkbox",label:"Show deletion edges",checked:e.showDeletionEdges,onClick:()=>{e.setShowDeletionEdges(!e.showDeletionEdges)}},{type:"checkbox",label:"Genes on the backbone",checked:e.showGenes,onClick:()=>{e.setShowGenes(!e.showGenes)}},...!e.host&&e.modeDrawsNodes&&(e.graph?.paths?.length??0)>1?[{type:"checkbox",label:"Walk rows under the graph",checked:e.walkStrip,onClick:()=>{e.setWalkStrip(!e.walkStrip)}}]:[],...e.referenceStripApplies?[{type:"checkbox",label:"Reference strip at bp",checked:e.showReferenceStrip,onClick:()=>{e.setShowReferenceStrip(!e.showReferenceStrip)}}]:[],{label:"Export SVG",disabled:e.figureUnavailable!==void 0,disabledHelpText:e.figureUnavailable,onClick:()=>{let n=e.figure();n&&cs(n,`${(e.graph?.name??"graph").replaceAll(/[^\w.-]+/g,"_")}.svg`)}},{label:"Copy figure spec",disabled:e.figureSpecUnavailable!==void 0,disabledHelpText:e.figureSpecUnavailable,onClick:()=>{let n=e.figureSpec(),r=(0,Se.getSession)(e);navigator.clipboard.writeText(`${JSON.stringify(n,null,2)}
|
|
6
|
-
`).then(()=>{r.notify("Figure spec copied. Save it as spec.json and run: npx -p @jbrowse/bandage-core bandage-figure spec.json -o figure.svg","info")}).catch(o=>{r.notify(`Could not copy the figure spec: ${String(o)}`)})}}]},launchMenuItems(){let t=[];for(let n of Wo({contributors:e.launchableAssemblies,syntenyTracks:e.syntenyLaunchTracks,onShowLinear:r=>{e.showInLinearView(r)},onShowSynteny:r=>{e.showSyntenyView(r)}}))(0,ps.pushLaunchViewMenuItem)(t,n);return t}}));function rn(){return us}var Jn=y(K(),1);function ms(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}function ls(e){let t=(0,Jn.readConfObject)(e,"assemblyNames"),n=ms(t)?t.slice(1):[];return n.length>0?n:void 0}function on(e){let t=(0,Jn.readConfObject)(e,"assemblyNames");return ms(t)?t[0]:void 0}function an(e,t){return e===void 0||e===t?void 0:`The graph is cut on its reference, ${e}: open it from a view of ${e}`}function Dc(e){return("uri"in e?e.uri.split(/[?#]/)[0]:"localPath"in e?e.localPath:"name"in e?e.name:"").split(/[\\/]/).at(-1)??""}function Zn(){return X.types.compose("GraphGenomeView",gs.BaseViewModel,rn(),X.types.model({type:X.types.literal("GraphGenomeView"),gfaLocation:X.types.maybe(X.types.frozen()),loadedRegion:X.types.maybe(X.types.frozen()),loadedTrackId:X.types.optional(X.types.string,""),subgraphContext:X.types.optional(X.types.number,1),subgraphHaplotypes:X.types.maybe(X.types.frozen()),maxRegionBp:X.types.optional(X.types.number,Qe)})).views(e=>({get rpcSessionId(){return e.id},get paneWidth(){return e.width},get cutHaplotypes(){return e.subgraphHaplotypes},get sourceGfaLocation(){return e.gfaLocation},get sourceTrack(){return e.loadedTrackId?(0,hs.getSession)(e).tracks.find(t=>t.trackId===e.loadedTrackId):void 0},get canRetryLoad(){return e.gfaLocation!==void 0||e.loadedTrackId!==""&&e.loadedRegion!==void 0}})).views(e=>({get hasPendingSource(){return e.canRetryLoad&&!e.graph&&!e.loadCanceled},menuItems(){return e.launchMenuItems()}})).actions(e=>{let t=e.clearGraph;return{clearGraph(){t(),e.gfaLocation=void 0,e.loadedRegion=void 0,e.loadedTrackId=""},load(){let n=e.loadedRegion;if(e.gfaLocation)return e.displayName||e.setDisplayName(Dc(e.gfaLocation)),e.loadGFAFromLocation(e.gfaLocation,n);if(!e.loadedTrackId||!n)return;let r=e.sourceTrack,o=n.end-n.start,a=r?an(on(r),n.assemblyName):void 0;if(!r)e.setError(new Error(`The track this graph was cut from, "${e.loadedTrackId}", is not in this session`));else if(a)e.setError(new Error(a));else if(o>e.maxRegionBp)e.setError(new Error(`Region too large (${be(o)}) \u2014 zoom in to view graph (max ${be(e.maxRegionBp)})`));else return e.cutSubgraph(he(e,r),n,{hops:e.subgraphContext,haplotypes:e.subgraphHaplotypes,...e.cutsWholeWalks?{snarls:"overlapping"}:{}})}}}).actions(e=>({retryLoad(){e.load()},switchLayout(t){let n=e.cutsWholeWalks;return e.setLayoutMode(t),e.loadedTrackId&&e.cutsWholeWalks!==n?e.load():e.recomputeLayout()},afterAttach(){e.graph||e.load(),(0,X.addDisposer)(e,(0,fs.reaction)(()=>e.walkStrip,()=>{e.loadedTrackId&&!V(e.chosenLayoutMode).wholeWalks&&e.load()}))}}))}var Vc=(0,ws.defineLaunchKeys)()({});function Qn(e){e.addViewType(()=>new ys.default({name:"GraphGenomeView",displayName:"Graph genome view",stateModel:Zn(),launchKeys:Vc,ReactComponent:(0,bs.lazy)(()=>import("./chunks/GraphGenomeView-TKK67NXR.js"))}))}var ks=y(K(),1),Ie=y(me(),1),er=["MultiWaySyntenyDisplay","LinearSyntenyDisplay","DotplotDisplay","ChordSyntenyDisplay"];function _c(e){let t=e.getElementTypesInGroup("display"),n=o=>t.find(a=>a.name===o),r=o=>o&&Object.assign(Object.create(o),{adapterCapabilities:["headerLanes"]});return[n("LinearGraphDisplay"),n("LinearBasicDisplay"),...er.map(o=>r(n(o)))].filter(o=>o!==void 0)}function tr(e){e.addTrackType(()=>{let t=(0,ks.ConfigurationSchema)("GraphTrack",{},{baseConfiguration:(0,Ie.createBaseTrackConfig)(e),explicitIdentifier:"trackId"}),n=new Ie.TrackType({name:"GraphTrack",displayName:"Pangenome graph track",configSchema:t,stateModel:(0,Ie.createBaseTrackModel)(e,"GraphTrack",t)});for(let r of _c(e))n.addDisplayType(r);return n})}function nr(e){e.addToExtensionPoint("LaunchView-GraphGenomeView",t=>{let{session:n,...r}=t;return n.addView("GraphGenomeView",r),t})}var Vs=y(De(),1),_s=y(Ss(),1);var vs=y(K(),1),Gs=y(Ms(),1),rr=y(oe(),1);function Ls(){return(0,vs.ConfigurationSchema)("LinearGraphDisplay",{layoutMode:{type:"stringEnum",model:rr.types.enumeration("LayoutMode",yt),defaultValue:"auto"},colorScheme:{type:"stringEnum",model:rr.types.enumeration("ColorScheme",wt),defaultValue:"auto"},...(0,Gs.trackHeightConfigSchemaFields)({defaultHeight:300,height:"the height of the track the graph is drawn in"})},{explicitlyTyped:!0,explicitIdentifier:"displayId"})}var Bs=y(De(),1);var ct=y(K(),1),Fs=y(me(),1),Os=y(Cr(),1),ar=y(ie(),1),$s=y(Ts(),1),F=y(oe(),1),Be=y(Ns(),1);var dt=y(ut(),1);var sn=y(ie(),1),Ee=y(oe(),1);function Cs(e){return e instanceof Error&&(e.name==="NodeLimitError"||/reads more than nodeLimit|^Subgraph size limit of \d+ nodes exceeded/.test(e.message))}function Is(e,t){if(e?.refName!==t.refName||e.assemblyName!==t.assemblyName)return!1;let n=e.end-e.start;return t.end-t.start>=n&&t.end>e.start-n&&t.start<e.end+n}var or=class extends Error{constructor(){super("this window is too large to cut, and there is no overview to draw instead: either the haplotype index has none (rebuild it with gbz-haplotype-index 0.3 or later) or the reference has no path by this name. Zoom in to see the graph");this.name="NoOverviewError"}};function Es(){return Ee.types.model({overviewRowsChoice:Ee.types.maybe(Ee.types.boolean)}).volatile(()=>({overview:void 0,overviewRegion:void 0,overviewBpPerPx:0,overviewLoading:!1,overviewError:void 0,overviewPainted:void 0,overviewController:void 0,dense:void 0})).views(e=>({get overviewAllRows(){return e.overviewRowsChoice??!0},get overviewCounts(){return e.overview&&e.overview.bin<=jo?Xo(e.overview):void 0},overviewHolds(t){return e.overview!==void 0&&e.overviewError===void 0&&Ct(e.overviewRegion,t)&&t.bpPerPx>=e.overviewBpPerPx/2&&t.bpPerPx<=e.overviewBpPerPx*2}})).actions(e=>({setOverviewAllRows(t){e.overviewRowsChoice=t},beforeDestroy(){e.overviewController?.abort()},setOverviewPainted(t){e.overviewPainted=t},setDense(t){e.dense=t},forgetOverview(){e.overviewController?.abort(),e.overview=void 0,e.overviewRegion=void 0,e.overviewLoading=!1},fetchOverview:(0,Ee.flow)(function*(t,n,r){e.overviewController?.abort();let o=new AbortController;e.overviewController=o,e.overviewLoading=!0,e.overviewError=void 0;let a=Nt(n,1/0);try{let i=yield(0,sn.getSession)(e).rpcManager.call((0,sn.getRpcSessionId)(e),"GetHaplotypeOverview",{adapterConfig:t,region:a,bpPerPx:n.bpPerPx*2,haplotypes:r,signal:o.signal});o.signal.aborted||(e.overview=i,e.overviewRegion=a,e.overviewBpPerPx=n.bpPerPx,i||(e.overviewError=new or))}catch(i){o.signal.aborted||(console.error("[HaplotypeOverview]",i),e.overviewError=i instanceof Error?i:new Error(String(i)))}finally{e.overviewController===o&&(e.overviewLoading=!1)}})}))}var Wc=(0,Bs.lazy)(()=>import("./chunks/GraphTrackSettingsDialog-RKZ5XIKY.js"));function Ds(e){return F.types.compose("LinearGraphDisplay",Fs.BaseDisplay,(0,$s.default)(),rn(),Es(),F.types.model({type:F.types.literal("LinearGraphDisplay"),configuration:(0,ct.ConfigurationReference)(e),pane:F.types.maybe(F.types.frozen()),cutRegion:F.types.maybe(F.types.frozen()),coarseCut:F.types.optional(F.types.boolean,!1),maxRegionBp:F.types.optional(F.types.number,Qe),subgraphContext:F.types.optional(F.types.number,1),subgraphHaplotypes:F.types.maybe(F.types.frozen())})).preProcessSnapshot(t=>{let{pane:n,...r}=t;if(!n)return t;let{type:o,...a}=n;return{...a,...r}}).volatile(()=>({recuts:0,settledWindow:void 0})).views(t=>({get adapterConfig(){return he(t,t.parentTrack.configuration)},get defaultLayoutMode(){return(0,ct.getConf)(t,"layoutMode")},get defaultColorScheme(){return(0,ct.getConf)(t,"colorScheme")},get drawsGenomicCoordinates(){return t.layoutResult===void 0||t.hostPlacesX},get canvasHeight(){return t.height},get canRetryLoad(){return t.cutRegion!==void 0},get cutHaplotypes(){return this.chosenHaplotypes},get chosenHaplotypes(){return t.subgraphHaplotypes??ls(t.parentTrack.configuration)},get coarseAboveBpPerPx(){let r=t.adapterConfig.coarse?.aboveBpPerPx;return typeof r=="number"?r:void 0}})).views(t=>({tierAt(n){let r=t.coarseAboveBpPerPx;return r!==void 0&&n>r?"coarse":"fine"},capFor(n){return n==="coarse"?1/0:t.maxRegionBp},get cutTier(){return t.coarseCut&&t.coarseAboveBpPerPx!==void 0?"coarse":"fine"}})).views(t=>({get settledCapBp(){let n=t.settledWindow;return n?t.capFor(t.tierAt(n.bpPerPx)):1/0}})).views(t=>({get regionTooLarge(){let n=t.settledWindow;return n!==void 0&&n.end-n.start>t.settledCapBp},get regionTooLargeReason(){let n=t.settledWindow;return n?`Region too large for a graph cut (${be(n.end-n.start)}, max ${be(t.settledCapBp)})`:""},get overviewCapable(){return t.adapterConfig.type==="GbzBaseSyntenyAdapter"},get zoomCanReleaseGate(){return!0},get fetchCanceled(){return t.loadCanceled}})).views(t=>({get showsOverview(){let n=t.settledWindow;return t.overviewCapable&&n!==void 0&&(t.regionTooLarge||Is(t.dense,n))}})).views(t=>({get overviewPhase(){return(0,Be.computeDisplayStatusPhase)({regionTooLarge:!1,error:t.overviewError},()=>(0,Be.computeActivityPhase)({isMinimized:t.isMinimized,fetchInert:!1,viewportEmpty:t.host?.initialized===!0&&t.host.hasVisibleContent===!1,isLoading:t.overviewLoading||!t.overview,fetchCanceled:!1,awaitingDependentData:!1,rendersCanvas:!0,canvasDrawn:t.overview!==void 0&&t.overviewPainted===t.overview},()=>!0,()=>t.host?.effectiveBodyMounted??!0))},get displayPhase(){return t.showsOverview?this.overviewPhase:(0,Be.computeDisplayStatusPhase)({regionTooLarge:t.regionTooLarge,error:t.error??t.renderError},()=>(0,Be.computeActivityPhase)({isMinimized:t.isMinimized,fetchInert:!1,viewportEmpty:t.host?.initialized===!0&&t.host.hasVisibleContent===!1,isLoading:t.isLoading||!t.hasGraph,fetchCanceled:t.loadCanceled,awaitingDependentData:!1,rendersCanvas:!0,canvasDrawn:t.painted&&t.geometryPainted},()=>!0,()=>t.host?.effectiveBodyMounted??!0))}})).actions(t=>({setSubgraphContext(n){t.subgraphContext=n},setSubgraphHaplotypes(n){t.subgraphHaplotypes=n,t.forgetOverview()},setMaxRegionBp(n){t.maxRegionBp=n},cut(){let n=t.settledWindow;if(n&&t.showsOverview)return t.fetchOverview(t.adapterConfig,n,t.chosenHaplotypes);let r=t.cutRegion;if(!r)return;let o=an(on(t.parentTrack.configuration),r.assemblyName);if(o){t.clearGraph(),t.setError(new Error(o));return}let a=t.cutTier==="coarse";return t.cutSubgraph(t.adapterConfig,r,{hops:a?0:t.subgraphContext,haplotypes:t.chosenHaplotypes,tier:a?"coarse":void 0,...V(t.chosenLayoutMode).wholeWalks?{snarls:"overlapping"}:{}})}})).actions(t=>({recutAt(n){let r=t.tierAt(n.bpPerPx);return t.coarseCut=r==="coarse",t.cutRegion=Nt(n,t.capFor(r),V(t.chosenLayoutMode).cutMargins),t.recuts++,t.cut()}})).actions(t=>({settleOn(n){if(t.settledWindow=n,t.showsOverview)return t.overviewHolds(n)||t.fetchOverview(t.adapterConfig,n,t.chosenHaplotypes),!1;let r=V(t.chosenLayoutMode).cutMargins;return t.regionTooLarge||!t.loadCanceled&&t.tierAt(n.bpPerPx)===t.cutTier&&Ct(t.cutRegion,n,r)?!1:(Promise.resolve(t.recutAt(n)).then(()=>{(0,F.isAlive)(t)&&t.overviewCapable&&Cs(t.error)&&this.refuseDenseCut(n)}),!0)},refuseDenseCut(n){t.setDense(n),t.cutRegion=void 0,this.settleOn(t.settledWindow??n)},switchLayout(n){let r=V(t.chosenLayoutMode);t.setLayoutMode(n);let o=V(n),a=t.host?Pt(t.host):void 0;return a&&!t.regionTooLarge&&(o.cutMargins!==r.cutMargins||o.wholeWalks!==r.wholeWalks)?t.recutAt(a):t.recomputeLayout()},retryLoad(){t.cut()},reload(){t.cut()},cancelFetchByUser(){t.stopLoad()}})).actions(t=>({forceLoad(){let n=t.settledWindow;n&&(t.setMaxRegionBp(Math.ceil(n.end-n.start)),t.settleOn(n))},afterAttach(){t.cutRegion&&!t.graph&&t.cut(),(0,F.addDisposer)(t,(0,dt.reaction)(()=>t.hostPlacesX,n=>{n||t.releaseHost()},{name:"GraphHostPlacesX"})),(0,F.addDisposer)(t,(0,dt.reaction)(()=>t.hostFrame,n=>{n&&t.hostTransform(n.scale,n.translateX)},{equals:(n,r)=>n?.scale===r?.scale&&n?.translateX===r?.translateX,fireImmediately:!0,name:"GraphHostFrame"})),(0,F.addDisposer)(t,(0,dt.reaction)(()=>`${t.facet.field} ${t.facetPlacement?.count}`,()=>{let n=t.facetGridIn(t.paneCeiling)?.total??0;(t.facetGrid?.total??0)>t.height&&t.setHeight(Math.max(t.height,Math.ceil(n)))},{name:"GraphFacetHeight"})),(0,F.addDisposer)(t,(0,dt.reaction)(()=>t.host?.coarseDynamicBlocks,n=>{let{host:r}=t,o=n&&r?Pt(r):void 0;o&&t.settleOn(o)},{fireImmediately:!0,name:"GraphHostSettle"}))}})).views(t=>({get graphViewSpec(){let n=t.host?Pt(t.host):void 0,r=t.sourceTrackId;if(!n||!r||!t.hasGraph||t.coarseCut||t.regionTooLarge)return;let o=Math.floor(n.start),a=Math.ceil(n.end);return{loadedTrackId:r,loadedRegion:{refName:n.refName,assemblyName:n.assemblyName,start:o,end:a},subgraphContext:t.subgraphContext,subgraphHaplotypes:t.chosenHaplotypes,maxRegionBp:Math.max(t.maxRegionBp,a-o),layoutMode:t.chosenLayoutMode,colorScheme:t.chosenColorScheme,referencePath:t.referencePath,geneTrackId:t.geneTrackId,showGenes:t.showGenes,showBubbles:t.showBubbles,showDeletionEdges:t.showDeletionEdges,walkLayers:t.walkLayers,facet:(0,F.getSnapshot)(t.facet)}}})).actions(t=>({openGraphView(){let n=t.graphViewSpec;n&&(0,ar.getSession)(t).addView("GraphGenomeView",n)}})).views(t=>({trackMenuItems(){let n=t.launchMenuItems();return(0,Os.pushLaunchViewMenuItem)(n,{label:"Graph genome view",icon:Ft,disabled:!t.graphViewSpec,disabledHelpText:"Zoom in until the track cuts a graph",onClick:()=>{t.openGraphView()}}),[...t.graphMenuItems(),...t.overviewCapable?[{label:"Zoomed out: every haplotype",subLabel:"Off draws only the lanes the track names",type:"checkbox",checked:t.overviewAllRows,onClick:()=>{t.setOverviewAllRows(!t.overviewAllRows)}}]:[],{label:"Settings",icon:Ho,onClick:()=>{(0,ar.getSession)(t).queueDialog(r=>[Wc,{model:t,open:!0,onClose:r}])}},...n]}}))}function ir(e){e.addDisplayType(()=>{let t=Ls();return Object.assign(new _s.default({name:"LinearGraphDisplay",displayName:"Graph",configSchema:t,stateModel:Ds(t),trackType:["GraphTrack","FeatureTrack","SyntenyTrack"],viewType:"LinearGenomeView",ReactComponent:(0,Vs.lazy)(()=>import("./chunks/LinearGraphDisplay-I2DJRM36.js"))}),{adapterCapabilities:["getSubgraph"]})})}var js=y(Ot(),1);var sr=y(K(),1),Ws=y(oe(),1);function dr(e){let{uri:t,baseUri:n,csi:r}=e;return typeof t=="string"?{...e,bubblesLocation:{uri:t,baseUri:n},index:{indexType:r?"CSI":"TBI",location:{uri:`${t}.${r?"csi":"tbi"}`,baseUri:n}}}:e}var Hc=(0,sr.ConfigurationSchema)("MinigraphBubbleAdapter",{bubblesLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.bb.bed.gz",locationType:"UriLocation"}},index:(0,sr.ConfigurationSchema)("MinigraphBubbleIndex",{indexType:{model:Ws.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.bb.bed.gz.tbi",locationType:"UriLocation"}}}),assemblyNameToPanSN:{type:"frozen",defaultValue:{}}},{explicitlyTyped:!0,preProcessSnapshot:dr}),Hs=Hc;function cr(e){e.addAdapterType(()=>new js.default({name:"MinigraphBubbleAdapter",displayName:"Minigraph bubble BED adapter",normalizeSnapshot:dr,configSchema:Hs,adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/MinigraphBubbleAdapter-CZYQROL2.js").then(t=>t.default)}))}var Ks=y(Ot(),1);var cn=y(K(),1),Ys=y(oe(),1);function Xs(e,t,n){return{indexType:n?"CSI":"TBI",location:{uri:`${e}.${n?"csi":"tbi"}`,baseUri:t}}}function zs(e){let{uri:t,baseUri:n,csi:r}=e;return typeof t=="string"?{...e,segmentsLocation:{uri:`${t}.segs.bed.gz`,baseUri:n},segmentsIndex:Xs(`${t}.segs.bed.gz`,n,r),linksLocation:{uri:`${t}.links.bed.gz`,baseUri:n},linksIndex:Xs(`${t}.links.bed.gz`,n,r)}:e}function pr(e){let{coarse:t,baseUri:n}=e;return zs(typeof t=="object"&&t!==null?{...e,coarse:zs({baseUri:n,...t})}:e)}var dn=(e,t)=>(0,cn.ConfigurationSchema)(e,{indexType:{model:Ys.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:t,locationType:"UriLocation"}}}),jc=(0,cn.ConfigurationSchema)("RgfaTabixCoarseTier",{aboveBpPerPx:{type:"maybeNumber"},segmentsLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.tier.segs.bed.gz",locationType:"UriLocation"}},segmentsIndex:dn("RgfaCoarseSegmentsIndex","/path/to/graph.tier.segs.bed.gz.tbi"),linksLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.tier.links.bed.gz",locationType:"UriLocation"}},linksIndex:dn("RgfaCoarseLinksIndex","/path/to/graph.tier.links.bed.gz.tbi")}),Xc=(0,cn.ConfigurationSchema)("RgfaTabixAdapter",{segmentsLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.segs.bed.gz",locationType:"UriLocation"}},segmentsIndex:dn("RgfaSegmentsIndex","/path/to/graph.segs.bed.gz.tbi"),linksLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.links.bed.gz",locationType:"UriLocation"}},linksIndex:dn("RgfaLinksIndex","/path/to/graph.links.bed.gz.tbi"),assemblyNameToPanSN:{type:"frozen",defaultValue:{}},coarse:jc},{explicitlyTyped:!0,preProcessSnapshot:pr}),Us=Xc;function ur(e){e.addAdapterType(()=>new Ks.default({name:"RgfaTabixAdapter",displayName:"Indexed rGFA adapter",normalizeSnapshot:pr,configSchema:Us,adapterCapabilities:["getSubgraph"],adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/RgfaTabixAdapter-LQGQXCVO.js").then(t=>t.default)}))}var zc=new Set(["RgfaTabixAdapter","GbzBaseSyntenyAdapter"]);function Yc(e){return Tr(e).toLowerCase().endsWith(".gbz.db")}function Uc(e){let t=e.adapter;return t?.type==="GbzBaseSyntenyAdapter"&&!t.assemblyNames?.length&&Array.isArray(e.assemblyNames)&&e.assemblyNames.length>0?{...e,adapter:{...t,assemblyNames:e.assemblyNames}}:e}function Kc(e,t,n){if((!n||n==="GbzBaseSyntenyAdapter")&&Yc(e))return{type:"GbzBaseSyntenyAdapter",gbzDbLocation:e,...t?{haplotypeIndexLocation:t}:{}};if((!n||n==="RgfaTabixAdapter")&&Pr(e))return Nr({choice:"RgfaTabixAdapter",loc:e,indexLoc:t,assembly:"",sample:""})}function mr(e){e.addToExtensionPoint("Core-preProcessTrackConfig",Uc),e.addToExtensionPoint("Core-guessAdapterForLocation",t=>(n,r,o)=>Kc(n,r,o)??t(n,r,o)),e.addToExtensionPoint("Core-guessTrackTypeForLocation",t=>(n,r)=>zc.has(n)?"GraphTrack":t(n,r))}var Qs=y(ie(),1),ed=y(gd(),1),lr=y(ld(),1),td=y(fd(),1);function qs(e){let t;if(te(e)){let{refName:n,start:r,end:o,assemblyName:a}=e;typeof n=="string"&&typeof r=="number"&&typeof o=="number"&&(t={refName:n,start:r,end:o,assemblyName:typeof a=="string"?a:void 0})}return t}function qc(e,t,n){let r=e.connectedViewId;return r===void 0||r===t||!n.has(r)}function Js(e,t){return e.assemblyName===void 0||t===void 0||t.includes(e.assemblyName)}function Jc(e){return(Array.isArray(e.tracks)?e.tracks:[]).flatMap(n=>te(n)&&Array.isArray(n.displays)?n.displays.filter(r=>te(r)&&r.type==="LinearGraphDisplay"):[])}function Zs(e,t,n){let r=[],o=ot(e),a=new Set(o.map(i=>te(i)?i.id:void 0));for(let i of o){if(te(i)&&i.id===t)for(let s of Jc(i)){let d=qs(s.hoverHighlight);d&&Js(d,n)&&r.push({key:typeof s.id=="string"?s.id:"graph-track",region:d})}if(te(i)&&i.type==="GraphGenomeView"&&qc(i,t,a)){let s=qs(i.hoverHighlight);s&&Js(s,n)&&r.push({key:typeof i.id=="string"?i.id:"graph",region:s})}}return r}var Fe=y($e(),1),Zc=(0,td.makeStyles)()(e=>({highlight:{height:"100%",position:"absolute",background:(0,ed.alpha)(e.palette.primary.main,.25),borderLeft:`2px solid ${e.palette.primary.main}`,borderRight:`2px solid ${e.palette.primary.main}`,pointerEvents:"none",zIndex:10}})),Qc=(0,lr.observer)(function({model:t,region:n}){let{classes:r}=Zc(),o=t.getHighlightCoords(n);return o?(0,Fe.jsx)("div",{"data-testid":"graph-node-highlight",className:r.highlight,style:{left:o.left,width:o.width}}):null}),ep=(0,lr.observer)(function({model:t}){let{views:n}=(0,Qs.getSession)(t);return(0,Fe.jsx)(Fe.Fragment,{children:Zs([...n],t.id,t.assemblyNames).map(({key:r,region:o})=>(0,Fe.jsx)(Qc,{model:t,region:o},`graph-hover-${r}`))})}),nd=ep;var rd=y($e(),1),tp="LinearGenomeView-TracksContainerComponent";function gr(e){e.contributeToExtensionPoint(tp,({model:t})=>(0,rd.jsx)(nd,{model:t},"graphgenomeview-hover-highlight"))}var od=y(me(),1);function np(e){return e.views(t=>({get adapterConfig(){return he(t,t.parentTrack.configuration)}}))}function hr(e){e.addToExtensionPoint("Core-extendPluggableElement",t=>(t instanceof od.DisplayType&&er.includes(t.name)&&t.extendStateModel(np),t))}var ad="GraphGenomeView";var id="5.1.0";var fr=class extends sd.default{constructor(){super(...arguments);this.name=ad;this.version=id}install(n){Qn(n),ir(n),tr(n),nr(n),gr(n),ur(n),cr(n),Mn(n),vn(n),mr(n),hr(n),n.addRpcMethod(()=>new Ue(n)),n.addRpcMethod(()=>new Ye(n)),n.addRpcMethod(()=>new Xe(n)),n.addRpcMethod(()=>new ze(n))}configure(n){try{(0,dd.isAbstractMenuManager)(n.rootModel)&&n.rootModel.appendToSubMenu(["Add"],{label:"Graph genome view",icon:Ft,onClick:r=>{r.addView("GraphGenomeView",{})}})}catch(r){console.warn("[GraphGenomeView] could not add the Add menu entry",r)}}};export{fr as default};
|
|
5
|
+
`)&&(e.hoveredRowWalks=t)},setHoveredBubble(t){e.hoveredBubble=t},setPointerInPane(t){e.pointerInPane=t},setWalkStrip(t){e.walkStrip=t,e.stripHover=null},setStripHover(t){e.stripHover=t;let n=e.walkStripRows,r=e.walkStripFrame,o=t&&n?[n.reference,...n.rows].find(i=>i.name===t.row):void 0,a=o&&r&&e.graph?uo(e.graph,o,t.offset,r.scaleX):void 0;e.hoveredNode=a??null},setLegendSize(t){e.legendSize=t},setHoveredEdge(t){e.hoveredEdge=t},setSelectedNode(t){e.selectedNode=t},setDraggingNode(t){e.draggingNode=t},setPanning(t){e.isPanning=t},stopDragging(){e.draggingNode=null,e.isPanning=!1},clearInteractionState(){e.hoveredNode=null,e.hoveredBubble=null,e.hoveredEdge=null,e.selectedNode=null,e.draggingNode=null,e.isPanning=!1},showNodeDetails(t){let n=e.nodeById?.get(t),r=e.nodeById,o=e.nodeNeighbors;if(n&&r&&o){let a=(0,nt.getSession)(e),i=e.graphRegion,s=i?Me({nodeId:t,nodeById:r,neighbors:o}):void 0;(0,nt.isSessionModelWithWidgets)(a)&&a.showWidget(a.addWidget("BaseFeatureWidget","baseFeature",{featureData:{id:n.id,name:n.name,length:n.length,depth:n.depth,rank:n.stable?.rank,stableName:n.stable?.refName,contributingAssembly:$e(n)?.sample,contributingHaplotype:$e(n)?.haplotype,sampleCount:n.samples?.length,samples:n.samples,...i&&s?{refName:i.refName,assemblyName:i.assemblyName,start:s.start,end:s.end}:{}}}))}},setTransform(t,n,r){let{host:o}=e;e.viewportOwner==="host"&&o?o.horizontalScroll(e.translateX-n):(e.viewportOwner="user",e.scale=Xe(t),e.translateX=n),e.translateY=r},zoom(t,n,r){let{host:o}=e;if(e.viewportOwner==="host"&&o){o.zoomTo(o.bpPerPx/t,n);return}e.viewportOwner="user";let a=Na(e,t,n,r,e.pixelRows);e.scale=a.scale,e.translateX=a.translateX,e.translateY=a.translateY},setViewportDirty(){e.viewportRebuildPending=!1,e.viewportDirty++},setPositionsDirty(){e.positionsVersion++},zoomToFit(){if(e.viewportOwner==="host"){let n=e.layoutBounds,r=e.facetGrid!==void 0,o=r?12:$,a=r?12:e.fitPadTop,i=e.viewBox.height-a-o;n&&i>0&&(e.translateY=Ln(n,i,e.scaleY,a));return}let t=e.fittedTransform;t&&(e.scale=t.scale,e.translateX=t.translateX,e.translateY=t.translateY)},clearPerfMetrics(){e.lastFetchMs=void 0,e.lastLayoutMs=void 0,e.lastGeometryMs=void 0,e.lastGeometryStrokeCount=void 0,e.builtViewport=void 0}})).actions(e=>({hostTransform(t,n){let r=e.viewportOwner!=="host";r&&(e.viewportOwner="host"),e.scale=t,e.translateX=n,r&&e.zoomToFit()},refitView(){e.viewportOwner==="user"&&(e.viewportOwner="fit"),e.zoomToFit()},releaseHost(){e.viewportOwner==="host"&&(e.xIsReferenceBp?e.viewportOwner="user":(e.viewportOwner="fit",e.zoomToFit()))}})).actions(e=>{function t(){clearTimeout(e.viewportDirtyTimer),e.viewportRebuildPending=!0,e.viewportDirtyTimer=setTimeout(()=>{(0,Un.isAlive)(e)&&e.setViewportDirty()},ja)}function n(){cancelAnimationFrame(e.positionsDirtyFrame),e.positionsDirtyFrame=requestAnimationFrame(()=>{(0,Un.isAlive)(e)&&e.setPositionsDirty()})}return{moveNode(r,o,a){let i=e.layoutResult?.nodePositions;if(i?.[r]){for(let s of i[r])s.x+=o,s.y+=a;n()}},scheduleViewportDirty:t}});var Qi=qi.actions(e=>{let t;function n(l){let{rpcManager:b}=(0,ee.getSession)(e);return b.call((0,ee.getRpcSessionId)(e),"GraphComputeLayout",{...l,signal:t?.signal,statusCallback:L=>{e.setStatusMessage((0,ee.statusMessageText)(L)??"")}})}function r(l){return Ra(l,{quality:e.layoutQuality,linearLayout:e.linearLayout,bubbleSpread:e.bubbleSpread})}function*o(l){let b=performance.now(),L=Ne.has(e.chosenLayoutMode),f=e.graphRegion,G=L&&f?Za(l,f):l,S=L&&e.tubeMapFold>0&&!G.reads?ei(G,e.tubeMapFold):void 0,N=_(e.chosenLayoutMode).run(S?.graph??G,e.graphRegion,e.host?e.layoutResult?.sampleRows:void 0);if(N)return{result:S&&N.tubeMap?{...N,tubeMap:{...N.tubeMap,coarse:S}}:N,duration:performance.now()-b};let v=Ya(l),C=r(l),O=v.get(C);if(O)return{result:O,duration:performance.now()-b};let E=yield Ma(l,{quality:e.layoutQuality,linearLayout:e.linearLayout,bubbleSpread:e.bubbleSpread},n);return Ka(v,C,E.result),E}let a=0,i=new Map;function*s(l){let b=++a,L=()=>e.graph===l&&b===a,f=t?.signal,G;try{G=yield*o(l)}catch(N){if(!L()||f?.aborted)return!1;throw N}let S=L();return S&&(e.layoutResult=G.result,e.setLayoutMs(G.duration)),S}function d(l,b){let L=l.anchorPaths;return l.anchoredBy==="paths"&&L?(Lr(l,e.assemblySpellings(b.assemblyName))??Ir(L,b.assemblyName))?.name:void 0}function*c(l,b,L,f=!1,G){let S=t?.signal;e.setStatusMessage("Parsing GFA");let N=Sa(l,b,{referencePath:e.referencePath||L?.assemblyName,maxNodes:e.maxGraphNodes}),v=L?d(N,L):void 0,C=!e.referencePath&&v!==void 0&&v!==N.referencePath?ct(N,v):N;if(G){e.setStatusMessage("Reading alignments");try{let{records:E,total:q}=yield G(C);C.reads=E,e.readsShown={shown:E.length,total:q}}catch(E){if(S?.aborted)return;console.warn("[GraphGenomeView] no reads for this graph",E),e.readsShown=void 0}if(S?.aborted)return}else e.readsShown=void 0;let O=f?e.selectedNode:null;e.graph=C,e.graphRegion=L,e.loadedReferencePath=v,e.indexBubbles=void 0,e.geneTrackFeatures=void 0,e.walkGeneFeatures=void 0,i.clear(),e.repeatArrays=void 0,e.popStack=[],e.clearInteractionState(),O!==null&&e.nodeById?.has(O)&&(e.selectedNode=O),e.setStatusMessage("Computing layout"),yield*s(C)}let m=0;function g(){let l=++m;return t?.abort(),t=new AbortController,e.loadCanceled=!1,{isLive:()=>l===m,signal:t.signal}}function*p(l,b,L){let f=Oa(l);if(!(l.type!=="RgfaTabixAdapter"||f===void 0))try{let G=yield(0,ee.getSession)(e).rpcManager.call((0,ee.getRpcSessionId)(e),"CoreGetFeatures",{adapterConfig:{type:"MinigraphBubbleAdapter",uri:`${f}.bubbles.bed.gz`,baseUri:l.baseUri,assemblyNameToPanSN:l.assemblyNameToPanSN},regions:[b]});L()&&(e.indexBubbles=G.map(S=>({refName:b.refName,start:S.get("start"),end:S.get("end"),segmentCount:S.get("segmentCount"),pathCount:S.get("pathCount")??0,inversion:S.get("inversion"),shortestAlleleLength:S.get("shortestAlleleLength"),longestAlleleLength:S.get("longestAlleleLength"),segments:S.get("segments"),shortestAllele:void 0,longestAllele:void 0})))}catch(G){console.warn("[GraphGenomeView] no bubble index for this graph",G)}}function*u(l,b,L){let f=(0,ee.getSession)(e),G=l?f.tracks.find(S=>S.trackId===l):void 0;if(G)try{return yield f.rpcManager.call((0,ee.getRpcSessionId)(e),"CoreGetFeatures",{adapterConfig:(0,Ji.readConfObject)(G,"adapter"),regions:[b]})}catch(S){console.warn(`[GraphGenomeView] no ${L} for this graph`,S);return}}function*y(l,b){let L=yield*u(e.geneTrack?.trackId,l,"genes");L&&b()&&(e.geneTrackFeatures=L)}function*x(l,b){let L=yield*u(e.repeatTrack?.trackId,l,"repeats");L&&b()&&(e.repeatArrays=Ei(L))}function*k(l,b,L){let{isLive:f,signal:G}=g();e.isLoading=!0,e.error=void 0;try{let S=typeof b=="string"?b:yield b(G);f()&&(yield*c(S,l,L))}catch(S){f()&&(console.error("[GraphGenomeView.loadWholeGFA]",S),e.error=S)}finally{f()&&e.finishLoading()}return f()}function h(){t?.abort(),t=void 0,m++,a++}function R(){h(),e.graph=void 0,e.graphRegion=void 0,e.loadedReferencePath=void 0,e.layoutResult=void 0,e.indexBubbles=void 0,e.geneTrackFeatures=void 0,e.walkGeneFeatures=void 0,i.clear(),e.repeatArrays=void 0,e.readsShown=void 0,e.popStack=[],e.error=void 0,e.isLoading=!1,e.loadCanceled=!1,e.statusMessage="",e.clearInteractionState(),e.clearPerfMetrics()}return{clearGraph(){R()},cancelLoad(){e.canCancelLoad&&(R(),e.loadCanceled=!0)},stopLoad(){h(),e.isLoading=!1,e.statusMessage="",e.loadCanceled=!0},beforeDestroy(){h()},loadGFA:(0,K.flow)(function*(l,b="Imported GFA"){yield*k(b,l)}),loadGFAFromLocation:(0,K.flow)(function*(l,b){e.setStatusMessage("Fetching GFA");let L=yield*k("uri"in l?l.uri.split("/").pop()??"GFA":"GFA",f=>(0,Zi.openLocation)(l).readFile({encoding:"utf8",signal:f}),b);b&&L&&e.graph&&(yield*x(b,()=>e.graphRegion===b))}),cutSubgraph:(0,K.flow)(function*(l,b,L={}){let{isLive:f,signal:G}=g();e.isLoading=!0,e.error=void 0,e.setStatusMessage("Fetching subgraph");try{let S=performance.now(),N=yield(0,ee.getSession)(e).rpcManager.call((0,ee.getRpcSessionId)(e),"GetSubgraph",{adapterConfig:l,region:b,opts:L,signal:G});if(!f())return;if(e.setFetchMs(performance.now()-S),!N)throw new Error("Adapter returned no GFA \u2014 region may be outside indexed data or the adapter does not implement getSubgraph");if(yield*c(N,Ve(b),b,!0,ea(l)?v=>(0,ee.getSession)(e).rpcManager.call((0,ee.getRpcSessionId)(e),"GetGraphReads",{adapterConfig:l,nodeNames:v.nodes.map(C=>C.name),signal:G}):void 0),!f())return;e.setStatusMessage("Reading annotations"),yield Promise.all([L.tier==="coarse"?void 0:(0,K.flow)(p)(l,b,f),(0,K.flow)(y)(b,f),(0,K.flow)(x)(b,f)])}catch(S){f()&&(console.error("[GraphGenomeView.cutSubgraph]",S),e.error=S)}finally{f()&&e.finishLoading()}}),reloadRepeats:(0,K.flow)(function*(){let l=e.graphRegion,b=e.repeatTrack?.trackId;l&&(yield*x(l,()=>e.graphRegion===l&&e.repeatTrack?.trackId===b))}),loadWalkGenes:(0,K.flow)(function*(){let l=e.walkGeneReads?.reads??[],b=JSON.stringify(l),L=e.graph,f=new Map;yield Promise.all(l.map(({row:G,trackId:S,region:N})=>(0,K.flow)(function*(){let v=`${S} ${N.refName}:${N.start}-${N.end}`,C=i.get(v);if(!C){let O=yield*u(S,N,"haplotype genes");if(!O)return;C=Xt(O).map(E=>({...E,refName:N.refName})),i.set(v,C)}f.set(G,C)})())),(0,K.isAlive)(e)&&e.graph===L&&JSON.stringify(e.walkGeneReads?.reads??[])===b&&(e.walkGeneFeatures=l.length?f:void 0)}),reloadGenes:(0,K.flow)(function*(){i.clear();let l=e.graphRegion,b=e.geneTrack?.trackId;l&&(yield*y(l,()=>e.graphRegion===l&&e.geneTrack?.trackId===b))}),popBubble:(0,K.flow)(function*(l){let b=e.graph;if(!b)return;let L=Ja(b,Mt(l));if(L.nodes.length===0){(0,ee.getSession)(e).notify("None of the segments of this bubble are in the cut; widen the graph context to open it","info");return}let{isLive:f}=g();e.popStack=[...e.popStack,{graph:b,layoutMode:e.chosenLayoutMode,label:b.name,indexBubbles:e.indexBubbles}],e.indexBubbles=void 0;let G=`${io[Rt(l,e.repeatArrays).kind]} at ${l.refName}:${l.start.toLocaleString()}`;e.graph={...L,name:G},e.clearInteractionState(),e.viewportOwner="fit",e.isLoading=!0;try{(yield*s(e.graph))&&e.finishLoading()}catch(S){f()&&(e.error=S,e.finishLoading())}}),unpopBubble:(0,K.flow)(function*(){let l=e.poppedFrom;if(l){e.popStack=e.popStack.slice(0,-1),e.graph=l.graph,e.layoutMode=l.layoutMode,e.indexBubbles=l.indexBubbles,e.clearInteractionState(),e.viewportOwner="fit",e.isLoading=!0;try{(yield*s(l.graph))&&e.finishLoading()}catch(b){e.error=b,e.finishLoading()}}}),recomputeLayout:(0,K.flow)(function*(){let l=e.graph;if(l){e.isLoading=!0,e.setStatusMessage("Computing layout");try{(yield*s(l))&&e.finishLoading()}catch(b){console.error("[GraphGenomeView.recomputeLayout]",b),e.error=b,e.finishLoading()}}})}});function Tc(e){return Q(e)&&typeof e.get=="function"}function Ac(e){let t=Tc(e)?e.get("name"):Q(e)?e.name:void 0;return typeof t=="string"?t:void 0}function es(e){let t;if(Q(e)&&Q(e.hoverPosition)){let{refName:n,coord:r,coord0:o,assemblyName:a}=e.hoverPosition;typeof n=="string"&&typeof r=="number"&&(t={refName:n,coord:typeof o=="number"?o:r-1,assemblyName:typeof a=="string"?a:void 0,featureName:Ac(e.hoverFeature)})}return t}function ts(e,t){return(e.assemblyName===void 0||e.assemblyName===t.assemblyName)&&e.refName===t.refName&&e.coord>=t.start&&e.coord<t.end}function ns({hover:e,nodes:t}){let n,r;for(let o of t)o.name===e.featureName?n=o.id:r===void 0&&D(o)&&e.coord>=o.stable.start&&e.coord<o.stable.start+o.length&&(r=o.id);return n??r??null}var Nc=/^(.+) HP(\d+)$/,Pc=/^(.+)\.(\d+)$/;function vc(e){let t=Nc.exec(e),n=Pc.exec(e);return[...t?[{sample:t[1],haplotype:String(Number(t[2])+1)}]:[],...n?[{sample:n[1],haplotype:n[2]}]:[],{sample:e,haplotype:void 0}]}function Cc(e){return Z(e).name.split("#")[1]}function rs(e,t){let n=t.map(r=>r.name);for(let{sample:r,haplotype:o}of vc(e)){let a=n.filter(i=>hr(Z(i).name)===r&&(o===void 0||Cc(i)===o));if(a.length>0)return a}return[]}var as=Qi.actions(e=>({startRenderingBackend(t){if(!e.autorunsInstalled){(0,me.addDisposer)(e,(0,W.autorun)(()=>{e.fittedTransform&&(0,W.untracked)(()=>e.viewportOwner==="fit")&&e.zoomToFit()})),(0,me.addDisposer)(e,(0,W.reaction)(()=>{let r=e.facetGrid;return r?`${e.facet.field} ${e.facetPanels?.length} ${r.columns}`:""},()=>{e.refitView()})),(0,me.addDisposer)(e,(0,W.reaction)(()=>({graph:e.graph,reads:JSON.stringify(e.walkGeneReads?.reads??[])}),()=>{e.loadWalkGenes()},{fireImmediately:!0,equals:(r,o)=>r.graph===o.graph&&r.reads===o.reads})),(0,me.addDisposer)(e,(0,W.reaction)(()=>e.fitPadTop,()=>{e.viewportOwner==="host"&&e.zoomToFit()})),(0,me.addDisposer)(e,(0,W.autorun)(()=>{let r=es((0,os.getSession)(e).hovered);(0,W.untracked)(()=>{let o=e.graphRegion,a=e.graph,i=r&&o&&ts(r,o)?r:void 0,s=i?.featureName&&a?.paths?rs(i.featureName,a.paths):[];o&&a&&!e.pointerInPane&&e.setHoveredNode(i&&s.length===0?ns({hover:i,nodes:a.nodes}):null),e.setHoveredRowWalks(s)})})),(0,me.addDisposer)(e,(0,W.reaction)(()=>`${e.scale}-${e.translateX}-${e.translateY}`,()=>{e.setHoveredNode(null),e.setHoveredBubble(null),e.setHoveredEdge(null)},{name:"GraphClearHoverOnViewportChange"}));let n=!0;(0,me.addDisposer)(e,(0,W.autorun)(()=>{let{scale:r}=e,o=Ue(e);if(n){n=!1;return}let a=(0,W.untracked)(()=>e.builtViewport);a?.scale===r&&Aa(a.bounds,o)||e.scheduleViewportDirty()})),(0,me.addDisposer)(e,(0,W.autorun)(()=>{let r=e.currentRenderingBackend;ue(e.geometryVersion),r&&(e.applyHighlights(r),e.renderNow())}))}e.attachRenderingBackend(t,()=>({upload:n=>{if(n.resize(e.paneWidth,e.canvasHeight),e.layoutResult?.tubeMap)return ue(e.viewportDirty),n.uploadGeometry(vn),e.setGeometryMetrics(0,0,{scale:(0,W.untracked)(()=>e.scale),bounds:(0,W.untracked)(()=>Ue(e))}),!0;if(e.facetPanels)return ue(e.viewportDirty),n.uploadGeometry(vn),e.setGeometryMetrics(0,0,{scale:(0,W.untracked)(()=>e.scale),bounds:(0,W.untracked)(()=>e.viewportToBuild())}),!0;let r=performance.now(),o=e.buildDrawing(e.walkLift,e.effectiveDrawPaths);return o?(n.uploadGeometry(o.batch),e.setGeometryMetrics(performance.now()-r,o.batch.nodeStrokes.length,{scale:(0,W.untracked)(()=>e.scale),bounds:o.viewportBounds}),!0):!1},render:n=>e.nodePositions?(e.paint(n),e.markPainted(),!0):!1,releaseTargets:n=>{n.releaseOffscreenTargets()}}))}})).actions(e=>({switchLayout(t){return e.setLayoutMode(t),e.recomputeLayout()},retryLoad(){},afterAttach(){e.isDefaultViewport||(e.viewportOwner="user")}}));var Kt=w(U(),1),Ic="FeatureTrack";function is({session:e,assemblyName:t,first:n}){let r=[];for(let o of e.tracks){let a=(0,Kt.readConfObject)(o,"type"),i=(0,Kt.readConfObject)(o,"assemblyNames"),s=(0,Kt.readConfObject)(o,"trackId");a===Ic&&Array.isArray(i)&&i.includes(t)&&typeof s=="string"&&s!==n&&r.push(s)}return n?[n,...r]:r}var qt=w(U(),1),ss=w(md(),1),Jt=w(re(),1);var Bc="SyntenyTrack",Ec="Synteny adapters";function Fc(e){if((0,qt.readConfObject)(e,"type")===Bc)return!0;let t=e.adapter?.type;if(typeof t!="string"||!(0,Jt.isStateTreeNode)(e))return!1;let{pluginManager:n}=(0,Jt.getEnv)(e);return!!n?.hasAdapterType(t)&&n.getAdapterType(t).adapterMetadata?.category===Ec}function ds(e,t){let n=new Set(t),r=[];for(let o of e.tracks){let a=(0,qt.readConfObject)(o,"assemblyNames"),i=(0,qt.readConfObject)(o,"trackId");if(Fc(o)&&typeof i=="string"&&Array.isArray(a)){let s=a.filter(d=>typeof d=="string"&&n.has(tt(e,d))).length;s>=2&&r.push({trackId:i,name:(0,ss.getTrackName)(o,e),coverage:s})}}return r.sort((o,a)=>a.coverage-o.coverage)}function cs(e,t,n="image/svg+xml"){let r=URL.createObjectURL(new Blob([e],{type:n})),o=document.createElement("a");o.href=r,o.download=t,o.click(),setTimeout(()=>{URL.revokeObjectURL(r)},0)}var us=as.actions(e=>({showInLinearView(t){let n=(0,Se.getSession)(e),r=t.assembly===e.graphRegion?.assemblyName,o=Wi({session:n,location:t.location,assembly:t.assembly,connectedViewId:e.connectedViewId,tracks:is({session:n,assemblyName:t.assembly,first:r?e.sourceTrackId:void 0})});r&&e.pairWithLinearView(o)},highlightInLinearView(t){Oi({session:(0,Se.getSession)(e),location:t.location,assembly:t.assembly,connectedViewId:e.connectedViewId})},showSyntenyView(t){Hi({session:(0,Se.getSession)(e),contributors:e.launchableAssemblies,trackId:t,graphTrackId:e.sourceTrackId})}})).views(e=>({get syntenyLaunchTracks(){let t=e.launchableAssemblies.map(n=>n.sample);return t.length>=2?ds((0,Se.getSession)(e),t):[]}})).views(e=>({graphMenuItems(){let t=e.walkChoices;return[{label:"Layout",subMenu:Hr.map(n=>({type:"radio",label:n.label,checked:e.chosenLayoutMode===n.value,disabled:e.graph?!n.available(e.graph):!1,onClick:()=>{e.switchLayout(n.value)}}))},{label:"Color",subMenu:Xr.map(n=>({type:"radio",label:n.label,checked:e.chosenColorScheme===n.value,onClick:()=>{e.setColorScheme(n.value)}}))},...t.length>0&&e.liftsWalks?[{label:"Walk",subMenu:[{label:"None",onClick:()=>{e.setWalkLayers([])}},...e.walkLayers.length>1&&e.modeDrawsNodes?[{label:"Side by side",subMenu:_a.map(({value:n,label:r})=>({type:"radio",label:r,checked:e.facet.field===n,onClick:()=>{e.setFacet(n)}}))}]:[],...e.facetPanels&&e.facet.field==="walk"&&!e.hostPlacesX?[{label:"Columns",subMenu:[void 0,...e.facetPanels.map((n,r)=>r+1)].map(n=>({type:"radio",label:n===void 0?"Auto":`${n}`,checked:e.facet.columns===n,onClick:()=>{e.setFacetColumns(n)}}))}]:[],...t.length>An?[{label:"Choose walks...",onClick:()=>{(0,Se.getSession)(e).queueDialog(n=>[Va,{model:e,onClose:n}])}}]:[],...(t.length>An?t.filter(n=>e.walkLayers.some(r=>r.walk===n.name)):t).map(n=>({type:"checkbox",label:n.label,checked:e.walkLayers.some(r=>r.walk===n.name),onClick:()=>{e.toggleWalk(n.name)}})),...e.drawnWalks.map(n=>({label:`Colour ${e.walkLabel(n.name)}`,subMenu:[{type:"subHeader",label:"Colour by"},...qr.map(r=>({type:"radio",label:r.label,checked:n.encoding.field===r.value,onClick:()=>{e.setWalkColor(n.name,{field:r.value})}})),{type:"subHeader",label:"Palette"},...Jr.filter(r=>r.value!=="rainbow"||n.encoding.field==="reference").map(r=>({type:"radio",label:r.label,checked:n.encoding.scheme===r.value,onClick:()=>{e.setWalkColor(n.name,{scheme:r.value})}}))]}))]}]:[],...Ne.has(e.chosenLayoutMode)?[{label:"Fold variants",subMenu:Wa.map(({bp:n,label:r})=>({type:"radio",label:r,checked:e.tubeMapFold===n,disabled:n>0&&e.graph?.reads!==void 0,onClick:()=>{e.setTubeMapFold(n),e.recomputeLayout()}}))}]:[],...e.chosenLayoutMode==="walkrows"&&e.repeatChoices.length>0?[{label:"Repeat",subMenu:[{type:"radio",label:"Whole window",checked:e.repeatKey==="",onClick:()=>{e.setRepeatKey("")}},...e.repeatChoices.map(({key:n,name:r,unit:o})=>({type:"radio",label:`${r} \xB7 ${o.toLocaleString()} bp unit`,checked:e.repeatKey===n,onClick:()=>{e.setRepeatKey(n)}}))]}]:[],...e.hostPlacesX?[]:[{label:"Zoom in",onClick:()=>{e.zoom(1.5,e.viewBox.width/2,e.viewBox.height/2)}},{label:"Zoom out",onClick:()=>{e.zoom(1/1.5,e.viewBox.width/2,e.viewBox.height/2)}},{label:"Zoom to fit",onClick:()=>{e.zoomToFit()}}],{type:"checkbox",label:"Mark bubbles",checked:e.showBubbles,onClick:()=>{e.setShowBubbles(!e.showBubbles)}},{type:"checkbox",label:"Show deletion edges",checked:e.showDeletionEdges,onClick:()=>{e.setShowDeletionEdges(!e.showDeletionEdges)}},{type:"checkbox",label:"Genes on the backbone",checked:e.showGenes,onClick:()=>{e.setShowGenes(!e.showGenes)}},...!e.host&&e.modeDrawsNodes&&(e.graph?.paths?.length??0)>1?[{type:"checkbox",label:"Walk rows under the graph",checked:e.walkStrip,onClick:()=>{e.setWalkStrip(!e.walkStrip)}}]:[],...e.referenceStripApplies?[{type:"checkbox",label:"Reference strip at bp",checked:e.showReferenceStrip,onClick:()=>{e.setShowReferenceStrip(!e.showReferenceStrip)}}]:[],{label:"Export SVG",disabled:e.figureUnavailable!==void 0,disabledHelpText:e.figureUnavailable,onClick:()=>{let n=e.figure();n&&cs(n,`${(e.graph?.name??"graph").replaceAll(/[^\w.-]+/g,"_")}.svg`)}},{label:"Copy figure spec",disabled:e.figureSpecUnavailable!==void 0,disabledHelpText:e.figureSpecUnavailable,onClick:()=>{let n=e.figureSpec(),r=(0,Se.getSession)(e);navigator.clipboard.writeText(`${JSON.stringify(n,null,2)}
|
|
6
|
+
`).then(()=>{r.notify("Figure spec copied. Save it as spec.json and run: npx -p @jbrowse/bandage-core bandage-figure spec.json -o figure.svg","info")}).catch(o=>{r.notify(`Could not copy the figure spec: ${String(o)}`)})}}]},launchMenuItems(){let t=[];for(let n of Oo({contributors:e.launchableAssemblies,syntenyTracks:e.syntenyLaunchTracks,onShowLinear:r=>{e.showInLinearView(r)},onShowSynteny:r=>{e.showSyntenyView(r)}}))(0,ps.pushLaunchViewMenuItem)(t,n);return t}}));function Zt(){return us}var Kn=w(U(),1);function ms(e){return Array.isArray(e)&&e.every(t=>typeof t=="string")}function ls(e){let t=(0,Kn.readConfObject)(e,"assemblyNames"),n=ms(t)?t.slice(1):[];return n.length>0?n:void 0}function Qt(e){let t=(0,Kn.readConfObject)(e,"assemblyNames");return ms(t)?t[0]:void 0}function en(e,t){return e===void 0||e===t?void 0:`The graph is cut on its reference, ${e}: open it from a view of ${e}`}function $c(e){return("uri"in e?e.uri.split(/[?#]/)[0]:"localPath"in e?e.localPath:"name"in e?e.name:"").split(/[\\/]/).at(-1)??""}function qn(){return X.types.compose("GraphGenomeView",gs.BaseViewModel,Zt(),X.types.model({type:X.types.literal("GraphGenomeView"),gfaLocation:X.types.maybe(X.types.frozen()),loadedRegion:X.types.maybe(X.types.frozen()),loadedTrackId:X.types.optional(X.types.string,""),subgraphContext:X.types.optional(X.types.number,1),subgraphHaplotypes:X.types.maybe(X.types.frozen()),maxRegionBp:X.types.optional(X.types.number,Ye)})).views(e=>({get rpcSessionId(){return e.id},get paneWidth(){return e.width},get cutHaplotypes(){return e.subgraphHaplotypes},get sourceGfaLocation(){return e.gfaLocation},get sourceTrack(){return e.loadedTrackId?(0,hs.getSession)(e).tracks.find(t=>t.trackId===e.loadedTrackId):void 0},get canRetryLoad(){return e.gfaLocation!==void 0||e.loadedTrackId!==""&&e.loadedRegion!==void 0}})).views(e=>({get hasPendingSource(){return e.canRetryLoad&&!e.graph&&!e.loadCanceled},menuItems(){return e.launchMenuItems()}})).actions(e=>{let t=e.clearGraph;return{clearGraph(){t(),e.gfaLocation=void 0,e.loadedRegion=void 0,e.loadedTrackId=""},load(){let n=e.loadedRegion;if(e.gfaLocation)return e.displayName||e.setDisplayName($c(e.gfaLocation)),e.loadGFAFromLocation(e.gfaLocation,n);if(!e.loadedTrackId||!n)return;let r=e.sourceTrack,o=n.end-n.start,a=r?en(Qt(r),n.assemblyName):void 0;if(!r)e.setError(new Error(`The track this graph was cut from, "${e.loadedTrackId}", is not in this session`));else if(a)e.setError(new Error(a));else if(o>e.maxRegionBp)e.setError(new Error(`Region too large (${ye(o)}) \u2014 zoom in to view graph (max ${ye(e.maxRegionBp)})`));else return e.cutSubgraph(ge(e,r),n,{hops:e.subgraphContext,haplotypes:e.subgraphHaplotypes,...e.cutsWholeWalks?{snarls:"overlapping"}:{}})}}}).actions(e=>({retryLoad(){e.load()},switchLayout(t){let n=e.cutsWholeWalks;return e.setLayoutMode(t),e.loadedTrackId&&e.cutsWholeWalks!==n?e.load():e.recomputeLayout()},afterAttach(){e.graph||e.load(),(0,X.addDisposer)(e,(0,fs.reaction)(()=>e.walkStrip,()=>{e.loadedTrackId&&!_(e.chosenLayoutMode).wholeWalks&&e.load()}))}}))}var Dc=(0,ws.defineLaunchKeys)()({});function Jn(e){e.addViewType(()=>new ys.default({name:"GraphGenomeView",displayName:"Graph genome view",stateModel:qn(),launchKeys:Dc,ReactComponent:(0,bs.lazy)(()=>import("./chunks/GraphGenomeView-AY2FO4P2.js"))}))}var ks=w(U(),1),Ce=w(le(),1),Zn=["MultiWaySyntenyDisplay","LinearSyntenyDisplay","DotplotDisplay","ChordSyntenyDisplay"];function Vc(e){let t=e.getElementTypesInGroup("display"),n=o=>t.find(a=>a.name===o),r=o=>o&&Object.assign(Object.create(o),{adapterCapabilities:["headerLanes"]});return[n("LinearGraphDisplay"),n("LinearBasicDisplay"),...Zn.map(o=>r(n(o)))].filter(o=>o!==void 0)}function Qn(e){e.addTrackType(()=>{let t=(0,ks.ConfigurationSchema)("GraphTrack",{},{baseConfiguration:(0,Ce.createBaseTrackConfig)(e),explicitIdentifier:"trackId"}),n=new Ce.TrackType({name:"GraphTrack",displayName:"Pangenome graph track",configSchema:t,stateModel:(0,Ce.createBaseTrackModel)(e,"GraphTrack",t)});for(let r of Vc(e))n.addDisplayType(r);return n})}function er(e){e.addToExtensionPoint("LaunchView-GraphGenomeView",t=>{let{session:n,...r}=t;return n.addView("GraphGenomeView",r),t})}var Vs=w(Ee(),1),_s=w(Ss(),1);var Ls=w(U(),1),Gs=w(Ms(),1),tr=w(re(),1);function Ts(){return(0,Ls.ConfigurationSchema)("LinearGraphDisplay",{layoutMode:{type:"stringEnum",model:tr.types.enumeration("LayoutMode",gt),defaultValue:"auto"},colorScheme:{type:"stringEnum",model:tr.types.enumeration("ColorScheme",ht),defaultValue:"auto"},...(0,Gs.trackHeightConfigSchemaFields)({defaultHeight:300,height:"the height of the track the graph is drawn in"})},{explicitlyTyped:!0,explicitIdentifier:"displayId"})}var Bs=w(Ee(),1);var ot=w(U(),1),Es=w(le(),1),Fs=w(Pr(),1),nr=w(oe(),1),$s=w(Ns(),1),I=w(re(),1),tn=w(vs(),1);var rt=w(st(),1);function Cs(e){return e instanceof Error&&(e.name==="NodeLimitError"||e.regionTooLarge===!0||/reads more than nodeLimit|^Subgraph size limit of \d+ nodes exceeded/.test(e.message))}function Is(e,t){if(e?.refName!==t.refName||e.assemblyName!==t.assemblyName)return!1;let n=e.end-e.start;return t.end-t.start>=n&&t.end>e.start-n&&t.start<e.end+n}var _c=(0,Bs.lazy)(()=>import("./chunks/GraphTrackSettingsDialog-QJXPMWYG.js"));function Ds(e){return I.types.compose("LinearGraphDisplay",Es.BaseDisplay,(0,$s.default)(),Zt(),I.types.model({type:I.types.literal("LinearGraphDisplay"),configuration:(0,ot.ConfigurationReference)(e),pane:I.types.maybe(I.types.frozen()),overviewRowsChoice:I.types.maybe(I.types.frozen()),overviewRowOrder:I.types.maybe(I.types.frozen()),cutRegion:I.types.maybe(I.types.frozen()),coarseCut:I.types.optional(I.types.boolean,!1),maxRegionBp:I.types.optional(I.types.number,Ye),subgraphContext:I.types.optional(I.types.number,1),subgraphHaplotypes:I.types.maybe(I.types.frozen())})).preProcessSnapshot(t=>{let{pane:n,overviewRowsChoice:r,overviewRowOrder:o,...a}=t;if(!n)return a;let{type:i,...s}=n;return{...s,...a}}).volatile(()=>({recuts:0,settledWindow:void 0,dense:void 0})).views(t=>({get adapterConfig(){return ge(t,t.parentTrack.configuration)},get defaultLayoutMode(){return(0,ot.getConf)(t,"layoutMode")},get defaultColorScheme(){return(0,ot.getConf)(t,"colorScheme")},get drawsGenomicCoordinates(){return t.layoutResult===void 0||t.hostPlacesX},get canvasHeight(){return t.height},get canRetryLoad(){return t.cutRegion!==void 0},get cutHaplotypes(){return this.chosenHaplotypes},get chosenHaplotypes(){return t.subgraphHaplotypes??ls(t.parentTrack.configuration)},get coarseAboveBpPerPx(){let r=t.adapterConfig.coarse?.aboveBpPerPx;return typeof r=="number"?r:void 0}})).views(t=>({tierAt(n){let r=t.coarseAboveBpPerPx;return r!==void 0&&n>r?"coarse":"fine"},capFor(n){return n==="coarse"?1/0:t.maxRegionBp},get cutTier(){return t.coarseCut&&t.coarseAboveBpPerPx!==void 0?"coarse":"fine"}})).views(t=>({get settledCapBp(){let n=t.settledWindow;return n?t.capFor(t.tierAt(n.bpPerPx)):1/0}})).views(t=>({get regionTooLarge(){let n=t.settledWindow;return n!==void 0&&n.end-n.start>t.settledCapBp},get regionTooLargeReason(){let n=t.settledWindow;return n?`Region too large for a graph cut (${ye(n.end-n.start)}, max ${ye(t.settledCapBp)})`:""},get zoomCanReleaseGate(){return!0},get fetchCanceled(){return t.loadCanceled}})).views(t=>({get displayPhase(){return(0,tn.computeDisplayStatusPhase)({regionTooLarge:t.regionTooLarge,error:t.error??t.renderError},()=>(0,tn.computeActivityPhase)({isMinimized:t.isMinimized,fetchInert:!1,viewportEmpty:t.host?.initialized===!0&&t.host.hasVisibleContent===!1,isLoading:t.isLoading||!t.hasGraph,fetchCanceled:t.loadCanceled,awaitingDependentData:!1,rendersCanvas:!0,canvasDrawn:t.painted&&t.geometryPainted},()=>!0,()=>t.host?.effectiveBodyMounted??!0))}})).actions(t=>({setSubgraphContext(n){t.subgraphContext=n},setSubgraphHaplotypes(n){t.subgraphHaplotypes=n,t.dense=void 0},setDense(n){t.dense=n},setMaxRegionBp(n){t.maxRegionBp=n},cut(){let n=t.cutRegion;if(!n)return;let r=en(Qt(t.parentTrack.configuration),n.assemblyName);if(r){t.clearGraph(),t.setError(new Error(r));return}let o=t.cutTier==="coarse";return t.cutSubgraph(t.adapterConfig,n,{hops:o?0:t.subgraphContext,haplotypes:t.chosenHaplotypes,tier:o?"coarse":void 0,..._(t.chosenLayoutMode).wholeWalks?{snarls:"overlapping"}:{}})}})).actions(t=>({recutAt(n){let r=t.tierAt(n.bpPerPx);return t.coarseCut=r==="coarse",t.cutRegion=Vn(n,t.capFor(r),_(t.chosenLayoutMode).cutMargins),t.recuts++,t.cut()}})).actions(t=>({settleOn(n){t.settledWindow=n;let r=_(t.chosenLayoutMode).cutMargins;return t.regionTooLarge||Is(t.dense,n)||!t.loadCanceled&&t.tierAt(n.bpPerPx)===t.cutTier&&wi(t.cutRegion,n,r)?!1:(Promise.resolve(t.recutAt(n)).then(()=>{(0,I.isAlive)(t)&&Cs(t.error)&&this.refuseDenseCut(n)}),!0)},refuseDenseCut(n){t.setDense(n),t.cutRegion=void 0,this.settleOn(t.settledWindow??n)},switchLayout(n){let r=_(t.chosenLayoutMode);t.setLayoutMode(n);let o=_(n),a=t.host?Ot(t.host):void 0;return a&&!t.regionTooLarge&&(o.cutMargins!==r.cutMargins||o.wholeWalks!==r.wholeWalks)?t.recutAt(a):t.recomputeLayout()},retryLoad(){t.cut()},reload(){t.cut()},cancelFetchByUser(){t.stopLoad()}})).actions(t=>({forceLoad(){let n=t.settledWindow;n&&(t.setMaxRegionBp(Math.ceil(n.end-n.start)),t.settleOn(n))},afterAttach(){t.cutRegion&&!t.graph&&t.cut(),(0,I.addDisposer)(t,(0,rt.reaction)(()=>t.hostPlacesX,n=>{n||t.releaseHost()},{name:"GraphHostPlacesX"})),(0,I.addDisposer)(t,(0,rt.reaction)(()=>t.hostFrame,n=>{n&&t.hostTransform(n.scale,n.translateX)},{equals:(n,r)=>n?.scale===r?.scale&&n?.translateX===r?.translateX,fireImmediately:!0,name:"GraphHostFrame"})),(0,I.addDisposer)(t,(0,rt.reaction)(()=>`${t.facet.field} ${t.facetPlacement?.count}`,()=>{let n=t.facetGridIn(t.paneCeiling)?.total??0;(t.facetGrid?.total??0)>t.height&&t.setHeight(Math.max(t.height,Math.ceil(n)))},{name:"GraphFacetHeight"})),(0,I.addDisposer)(t,(0,rt.reaction)(()=>t.host?.coarseDynamicBlocks,n=>{let{host:r}=t,o=n&&r?Ot(r):void 0;o&&t.settleOn(o)},{fireImmediately:!0,name:"GraphHostSettle"}))}})).views(t=>({get graphViewSpec(){let n=t.host?Ot(t.host):void 0,r=t.sourceTrackId;if(!n||!r||!t.hasGraph||t.coarseCut||t.regionTooLarge)return;let o=Math.floor(n.start),a=Math.ceil(n.end);return{loadedTrackId:r,loadedRegion:{refName:n.refName,assemblyName:n.assemblyName,start:o,end:a},subgraphContext:t.subgraphContext,subgraphHaplotypes:t.chosenHaplotypes,maxRegionBp:Math.max(t.maxRegionBp,a-o),layoutMode:t.chosenLayoutMode,colorScheme:t.chosenColorScheme,referencePath:t.referencePath,geneTrackId:t.geneTrackId,showGenes:t.showGenes,showBubbles:t.showBubbles,showDeletionEdges:t.showDeletionEdges,walkLayers:t.walkLayers,facet:(0,I.getSnapshot)(t.facet)}}})).actions(t=>({openGraphView(){let n=t.graphViewSpec;n&&(0,nr.getSession)(t).addView("GraphGenomeView",n)}})).views(t=>({trackMenuItems(){let n=t.launchMenuItems();return(0,Fs.pushLaunchViewMenuItem)(n,{label:"Graph genome view",icon:Nt,disabled:!t.graphViewSpec,disabledHelpText:"Zoom in until the track cuts a graph",onClick:()=>{t.openGraphView()}}),[...t.graphMenuItems(),{label:"Settings",icon:Ho,onClick:()=>{(0,nr.getSession)(t).queueDialog(r=>[_c,{model:t,open:!0,onClose:r}])}},...n]}}))}function rr(e){e.addDisplayType(()=>{let t=Ts();return Object.assign(new _s.default({name:"LinearGraphDisplay",displayName:"Graph",configSchema:t,stateModel:Ds(t),trackType:["GraphTrack","FeatureTrack","SyntenyTrack"],viewType:"LinearGenomeView",ReactComponent:(0,Vs.lazy)(()=>import("./chunks/LinearGraphDisplay-GKVG72J4.js"))}),{adapterCapabilities:["getSubgraph"]})})}var Hs=w(Pt(),1);var or=w(U(),1),Ws=w(re(),1);function ar(e){let{uri:t,baseUri:n,csi:r}=e;return typeof t=="string"?{...e,bubblesLocation:{uri:t,baseUri:n},index:{indexType:r?"CSI":"TBI",location:{uri:`${t}.${r?"csi":"tbi"}`,baseUri:n}}}:e}var Wc=(0,or.ConfigurationSchema)("MinigraphBubbleAdapter",{bubblesLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.bb.bed.gz",locationType:"UriLocation"}},index:(0,or.ConfigurationSchema)("MinigraphBubbleIndex",{indexType:{model:Ws.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.bb.bed.gz.tbi",locationType:"UriLocation"}}}),assemblyNameToPanSN:{type:"frozen",defaultValue:{}}},{explicitlyTyped:!0,preProcessSnapshot:ar}),Os=Wc;function ir(e){e.addAdapterType(()=>new Hs.default({name:"MinigraphBubbleAdapter",displayName:"Minigraph bubble BED adapter",normalizeSnapshot:ar,configSchema:Os,adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/MinigraphBubbleAdapter-CZYQROL2.js").then(t=>t.default)}))}var Us=w(Pt(),1);var rn=w(U(),1),zs=w(re(),1);function js(e,t,n){return{indexType:n?"CSI":"TBI",location:{uri:`${e}.${n?"csi":"tbi"}`,baseUri:t}}}function Xs(e){let{uri:t,baseUri:n,csi:r}=e;return typeof t=="string"?{...e,segmentsLocation:{uri:`${t}.segs.bed.gz`,baseUri:n},segmentsIndex:js(`${t}.segs.bed.gz`,n,r),linksLocation:{uri:`${t}.links.bed.gz`,baseUri:n},linksIndex:js(`${t}.links.bed.gz`,n,r)}:e}function sr(e){let{coarse:t,baseUri:n}=e;return Xs(typeof t=="object"&&t!==null?{...e,coarse:Xs({baseUri:n,...t})}:e)}var nn=(e,t)=>(0,rn.ConfigurationSchema)(e,{indexType:{model:zs.types.enumeration("IndexType",["TBI","CSI"]),type:"stringEnum",defaultValue:"TBI"},location:{type:"fileLocation",defaultValue:{uri:t,locationType:"UriLocation"}}}),Oc=(0,rn.ConfigurationSchema)("RgfaTabixCoarseTier",{aboveBpPerPx:{type:"maybeNumber"},segmentsLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.tier.segs.bed.gz",locationType:"UriLocation"}},segmentsIndex:nn("RgfaCoarseSegmentsIndex","/path/to/graph.tier.segs.bed.gz.tbi"),linksLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.tier.links.bed.gz",locationType:"UriLocation"}},linksIndex:nn("RgfaCoarseLinksIndex","/path/to/graph.tier.links.bed.gz.tbi")}),Hc=(0,rn.ConfigurationSchema)("RgfaTabixAdapter",{segmentsLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.segs.bed.gz",locationType:"UriLocation"}},segmentsIndex:nn("RgfaSegmentsIndex","/path/to/graph.segs.bed.gz.tbi"),linksLocation:{type:"fileLocation",defaultValue:{uri:"/path/to/graph.links.bed.gz",locationType:"UriLocation"}},linksIndex:nn("RgfaLinksIndex","/path/to/graph.links.bed.gz.tbi"),assemblyNameToPanSN:{type:"frozen",defaultValue:{}},coarse:Oc},{explicitlyTyped:!0,preProcessSnapshot:sr}),Ys=Hc;function dr(e){e.addAdapterType(()=>new Us.default({name:"RgfaTabixAdapter",displayName:"Indexed rGFA adapter",normalizeSnapshot:sr,configSchema:Ys,adapterCapabilities:["getSubgraph"],adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/RgfaTabixAdapter-LQGQXCVO.js").then(t=>t.default)}))}var jc=new Set(["RgfaTabixAdapter","GbzBaseSyntenyAdapter"]);function Xc(e){return Tr(e).toLowerCase().endsWith(".gbz.db")}function zc(e){let t=e.adapter;return t?.type==="GbzBaseSyntenyAdapter"&&!t.assemblyNames?.length&&Array.isArray(e.assemblyNames)&&e.assemblyNames.length>0?{...e,adapter:{...t,assemblyNames:e.assemblyNames}}:e}function Yc(e,t,n){if((!n||n==="GbzBaseSyntenyAdapter")&&Xc(e))return{type:"GbzBaseSyntenyAdapter",gbzDbLocation:e,...t?{haplotypeIndexLocation:t}:{}};if((!n||n==="RgfaTabixAdapter")&&Ar(e))return Nr({choice:"RgfaTabixAdapter",loc:e,indexLoc:t,assembly:"",sample:""})}function cr(e){e.addToExtensionPoint("Core-preProcessTrackConfig",zc),e.addToExtensionPoint("Core-guessAdapterForLocation",t=>(n,r,o)=>Yc(n,r,o)??t(n,r,o)),e.addToExtensionPoint("Core-guessTrackTypeForLocation",t=>(n,r)=>jc.has(n)?"GraphTrack":t(n,r))}var Zs=w(oe(),1),Qs=w(hd(),1),pr=w(gd(),1),ed=w(bd(),1);function Ks(e){let t;if(Q(e)){let{refName:n,start:r,end:o,assemblyName:a}=e;typeof n=="string"&&typeof r=="number"&&typeof o=="number"&&(t={refName:n,start:r,end:o,assemblyName:typeof a=="string"?a:void 0})}return t}function Uc(e,t,n){let r=e.connectedViewId;return r===void 0||r===t||!n.has(r)}function qs(e,t){return e.assemblyName===void 0||t===void 0||t.includes(e.assemblyName)}function Kc(e){return(Array.isArray(e.tracks)?e.tracks:[]).flatMap(n=>Q(n)&&Array.isArray(n.displays)?n.displays.filter(r=>Q(r)&&r.type==="LinearGraphDisplay"):[])}function Js(e,t,n){let r=[],o=Qe(e),a=new Set(o.map(i=>Q(i)?i.id:void 0));for(let i of o){if(Q(i)&&i.id===t)for(let s of Kc(i)){let d=Ks(s.hoverHighlight);d&&qs(d,n)&&r.push({key:typeof s.id=="string"?s.id:"graph-track",region:d})}if(Q(i)&&i.type==="GraphGenomeView"&&Uc(i,t,a)){let s=Ks(i.hoverHighlight);s&&qs(s,n)&&r.push({key:typeof i.id=="string"?i.id:"graph",region:s})}}return r}var Ie=w(Be(),1),qc=(0,ed.makeStyles)()(e=>({highlight:{height:"100%",position:"absolute",background:(0,Qs.alpha)(e.palette.primary.main,.25),borderLeft:`2px solid ${e.palette.primary.main}`,borderRight:`2px solid ${e.palette.primary.main}`,pointerEvents:"none",zIndex:10}})),Jc=(0,pr.observer)(function({model:t,region:n}){let{classes:r}=qc(),o=t.getHighlightCoords(n);return o?(0,Ie.jsx)("div",{"data-testid":"graph-node-highlight",className:r.highlight,style:{left:o.left,width:o.width}}):null}),Zc=(0,pr.observer)(function({model:t}){let{views:n}=(0,Zs.getSession)(t);return(0,Ie.jsx)(Ie.Fragment,{children:Js([...n],t.id,t.assemblyNames).map(({key:r,region:o})=>(0,Ie.jsx)(Jc,{model:t,region:o},`graph-hover-${r}`))})}),td=Zc;var nd=w(Be(),1),Qc="LinearGenomeView-TracksContainerComponent";function ur(e){e.contributeToExtensionPoint(Qc,({model:t})=>(0,nd.jsx)(td,{model:t},"graphgenomeview-hover-highlight"))}var rd=w(le(),1);function ep(e){return e.views(t=>({get adapterConfig(){return ge(t,t.parentTrack.configuration)}}))}function mr(e){e.addToExtensionPoint("Core-extendPluggableElement",t=>(t instanceof rd.DisplayType&&Zn.includes(t.name)&&t.extendStateModel(ep),t))}var od="GraphGenomeView";var ad="5.2.0";var lr=class extends id.default{constructor(){super(...arguments);this.name=od;this.version=ad}install(n){Jn(n),rr(n),Qn(n),er(n),ur(n),dr(n),ir(n),yn(n),kn(n),cr(n),mr(n),n.addRpcMethod(()=>new Oe(n)),n.addRpcMethod(()=>new We(n)),n.addRpcMethod(()=>new _e(n))}configure(n){try{(0,sd.isAbstractMenuManager)(n.rootModel)&&n.rootModel.appendToSubMenu(["Add"],{label:"Graph genome view",icon:Nt,onClick:r=>{r.addView("GraphGenomeView",{})}})}catch(r){console.warn("[GraphGenomeView] could not add the Add menu entry",r)}}};export{lr as default};
|
|
7
7
|
//# sourceMappingURL=jbrowse-plugin-graphgenomeviewer.esm.js.map
|