jbrowse-plugin-graphgenomeviewer 7.2.1 → 7.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/WalkTabixSyntenyAdapter-7VDCNSFD.js +2 -0
- package/dist/chunks/WalkTabixSyntenyAdapter-7VDCNSFD.js.map +7 -0
- package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +1 -1
- package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +1 -1
- package/package.json +1 -1
- package/src/RgfaTabixAdapter/test_data/walks3_inversion.GRCh38.walks.bed.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks3_inversion.GRCh38.walks.bed.gz.tbi +0 -0
- package/src/WalkTabixSyntenyAdapter/WalkTabixSyntenyAdapter.test.ts +76 -0
- package/src/WalkTabixSyntenyAdapter/WalkTabixSyntenyAdapter.ts +2 -2
- package/src/WalkTabixSyntenyAdapter/walkLanes.ts +55 -18
- package/src/version.ts +1 -1
- package/dist/chunks/WalkTabixSyntenyAdapter-I3PY6HJ2.js +0 -2
- package/dist/chunks/WalkTabixSyntenyAdapter-I3PY6HJ2.js.map +0 -7
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as K}from"./chunk-YKSUKPYY.js";import{b as q,d as U,e as X,f as O,g as z,h as G}from"./chunk-2O3YVA2I.js";import"./chunk-JCAZTNYG.js";import{a as H}from"./chunk-KOB7YIMR.js";import{p as M,q as _,r as T}from"./chunk-M2D7NUOY.js";import"./chunk-YBLNN5FU.js";import"./chunk-6KUHGRHU.js";import"./chunk-6MUBJVBG.js";import{e as $,p as j,r as D}from"./chunk-B2EP6FOQ.js";import"./chunk-YBLNN5FU.js";import"./chunk-MVVXRZXV.js";import{a as A,c as I,d as W,g as F,h as w,i as x}from"./chunk-7HWHWPRW.js";import"./chunk-T4R3ZVEM.js";import"./chunk-7WIBGKBU.js";import"./chunk-OGQ6OQDN.js";import"./chunk-NDRLCGPC.js";import{o as R}from"./chunk-TENPGIPX.js";var se=50;function re(r){let i=[];for(let e=0;e<r.length;e++){let[t,a]=r[e],[s,n]=r[e+1]??[];a===n&&a<=se&&(t==="I"&&s==="D"||t==="D"&&s==="I")?(i.push(["X",a]),e++):i.push([t,a])}return i}function v(r){return Array.from(r.ids,(i,e)=>2*i+r.rev[e])}function P(r,i){let e=r.get(i);return e===void 0?0:e.end-e.start}function V(r){let i=new Map,e=s=>{let n=P(r,s),o=i.get(n);return o===void 0&&(o="N".repeat(n),i.set(n,o)),o},t=new Map,a=s=>{let n=t.get(s);return n===void 0&&(n=v(s),t.set(s,n)),n};return(s,n)=>_({query:a(s),target:a(n),sequenceOf:e,bases:!1})}var B=100;function E(r,i,e){let t=r.at(-1);e>0&&(t?.[0]===i?t[1]+=e:r.push([i,e]))}function Z(r){let i=t=>P(r,t>>1),e=t=>{let a=new Float64Array(t.length+1);return t.forEach((s,n)=>{a[n+1]=a[n]+i(s)}),a};return(t,a)=>{let s=v(a),n=v(t),[o,l]=M(n,s,i),[u,f]=M(n.map(g=>g^1).reverse(),s,i),c=f>l,p=c?u:o,N=Math.max(l,f);if(N<B)return[];let d=e(s),h=e(n),y=g=>c?n.length-1-p[g][0]:p[g][0],m=[];p.forEach(([,g],k)=>{if(k>0){let[ee,te]=[y(k-1),y(k)].sort((ae,ne)=>ae-ne);E(m,"I",h[te]-h[ee+1]),E(m,"D",d[g]-d[p[k-1][1]+1])}E(m,"=",i(s[g]))});let[b,S]=[y(0),y(p.length-1)].sort((g,k)=>g-k);return[{queryStart:h[b],queryEnd:h[S+1],targetStart:d[p[0][1]],targetEnd:d[p.at(-1)[1]+1],strand:c?"-":"+",edits:m,sharedBases:N}]}}function oe(r){let i=new Map,e=new Set;r.ids.forEach((t,a)=>{i.has(t)?e.add(t):i.set(t,r.rev[a])});for(let t of e)i.delete(t);return i}function J(r){let i=new Map,e=t=>{let a=i.get(t);return a===void 0&&(a=oe(t),i.set(t,a)),a};return(t,a)=>{let s=e(a),n=0,o=0;for(let[l,u]of e(t)){let f=s.get(l);f===u?n+=P(r,l):f!==void 0&&(o+=P(r,l))}return{same:n,opposite:o}}}function Q(r){let i=Z(r),e=V(r),t=J(r);return(a,s)=>{let{same:n,opposite:o}=t(a,s);return n>=B&&o>=B?e(a,s):i(a,s)}}var ie=1e4;function Y(r){let i=Z(r),e=V(r),t=J(r);return(a,s)=>{let n=i(a,s),o=n[0]?.strand,{same:l,opposite:u}=t(a,s);return o===void 0||Math.min(l,u)<ie?n:[...n,...e(a,s).filter(f=>f.strand!==o)]}}function C({chain:r,target:i,query:e,assemblyName:t,refName:a,mateAssemblyName:s}){let n=re(r.edits);return G({target:{name:i.name,assemblyName:t,refName:a,start:i.hapStart+r.targetStart,end:i.hapStart+r.targetEnd},query:{name:e.name,assemblyName:s,refName:W(e.name),start:e.hapStart+r.queryStart,end:e.hapStart+r.queryEnd},strand:r.strand,cigar:T(n),matches:n.reduce((o,[l,u])=>o+(l==="="?u:0),0),columns:n.reduce((o,[,l])=>o+l,0)})}var me=r=>I(r.name)??r.name,L=class extends q{constructor(){super(...arguments);this.walks=new K(j(this,["walksLocation"],["walksIndex"]),this);this.refNames=new D(this.walks.file,this)}get anchor(){let e=this.getConf("assemblyNames")[0];if(e===void 0)throw new Error("WalkTabixSyntenyAdapter needs assemblyNames: its first entry is the assembly the reference sample is loaded as");return e}async getHaplotypeNames(e={}){return this.walks.haplotypeNames(e)}async getHeader(e={}){let{haplotypes:t}=await this.walks.reader.header(e),{anchor:a}=this,s=w(this,a),n=x(this);return{hasCoarseTier:!1,anchorAssemblyName:a,lanes:t.filter(o=>o!==s&&A(o)!==s).map(o=>({name:O(n,o),label:o,group:A(o)}))}}async getRefNames(e={}){let{assemblyName:t}=e;return t===void 0||t===this.anchor?this.refNames.assemblyRefNames({...e,assemblyName:this.anchor}):[]}async getSubgraph(e,t={}){let a=await this.refNames.resolve(e,{signal:t.signal});if(a===void 0)throw new Error(`${e.assemblyName} ${e.refName} is not in this graph's index; the graph is cut on ${this.anchor}, mapped to its PanSN prefix in assemblyNameToPanSN`);return this.walks.subgraph(a,e,t)}async laneWalks(e,t,a,s,n){return R(n,s.statusCallback,()=>this.walks.reader.cut(e,t,{...this.walks.budgets(),signal:s.signal,keep:$(a,e),links:!1}).catch(o=>{throw z(o,t.end-t.start)}))}async anchorFeatures(e,t,a){let s=a.haplotypes?.length?a.haplotypes.map(m=>w(this,m)):void 0,n=w(this,a.targetAssemblyName),o=n===void 0?s:s===void 0||s.some(m=>F(n,m)||F(m,n))?[n]:[];if(o?.length===0)return[];let{start:l,end:u}=t,{graph:f,fragments:c}=await this.laneWalks(e,t,o,a,`Reading walks ${t.refName}:${l.toLocaleString()}-${u.toLocaleString()}`),p=Y(f.nodes),N=x(this),d=c.filter(m=>m.name===e),h=m=>o===void 0?0:o.findIndex(b=>F(m.name,b));return c.filter(m=>m.name!==e&&h(m)>=0).sort((m,b)=>h(m)-h(b)).flatMap(m=>d.flatMap(b=>p(m,b).map(S=>C({chain:S,target:b,query:m,assemblyName:t.assemblyName,refName:t.refName,mateAssemblyName:O(N,me(m))}))))}async pairFeatures(e,t,a,s){let n=a.map(c=>({pair:c,featurePrefix:w(this,c.queryAssemblyName),matePrefix:w(this,c.targetAssemblyName)})),{graph:o,fragments:l}=await this.laneWalks(e,t,n.flatMap(c=>[c.featurePrefix,c.matePrefix]),s,X(a)),u=Q(o.nodes),f=c=>l.filter(p=>F(p.name,c));return n.flatMap(({pair:c,featurePrefix:p,matePrefix:N})=>f(p).flatMap(d=>f(N).flatMap(h=>u(h,d).map(y=>C({chain:y,target:d,query:h,assemblyName:c.queryAssemblyName,refName:W(d.name),mateAssemblyName:c.targetAssemblyName})))))}getFeatures(e,t={}){return H(async a=>{let s=e.assemblyName===this.anchor?await this.refNames.resolve(e,t):void 0;if(s!==void 0){let n=U(t),o=n.length>0?await this.pairFeatures(s,e,n,t):await this.anchorFeatures(s,e,t);for(let l of o)a.next(l)}a.complete()},t.signal)}};export{L as default};
|
|
2
|
+
//# sourceMappingURL=WalkTabixSyntenyAdapter-7VDCNSFD.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/WalkTabixSyntenyAdapter/walkLanes.ts", "../../src/WalkTabixSyntenyAdapter/WalkTabixSyntenyAdapter.ts"],
|
|
4
|
+
"sourcesContent": ["import { weightedLcs } from '@gmod/gbz-base/lcs'\nimport { pairAlignments, pairCigar } from '@gmod/gbz-base/pairAlignment'\nimport { panSNContig } from '@jbrowse/bandage-core/pansn'\n\nimport { matchFeature } from '../synteny/matchFeature.ts'\n\nimport type { PairChain, PairEdit } from '@gmod/gbz-base/pairAlignment'\nimport type { WalkFragment, WalkNode } from '@jbrowse/graph-walks'\n\n// The longest bubble with equal bases on both sides that is written as\n// mismatches; a longer one stays an insertion and a deletion\nconst BALANCED_BUBBLE_MAX_BP = 50\n\n/**\n * A chain's edits with each short balanced bubble as `X`. The walks carry no\n * bases, so two walks differ wherever they leave a shared node, and a SNP is\n * one base inserted and one deleted until it is read as the mismatch it is.\n */\nexport function bubblesAsMismatches(edits: PairEdit[]) {\n const out: PairEdit[] = []\n for (let i = 0; i < edits.length; i++) {\n const [op, len] = edits[i]!\n const [nextOp, nextLen] = edits[i + 1] ?? []\n if (\n len === nextLen &&\n len <= BALANCED_BUBBLE_MAX_BP &&\n ((op === 'I' && nextOp === 'D') || (op === 'D' && nextOp === 'I'))\n ) {\n out.push(['X', len])\n i++\n } else {\n out.push([op, len])\n }\n }\n return out\n}\n\n// A walk's steps as the handles gbz-base reads, 2 * id + reversed\nfunction handlesOf(fragment: WalkFragment) {\n return Array.from(fragment.ids, (id, i) => 2 * id + fragment.rev[i]!)\n}\n\nfunction nodeLength(nodes: Map<number, WalkNode>, id: number) {\n const node = nodes.get(id)\n return node === undefined ? 0 : node.end - node.start\n}\n\n/**\n * Aligns one walk fragment to another on the nodes both visit, from node\n * lengths alone: the fragments' steps as the handles gbz-base's chainer reads,\n * and a stand-in sequence of each node's length.\n */\nexport function walkAligner(nodes: Map<number, WalkNode>) {\n const standIn = new Map<number, string>()\n const sequenceOf = (id: number) => {\n const length = nodeLength(nodes, id)\n let sequence = standIn.get(length)\n if (sequence === undefined) {\n sequence = 'N'.repeat(length)\n standIn.set(length, sequence)\n }\n return sequence\n }\n const handles = new Map<WalkFragment, number[]>()\n const cachedHandles = (fragment: WalkFragment) => {\n let steps = handles.get(fragment)\n if (steps === undefined) {\n steps = handlesOf(fragment)\n handles.set(fragment, steps)\n }\n return steps\n }\n return (query: WalkFragment, target: WalkFragment) =>\n pairAlignments({\n query: cachedHandles(query),\n target: cachedHandles(target),\n sequenceOf,\n bases: false,\n })\n}\n\n// The fewest bases on shared nodes a record against the reference keeps,\n// gbz-base's floor for a pair record\nconst MIN_MATCH_BP = 100\n\nfunction appendEdit(edits: PairEdit[], op: PairEdit[0], len: number) {\n const last = edits.at(-1)\n if (len > 0) {\n if (last?.[0] === op) {\n last[1] += len\n } else {\n edits.push([op, len])\n }\n }\n}\n\n/**\n * Aligns a haplotype's walk fragment to the reference's as gbz-base aligns a\n * walk to its reference path: the heaviest common subsequence of their steps,\n * each node weighing its length, read in whichever direction shares more. A\n * pair chain leaves out every node either walk passes twice, which is the\n * whole of a collapsed copy-number array (amylase, KIV-2); the subsequence\n * matches one pass over it, and the other copies are insertions.\n */\nexport function referenceAligner(nodes: Map<number, WalkNode>) {\n const lengthOf = (handle: number) => nodeLength(nodes, handle >> 1)\n const offsets = (handles: number[]) => {\n const out = new Float64Array(handles.length + 1)\n handles.forEach((handle, i) => {\n out[i + 1] = out[i]! + lengthOf(handle)\n })\n return out\n }\n\n return (query: WalkFragment, target: WalkFragment): PairChain[] => {\n const ref = handlesOf(target)\n const hap = handlesOf(query)\n const [same, sameWeight] = weightedLcs(hap, ref, lengthOf)\n const [turned, turnedWeight] = weightedLcs(\n hap.map(handle => handle ^ 1).reverse(),\n ref,\n lengthOf,\n )\n const reverse = turnedWeight > sameWeight\n const pairs = reverse ? turned : same\n const sharedBases = Math.max(sameWeight, turnedWeight)\n if (sharedBases < MIN_MATCH_BP) {\n return []\n }\n const refAt = offsets(ref)\n const hapAt = offsets(hap)\n // a pair's haplotype step, counted along the haplotype\n const stepOf = (k: number) =>\n reverse ? hap.length - 1 - pairs[k]![0] : pairs[k]![0]\n const edits: PairEdit[] = []\n pairs.forEach(([, r], k) => {\n if (k > 0) {\n const [lo, hi] = [stepOf(k - 1), stepOf(k)].sort((x, y) => x - y)\n appendEdit(edits, 'I', hapAt[hi!]! - hapAt[lo! + 1]!)\n appendEdit(edits, 'D', refAt[r]! - refAt[pairs[k - 1]![1] + 1]!)\n }\n appendEdit(edits, '=', lengthOf(ref[r]!))\n })\n const [lo, hi] = [stepOf(0), stepOf(pairs.length - 1)].sort((x, y) => x - y)\n return [\n {\n queryStart: hapAt[lo!]!,\n queryEnd: hapAt[hi! + 1]!,\n targetStart: refAt[pairs[0]![1]]!,\n targetEnd: refAt[pairs.at(-1)![1] + 1]!,\n strand: reverse ? '-' : '+',\n edits,\n sharedBases,\n },\n ]\n }\n}\n\n// Each node a walk visits once, with the direction it passes it\nfunction singleVisits(fragment: WalkFragment) {\n const rev = new Map<number, number>()\n const twice = new Set<number>()\n fragment.ids.forEach((id, i) => {\n if (rev.has(id)) {\n twice.add(id)\n } else {\n rev.set(id, fragment.rev[i]!)\n }\n })\n for (const id of twice) {\n rev.delete(id)\n }\n return rev\n}\n\n// The bases on singly visited nodes two walks pass the same way and the\n// opposite way\nfunction directionShares(nodes: Map<number, WalkNode>) {\n const visits = new Map<WalkFragment, Map<number, number>>()\n const visitsOf = (fragment: WalkFragment) => {\n let found = visits.get(fragment)\n if (found === undefined) {\n found = singleVisits(fragment)\n visits.set(fragment, found)\n }\n return found\n }\n return (query: WalkFragment, target: WalkFragment) => {\n const theirs = visitsOf(target)\n let same = 0\n let opposite = 0\n for (const [id, rev] of visitsOf(query)) {\n const other = theirs.get(id)\n if (other === rev) {\n same += nodeLength(nodes, id)\n } else if (other !== undefined) {\n opposite += nodeLength(nodes, id)\n }\n }\n return { same, opposite }\n }\n}\n\n/**\n * Aligns one lane's walk fragment to another's. The weighted subsequence\n * (`referenceAligner`) is the fast route and matches through copy-number\n * arrays, but it reads one direction per pair, so an inversion between the\n * lanes comes out as an insertion beside a deletion. A pair sharing 100 bp\n * (MIN_MATCH_BP) or more of singly visited nodes in each direction goes to\n * pair chaining (`walkAligner`) instead, which answers the inverted stretch as\n * a reverse-strand record of its own. Chaining leaves out every node a walk\n * passes twice, so counting singly visited nodes misses no inversion it could\n * draw.\n */\nexport function lanePairAligner(nodes: Map<number, WalkNode>) {\n const subsequence = referenceAligner(nodes)\n const chained = walkAligner(nodes)\n const shares = directionShares(nodes)\n return (query: WalkFragment, target: WalkFragment) => {\n const { same, opposite } = shares(query, target)\n return same >= MIN_MATCH_BP && opposite >= MIN_MATCH_BP\n ? chained(query, target)\n : subsequence(query, target)\n }\n}\n\n// The multi-way display's SPLIT_AT_GAP_BP, under which a turned stretch names\n// no inversion there\nconst TURNED_MIN_BP = 10_000\n\n/**\n * Aligns a haplotype's walk fragment to the reference's as `referenceAligner`\n * does, then adds the stretches it reads the other way. A walk sharing\n * TURNED_MIN_BP or more of singly visited nodes in each direction is chained\n * too, and the chained records on the strand the subsequence did not take are\n * its turned stretches. The subsequence record stays, so a copy-number array,\n * which chaining leaves out, still matches one pass alike in every lane.\n */\nexport function anchorAligner(nodes: Map<number, WalkNode>) {\n const subsequence = referenceAligner(nodes)\n const chained = walkAligner(nodes)\n const shares = directionShares(nodes)\n return (query: WalkFragment, target: WalkFragment) => {\n const records = subsequence(query, target)\n const taken = records[0]?.strand\n const { same, opposite } = shares(query, target)\n return taken === undefined || Math.min(same, opposite) < TURNED_MIN_BP\n ? records\n : [\n ...records,\n ...chained(query, target).filter(chain => chain.strand !== taken),\n ]\n }\n}\n\n/**\n * One record of a walk aligned to another, with its short balanced bubbles as\n * mismatches\n */\nexport function chainFeature({\n chain,\n target,\n query,\n assemblyName,\n refName,\n mateAssemblyName,\n}: {\n chain: PairChain\n target: WalkFragment\n query: WalkFragment\n assemblyName: string\n refName: string\n mateAssemblyName: string\n}) {\n const edits = bubblesAsMismatches(chain.edits)\n return matchFeature({\n target: {\n name: target.name,\n assemblyName,\n refName,\n start: target.hapStart + chain.targetStart,\n end: target.hapStart + chain.targetEnd,\n },\n query: {\n name: query.name,\n assemblyName: mateAssemblyName,\n refName: panSNContig(query.name),\n start: query.hapStart + chain.queryStart,\n end: query.hapStart + chain.queryEnd,\n },\n strand: chain.strand,\n cigar: pairCigar(edits),\n matches: edits.reduce((sum, [op, n]) => sum + (op === '=' ? n : 0), 0),\n columns: edits.reduce((sum, [, n]) => sum + n, 0),\n })\n}\n", "import {\n assemblyByPanSNPrefix,\n panSNContig,\n panSNHaplotype,\n panSNMatchesPrefix,\n panSNSample,\n resolvePanSNPrefix,\n} from '@jbrowse/bandage-core/pansn'\nimport { updateStatus } from '@jbrowse/core/util'\nimport { ObservableCreate } from '@jbrowse/core/util/rxjs'\nimport { walksKept } from '@jbrowse/graph-walks'\n\nimport { anchorAligner, chainFeature, lanePairAligner } from './walkLanes.ts'\nimport { WalkIndex } from '../RgfaTabixAdapter/walkReader.ts'\nimport { PanSNRefNames, openTabixSlot } from '../panSNTabix.ts'\nimport { ComparativeAdapterBase } from '../synteny/ComparativeAdapterBase.ts'\nimport {\n laneAssemblyName,\n lanePairsStatus,\n requestedPairs,\n} from '../synteny/lanePairs.ts'\nimport { laneZoomNotice } from '../synteny/laneZoomNotice.ts'\n\nimport type { WalkTabixSyntenyAdapterConfig } from './configSchema.ts'\nimport type { SubgraphAdapterOptions } from '../GetSubgraph.ts'\nimport type { LaneFeatureOptions, LanePair } from '../synteny/lanePairs.ts'\nimport type { BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport type { Feature } from '@jbrowse/core/util'\nimport type { Region } from '@jbrowse/core/util/types'\nimport type { WalkFragment } from '@jbrowse/graph-walks'\n\nconst haplotypeOf = (fragment: WalkFragment) =>\n panSNHaplotype(fragment.name) ?? fragment.name\n\nexport default class WalkTabixSyntenyAdapter extends ComparativeAdapterBase<WalkTabixSyntenyAdapterConfig> {\n private readonly walks: WalkIndex = new WalkIndex(\n openTabixSlot(this, ['walksLocation'], ['walksIndex']),\n this,\n )\n private readonly refNames: PanSNRefNames = new PanSNRefNames(\n this.walks.file,\n this,\n )\n\n private get anchor() {\n const anchor = this.getConf('assemblyNames')[0]\n if (anchor === undefined) {\n throw new Error(\n 'WalkTabixSyntenyAdapter needs assemblyNames: its first entry is the assembly the reference sample is loaded as',\n )\n }\n return anchor\n }\n\n /**\n * The haplotypes the walk file's header names, `sample#haplotype` in byte\n * order, or undefined when it names none\n */\n async getHaplotypeNames(opts: BaseOptions = {}) {\n return this.walks.haplotypeNames(opts)\n }\n\n /**\n * `lanes` is every haplotype the header names but the anchor's own,\n * declared up front so the display can offer the whole graph's haplotypes\n * before a fetch has placed any of them\n */\n async getHeader(opts: BaseOptions = {}) {\n const { haplotypes } = await this.walks.reader.header(opts)\n const { anchor } = this\n const anchorPrefix = resolvePanSNPrefix(this, anchor)\n const asmByPrefix = assemblyByPanSNPrefix(this)\n return {\n hasCoarseTier: false,\n anchorAssemblyName: anchor,\n lanes: haplotypes\n .filter(\n prefix =>\n prefix !== anchorPrefix && panSNSample(prefix) !== anchorPrefix,\n )\n .map(prefix => ({\n name: laneAssemblyName(asmByPrefix, prefix),\n label: prefix,\n group: panSNSample(prefix),\n })),\n }\n }\n\n // A lane's contigs are named only in its walk rows, so only the anchor's\n // are listed\n async getRefNames(opts: BaseOptions = {}) {\n const { assemblyName } = opts\n return assemblyName === undefined || assemblyName === this.anchor\n ? this.refNames.assemblyRefNames({ ...opts, assemblyName: this.anchor })\n : []\n }\n\n /**\n * The graph display's cut of the window, as RgfaTabixAdapter cuts a\n * walk-indexed graph: the reference walk first, then the walks `haplotypes`\n * asks for, and the nodes and links they visit\n */\n async getSubgraph(region: Region, opts: SubgraphAdapterOptions = {}) {\n const refName = await this.refNames.resolve(region, { signal: opts.signal })\n if (refName === undefined) {\n throw new Error(\n `${region.assemblyName} ${region.refName} is not in this graph's index; the graph is cut on ${this.anchor}, mapped to its PanSN prefix in assemblyNameToPanSN`,\n )\n }\n return this.walks.subgraph(refName, region, opts)\n }\n\n // The window's walks for the haplotypes named and the reference, with no\n // link read; a window past a budget fails as a zoom-in notice for lanes\n private async laneWalks(\n refName: string,\n region: Region,\n prefixes: string[] | undefined,\n opts: LaneFeatureOptions,\n status: string,\n ) {\n return updateStatus(status, opts.statusCallback, () =>\n this.walks.reader\n .cut(refName, region, {\n ...this.walks.budgets(),\n signal: opts.signal,\n keep: walksKept(prefixes, refName),\n links: false,\n })\n .catch((error: unknown) => {\n throw laneZoomNotice(error, region.end - region.start)\n }),\n )\n }\n\n /**\n * One record per stretch a haplotype's walk shares with the reference's,\n * on the reference with the haplotype as its mate\n */\n private async anchorFeatures(\n refName: string,\n region: Region,\n opts: LaneFeatureOptions,\n ) {\n const wanted = opts.haplotypes?.length\n ? opts.haplotypes.map(lane => resolvePanSNPrefix(this, lane))\n : undefined\n const target = resolvePanSNPrefix(this, opts.targetAssemblyName)\n const prefixes =\n target === undefined\n ? wanted\n : wanted === undefined ||\n wanted.some(\n prefix =>\n panSNMatchesPrefix(target, prefix) ||\n panSNMatchesPrefix(prefix, target),\n )\n ? [target]\n : []\n if (prefixes?.length === 0) {\n return []\n }\n const { start, end } = region\n const { graph, fragments } = await this.laneWalks(\n refName,\n region,\n prefixes,\n opts,\n `Reading walks ${region.refName}:${start.toLocaleString()}-${end.toLocaleString()}`,\n )\n const align = anchorAligner(graph.nodes)\n const asmByPrefix = assemblyByPanSNPrefix(this)\n const references = fragments.filter(f => f.name === refName)\n // lanes come back in the order the fetch names them, which is the order\n // the display stacks lanes of equal weight in\n const rank = (fragment: WalkFragment) =>\n prefixes === undefined\n ? 0\n : prefixes.findIndex(prefix =>\n panSNMatchesPrefix(fragment.name, prefix),\n )\n const shown = fragments\n .filter(fragment => fragment.name !== refName && rank(fragment) >= 0)\n .sort((a, b) => rank(a) - rank(b))\n return shown.flatMap(query =>\n references.flatMap(reference =>\n align(query, reference).map(chain =>\n chainFeature({\n chain,\n target: reference,\n query,\n assemblyName: region.assemblyName,\n refName: region.refName,\n mateAssemblyName: laneAssemblyName(asmByPrefix, haplotypeOf(query)),\n }),\n ),\n ),\n )\n }\n\n /**\n * Each pair's two lanes read out of the anchor window, all pairs in one\n * read, and each walk of a pair's query lane aligned to each walk of its\n * target lane. A pair's records sit on its query lane's contigs, the lane\n * the display draws on top.\n */\n private async pairFeatures(\n refName: string,\n region: Region,\n pairs: LanePair[],\n opts: LaneFeatureOptions,\n ) {\n const sides = pairs.map(pair => ({\n pair,\n featurePrefix: resolvePanSNPrefix(this, pair.queryAssemblyName),\n matePrefix: resolvePanSNPrefix(this, pair.targetAssemblyName),\n }))\n const { graph, fragments } = await this.laneWalks(\n refName,\n region,\n sides.flatMap(side => [side.featurePrefix, side.matePrefix]),\n opts,\n lanePairsStatus(pairs),\n )\n const align = lanePairAligner(graph.nodes)\n const walksOf = (prefix: string) =>\n fragments.filter(f => panSNMatchesPrefix(f.name, prefix))\n return sides.flatMap(({ pair, featurePrefix, matePrefix }) =>\n walksOf(featurePrefix).flatMap(target =>\n walksOf(matePrefix).flatMap(query =>\n align(query, target).map(chain =>\n chainFeature({\n chain,\n target,\n query,\n assemblyName: pair.queryAssemblyName,\n refName: panSNContig(target.name),\n mateAssemblyName: pair.targetAssemblyName,\n }),\n ),\n ),\n ),\n )\n }\n\n // The files are filed under the reference alone, so a window on a\n // haplotype lane has no answer: a lane pair is read inside the anchor's\n getFeatures(region: Region, opts: LaneFeatureOptions = {}) {\n return ObservableCreate<Feature>(async observer => {\n const refName =\n region.assemblyName === this.anchor\n ? await this.refNames.resolve(region, opts)\n : undefined\n if (refName !== undefined) {\n const pairs = requestedPairs(opts)\n const features =\n pairs.length > 0\n ? await this.pairFeatures(refName, region, pairs, opts)\n : await this.anchorFeatures(refName, region, opts)\n for (const feature of features) {\n observer.next(feature)\n }\n }\n observer.complete()\n }, opts.signal)\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["BALANCED_BUBBLE_MAX_BP", "bubblesAsMismatches", "edits", "out", "i", "op", "len", "nextOp", "nextLen", "handlesOf", "fragment", "id", "nodeLength", "nodes", "node", "walkAligner", "standIn", "sequenceOf", "length", "sequence", "handles", "cachedHandles", "steps", "query", "target", "pairAlignments", "MIN_MATCH_BP", "appendEdit", "last", "referenceAligner", "lengthOf", "handle", "offsets", "ref", "hap", "same", "sameWeight", "weightedLcs", "turned", "turnedWeight", "reverse", "pairs", "sharedBases", "refAt", "hapAt", "stepOf", "k", "r", "lo", "hi", "x", "y", "singleVisits", "rev", "twice", "directionShares", "visits", "visitsOf", "found", "theirs", "opposite", "other", "lanePairAligner", "subsequence", "chained", "shares", "TURNED_MIN_BP", "anchorAligner", "records", "taken", "chain", "chainFeature", "assemblyName", "refName", "mateAssemblyName", "matchFeature", "panSNContig", "pairCigar", "sum", "n", "haplotypeOf", "fragment", "panSNHaplotype", "WalkTabixSyntenyAdapter", "ComparativeAdapterBase", "WalkIndex", "openTabixSlot", "PanSNRefNames", "anchor", "opts", "haplotypes", "anchorPrefix", "resolvePanSNPrefix", "asmByPrefix", "assemblyByPanSNPrefix", "prefix", "panSNSample", "laneAssemblyName", "assemblyName", "region", "refName", "prefixes", "status", "updateStatus", "walksKept", "error", "laneZoomNotice", "wanted", "lane", "target", "panSNMatchesPrefix", "start", "end", "graph", "fragments", "align", "anchorAligner", "references", "f", "rank", "a", "query", "reference", "chain", "chainFeature", "pairs", "sides", "pair", "side", "lanePairsStatus", "lanePairAligner", "walksOf", "featurePrefix", "matePrefix", "panSNContig", "ObservableCreate", "observer", "requestedPairs", "features", "feature"]
|
|
7
|
+
}
|
|
@@ -3,5 +3,5 @@ import{A as Mr,B as kr,C as Sr,D as Ct,E as Vr,F as Xe,G as Ur,H as Xr,I as Kr,J
|
|
|
3
3
|
`)&&(e.hoveredRowWalks=t)},setHoveredWalkRow(t){e.hoveredWalkRow=t},setHoveredBubble(t){e.hoveredBubble=t},setPointerInPane(t){e.pointerInPane=t},setWalkStrip(t){this.setLayer("walkStrip",t),e.stripHover=null},setStripHover(t){e.stripHover=t;let o=e.walkStripRows,r=e.walkStripFrame,n=t&&o?[o.reference,...o.rows].find(i=>i.name===t.row):void 0,a=n&&r&&e.graph?Jo(e.graph,n,t.offset,r.scaleX):void 0;e.hoveredNode=a??null},setLegendSize(t){e.legendSize=t},setHoveredEdge(t){e.hoveredEdge=e.hoverLightsEverything?t:null},setSelectedNode(t){e.selectedNode=t},setDraggingNode(t){e.draggingNode=t},setPanning(t){e.isPanning=t},stopDragging(){e.draggingNode=null,e.isPanning=!1},clearHover(){e.hoveredNode=null,e.hoveredAt=null,e.hoveredTube=null,e.hoveredPanel=null,e.hoveredWalkRow=null,e.hoveredBubble=null,e.hoveredEdge=null},clearInteractionState(){this.clearHover(),e.hoveredRowWalks=[],e.stripHover=null,e.selectedNode=null,e.draggingNode=null,e.isPanning=!1},showNodeDetails(t){let o=e.nodeById?.get(t);if(o){let r=R(e),n=e.graphRegion,a=n?e.nodeSpan(t):void 0;yo(r)&&r.showWidget(r.addWidget("BaseFeatureWidget","baseFeature",{featureData:{id:o.id,name:o.name,length:o.length,depth:o.depth,rank:o.stable?.rank,stableName:o.stable?.refName,contributingAssembly:xt(o)?.sample,contributingHaplotype:xt(o)?.haplotype,sampleCount:o.samples?.length,samples:o.samples,...n&&a?{refName:n.refName,assemblyName:n.assemblyName,start:a.start,end:a.end}:{}}}))}},setTransform(t,o,r){let{host:n}=e;e.viewportOwner==="host"&&n?n.horizontalScroll(e.translateX-o):(e.viewportOwner="user",e.scale=nr(t),e.translateX=o),e.translateY=r,e.keepDrawingInView()},zoom(t,o,r){let{host:n}=e;if(e.viewportOwner==="host"&&n){n.zoomTo(n.bpPerPx/t,o);return}e.viewportOwner="user";let a=sr(e,t,o,r,e.pixelRows);e.scale=a.scale,e.translateX=a.translateX,e.translateY=a.translateY,e.keepDrawingInView()},setViewportDirty(){e.viewportRebuildPending=!1,e.viewportDirty++},setPositionsDirty(){e.positionsVersion++},setMorphFrame(t){e.morphEntering=t,e.positionsVersion++},zoomToFit(){if(e.viewportOwner==="host"){let o=e.layoutBounds,{usableHeight:r}=e;o&&r>0&&(e.translateY=ar(o,r,e.scaleY,e.fitPads.top));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,o){let r=e.viewportOwner!=="host";r&&(e.viewportOwner="host"),e.scale=t,e.translateX=o,r&&e.zoomToFit()},followNewLayout(t){let o=e.layoutBounds;if(e.viewportOwner!=="user"||!o||t===e.layoutResult)return;let r=t?.referenceAxis===!0&&e.xIsReferenceBp;t===void 0||r&&(!e.paneMeasured||Nn(o,e,e.viewBox))?e.keepDrawingInView():(e.viewportOwner="fit",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(()=>{H(e)&&e.setViewportDirty()},hr)}function o(){cancelAnimationFrame(e.positionsDirtyFrame),e.positionsDirtyFrame=requestAnimationFrame(()=>{H(e)&&e.setPositionsDirty()})}let r;function n(){r&&(cancelAnimationFrame(r.frame),r=void 0)}function a(){let i=r;n(),i?.finish()}return{morphFrom(i,p){let s=e.layoutResult;if(i===s)return;let c=r&&i?structuredClone(i.nodePositions):i?.nodePositions;a();let m=e.graph;if(!i||!c||!s||!m||!Mr(i,s,m.nodes.length,!!e.facetGrid)||!kr())return;e.viewportOwner==="fit"&&e.zoomToFit();let k=s.deletionRoutes??{},T=structuredClone({nodes:s.nodePositions,routes:k}),g=fr(c,p,s.nodePositions,e.screenTransform,m.edges),b={nodes:g,routes:wr(k,m.edges,g,T.nodes)},v=new Set(Object.keys(s.nodePositions).filter(h=>!c[h])),I=h=>{Ct(s.nodePositions,b.nodes,T.nodes,h),Ct(k,b.routes,T.routes,h),H(e)&&e.setMorphFrame(h<1&&v.size>0?{layout:s,ids:v,alpha:h}:void 0)};I(0),r=Sr(I,()=>H(e)&&e.layoutResult===s,()=>{r=void 0})},finishMorph:a,moveNode(i,p,s){a();let c=e.layoutResult?.nodePositions;if(c?.[i]){for(let m of c[i])m.x+=p,m.y+=s;o()}},scheduleViewportDirty:t}});var ye=JBrowseExports["@jbrowse/core/util/unzip"],Ua=e=>ye!=null&&e in Object(ye)?ye[e]:Object.assign(function(){throw new Error("This JBrowse does not provide '"+e+"' from '@jbrowse/core/util/unzip' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse")},{jbrowseHostMissing:e}),On=Ua("unzip"),Oc=ye&&ye.__esModule?ye.default:ye;async function Wt(e){let t=e[0]===31&&e[1]===139;return new TextDecoder().decode(t?await On(e):e)}function Dn(e,t,o){let r=e.walks,n=r.offsets[1]??0,a={nodes:e.nodes,links:e.links,walks:{names:r.names.slice(0,1),starts:r.starts.subarray(0,1),ends:r.ends.subarray(0,1),offsets:Int32Array.of(0,n),steps:r.steps.subarray(0,n),reversed:r.reversed.subarray(0,n)}},i=Ye(a,t,{referencePath:o}),p=new Int32Array(e.nodes.names.length);for(let c of r.steps)p[c]++;i.nodes.forEach((c,m)=>{c.depth=Math.max(p[m],1)});let s=r.names.slice(1).flatMap((c,m)=>r.offsets[m+2]>r.offsets[m+1]?[{...yt(r,m+1),nodeIds:[]}]:[]);return i.paths=[...i.paths??[],...s],i}var Xa=jn.views(e=>({get engineSettings(){return rr({engine:e.layoutEngine,quality:e.layoutQuality,linearLayout:e.linearLayout,bubbleSpread:e.bubbleSpread,showDeletionEdges:e.showDeletionEdges})}})),Wn=Xa.actions(e=>{let t,o,r,n=new WeakMap;function a(u,d){let{rpcManager:l}=R(e);return l.call(ae(e),"GraphComputeLayout",{...u,signal:t?.signal,statusCallback:S=>{d===r&&e.setStatusMessage(bo(S)??"")}})}function*i(u){let d=performance.now(),l=pe.has(e.chosenLayoutMode),S=e.graphRegion,w=l&&S?Cn(u,S):u,f=l&&e.tubeMapFold>0&&!w.reads?Pt(w,e.tubeMapFold):void 0,x=f?.graph??w,G=Y=>l&&e.tubeMapRoutes!=="each"?Ot(Y,e.tubeMapColoring?.valueOf,e.tubeMapRoutes==="bundled"):Y,V=e.walkCut?.walkRowRuns,N=e.chosenLayoutMode==="walkrows"&&V?Wo(u,Io(V),e.graphRegion):F(e.chosenLayoutMode).run(G(x),e.graphRegion,e.host?e.layoutResult?.sampleRows:void 0);if(N){let Y=X=>f&&X.tubeMap?{...X,tubeMap:{...X.tubeMap,coarse:f}}:X,Fe=Y(N),ke=e.tubeMapPanelSplit;return{result:l&&ke?Yr(Fe,Ue(x,ke).map(X=>{let ho=F(e.chosenLayoutMode).run(G(Jr(x,X.paths)),e.graphRegion);return{...X,result:ho&&Y(ho)}})):Fe,duration:performance.now()-d,mode:e.chosenLayoutMode}}let W=e.engineSettings,re=Be.ready(u,W);if(re)return{result:re,duration:performance.now()-d,mode:"force"};let ne={},K=Be.layout(u,W,Y=>a(Y,ne));return r=n.get(K)??ne,n.set(K,r),{...yield K,mode:"force"}}let p=0,s=!1,c,m,k=new Map;function T(){e.graph!==m&&(m=void 0,e.layoutResult=void 0,e.drawnLayoutMode=void 0)}function*g(u){let d=++p;s=!0,r=void 0;let l=()=>e.graph===u&&d===p,S=t?.signal,w;try{if(e.modeDrawsNodes&&u.nodes.length>e.maxGraphNodes)throw new Error(`Graph too large to draw: ${u.nodes.length.toLocaleString()} nodes (limit ${e.maxGraphNodes.toLocaleString()}). Pick Layout \u2192 Walk rows, zoom in to a smaller region, or raise the node limit in Graph settings.`);w=yield*i(u)}catch(x){if(!l()||S?.aborted)return!1;throw c=x,T(),x}finally{d===p&&(s=!1,B())}let f=l();if(f){c!==void 0&&e.error===c&&(e.error=void 0),c=void 0;let x=e.layoutResult,G=e.screenTransform;m=u,e.layoutResult=w.result,e.drawnLayoutMode=w.mode,e.setLayoutMs(w.duration),e.followNewLayout(x),e.morphFrom(x,G)}return f}function b(u,d){let l=u.anchorPaths;return u.anchoredBy==="paths"&&l?(mt(u,e.assemblySpellings(d.assemblyName))??Co(l,d.assemblyName))?.name:void 0}function v(u,d,l,S=!1){let w=e.referencePath||l?.assemblyName,f=typeof u!="string"&&u.walkRowRuns&&!S?Dn(u,d,w):Ye(u,d,{referencePath:w});return f.anchoredBy==="tags"&&!f.referencePath&&f.paths?.length&&l&&(f.referencePath=mt(f,e.assemblySpellings(l.assemblyName))?.name),f}function I(u){e.graph=u?.graph,e.walkCut=u?.walkCut,e.graphRegion=u?.region,e.loadedReferencePath=u?.loadedReferencePath,e.foldedBelowBp=u?.foldedBelowBp,e.readsShown=u?.readsShown,e.indexBubbles=void 0,e.geneTrackFeatures=void 0,e.walkGeneFeatures=void 0,k.clear(),e.repeatArrays=void 0,e.clearInteractionState()}function*h(u,d,l,S=!1,w,f=0,x){let G=t?.signal,V=typeof u!="string"&&u.walkRowRuns?u:void 0,N=v(u,d,l),W=l?b(N,l):void 0,re=!e.referencePath&&W!==void 0&&W!==N.referencePath?De(N,W):N,ne=f>0&&!w?Ft(re,f):re,K=l&&ne!==re?Bn(ne,l,f):ne,ut;if(w){e.setStatusMessage("Reading alignments");try{let{records:U,total:X}=yield w(K);K.reads=U,ut={shown:U.length,total:X}}catch(U){if(G?.aborted)return;console.warn("[GraphGenomeView] no reads for this graph",U)}if(G?.aborted)return}let Y=S?e.selectedNode:null;I({graph:K,walkCut:V,region:l,loadedReferencePath:W,foldedBelowBp:ne===re?void 0:f,readsShown:ut});let Fe=new Set(K.nodes.map(U=>U.name));e.openBubbles=e.openBubbles.filter(U=>At(U).some(X=>Fe.has(X))),Y!==null&&K.nodes.some(U=>U.id===Y)&&(e.selectedNode=Y),e.setStatusMessage("Computing layout");let ke=x?.();ke?.catch(()=>{}),yield*g(K),ke&&!G?.aborted&&(e.setStatusMessage("Reading annotations"),yield ke)}let y=0,P;function J(){let u=++y;return t?.abort(),t=new AbortController,P=u,e.loadCanceled=!1,{isLive:()=>u===y,signal:t.signal}}function B(){P===void 0&&!s&&e.finishLoading()}function He(){P=void 0,B()}function*ao(u,d){let l=J();e.isLoading=!0,e.error=void 0;try{yield*d(l)}catch(S){l.isLive()&&(console.error(`[GraphGenomeView.${u}]`,S),e.error=S)}finally{l.isLive()&&He()}}function*io(u,d,l,S){try{return yield R(e).rpcManager.call(ae(e),"CoreGetFeatures",{adapterConfig:u,regions:[d],signal:S})}catch(w){console.warn(`[GraphGenomeView] no ${l} for this graph`,w);return}}function*Ma(u,d,l,S,w=0){let f=lr(u);if(u.type!=="RgfaTabixAdapter"||f===void 0)return;let x=yield*io({type:"MinigraphBubbleAdapter",uri:`${f}.bubbles.bed.gz`,baseUri:u.baseUri,assemblyNameToPanSN:u.assemblyNameToPanSN},d,"bubble index",S);x&&l()&&(e.indexBubbles=x.flatMap(G=>{let V=G.get("start"),N=G.get("end"),W=G.get("longestAlleleLength");return Math.max(N-V,W)<w?[]:[{refName:d.refName,start:V,end:N,segmentCount:G.get("segmentCount"),pathCount:G.get("pathCount")??0,inversion:G.get("inversion"),shortestAlleleLength:G.get("shortestAlleleLength"),longestAlleleLength:W,segments:G.get("segments"),shortestAllele:void 0,longestAllele:void 0}]}))}function*so(u,d,l,S){let w=u?e.sessionTrack(u):void 0;if(w)return yield*io(Q(w,"adapter"),d,l,S)}let po={genes:{trackId:()=>e.geneTrack?.trackId,set:u=>{e.geneTrackFeatures=u}},repeats:{trackId:()=>e.repeatTrack?.trackId,set:u=>{e.repeatArrays=u&&Zr(u)}}};function*co(u,d,l,S){let{trackId:w,set:f}=po[u],x=w(),G=yield*so(x,d,u,S);G&&l()&&w()===x&&f(G)}function uo(u,d,l){return["genes","repeats"].map(S=>D(co)(S,u,d,l))}function*mo(u){let d=e.graphRegion;d&&(po[u].set(void 0),yield*co(u,d,()=>e.graphRegion===d))}function*pt(u,d,l){yield*ao("loadWholeGFA",function*({isLive:S,signal:w}){let f=typeof d=="string"?d:yield d(w);S()&&(yield*h(f,u,l,!1,void 0,0,l&&(()=>Promise.all(uo(l,S,w)))))})}function ct(){t?.abort(),t=void 0,P=void 0,y++,p++,s=!1,r=void 0}function ka(){let u=e.walkCut,d=e.graph;if(!u||!d||e.chosenLayoutMode==="walkrows")return d;let l=v(u,d.name,e.graphRegion,!0);return e.graph=l,e.walkCut=void 0,l}function lo(){ct(),e.finishMorph(),e.morphEntering=void 0,e.drawnBatch=Ce,e.paintedViewport=void 0,I(),m=void 0,c=void 0,e.layoutResult=void 0,e.drawnLayoutMode=void 0,e.walkRowSampleTable=void 0,o=void 0,e.openBubbles=[],e.error=void 0,e.isLoading=!1,e.loadCanceled=!1,e.statusMessage="",e.clearPerfMetrics(),e.viewportOwner==="user"&&(e.viewportOwner="fit")}return{clearGraph(){lo()},cancelLoad(){e.canCancelLoad&&(lo(),e.loadCanceled=!0)},stopLoad(){ct(),T(),e.layoutResult||I(),e.isLoading=!1,e.statusMessage="",e.loadCanceled=!0},beforeDestroy(){ct()},loadGFA:D(function*(u,d="Imported GFA"){yield*pt(d,u)}),loadGFAFile:D(function*(u,d){e.setStatusMessage("Reading file"),yield*pt(d,()=>u.arrayBuffer().then(l=>Wt(new Uint8Array(l))))}),loadGFAFromLocation:D(function*(u,d){e.setStatusMessage("Fetching GFA"),yield*pt(ue(u)||"GFA",l=>gt(u,Ge(e).pluginManager).readFile({signal:l}).then(Wt),d)}),cutSubgraph:D(function*(u,d,l={},S=0){yield*ao("cutSubgraph",function*({isLive:w,signal:f}){e.setStatusMessage("Fetching subgraph");let x=performance.now(),G=yield R(e).rpcManager.call(ae(e),"GetSubgraph",{adapterConfig:u,region:d,opts:l,signal:f});if(w()){if(e.setFetchMs(performance.now()-x),!G)throw new Error("Adapter returned no GFA \u2014 region may be outside indexed data or the adapter does not implement getSubgraph");yield*h(G,qo(d),d,!0,wn(u)?V=>R(e).rpcManager.call(ae(e),"GetGraphReads",{adapterConfig:u,nodeNames:V.nodes.map(N=>N.name),signal:f}):void 0,S,()=>Promise.all([l.tier==="coarse"?void 0:D(Ma)(u,d,w,f,e.foldedBelowBp),...uo(d,w,f)]))}})}),reloadRepeats:D(function*(){yield*mo("repeats")}),reloadGenes:D(function*(){yield*mo("genes")}),loadWalkRowSampleTable:D(function*(){let u=e.walkRowSamplesTsv,d=u?JSON.stringify(u):void 0;if(d!==o&&(o=d,e.walkRowSampleTable=void 0,!!u))try{let l=yield gt(u,Ge(e).pluginManager).readFile("utf8");H(e)&&d===o&&(e.walkRowSampleTable=Hr(l))}catch(l){H(e)&&d===o&&(o=void 0,R(e).notify(`Walk rows cannot be grouped: the samples table did not load (${String(l)})`,"warning"))}}),loadWalkGenes:D(function*(){let u=e.walkGeneReads?.reads??[],d=JSON.stringify(u),l=e.graph,S=new Map;yield Promise.all(u.map(({row:w,trackId:f,region:x})=>D(function*(){let G=`${f} ${x.refName}:${x.start}-${x.end}`,V=k.get(G);if(!V){let N=yield*so(f,x,"haplotype genes");if(!N)return;V=Qr(N).map(W=>({...W,refName:x.refName})),k.set(G,V)}S.set(w,V)})())),H(e)&&e.graph===l&&JSON.stringify(e.walkGeneReads?.reads??[])===d&&(e.walkGeneFeatures=u.length?S:void 0)}),toggleBubble(u){let d=e.openBubbles,l=d.findIndex(x=>vt(x,u));if(l>=0){e.openBubbles=d.slice(0,l);return}let S=new Set(At(u));if(!e.graph?.nodes.some(x=>S.has(x.name))){R(e).notify("None of the segments of this bubble are in the cut; widen the graph context to open it","info");return}let w=e.openBubbleInsides,f=w.length-1;for(;f>=0&&!w[f].some(x=>vt(x,u));)f--;e.openBubbles=[...d.slice(0,f+1),u]},closeBubbles(){e.openBubbles.length>0&&(e.openBubbles=[])},recomputeLayout:D(function*(){let u=ka();if(u){e.isLoading=!0,e.setStatusMessage("Computing layout");try{yield*g(u)}catch(d){console.error("[GraphGenomeView.recomputeLayout]",d),e.error=d}}})}});function Ka(e){return $(e)&&typeof e.get=="function"}function qa(e){let t=Ka(e)?e.get("name"):$(e)?e.name:void 0;return typeof t=="string"?t:void 0}function _n(e){let t;if($(e)&&$(e.hoverPosition)){let{refName:o,coord:r,coord0:n,assemblyName:a}=e.hoverPosition;typeof o=="string"&&typeof r=="number"&&(t={refName:o,coord:typeof n=="number"?n:r-1,assemblyName:typeof a=="string"?a:void 0,featureName:qa(e.hoverFeature)})}return t}function zn(e,t){return(e.assemblyName===void 0||e.assemblyName===t.assemblyName)&&e.refName===t.refName&&e.coord>=t.start&&e.coord<t.end}function $n({hover:e,nodes:t}){let o,r;for(let n of t)n.name===e.featureName?o=n.id:r===void 0&&j(n)&&e.coord>=n.stable.start&&e.coord<n.stable.start+n.length&&(r=n.id);return o??r??null}var Za=/^(.+) HP(\d+)$/,Qa=/^(.+)\.(\d+)$/;function ei(e){let t=Za.exec(e),o=Qa.exec(e);return[...t?[{sample:t[1],haplotype:String(Number(t[2])+1)}]:[],...o?[{sample:o[1],haplotype:o[2]}]:[],{sample:e,haplotype:void 0}]}function ti(e){return ie(e).name.split("#")[1]}function Jn(e,t){let o=t.map(r=>r.name);for(let{sample:r,haplotype:n}of ei(e)){let a=o.filter(i=>ko(ie(i).name)===r&&(n===void 0||ti(i)===n));if(a.length>0)return a}return[]}var Yn=Wn.actions(e=>({startRenderingBackend(t){if(!e.autorunsInstalled){L(e,ve(()=>{e.fittedTransform&&se(()=>e.viewportOwner==="fit")&&e.zoomToFit()})),L(e,C(()=>`${e.viewBox.width} ${e.viewBox.height}`,()=>{e.keepDrawingInView()})),L(e,C(()=>{let r=e.facetGrid;return r?`${e.facetSetting.field} ${e.facetPanels?.length} ${r.columns}`:""},()=>{e.refitView()})),L(e,C(()=>({graph:e.graph,reads:JSON.stringify(e.walkGeneReads?.reads??[])}),()=>{e.loadWalkGenes()},{fireImmediately:!0,equals:(r,n)=>r.graph===n.graph&&r.reads===n.reads})),L(e,C(()=>e.hasGraph&&(e.chosenLayoutMode==="walkrows"||pe.has(e.chosenLayoutMode))?JSON.stringify(e.walkRowSamplesTsv??null):void 0,r=>{r!==void 0&&e.loadWalkRowSampleTable()},{fireImmediately:!0})),L(e,C(()=>`${e.fitPadTop} ${e.layoutBounds?.h} ${e.usableHeight}`,()=>{e.viewportOwner==="host"&&e.zoomToFit()})),L(e,ve(()=>{let r=_n(R(e).hovered),n=e.hoverLightsEverything;se(()=>{let a=e.graphRegion,i=e.graph,p=r&&a&&zn(r,a)?r:void 0,s=p?.featureName&&i?.paths?Jn(p.featureName,i.paths):[];a&&i&&!e.pointerInPane&&e.setHoveredNode(p&&n&&s.length===0?$n({hover:p,nodes:i.nodes}):null),e.setHoveredRowWalks(s)})})),L(e,C(()=>`${e.scale}-${e.translateX}-${e.translateY}`,()=>{e.clearHover()},{name:"GraphClearHoverOnViewportChange"}));let o=!0;L(e,ve(()=>{let{scale:r}=e,n=yr(e);if(o){o=!1;return}let a=se(()=>e.builtViewport);a?.scale===r&&ir(a.bounds,n)||e.scheduleViewportDirty()})),L(e,ve(()=>{let r=e.currentRenderingBackend;r&&(e.applySelection(r),e.renderNow())}))}e.attachRenderingBackend(t,()=>({upload:o=>{if(Lt(Ke()),o.resize(e.paneWidth,e.canvasHeight),e.layoutResult?.tubeMap||e.facetPanels)return Lt(e.viewportDirty),o.uploadGeometry(Ce),e.setGeometryMetrics(0,Ce,{scale:se(()=>e.scale),bounds:se(()=>e.viewportToBuild())}),!0;let r=performance.now(),n=e.buildDrawing(e.drawnHighlight,e.effectiveDrawPaths);return n?(o.uploadGeometry(n.batch),e.setGeometryMetrics(performance.now()-r,n.batch,{scale:se(()=>e.scale),bounds:n.viewportBounds}),!0):!1},render:o=>e.nodePositions?(e.paint(o),e.markPainted(),!0):!1,releaseTargets:o=>{o.releaseOffscreenTargets()}}))}})).actions(e=>({relayoutFrom(t){return e.recomputeLayout()}})).actions(e=>({relayout(t){return e.handledLayoutMode=e.chosenLayoutMode,e.relayoutFrom(t)}})).actions(e=>({switchLayout(t){let o=e.chosenLayoutMode;return e.setLayoutMode(t),e.relayout(o)},retryLoad(){},afterAttach(){e.isDefaultViewport||(e.viewportOwner="user");for(let[t,o]of[[()=>e.geneTrack?.trackId,()=>e.reloadGenes()],[()=>e.repeatTrack?.trackId,()=>e.reloadRepeats()]])L(e,C(()=>({track:t(),region:e.graphRegion}),(r,n)=>{r.region&&r.region===n.region&&o()},{equals:(r,n)=>r.track===n.track&&r.region===n.region}));L(e,C(()=>e.chosenLayoutMode,(t,o)=>{t!==e.handledLayoutMode&&e.relayout(o)})),L(e,C(()=>({mode:e.chosenLayoutMode,engine:JSON.stringify(e.engineSettings),maxNodes:e.maxGraphNodes}),(t,o)=>{e.graph&&t.mode===o.mode&&(t.engine!==o.engine&&e.usesLayoutEngine||t.maxNodes!==o.maxNodes&&e.modeDrawsNodes)&&e.recomputeLayout()},{equals:(t,o)=>t.mode===o.mode&&t.engine===o.engine&&t.maxNodes===o.maxNodes})),L(e,C(()=>pe.has(e.chosenLayoutMode)?JSON.stringify({fold:e.tubeMapFold,facet:e.facetSetting,groupBy:e.walkRowGroupBy,table:e.walkRowGroupBy&&e.walkRowSampleTable?.length,routes:e.tubeMapRoutes,bundledBy:e.tubeMapRoutes!=="each"?e.tubeMapColoring?.field:void 0}):void 0,(t,o)=>{t!==void 0&&o!==void 0&&e.graph&&e.recomputeLayout()}))}})).actions(e=>({switchForceEngine(t){return e.setLayoutEngine(t),e.chosenLayoutMode==="force"?void 0:e.switchLayout("force")}}));var oi="FeatureTrack";function Un({session:e,assemblyName:t,first:o}){let r=Pe(e,t),n=[];for(let a of e.tracks){let i=Q(a,"trackId");Q(a,"type")===oi&&typeof i=="string"&&i!==o&&Je(e,a).includes(r)&&n.push(i)}return o?[o,...n]:n}var Xn=_(A("path",{d:"M9.19 6.35c-2.04 2.29-3.44 5.58-3.57 5.89L2 10.69l4.05-4.05c.47-.47 1.15-.68 1.81-.55zM11.17 17s3.74-1.55 5.89-3.7c5.4-5.4 4.5-9.62 4.21-10.57-.95-.3-5.17-1.19-10.57 4.21C8.55 9.09 7 12.83 7 12.83zm6.48-2.19c-2.29 2.04-5.58 3.44-5.89 3.57L13.31 22l4.05-4.05c.47-.47.68-1.15.55-1.81zM9 18c0 .83-.34 1.58-.88 2.12C6.94 21.3 2 22 2 22s.7-4.94 1.88-6.12C4.42 15.34 5.17 15 6 15c1.66 0 3 1.34 3 3m4-9c0-1.1.9-2 2-2s2 .9 2 2-.9 2-2 2-2-.9-2-2"}),"RocketLaunch");function nt(e,t){Vo(e,t);let o=e.find(r=>"subMenu"in r&&r.label===No);o&&!o.icon&&(o.icon=Xn)}var ri="SyntenyTrack",ni="Synteny adapters";function ai(e){if(Q(e,"type")===ri)return!0;let t=e.adapter?.type;if(typeof t!="string"||!To(e))return!1;let{pluginManager:o}=Ge(e);return!!o?.hasAdapterType(t)&&o.getAdapterType(t).adapterMetadata?.category===ni}function Kn(e,t){let o=new Set(t),r=[];for(let n of e.tracks){let a=Q(n,"trackId");if(ai(n)&&typeof a=="string"){let i=Je(e,n).filter(p=>o.has(p)).length;i>=2&&r.push({trackId:a,name:Eo(n,e),coverage:i})}}return r.sort((n,a)=>a.coverage-n.coverage)}function qn(e,t,o="image/svg+xml"){let r=URL.createObjectURL(new Blob([e],{type:o})),n=document.createElement("a");n.href=r,n.download=t,n.click(),setTimeout(()=>{URL.revokeObjectURL(r)},0)}var Zn=[["fmmm","FMMM"],["stress","stress"]],_t=e=>e.label.replace(/ layout$/,"");function q(e,t,o){return e.map(({value:r,label:n,disabled:a})=>({type:"radio",label:n,disabled:a,checked:r===t,onClick:()=>{o(r)}}))}var Qn=Yn.actions(e=>({showInLinearView(t){let o=R(e),r=t.assembly===e.graphRegion?.assemblyName,n=Zo({session:o,location:t.location,assembly:t.assembly,connectedViewId:e.pairedViewId,tracks:Un({session:o,assemblyName:t.assembly,first:r?e.sourceTrackId:void 0})});r&&e.pairWithLinearView(n)},highlightInLinearView(t){Qo({session:R(e),location:t.location,assembly:t.assembly,connectedViewId:e.pairedViewId})},showSyntenyView(t){er({session:R(e),contributors:e.launchableAssemblies,trackId:t,graphTrackId:e.sourceTrackId})}})).views(e=>({get syntenyLaunchTracks(){let t=e.launchableAssemblies.map(o=>o.sample);return t.length>=2?Kn(R(e),t):[]}})).views(e=>({walkRowSampleMenuItems(){let{disagreeing:t}=e.walkRowSampleChoices,o=e.walkRowSamples,r=n=>n.join(`
|
|
4
4
|
`)===o?.join(`
|
|
5
5
|
`);return[{type:"radio",label:"Every sample",checked:o===void 0,onClick:()=>{e.setWalkRowSamples(void 0)}},...t.length>0?[{type:"radio",label:"Where walk and call disagree",checked:r(t),onClick:()=>{e.setWalkRowSamples(t)}}]:[],{type:"radio",label:"Choose samples...",checked:o!==void 0&&!r(t),onClick:()=>{R(e).queueDialog(n=>[pr,{model:e,onClose:n}])}}]},walkRowGroupMenuItems(){let t=e.walkRowGroups?e.walkRowGroupBy?.field:void 0;return q([{value:void 0,label:"None"},...e.walkRowGroupFields.map(o=>({value:o,label:o}))],t,o=>{e.setWalkRowGroupBy(o===void 0?void 0:{field:o})})},tubeMapPanelMenuItems(){let{graph:t,walkRowSampleTable:o}=e,{field:r}=e.facetSetting,n=r===""?e.walkRowGroupBy?.field:void 0,a=i=>!!t&&Ue(t,i).length>1;return[...q(Or.map(i=>({value:i.field,label:i.label,disabled:i.field!==""&&!a({by:i.field})})),n?void 0:r,i=>{e.setFacet(i),i===""&&e.setWalkRowGroupBy(void 0)}),...q(e.walkRowGroupFields.map(i=>({value:i,label:`By ${i}`,disabled:!o||!a({by:"column",field:i,table:o})})),n,i=>{e.setFacet(""),e.setWalkRowGroupBy({field:i})})]},layoutOptionMenuItems({repeat:t=!0}={}){return[...pe.has(e.chosenLayoutMode)?[{label:"Fold variants",subMenu:q(mr.map(({bp:o,label:r})=>({value:o,label:r,disabled:o>0&&e.graph?.reads!==void 0})),e.graph?.reads?0:e.tubeMapFold,e.setTubeMapFold)},{label:"Panels",subMenu:this.tubeMapPanelMenuItems()},{label:"Routes",subMenu:q(gr,e.tubeMapRoutes,e.setTubeMapRoutes)},...e.walkRowGroupFields.length>0?[{label:"Tube color",subMenu:q(["",...e.walkRowGroupFields].map(o=>({value:o,label:o?`By ${o}`:"By role"})),e.tubeMapColorBy,e.setTubeMapColorBy)}]:[]]:[],...t&&e.chosenLayoutMode==="walkrows"&&e.repeatChoices.length>0?[{label:"Repeat",subMenu:q(e.repeatOptions,e.selectedRepeat?.key??"",e.setRepeatKey)}]:[],...e.chosenLayoutMode==="walkrows"&&e.walkRowBars?[{label:"Samples",subMenu:this.walkRowSampleMenuItems()}]:[],...e.chosenLayoutMode==="walkrows"&&e.walkRowBars&&e.walkRowGroupFields.length>0?[{label:"Group by...",subMenu:this.walkRowGroupMenuItems()}]:[]]},showMenuItems(){let t=(o,r)=>({type:"checkbox",label:o,checked:e.layerSet.has(r),onClick:()=>{e.setLayer(r,!e.layerSet.has(r))}});return[t("Show bubble halos","bubbles"),t("Show deletion edges","deletions"),{label:"Hover highlight",subMenu:q(Te.map(o=>({value:o,label:o[0].toUpperCase()+o.slice(1)})),e.chosenHover,e.setHover)},t("Show genes on the backbone","genes"),...e.referenceStripApplies?[t("Show reference strip","referenceStrip")]:[]]},exportMenuItems(){return[{label:"Export SVG",icon:Gn,disabled:e.figureUnavailable!==void 0,disabledHelpText:e.figureUnavailable,onClick:()=>{let t=e.figure();t&&qn(t,`${(e.graph?.name??"graph").replaceAll(/[^\w.-]+/g,"_")}.svg`)}},{label:"Copy figure spec",icon:xn,disabled:e.figureSpecUnavailable!==void 0,disabledHelpText:e.figureSpecUnavailable,onClick:()=>{let t=e.figureSpec(),o=R(e);navigator.clipboard.writeText(`${JSON.stringify(t,null,2)}
|
|
6
|
-
`).then(()=>{o.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(r=>{o.notify(`Could not copy the figure spec: ${String(r)}`)})}}]},highlightMenuItems({picks:t=!0}={}){let o=t?e.walkChoices:[];if(e.walkChoices.length===0||!e.liftsWalks||!t&&e.walkLayers.length===0)return[];let r=a=>e.walkLayers.some(i=>i.walk===a),n=o.length>dr;return[{type:"subHeader",label:"Highlight"},...n?[{label:"Choose haplotypes...",onClick:()=>{R(e).queueDialog(a=>[cr,{model:e,onClose:a}])}}]:[],...(n?o.filter(a=>r(a.name)):o).map(a=>({type:"checkbox",label:a.label,checked:r(a.name),onClick:()=>{e.toggleWalk(a.name)}})),{label:"Clear highlights",disabled:e.walkLayers.length===0,onClick:()=>{e.setWalkLayers([])}},...e.drawnWalks.length>0?[{label:"Color highlighted...",onClick:()=>{R(e).queueDialog(a=>[ur,{model:e,onClose:a}])}}]:[],...e.walkLayers.length>1&&e.modeDrawsNodes?[{type:"subHeader",label:"Arrange"},...q(tr.map(({value:a,label:i})=>({value:a,label:a==="walk"?"A panel per haplotype":i})),e.facetSetting.field,e.setFacet)]:[]]},colorSchemeLabel(t){let o=Tt.find(r=>r.value===t)?.label??t;return t==="auto"?`${o} (${this.colorSchemeLabel(e.effectiveColorScheme)})`:o},graphMenuItems(){let t=this.layoutOptionMenuItems(),o=F(e.chosenLayoutMode),r=Zn.find(([n])=>n===e.layoutEngine)[1];return[{label:`Layout: ${_t(o)}${o.value==="force"?` (${r})`:""}`,icon:Rn,subMenu:[..._o.flatMap(n=>{let a={type:"radio",disabled:e.graph?!n.available(e.graph):!1,disabledHelpText:n.description};return n.value==="force"?Zn.map(([i,p])=>({...a,label:`${_t(n)} (${p})`,checked:e.chosenLayoutMode===n.value&&e.layoutEngine===i,onClick:()=>{e.switchForceEngine(i)}})):[{...a,label:_t(n),checked:e.chosenLayoutMode===n.value,onClick:()=>{e.switchLayout(n.value)}}]}),...t.length>0?[{type:"divider"},...t]:[],...e.hostPlacesX?[]:[{type:"divider"},{label:"Zoom to fit",onClick:()=>{e.refitView()}}]]},{label:`Color: ${e.colorSchemeLock?.value??this.colorSchemeLabel(e.chosenColorScheme)}`,icon:Tn,disabled:e.colorSchemeLock!==void 0,disabledHelpText:e.colorSchemeLock?.why,subMenu:q(Tt.map(({value:n})=>({value:n,label:this.colorSchemeLabel(n)})),e.chosenColorScheme,e.setColorScheme)},{label:"Show...",icon:or,subMenu:this.showMenuItems()}]},launchMenuItems(){let t=[],o=e.launchableAssemblies,r=e.graphRegion?.assemblyName;for(let n of nn({contributors:o,linearContributors:e.host?o.filter(a=>a.sample!==r):o,syntenyTracks:e.syntenyLaunchTracks,onShowLinear:a=>{e.showInLinearView(a)},onShowSynteny:a=>{e.showSyntenyView(a)}}))nt(t,n);return t}}));var at=Qn.views(e=>({get trackHaplotypes(){let t=e.sourceAdapter;return t&&Ae(t)}})).views(e=>({get cutHaplotypes(){return e.subgraphHaplotypes??e.trackHaplotypes},offReference(t){let o=e.sourceTrack,r=o&&Xo(o),n=R(e);return r===void 0?void 0:Ko(Pe(n,r),Pe(n,t.assemblyName))},cutChangedFrom(t){let o=$o(F(t),{walkStrip:e.walkStrip,host:!!e.host});return e.cutsWholeWalks!==o||t==="walkrows"!=(e.chosenLayoutMode==="walkrows")}})).views(e=>({get cutOptions(){return{hops:e.subgraphContext,haplotypes:e.cutHaplotypes,...e.chosenLayoutMode==="walkrows"?{walkRows:!0}:{},...e.cutsWholeWalks?{snarls:"overlapping"}:{}}}}));function zt(){return M.compose("GraphGenomeView",Sn,at,M.model({type:M.literal("GraphGenomeView"),gfaLocation:M.maybe(M.frozen()),loadedRegion:M.maybe(M.frozen()),loadedTrackId:M.optional(M.string,""),layoutMode:kt(ze),color:M.maybe(M.frozen()),size:M.maybe(M.frozen()),layers:M.maybe(M.frozen()),facet:M.maybe(M.frozen()),rows:M.maybe(M.frozen()),hover:kt(Te)})).views(e=>({get grammar(){return{layoutMode:e.layoutMode,color:e.color,size:e.size,layers:e.layers,facet:e.facet,rows:e.rows,hover:e.hover}}})).actions(e=>({writeGrammar(t){Object.assign(e,t)}})).volatile(()=>({widthMeasured:!1})).actions(e=>{let t=e.setWidth;return{setWidth(o){t(o),e.widthMeasured=!0}}}).views(e=>({get rpcSessionId(){return e.id},get paneWidth(){return e.width},get paneMeasured(){return e.widthMeasured},get sourceGfaLocation(){return e.gfaLocation},get sourceTrack(){return e.loadedTrackId?e.sessionTrack(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.exportMenuItems(),...e.launchMenuItems()]}})).actions(e=>{let t=e.clearGraph;function o(r){if(e.gfaLocation)return e.displayName||e.setDisplayName(ue(e.gfaLocation)),e.loadGFAFromLocation(e.gfaLocation,r);if(!e.loadedTrackId||!r)return;let n=e.sourceAdapter,a=r.end-r.start,i=e.offReference(r);if(!n)e.setError(new Error(`The track this graph was cut from, "${e.loadedTrackId}", is not in this session`));else if(i)e.setError(new Error(i));else if(a>e.maxRegionBp)e.setError(new Error(`Region too large (${ce(a)}) \u2014 zoom in to view graph (max ${ce(e.maxRegionBp)})`));else return e.cutSubgraph(n,r,e.cutOptions)}return{clearGraph(){t(),e.gfaLocation&&e.displayName===ue(e.gfaLocation)&&(e.displayName=void 0),e.gfaLocation=void 0,e.loadedRegion=void 0,e.loadedTrackId=""},load(){let r=e.loadedRegion,n=R(e),{assemblyManager:a}=n,i=r&&a.has(r.assemblyName)?a.get(r.assemblyName):void 0;return r&&i?.initialized===!1?a.waitForAssembly(r.assemblyName).catch(()=>{}).then(()=>e.loadedRegion===r?o(Rt(n,r)):void 0):o(r&&Rt(n,r))}}}).actions(e=>({retryLoad(){e.load()},setGfaLocation(t){e.gfaLocation=t},relayoutFrom(t){return e.loadedTrackId&&e.cutChangedFrom(t)?e.load():e.recomputeLayout()},async openGfaLocation(t){await e.loadGFAFromLocation(t),H(e)&&e.hasGraph&&(this.setGfaLocation(t),e.displayName||e.setDisplayName(ue(t)))},afterAttach(){e.graph||e.load(),L(e,C(()=>e.walkStrip,()=>{e.loadedTrackId&&!F(e.chosenLayoutMode).wholeWalks&&e.load()}))}}))}var ii=kn()({});function $t(e){e.addViewType(()=>new Mn({name:"GraphGenomeView",displayName:"Graph genome view",stateModel:zt(),launchKeys:ii,ReactComponent:ee(()=>import("./chunks/GraphGenomeView-WJ3FIDY2.js"))}))}var Jt=["MultiWaySyntenyDisplay","LinearSyntenyDisplay","DotplotDisplay","ChordSyntenyDisplay"];function si(e){let t=e.getElementTypesInGroup("display"),o=n=>t.find(a=>a.name===n),r=n=>n&&Object.assign(Object.create(n),{adapterCapabilities:["headerLanes"]});return[o("LinearGraphDisplay"),o("LinearBasicDisplay"),...Jt.map(n=>r(o(n)))].filter(n=>n!==void 0)}function Yt(e){e.addTrackType(()=>{let t=O("GraphTrack",{},{baseConfiguration:yn(e),explicitIdentifier:"trackId"}),o=new gn({name:"GraphTrack",displayName:"Pangenome graph track",configSchema:t,stateModel:bn(e,"GraphTrack",t)});for(let r of si(e))o.addDisplayType(r);return o})}function Ut(e){e.addToExtensionPoint("LaunchView-GraphGenomeView",t=>{let{session:o,...r}=t;return o.addView("GraphGenomeView",r),t})}var it=JBrowseExports["@jbrowse/core/pluggableElementTypes/DisplayType"];var ea=it&&it.__esModule?it.default:it;var be=JBrowseExports["@jbrowse/display-kit/trackHeightConfigSchemaFields"],pi=e=>be!=null&&e in Object(be)?be[e]:Object.assign(function(){throw new Error("This JBrowse does not provide '"+e+"' from '@jbrowse/display-kit/trackHeightConfigSchemaFields' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse")},{jbrowseHostMissing:e}),ta=pi("trackHeightConfigSchemaFields"),em=be&&be.__esModule?be.default:be;function oa(){return O("LinearGraphDisplay",{layoutMode:{type:"stringEnum",model:M.enumeration("LayoutMode",ze),defaultValue:"auto"},color:{type:"frozen",defaultValue:{},plot:!0},size:{type:"frozen",defaultValue:{field:"depth",value:6},plot:!0},layers:{type:"frozen",defaultValue:{},plot:!0},facet:{type:"frozen",defaultValue:{},plot:!0},rows:{type:"frozen",defaultValue:{},plot:!0},hover:{type:"stringEnum",model:M.enumeration("HoverHighlight",Te),defaultValue:"nodes"},...ta({defaultHeight:300,height:"the height of the track the graph is drawn in"})},{explicitlyTyped:!0,explicitIdentifier:"displayId"})}var fe=JBrowseExports["@jbrowse/core/svg/svgReady"],ci=e=>fe!=null&&e in Object(fe)?fe[e]:Object.assign(function(){throw new Error("This JBrowse does not provide '"+e+"' from '@jbrowse/core/svg/svgReady' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse")},{jbrowseHostMissing:e});var ra=ci("computeSvgReady");var pm=fe&&fe.__esModule?fe.default:fe;var st=JBrowseExports["@jbrowse/display-kit/TrackHeightMixin"];var na=st&&st.__esModule?st.default:st;var we=JBrowseExports["@jbrowse/display-kit/plotMenu"],ui=e=>we!=null&&e in Object(we)?we[e]:Object.assign(function(){throw new Error("This JBrowse does not provide '"+e+"' from '@jbrowse/display-kit/plotMenu' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse")},{jbrowseHostMissing:e}),aa=ui("editPlotMenuItems");var dm=we&&we.__esModule?we.default:we;var Me=JBrowseExports["@jbrowse/render-core/displayPhase"],ia=e=>Me!=null&&e in Object(Me)?Me[e]:Object.assign(function(){throw new Error("This JBrowse does not provide '"+e+"' from '@jbrowse/render-core/displayPhase' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse")},{jbrowseHostMissing:e}),sa=ia("computeActivityPhase");var pa=ia("computeDisplayStatusPhase"),lm=Me&&Me.__esModule?Me.default:Me;function Xt(e,t){if(e?.refName!==t.refName||e.assemblyName!==t.assemblyName)return!1;let o=e.end-e.start;return t.end-t.start>=o&&t.end>e.start-o&&t.start<e.end+o}var di=new Set(["scale","translateX","translateY"]);function mi(e){return Object.fromEntries(Object.keys(br.properties).filter(t=>!di.has(t)).map(t=>[t,e[t]]))}var Kt=10;function li(e){let{aboveBpPerPx:t,foldBelowBp:o}=e??{};return typeof t=="number"?t:typeof o=="number"&&o>0?o/Kt:void 0}var hi=ee(()=>import("./chunks/GraphTrackSettingsDialog-ZW7ALMDV.js"));function ca(e){return M.compose("LinearGraphDisplay",mn,na(),at,M.model({type:M.literal("LinearGraphDisplay"),configuration:xo(e),layoutEngine:zo(jo,"stress"),cutRegion:M.maybe(M.frozen()),coarseCut:M.optional(M.boolean,!1)})).volatile(()=>({recuts:0,settledWindow:void 0,dense:void 0,haplotypeNames:void 0,cutFoldBp:0})).views(t=>({get grammar(){return{layoutMode:Z(t,"layoutMode"),color:Z(t,"color"),size:Z(t,"size"),layers:Z(t,"layers"),facet:Z(t,"facet"),rows:Z(t,"rows"),hover:Z(t,"hover")}},get drawsGenomicCoordinates(){return t.layoutResult===void 0||t.hostPlacesX},get canvasHeight(){return t.height},get canRetryLoad(){return t.cutRegion!==void 0},get trackHaplotypes(){let o=t.sourceAdapter,r=t.sourceTrack;return(o&&Ae(o))??(r&&St(r))},get coarseAboveBpPerPx(){return li(t.sourceAdapter?.coarse)}})).views(t=>({tierAt(o){let r=t.coarseAboveBpPerPx;return r!==void 0&&o>r?"coarse":"fine"},capFor(o){return o==="coarse"?1/0:t.maxRegionBp},foldDrifted(o){let r=Kt*o,n=t.cutFoldBp;return!t.graph?.paths?.length&&(r>=2*Math.max(n,1)||t.foldedBelowBp!==void 0&&r<=n/2)},get cutTier(){return t.coarseCut&&t.coarseAboveBpPerPx!==void 0?"coarse":"fine"}})).views(t=>({get settledCapBp(){let o=t.settledWindow;return o?t.capFor(t.tierAt(o.bpPerPx)):1/0}})).views(t=>({get regionTooLarge(){let o=t.settledWindow;return o!==void 0&&o.end-o.start>t.settledCapBp},get regionTooLargeReason(){let o=t.settledWindow;return o?`Region too large for a graph cut (${ce(o.end-o.start)}, max ${ce(t.settledCapBp)})`:""},get zoomCanReleaseGate(){return!0},get fetchCanceled(){return t.loadCanceled}})).views(t=>({get svgReady(){return ra({error:t.error,regionTooLarge:t.regionTooLarge,extraTerminal:!1,fetchCanceled:t.loadCanceled},()=>!t.isLoading&&t.hasGraph&&!!t.layoutResult)}})).views(t=>({get displayPhase(){return pa({regionTooLarge:t.regionTooLarge,error:t.error??t.renderError},()=>sa({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=>({writeGrammar(o){for(let[r,n]of Object.entries(o))Ro(t,r,n)},setSubgraphContext(o){t.subgraphContext=o,t.dense=void 0},setSubgraphHaplotypes(o){t.subgraphHaplotypes=o,t.dense=void 0},setDense(o){t.dense=o},setHaplotypeNames(o){t.haplotypeNames=o},setMaxRegionBp(o){t.maxRegionBp=o},cut(){let o=t.cutRegion,r=t.sourceAdapter;if(!o||!r)return;let n=t.offReference(o);if(n){t.clearGraph(),t.setError(new Error(n));return}let a=t.cutTier==="coarse";return t.cutFoldBp=Math.round(Kt*(t.settledWindow?.bpPerPx??t.host?.bpPerPx??0)),t.cutSubgraph(r,o,{...t.cutOptions,tier:a?"coarse":void 0},t.cutFoldBp)}})).actions(t=>({recutAt(o){let r=t.tierAt(o.bpPerPx);return t.coarseCut=r==="coarse",t.cutRegion=Ur(o,t.capFor(r),F(t.chosenLayoutMode).cutMargins),t.recuts++,t.cut()}})).actions(t=>({settleOn(o){t.settledWindow=o;let r=F(t.chosenLayoutMode).cutMargins;if(t.regionTooLarge||Xt(t.dense,o)||!t.loadCanceled&&t.tierAt(o.bpPerPx)===t.cutTier&&Xr(t.cutRegion,o,r)&&!t.foldDrifted(o.bpPerPx))return!1;let n=t.recutAt(o),a=t.recuts;return Promise.resolve(n).then(()=>{H(t)&&t.recuts===a&&wt(t.error)&&this.refuseDenseCut(o)}),!0},refuseDenseCut(o){t.setDense(o),t.cutRegion=void 0,this.settleOn(t.settledWindow??o)},recut(){t.cutRegion?t.cut():t.settledWindow&&this.settleOn(t.settledWindow)},relayoutFrom(o){let r=t.host?Xe(t.host):void 0;return r&&!t.regionTooLarge&&(t.cutChangedFrom(o)||F(o).cutMargins!==F(t.chosenLayoutMode).cutMargins)?t.recutAt(r):t.recomputeLayout()},retryLoad(){t.cut()},reload(){t.cut()},cancelFetchByUser(){t.stopLoad()}})).actions(t=>({async fetchHaplotypeNames(o,r){try{let n=await R(t).rpcManager.call(ae(t),"GetGraphHaplotypes",{adapterConfig:o,signal:r});H(t)&&!r?.aborted&&t.setHaplotypeNames(n)}catch(n){r?.aborted||console.warn("[LinearGraphDisplay] no haplotype names",n)}}})).actions(t=>({stretchWithHost(o,r){let n=t.layoutBounds;if(!n||!t.followsHostView)return;t.viewportOwner==="fit"&&(t.viewportOwner="user");let a=o.bpPerPx/r.bpPerPx,i=t.translateY+t.scaleY*(n.minY+n.h/2);t.scale*=a,t.translateX=a*(t.translateX+o.offsetPx)-r.offsetPx,t.translateY=i-a*(i-t.translateY)}})).actions(t=>({forceLoad(){let o=t.settledWindow;o&&(t.setMaxRegionBp(Math.ceil(o.end-o.start)),t.settleOn(o))},afterAttach(){t.cutRegion&&!t.graph&&t.cut();let o;L(t,()=>{o?.abort()}),L(t,C(()=>{let n=t.sourceAdapter;return n&&Yo(n)?n:void 0},n=>{o?.abort(),o=void 0,t.setHaplotypeNames(void 0),n&&(o=new AbortController,t.fetchHaplotypeNames(n,o.signal))},{fireImmediately:!0,equals:(n,a)=>JSON.stringify(n)===JSON.stringify(a),name:"GraphHaplotypeNames"})),L(t,C(()=>t.hostPlacesX,n=>{n||t.releaseHost()},{name:"GraphHostPlacesX"})),L(t,C(()=>t.hostFrame,n=>{n&&t.hostTransform(n.scale,n.translateX)},{equals:(n,a)=>n?.scale===a?.scale&&n?.translateX===a?.translateX,fireImmediately:!0,name:"GraphHostFrame"}));let r;L(t,C(()=>t.host&&!t.hostPlacesX?{bpPerPx:t.host.bpPerPx,offsetPx:t.host.offsetPx}:void 0,n=>{let a=r;r=n,n&&a&&n.bpPerPx>0&&t.stretchWithHost(a,n)},{equals:(n,a)=>n?.bpPerPx===a?.bpPerPx&&n?.offsetPx===a?.offsetPx,fireImmediately:!0,name:"GraphHostStretch"})),L(t,C(()=>`${t.facetSetting.field} ${t.facetPlacement?.count}`,()=>{let n=(t.facetGridIn(t.paneCeiling-qe)?.total??0)+qe;(t.facetGrid?.total??0)+qe>t.height&&t.setHeight(Math.max(t.height,Math.ceil(n)))},{name:"GraphFacetHeight"})),L(t,C(()=>t.host?.coarseDynamicBlocks,n=>{let{host:a}=t,i=n&&a?Xe(a):void 0;i&&t.settleOn(i)},{fireImmediately:!0,name:"GraphHostSettle"}))}})).views(t=>({get graphViewSpec(){let o=t.host?Xe(t.host):void 0,r=t.sourceTrackId;if(!o||!r||!t.hasGraph||t.coarseCut||t.regionTooLarge||Xt(t.dense,o))return;let n=Math.floor(o.start),a=Math.ceil(o.end);return{...mi(t),loadedTrackId:r,loadedRegion:{refName:o.refName,assemblyName:o.assemblyName,start:n,end:a},subgraphHaplotypes:t.cutHaplotypes,maxRegionBp:Math.max(t.maxRegionBp,a-n),...t.grammar,layoutMode:t.chosenLayoutMode,connectedViewId:t.host?.id}}})).actions(t=>({openGraphView(){let o=t.graphViewSpec;o&&R(t).addView("GraphGenomeView",o)}})).views(t=>({cutMenuItems(){let o=t.sourceAdapter,r=t.sourceTrack;if(!o||!r||!Uo(o))return[];let n=Ae(o),a=St(r),i=t.haplotypeNames,p=t.subgraphHaplotypes,s=c=>{t.setSubgraphHaplotypes(c),t.recut()};return[{type:"subHeader",label:"Load"},{type:"radio",label:i?`Every haplotype in the graph (${i.length.toLocaleString()})`:"Every haplotype in the graph",checked:p?p.length===0:!n&&!a,onClick:()=>{s([])}},...n||a?[{type:"radio",label:n?"The track's default haplotypes":`The track's ${a?.length} assemblies`,checked:p===void 0,onClick:()=>{s(void 0)}}]:[],{type:"radio",label:"Chosen in Graph settings...",checked:(p?.length??0)>0,onClick:()=>{this.openSettings()}}]},openSettings(){R(t).queueDialog(o=>[hi,{model:t,onClose:o}])},async renderSvg(o){let{renderGraphTrackSvg:r}=await import("./chunks/renderSvg-WD6YDV2I.js");return r(t,o)},trackMenuItems(){let o=t.launchMenuItems();nt(o,{label:"Graph genome view",icon:Qe,disabled:!t.graphViewSpec,disabledHelpText:t.error&&!wt(t.error)?"The track could not cut a graph here":t.isLoading&&!t.hasGraph?"The track is still cutting its graph":"Zoom in until the track cuts a graph",onClick:()=>{t.openGraphView()}});let r=[...this.cutMenuItems(),...t.highlightMenuItems()];return[...r.length>0?[{label:"Haplotypes",icon:sn,subMenu:r}]:[],...t.graphMenuItems(),{label:"Graph settings...",icon:pn,helpText:"Subgraph, drawing and force-directed layout",onClick:()=>{this.openSettings()}},...o,...aa(t)]}}))}function qt(e){e.addDisplayType(()=>{let t=oa();return Object.assign(new ea({name:"LinearGraphDisplay",displayName:"Graph",configSchema:t,stateModel:ca(t),trackType:["GraphTrack","FeatureTrack","SyntenyTrack"],viewType:"LinearGenomeView",ReactComponent:ee(()=>import("./chunks/LinearGraphDisplay-SPOPTJEN.js"))}),{adapterCapabilities:["getSubgraph"]})})}function gi(e){let{uri:t,baseUri:o,csi:r}=e;return typeof t=="string"?{...e,bubblesLocation:{uri:t,baseUri:o},index:Le(t,o,r)}:e}var yi=O("MinigraphBubbleAdapter",{bubblesLocation:E("/path/to/graph.bb.bed.gz"),index:z("MinigraphBubbleIndex","/path/to/graph.bb.bed.gz.tbi"),assemblyNameToPanSN:{type:"frozen",defaultValue:{}}},{explicitlyTyped:!0,preProcessSnapshot:gi}),ua=yi;function Zt(e){e.addAdapterType(()=>new te({name:"MinigraphBubbleAdapter",displayName:"Minigraph bubble BED adapter",configSchema:ua,adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/MinigraphBubbleAdapter-QCOMFPLL.js").then(t=>t.default)}))}function da(e){let{uri:t,baseUri:o,csi:r}=e;return typeof t=="string"?{...e,segmentsLocation:{uri:`${t}.segs.bed.gz`,baseUri:o},segmentsIndex:Le(`${t}.segs.bed.gz`,o,r),linksLocation:{uri:`${t}.links.bed.gz`,baseUri:o},linksIndex:Le(`${t}.links.bed.gz`,o,r)}:e}function bi(e){let{coarse:t,baseUri:o,csi:r}=e;return Oe(da(typeof t=="object"&&t!==null?{...e,coarse:da({baseUri:o,csi:r,...t})}:e))}var fi=O("RgfaTabixCoarseTier",{aboveBpPerPx:{type:"maybeNumber"},foldBelowBp:{type:"maybeNumber"},segmentsLocation:E("/path/to/graph.tier.segs.bed.gz"),segmentsIndex:z("RgfaCoarseSegmentsIndex","/path/to/graph.tier.segs.bed.gz.tbi"),linksLocation:E("/path/to/graph.tier.links.bed.gz"),linksIndex:z("RgfaCoarseLinksIndex","/path/to/graph.tier.links.bed.gz.tbi")}),wi=O("RgfaTabixAdapter",{segmentsLocation:E("/path/to/graph.segs.bed.gz"),segmentsIndex:z("RgfaSegmentsIndex","/path/to/graph.segs.bed.gz.tbi"),linksLocation:E("/path/to/graph.links.bed.gz"),linksIndex:z("RgfaLinksIndex","/path/to/graph.links.bed.gz.tbi"),walksLocation:E(""),walksIndex:z("RgfaWalksIndex"),walkStepBudget:{type:"integer",defaultValue:Se.stepBudget},walkByteBudget:{type:"integer",defaultValue:Se.byteBudget},defaultHaplotypes:{type:"stringArray",defaultValue:[]},assemblyNameToPanSN:{type:"frozen",defaultValue:{}},coarse:fi},{explicitlyTyped:!0,preProcessSnapshot:bi}),ma=wi;function Qt(e){e.addAdapterType(()=>new te({name:"RgfaTabixAdapter",displayName:"Indexed rGFA adapter",configSchema:ma,adapterCapabilities:["getSubgraph"],adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/RgfaTabixAdapter-O3NMNRZ2.js").then(t=>t.default)}))}var Mi=O("WalkTabixSyntenyAdapter",{assemblyNames:{type:"stringArray",defaultValue:[]},walksLocation:E("/path/to/graph.walks.bed.gz"),walksIndex:z("WalkTabixWalksIndex"),walkStepBudget:{type:"integer",defaultValue:Se.stepBudget},walkByteBudget:{type:"integer",defaultValue:Se.byteBudget},defaultHaplotypes:{type:"stringArray",defaultValue:[]},samplesTsvLocation:E(""),assemblyNameToPanSN:{type:"frozen",defaultValue:{}}},{explicitlyTyped:!0,preProcessSnapshot:Oe}),la=Mi;function eo(e){e.addAdapterType(()=>new te({name:"WalkTabixSyntenyAdapter",displayName:"Walk-indexed graph adapter",configSchema:la,adapterCapabilities:["getSubgraph","headerLanes","lanePairsOnAnchor","lanePairBatches"],adapterMetadata:{category:"Synteny adapters"},getAdapterClass:()=>import("./chunks/WalkTabixSyntenyAdapter-I3PY6HJ2.js").then(t=>t.default)}))}var ki=new Set(["RgfaTabixAdapter","GbzBaseSyntenyAdapter"]);function Si(e){return ht(e).toLowerCase().endsWith(".gbz.db")}function xi(e){let t=e.adapter;return t?.type!==void 0&&Kr.has(t.type)&&!t.assemblyNames?.length&&Array.isArray(e.assemblyNames)&&e.assemblyNames.length>0?{...e,adapter:{...t,assemblyNames:e.assemblyNames}}:e}function Ri(e){let t=e.adapter,[o]=Array.isArray(e.assemblyNames)?e.assemblyNames:[],r=t?.type==="RgfaTabixAdapter"&&t.walksLocation?Lo(t.walksLocation):void 0;return o&&r&&r!==o&&t?.assemblyNameToPanSN===void 0?{...e,adapter:{...t,assemblyNameToPanSN:{[o]:r}}}:e}function Ti(e,t,o){let r=n=>Fo({choice:n,loc:e,indexLoc:t,assembly:"",sample:""});if((!o||o==="GbzBaseSyntenyAdapter")&&Si(e))return r("GbzBaseSyntenyAdapter");if(!o||o==="RgfaTabixAdapter"){if(Ho(e))return r("RgfaTabixAdapter");if(ht(e).endsWith(Go)&&(t!==void 0||Po(e)))return r("RgfaTabixWalks")}}function to(e){e.addToExtensionPoint("Core-preProcessTrackConfig",xi),e.addToExtensionPoint("Core-preProcessTrackConfig",Ri),e.addToExtensionPoint("Core-guessAdapterForLocation",t=>(o,r,n)=>Ti(o,r,n)??t(o,r,n)),e.addToExtensionPoint("Core-guessTrackTypeForLocation",t=>(o,r)=>ki.has(o)?"GraphTrack":t(o,r))}function ha(e){let t;if($(e)){let{refName:o,start:r,end:n,assemblyName:a}=e;typeof o=="string"&&typeof r=="number"&&typeof n=="number"&&(t={refName:o,start:r,end:n,assemblyName:typeof a=="string"?a:void 0})}return t}function Gi(e,t,o){let r=e.connectedViewId;return r===void 0||r===t||!o.has(r)}function ga(e,t){return e.assemblyName===void 0||t===void 0||t.includes(e.assemblyName)}function Li(e){return(Array.isArray(e.tracks)?e.tracks:[]).flatMap(o=>$(o)&&Array.isArray(o.displays)?o.displays.filter(r=>$(r)&&r.type==="LinearGraphDisplay"):[])}function ya(e,t,o){let r=[],n=$e(e),a=new Set(n.map(i=>$(i)?i.id:void 0));for(let i of n){if($(i)&&i.id===t)for(let p of Li(i)){let s=ha(p.hoverHighlight);s&&ga(s,o)&&r.push({key:typeof p.id=="string"?p.id:"graph-track",region:s})}if($(i)&&i.type==="GraphGenomeView"&&Gi(i,t,a)){let p=ha(i.hoverHighlight);p&&ga(p,o)&&r.push({key:typeof i.id=="string"?i.id:"graph",region:p})}}return r}var vi=an()(e=>({highlight:{height:"100%",position:"absolute",background:We(e.palette.primary.main,.08),borderLeft:`1px solid ${We(e.palette.primary.main,.4)}`,borderRight:`1px solid ${We(e.palette.primary.main,.4)}`,pointerEvents:"none",zIndex:10}})),Ai=ft(function({model:t,region:o}){let{classes:r}=vi(),n=t.getHighlightCoords(o);return n?A("div",{"data-testid":"graph-node-highlight",className:r.highlight,style:{left:n.left,width:n.width}}):null}),Pi=ft(function({model:t}){let{views:o}=R(t);return A(fo,{children:ya([...o],t.id,t.assemblyNames).map(({key:r,region:n})=>A(Ai,{model:t,region:n},`graph-hover-${r}`))})}),ba=Pi;var Ci="LinearGenomeView-TracksContainerComponent";function oo(e){e.contributeToExtensionPoint(Ci,({model:t})=>A(ba,{model:t},"graphgenomeview-hover-highlight"))}function Bi(e){return e.views(t=>({get adapterConfig(){return qr(t,t.parentTrack.configuration)}}))}function ro(e){e.addToExtensionPoint("Core-extendPluggableElement",t=>(t instanceof ln&&Jt.includes(t.name)&&t.extendStateModel(Bi),t))}var fa="GraphGenomeView";var wa="7.2.1";var no=class extends cn{constructor(){super(...arguments);this.name=fa;this.version=wa}install(o){$t(o),qt(o),Yt(o),Ut(o),oo(o),Qt(o),Zt(o),Et(o),eo(o),Vt(o),to(o),ro(o),o.addRpcMethod(()=>new Ve(o)),o.addRpcMethod(()=>new Ne(o)),o.addRpcMethod(()=>new Ee(o)),o.addRpcMethod(()=>new Ie(o))}configure(o){try{go(o.rootModel)&&o.rootModel.appendToSubMenu(["Add"],{label:"Graph genome view",icon:Qe,onClick:r=>{r.addView("GraphGenomeView",{})}})}catch(r){console.warn("[GraphGenomeView] could not add the Add menu entry",r)}}};export{no as default};
|
|
6
|
+
`).then(()=>{o.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(r=>{o.notify(`Could not copy the figure spec: ${String(r)}`)})}}]},highlightMenuItems({picks:t=!0}={}){let o=t?e.walkChoices:[];if(e.walkChoices.length===0||!e.liftsWalks||!t&&e.walkLayers.length===0)return[];let r=a=>e.walkLayers.some(i=>i.walk===a),n=o.length>dr;return[{type:"subHeader",label:"Highlight"},...n?[{label:"Choose haplotypes...",onClick:()=>{R(e).queueDialog(a=>[cr,{model:e,onClose:a}])}}]:[],...(n?o.filter(a=>r(a.name)):o).map(a=>({type:"checkbox",label:a.label,checked:r(a.name),onClick:()=>{e.toggleWalk(a.name)}})),{label:"Clear highlights",disabled:e.walkLayers.length===0,onClick:()=>{e.setWalkLayers([])}},...e.drawnWalks.length>0?[{label:"Color highlighted...",onClick:()=>{R(e).queueDialog(a=>[ur,{model:e,onClose:a}])}}]:[],...e.walkLayers.length>1&&e.modeDrawsNodes?[{type:"subHeader",label:"Arrange"},...q(tr.map(({value:a,label:i})=>({value:a,label:a==="walk"?"A panel per haplotype":i})),e.facetSetting.field,e.setFacet)]:[]]},colorSchemeLabel(t){let o=Tt.find(r=>r.value===t)?.label??t;return t==="auto"?`${o} (${this.colorSchemeLabel(e.effectiveColorScheme)})`:o},graphMenuItems(){let t=this.layoutOptionMenuItems(),o=F(e.chosenLayoutMode),r=Zn.find(([n])=>n===e.layoutEngine)[1];return[{label:`Layout: ${_t(o)}${o.value==="force"?` (${r})`:""}`,icon:Rn,subMenu:[..._o.flatMap(n=>{let a={type:"radio",disabled:e.graph?!n.available(e.graph):!1,disabledHelpText:n.description};return n.value==="force"?Zn.map(([i,p])=>({...a,label:`${_t(n)} (${p})`,checked:e.chosenLayoutMode===n.value&&e.layoutEngine===i,onClick:()=>{e.switchForceEngine(i)}})):[{...a,label:_t(n),checked:e.chosenLayoutMode===n.value,onClick:()=>{e.switchLayout(n.value)}}]}),...t.length>0?[{type:"divider"},...t]:[],...e.hostPlacesX?[]:[{type:"divider"},{label:"Zoom to fit",onClick:()=>{e.refitView()}}]]},{label:`Color: ${e.colorSchemeLock?.value??this.colorSchemeLabel(e.chosenColorScheme)}`,icon:Tn,disabled:e.colorSchemeLock!==void 0,disabledHelpText:e.colorSchemeLock?.why,subMenu:q(Tt.map(({value:n})=>({value:n,label:this.colorSchemeLabel(n)})),e.chosenColorScheme,e.setColorScheme)},{label:"Show...",icon:or,subMenu:this.showMenuItems()}]},launchMenuItems(){let t=[],o=e.launchableAssemblies,r=e.graphRegion?.assemblyName;for(let n of nn({contributors:o,linearContributors:e.host?o.filter(a=>a.sample!==r):o,syntenyTracks:e.syntenyLaunchTracks,onShowLinear:a=>{e.showInLinearView(a)},onShowSynteny:a=>{e.showSyntenyView(a)}}))nt(t,n);return t}}));var at=Qn.views(e=>({get trackHaplotypes(){let t=e.sourceAdapter;return t&&Ae(t)}})).views(e=>({get cutHaplotypes(){return e.subgraphHaplotypes??e.trackHaplotypes},offReference(t){let o=e.sourceTrack,r=o&&Xo(o),n=R(e);return r===void 0?void 0:Ko(Pe(n,r),Pe(n,t.assemblyName))},cutChangedFrom(t){let o=$o(F(t),{walkStrip:e.walkStrip,host:!!e.host});return e.cutsWholeWalks!==o||t==="walkrows"!=(e.chosenLayoutMode==="walkrows")}})).views(e=>({get cutOptions(){return{hops:e.subgraphContext,haplotypes:e.cutHaplotypes,...e.chosenLayoutMode==="walkrows"?{walkRows:!0}:{},...e.cutsWholeWalks?{snarls:"overlapping"}:{}}}}));function zt(){return M.compose("GraphGenomeView",Sn,at,M.model({type:M.literal("GraphGenomeView"),gfaLocation:M.maybe(M.frozen()),loadedRegion:M.maybe(M.frozen()),loadedTrackId:M.optional(M.string,""),layoutMode:kt(ze),color:M.maybe(M.frozen()),size:M.maybe(M.frozen()),layers:M.maybe(M.frozen()),facet:M.maybe(M.frozen()),rows:M.maybe(M.frozen()),hover:kt(Te)})).views(e=>({get grammar(){return{layoutMode:e.layoutMode,color:e.color,size:e.size,layers:e.layers,facet:e.facet,rows:e.rows,hover:e.hover}}})).actions(e=>({writeGrammar(t){Object.assign(e,t)}})).volatile(()=>({widthMeasured:!1})).actions(e=>{let t=e.setWidth;return{setWidth(o){t(o),e.widthMeasured=!0}}}).views(e=>({get rpcSessionId(){return e.id},get paneWidth(){return e.width},get paneMeasured(){return e.widthMeasured},get sourceGfaLocation(){return e.gfaLocation},get sourceTrack(){return e.loadedTrackId?e.sessionTrack(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.exportMenuItems(),...e.launchMenuItems()]}})).actions(e=>{let t=e.clearGraph;function o(r){if(e.gfaLocation)return e.displayName||e.setDisplayName(ue(e.gfaLocation)),e.loadGFAFromLocation(e.gfaLocation,r);if(!e.loadedTrackId||!r)return;let n=e.sourceAdapter,a=r.end-r.start,i=e.offReference(r);if(!n)e.setError(new Error(`The track this graph was cut from, "${e.loadedTrackId}", is not in this session`));else if(i)e.setError(new Error(i));else if(a>e.maxRegionBp)e.setError(new Error(`Region too large (${ce(a)}) \u2014 zoom in to view graph (max ${ce(e.maxRegionBp)})`));else return e.cutSubgraph(n,r,e.cutOptions)}return{clearGraph(){t(),e.gfaLocation&&e.displayName===ue(e.gfaLocation)&&(e.displayName=void 0),e.gfaLocation=void 0,e.loadedRegion=void 0,e.loadedTrackId=""},load(){let r=e.loadedRegion,n=R(e),{assemblyManager:a}=n,i=r&&a.has(r.assemblyName)?a.get(r.assemblyName):void 0;return r&&i?.initialized===!1?a.waitForAssembly(r.assemblyName).catch(()=>{}).then(()=>e.loadedRegion===r?o(Rt(n,r)):void 0):o(r&&Rt(n,r))}}}).actions(e=>({retryLoad(){e.load()},setGfaLocation(t){e.gfaLocation=t},relayoutFrom(t){return e.loadedTrackId&&e.cutChangedFrom(t)?e.load():e.recomputeLayout()},async openGfaLocation(t){await e.loadGFAFromLocation(t),H(e)&&e.hasGraph&&(this.setGfaLocation(t),e.displayName||e.setDisplayName(ue(t)))},afterAttach(){e.graph||e.load(),L(e,C(()=>e.walkStrip,()=>{e.loadedTrackId&&!F(e.chosenLayoutMode).wholeWalks&&e.load()}))}}))}var ii=kn()({});function $t(e){e.addViewType(()=>new Mn({name:"GraphGenomeView",displayName:"Graph genome view",stateModel:zt(),launchKeys:ii,ReactComponent:ee(()=>import("./chunks/GraphGenomeView-WJ3FIDY2.js"))}))}var Jt=["MultiWaySyntenyDisplay","LinearSyntenyDisplay","DotplotDisplay","ChordSyntenyDisplay"];function si(e){let t=e.getElementTypesInGroup("display"),o=n=>t.find(a=>a.name===n),r=n=>n&&Object.assign(Object.create(n),{adapterCapabilities:["headerLanes"]});return[o("LinearGraphDisplay"),o("LinearBasicDisplay"),...Jt.map(n=>r(o(n)))].filter(n=>n!==void 0)}function Yt(e){e.addTrackType(()=>{let t=O("GraphTrack",{},{baseConfiguration:yn(e),explicitIdentifier:"trackId"}),o=new gn({name:"GraphTrack",displayName:"Pangenome graph track",configSchema:t,stateModel:bn(e,"GraphTrack",t)});for(let r of si(e))o.addDisplayType(r);return o})}function Ut(e){e.addToExtensionPoint("LaunchView-GraphGenomeView",t=>{let{session:o,...r}=t;return o.addView("GraphGenomeView",r),t})}var it=JBrowseExports["@jbrowse/core/pluggableElementTypes/DisplayType"];var ea=it&&it.__esModule?it.default:it;var be=JBrowseExports["@jbrowse/display-kit/trackHeightConfigSchemaFields"],pi=e=>be!=null&&e in Object(be)?be[e]:Object.assign(function(){throw new Error("This JBrowse does not provide '"+e+"' from '@jbrowse/display-kit/trackHeightConfigSchemaFields' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse")},{jbrowseHostMissing:e}),ta=pi("trackHeightConfigSchemaFields"),em=be&&be.__esModule?be.default:be;function oa(){return O("LinearGraphDisplay",{layoutMode:{type:"stringEnum",model:M.enumeration("LayoutMode",ze),defaultValue:"auto"},color:{type:"frozen",defaultValue:{},plot:!0},size:{type:"frozen",defaultValue:{field:"depth",value:6},plot:!0},layers:{type:"frozen",defaultValue:{},plot:!0},facet:{type:"frozen",defaultValue:{},plot:!0},rows:{type:"frozen",defaultValue:{},plot:!0},hover:{type:"stringEnum",model:M.enumeration("HoverHighlight",Te),defaultValue:"nodes"},...ta({defaultHeight:300,height:"the height of the track the graph is drawn in"})},{explicitlyTyped:!0,explicitIdentifier:"displayId"})}var fe=JBrowseExports["@jbrowse/core/svg/svgReady"],ci=e=>fe!=null&&e in Object(fe)?fe[e]:Object.assign(function(){throw new Error("This JBrowse does not provide '"+e+"' from '@jbrowse/core/svg/svgReady' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse")},{jbrowseHostMissing:e});var ra=ci("computeSvgReady");var pm=fe&&fe.__esModule?fe.default:fe;var st=JBrowseExports["@jbrowse/display-kit/TrackHeightMixin"];var na=st&&st.__esModule?st.default:st;var we=JBrowseExports["@jbrowse/display-kit/plotMenu"],ui=e=>we!=null&&e in Object(we)?we[e]:Object.assign(function(){throw new Error("This JBrowse does not provide '"+e+"' from '@jbrowse/display-kit/plotMenu' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse")},{jbrowseHostMissing:e}),aa=ui("editPlotMenuItems");var dm=we&&we.__esModule?we.default:we;var Me=JBrowseExports["@jbrowse/render-core/displayPhase"],ia=e=>Me!=null&&e in Object(Me)?Me[e]:Object.assign(function(){throw new Error("This JBrowse does not provide '"+e+"' from '@jbrowse/render-core/displayPhase' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse")},{jbrowseHostMissing:e}),sa=ia("computeActivityPhase");var pa=ia("computeDisplayStatusPhase"),lm=Me&&Me.__esModule?Me.default:Me;function Xt(e,t){if(e?.refName!==t.refName||e.assemblyName!==t.assemblyName)return!1;let o=e.end-e.start;return t.end-t.start>=o&&t.end>e.start-o&&t.start<e.end+o}var di=new Set(["scale","translateX","translateY"]);function mi(e){return Object.fromEntries(Object.keys(br.properties).filter(t=>!di.has(t)).map(t=>[t,e[t]]))}var Kt=10;function li(e){let{aboveBpPerPx:t,foldBelowBp:o}=e??{};return typeof t=="number"?t:typeof o=="number"&&o>0?o/Kt:void 0}var hi=ee(()=>import("./chunks/GraphTrackSettingsDialog-ZW7ALMDV.js"));function ca(e){return M.compose("LinearGraphDisplay",mn,na(),at,M.model({type:M.literal("LinearGraphDisplay"),configuration:xo(e),layoutEngine:zo(jo,"stress"),cutRegion:M.maybe(M.frozen()),coarseCut:M.optional(M.boolean,!1)})).volatile(()=>({recuts:0,settledWindow:void 0,dense:void 0,haplotypeNames:void 0,cutFoldBp:0})).views(t=>({get grammar(){return{layoutMode:Z(t,"layoutMode"),color:Z(t,"color"),size:Z(t,"size"),layers:Z(t,"layers"),facet:Z(t,"facet"),rows:Z(t,"rows"),hover:Z(t,"hover")}},get drawsGenomicCoordinates(){return t.layoutResult===void 0||t.hostPlacesX},get canvasHeight(){return t.height},get canRetryLoad(){return t.cutRegion!==void 0},get trackHaplotypes(){let o=t.sourceAdapter,r=t.sourceTrack;return(o&&Ae(o))??(r&&St(r))},get coarseAboveBpPerPx(){return li(t.sourceAdapter?.coarse)}})).views(t=>({tierAt(o){let r=t.coarseAboveBpPerPx;return r!==void 0&&o>r?"coarse":"fine"},capFor(o){return o==="coarse"?1/0:t.maxRegionBp},foldDrifted(o){let r=Kt*o,n=t.cutFoldBp;return!t.graph?.paths?.length&&(r>=2*Math.max(n,1)||t.foldedBelowBp!==void 0&&r<=n/2)},get cutTier(){return t.coarseCut&&t.coarseAboveBpPerPx!==void 0?"coarse":"fine"}})).views(t=>({get settledCapBp(){let o=t.settledWindow;return o?t.capFor(t.tierAt(o.bpPerPx)):1/0}})).views(t=>({get regionTooLarge(){let o=t.settledWindow;return o!==void 0&&o.end-o.start>t.settledCapBp},get regionTooLargeReason(){let o=t.settledWindow;return o?`Region too large for a graph cut (${ce(o.end-o.start)}, max ${ce(t.settledCapBp)})`:""},get zoomCanReleaseGate(){return!0},get fetchCanceled(){return t.loadCanceled}})).views(t=>({get svgReady(){return ra({error:t.error,regionTooLarge:t.regionTooLarge,extraTerminal:!1,fetchCanceled:t.loadCanceled},()=>!t.isLoading&&t.hasGraph&&!!t.layoutResult)}})).views(t=>({get displayPhase(){return pa({regionTooLarge:t.regionTooLarge,error:t.error??t.renderError},()=>sa({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=>({writeGrammar(o){for(let[r,n]of Object.entries(o))Ro(t,r,n)},setSubgraphContext(o){t.subgraphContext=o,t.dense=void 0},setSubgraphHaplotypes(o){t.subgraphHaplotypes=o,t.dense=void 0},setDense(o){t.dense=o},setHaplotypeNames(o){t.haplotypeNames=o},setMaxRegionBp(o){t.maxRegionBp=o},cut(){let o=t.cutRegion,r=t.sourceAdapter;if(!o||!r)return;let n=t.offReference(o);if(n){t.clearGraph(),t.setError(new Error(n));return}let a=t.cutTier==="coarse";return t.cutFoldBp=Math.round(Kt*(t.settledWindow?.bpPerPx??t.host?.bpPerPx??0)),t.cutSubgraph(r,o,{...t.cutOptions,tier:a?"coarse":void 0},t.cutFoldBp)}})).actions(t=>({recutAt(o){let r=t.tierAt(o.bpPerPx);return t.coarseCut=r==="coarse",t.cutRegion=Ur(o,t.capFor(r),F(t.chosenLayoutMode).cutMargins),t.recuts++,t.cut()}})).actions(t=>({settleOn(o){t.settledWindow=o;let r=F(t.chosenLayoutMode).cutMargins;if(t.regionTooLarge||Xt(t.dense,o)||!t.loadCanceled&&t.tierAt(o.bpPerPx)===t.cutTier&&Xr(t.cutRegion,o,r)&&!t.foldDrifted(o.bpPerPx))return!1;let n=t.recutAt(o),a=t.recuts;return Promise.resolve(n).then(()=>{H(t)&&t.recuts===a&&wt(t.error)&&this.refuseDenseCut(o)}),!0},refuseDenseCut(o){t.setDense(o),t.cutRegion=void 0,this.settleOn(t.settledWindow??o)},recut(){t.cutRegion?t.cut():t.settledWindow&&this.settleOn(t.settledWindow)},relayoutFrom(o){let r=t.host?Xe(t.host):void 0;return r&&!t.regionTooLarge&&(t.cutChangedFrom(o)||F(o).cutMargins!==F(t.chosenLayoutMode).cutMargins)?t.recutAt(r):t.recomputeLayout()},retryLoad(){t.cut()},reload(){t.cut()},cancelFetchByUser(){t.stopLoad()}})).actions(t=>({async fetchHaplotypeNames(o,r){try{let n=await R(t).rpcManager.call(ae(t),"GetGraphHaplotypes",{adapterConfig:o,signal:r});H(t)&&!r?.aborted&&t.setHaplotypeNames(n)}catch(n){r?.aborted||console.warn("[LinearGraphDisplay] no haplotype names",n)}}})).actions(t=>({stretchWithHost(o,r){let n=t.layoutBounds;if(!n||!t.followsHostView)return;t.viewportOwner==="fit"&&(t.viewportOwner="user");let a=o.bpPerPx/r.bpPerPx,i=t.translateY+t.scaleY*(n.minY+n.h/2);t.scale*=a,t.translateX=a*(t.translateX+o.offsetPx)-r.offsetPx,t.translateY=i-a*(i-t.translateY)}})).actions(t=>({forceLoad(){let o=t.settledWindow;o&&(t.setMaxRegionBp(Math.ceil(o.end-o.start)),t.settleOn(o))},afterAttach(){t.cutRegion&&!t.graph&&t.cut();let o;L(t,()=>{o?.abort()}),L(t,C(()=>{let n=t.sourceAdapter;return n&&Yo(n)?n:void 0},n=>{o?.abort(),o=void 0,t.setHaplotypeNames(void 0),n&&(o=new AbortController,t.fetchHaplotypeNames(n,o.signal))},{fireImmediately:!0,equals:(n,a)=>JSON.stringify(n)===JSON.stringify(a),name:"GraphHaplotypeNames"})),L(t,C(()=>t.hostPlacesX,n=>{n||t.releaseHost()},{name:"GraphHostPlacesX"})),L(t,C(()=>t.hostFrame,n=>{n&&t.hostTransform(n.scale,n.translateX)},{equals:(n,a)=>n?.scale===a?.scale&&n?.translateX===a?.translateX,fireImmediately:!0,name:"GraphHostFrame"}));let r;L(t,C(()=>t.host&&!t.hostPlacesX?{bpPerPx:t.host.bpPerPx,offsetPx:t.host.offsetPx}:void 0,n=>{let a=r;r=n,n&&a&&n.bpPerPx>0&&t.stretchWithHost(a,n)},{equals:(n,a)=>n?.bpPerPx===a?.bpPerPx&&n?.offsetPx===a?.offsetPx,fireImmediately:!0,name:"GraphHostStretch"})),L(t,C(()=>`${t.facetSetting.field} ${t.facetPlacement?.count}`,()=>{let n=(t.facetGridIn(t.paneCeiling-qe)?.total??0)+qe;(t.facetGrid?.total??0)+qe>t.height&&t.setHeight(Math.max(t.height,Math.ceil(n)))},{name:"GraphFacetHeight"})),L(t,C(()=>t.host?.coarseDynamicBlocks,n=>{let{host:a}=t,i=n&&a?Xe(a):void 0;i&&t.settleOn(i)},{fireImmediately:!0,name:"GraphHostSettle"}))}})).views(t=>({get graphViewSpec(){let o=t.host?Xe(t.host):void 0,r=t.sourceTrackId;if(!o||!r||!t.hasGraph||t.coarseCut||t.regionTooLarge||Xt(t.dense,o))return;let n=Math.floor(o.start),a=Math.ceil(o.end);return{...mi(t),loadedTrackId:r,loadedRegion:{refName:o.refName,assemblyName:o.assemblyName,start:n,end:a},subgraphHaplotypes:t.cutHaplotypes,maxRegionBp:Math.max(t.maxRegionBp,a-n),...t.grammar,layoutMode:t.chosenLayoutMode,connectedViewId:t.host?.id}}})).actions(t=>({openGraphView(){let o=t.graphViewSpec;o&&R(t).addView("GraphGenomeView",o)}})).views(t=>({cutMenuItems(){let o=t.sourceAdapter,r=t.sourceTrack;if(!o||!r||!Uo(o))return[];let n=Ae(o),a=St(r),i=t.haplotypeNames,p=t.subgraphHaplotypes,s=c=>{t.setSubgraphHaplotypes(c),t.recut()};return[{type:"subHeader",label:"Load"},{type:"radio",label:i?`Every haplotype in the graph (${i.length.toLocaleString()})`:"Every haplotype in the graph",checked:p?p.length===0:!n&&!a,onClick:()=>{s([])}},...n||a?[{type:"radio",label:n?"The track's default haplotypes":`The track's ${a?.length} assemblies`,checked:p===void 0,onClick:()=>{s(void 0)}}]:[],{type:"radio",label:"Chosen in Graph settings...",checked:(p?.length??0)>0,onClick:()=>{this.openSettings()}}]},openSettings(){R(t).queueDialog(o=>[hi,{model:t,onClose:o}])},async renderSvg(o){let{renderGraphTrackSvg:r}=await import("./chunks/renderSvg-WD6YDV2I.js");return r(t,o)},trackMenuItems(){let o=t.launchMenuItems();nt(o,{label:"Graph genome view",icon:Qe,disabled:!t.graphViewSpec,disabledHelpText:t.error&&!wt(t.error)?"The track could not cut a graph here":t.isLoading&&!t.hasGraph?"The track is still cutting its graph":"Zoom in until the track cuts a graph",onClick:()=>{t.openGraphView()}});let r=[...this.cutMenuItems(),...t.highlightMenuItems()];return[...r.length>0?[{label:"Haplotypes",icon:sn,subMenu:r}]:[],...t.graphMenuItems(),{label:"Graph settings...",icon:pn,helpText:"Subgraph, drawing and force-directed layout",onClick:()=>{this.openSettings()}},...o,...aa(t)]}}))}function qt(e){e.addDisplayType(()=>{let t=oa();return Object.assign(new ea({name:"LinearGraphDisplay",displayName:"Graph",configSchema:t,stateModel:ca(t),trackType:["GraphTrack","FeatureTrack","SyntenyTrack"],viewType:"LinearGenomeView",ReactComponent:ee(()=>import("./chunks/LinearGraphDisplay-SPOPTJEN.js"))}),{adapterCapabilities:["getSubgraph"]})})}function gi(e){let{uri:t,baseUri:o,csi:r}=e;return typeof t=="string"?{...e,bubblesLocation:{uri:t,baseUri:o},index:Le(t,o,r)}:e}var yi=O("MinigraphBubbleAdapter",{bubblesLocation:E("/path/to/graph.bb.bed.gz"),index:z("MinigraphBubbleIndex","/path/to/graph.bb.bed.gz.tbi"),assemblyNameToPanSN:{type:"frozen",defaultValue:{}}},{explicitlyTyped:!0,preProcessSnapshot:gi}),ua=yi;function Zt(e){e.addAdapterType(()=>new te({name:"MinigraphBubbleAdapter",displayName:"Minigraph bubble BED adapter",configSchema:ua,adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/MinigraphBubbleAdapter-QCOMFPLL.js").then(t=>t.default)}))}function da(e){let{uri:t,baseUri:o,csi:r}=e;return typeof t=="string"?{...e,segmentsLocation:{uri:`${t}.segs.bed.gz`,baseUri:o},segmentsIndex:Le(`${t}.segs.bed.gz`,o,r),linksLocation:{uri:`${t}.links.bed.gz`,baseUri:o},linksIndex:Le(`${t}.links.bed.gz`,o,r)}:e}function bi(e){let{coarse:t,baseUri:o,csi:r}=e;return Oe(da(typeof t=="object"&&t!==null?{...e,coarse:da({baseUri:o,csi:r,...t})}:e))}var fi=O("RgfaTabixCoarseTier",{aboveBpPerPx:{type:"maybeNumber"},foldBelowBp:{type:"maybeNumber"},segmentsLocation:E("/path/to/graph.tier.segs.bed.gz"),segmentsIndex:z("RgfaCoarseSegmentsIndex","/path/to/graph.tier.segs.bed.gz.tbi"),linksLocation:E("/path/to/graph.tier.links.bed.gz"),linksIndex:z("RgfaCoarseLinksIndex","/path/to/graph.tier.links.bed.gz.tbi")}),wi=O("RgfaTabixAdapter",{segmentsLocation:E("/path/to/graph.segs.bed.gz"),segmentsIndex:z("RgfaSegmentsIndex","/path/to/graph.segs.bed.gz.tbi"),linksLocation:E("/path/to/graph.links.bed.gz"),linksIndex:z("RgfaLinksIndex","/path/to/graph.links.bed.gz.tbi"),walksLocation:E(""),walksIndex:z("RgfaWalksIndex"),walkStepBudget:{type:"integer",defaultValue:Se.stepBudget},walkByteBudget:{type:"integer",defaultValue:Se.byteBudget},defaultHaplotypes:{type:"stringArray",defaultValue:[]},assemblyNameToPanSN:{type:"frozen",defaultValue:{}},coarse:fi},{explicitlyTyped:!0,preProcessSnapshot:bi}),ma=wi;function Qt(e){e.addAdapterType(()=>new te({name:"RgfaTabixAdapter",displayName:"Indexed rGFA adapter",configSchema:ma,adapterCapabilities:["getSubgraph"],adapterMetadata:{category:"Graph adapters"},getAdapterClass:()=>import("./chunks/RgfaTabixAdapter-O3NMNRZ2.js").then(t=>t.default)}))}var Mi=O("WalkTabixSyntenyAdapter",{assemblyNames:{type:"stringArray",defaultValue:[]},walksLocation:E("/path/to/graph.walks.bed.gz"),walksIndex:z("WalkTabixWalksIndex"),walkStepBudget:{type:"integer",defaultValue:Se.stepBudget},walkByteBudget:{type:"integer",defaultValue:Se.byteBudget},defaultHaplotypes:{type:"stringArray",defaultValue:[]},samplesTsvLocation:E(""),assemblyNameToPanSN:{type:"frozen",defaultValue:{}}},{explicitlyTyped:!0,preProcessSnapshot:Oe}),la=Mi;function eo(e){e.addAdapterType(()=>new te({name:"WalkTabixSyntenyAdapter",displayName:"Walk-indexed graph adapter",configSchema:la,adapterCapabilities:["getSubgraph","headerLanes","lanePairsOnAnchor","lanePairBatches"],adapterMetadata:{category:"Synteny adapters"},getAdapterClass:()=>import("./chunks/WalkTabixSyntenyAdapter-7VDCNSFD.js").then(t=>t.default)}))}var ki=new Set(["RgfaTabixAdapter","GbzBaseSyntenyAdapter"]);function Si(e){return ht(e).toLowerCase().endsWith(".gbz.db")}function xi(e){let t=e.adapter;return t?.type!==void 0&&Kr.has(t.type)&&!t.assemblyNames?.length&&Array.isArray(e.assemblyNames)&&e.assemblyNames.length>0?{...e,adapter:{...t,assemblyNames:e.assemblyNames}}:e}function Ri(e){let t=e.adapter,[o]=Array.isArray(e.assemblyNames)?e.assemblyNames:[],r=t?.type==="RgfaTabixAdapter"&&t.walksLocation?Lo(t.walksLocation):void 0;return o&&r&&r!==o&&t?.assemblyNameToPanSN===void 0?{...e,adapter:{...t,assemblyNameToPanSN:{[o]:r}}}:e}function Ti(e,t,o){let r=n=>Fo({choice:n,loc:e,indexLoc:t,assembly:"",sample:""});if((!o||o==="GbzBaseSyntenyAdapter")&&Si(e))return r("GbzBaseSyntenyAdapter");if(!o||o==="RgfaTabixAdapter"){if(Ho(e))return r("RgfaTabixAdapter");if(ht(e).endsWith(Go)&&(t!==void 0||Po(e)))return r("RgfaTabixWalks")}}function to(e){e.addToExtensionPoint("Core-preProcessTrackConfig",xi),e.addToExtensionPoint("Core-preProcessTrackConfig",Ri),e.addToExtensionPoint("Core-guessAdapterForLocation",t=>(o,r,n)=>Ti(o,r,n)??t(o,r,n)),e.addToExtensionPoint("Core-guessTrackTypeForLocation",t=>(o,r)=>ki.has(o)?"GraphTrack":t(o,r))}function ha(e){let t;if($(e)){let{refName:o,start:r,end:n,assemblyName:a}=e;typeof o=="string"&&typeof r=="number"&&typeof n=="number"&&(t={refName:o,start:r,end:n,assemblyName:typeof a=="string"?a:void 0})}return t}function Gi(e,t,o){let r=e.connectedViewId;return r===void 0||r===t||!o.has(r)}function ga(e,t){return e.assemblyName===void 0||t===void 0||t.includes(e.assemblyName)}function Li(e){return(Array.isArray(e.tracks)?e.tracks:[]).flatMap(o=>$(o)&&Array.isArray(o.displays)?o.displays.filter(r=>$(r)&&r.type==="LinearGraphDisplay"):[])}function ya(e,t,o){let r=[],n=$e(e),a=new Set(n.map(i=>$(i)?i.id:void 0));for(let i of n){if($(i)&&i.id===t)for(let p of Li(i)){let s=ha(p.hoverHighlight);s&&ga(s,o)&&r.push({key:typeof p.id=="string"?p.id:"graph-track",region:s})}if($(i)&&i.type==="GraphGenomeView"&&Gi(i,t,a)){let p=ha(i.hoverHighlight);p&&ga(p,o)&&r.push({key:typeof i.id=="string"?i.id:"graph",region:p})}}return r}var vi=an()(e=>({highlight:{height:"100%",position:"absolute",background:We(e.palette.primary.main,.08),borderLeft:`1px solid ${We(e.palette.primary.main,.4)}`,borderRight:`1px solid ${We(e.palette.primary.main,.4)}`,pointerEvents:"none",zIndex:10}})),Ai=ft(function({model:t,region:o}){let{classes:r}=vi(),n=t.getHighlightCoords(o);return n?A("div",{"data-testid":"graph-node-highlight",className:r.highlight,style:{left:n.left,width:n.width}}):null}),Pi=ft(function({model:t}){let{views:o}=R(t);return A(fo,{children:ya([...o],t.id,t.assemblyNames).map(({key:r,region:n})=>A(Ai,{model:t,region:n},`graph-hover-${r}`))})}),ba=Pi;var Ci="LinearGenomeView-TracksContainerComponent";function oo(e){e.contributeToExtensionPoint(Ci,({model:t})=>A(ba,{model:t},"graphgenomeview-hover-highlight"))}function Bi(e){return e.views(t=>({get adapterConfig(){return qr(t,t.parentTrack.configuration)}}))}function ro(e){e.addToExtensionPoint("Core-extendPluggableElement",t=>(t instanceof ln&&Jt.includes(t.name)&&t.extendStateModel(Bi),t))}var fa="GraphGenomeView";var wa="7.3.0";var no=class extends cn{constructor(){super(...arguments);this.name=fa;this.version=wa}install(o){$t(o),qt(o),Yt(o),Ut(o),oo(o),Qt(o),Zt(o),Et(o),eo(o),Vt(o),to(o),ro(o),o.addRpcMethod(()=>new Ve(o)),o.addRpcMethod(()=>new Ne(o)),o.addRpcMethod(()=>new Ee(o)),o.addRpcMethod(()=>new Ie(o))}configure(o){try{go(o.rootModel)&&o.rootModel.appendToSubMenu(["Add"],{label:"Graph genome view",icon:Qe,onClick:r=>{r.addView("GraphGenomeView",{})}})}catch(r){console.warn("[GraphGenomeView] could not add the Add menu entry",r)}}};export{no as default};
|
|
7
7
|
//# sourceMappingURL=jbrowse-plugin-graphgenomeviewer.esm.js.map
|