jbrowse-plugin-graphgenomeviewer 7.1.11 → 7.1.13

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.
Files changed (33) hide show
  1. package/dist/chunks/GbzBaseSyntenyAdapter-NB6WBBZH.js +2 -0
  2. package/dist/chunks/GbzBaseSyntenyAdapter-NB6WBBZH.js.map +7 -0
  3. package/dist/chunks/WalkTabixSyntenyAdapter-WBHOZLAN.js +2 -0
  4. package/dist/chunks/WalkTabixSyntenyAdapter-WBHOZLAN.js.map +7 -0
  5. package/dist/chunks/chunk-JLGPQO5L.js +4 -0
  6. package/dist/chunks/{chunk-U4U5ZOCH.js.map → chunk-JLGPQO5L.js.map} +4 -4
  7. package/dist/chunks/{chunk-OBQFV4NL.js → chunk-LXCMWL7B.js} +2 -2
  8. package/dist/chunks/chunk-M2D7NUOY.js +2 -0
  9. package/dist/chunks/{chunk-T4HOC6O3.js.map → chunk-M2D7NUOY.js.map} +4 -4
  10. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +3 -3
  11. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +2 -2
  12. package/package.json +1 -1
  13. package/src/GbzBaseSyntenyAdapter/GbzBaseSyntenyAdapter.test.ts +2 -4
  14. package/src/GbzBaseSyntenyAdapter/GbzBaseSyntenyAdapter.ts +9 -8
  15. package/src/RgfaTabixAdapter/test_data/walks3_lanepairs.GRCh38.walks.bed.gz +0 -0
  16. package/src/RgfaTabixAdapter/test_data/walks3_lanepairs.GRCh38.walks.bed.gz.tbi +0 -0
  17. package/src/WalkTabixSyntenyAdapter/WalkTabixSyntenyAdapter.test.ts +128 -3
  18. package/src/WalkTabixSyntenyAdapter/WalkTabixSyntenyAdapter.ts +4 -10
  19. package/src/WalkTabixSyntenyAdapter/walkLanes.ts +60 -0
  20. package/src/synteny/clipFeatureToRegion.test.ts +23 -0
  21. package/src/synteny/clipFeatureToRegion.ts +4 -1
  22. package/src/synteny/laneZoomNotice.test.ts +55 -0
  23. package/src/synteny/laneZoomNotice.ts +34 -0
  24. package/src/version.ts +1 -1
  25. package/dist/chunks/GbzBaseSyntenyAdapter-2MA3I6BM.js +0 -2
  26. package/dist/chunks/GbzBaseSyntenyAdapter-2MA3I6BM.js.map +0 -7
  27. package/dist/chunks/WalkTabixSyntenyAdapter-AIC3W7FL.js +0 -2
  28. package/dist/chunks/WalkTabixSyntenyAdapter-AIC3W7FL.js.map +0 -7
  29. package/dist/chunks/chunk-PJ43KEV6.js +0 -2
  30. package/dist/chunks/chunk-PJ43KEV6.js.map +0 -7
  31. package/dist/chunks/chunk-T4HOC6O3.js +0 -2
  32. package/dist/chunks/chunk-U4U5ZOCH.js +0 -4
  33. /package/dist/chunks/{chunk-OBQFV4NL.js.map → chunk-LXCMWL7B.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../node_modules/.pnpm/@gmod+gbz-base@7.4.1/node_modules/@gmod/gbz-base/src/gbwt/node.ts", "../../node_modules/.pnpm/@gmod+gbz-base@7.4.1/node_modules/@gmod/gbz-base/src/gbwt/sequence.ts", "../../node_modules/.pnpm/@gmod+gbz-base@7.4.1/node_modules/@gmod/gbz-base/src/lcs.ts", "../../node_modules/.pnpm/@gmod+gbz-base@7.4.1/node_modules/@gmod/gbz-base/src/pairAlignment.ts"],
4
- "sourcesContent": ["export const ENDMARKER = 0\n\nexport type Orientation = 'forward' | 'reverse'\n\nexport function encodeNode(id: number, orientation: Orientation) {\n return 2 * id + (orientation === 'reverse' ? 1 : 0)\n}\n\nexport function nodeId(handle: number) {\n return Math.floor(handle / 2)\n}\n\nexport function nodeOrientation(handle: number): Orientation {\n return handle % 2 === 0 ? 'forward' : 'reverse'\n}\n\nexport function isReverse(handle: number) {\n return handle % 2 === 1\n}\n\nexport function flipNode(handle: number) {\n return handle % 2 === 0 ? handle + 1 : handle - 1\n}\n\nexport type NodeSide = 'left' | 'right'\n\nexport function flipSide(side: NodeSide): NodeSide {\n return side === 'left' ? 'right' : 'left'\n}\n\nexport function entrySide(orientation: Orientation): NodeSide {\n return orientation === 'forward' ? 'left' : 'right'\n}\n\nexport function exitSide(orientation: Orientation): NodeSide {\n return orientation === 'forward' ? 'right' : 'left'\n}\n\nexport function entryOrientation(side: NodeSide): Orientation {\n return side === 'left' ? 'forward' : 'reverse'\n}\n\nexport function exitOrientation(side: NodeSide): Orientation {\n return side === 'right' ? 'forward' : 'reverse'\n}\n\nexport function edgeIsCanonical(from: number, to: number) {\n const fromId = nodeId(from)\n const toId = nodeId(to)\n return isReverse(from)\n ? toId > fromId || (toId === fromId && !isReverse(to))\n : toId >= fromId\n}\n\nexport function pathIsCanonical(path: number[]) {\n return pathEndsAreCanonical(path[0], path[path.length - 1])\n}\n\nexport function pathEndsAreCanonical(\n first: number | undefined,\n last: number | undefined,\n) {\n if (first === undefined || last === undefined) {\n return true\n }\n return isReverse(first) === isReverse(last)\n ? !isReverse(first)\n : edgeIsCanonical(first, last)\n}\n", "const DECODE = ['', 'A', 'C', 'G', 'T', 'N']\n\nexport function encodedSequenceLength(encoded: Uint8Array) {\n const last = encoded[encoded.length - 1]\n if (last === undefined) {\n return 0\n }\n let value = last\n let inLast = 0\n for (let i = 0; i < 3; i++) {\n if (value % 6 === 0) {\n break\n }\n value = Math.floor(value / 6)\n inLast += 1\n }\n return 3 * (encoded.length - 1) + inLast\n}\n\nexport function decodeSequence(encoded: Uint8Array) {\n let result = ''\n for (const byte of encoded) {\n let value = byte\n for (let i = 0; i < 3; i++) {\n const base = DECODE[value % 6]!\n if (base === '') {\n return result\n }\n value = Math.floor(value / 6)\n result += base\n }\n }\n return result\n}\n\nconst COMPLEMENT: Record<string, string> = {\n A: 'T',\n C: 'G',\n G: 'C',\n T: 'A',\n N: 'N',\n}\n\nexport function reverseComplement(sequence: string) {\n let result = ''\n for (let i = sequence.length - 1; i >= 0; i--) {\n result += COMPLEMENT[sequence[i]!] ?? 'N'\n }\n return result\n}\n", "type Weight = (x: number) => number\n\nfunction lowerBound(ascending: number[], value: number) {\n let lo = 0\n let hi = ascending.length\n while (lo < hi) {\n const mid = (lo + hi) >> 1\n if (ascending[mid]! < value) {\n lo = mid + 1\n } else {\n hi = mid\n }\n }\n return lo\n}\n\nclass ColumnMax {\n readonly ending: Float64Array\n private readonly tree: Int32Array\n\n constructor(columns: number) {\n this.ending = new Float64Array(columns)\n this.tree = new Int32Array(columns + 1).fill(-1)\n }\n\n bestBefore(column: number) {\n let best = -1\n for (let p = column; p > 0; p -= p & -p) {\n const candidate = this.tree[p]!\n if (\n candidate !== -1 &&\n (best === -1 || this.ending[candidate]! > this.ending[best]!)\n ) {\n best = candidate\n }\n }\n return best\n }\n\n raise(column: number, value: number) {\n this.ending[column] = value\n for (let p = column + 1; p < this.tree.length; p += p & -p) {\n const holder = this.tree[p]!\n if (holder === -1 || value > this.ending[holder]!) {\n this.tree[p] = column\n }\n }\n }\n}\n\ninterface Trace {\n row: Int32Array\n column: Int32Array\n previous: Int32Array\n endingMatch: Int32Array\n count: number\n}\n\nclass SparseLcs {\n readonly pairs: [number, number][] = []\n total = 0\n private readonly a: number[]\n private readonly b: number[]\n private readonly weight: Weight\n private readonly occurrences = new Map<number, number[]>()\n\n constructor(a: number[], b: number[], weight: Weight) {\n this.a = a\n this.b = b\n this.weight = weight\n b.forEach((x, j) => {\n const list = this.occurrences.get(x)\n if (list) {\n list.push(j)\n } else {\n this.occurrences.set(x, [j])\n }\n })\n }\n\n solve(a0: number, a1: number, b0: number, b1: number) {\n let prefix = 0\n while (\n a0 + prefix < a1 &&\n b0 + prefix < b1 &&\n this.a[a0 + prefix] === this.b[b0 + prefix]\n ) {\n this.match(a0 + prefix, b0 + prefix)\n prefix += 1\n }\n let suffix = 0\n while (\n a1 - suffix > a0 + prefix &&\n b1 - suffix > b0 + prefix &&\n this.a[a1 - suffix - 1] === this.b[b1 - suffix - 1]\n ) {\n suffix += 1\n }\n this.solveMiddle(a0 + prefix, a1 - suffix, b0 + prefix, b1 - suffix)\n for (let k = suffix; k > 0; k--) {\n this.match(a1 - k, b1 - k)\n }\n }\n\n private match(i: number, j: number) {\n this.pairs.push([i, j])\n this.total += this.weight(this.a[i]!)\n }\n\n private solveMiddle(a0: number, a1: number, b0: number, b1: number) {\n if (a0 === a1 || b0 === b1) {\n return\n }\n const matches = this.matchCount(a0, a1, b0, b1)\n if (matches === 0) {\n return\n }\n if (matches <= a1 - a0 + (b1 - b0)) {\n this.chain(a0, a1, b0, b1, matches)\n return\n }\n const mid = (a0 + a1) >> 1\n const split = this.split(a0, mid, a1, b0, b1)\n this.solve(a0, mid, b0, split)\n this.solve(mid, a1, split, b1)\n }\n\n private matchCount(a0: number, a1: number, b0: number, b1: number) {\n let count = 0\n for (let i = a0; i < a1; i++) {\n const list = this.occurrences.get(this.a[i]!)\n if (list) {\n count += lowerBound(list, b1) - lowerBound(list, b0)\n }\n }\n return count\n }\n\n private sweep(\n from: number,\n to: number,\n step: 1 | -1,\n b0: number,\n b1: number,\n columns: ColumnMax,\n trace?: Trace,\n ) {\n for (let i = from; i !== to; i += step) {\n const list = this.occurrences.get(this.a[i]!)\n if (!list) {\n continue\n }\n const w = this.weight(this.a[i]!)\n const lo = lowerBound(list, b0)\n const hi = lowerBound(list, b1)\n for (let k = 0; k < hi - lo; k++) {\n const column =\n step === 1 ? list[hi - 1 - k]! - b0 : b1 - 1 - list[lo + k]!\n const before = columns.bestBefore(column)\n const value = (before === -1 ? 0 : columns.ending[before]!) + w\n if (value > columns.ending[column]!) {\n columns.raise(column, value)\n if (trace) {\n const match = trace.count++\n trace.row[match] = i\n trace.column[match] = column\n trace.previous[match] =\n before === -1 ? -1 : trace.endingMatch[before]!\n trace.endingMatch[column] = match\n }\n }\n }\n }\n }\n\n private chain(\n a0: number,\n a1: number,\n b0: number,\n b1: number,\n matches: number,\n ) {\n const columns = new ColumnMax(b1 - b0)\n const trace: Trace = {\n row: new Int32Array(matches),\n column: new Int32Array(matches),\n previous: new Int32Array(matches),\n endingMatch: new Int32Array(b1 - b0),\n count: 0,\n }\n this.sweep(a0, a1, 1, b0, b1, columns, trace)\n const last = columns.bestBefore(b1 - b0)\n if (last === -1) {\n return\n }\n this.total += columns.ending[last]!\n const chained: [number, number][] = []\n for (\n let match = trace.endingMatch[last]!;\n match !== -1;\n match = trace.previous[match]!\n ) {\n chained.push([trace.row[match]!, b0 + trace.column[match]!])\n }\n for (let k = chained.length - 1; k >= 0; k--) {\n this.pairs.push(chained[k]!)\n }\n }\n\n private frontier(\n from: number,\n to: number,\n step: 1 | -1,\n b0: number,\n b1: number,\n ) {\n const columns = new ColumnMax(b1 - b0)\n this.sweep(from, to, step, b0, b1, columns)\n const best = new Float64Array(b1 - b0 + 1)\n for (let column = 0; column < b1 - b0; column++) {\n best[column + 1] = Math.max(best[column]!, columns.ending[column]!)\n }\n return best\n }\n\n private split(a0: number, mid: number, a1: number, b0: number, b1: number) {\n const width = b1 - b0\n const before = this.frontier(a0, mid, 1, b0, b1)\n const after = this.frontier(a1 - 1, mid - 1, -1, b0, b1)\n let split = 0\n let best = -1\n for (let s = 0; s <= width; s++) {\n const combined = before[s]! + after[width - s]!\n if (combined > best) {\n best = combined\n split = s\n }\n }\n return b0 + split\n }\n}\n\nexport function weightedLcs(\n a: number[],\n b: number[],\n weight: Weight,\n): [pairs: [number, number][], weight: number] {\n const lcs = new SparseLcs(a, b, weight)\n lcs.solve(0, a.length, 0, b.length)\n return [lcs.pairs, lcs.total]\n}\n", "import { isReverse, nodeId } from './gbwt/node.ts'\nimport { reverseComplement } from './gbwt/sequence.ts'\n\nexport type PairOp = '=' | 'X' | 'I' | 'D'\nexport type PairEdit = [PairOp, number]\n\nexport interface PairChain {\n queryStart: number\n queryEnd: number\n targetStart: number\n targetEnd: number\n strand: '+' | '-'\n edits: PairEdit[]\n // bases on nodes both walks visit; the other `=` came from comparing bases\n sharedBases: number\n}\n\nexport interface PairOptions {\n query: number[]\n target: number[]\n sequenceOf: (id: number) => string\n maxGap?: number | undefined\n minMatch?: number | undefined\n bases?: boolean | undefined\n}\n\n// An exact match: query [qs, qe) against target [ts, te), the target read\n// backwards when flipped.\ninterface Run {\n qs: number\n qe: number\n ts: number\n te: number\n flipped: boolean\n}\n\nconst DEFAULT_MIN_MATCH = 100\nconst MAX_ALIGNED_CELLS = 4_000_000\nconst CHAIN_LOOKBACK = 5000\nconst KMER = 15\nconst MAX_KMER_OCCURRENCES = 64\n// each level's gaps lie strictly inside the last, so this only bounds the work\nconst MAX_FILL_DEPTH = 8\n\n// vg's scoring, the model the reference CIGARs in subgraph.ts are scored by\nconst MATCH = 1\nconst MISMATCH = -4\nconst GAP_OPEN = -6\nconst GAP_EXTEND = -1\nconst UNREACHABLE = -(2 ** 30)\n\nconst DIAGONAL = 0\nconst INSERTION = 1\nconst DELETION = 2\n\nfunction appendEdit(edits: PairEdit[], op: PairOp, 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\nfunction best(diagonal: number, insertion: number, deletion: number) {\n return diagonal >= deletion && diagonal >= insertion\n ? DIAGONAL\n : deletion >= insertion\n ? DELETION\n : INSERTION\n}\n\n// The highest-scoring global alignment of a on b under affine gaps. Each cell\n// of `trace` packs, two bits apiece, the state each of the three states came\n// from. A tie goes to the diagonal, then to the deletion, so two stretches\n// with nothing in common read as an insertion followed by a deletion.\nfunction affineAlignment(a: string, b: string, edits: PairEdit[]) {\n const la = a.length\n const lb = b.length\n const width = lb + 1\n const trace = new Uint8Array((la + 1) * width)\n let diagonal = new Int32Array(width).fill(UNREACHABLE)\n let insertion = new Int32Array(width).fill(UNREACHABLE)\n let deletion = new Int32Array(width).fill(UNREACHABLE)\n diagonal[0] = 0\n for (let j = 1; j <= lb; j++) {\n deletion[j] = GAP_OPEN + (j - 1) * GAP_EXTEND\n trace[j] = (j === 1 ? DIAGONAL : DELETION) << 4\n }\n for (let i = 1; i <= la; i++) {\n const nextDiagonal = new Int32Array(width).fill(UNREACHABLE)\n const nextInsertion = new Int32Array(width).fill(UNREACHABLE)\n const nextDeletion = new Int32Array(width).fill(UNREACHABLE)\n nextInsertion[0] = GAP_OPEN + (i - 1) * GAP_EXTEND\n trace[i * width] = (i === 1 ? DIAGONAL : INSERTION) << 2\n const ai = a.charCodeAt(i - 1)\n for (let j = 1; j <= lb; j++) {\n const fromDiagonal = best(\n diagonal[j - 1]!,\n insertion[j - 1]!,\n deletion[j - 1]!,\n )\n nextDiagonal[j] =\n Math.max(diagonal[j - 1]!, insertion[j - 1]!, deletion[j - 1]!) +\n (ai === b.charCodeAt(j - 1) ? MATCH : MISMATCH)\n const fromInsertion = best(\n diagonal[j]! + GAP_OPEN,\n insertion[j]! + GAP_EXTEND,\n deletion[j]! + GAP_OPEN,\n )\n nextInsertion[j] = Math.max(\n diagonal[j]! + GAP_OPEN,\n insertion[j]! + GAP_EXTEND,\n deletion[j]! + GAP_OPEN,\n )\n const fromDeletion = best(\n nextDiagonal[j - 1]! + GAP_OPEN,\n nextInsertion[j - 1]! + GAP_OPEN,\n nextDeletion[j - 1]! + GAP_EXTEND,\n )\n nextDeletion[j] = Math.max(\n nextDiagonal[j - 1]! + GAP_OPEN,\n nextInsertion[j - 1]! + GAP_OPEN,\n nextDeletion[j - 1]! + GAP_EXTEND,\n )\n trace[i * width + j] =\n fromDiagonal | (fromInsertion << 2) | (fromDeletion << 4)\n }\n diagonal = nextDiagonal\n insertion = nextInsertion\n deletion = nextDeletion\n }\n const ops: PairOp[] = []\n let i = la\n let j = lb\n let state = best(diagonal[lb]!, insertion[lb]!, deletion[lb]!)\n while (i > 0 || j > 0) {\n const from = (trace[i * width + j]! >> (2 * state)) & 3\n if (state === DIAGONAL) {\n ops.push(a[i - 1] === b[j - 1] ? '=' : 'X')\n i -= 1\n j -= 1\n } else if (state === INSERTION) {\n ops.push('I')\n i -= 1\n } else {\n ops.push('D')\n j -= 1\n }\n state = from\n }\n for (const op of ops.reverse()) {\n appendEdit(edits, op, 1)\n }\n}\n\n// What a chain of walk steps pays to go from one run to the next over dq\n// private query bases and dt target ones. Those runs lie outside both walks'\n// repeats, so each has one place to go and the cost only has to let a chain\n// hold through a structural variant of any size: vg's charge for a short\n// indel, growing with the logarithm past it.\nfunction stepJumpCost(dq: number, dt: number) {\n const indel = Math.abs(dq - dt)\n const indelCost =\n indel === 0\n ? 0\n : Math.min(\n -GAP_OPEN - (indel - 1) * GAP_EXTEND,\n -GAP_OPEN + 10 * Math.log2(indel),\n )\n return indelCost + (Math.min(dq, dt) > 0 ? -MISMATCH : 0)\n}\n\n// What a chain of k-mer matches pays, which is minimap2's gap cost. Inside a\n// tandem array every copy offers a match, and the term that grows with the\n// indel is what keeps a chain in one register instead of hopping between\n// copies for a slightly longer match.\nfunction kmerJumpCost(dq: number, dt: number) {\n const indel = Math.abs(dq - dt)\n return indel === 0 ? 0 : 0.01 * KMER * indel + 0.5 * Math.log2(indel)\n}\n\ntype JumpCost = (dq: number, dt: number) => number\n\ninterface Link {\n run: Run\n trim: number\n}\n\ntype Interval = [number, number]\n\n// The stretch of a run from offset `from` to `to` along it\nfunction sliceRun(run: Run, from: number, to: number): Run {\n return {\n qs: run.qs + from,\n qe: run.qs + to,\n ts: run.flipped ? run.te - to : run.ts + from,\n te: run.flipped ? run.te - from : run.ts + to,\n flipped: run.flipped,\n }\n}\n\n// What is left of a run once taken bases are cut out of it, as the pieces a\n// k-mer long or more. An exact match divides at any base, so a flank that runs\n// one base into an inversion by chance costs the inversion one base, not all\n// of it.\nfunction untakenPieces(run: Run, query: Interval[], target: Interval[]) {\n const len = run.qe - run.qs\n const blocked: Interval[] = []\n for (const [s, e] of query) {\n const lo = Math.max(0, s - run.qs)\n const hi = Math.min(len, e - run.qs)\n if (lo < hi) {\n blocked.push([lo, hi])\n }\n }\n for (const [s, e] of target) {\n const lo = Math.max(0, run.flipped ? run.te - e : s - run.ts)\n const hi = Math.min(len, run.flipped ? run.te - s : e - run.ts)\n if (lo < hi) {\n blocked.push([lo, hi])\n }\n }\n if (blocked.length === 0) {\n return [run]\n }\n blocked.sort((x, y) => x[0] - y[0])\n const pieces: Run[] = []\n let from = 0\n for (const [lo, hi] of blocked) {\n if (lo - from >= KMER) {\n pieces.push(sliceRun(run, from, lo))\n }\n from = Math.max(from, hi)\n }\n if (len - from >= KMER) {\n pieces.push(sliceRun(run, from, len))\n }\n return pieces\n}\n\n// The best-scoring collinear chain of runs matching minMatch bases or more,\n// then the best over the runs that overlap no accepted run on either sequence,\n// and so on: a second copy of a repeat finds its target taken and an inversion\n// finds its target free. A run that overlaps its predecessor is trimmed from\n// the front, which an exact match allows at any base.\nfunction chainRuns(\n runs: Run[],\n maxGap: number,\n minMatch: number,\n jumpCost: JumpCost,\n maxChains = Infinity,\n) {\n const chains: Link[][] = []\n const basesTaken = { query: [] as Interval[], target: [] as Interval[] }\n const spanTaken = {\n forward: { query: [] as Interval[], target: [] as Interval[] },\n flipped: { query: [] as Interval[], target: [] as Interval[] },\n }\n let pool = [...runs].sort((a, b) => a.qs - b.qs || a.ts - b.ts)\n while (pool.length > 0 && chains.length < maxChains) {\n const score = pool.map(run => run.qe - run.qs)\n const back = new Int32Array(pool.length).fill(-1)\n const trims = new Int32Array(pool.length)\n for (let j = 0; j < pool.length; j++) {\n const b = pool[j]!\n const len = b.qe - b.qs\n for (let i = j - 1; i >= Math.max(0, j - CHAIN_LOOKBACK); i--) {\n if (score[i]! + len <= score[j]!) {\n continue\n }\n const a = pool[i]!\n const advances =\n a.flipped === b.flipped &&\n a.qs < b.qs &&\n (b.flipped ? b.te < a.te : a.ts < b.ts)\n if (advances) {\n const trim = Math.max(\n 0,\n a.qe - b.qs,\n b.flipped ? b.te - a.ts : a.te - b.ts,\n )\n const dq = b.qs + trim - a.qe\n const dt = b.flipped ? a.ts - (b.te - trim) : b.ts + trim - a.te\n if (trim < len && dq <= maxGap && dt <= maxGap) {\n const candidate = score[i]! + len - trim - jumpCost(dq, dt)\n if (candidate > score[j]!) {\n score[j] = candidate\n back[j] = i\n trims[j] = trim\n }\n }\n }\n }\n }\n const matched = new Int32Array(pool.length)\n let end = -1\n for (let j = 0; j < pool.length; j++) {\n const run = pool[j]!\n matched[j] = (matched[back[j]!] ?? 0) + run.qe - run.qs - trims[j]!\n if (matched[j]! >= minMatch && (end < 0 || score[j]! > score[end]!)) {\n end = j\n }\n }\n if (end < 0) {\n break\n }\n const chain: Link[] = []\n for (let j = end; j >= 0; j = back[j]!) {\n chain.push({ run: pool[j]!, trim: trims[j]! })\n }\n chain.reverse()\n chains.push(chain)\n // A record's CIGAR accounts for every base between its ends in its own\n // orientation, so a later chain of that orientation may not nest in its\n // gaps: taking only the runs let one re-claim an earlier record's bases on\n // a paralog. An inversion is what a forward CIGAR cannot account for, so\n // across orientations only the bases themselves are taken.\n const first = chain[0]!\n const last = chain.at(-1)!\n const { flipped } = first.run\n const spans = flipped ? spanTaken.flipped : spanTaken.forward\n spans.query.push([first.run.qs + first.trim, last.run.qe])\n spans.target.push(\n flipped\n ? [last.run.ts, first.run.te - first.trim]\n : [first.run.ts + first.trim, last.run.te],\n )\n for (const { run, trim } of chain) {\n basesTaken.query.push([run.qs + trim, run.qe])\n basesTaken.target.push(\n run.flipped ? [run.ts, run.te - trim] : [run.ts + trim, run.te],\n )\n }\n pool = pool\n .flatMap(run => {\n const same = run.flipped ? spanTaken.flipped : spanTaken.forward\n return untakenPieces(\n run,\n [...basesTaken.query, ...same.query],\n [...basesTaken.target, ...same.target],\n )\n })\n .sort((x, y) => x.qs - y.qs || x.ts - y.ts)\n }\n return chains\n}\n\n// Exact matches of KMER bases or more between a and b, as runs along a\n// diagonal. A k-mer the target holds many times over seeds nothing.\nfunction forwardKmerRuns(a: string, b: string) {\n const index = new Map<string, number[]>()\n for (let p = 0; p + KMER <= b.length; p++) {\n const kmer = b.slice(p, p + KMER)\n const seen = index.get(kmer)\n if (seen) {\n seen.push(p)\n } else {\n index.set(kmer, [p])\n }\n }\n const runs: Run[] = []\n const open = new Map<number, Run>()\n for (let i = 0; i + KMER <= a.length; i++) {\n const hits = index.get(a.slice(i, i + KMER))\n if (hits && hits.length <= MAX_KMER_OCCURRENCES) {\n for (const p of hits) {\n const diagonal = p - i\n const run = open.get(diagonal)\n if (run && i <= run.qe) {\n run.qe = i + KMER\n run.te = p + KMER\n } else {\n const started = {\n qs: i,\n qe: i + KMER,\n ts: p,\n te: p + KMER,\n flipped: false,\n }\n open.set(diagonal, started)\n runs.push(started)\n }\n }\n }\n }\n return runs\n}\n\nfunction kmerRuns(a: string, b: string) {\n return [\n ...forwardKmerRuns(a, b),\n ...forwardKmerRuns(a, reverseComplement(b)).map(run => ({\n ...run,\n ts: b.length - run.te,\n te: b.length - run.ts,\n flipped: true,\n })),\n ]\n}\n\ntype GapFill = (\n a: string,\n b: string,\n edits: PairEdit[],\n queryFrom: number,\n targetFrom: number,\n) => void\n\n// The edits of one chain: each run is a run of `=`, and what lies between two\n// runs goes to `between`. Edits read along the query; the caller reverses a\n// flipped chain's so they read along the target.\nfunction chainEdits(\n chain: Link[],\n a: string,\n b: string,\n edits: PairEdit[],\n between: GapFill,\n) {\n let previous: Run | undefined\n for (const { run, trim } of chain) {\n const qs = run.qs + trim\n if (previous) {\n const targetFrom = run.flipped ? run.te - trim : previous.te\n const targetTo = run.flipped ? previous.ts : run.ts + trim\n const target = b.slice(targetFrom, targetTo)\n between(\n a.slice(previous.qe, qs),\n run.flipped ? reverseComplement(target) : target,\n edits,\n previous.qe,\n targetFrom,\n )\n }\n appendEdit(edits, '=', run.qe - qs)\n previous = run\n }\n}\n\n// An insertion and a deletion, which claims no homology\nfunction unaligned(a: string, b: string, edits: PairEdit[]) {\n appendEdit(edits, 'I', a.length)\n appendEdit(edits, 'D', b.length)\n}\n\nfunction alignExact(a: string, b: string, edits: PairEdit[]) {\n if (a.length * b.length <= MAX_ALIGNED_CELLS) {\n affineAlignment(a, b, edits)\n } else {\n unaligned(a, b, edits)\n }\n}\n\n// The private bases between two runs of one chain, whose orientation the chain\n// has already fixed. Past the cell budget they are seeded on forward k-mers and\n// chained again, recursing into the gaps that chain leaves. It finds no\n// inversions, since the stretch has an orientation already.\nfunction fillGap(a: string, b: string, edits: PairEdit[], depth = 0) {\n const [chain] =\n a.length * b.length > MAX_ALIGNED_CELLS && depth < MAX_FILL_DEPTH\n ? chainRuns(forwardKmerRuns(a, b), Infinity, KMER, kmerJumpCost, 1)\n : []\n if (!chain) {\n alignExact(a, b, edits)\n return\n }\n const deeper = (qa: string, tb: string, into: PairEdit[]) => {\n fillGap(qa, tb, into, depth + 1)\n }\n const first = chain[0]!.run\n const last = chain.at(-1)!.run\n deeper(a.slice(0, first.qs), b.slice(0, first.ts), edits)\n chainEdits(chain, a, b, edits, deeper)\n deeper(a.slice(last.qe), b.slice(last.te), edits)\n}\n\nfunction fill(a: string, b: string, edits: PairEdit[]) {\n fillGap(a, b, edits)\n}\n\n// A chain as a record in the coordinates of the two strings it was made on\nfunction recordOf(chain: Link[], a: string, b: string): PairChain {\n const edits: PairEdit[] = []\n chainEdits(chain, a, b, edits, fill)\n const first = chain[0]!\n const last = chain.at(-1)!\n const { flipped } = first.run\n return {\n queryStart: first.run.qs + first.trim,\n queryEnd: last.run.qe,\n targetStart: flipped ? last.run.ts : first.run.ts + first.trim,\n targetEnd: flipped ? first.run.te - first.trim : last.run.te,\n strand: flipped ? '-' : '+',\n edits: flipped ? edits.reverse() : edits,\n sharedBases: 0,\n }\n}\n\n// The private bases between two shared nodes. A pair too large for the exact\n// alignment is seeded on shared k-mers in both orientations and chained the\n// way the walks are, which aligns two long copies of one sequence the graph\n// left apart. The best forward chain becomes edits. A flipped chain is an\n// inversion, which no CIGAR holds, so it comes back as a record of its own in\n// the coordinates of a and b. What no chain reaches is an insertion and a\n// deletion, which claims no homology.\nfunction alignPrivate(\n a: string,\n b: string,\n edits: PairEdit[],\n minMatch: number,\n): PairChain[] {\n let inversions: PairChain[] = []\n if (a.length * b.length <= MAX_ALIGNED_CELLS) {\n affineAlignment(a, b, edits)\n } else {\n const chains = chainRuns(\n kmerRuns(a, b),\n Infinity,\n Math.max(minMatch, KMER),\n kmerJumpCost,\n )\n const forward = chains.find(chain => !chain[0]!.run.flipped)\n inversions = chains\n .filter(chain => chain[0]!.run.flipped)\n .map(chain => recordOf(chain, a, b))\n if (forward) {\n // The forward record holds no inversion, so an inversion's bases stay\n // unaligned in it. A gap that hides one is not seeded again: at a tandem\n // array that finds only a neighbouring copy, matched forward over bases\n // the inversion's own record already claims.\n const forwardFill: GapFill = (qa, tb, into, queryFrom, targetFrom) => {\n const hidesInversion = inversions.some(\n inversion =>\n (queryFrom < inversion.queryEnd &&\n inversion.queryStart < queryFrom + qa.length) ||\n (targetFrom < inversion.targetEnd &&\n inversion.targetStart < targetFrom + tb.length),\n )\n if (hidesInversion) {\n alignExact(qa, tb, into)\n } else {\n fillGap(qa, tb, into)\n }\n }\n const first = forward[0]!.run\n const last = forward.at(-1)!.run\n forwardFill(a.slice(0, first.qs), b.slice(0, first.ts), edits, 0, 0)\n chainEdits(forward, a, b, edits, forwardFill)\n forwardFill(a.slice(last.qe), b.slice(last.te), edits, last.qe, last.te)\n } else {\n unaligned(a, b, edits)\n }\n }\n return inversions\n}\n\ninterface Claimed extends PairChain {\n // query stretches on nodes both walks visit\n shared: Interval[]\n}\n\ntype Side = 'query' | 'target'\n\n// Each edit of a record with the query and target position it sits at. A `-`\n// record's edits read along the target, so its query runs down from queryEnd.\nfunction forEachEdit(\n r: PairChain,\n visit: (op: PairOp, len: number, query: number, target: number) => void,\n) {\n const flipped = r.strand === '-'\n let qi = 0\n let ti = 0\n for (const [op, len] of r.edits) {\n visit(\n op,\n len,\n flipped ? r.queryEnd - 1 - qi : r.queryStart + qi,\n r.targetStart + ti,\n )\n if (op !== 'D') {\n qi += len\n }\n if (op !== 'I') {\n ti += len\n }\n }\n}\n\n// A record's score under vg's model over [lo, hi) on one side: a column counts\n// where its base on that side does, and a gap where it opens on that side.\nfunction scoreOver(r: PairChain, side: Side, lo: number, hi: number) {\n const step = side === 'query' && r.strand === '-' ? -1 : 1\n let score = 0\n forEachEdit(r, (op, len, query, target) => {\n const from = side === 'query' ? query : target\n const inside = (k: number) => {\n const at = from + step * k\n return at >= lo && at < hi\n }\n if (op === '=' || op === 'X') {\n for (let k = 0; k < len; k++) {\n if (inside(k)) {\n score += op === '=' ? MATCH : MISMATCH\n }\n }\n } else if ((op === 'I') === (side === 'query')) {\n for (let k = 0; k < len; k++) {\n if (inside(k)) {\n score += k === 0 ? GAP_OPEN : GAP_EXTEND\n }\n }\n } else if (inside(0)) {\n score += GAP_OPEN + (len - 1) * GAP_EXTEND\n }\n })\n return score\n}\n\nfunction spanOf(r: PairChain, side: Side): Interval {\n return side === 'query'\n ? [r.queryStart, r.queryEnd]\n : [r.targetStart, r.targetEnd]\n}\n\n// A record's edits with the aligned columns `lost` marks turned into an\n// insertion and a deletion, and its ends trimmed to the columns it keeps.\nfunction withoutColumns(r: Claimed, lost: Uint8Array): Claimed | undefined {\n const flipped = r.strand === '-'\n const edits: PairEdit[] = []\n let pendingQuery = 0\n let pendingTarget = 0\n let column = 0\n let sharedLost = 0\n const sharedMask = new Uint8Array(r.queryEnd - r.queryStart)\n for (const [s, e] of r.shared) {\n sharedMask.fill(1, s - r.queryStart, e - r.queryStart)\n }\n const inShared = (at: number) => sharedMask[at - r.queryStart] === 1\n const flush = () => {\n appendEdit(edits, 'I', pendingQuery)\n appendEdit(edits, 'D', pendingTarget)\n pendingQuery = 0\n pendingTarget = 0\n }\n forEachEdit(r, (op, len, query) => {\n if (op === 'I') {\n pendingQuery += len\n } else if (op === 'D') {\n pendingTarget += len\n } else {\n for (let k = 0; k < len; k++) {\n if (lost[column + k]) {\n pendingQuery += 1\n pendingTarget += 1\n if (inShared(flipped ? query - k : query + k)) {\n sharedLost += 1\n }\n } else {\n if (pendingQuery > 0 || pendingTarget > 0) {\n flush()\n }\n appendEdit(edits, op, 1)\n }\n }\n column += len\n }\n })\n flush()\n const lead = { I: 0, D: 0 }\n while (edits[0]?.[0] === 'I' || edits[0]?.[0] === 'D') {\n const [op, len] = edits.shift()!\n lead[op as 'I' | 'D'] += len\n }\n const tail = { I: 0, D: 0 }\n while (edits.at(-1)?.[0] === 'I' || edits.at(-1)?.[0] === 'D') {\n const [op, len] = edits.pop()!\n tail[op as 'I' | 'D'] += len\n }\n return edits.length === 0\n ? undefined\n : {\n ...r,\n queryStart: r.queryStart + (flipped ? tail.I : lead.I),\n queryEnd: r.queryEnd - (flipped ? lead.I : tail.I),\n targetStart: r.targetStart + lead.D,\n targetEnd: r.targetEnd - tail.D,\n edits,\n sharedBases: r.sharedBases - sharedLost,\n }\n}\n\n// A base aligns in one record at most. Where two records align the same bases\n// on either walk, the one scoring higher over the stretch their spans share\n// keeps them, and the other gives them up as an insertion and a deletion. In a\n// tandem array whose copies run both ways, one query copy aligns forward to one\n// target copy and inverted to another, and both are homology; the scoring\n// decides which one the pair's picture shows. A tie goes to the record with\n// more bases on shared nodes: alignPrivate finds an inversion a walk takes\n// through shared nodes again, base for base, in the gap of the forward record\n// spanning it.\nfunction claimOnce(\n records: Claimed[],\n queryLength: number,\n targetLength: number,\n minMatch: number,\n) {\n const claims = {\n query: new Uint8Array(queryLength),\n target: new Uint8Array(targetLength),\n }\n const columnsOf = records.map(r => {\n const columns: [number, number][] = []\n forEachEdit(r, (op, len, query, target) => {\n if (op === '=' || op === 'X') {\n for (let k = 0; k < len; k++) {\n columns.push([r.strand === '-' ? query - k : query + k, target + k])\n }\n }\n })\n for (const [query, target] of columns) {\n claims.query[query] = Math.min(255, claims.query[query]! + 1)\n claims.target[target] = Math.min(255, claims.target[target]! + 1)\n }\n return columns\n })\n const holders = {\n query: new Map<number, number[]>(),\n target: new Map<number, number[]>(),\n }\n columnsOf.forEach((columns, i) => {\n for (const [query, target] of columns) {\n for (const [side, at] of [\n ['query', query],\n ['target', target],\n ] as const) {\n if (claims[side][at]! > 1) {\n const held = holders[side].get(at)\n if (!held) {\n holders[side].set(at, [i])\n } else if (held.at(-1) !== i) {\n held.push(i)\n }\n }\n }\n }\n })\n const beaten = new Map<string, boolean>()\n const losesTo = (i: number, j: number, side: Side) => {\n const key = `${side}:${i}:${j}`\n let loses = beaten.get(key)\n if (loses === undefined) {\n const [si, ei] = spanOf(records[i]!, side)\n const [sj, ej] = spanOf(records[j]!, side)\n const lo = Math.max(si, sj)\n const hi = Math.min(ei, ej)\n const [mine, theirs] = [records[i]!, records[j]!]\n const margins = [\n scoreOver(theirs, side, lo, hi) - scoreOver(mine, side, lo, hi),\n theirs.sharedBases - mine.sharedBases,\n i - j,\n ]\n loses = margins.find(margin => margin !== 0)! > 0\n beaten.set(key, loses)\n }\n return loses\n }\n return records.flatMap((r, i) => {\n const columns = columnsOf[i]!\n const lost = new Uint8Array(columns.length)\n columns.forEach(([query, target], c) => {\n for (const [side, at] of [\n ['query', query],\n ['target', target],\n ] as const) {\n if (\n !lost[c] &&\n holders[side].get(at)?.some(j => j !== i && losesTo(i, j, side))\n ) {\n lost[c] = 1\n }\n }\n })\n if (!lost.includes(1)) {\n return [r]\n }\n const kept = withoutColumns(r, lost)\n const matched =\n kept?.edits.reduce((sum, [op, len]) => sum + (op === '=' ? len : 0), 0) ??\n 0\n return kept && matched >= minMatch ? [kept] : []\n })\n}\n\nfunction walkSequence(walk: number[], sequenceOf: (id: number) => string) {\n return walk\n .map(handle => {\n const sequence = sequenceOf(nodeId(handle))\n return isReverse(handle) ? reverseComplement(sequence) : sequence\n })\n .join('')\n}\n\nfunction walkOffsets(walk: number[], sequenceOf: (id: number) => string) {\n const offsets = [0]\n for (const handle of walk) {\n offsets.push(offsets.at(-1)! + sequenceOf(nodeId(handle)).length)\n }\n return offsets\n}\n\n// The steps between a walk's first and last visit to any node it visits more\n// than once. Copies of a repeat folded onto one node say nothing about which\n// copy of one haplotype pairs with which copy of the other, and a graph can\n// pair them out of register, so there the bases decide.\nfunction repeatSteps(walk: number[]) {\n const first = new Map<number, number>()\n const last = new Map<number, number>()\n walk.forEach((handle, i) => {\n const id = nodeId(handle)\n if (first.has(id)) {\n last.set(id, i)\n } else {\n first.set(id, i)\n }\n })\n const change = new Int32Array(walk.length + 1)\n for (const [id, end] of last) {\n change[first.get(id)!]! += 1\n change[end + 1]! -= 1\n }\n const inside = new Uint8Array(walk.length)\n let depth = 0\n for (let i = 0; i < walk.length; i++) {\n depth += change[i]!\n inside[i] = depth > 0 ? 1 : 0\n }\n return inside\n}\n\n// Every stretch of steps the two walks take through the same nodes, in the\n// same order or the opposite one, outside both walks' repeats.\nfunction sharedRuns(\n query: number[],\n target: number[],\n queryOffsets: number[],\n targetOffsets: number[],\n) {\n const queryRepeat = repeatSteps(query)\n const targetRepeat = repeatSteps(target)\n const visits = new Map<number, number[]>()\n target.forEach((handle, rank) => {\n if (!targetRepeat[rank]) {\n visits.set(nodeId(handle), [rank])\n }\n })\n const width = 2 * target.length\n const key = (i: number, rank: number, flipped: boolean) =>\n i * width + 2 * rank + (flipped ? 1 : 0)\n const seeds = new Set<number>()\n query.forEach((handle, i) => {\n for (const rank of queryRepeat[i]\n ? []\n : (visits.get(nodeId(handle)) ?? [])) {\n seeds.add(key(i, rank, isReverse(handle) !== isReverse(target[rank]!)))\n }\n })\n const runs: Run[] = []\n query.forEach((handle, i) => {\n for (const rank of queryRepeat[i]\n ? []\n : (visits.get(nodeId(handle)) ?? [])) {\n const flipped = isReverse(handle) !== isReverse(target[rank]!)\n const step = flipped ? -1 : 1\n const previous = rank - step\n const continues =\n i > 0 &&\n previous >= 0 &&\n previous < target.length &&\n seeds.has(key(i - 1, previous, flipped))\n if (!continues) {\n let j = i\n let r = rank\n while (\n j < query.length &&\n r >= 0 &&\n r < target.length &&\n seeds.has(key(j, r, flipped))\n ) {\n j += 1\n r += step\n }\n const lastRank = r - step\n runs.push({\n qs: queryOffsets[i]!,\n qe: queryOffsets[j]!,\n ts: targetOffsets[Math.min(rank, lastRank)]!,\n te: targetOffsets[Math.max(rank, lastRank) + 1]!,\n flipped,\n })\n }\n }\n })\n return runs\n}\n\n// A query walk's alignments to a target walk. A stretch of nodes both walks\n// visit is a run of `=`, a record is the best collinear chain of those\n// stretches, and what lies between two of them is aligned base by base under\n// vg's scoring, an inversion there coming back as a record of its own. With\n// bases false it is an insertion and a deletion instead. A chain pays for the\n// gap it spans, so by default nothing bounds how far it reaches but the window;\n// maxGap caps that to bound the work. A record matching under minMatch bases is\n// dropped. Coordinates count from each walk's first base; a `-` record's edits\n// read along the target, the way minimap2 writes a reverse-strand row.\nexport function pairAlignments(opts: PairOptions): PairChain[] {\n const { query, target, sequenceOf } = opts\n const a = walkSequence(query, sequenceOf)\n const b = walkSequence(target, sequenceOf)\n const runs = sharedRuns(\n query,\n target,\n walkOffsets(query, sequenceOf),\n walkOffsets(target, sequenceOf),\n )\n const minMatch = opts.minMatch ?? DEFAULT_MIN_MATCH\n const bases = opts.bases ?? true\n const records: Claimed[] = []\n for (const chain of chainRuns(\n runs,\n opts.maxGap ?? Infinity,\n minMatch,\n stepJumpCost,\n )) {\n const edits: PairEdit[] = []\n const first = chain[0]!\n const last = chain.at(-1)!\n const { flipped } = first.run\n const alignBetween: GapFill = (qa, tb, into, queryFrom, targetFrom) => {\n for (const inversion of alignPrivate(qa, tb, into, minMatch)) {\n const targetTo = targetFrom + tb.length\n records.push({\n ...inversion,\n queryStart: queryFrom + inversion.queryStart,\n queryEnd: queryFrom + inversion.queryEnd,\n targetStart: flipped\n ? targetTo - inversion.targetEnd\n : targetFrom + inversion.targetStart,\n targetEnd: flipped\n ? targetTo - inversion.targetStart\n : targetFrom + inversion.targetEnd,\n strand: flipped ? '+' : '-',\n edits: flipped ? inversion.edits.reverse() : inversion.edits,\n shared: [],\n })\n }\n }\n chainEdits(chain, a, b, edits, bases ? alignBetween : unaligned)\n records.push({\n queryStart: first.run.qs + first.trim,\n queryEnd: last.run.qe,\n targetStart: flipped ? last.run.ts : first.run.ts + first.trim,\n targetEnd: flipped ? first.run.te - first.trim : last.run.te,\n strand: flipped ? '-' : '+',\n edits: flipped ? edits.reverse() : edits,\n sharedBases: chain.reduce(\n (sum, { run, trim }) => sum + run.qe - run.qs - trim,\n 0,\n ),\n shared: chain.map(({ run, trim }) => [run.qs + trim, run.qe]),\n })\n }\n return claimOnce(records, a.length, b.length, minMatch)\n .map(({ shared: _, ...record }) => record)\n .sort((x, y) => x.queryStart - y.queryStart)\n}\n\nexport function pairCigar(edits: PairEdit[]) {\n return edits.map(([op, len]) => `${len}${op}`).join('')\n}\n"],
5
- "mappings": "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",
6
- "names": ["encodeNode", "id", "orientation", "nodeId", "handle", "nodeOrientation", "isReverse", "flipNode", "flipSide", "side", "entrySide", "exitSide", "entryOrientation", "exitOrientation", "edgeIsCanonical", "from", "to", "fromId", "toId", "pathIsCanonical", "path", "pathEndsAreCanonical", "first", "last", "DECODE", "encodedSequenceLength", "encoded", "last", "value", "inLast", "i", "decodeSequence", "result", "byte", "base", "COMPLEMENT", "reverseComplement", "sequence", "lowerBound", "ascending", "value", "lo", "hi", "mid", "ColumnMax", "columns", "column", "best", "p", "candidate", "holder", "SparseLcs", "a", "b", "weight", "x", "j", "list", "a0", "a1", "b0", "b1", "prefix", "suffix", "k", "i", "matches", "split", "count", "from", "to", "step", "trace", "w", "before", "match", "last", "chained", "width", "after", "s", "combined", "weightedLcs", "lcs", "DEFAULT_MIN_MATCH", "MAX_ALIGNED_CELLS", "CHAIN_LOOKBACK", "KMER", "MAX_KMER_OCCURRENCES", "MAX_FILL_DEPTH", "MATCH", "MISMATCH", "GAP_OPEN", "GAP_EXTEND", "UNREACHABLE", "DIAGONAL", "INSERTION", "DELETION", "appendEdit", "edits", "op", "len", "last", "best", "diagonal", "insertion", "deletion", "affineAlignment", "a", "b", "la", "lb", "width", "trace", "j", "i", "nextDiagonal", "nextInsertion", "nextDeletion", "ai", "fromDiagonal", "fromInsertion", "fromDeletion", "ops", "state", "from", "stepJumpCost", "dq", "dt", "indel", "kmerJumpCost", "sliceRun", "run", "to", "untakenPieces", "query", "target", "blocked", "s", "e", "lo", "hi", "x", "y", "pieces", "chainRuns", "runs", "maxGap", "minMatch", "jumpCost", "maxChains", "chains", "basesTaken", "spanTaken", "pool", "score", "back", "trims", "trim", "candidate", "matched", "end", "chain", "first", "flipped", "spans", "same", "forwardKmerRuns", "index", "p", "kmer", "seen", "open", "hits", "started", "kmerRuns", "reverseComplement", "chainEdits", "between", "previous", "qs", "targetFrom", "targetTo", "unaligned", "alignExact", "fillGap", "depth", "deeper", "qa", "tb", "into", "fill", "recordOf", "alignPrivate", "inversions", "forward", "forwardFill", "queryFrom", "inversion", "forEachEdit", "r", "visit", "qi", "ti", "scoreOver", "side", "step", "inside", "k", "at", "spanOf", "withoutColumns", "lost", "pendingQuery", "pendingTarget", "column", "sharedLost", "sharedMask", "inShared", "flush", "lead", "tail", "claimOnce", "records", "queryLength", "targetLength", "claims", "columnsOf", "columns", "holders", "held", "beaten", "losesTo", "key", "loses", "si", "ei", "sj", "ej", "mine", "theirs", "margin", "c", "kept", "sum", "walkSequence", "walk", "sequenceOf", "handle", "sequence", "nodeId", "isReverse", "walkOffsets", "offsets", "repeatSteps", "id", "change", "sharedRuns", "queryOffsets", "targetOffsets", "queryRepeat", "targetRepeat", "visits", "rank", "seeds", "lastRank", "pairAlignments", "opts", "bases", "_", "record", "pairCigar"]
3
+ "sources": ["../../node_modules/.pnpm/@gmod+gbz-base@7.4.1/node_modules/@gmod/gbz-base/src/gbwt/node.ts", "../../node_modules/.pnpm/@gmod+gbz-base@7.4.1/node_modules/@gmod/gbz-base/src/gbwt/sequence.ts", "../../node_modules/.pnpm/@gmod+gbz-base@7.4.1/node_modules/@gmod/gbz-base/src/lcs.ts", "../../node_modules/.pnpm/@gmod+gbz-base@7.4.1/node_modules/@gmod/gbz-base/src/pairAlignment.ts", "../../src/nodeLimitError.ts"],
4
+ "sourcesContent": ["export const ENDMARKER = 0\n\nexport type Orientation = 'forward' | 'reverse'\n\nexport function encodeNode(id: number, orientation: Orientation) {\n return 2 * id + (orientation === 'reverse' ? 1 : 0)\n}\n\nexport function nodeId(handle: number) {\n return Math.floor(handle / 2)\n}\n\nexport function nodeOrientation(handle: number): Orientation {\n return handle % 2 === 0 ? 'forward' : 'reverse'\n}\n\nexport function isReverse(handle: number) {\n return handle % 2 === 1\n}\n\nexport function flipNode(handle: number) {\n return handle % 2 === 0 ? handle + 1 : handle - 1\n}\n\nexport type NodeSide = 'left' | 'right'\n\nexport function flipSide(side: NodeSide): NodeSide {\n return side === 'left' ? 'right' : 'left'\n}\n\nexport function entrySide(orientation: Orientation): NodeSide {\n return orientation === 'forward' ? 'left' : 'right'\n}\n\nexport function exitSide(orientation: Orientation): NodeSide {\n return orientation === 'forward' ? 'right' : 'left'\n}\n\nexport function entryOrientation(side: NodeSide): Orientation {\n return side === 'left' ? 'forward' : 'reverse'\n}\n\nexport function exitOrientation(side: NodeSide): Orientation {\n return side === 'right' ? 'forward' : 'reverse'\n}\n\nexport function edgeIsCanonical(from: number, to: number) {\n const fromId = nodeId(from)\n const toId = nodeId(to)\n return isReverse(from)\n ? toId > fromId || (toId === fromId && !isReverse(to))\n : toId >= fromId\n}\n\nexport function pathIsCanonical(path: number[]) {\n return pathEndsAreCanonical(path[0], path[path.length - 1])\n}\n\nexport function pathEndsAreCanonical(\n first: number | undefined,\n last: number | undefined,\n) {\n if (first === undefined || last === undefined) {\n return true\n }\n return isReverse(first) === isReverse(last)\n ? !isReverse(first)\n : edgeIsCanonical(first, last)\n}\n", "const DECODE = ['', 'A', 'C', 'G', 'T', 'N']\n\nexport function encodedSequenceLength(encoded: Uint8Array) {\n const last = encoded[encoded.length - 1]\n if (last === undefined) {\n return 0\n }\n let value = last\n let inLast = 0\n for (let i = 0; i < 3; i++) {\n if (value % 6 === 0) {\n break\n }\n value = Math.floor(value / 6)\n inLast += 1\n }\n return 3 * (encoded.length - 1) + inLast\n}\n\nexport function decodeSequence(encoded: Uint8Array) {\n let result = ''\n for (const byte of encoded) {\n let value = byte\n for (let i = 0; i < 3; i++) {\n const base = DECODE[value % 6]!\n if (base === '') {\n return result\n }\n value = Math.floor(value / 6)\n result += base\n }\n }\n return result\n}\n\nconst COMPLEMENT: Record<string, string> = {\n A: 'T',\n C: 'G',\n G: 'C',\n T: 'A',\n N: 'N',\n}\n\nexport function reverseComplement(sequence: string) {\n let result = ''\n for (let i = sequence.length - 1; i >= 0; i--) {\n result += COMPLEMENT[sequence[i]!] ?? 'N'\n }\n return result\n}\n", "type Weight = (x: number) => number\n\nfunction lowerBound(ascending: number[], value: number) {\n let lo = 0\n let hi = ascending.length\n while (lo < hi) {\n const mid = (lo + hi) >> 1\n if (ascending[mid]! < value) {\n lo = mid + 1\n } else {\n hi = mid\n }\n }\n return lo\n}\n\nclass ColumnMax {\n readonly ending: Float64Array\n private readonly tree: Int32Array\n\n constructor(columns: number) {\n this.ending = new Float64Array(columns)\n this.tree = new Int32Array(columns + 1).fill(-1)\n }\n\n bestBefore(column: number) {\n let best = -1\n for (let p = column; p > 0; p -= p & -p) {\n const candidate = this.tree[p]!\n if (\n candidate !== -1 &&\n (best === -1 || this.ending[candidate]! > this.ending[best]!)\n ) {\n best = candidate\n }\n }\n return best\n }\n\n raise(column: number, value: number) {\n this.ending[column] = value\n for (let p = column + 1; p < this.tree.length; p += p & -p) {\n const holder = this.tree[p]!\n if (holder === -1 || value > this.ending[holder]!) {\n this.tree[p] = column\n }\n }\n }\n}\n\ninterface Trace {\n row: Int32Array\n column: Int32Array\n previous: Int32Array\n endingMatch: Int32Array\n count: number\n}\n\nclass SparseLcs {\n readonly pairs: [number, number][] = []\n total = 0\n private readonly a: number[]\n private readonly b: number[]\n private readonly weight: Weight\n private readonly occurrences = new Map<number, number[]>()\n\n constructor(a: number[], b: number[], weight: Weight) {\n this.a = a\n this.b = b\n this.weight = weight\n b.forEach((x, j) => {\n const list = this.occurrences.get(x)\n if (list) {\n list.push(j)\n } else {\n this.occurrences.set(x, [j])\n }\n })\n }\n\n solve(a0: number, a1: number, b0: number, b1: number) {\n let prefix = 0\n while (\n a0 + prefix < a1 &&\n b0 + prefix < b1 &&\n this.a[a0 + prefix] === this.b[b0 + prefix]\n ) {\n this.match(a0 + prefix, b0 + prefix)\n prefix += 1\n }\n let suffix = 0\n while (\n a1 - suffix > a0 + prefix &&\n b1 - suffix > b0 + prefix &&\n this.a[a1 - suffix - 1] === this.b[b1 - suffix - 1]\n ) {\n suffix += 1\n }\n this.solveMiddle(a0 + prefix, a1 - suffix, b0 + prefix, b1 - suffix)\n for (let k = suffix; k > 0; k--) {\n this.match(a1 - k, b1 - k)\n }\n }\n\n private match(i: number, j: number) {\n this.pairs.push([i, j])\n this.total += this.weight(this.a[i]!)\n }\n\n private solveMiddle(a0: number, a1: number, b0: number, b1: number) {\n if (a0 === a1 || b0 === b1) {\n return\n }\n const matches = this.matchCount(a0, a1, b0, b1)\n if (matches === 0) {\n return\n }\n if (matches <= a1 - a0 + (b1 - b0)) {\n this.chain(a0, a1, b0, b1, matches)\n return\n }\n const mid = (a0 + a1) >> 1\n const split = this.split(a0, mid, a1, b0, b1)\n this.solve(a0, mid, b0, split)\n this.solve(mid, a1, split, b1)\n }\n\n private matchCount(a0: number, a1: number, b0: number, b1: number) {\n let count = 0\n for (let i = a0; i < a1; i++) {\n const list = this.occurrences.get(this.a[i]!)\n if (list) {\n count += lowerBound(list, b1) - lowerBound(list, b0)\n }\n }\n return count\n }\n\n private sweep(\n from: number,\n to: number,\n step: 1 | -1,\n b0: number,\n b1: number,\n columns: ColumnMax,\n trace?: Trace,\n ) {\n for (let i = from; i !== to; i += step) {\n const list = this.occurrences.get(this.a[i]!)\n if (!list) {\n continue\n }\n const w = this.weight(this.a[i]!)\n const lo = lowerBound(list, b0)\n const hi = lowerBound(list, b1)\n for (let k = 0; k < hi - lo; k++) {\n const column =\n step === 1 ? list[hi - 1 - k]! - b0 : b1 - 1 - list[lo + k]!\n const before = columns.bestBefore(column)\n const value = (before === -1 ? 0 : columns.ending[before]!) + w\n if (value > columns.ending[column]!) {\n columns.raise(column, value)\n if (trace) {\n const match = trace.count++\n trace.row[match] = i\n trace.column[match] = column\n trace.previous[match] =\n before === -1 ? -1 : trace.endingMatch[before]!\n trace.endingMatch[column] = match\n }\n }\n }\n }\n }\n\n private chain(\n a0: number,\n a1: number,\n b0: number,\n b1: number,\n matches: number,\n ) {\n const columns = new ColumnMax(b1 - b0)\n const trace: Trace = {\n row: new Int32Array(matches),\n column: new Int32Array(matches),\n previous: new Int32Array(matches),\n endingMatch: new Int32Array(b1 - b0),\n count: 0,\n }\n this.sweep(a0, a1, 1, b0, b1, columns, trace)\n const last = columns.bestBefore(b1 - b0)\n if (last === -1) {\n return\n }\n this.total += columns.ending[last]!\n const chained: [number, number][] = []\n for (\n let match = trace.endingMatch[last]!;\n match !== -1;\n match = trace.previous[match]!\n ) {\n chained.push([trace.row[match]!, b0 + trace.column[match]!])\n }\n for (let k = chained.length - 1; k >= 0; k--) {\n this.pairs.push(chained[k]!)\n }\n }\n\n private frontier(\n from: number,\n to: number,\n step: 1 | -1,\n b0: number,\n b1: number,\n ) {\n const columns = new ColumnMax(b1 - b0)\n this.sweep(from, to, step, b0, b1, columns)\n const best = new Float64Array(b1 - b0 + 1)\n for (let column = 0; column < b1 - b0; column++) {\n best[column + 1] = Math.max(best[column]!, columns.ending[column]!)\n }\n return best\n }\n\n private split(a0: number, mid: number, a1: number, b0: number, b1: number) {\n const width = b1 - b0\n const before = this.frontier(a0, mid, 1, b0, b1)\n const after = this.frontier(a1 - 1, mid - 1, -1, b0, b1)\n let split = 0\n let best = -1\n for (let s = 0; s <= width; s++) {\n const combined = before[s]! + after[width - s]!\n if (combined > best) {\n best = combined\n split = s\n }\n }\n return b0 + split\n }\n}\n\nexport function weightedLcs(\n a: number[],\n b: number[],\n weight: Weight,\n): [pairs: [number, number][], weight: number] {\n const lcs = new SparseLcs(a, b, weight)\n lcs.solve(0, a.length, 0, b.length)\n return [lcs.pairs, lcs.total]\n}\n", "import { isReverse, nodeId } from './gbwt/node.ts'\nimport { reverseComplement } from './gbwt/sequence.ts'\n\nexport type PairOp = '=' | 'X' | 'I' | 'D'\nexport type PairEdit = [PairOp, number]\n\nexport interface PairChain {\n queryStart: number\n queryEnd: number\n targetStart: number\n targetEnd: number\n strand: '+' | '-'\n edits: PairEdit[]\n // bases on nodes both walks visit; the other `=` came from comparing bases\n sharedBases: number\n}\n\nexport interface PairOptions {\n query: number[]\n target: number[]\n sequenceOf: (id: number) => string\n maxGap?: number | undefined\n minMatch?: number | undefined\n bases?: boolean | undefined\n}\n\n// An exact match: query [qs, qe) against target [ts, te), the target read\n// backwards when flipped.\ninterface Run {\n qs: number\n qe: number\n ts: number\n te: number\n flipped: boolean\n}\n\nconst DEFAULT_MIN_MATCH = 100\nconst MAX_ALIGNED_CELLS = 4_000_000\nconst CHAIN_LOOKBACK = 5000\nconst KMER = 15\nconst MAX_KMER_OCCURRENCES = 64\n// each level's gaps lie strictly inside the last, so this only bounds the work\nconst MAX_FILL_DEPTH = 8\n\n// vg's scoring, the model the reference CIGARs in subgraph.ts are scored by\nconst MATCH = 1\nconst MISMATCH = -4\nconst GAP_OPEN = -6\nconst GAP_EXTEND = -1\nconst UNREACHABLE = -(2 ** 30)\n\nconst DIAGONAL = 0\nconst INSERTION = 1\nconst DELETION = 2\n\nfunction appendEdit(edits: PairEdit[], op: PairOp, 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\nfunction best(diagonal: number, insertion: number, deletion: number) {\n return diagonal >= deletion && diagonal >= insertion\n ? DIAGONAL\n : deletion >= insertion\n ? DELETION\n : INSERTION\n}\n\n// The highest-scoring global alignment of a on b under affine gaps. Each cell\n// of `trace` packs, two bits apiece, the state each of the three states came\n// from. A tie goes to the diagonal, then to the deletion, so two stretches\n// with nothing in common read as an insertion followed by a deletion.\nfunction affineAlignment(a: string, b: string, edits: PairEdit[]) {\n const la = a.length\n const lb = b.length\n const width = lb + 1\n const trace = new Uint8Array((la + 1) * width)\n let diagonal = new Int32Array(width).fill(UNREACHABLE)\n let insertion = new Int32Array(width).fill(UNREACHABLE)\n let deletion = new Int32Array(width).fill(UNREACHABLE)\n diagonal[0] = 0\n for (let j = 1; j <= lb; j++) {\n deletion[j] = GAP_OPEN + (j - 1) * GAP_EXTEND\n trace[j] = (j === 1 ? DIAGONAL : DELETION) << 4\n }\n for (let i = 1; i <= la; i++) {\n const nextDiagonal = new Int32Array(width).fill(UNREACHABLE)\n const nextInsertion = new Int32Array(width).fill(UNREACHABLE)\n const nextDeletion = new Int32Array(width).fill(UNREACHABLE)\n nextInsertion[0] = GAP_OPEN + (i - 1) * GAP_EXTEND\n trace[i * width] = (i === 1 ? DIAGONAL : INSERTION) << 2\n const ai = a.charCodeAt(i - 1)\n for (let j = 1; j <= lb; j++) {\n const fromDiagonal = best(\n diagonal[j - 1]!,\n insertion[j - 1]!,\n deletion[j - 1]!,\n )\n nextDiagonal[j] =\n Math.max(diagonal[j - 1]!, insertion[j - 1]!, deletion[j - 1]!) +\n (ai === b.charCodeAt(j - 1) ? MATCH : MISMATCH)\n const fromInsertion = best(\n diagonal[j]! + GAP_OPEN,\n insertion[j]! + GAP_EXTEND,\n deletion[j]! + GAP_OPEN,\n )\n nextInsertion[j] = Math.max(\n diagonal[j]! + GAP_OPEN,\n insertion[j]! + GAP_EXTEND,\n deletion[j]! + GAP_OPEN,\n )\n const fromDeletion = best(\n nextDiagonal[j - 1]! + GAP_OPEN,\n nextInsertion[j - 1]! + GAP_OPEN,\n nextDeletion[j - 1]! + GAP_EXTEND,\n )\n nextDeletion[j] = Math.max(\n nextDiagonal[j - 1]! + GAP_OPEN,\n nextInsertion[j - 1]! + GAP_OPEN,\n nextDeletion[j - 1]! + GAP_EXTEND,\n )\n trace[i * width + j] =\n fromDiagonal | (fromInsertion << 2) | (fromDeletion << 4)\n }\n diagonal = nextDiagonal\n insertion = nextInsertion\n deletion = nextDeletion\n }\n const ops: PairOp[] = []\n let i = la\n let j = lb\n let state = best(diagonal[lb]!, insertion[lb]!, deletion[lb]!)\n while (i > 0 || j > 0) {\n const from = (trace[i * width + j]! >> (2 * state)) & 3\n if (state === DIAGONAL) {\n ops.push(a[i - 1] === b[j - 1] ? '=' : 'X')\n i -= 1\n j -= 1\n } else if (state === INSERTION) {\n ops.push('I')\n i -= 1\n } else {\n ops.push('D')\n j -= 1\n }\n state = from\n }\n for (const op of ops.reverse()) {\n appendEdit(edits, op, 1)\n }\n}\n\n// What a chain of walk steps pays to go from one run to the next over dq\n// private query bases and dt target ones. Those runs lie outside both walks'\n// repeats, so each has one place to go and the cost only has to let a chain\n// hold through a structural variant of any size: vg's charge for a short\n// indel, growing with the logarithm past it.\nfunction stepJumpCost(dq: number, dt: number) {\n const indel = Math.abs(dq - dt)\n const indelCost =\n indel === 0\n ? 0\n : Math.min(\n -GAP_OPEN - (indel - 1) * GAP_EXTEND,\n -GAP_OPEN + 10 * Math.log2(indel),\n )\n return indelCost + (Math.min(dq, dt) > 0 ? -MISMATCH : 0)\n}\n\n// What a chain of k-mer matches pays, which is minimap2's gap cost. Inside a\n// tandem array every copy offers a match, and the term that grows with the\n// indel is what keeps a chain in one register instead of hopping between\n// copies for a slightly longer match.\nfunction kmerJumpCost(dq: number, dt: number) {\n const indel = Math.abs(dq - dt)\n return indel === 0 ? 0 : 0.01 * KMER * indel + 0.5 * Math.log2(indel)\n}\n\ntype JumpCost = (dq: number, dt: number) => number\n\ninterface Link {\n run: Run\n trim: number\n}\n\ntype Interval = [number, number]\n\n// The stretch of a run from offset `from` to `to` along it\nfunction sliceRun(run: Run, from: number, to: number): Run {\n return {\n qs: run.qs + from,\n qe: run.qs + to,\n ts: run.flipped ? run.te - to : run.ts + from,\n te: run.flipped ? run.te - from : run.ts + to,\n flipped: run.flipped,\n }\n}\n\n// What is left of a run once taken bases are cut out of it, as the pieces a\n// k-mer long or more. An exact match divides at any base, so a flank that runs\n// one base into an inversion by chance costs the inversion one base, not all\n// of it.\nfunction untakenPieces(run: Run, query: Interval[], target: Interval[]) {\n const len = run.qe - run.qs\n const blocked: Interval[] = []\n for (const [s, e] of query) {\n const lo = Math.max(0, s - run.qs)\n const hi = Math.min(len, e - run.qs)\n if (lo < hi) {\n blocked.push([lo, hi])\n }\n }\n for (const [s, e] of target) {\n const lo = Math.max(0, run.flipped ? run.te - e : s - run.ts)\n const hi = Math.min(len, run.flipped ? run.te - s : e - run.ts)\n if (lo < hi) {\n blocked.push([lo, hi])\n }\n }\n if (blocked.length === 0) {\n return [run]\n }\n blocked.sort((x, y) => x[0] - y[0])\n const pieces: Run[] = []\n let from = 0\n for (const [lo, hi] of blocked) {\n if (lo - from >= KMER) {\n pieces.push(sliceRun(run, from, lo))\n }\n from = Math.max(from, hi)\n }\n if (len - from >= KMER) {\n pieces.push(sliceRun(run, from, len))\n }\n return pieces\n}\n\n// The best-scoring collinear chain of runs matching minMatch bases or more,\n// then the best over the runs that overlap no accepted run on either sequence,\n// and so on: a second copy of a repeat finds its target taken and an inversion\n// finds its target free. A run that overlaps its predecessor is trimmed from\n// the front, which an exact match allows at any base.\nfunction chainRuns(\n runs: Run[],\n maxGap: number,\n minMatch: number,\n jumpCost: JumpCost,\n maxChains = Infinity,\n) {\n const chains: Link[][] = []\n const basesTaken = { query: [] as Interval[], target: [] as Interval[] }\n const spanTaken = {\n forward: { query: [] as Interval[], target: [] as Interval[] },\n flipped: { query: [] as Interval[], target: [] as Interval[] },\n }\n let pool = [...runs].sort((a, b) => a.qs - b.qs || a.ts - b.ts)\n while (pool.length > 0 && chains.length < maxChains) {\n const score = pool.map(run => run.qe - run.qs)\n const back = new Int32Array(pool.length).fill(-1)\n const trims = new Int32Array(pool.length)\n for (let j = 0; j < pool.length; j++) {\n const b = pool[j]!\n const len = b.qe - b.qs\n for (let i = j - 1; i >= Math.max(0, j - CHAIN_LOOKBACK); i--) {\n if (score[i]! + len <= score[j]!) {\n continue\n }\n const a = pool[i]!\n const advances =\n a.flipped === b.flipped &&\n a.qs < b.qs &&\n (b.flipped ? b.te < a.te : a.ts < b.ts)\n if (advances) {\n const trim = Math.max(\n 0,\n a.qe - b.qs,\n b.flipped ? b.te - a.ts : a.te - b.ts,\n )\n const dq = b.qs + trim - a.qe\n const dt = b.flipped ? a.ts - (b.te - trim) : b.ts + trim - a.te\n if (trim < len && dq <= maxGap && dt <= maxGap) {\n const candidate = score[i]! + len - trim - jumpCost(dq, dt)\n if (candidate > score[j]!) {\n score[j] = candidate\n back[j] = i\n trims[j] = trim\n }\n }\n }\n }\n }\n const matched = new Int32Array(pool.length)\n let end = -1\n for (let j = 0; j < pool.length; j++) {\n const run = pool[j]!\n matched[j] = (matched[back[j]!] ?? 0) + run.qe - run.qs - trims[j]!\n if (matched[j]! >= minMatch && (end < 0 || score[j]! > score[end]!)) {\n end = j\n }\n }\n if (end < 0) {\n break\n }\n const chain: Link[] = []\n for (let j = end; j >= 0; j = back[j]!) {\n chain.push({ run: pool[j]!, trim: trims[j]! })\n }\n chain.reverse()\n chains.push(chain)\n // A record's CIGAR accounts for every base between its ends in its own\n // orientation, so a later chain of that orientation may not nest in its\n // gaps: taking only the runs let one re-claim an earlier record's bases on\n // a paralog. An inversion is what a forward CIGAR cannot account for, so\n // across orientations only the bases themselves are taken.\n const first = chain[0]!\n const last = chain.at(-1)!\n const { flipped } = first.run\n const spans = flipped ? spanTaken.flipped : spanTaken.forward\n spans.query.push([first.run.qs + first.trim, last.run.qe])\n spans.target.push(\n flipped\n ? [last.run.ts, first.run.te - first.trim]\n : [first.run.ts + first.trim, last.run.te],\n )\n for (const { run, trim } of chain) {\n basesTaken.query.push([run.qs + trim, run.qe])\n basesTaken.target.push(\n run.flipped ? [run.ts, run.te - trim] : [run.ts + trim, run.te],\n )\n }\n pool = pool\n .flatMap(run => {\n const same = run.flipped ? spanTaken.flipped : spanTaken.forward\n return untakenPieces(\n run,\n [...basesTaken.query, ...same.query],\n [...basesTaken.target, ...same.target],\n )\n })\n .sort((x, y) => x.qs - y.qs || x.ts - y.ts)\n }\n return chains\n}\n\n// Exact matches of KMER bases or more between a and b, as runs along a\n// diagonal. A k-mer the target holds many times over seeds nothing.\nfunction forwardKmerRuns(a: string, b: string) {\n const index = new Map<string, number[]>()\n for (let p = 0; p + KMER <= b.length; p++) {\n const kmer = b.slice(p, p + KMER)\n const seen = index.get(kmer)\n if (seen) {\n seen.push(p)\n } else {\n index.set(kmer, [p])\n }\n }\n const runs: Run[] = []\n const open = new Map<number, Run>()\n for (let i = 0; i + KMER <= a.length; i++) {\n const hits = index.get(a.slice(i, i + KMER))\n if (hits && hits.length <= MAX_KMER_OCCURRENCES) {\n for (const p of hits) {\n const diagonal = p - i\n const run = open.get(diagonal)\n if (run && i <= run.qe) {\n run.qe = i + KMER\n run.te = p + KMER\n } else {\n const started = {\n qs: i,\n qe: i + KMER,\n ts: p,\n te: p + KMER,\n flipped: false,\n }\n open.set(diagonal, started)\n runs.push(started)\n }\n }\n }\n }\n return runs\n}\n\nfunction kmerRuns(a: string, b: string) {\n return [\n ...forwardKmerRuns(a, b),\n ...forwardKmerRuns(a, reverseComplement(b)).map(run => ({\n ...run,\n ts: b.length - run.te,\n te: b.length - run.ts,\n flipped: true,\n })),\n ]\n}\n\ntype GapFill = (\n a: string,\n b: string,\n edits: PairEdit[],\n queryFrom: number,\n targetFrom: number,\n) => void\n\n// The edits of one chain: each run is a run of `=`, and what lies between two\n// runs goes to `between`. Edits read along the query; the caller reverses a\n// flipped chain's so they read along the target.\nfunction chainEdits(\n chain: Link[],\n a: string,\n b: string,\n edits: PairEdit[],\n between: GapFill,\n) {\n let previous: Run | undefined\n for (const { run, trim } of chain) {\n const qs = run.qs + trim\n if (previous) {\n const targetFrom = run.flipped ? run.te - trim : previous.te\n const targetTo = run.flipped ? previous.ts : run.ts + trim\n const target = b.slice(targetFrom, targetTo)\n between(\n a.slice(previous.qe, qs),\n run.flipped ? reverseComplement(target) : target,\n edits,\n previous.qe,\n targetFrom,\n )\n }\n appendEdit(edits, '=', run.qe - qs)\n previous = run\n }\n}\n\n// An insertion and a deletion, which claims no homology\nfunction unaligned(a: string, b: string, edits: PairEdit[]) {\n appendEdit(edits, 'I', a.length)\n appendEdit(edits, 'D', b.length)\n}\n\nfunction alignExact(a: string, b: string, edits: PairEdit[]) {\n if (a.length * b.length <= MAX_ALIGNED_CELLS) {\n affineAlignment(a, b, edits)\n } else {\n unaligned(a, b, edits)\n }\n}\n\n// The private bases between two runs of one chain, whose orientation the chain\n// has already fixed. Past the cell budget they are seeded on forward k-mers and\n// chained again, recursing into the gaps that chain leaves. It finds no\n// inversions, since the stretch has an orientation already.\nfunction fillGap(a: string, b: string, edits: PairEdit[], depth = 0) {\n const [chain] =\n a.length * b.length > MAX_ALIGNED_CELLS && depth < MAX_FILL_DEPTH\n ? chainRuns(forwardKmerRuns(a, b), Infinity, KMER, kmerJumpCost, 1)\n : []\n if (!chain) {\n alignExact(a, b, edits)\n return\n }\n const deeper = (qa: string, tb: string, into: PairEdit[]) => {\n fillGap(qa, tb, into, depth + 1)\n }\n const first = chain[0]!.run\n const last = chain.at(-1)!.run\n deeper(a.slice(0, first.qs), b.slice(0, first.ts), edits)\n chainEdits(chain, a, b, edits, deeper)\n deeper(a.slice(last.qe), b.slice(last.te), edits)\n}\n\nfunction fill(a: string, b: string, edits: PairEdit[]) {\n fillGap(a, b, edits)\n}\n\n// A chain as a record in the coordinates of the two strings it was made on\nfunction recordOf(chain: Link[], a: string, b: string): PairChain {\n const edits: PairEdit[] = []\n chainEdits(chain, a, b, edits, fill)\n const first = chain[0]!\n const last = chain.at(-1)!\n const { flipped } = first.run\n return {\n queryStart: first.run.qs + first.trim,\n queryEnd: last.run.qe,\n targetStart: flipped ? last.run.ts : first.run.ts + first.trim,\n targetEnd: flipped ? first.run.te - first.trim : last.run.te,\n strand: flipped ? '-' : '+',\n edits: flipped ? edits.reverse() : edits,\n sharedBases: 0,\n }\n}\n\n// The private bases between two shared nodes. A pair too large for the exact\n// alignment is seeded on shared k-mers in both orientations and chained the\n// way the walks are, which aligns two long copies of one sequence the graph\n// left apart. The best forward chain becomes edits. A flipped chain is an\n// inversion, which no CIGAR holds, so it comes back as a record of its own in\n// the coordinates of a and b. What no chain reaches is an insertion and a\n// deletion, which claims no homology.\nfunction alignPrivate(\n a: string,\n b: string,\n edits: PairEdit[],\n minMatch: number,\n): PairChain[] {\n let inversions: PairChain[] = []\n if (a.length * b.length <= MAX_ALIGNED_CELLS) {\n affineAlignment(a, b, edits)\n } else {\n const chains = chainRuns(\n kmerRuns(a, b),\n Infinity,\n Math.max(minMatch, KMER),\n kmerJumpCost,\n )\n const forward = chains.find(chain => !chain[0]!.run.flipped)\n inversions = chains\n .filter(chain => chain[0]!.run.flipped)\n .map(chain => recordOf(chain, a, b))\n if (forward) {\n // The forward record holds no inversion, so an inversion's bases stay\n // unaligned in it. A gap that hides one is not seeded again: at a tandem\n // array that finds only a neighbouring copy, matched forward over bases\n // the inversion's own record already claims.\n const forwardFill: GapFill = (qa, tb, into, queryFrom, targetFrom) => {\n const hidesInversion = inversions.some(\n inversion =>\n (queryFrom < inversion.queryEnd &&\n inversion.queryStart < queryFrom + qa.length) ||\n (targetFrom < inversion.targetEnd &&\n inversion.targetStart < targetFrom + tb.length),\n )\n if (hidesInversion) {\n alignExact(qa, tb, into)\n } else {\n fillGap(qa, tb, into)\n }\n }\n const first = forward[0]!.run\n const last = forward.at(-1)!.run\n forwardFill(a.slice(0, first.qs), b.slice(0, first.ts), edits, 0, 0)\n chainEdits(forward, a, b, edits, forwardFill)\n forwardFill(a.slice(last.qe), b.slice(last.te), edits, last.qe, last.te)\n } else {\n unaligned(a, b, edits)\n }\n }\n return inversions\n}\n\ninterface Claimed extends PairChain {\n // query stretches on nodes both walks visit\n shared: Interval[]\n}\n\ntype Side = 'query' | 'target'\n\n// Each edit of a record with the query and target position it sits at. A `-`\n// record's edits read along the target, so its query runs down from queryEnd.\nfunction forEachEdit(\n r: PairChain,\n visit: (op: PairOp, len: number, query: number, target: number) => void,\n) {\n const flipped = r.strand === '-'\n let qi = 0\n let ti = 0\n for (const [op, len] of r.edits) {\n visit(\n op,\n len,\n flipped ? r.queryEnd - 1 - qi : r.queryStart + qi,\n r.targetStart + ti,\n )\n if (op !== 'D') {\n qi += len\n }\n if (op !== 'I') {\n ti += len\n }\n }\n}\n\n// A record's score under vg's model over [lo, hi) on one side: a column counts\n// where its base on that side does, and a gap where it opens on that side.\nfunction scoreOver(r: PairChain, side: Side, lo: number, hi: number) {\n const step = side === 'query' && r.strand === '-' ? -1 : 1\n let score = 0\n forEachEdit(r, (op, len, query, target) => {\n const from = side === 'query' ? query : target\n const inside = (k: number) => {\n const at = from + step * k\n return at >= lo && at < hi\n }\n if (op === '=' || op === 'X') {\n for (let k = 0; k < len; k++) {\n if (inside(k)) {\n score += op === '=' ? MATCH : MISMATCH\n }\n }\n } else if ((op === 'I') === (side === 'query')) {\n for (let k = 0; k < len; k++) {\n if (inside(k)) {\n score += k === 0 ? GAP_OPEN : GAP_EXTEND\n }\n }\n } else if (inside(0)) {\n score += GAP_OPEN + (len - 1) * GAP_EXTEND\n }\n })\n return score\n}\n\nfunction spanOf(r: PairChain, side: Side): Interval {\n return side === 'query'\n ? [r.queryStart, r.queryEnd]\n : [r.targetStart, r.targetEnd]\n}\n\n// A record's edits with the aligned columns `lost` marks turned into an\n// insertion and a deletion, and its ends trimmed to the columns it keeps.\nfunction withoutColumns(r: Claimed, lost: Uint8Array): Claimed | undefined {\n const flipped = r.strand === '-'\n const edits: PairEdit[] = []\n let pendingQuery = 0\n let pendingTarget = 0\n let column = 0\n let sharedLost = 0\n const sharedMask = new Uint8Array(r.queryEnd - r.queryStart)\n for (const [s, e] of r.shared) {\n sharedMask.fill(1, s - r.queryStart, e - r.queryStart)\n }\n const inShared = (at: number) => sharedMask[at - r.queryStart] === 1\n const flush = () => {\n appendEdit(edits, 'I', pendingQuery)\n appendEdit(edits, 'D', pendingTarget)\n pendingQuery = 0\n pendingTarget = 0\n }\n forEachEdit(r, (op, len, query) => {\n if (op === 'I') {\n pendingQuery += len\n } else if (op === 'D') {\n pendingTarget += len\n } else {\n for (let k = 0; k < len; k++) {\n if (lost[column + k]) {\n pendingQuery += 1\n pendingTarget += 1\n if (inShared(flipped ? query - k : query + k)) {\n sharedLost += 1\n }\n } else {\n if (pendingQuery > 0 || pendingTarget > 0) {\n flush()\n }\n appendEdit(edits, op, 1)\n }\n }\n column += len\n }\n })\n flush()\n const lead = { I: 0, D: 0 }\n while (edits[0]?.[0] === 'I' || edits[0]?.[0] === 'D') {\n const [op, len] = edits.shift()!\n lead[op as 'I' | 'D'] += len\n }\n const tail = { I: 0, D: 0 }\n while (edits.at(-1)?.[0] === 'I' || edits.at(-1)?.[0] === 'D') {\n const [op, len] = edits.pop()!\n tail[op as 'I' | 'D'] += len\n }\n return edits.length === 0\n ? undefined\n : {\n ...r,\n queryStart: r.queryStart + (flipped ? tail.I : lead.I),\n queryEnd: r.queryEnd - (flipped ? lead.I : tail.I),\n targetStart: r.targetStart + lead.D,\n targetEnd: r.targetEnd - tail.D,\n edits,\n sharedBases: r.sharedBases - sharedLost,\n }\n}\n\n// A base aligns in one record at most. Where two records align the same bases\n// on either walk, the one scoring higher over the stretch their spans share\n// keeps them, and the other gives them up as an insertion and a deletion. In a\n// tandem array whose copies run both ways, one query copy aligns forward to one\n// target copy and inverted to another, and both are homology; the scoring\n// decides which one the pair's picture shows. A tie goes to the record with\n// more bases on shared nodes: alignPrivate finds an inversion a walk takes\n// through shared nodes again, base for base, in the gap of the forward record\n// spanning it.\nfunction claimOnce(\n records: Claimed[],\n queryLength: number,\n targetLength: number,\n minMatch: number,\n) {\n const claims = {\n query: new Uint8Array(queryLength),\n target: new Uint8Array(targetLength),\n }\n const columnsOf = records.map(r => {\n const columns: [number, number][] = []\n forEachEdit(r, (op, len, query, target) => {\n if (op === '=' || op === 'X') {\n for (let k = 0; k < len; k++) {\n columns.push([r.strand === '-' ? query - k : query + k, target + k])\n }\n }\n })\n for (const [query, target] of columns) {\n claims.query[query] = Math.min(255, claims.query[query]! + 1)\n claims.target[target] = Math.min(255, claims.target[target]! + 1)\n }\n return columns\n })\n const holders = {\n query: new Map<number, number[]>(),\n target: new Map<number, number[]>(),\n }\n columnsOf.forEach((columns, i) => {\n for (const [query, target] of columns) {\n for (const [side, at] of [\n ['query', query],\n ['target', target],\n ] as const) {\n if (claims[side][at]! > 1) {\n const held = holders[side].get(at)\n if (!held) {\n holders[side].set(at, [i])\n } else if (held.at(-1) !== i) {\n held.push(i)\n }\n }\n }\n }\n })\n const beaten = new Map<string, boolean>()\n const losesTo = (i: number, j: number, side: Side) => {\n const key = `${side}:${i}:${j}`\n let loses = beaten.get(key)\n if (loses === undefined) {\n const [si, ei] = spanOf(records[i]!, side)\n const [sj, ej] = spanOf(records[j]!, side)\n const lo = Math.max(si, sj)\n const hi = Math.min(ei, ej)\n const [mine, theirs] = [records[i]!, records[j]!]\n const margins = [\n scoreOver(theirs, side, lo, hi) - scoreOver(mine, side, lo, hi),\n theirs.sharedBases - mine.sharedBases,\n i - j,\n ]\n loses = margins.find(margin => margin !== 0)! > 0\n beaten.set(key, loses)\n }\n return loses\n }\n return records.flatMap((r, i) => {\n const columns = columnsOf[i]!\n const lost = new Uint8Array(columns.length)\n columns.forEach(([query, target], c) => {\n for (const [side, at] of [\n ['query', query],\n ['target', target],\n ] as const) {\n if (\n !lost[c] &&\n holders[side].get(at)?.some(j => j !== i && losesTo(i, j, side))\n ) {\n lost[c] = 1\n }\n }\n })\n if (!lost.includes(1)) {\n return [r]\n }\n const kept = withoutColumns(r, lost)\n const matched =\n kept?.edits.reduce((sum, [op, len]) => sum + (op === '=' ? len : 0), 0) ??\n 0\n return kept && matched >= minMatch ? [kept] : []\n })\n}\n\nfunction walkSequence(walk: number[], sequenceOf: (id: number) => string) {\n return walk\n .map(handle => {\n const sequence = sequenceOf(nodeId(handle))\n return isReverse(handle) ? reverseComplement(sequence) : sequence\n })\n .join('')\n}\n\nfunction walkOffsets(walk: number[], sequenceOf: (id: number) => string) {\n const offsets = [0]\n for (const handle of walk) {\n offsets.push(offsets.at(-1)! + sequenceOf(nodeId(handle)).length)\n }\n return offsets\n}\n\n// The steps between a walk's first and last visit to any node it visits more\n// than once. Copies of a repeat folded onto one node say nothing about which\n// copy of one haplotype pairs with which copy of the other, and a graph can\n// pair them out of register, so there the bases decide.\nfunction repeatSteps(walk: number[]) {\n const first = new Map<number, number>()\n const last = new Map<number, number>()\n walk.forEach((handle, i) => {\n const id = nodeId(handle)\n if (first.has(id)) {\n last.set(id, i)\n } else {\n first.set(id, i)\n }\n })\n const change = new Int32Array(walk.length + 1)\n for (const [id, end] of last) {\n change[first.get(id)!]! += 1\n change[end + 1]! -= 1\n }\n const inside = new Uint8Array(walk.length)\n let depth = 0\n for (let i = 0; i < walk.length; i++) {\n depth += change[i]!\n inside[i] = depth > 0 ? 1 : 0\n }\n return inside\n}\n\n// Every stretch of steps the two walks take through the same nodes, in the\n// same order or the opposite one, outside both walks' repeats.\nfunction sharedRuns(\n query: number[],\n target: number[],\n queryOffsets: number[],\n targetOffsets: number[],\n) {\n const queryRepeat = repeatSteps(query)\n const targetRepeat = repeatSteps(target)\n const visits = new Map<number, number[]>()\n target.forEach((handle, rank) => {\n if (!targetRepeat[rank]) {\n visits.set(nodeId(handle), [rank])\n }\n })\n const width = 2 * target.length\n const key = (i: number, rank: number, flipped: boolean) =>\n i * width + 2 * rank + (flipped ? 1 : 0)\n const seeds = new Set<number>()\n query.forEach((handle, i) => {\n for (const rank of queryRepeat[i]\n ? []\n : (visits.get(nodeId(handle)) ?? [])) {\n seeds.add(key(i, rank, isReverse(handle) !== isReverse(target[rank]!)))\n }\n })\n const runs: Run[] = []\n query.forEach((handle, i) => {\n for (const rank of queryRepeat[i]\n ? []\n : (visits.get(nodeId(handle)) ?? [])) {\n const flipped = isReverse(handle) !== isReverse(target[rank]!)\n const step = flipped ? -1 : 1\n const previous = rank - step\n const continues =\n i > 0 &&\n previous >= 0 &&\n previous < target.length &&\n seeds.has(key(i - 1, previous, flipped))\n if (!continues) {\n let j = i\n let r = rank\n while (\n j < query.length &&\n r >= 0 &&\n r < target.length &&\n seeds.has(key(j, r, flipped))\n ) {\n j += 1\n r += step\n }\n const lastRank = r - step\n runs.push({\n qs: queryOffsets[i]!,\n qe: queryOffsets[j]!,\n ts: targetOffsets[Math.min(rank, lastRank)]!,\n te: targetOffsets[Math.max(rank, lastRank) + 1]!,\n flipped,\n })\n }\n }\n })\n return runs\n}\n\n// A query walk's alignments to a target walk. A stretch of nodes both walks\n// visit is a run of `=`, a record is the best collinear chain of those\n// stretches, and what lies between two of them is aligned base by base under\n// vg's scoring, an inversion there coming back as a record of its own. With\n// bases false it is an insertion and a deletion instead. A chain pays for the\n// gap it spans, so by default nothing bounds how far it reaches but the window;\n// maxGap caps that to bound the work. A record matching under minMatch bases is\n// dropped. Coordinates count from each walk's first base; a `-` record's edits\n// read along the target, the way minimap2 writes a reverse-strand row.\nexport function pairAlignments(opts: PairOptions): PairChain[] {\n const { query, target, sequenceOf } = opts\n const a = walkSequence(query, sequenceOf)\n const b = walkSequence(target, sequenceOf)\n const runs = sharedRuns(\n query,\n target,\n walkOffsets(query, sequenceOf),\n walkOffsets(target, sequenceOf),\n )\n const minMatch = opts.minMatch ?? DEFAULT_MIN_MATCH\n const bases = opts.bases ?? true\n const records: Claimed[] = []\n for (const chain of chainRuns(\n runs,\n opts.maxGap ?? Infinity,\n minMatch,\n stepJumpCost,\n )) {\n const edits: PairEdit[] = []\n const first = chain[0]!\n const last = chain.at(-1)!\n const { flipped } = first.run\n const alignBetween: GapFill = (qa, tb, into, queryFrom, targetFrom) => {\n for (const inversion of alignPrivate(qa, tb, into, minMatch)) {\n const targetTo = targetFrom + tb.length\n records.push({\n ...inversion,\n queryStart: queryFrom + inversion.queryStart,\n queryEnd: queryFrom + inversion.queryEnd,\n targetStart: flipped\n ? targetTo - inversion.targetEnd\n : targetFrom + inversion.targetStart,\n targetEnd: flipped\n ? targetTo - inversion.targetStart\n : targetFrom + inversion.targetEnd,\n strand: flipped ? '+' : '-',\n edits: flipped ? inversion.edits.reverse() : inversion.edits,\n shared: [],\n })\n }\n }\n chainEdits(chain, a, b, edits, bases ? alignBetween : unaligned)\n records.push({\n queryStart: first.run.qs + first.trim,\n queryEnd: last.run.qe,\n targetStart: flipped ? last.run.ts : first.run.ts + first.trim,\n targetEnd: flipped ? first.run.te - first.trim : last.run.te,\n strand: flipped ? '-' : '+',\n edits: flipped ? edits.reverse() : edits,\n sharedBases: chain.reduce(\n (sum, { run, trim }) => sum + run.qe - run.qs - trim,\n 0,\n ),\n shared: chain.map(({ run, trim }) => [run.qs + trim, run.qe]),\n })\n }\n return claimOnce(records, a.length, b.length, minMatch)\n .map(({ shared: _, ...record }) => record)\n .sort((x, y) => x.queryStart - y.queryStart)\n}\n\nexport function pairCigar(edits: PairEdit[]) {\n return edits.map(([op, len]) => `${len}${op}`).join('')\n}\n", "// The GBZ adapter's own refusal, marked regionTooLarge so core shows it as a\n// zoom-in notice, or gbz-base's when it reaches the display unwrapped\nexport function isNodeLimitError(error: unknown) {\n return (\n error instanceof Error &&\n (error.name === 'NodeLimitError' ||\n (error as { regionTooLarge?: unknown }).regionTooLarge === true ||\n /reads more than nodeLimit|^Subgraph size limit of \\d+ nodes exceeded/.test(\n error.message,\n ))\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["encodeNode", "id", "orientation", "nodeId", "handle", "nodeOrientation", "isReverse", "flipNode", "flipSide", "side", "entrySide", "exitSide", "entryOrientation", "exitOrientation", "edgeIsCanonical", "from", "to", "fromId", "toId", "pathIsCanonical", "path", "pathEndsAreCanonical", "first", "last", "DECODE", "encodedSequenceLength", "encoded", "last", "value", "inLast", "i", "decodeSequence", "result", "byte", "base", "COMPLEMENT", "reverseComplement", "sequence", "lowerBound", "ascending", "value", "lo", "hi", "mid", "ColumnMax", "columns", "column", "best", "p", "candidate", "holder", "SparseLcs", "a", "b", "weight", "x", "j", "list", "a0", "a1", "b0", "b1", "prefix", "suffix", "k", "i", "matches", "split", "count", "from", "to", "step", "trace", "w", "before", "match", "last", "chained", "width", "after", "s", "combined", "weightedLcs", "lcs", "DEFAULT_MIN_MATCH", "MAX_ALIGNED_CELLS", "CHAIN_LOOKBACK", "KMER", "MAX_KMER_OCCURRENCES", "MAX_FILL_DEPTH", "MATCH", "MISMATCH", "GAP_OPEN", "GAP_EXTEND", "UNREACHABLE", "DIAGONAL", "INSERTION", "DELETION", "appendEdit", "edits", "op", "len", "last", "best", "diagonal", "insertion", "deletion", "affineAlignment", "a", "b", "la", "lb", "width", "trace", "j", "i", "nextDiagonal", "nextInsertion", "nextDeletion", "ai", "fromDiagonal", "fromInsertion", "fromDeletion", "ops", "state", "from", "stepJumpCost", "dq", "dt", "indel", "kmerJumpCost", "sliceRun", "run", "to", "untakenPieces", "query", "target", "blocked", "s", "e", "lo", "hi", "x", "y", "pieces", "chainRuns", "runs", "maxGap", "minMatch", "jumpCost", "maxChains", "chains", "basesTaken", "spanTaken", "pool", "score", "back", "trims", "trim", "candidate", "matched", "end", "chain", "first", "flipped", "spans", "same", "forwardKmerRuns", "index", "p", "kmer", "seen", "open", "hits", "started", "kmerRuns", "reverseComplement", "chainEdits", "between", "previous", "qs", "targetFrom", "targetTo", "unaligned", "alignExact", "fillGap", "depth", "deeper", "qa", "tb", "into", "fill", "recordOf", "alignPrivate", "inversions", "forward", "forwardFill", "queryFrom", "inversion", "forEachEdit", "r", "visit", "qi", "ti", "scoreOver", "side", "step", "inside", "k", "at", "spanOf", "withoutColumns", "lost", "pendingQuery", "pendingTarget", "column", "sharedLost", "sharedMask", "inShared", "flush", "lead", "tail", "claimOnce", "records", "queryLength", "targetLength", "claims", "columnsOf", "columns", "holders", "held", "beaten", "losesTo", "key", "loses", "si", "ei", "sj", "ej", "mine", "theirs", "margin", "c", "kept", "sum", "walkSequence", "walk", "sequenceOf", "handle", "sequence", "nodeId", "isReverse", "walkOffsets", "offsets", "repeatSteps", "id", "change", "sharedRuns", "queryOffsets", "targetOffsets", "queryRepeat", "targetRepeat", "visits", "rank", "seeds", "lastRank", "pairAlignments", "opts", "bases", "_", "record", "pairCigar", "isNodeLimitError", "error"]
7
7
  }