@platforma-sdk/ui-vue 1.45.35 → 1.45.36

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 (117) hide show
  1. package/.turbo/turbo-build.log +203 -234
  2. package/.turbo/turbo-type-check.log +1 -1
  3. package/CHANGELOG.md +6 -0
  4. package/dist/AgGridVue/useAgGridOptions.js +2 -3
  5. package/dist/AgGridVue/useAgGridOptions.js.map +1 -1
  6. package/dist/components/PlAgDataTable/PlAgRowCount.vue.js +7 -8
  7. package/dist/components/PlAgDataTable/PlAgRowCount.vue.js.map +1 -1
  8. package/dist/components/PlAgRowNumCheckbox/PlAgRowNumCheckbox.vue.js +9 -10
  9. package/dist/components/PlAgRowNumCheckbox/PlAgRowNumCheckbox.vue.js.map +1 -1
  10. package/dist/components/PlAgRowNumHeader.vue.js +2 -3
  11. package/dist/components/PlAgRowNumHeader.vue.js.map +1 -1
  12. package/dist/index.js +48 -50
  13. package/dist/index.js.map +1 -1
  14. package/dist/lib.d.ts +0 -1
  15. package/package.json +4 -5
  16. package/src/lib.ts +0 -2
  17. package/dist/assets/multi-sequence-alignment.worker-Cm0gZp19.js +0 -6
  18. package/dist/assets/multi-sequence-alignment.worker-Cm0gZp19.js.map +0 -1
  19. package/dist/assets/phylogenetic-tree.worker-4CrExYEo.js +0 -5
  20. package/dist/assets/phylogenetic-tree.worker-4CrExYEo.js.map +0 -1
  21. package/dist/components/PlMultiSequenceAlignment/Consensus.vue.d.ts +0 -9
  22. package/dist/components/PlMultiSequenceAlignment/Consensus.vue.js +0 -10
  23. package/dist/components/PlMultiSequenceAlignment/Consensus.vue.js.map +0 -1
  24. package/dist/components/PlMultiSequenceAlignment/Consensus.vue2.js +0 -122
  25. package/dist/components/PlMultiSequenceAlignment/Consensus.vue2.js.map +0 -1
  26. package/dist/components/PlMultiSequenceAlignment/Consensus.vue3.js +0 -9
  27. package/dist/components/PlMultiSequenceAlignment/Consensus.vue3.js.map +0 -1
  28. package/dist/components/PlMultiSequenceAlignment/Legend.vue.d.ts +0 -6
  29. package/dist/components/PlMultiSequenceAlignment/Legend.vue.js +0 -10
  30. package/dist/components/PlMultiSequenceAlignment/Legend.vue.js.map +0 -1
  31. package/dist/components/PlMultiSequenceAlignment/Legend.vue2.js +0 -28
  32. package/dist/components/PlMultiSequenceAlignment/Legend.vue2.js.map +0 -1
  33. package/dist/components/PlMultiSequenceAlignment/Legend.vue3.js +0 -13
  34. package/dist/components/PlMultiSequenceAlignment/Legend.vue3.js.map +0 -1
  35. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue.d.ts +0 -25
  36. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue.js +0 -10
  37. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue.js.map +0 -1
  38. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue2.js +0 -138
  39. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue2.js.map +0 -1
  40. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue3.js +0 -31
  41. package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue3.js.map +0 -1
  42. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue.d.ts +0 -8
  43. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue.js +0 -10
  44. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue.js.map +0 -1
  45. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue2.js +0 -77
  46. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue2.js.map +0 -1
  47. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue3.js +0 -9
  48. package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue3.js.map +0 -1
  49. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.d.ts +0 -71
  50. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.js +0 -10
  51. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.js.map +0 -1
  52. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js +0 -224
  53. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js.map +0 -1
  54. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue3.js +0 -9
  55. package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue3.js.map +0 -1
  56. package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue.d.ts +0 -8
  57. package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue.js +0 -10
  58. package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue.js.map +0 -1
  59. package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue2.js +0 -127
  60. package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue2.js.map +0 -1
  61. package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue3.js +0 -9
  62. package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue3.js.map +0 -1
  63. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue.d.ts +0 -16
  64. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue.js +0 -10
  65. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue.js.map +0 -1
  66. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue2.js +0 -228
  67. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue2.js.map +0 -1
  68. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue3.js +0 -19
  69. package/dist/components/PlMultiSequenceAlignment/Toolbar.vue3.js.map +0 -1
  70. package/dist/components/PlMultiSequenceAlignment/cell-size.d.ts +0 -4
  71. package/dist/components/PlMultiSequenceAlignment/cell-size.js +0 -8
  72. package/dist/components/PlMultiSequenceAlignment/cell-size.js.map +0 -1
  73. package/dist/components/PlMultiSequenceAlignment/chemical-properties.d.ts +0 -44
  74. package/dist/components/PlMultiSequenceAlignment/chemical-properties.js +0 -132
  75. package/dist/components/PlMultiSequenceAlignment/chemical-properties.js.map +0 -1
  76. package/dist/components/PlMultiSequenceAlignment/data.d.ts +0 -61
  77. package/dist/components/PlMultiSequenceAlignment/data.js +0 -370
  78. package/dist/components/PlMultiSequenceAlignment/data.js.map +0 -1
  79. package/dist/components/PlMultiSequenceAlignment/index.d.ts +0 -1
  80. package/dist/components/PlMultiSequenceAlignment/markup.d.ts +0 -16
  81. package/dist/components/PlMultiSequenceAlignment/markup.js +0 -84
  82. package/dist/components/PlMultiSequenceAlignment/markup.js.map +0 -1
  83. package/dist/components/PlMultiSequenceAlignment/migrations.d.ts +0 -3
  84. package/dist/components/PlMultiSequenceAlignment/migrations.js +0 -24
  85. package/dist/components/PlMultiSequenceAlignment/migrations.js.map +0 -1
  86. package/dist/components/PlMultiSequenceAlignment/multi-sequence-alignment.worker.d.ts +0 -6
  87. package/dist/components/PlMultiSequenceAlignment/phylogenetic-tree.worker.d.ts +0 -7
  88. package/dist/components/PlMultiSequenceAlignment/residue-counts.d.ts +0 -2
  89. package/dist/components/PlMultiSequenceAlignment/residue-counts.js +0 -13
  90. package/dist/components/PlMultiSequenceAlignment/residue-counts.js.map +0 -1
  91. package/dist/components/PlMultiSequenceAlignment/settings.d.ts +0 -2
  92. package/dist/components/PlMultiSequenceAlignment/settings.js +0 -9
  93. package/dist/components/PlMultiSequenceAlignment/settings.js.map +0 -1
  94. package/dist/components/PlMultiSequenceAlignment/types.d.ts +0 -5
  95. package/dist/components/PlMultiSequenceAlignment/useMiPlots.d.ts +0 -4
  96. package/dist/components/PlMultiSequenceAlignment/useMiPlots.js +0 -19
  97. package/dist/components/PlMultiSequenceAlignment/useMiPlots.js.map +0 -1
  98. package/src/components/PlMultiSequenceAlignment/Consensus.vue +0 -165
  99. package/src/components/PlMultiSequenceAlignment/Legend.vue +0 -44
  100. package/src/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue +0 -299
  101. package/src/components/PlMultiSequenceAlignment/PhylogeneticTree.vue +0 -110
  102. package/src/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue +0 -314
  103. package/src/components/PlMultiSequenceAlignment/README.md +0 -216
  104. package/src/components/PlMultiSequenceAlignment/SeqLogo.vue +0 -166
  105. package/src/components/PlMultiSequenceAlignment/Toolbar.vue +0 -228
  106. package/src/components/PlMultiSequenceAlignment/cell-size.ts +0 -4
  107. package/src/components/PlMultiSequenceAlignment/chemical-properties.ts +0 -199
  108. package/src/components/PlMultiSequenceAlignment/data.ts +0 -661
  109. package/src/components/PlMultiSequenceAlignment/index.ts +0 -1
  110. package/src/components/PlMultiSequenceAlignment/markup.ts +0 -141
  111. package/src/components/PlMultiSequenceAlignment/migrations.ts +0 -46
  112. package/src/components/PlMultiSequenceAlignment/multi-sequence-alignment.worker.ts +0 -54
  113. package/src/components/PlMultiSequenceAlignment/phylogenetic-tree.worker.ts +0 -89
  114. package/src/components/PlMultiSequenceAlignment/residue-counts.ts +0 -124
  115. package/src/components/PlMultiSequenceAlignment/settings.ts +0 -7
  116. package/src/components/PlMultiSequenceAlignment/types.ts +0 -3
  117. package/src/components/PlMultiSequenceAlignment/useMiPlots.ts +0 -23
@@ -1,370 +0,0 @@
1
- import { isJsonEqual as O } from "../../lib/util/helpers/dist/objects.js";
2
- import { ensureError as T, getRawPlatformaInstance as $, readAnnotation as C, Annotation as h, canonicalizeJson as v, getAxisId as S, parseJson as A, isLabelColumn as j, matchAxisId as B, readAnnotationJson as J, isLinkerColumn as N, createRowSelectionColumn as W, pTableValue as R } from "@platforma-sdk/model";
3
- import { ref as M, watch as F, onWatcherCleanup as H } from "vue";
4
- import { objectHash as I } from "../../objectHash.js";
5
- import { highlightByChemicalProperties as V } from "./chemical-properties.js";
6
- import { parseMarkup as z, highlightByMarkup as Q, markupAlignedSequence as Y } from "./markup.js";
7
- import { getResidueCounts as Z } from "./residue-counts.js";
8
- const x = () => $().pFrameDriver, D = 1e3, we = E(
9
- _
10
- ), ge = E(
11
- G
12
- ), he = E(
13
- K
14
- ), be = E(
15
- X
16
- );
17
- async function _({ pFrame: n, sequenceColumnPredicate: r }) {
18
- if (!n) return;
19
- const o = (await x().listColumns(n)).values().filter((i) => r(i)).map(({ spec: i, columnId: c }) => ({
20
- label: C(i, h.Label) ?? "Unlabeled column",
21
- value: c
22
- })).toArray(), t = o.map(({ value: i }) => i);
23
- return { options: o, defaults: t };
24
- }
25
- async function G({ pFrame: n, sequenceColumnIds: r }) {
26
- if (!n || !r) return;
27
- const a = x(), e = await a.listColumns(n), o = new Map(
28
- r.values().flatMap((s) => {
29
- const u = e.find(({ columnId: m }) => m === s);
30
- if (!u)
31
- throw new Error(`Couldn't find sequence column (ID: \`${s}\`).`);
32
- return u.spec.axesSpec.values().map((m) => [v(S(m)), m]);
33
- })
34
- ), t = /* @__PURE__ */ new Map();
35
- for (const [s, u] of o.entries()) {
36
- const m = A(s), d = e.find(
37
- ({ spec: p }) => j(p) && B(m, S(p.axesSpec[0]))
38
- );
39
- t.set(
40
- d ? v({ type: "column", id: d.columnId }) : v({ type: "axis", id: m }),
41
- C(d == null ? void 0 : d.spec, h.Label) ?? C(u, h.Label) ?? "Unlabeled axis"
42
- );
43
- }
44
- const { hits: i } = await a.findColumns(n, {
45
- columnFilter: {},
46
- compatibleWith: o.keys().map((s) => A(s)).toArray(),
47
- strictlyCompatible: !1
48
- });
49
- for (const { columnId: s, spec: u } of i) {
50
- const m = v({
51
- type: "column",
52
- id: s
53
- });
54
- t.has(m) || t.set(
55
- m,
56
- C(u, h.Label) ?? "Unlabeled column"
57
- );
58
- }
59
- const c = t.entries().map(([s, u]) => ({ label: u, value: A(s) })).toArray(), l = c.values().filter(({ value: s }) => {
60
- if (s.type === "axis") return !0;
61
- const u = e.find(({ columnId: m }) => m === s.id);
62
- return u && j(u.spec);
63
- }).map(({ value: s }) => s).toArray();
64
- return { options: c, defaults: l };
65
- }
66
- async function K({ pFrame: n, sequenceColumnIds: r }) {
67
- if (!n || !r) return;
68
- const e = await x().listColumns(n), t = r.map((c) => {
69
- const l = e.find((s) => s.columnId === c);
70
- if (!l)
71
- throw new Error(
72
- `Couldn't find sequence column (ID: \`${r[0]}\`).`
73
- );
74
- return l;
75
- }).flatMap(
76
- (c) => e.filter(
77
- (l) => J(l.spec, h.Sequence.IsAnnotation) && O(c.spec.axesSpec, l.spec.axesSpec) && Object.entries(c.spec.domain ?? {}).every(([s, u]) => {
78
- var m;
79
- return ((m = l.spec.domain) == null ? void 0 : m[s]) === u;
80
- })
81
- ).map((l) => ({ markupColumn: l, sequenceColumn: c }))
82
- );
83
- return Map.groupBy(
84
- t,
85
- ({ markupColumn: c, sequenceColumn: l }) => {
86
- const s = Object.fromEntries(
87
- Object.entries(c.spec.domain ?? {}).filter(([u]) => {
88
- var m;
89
- return ((m = l.spec.domain) == null ? void 0 : m[u]) == null;
90
- })
91
- );
92
- return v(s);
93
- }
94
- ).entries().map(([c, l]) => ({
95
- label: Object.values(A(c)).join(", "),
96
- value: l.map(({ markupColumn: s }) => s.columnId)
97
- })).toArray();
98
- }
99
- async function X({
100
- pFrame: n,
101
- sequenceColumnIds: r,
102
- labelColumnIds: a,
103
- selection: e,
104
- colorScheme: o,
105
- alignmentParams: t,
106
- shouldBuildPhylogeneticTree: i
107
- }, c) {
108
- var q;
109
- if (!n || !(r != null && r.length) || !a) return;
110
- const l = await ee({
111
- pFrame: n,
112
- sequenceColumnIds: r,
113
- labelColumnIds: a,
114
- selection: e,
115
- colorScheme: o
116
- }), s = ((q = l.at(0)) == null ? void 0 : q.data.data.length) ?? 0;
117
- if (s < 2) return;
118
- const u = s > D, m = te(r, l), d = ne(a, l), p = o.type === "markup" ? re(o.columnIds, l) : void 0, b = {}, y = await Promise.all(
119
- m.map(async ({ name: w, rows: f }) => ({
120
- name: w,
121
- rows: await ae(
122
- f,
123
- JSON.parse(JSON.stringify(t)),
124
- c
125
- )
126
- }))
127
- );
128
- let L;
129
- if (i) {
130
- L = await ie(
131
- y,
132
- c
133
- );
134
- const w = L.values().filter(({ id: f }) => f >= 0).map(({ id: f }) => f).toArray();
135
- for (const f of y)
136
- f.rows = w.map((g) => f.rows[g]);
137
- for (const f of d)
138
- f.rows = w.map((g) => f.rows[g]);
139
- for (const f of p ?? [])
140
- f.rows = w.map((g) => f.rows[g]);
141
- }
142
- return {
143
- sequences: await Promise.all(
144
- y.map(async ({ name: w, rows: f }, g) => {
145
- const U = Z(f), k = oe({
146
- colorScheme: o,
147
- sequences: f,
148
- residueCounts: U,
149
- markup: p == null ? void 0 : p.at(g)
150
- });
151
- return k && Object.assign(b, k.legend), {
152
- name: w,
153
- rows: f,
154
- residueCounts: U,
155
- ...k && {
156
- highlightImageUrl: await se(k.blob)
157
- }
158
- };
159
- })
160
- ),
161
- labels: d,
162
- ...Object.keys(b).length && {
163
- highlightLegend: b
164
- },
165
- ...L && {
166
- phylogeneticTree: L
167
- },
168
- exceedsLimit: u
169
- };
170
- }
171
- async function ee({ pFrame: n, sequenceColumnIds: r, labelColumnIds: a, selection: e, colorScheme: o }) {
172
- const t = x(), i = await t.listColumns(n), c = i.filter((p) => N(p.spec)), l = W({ selection: e });
173
- let s = {
174
- type: "inner",
175
- entries: r.map((p) => ({
176
- type: "column",
177
- column: p
178
- }))
179
- };
180
- c.length > 0 && (s = {
181
- type: "outer",
182
- primary: s,
183
- secondary: c.map(({ columnId: p }) => ({
184
- type: "column",
185
- column: p
186
- }))
187
- }), l && (s = {
188
- type: "inner",
189
- entries: [
190
- s,
191
- {
192
- type: "inlineColumn",
193
- column: l
194
- }
195
- ]
196
- });
197
- const u = a.flatMap((p) => p.type !== "column" ? [] : { type: "column", column: p.id });
198
- if (o.type === "markup")
199
- for (const p of o.columnIds)
200
- u.push({ type: "column", column: p });
201
- const m = Array.from(
202
- new Set(
203
- r.values().flatMap((p) => {
204
- const b = i.find(({ columnId: y }) => y === p);
205
- if (!b)
206
- throw new Error(`Couldn't find sequence column (ID: ${p})`);
207
- return b.spec.axesSpec.map((y) => v(S(y)));
208
- })
209
- )
210
- ).sort().map((p) => ({
211
- column: { type: "axis", id: A(p) },
212
- ascending: !0,
213
- naAndAbsentAreLeastValues: !0
214
- })), d = {
215
- src: {
216
- type: "outer",
217
- primary: s,
218
- secondary: u
219
- },
220
- filters: [],
221
- sorting: m
222
- };
223
- return t.calculateTableData(
224
- n,
225
- JSON.parse(JSON.stringify(d)),
226
- {
227
- offset: 0,
228
- // +1 is a hack to check whether the selection is over the limit
229
- length: D + 1
230
- }
231
- );
232
- }
233
- const te = (n, r) => n.map((a) => {
234
- const e = r.find(({ spec: i }) => i.id === a);
235
- if (!e)
236
- throw new Error(`Couldn't find sequence column (ID: \`${a}\`).`);
237
- const o = C(e.spec.spec, h.Label) ?? "Unlabeled column", t = e.data.data.keys().take(D).map(
238
- (i) => {
239
- var c;
240
- return ((c = R(e.data, i, { absent: "", na: "" })) == null ? void 0 : c.toString()) ?? "";
241
- }
242
- ).toArray();
243
- return { name: o, rows: t };
244
- }), ne = (n, r) => n.map((a) => {
245
- const e = r.find(({ spec: t }) => {
246
- if (a.type === "axis" && t.type === "axis")
247
- return O(a.id, t.id);
248
- if (a.type === "column" && t.type === "column")
249
- return a.id === t.id;
250
- });
251
- if (!e)
252
- throw new Error(`Couldn't find label column (ID: \`${a}\`).`);
253
- return { rows: e.data.data.keys().take(D).map(
254
- (t) => {
255
- var i;
256
- return ((i = R(e.data, t, { absent: "", na: "" })) == null ? void 0 : i.toString()) ?? "";
257
- }
258
- ).toArray() };
259
- }), re = (n, r) => n.map((a) => {
260
- const e = r.find(({ spec: i }) => i.id === a);
261
- if (!e)
262
- throw new Error(`Couldn't find markup column (ID: \`${a}\`).`);
263
- const o = J(
264
- e.spec.spec,
265
- h.Sequence.Annotation.Mapping
266
- ) ?? {}, t = e.data.data.keys().take(D).map(
267
- (i) => {
268
- var c;
269
- return z(
270
- ((c = R(e.data, i, { absent: "", na: "" })) == null ? void 0 : c.toString()) ?? ""
271
- );
272
- }
273
- ).toArray();
274
- return { labels: o, rows: t };
275
- }), ae = /* @__PURE__ */ (() => {
276
- const n = /* @__PURE__ */ new Map();
277
- return async (r, a, e) => {
278
- const o = await I([r, a]);
279
- let t = n.get(o);
280
- return t || (t = await P(
281
- new Worker(
282
- new URL(
283
- /* @vite-ignore */
284
- "" + new URL("../../assets/multi-sequence-alignment.worker-Cm0gZp19.js", import.meta.url).href,
285
- import.meta.url
286
- ),
287
- { type: "module" }
288
- ),
289
- { sequences: r, params: a },
290
- e
291
- ), n.set(o, t), t);
292
- };
293
- })();
294
- function oe({ colorScheme: n, sequences: r, residueCounts: a, markup: e }) {
295
- var o;
296
- if (n.type === "chemical-properties")
297
- return V({ sequences: r, residueCounts: a });
298
- if (n.type === "markup") {
299
- if (!e)
300
- throw new Error("Missing markup data.");
301
- return Q({
302
- markupRows: r.map((t, i) => {
303
- const c = e.rows.at(i);
304
- if (!c) throw new Error(`Missing markup for row ${i}.`);
305
- return Y(t, c);
306
- }),
307
- columnCount: ((o = r.at(0)) == null ? void 0 : o.length) ?? 0,
308
- labels: e.labels
309
- });
310
- }
311
- }
312
- const se = (n) => new Promise((r, a) => {
313
- const e = new FileReader();
314
- e.addEventListener("load", () => r(e.result)), e.addEventListener("error", () => a(e.error)), e.readAsDataURL(n);
315
- }), ie = /* @__PURE__ */ (() => {
316
- const n = /* @__PURE__ */ new Map();
317
- return async (r, a) => {
318
- var i;
319
- const e = ((i = r.at(0)) == null ? void 0 : i.rows.keys().map((c) => r.map((l) => l.rows.at(c) ?? "").join("")).toArray()) ?? [], o = await I(e);
320
- let t = n.get(o);
321
- return t || (t = await P(
322
- new Worker(
323
- new URL(
324
- /* @vite-ignore */
325
- "" + new URL("../../assets/phylogenetic-tree.worker-4CrExYEo.js", import.meta.url).href,
326
- import.meta.url
327
- ),
328
- { type: "module" }
329
- ),
330
- e,
331
- a
332
- ), n.set(o, t), t);
333
- };
334
- })(), P = (n, r, a) => new Promise((e, o) => {
335
- n.addEventListener("message", ({ data: t }) => {
336
- e(t), n.terminate();
337
- }), n.addEventListener("error", ({ error: t, message: i }) => {
338
- o(t ?? i), n.terminate();
339
- }), a.addEventListener("abort", () => {
340
- o(a.reason), n.terminate();
341
- }), n.postMessage(r);
342
- });
343
- function E(n) {
344
- const r = M(), a = M(!0), e = M();
345
- let o;
346
- return (t) => (F(t, async (i, c) => {
347
- if (O(i, c)) return;
348
- const l = new AbortController(), s = o = Symbol();
349
- H(() => {
350
- l.abort();
351
- });
352
- try {
353
- e.value = void 0, a.value = !0;
354
- const u = await n(i, l.signal);
355
- s === o && (r.value = u);
356
- } catch (u) {
357
- console.error(u), s === o && (e.value = T(u));
358
- } finally {
359
- s === o && (a.value = !1);
360
- }
361
- }, { immediate: !0 }), { data: r, isLoading: a, error: e });
362
- }
363
- export {
364
- D as SEQUENCE_LIMIT,
365
- ge as useLabelColumnsOptions,
366
- he as useMarkupColumnsOptions,
367
- be as useMultipleAlignmentData,
368
- we as useSequenceColumnsOptions
369
- };
370
- //# sourceMappingURL=data.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"data.js","sources":["../../../src/components/PlMultiSequenceAlignment/data.ts"],"sourcesContent":["import { isJsonEqual } from '@milaboratories/helpers';\nimport type { ListOptionNormalized } from '@milaboratories/uikit';\nimport {\n Annotation,\n type CalculateTableDataRequest,\n type CalculateTableDataResponse,\n type CanonicalizedJson,\n canonicalizeJson,\n createRowSelectionColumn,\n ensureError,\n getAxisId,\n getRawPlatformaInstance,\n isLabelColumn,\n isLinkerColumn,\n type JoinEntry,\n matchAxisId,\n parseJson,\n type PColumnIdAndSpec,\n type PFrameHandle,\n type PlMultiSequenceAlignmentColorSchemeOption,\n type PlMultiSequenceAlignmentSettings,\n type PlSelectionModel,\n type PObjectId,\n type PTableColumnId,\n type PTableSorting,\n pTableValue,\n readAnnotation,\n readAnnotationJson,\n} from '@platforma-sdk/model';\nimport { onWatcherCleanup, ref, watch } from 'vue';\nimport { objectHash } from '../../objectHash';\nimport { highlightByChemicalProperties } from './chemical-properties';\nimport type { Markup } from './markup';\nimport {\n highlightByMarkup,\n markupAlignedSequence,\n parseMarkup,\n} from './markup';\nimport type * as MultiSequenceAlignmentWorker from './multi-sequence-alignment.worker';\nimport type * as PhylogeneticTreeWorker from './phylogenetic-tree.worker';\nimport { getResidueCounts } from './residue-counts';\nimport type { HighlightLegend, ResidueCounts } from './types';\n\nconst getPFrameDriver = () => getRawPlatformaInstance().pFrameDriver;\n\nexport const SEQUENCE_LIMIT = 1000;\n\nexport const useSequenceColumnsOptions = refreshOnDeepChange(\n getSequenceColumnsOptions,\n);\n\nexport const useLabelColumnsOptions = refreshOnDeepChange(\n getLabelColumnsOptions,\n);\n\nexport const useMarkupColumnsOptions = refreshOnDeepChange(\n getMarkupColumnsOptions,\n);\n\nexport const useMultipleAlignmentData = refreshOnDeepChange(\n getMultipleAlignmentData,\n);\n\nasync function getSequenceColumnsOptions({ pFrame, sequenceColumnPredicate }: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnPredicate: (column: PColumnIdAndSpec) => boolean;\n}): Promise<OptionsWithDefaults<PObjectId> | undefined> {\n if (!pFrame) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n\n const options = columns.values()\n .filter((column) => sequenceColumnPredicate(column))\n .map(({ spec, columnId }) => ({\n label: readAnnotation(spec, Annotation.Label) ?? 'Unlabeled column',\n value: columnId,\n }))\n .toArray();\n\n const defaults = options.map(({ value }) => value);\n\n return { options, defaults };\n}\n\nasync function getLabelColumnsOptions({ pFrame, sequenceColumnIds }: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n}): Promise<OptionsWithDefaults<PTableColumnId> | undefined> {\n if (!pFrame || !sequenceColumnIds) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n\n const sequenceColumnsAxes = new Map(\n sequenceColumnIds.values().flatMap((id) => {\n const column = columns.find(({ columnId }) => columnId === id);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: \\`${id}\\`).`);\n }\n return column.spec.axesSpec.values()\n .map((spec) => [canonicalizeJson(getAxisId(spec)), spec]);\n }),\n );\n\n const optionMap = new Map<CanonicalizedJson<PTableColumnId>, string>();\n for (const [axisIdJson, axisSpec] of sequenceColumnsAxes.entries()) {\n const axisId = parseJson(axisIdJson);\n const labelColumn = columns.find(({ spec }) =>\n isLabelColumn(spec) && matchAxisId(axisId, getAxisId(spec.axesSpec[0])),\n );\n optionMap.set(\n labelColumn\n ? canonicalizeJson({ type: 'column', id: labelColumn.columnId })\n : canonicalizeJson({ type: 'axis', id: axisId }),\n readAnnotation(labelColumn?.spec, Annotation.Label)\n ?? readAnnotation(axisSpec, Annotation.Label)\n ?? 'Unlabeled axis',\n );\n }\n\n const { hits: compatibleColumns } = await pFrameDriver.findColumns(pFrame, {\n columnFilter: {},\n compatibleWith: sequenceColumnsAxes.keys()\n .map((axisIdJson) => parseJson(axisIdJson))\n .toArray(),\n strictlyCompatible: false,\n });\n\n for (const { columnId, spec } of compatibleColumns) {\n const columnIdJson = canonicalizeJson<PTableColumnId>({\n type: 'column',\n id: columnId,\n });\n if (optionMap.has(columnIdJson)) continue;\n optionMap.set(\n columnIdJson,\n readAnnotation(spec, Annotation.Label) ?? 'Unlabeled column',\n );\n }\n\n const options = optionMap.entries()\n .map(([value, label]) => ({ label, value: parseJson(value) }))\n .toArray();\n\n const defaults = options.values()\n .filter(({ value }) => {\n if (value.type === 'axis') return true;\n const column = columns.find(({ columnId }) => columnId === value.id);\n return column && isLabelColumn(column.spec);\n })\n .map(({ value }) => value)\n .toArray();\n\n return { options, defaults };\n}\n\nasync function getMarkupColumnsOptions({ pFrame, sequenceColumnIds }: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n}): Promise<ListOptionNormalized<PObjectId[]>[] | undefined> {\n if (!pFrame || !sequenceColumnIds) return;\n\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n\n const sequenceColumns = sequenceColumnIds.map((columnId) => {\n const column = columns.find((column) => column.columnId === columnId);\n if (!column) {\n throw new Error(\n `Couldn't find sequence column (ID: \\`${sequenceColumnIds[0]}\\`).`,\n );\n }\n return column;\n });\n\n const columnPairs = sequenceColumns\n .flatMap((sequenceColumn) =>\n columns\n .filter((column) =>\n readAnnotationJson(column.spec, Annotation.Sequence.IsAnnotation)\n && isJsonEqual(sequenceColumn.spec.axesSpec, column.spec.axesSpec)\n && Object.entries(sequenceColumn.spec.domain ?? {})\n .every(([key, value]) => column.spec.domain?.[key] === value),\n )\n .map((markupColumn) => ({ markupColumn, sequenceColumn })),\n );\n\n const groupedByDomainDiff = Map.groupBy(\n columnPairs,\n ({ markupColumn, sequenceColumn }) => {\n const domainDiff = Object.fromEntries(\n Object.entries(markupColumn.spec.domain ?? {})\n .filter(([key]) => sequenceColumn.spec.domain?.[key] == undefined),\n );\n return canonicalizeJson(domainDiff);\n },\n );\n\n return groupedByDomainDiff.entries()\n .map(([domainDiffJson, columnPairs]) => ({\n label: Object.values(parseJson(domainDiffJson)).join(', '),\n value: columnPairs.map(({ markupColumn }) => markupColumn.columnId),\n }))\n .toArray();\n}\n\nasync function getMultipleAlignmentData(\n {\n pFrame,\n sequenceColumnIds,\n labelColumnIds,\n selection,\n colorScheme,\n alignmentParams,\n shouldBuildPhylogeneticTree,\n }: {\n pFrame: PFrameHandle | undefined;\n sequenceColumnIds: PObjectId[] | undefined;\n labelColumnIds: PTableColumnId[] | undefined;\n selection: PlSelectionModel | undefined;\n colorScheme: PlMultiSequenceAlignmentColorSchemeOption;\n alignmentParams: PlMultiSequenceAlignmentSettings['alignmentParams'];\n shouldBuildPhylogeneticTree: boolean;\n },\n abortSignal: AbortSignal,\n): Promise<MultipleAlignmentData | undefined> {\n if (!pFrame || !sequenceColumnIds?.length || !labelColumnIds) return;\n\n const table = await getTableData({\n pFrame,\n sequenceColumnIds,\n labelColumnIds,\n selection,\n colorScheme,\n });\n\n const rowCount = table.at(0)?.data.data.length ?? 0;\n\n if (rowCount < 2) return;\n\n const exceedsLimit = rowCount > SEQUENCE_LIMIT;\n const rawSequences = extractSequences(sequenceColumnIds, table);\n const labels = extractLabels(labelColumnIds, table);\n const markups = colorScheme.type === 'markup'\n ? extractMarkups(colorScheme.columnIds, table)\n : undefined;\n\n const highlightLegend: HighlightLegend = {};\n\n const alignedSequences = await Promise.all(\n rawSequences.map(async ({ name, rows }) => ({\n name,\n rows: await alignSequences(\n rows,\n JSON.parse(JSON.stringify(alignmentParams)),\n abortSignal,\n ),\n })),\n );\n\n let phylogeneticTree: PhylogeneticTreeWorker.TreeNodeData[] | undefined;\n if (shouldBuildPhylogeneticTree) {\n phylogeneticTree = await buildPhylogeneticTree(\n alignedSequences,\n abortSignal,\n );\n const rowOrder = phylogeneticTree.values()\n .filter(({ id }) => id >= 0)\n .map(({ id }) => id)\n .toArray();\n for (const sequencesColumn of alignedSequences) {\n sequencesColumn.rows = rowOrder.map((i) => sequencesColumn.rows[i]);\n }\n for (const labelsColumn of labels) {\n labelsColumn.rows = rowOrder.map((i) => labelsColumn.rows[i]);\n }\n for (const markupsColumn of markups ?? []) {\n markupsColumn.rows = rowOrder.map((i) => markupsColumn.rows[i]);\n }\n }\n\n const sequences = await Promise.all(\n alignedSequences.map(async ({ name, rows }, index) => {\n const residueCounts = getResidueCounts(rows);\n const image = generateHighlightImage({\n colorScheme,\n sequences: rows,\n residueCounts,\n markup: markups?.at(index),\n });\n if (image) {\n Object.assign(highlightLegend, image.legend);\n }\n return {\n name,\n rows,\n residueCounts,\n ...image && {\n highlightImageUrl: await blobToBase64(image.blob),\n },\n } satisfies MultipleAlignmentData['sequences'][number];\n }),\n );\n\n return {\n sequences,\n labels,\n ...Object.keys(highlightLegend).length && {\n highlightLegend,\n },\n ...phylogeneticTree && {\n phylogeneticTree,\n },\n exceedsLimit,\n };\n}\n\nasync function getTableData(\n { pFrame, sequenceColumnIds, labelColumnIds, selection, colorScheme }: {\n pFrame: PFrameHandle;\n sequenceColumnIds: PObjectId[];\n labelColumnIds: PTableColumnId[];\n selection: PlSelectionModel | undefined;\n colorScheme: PlMultiSequenceAlignmentColorSchemeOption;\n },\n): Promise<CalculateTableDataResponse> {\n const pFrameDriver = getPFrameDriver();\n const columns = await pFrameDriver.listColumns(pFrame);\n const linkerColumns = columns.filter((column) => isLinkerColumn(column.spec));\n\n const filterColumn = createRowSelectionColumn({ selection });\n\n // inner join of sequence columns\n let primaryEntry: JoinEntry<PObjectId> = {\n type: 'inner',\n entries: sequenceColumnIds.map((column) => ({\n type: 'column',\n column,\n })),\n };\n\n // if we have linkers, left join them\n if (linkerColumns.length > 0) {\n primaryEntry = {\n type: 'outer',\n primary: primaryEntry,\n secondary: linkerColumns.map(({ columnId }) => ({\n type: 'column',\n column: columnId,\n })),\n };\n }\n\n // inner join with filters\n if (filterColumn) {\n primaryEntry = {\n type: 'inner',\n entries: [\n primaryEntry,\n {\n type: 'inlineColumn',\n column: filterColumn,\n },\n ],\n };\n }\n\n // left join with labels\n const secondaryEntry: JoinEntry<PObjectId>[] = labelColumnIds\n .flatMap((column) => {\n if (column.type !== 'column') return [];\n return { type: 'column', column: column.id };\n });\n\n // and markup\n if (colorScheme.type === 'markup') {\n for (const column of colorScheme.columnIds) {\n secondaryEntry.push({ type: 'column', column });\n }\n }\n\n const sorting: PTableSorting[] = Array.from(\n new Set(\n sequenceColumnIds.values().flatMap((id) => {\n const column = columns.find(({ columnId }) => columnId === id);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: ${id})`);\n }\n return column.spec.axesSpec\n .map((spec) => canonicalizeJson(getAxisId(spec)));\n }),\n ),\n )\n .sort()\n .map((id) => ({\n column: { type: 'axis', id: parseJson(id) },\n ascending: true,\n naAndAbsentAreLeastValues: true,\n }));\n\n const request: CalculateTableDataRequest<PObjectId> = {\n src: {\n type: 'outer',\n primary: primaryEntry,\n secondary: secondaryEntry,\n },\n filters: [],\n sorting,\n };\n\n return pFrameDriver.calculateTableData(\n pFrame,\n JSON.parse(JSON.stringify(request)),\n {\n offset: 0,\n // +1 is a hack to check whether the selection is over the limit\n length: SEQUENCE_LIMIT + 1,\n },\n );\n}\n\nconst extractSequences = (\n columnIds: PObjectId[],\n table: CalculateTableDataResponse,\n): { name: string; rows: string[] }[] =>\n columnIds.map((columnId) => {\n const column = table.find(({ spec }) => spec.id === columnId);\n if (!column) {\n throw new Error(`Couldn't find sequence column (ID: \\`${columnId}\\`).`);\n }\n const name = readAnnotation(column.spec.spec, Annotation.Label)\n ?? 'Unlabeled column';\n const rows = column.data.data\n .keys()\n .take(SEQUENCE_LIMIT)\n .map((row) =>\n pTableValue(column.data, row, { absent: '', na: '' })?.toString()\n ?? '',\n )\n .toArray();\n return { name, rows };\n });\n\nconst extractLabels = (\n columnIds: PTableColumnId[],\n table: CalculateTableDataResponse,\n): { rows: string[] }[] =>\n columnIds.map((columnId) => {\n const column = table.find(({ spec }) => {\n if (columnId.type === 'axis' && spec.type === 'axis') {\n return isJsonEqual(columnId.id, spec.id);\n }\n if (columnId.type === 'column' && spec.type === 'column') {\n return columnId.id === spec.id;\n }\n });\n if (!column) {\n throw new Error(`Couldn't find label column (ID: \\`${columnId}\\`).`);\n }\n const rows = column.data.data\n .keys()\n .take(SEQUENCE_LIMIT)\n .map((row) =>\n pTableValue(column.data, row, { absent: '', na: '' })?.toString()\n ?? '',\n )\n .toArray();\n return { rows };\n });\n\nconst extractMarkups = (\n columnIds: PObjectId[],\n table: CalculateTableDataResponse,\n): { labels: Record<string, string>; rows: Markup[] }[] =>\n columnIds.map((columnId) => {\n const column = table.find(({ spec }) => spec.id === columnId);\n if (!column) {\n throw new Error(`Couldn't find markup column (ID: \\`${columnId}\\`).`);\n }\n const labels = readAnnotationJson(\n column.spec.spec,\n Annotation.Sequence.Annotation.Mapping,\n ) ?? {};\n const rows = column.data.data\n .keys()\n .take(SEQUENCE_LIMIT)\n .map((row) =>\n parseMarkup(\n pTableValue(column.data, row, { absent: '', na: '' })?.toString()\n ?? '',\n ),\n )\n .toArray();\n return { labels, rows };\n });\n\nconst alignSequences = (() => {\n const cache = new Map<string, string[]>();\n return async (\n sequences: string[],\n alignmentParams: PlMultiSequenceAlignmentSettings['alignmentParams'],\n abortSignal: AbortSignal,\n ): Promise<string[]> => {\n const hash = await objectHash([sequences, alignmentParams]);\n let result = cache.get(hash);\n if (result) return result;\n result = await runInWorker<\n MultiSequenceAlignmentWorker.RequestMessage,\n MultiSequenceAlignmentWorker.ResponseMessage\n >(\n new Worker(\n new URL('./multi-sequence-alignment.worker.ts', import.meta.url),\n { type: 'module' },\n ),\n { sequences, params: alignmentParams },\n abortSignal,\n );\n cache.set(hash, result);\n return result;\n };\n})();\n\nfunction generateHighlightImage(\n { colorScheme, sequences, residueCounts, markup }: {\n colorScheme: PlMultiSequenceAlignmentColorSchemeOption;\n sequences: string[];\n residueCounts: ResidueCounts;\n markup: { labels: Record<string, string>; rows: Markup[] } | undefined;\n },\n): { blob: Blob; legend: HighlightLegend } | undefined {\n if (colorScheme.type === 'chemical-properties') {\n return highlightByChemicalProperties({ sequences, residueCounts });\n }\n if (colorScheme.type === 'markup') {\n if (!markup) {\n throw new Error('Missing markup data.');\n }\n return highlightByMarkup({\n markupRows: sequences.map((sequence, row) => {\n const markupRow = markup.rows.at(row);\n if (!markupRow) throw new Error(`Missing markup for row ${row}.`);\n return markupAlignedSequence(sequence, markupRow);\n }),\n columnCount: sequences.at(0)?.length ?? 0,\n labels: markup.labels,\n });\n }\n}\n\nconst blobToBase64 = (blob: Blob): Promise<string> =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.addEventListener('load', () => resolve(reader.result as string));\n reader.addEventListener('error', () => reject(reader.error));\n reader.readAsDataURL(blob);\n });\n\nconst buildPhylogeneticTree = (() => {\n const cache = new Map<string, PhylogeneticTreeWorker.TreeNodeData[]>();\n return async (data: { rows: string[] }[], abortSignal: AbortSignal) => {\n const concatenatedSequences = data.at(0)?.rows\n .keys()\n .map((row) => data.map((column) => column.rows.at(row) ?? '').join(''))\n .toArray() ?? [];\n const hash = await objectHash(concatenatedSequences);\n let result = cache.get(hash);\n if (result) return result;\n result = await runInWorker<\n PhylogeneticTreeWorker.RequestMessage,\n PhylogeneticTreeWorker.ResponseMessage\n >(\n new Worker(\n new URL('./phylogenetic-tree.worker.ts', import.meta.url),\n { type: 'module' },\n ),\n concatenatedSequences,\n abortSignal,\n );\n cache.set(hash, result);\n return result;\n };\n})();\n\nconst runInWorker = <RequestMessage, ResponseMessage>(\n worker: Worker,\n message: RequestMessage,\n abortSignal: AbortSignal,\n) =>\n new Promise<ResponseMessage>((resolve, reject) => {\n worker.addEventListener('message', ({ data }) => {\n resolve(data);\n worker.terminate();\n });\n worker.addEventListener('error', ({ error, message }) => {\n reject(error ?? message);\n worker.terminate();\n });\n abortSignal.addEventListener('abort', () => {\n reject(abortSignal.reason);\n worker.terminate();\n });\n worker.postMessage(message);\n });\n\nfunction refreshOnDeepChange<T, P>(\n cb: (params: P, abortSignal: AbortSignal) => Promise<T>,\n) {\n const data = ref<T>();\n const isLoading = ref(true);\n const error = ref<Error>();\n let requestId: symbol;\n return (paramsGetter: () => P) => {\n watch(paramsGetter, async (params, prevParams) => {\n if (isJsonEqual(params, prevParams)) return;\n const abortController = new AbortController();\n const currentRequestId = requestId = Symbol();\n onWatcherCleanup(() => {\n abortController.abort();\n });\n try {\n error.value = undefined;\n isLoading.value = true;\n const result = await cb(params, abortController.signal);\n if (currentRequestId === requestId) {\n data.value = result;\n }\n } catch (err) {\n console.error(err);\n if (currentRequestId === requestId) {\n error.value = ensureError(err);\n }\n } finally {\n if (currentRequestId === requestId) {\n isLoading.value = false;\n }\n }\n }, { immediate: true });\n return { data, isLoading, error };\n };\n}\n\ntype MultipleAlignmentData = {\n sequences: {\n name: string;\n rows: string[];\n residueCounts: ResidueCounts;\n highlightImageUrl?: string;\n }[];\n labels: {\n rows: string[];\n }[];\n highlightLegend?: HighlightLegend;\n phylogeneticTree?: PhylogeneticTreeWorker.TreeNodeData[];\n exceedsLimit: boolean;\n};\n\ntype OptionsWithDefaults<T> = {\n options: ListOptionNormalized<T>[];\n defaults: T[];\n};\n"],"names":["getPFrameDriver","getRawPlatformaInstance","SEQUENCE_LIMIT","useSequenceColumnsOptions","refreshOnDeepChange","getSequenceColumnsOptions","useLabelColumnsOptions","getLabelColumnsOptions","useMarkupColumnsOptions","getMarkupColumnsOptions","useMultipleAlignmentData","getMultipleAlignmentData","pFrame","sequenceColumnPredicate","options","column","spec","columnId","readAnnotation","Annotation","defaults","value","sequenceColumnIds","pFrameDriver","columns","sequenceColumnsAxes","id","canonicalizeJson","getAxisId","optionMap","axisIdJson","axisSpec","axisId","parseJson","labelColumn","isLabelColumn","matchAxisId","compatibleColumns","columnIdJson","label","columnPairs","sequenceColumn","readAnnotationJson","isJsonEqual","key","_a","markupColumn","domainDiff","domainDiffJson","labelColumnIds","selection","colorScheme","alignmentParams","shouldBuildPhylogeneticTree","abortSignal","table","getTableData","rowCount","exceedsLimit","rawSequences","extractSequences","labels","extractLabels","markups","extractMarkups","highlightLegend","alignedSequences","name","rows","alignSequences","phylogeneticTree","buildPhylogeneticTree","rowOrder","sequencesColumn","i","labelsColumn","markupsColumn","index","residueCounts","getResidueCounts","image","generateHighlightImage","blobToBase64","linkerColumns","isLinkerColumn","filterColumn","createRowSelectionColumn","primaryEntry","secondaryEntry","sorting","request","columnIds","row","pTableValue","parseMarkup","cache","sequences","hash","objectHash","result","runInWorker","markup","highlightByChemicalProperties","highlightByMarkup","sequence","markupRow","markupAlignedSequence","blob","resolve","reject","reader","data","concatenatedSequences","worker","message","error","cb","ref","isLoading","requestId","paramsGetter","watch","params","prevParams","abortController","currentRequestId","onWatcherCleanup","err","ensureError"],"mappings":"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"}
@@ -1 +0,0 @@
1
- export { default as PlMultiSequenceAlignment } from './PlMultiSequenceAlignment.vue';
@@ -1,16 +0,0 @@
1
- import { HighlightLegend } from './types';
2
- export type Markup = {
3
- id: string;
4
- start: number;
5
- length: number;
6
- }[];
7
- export declare function parseMarkup(row: string): Markup;
8
- export declare function markupAlignedSequence(alignedSequence: string, markup: Markup): Markup;
9
- export declare function highlightByMarkup({ markupRows, columnCount, labels }: {
10
- markupRows: Markup[];
11
- columnCount: number;
12
- labels: Record<string, string>;
13
- }): {
14
- blob: Blob;
15
- legend: HighlightLegend;
16
- };
@@ -1,84 +0,0 @@
1
- function E(o) {
2
- return Array.from(o.matchAll(
3
- /(?<id>[^:]*):(?<start>[0-9A-Za-z]*)(?:\+(?<length>[0-9A-Za-z]*))?\|?/g
4
- )).map((l) => {
5
- const r = l.groups, n = Number.parseInt(r.start, 36), t = r.length ? Number.parseInt(r.length, 36) : 0;
6
- return {
7
- id: r.id,
8
- start: n,
9
- length: t
10
- };
11
- });
12
- }
13
- function f(o, l) {
14
- const r = o.split("").reduce(
15
- (t, a, e) => (a !== "-" && t.push(e), t),
16
- []
17
- );
18
- return l.map((t) => {
19
- const a = r[t.start], e = r[t.start + t.length - 1] + 1;
20
- return {
21
- id: t.id,
22
- start: a,
23
- length: e - a
24
- };
25
- });
26
- }
27
- function C({ markupRows: o, columnCount: l, labels: r }) {
28
- const n = /* @__PURE__ */ new Map();
29
- for (const [e, F] of o.entries())
30
- for (const { id: s, start: u, length: c } of F) {
31
- let i = n.get(s);
32
- i || n.set(s, i = []), i.push({ row: e, start: u, length: c });
33
- }
34
- const t = Object.fromEntries(
35
- Object.entries(r).map(
36
- ([e, F], s) => [
37
- e,
38
- {
39
- label: F,
40
- color: g[s % g.length]
41
- }
42
- ]
43
- ).filter(([e]) => n.has(e))
44
- );
45
- return { blob: new Blob(
46
- function* () {
47
- yield `<svg xmlns="http://www.w3.org/2000/svg" viewBox="${`0 0 ${l} ${o.length * 2}`}" stroke-width="2" preserveAspectRatio="none">`;
48
- for (const [F, s] of n) {
49
- const { color: u } = t[F];
50
- yield `<path stroke="${u}" d="`;
51
- let c = 0, i = 0;
52
- for (const { row: d, start: p, length: h } of s)
53
- yield `m${p - c},${d * 2 + 1 - i}h${h}`, c = p + h, i = d * 2 + 1;
54
- yield '"/>';
55
- }
56
- yield "</svg>";
57
- }().toArray(),
58
- { type: "image/svg+xml" }
59
- ), legend: t };
60
- }
61
- const g = [
62
- "#E5F2FF",
63
- "#FFE8E8",
64
- "#F0EBFF",
65
- "#FFFFE3",
66
- "#E5F7E5",
67
- "#FEEAFE",
68
- "#FDEED6",
69
- "#E8FDFE",
70
- "#CCDFF2",
71
- "#F2CCCD",
72
- "#D5CCF2",
73
- "#F2F2CC",
74
- "#CCF2CC",
75
- "#F2CCF2",
76
- "#EFDDBF",
77
- "#DEEEEF"
78
- ];
79
- export {
80
- C as highlightByMarkup,
81
- f as markupAlignedSequence,
82
- E as parseMarkup
83
- };
84
- //# sourceMappingURL=markup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"markup.js","sources":["../../../src/components/PlMultiSequenceAlignment/markup.ts"],"sourcesContent":["import type { HighlightLegend } from './types';\n\nexport type Markup = { id: string; start: number; length: number }[];\n\nexport function parseMarkup(row: string): Markup {\n return Array.from(row.matchAll(\n /(?<id>[^:]*):(?<start>[0-9A-Za-z]*)(?:\\+(?<length>[0-9A-Za-z]*))?\\|?/g,\n )).map((match) => {\n const matchGroups = match.groups as {\n id: string;\n start: string;\n length: string | undefined;\n };\n const start = Number.parseInt(matchGroups.start, 36);\n const length = matchGroups.length\n ? Number.parseInt(matchGroups.length, 36)\n : 0;\n return {\n id: matchGroups.id,\n start,\n length,\n };\n });\n}\n\nexport function markupAlignedSequence(\n alignedSequence: string,\n markup: Markup,\n): Markup {\n const indexMap = alignedSequence.split('').reduce<number[]>(\n (acc, char, index) => {\n if (char !== '-') acc.push(index);\n return acc;\n },\n [],\n );\n const adjusted = markup.map((segment) => {\n const start = indexMap[segment.start];\n const end = indexMap[segment.start + segment.length - 1] + 1;\n return {\n id: segment.id,\n start: start,\n length: end - start,\n };\n });\n return adjusted;\n}\n\nexport function highlightByMarkup(\n { markupRows, columnCount, labels }: {\n markupRows: Markup[];\n columnCount: number;\n labels: Record<string, string>;\n },\n): { blob: Blob; legend: HighlightLegend } {\n const linesById: Map<string, {\n row: number;\n start: number;\n length: number;\n }[]> = new Map();\n for (const [row, markup] of markupRows.entries()) {\n for (const { id, start, length } of markup) {\n let bucket = linesById.get(id);\n if (!bucket) linesById.set(id, bucket = []);\n bucket.push({ row, start, length });\n }\n }\n const legend: HighlightLegend = Object.fromEntries(\n Object.entries(labels)\n .map(([id, label], index) =>\n [\n id,\n {\n label,\n color: markupColors[index % markupColors.length],\n },\n ] as const,\n )\n .filter(([id]) => linesById.has(id)),\n );\n const blob = new Blob(\n (function*() {\n const viewBox = `0 0 ${columnCount} ${markupRows.length * 2}`;\n yield `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${viewBox}\" stroke-width=\"2\" preserveAspectRatio=\"none\">`;\n for (const [id, lines] of linesById) {\n const { color } = legend[id];\n yield `<path stroke=\"${color}\" d=\"`;\n let x = 0, y = 0;\n for (const { row, start, length } of lines) {\n yield `m${start - x},${row * 2 + 1 - y}h${length}`;\n x = start + length;\n y = row * 2 + 1;\n }\n yield '\"/>';\n }\n yield '</svg>';\n })().toArray(),\n { type: 'image/svg+xml' },\n );\n return { blob, legend };\n}\n\nconst markupColors = [\n '#E5F2FF',\n '#FFE8E8',\n '#F0EBFF',\n '#FFFFE3',\n '#E5F7E5',\n '#FEEAFE',\n '#FDEED6',\n '#E8FDFE',\n '#CCDFF2',\n '#F2CCCD',\n '#D5CCF2',\n '#F2F2CC',\n '#CCF2CC',\n '#F2CCF2',\n '#EFDDBF',\n '#DEEEEF',\n];\n\nif (import.meta.vitest) {\n const { test, expect } = import.meta.vitest;\n test('annotateAlignedRow', () => {\n const alignedSequence\n = 'EVRLVESGGALVQPGGSLRLSCVAASGFTFINNWVTWVRQAPGKGLEWVANIKEDGSQKYYVDSVKGRFTISRDNAEKSVYLQMSSLRVDDTAVYYCAR------------GRAV----D---QWGQGTLVTVSS';\n // 0 10 20 30 40 50 60 70 80 90 100 110 120 130\n // EVRLVESGGALVQPGGSLRLSCVAASGFTFINNWVTWVRQAPGKGLEWVANIKEDGSQKYYVDSVKGRFTISRDNAEKSVYLQMSSLRVDDTAVYYCARGRAVDQWGQGTLVTVSS\n const markup = [\n { id: '1', start: 0, length: 99 },\n { id: '2', start: 99, length: 3 },\n { id: '3', start: 102, length: 14 },\n ];\n const alignedMarkup = markupAlignedSequence(alignedSequence, markup);\n expect(alignedMarkup).toEqual([\n { id: '1', start: 0, length: 99 },\n { id: '2', start: 111, length: 3 },\n { id: '3', start: 114, length: 21 },\n ]);\n });\n}\n"],"names":["parseMarkup","row","match","matchGroups","start","length","markupAlignedSequence","alignedSequence","markup","indexMap","acc","char","index","segment","end","highlightByMarkup","markupRows","columnCount","labels","linesById","id","bucket","legend","label","markupColors","lines","color","x","y"],"mappings":"AAIO,SAASA,EAAYC,GAAqB;AAC/C,SAAO,MAAM,KAAKA,EAAI;AAAA,IACpB;AAAA,EAAA,CACD,EAAE,IAAI,CAACC,MAAU;AAChB,UAAMC,IAAcD,EAAM,QAKpBE,IAAQ,OAAO,SAASD,EAAY,OAAO,EAAE,GAC7CE,IAASF,EAAY,SACvB,OAAO,SAASA,EAAY,QAAQ,EAAE,IACtC;AACJ,WAAO;AAAA,MACL,IAAIA,EAAY;AAAA,MAChB,OAAAC;AAAA,MACA,QAAAC;AAAA,IAAA;AAAA,EAEJ,CAAC;AACH;AAEO,SAASC,EACdC,GACAC,GACQ;AACR,QAAMC,IAAWF,EAAgB,MAAM,EAAE,EAAE;AAAA,IACzC,CAACG,GAAKC,GAAMC,OACND,MAAS,OAAKD,EAAI,KAAKE,CAAK,GACzBF;AAAA,IAET,CAAA;AAAA,EAAC;AAWH,SATiBF,EAAO,IAAI,CAACK,MAAY;AACvC,UAAMT,IAAQK,EAASI,EAAQ,KAAK,GAC9BC,IAAML,EAASI,EAAQ,QAAQA,EAAQ,SAAS,CAAC,IAAI;AAC3D,WAAO;AAAA,MACL,IAAIA,EAAQ;AAAA,MACZ,OAAAT;AAAA,MACA,QAAQU,IAAMV;AAAA,IAAA;AAAA,EAElB,CAAC;AAEH;AAEO,SAASW,EACd,EAAE,YAAAC,GAAY,aAAAC,GAAa,QAAAC,KAKc;AACzC,QAAMC,wBAIK,IAAA;AACX,aAAW,CAAClB,GAAKO,CAAM,KAAKQ,EAAW;AACrC,eAAW,EAAE,IAAAI,GAAI,OAAAhB,GAAO,QAAAC,EAAA,KAAYG,GAAQ;AAC1C,UAAIa,IAASF,EAAU,IAAIC,CAAE;AAC7B,MAAKC,KAAQF,EAAU,IAAIC,GAAIC,IAAS,EAAE,GAC1CA,EAAO,KAAK,EAAE,KAAApB,GAAK,OAAAG,GAAO,QAAAC,GAAQ;AAAA,IACpC;AAEF,QAAMiB,IAA0B,OAAO;AAAA,IACrC,OAAO,QAAQJ,CAAM,EAClB;AAAA,MAAI,CAAC,CAACE,GAAIG,CAAK,GAAGX,MACjB;AAAA,QACEQ;AAAA,QACA;AAAA,UACE,OAAAG;AAAA,UACA,OAAOC,EAAaZ,IAAQY,EAAa,MAAM;AAAA,QAAA;AAAA,MACjD;AAAA,IACF,EAED,OAAO,CAAC,CAACJ,CAAE,MAAMD,EAAU,IAAIC,CAAE,CAAC;AAAA,EAAA;AAqBvC,SAAO,EAAE,MAnBI,IAAI;AAAA,IACd,aAAY;AAEX,YAAM,oDADU,OAAOH,CAAW,IAAID,EAAW,SAAS,CAAC,EACM;AACjE,iBAAW,CAACI,GAAIK,CAAK,KAAKN,GAAW;AACnC,cAAM,EAAE,OAAAO,EAAA,IAAUJ,EAAOF,CAAE;AAC3B,cAAM,iBAAiBM,CAAK;AAC5B,YAAIC,IAAI,GAAGC,IAAI;AACf,mBAAW,EAAE,KAAA3B,GAAK,OAAAG,GAAO,QAAAC,EAAA,KAAYoB;AACnC,gBAAM,IAAIrB,IAAQuB,CAAC,IAAI1B,IAAM,IAAI,IAAI2B,CAAC,IAAIvB,CAAM,IAChDsB,IAAIvB,IAAQC,GACZuB,IAAI3B,IAAM,IAAI;AAEhB,cAAM;AAAA,MACR;AACA,YAAM;AAAA,IACR,EAAA,EAAK,QAAA;AAAA,IACL,EAAE,MAAM,gBAAA;AAAA,EAAgB,GAEX,QAAAqB,EAAA;AACjB;AAEA,MAAME,IAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;"}
@@ -1,3 +0,0 @@
1
- import { PlMultiSequenceAlignmentModel } from '@platforma-sdk/model';
2
- import { Ref } from 'vue';
3
- export declare function runMigrations(model: Ref<PlMultiSequenceAlignmentModel>): void;
@@ -1,24 +0,0 @@
1
- import { parseJson as u } from "@platforma-sdk/model";
2
- const o = 2;
3
- function l(r) {
4
- var t;
5
- const n = s(r.value);
6
- try {
7
- if (n < 1) {
8
- const e = r.value.labelColumnIds;
9
- e && (r.value.labelColumnIds = e.map((i) => u(i)));
10
- }
11
- n < 2 && ((t = r.value.colorScheme) == null ? void 0 : t.type) === "markup" && delete r.value.colorScheme;
12
- } catch (e) {
13
- console.error(e), r.value = {};
14
- } finally {
15
- r.value.version = o;
16
- }
17
- }
18
- function s(r) {
19
- return r.version !== void 0 ? r.version : Object.keys(r).length ? 0 : o;
20
- }
21
- export {
22
- l as runMigrations
23
- };
24
- //# sourceMappingURL=migrations.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrations.js","sources":["../../../src/components/PlMultiSequenceAlignment/migrations.ts"],"sourcesContent":["import {\n type CanonicalizedJson,\n parseJson,\n type PlMultiSequenceAlignmentModel,\n type PTableColumnId,\n} from '@platforma-sdk/model';\nimport { type Ref } from 'vue';\n\nconst latestVersion = 2;\n\nexport function runMigrations(model: Ref<PlMultiSequenceAlignmentModel>) {\n const currentVersion = getCurrentVersion(model.value);\n try {\n if (currentVersion < 1) {\n const oldLabelColumnIds = model.value.labelColumnIds as unknown as\n | CanonicalizedJson<PTableColumnId>[]\n | undefined;\n if (oldLabelColumnIds) {\n model.value.labelColumnIds = oldLabelColumnIds\n .map((id) => parseJson(id));\n }\n }\n if (currentVersion < 2) {\n if (model.value.colorScheme?.type === 'markup') {\n delete model.value.colorScheme;\n }\n }\n } catch (error) {\n console.error(error);\n model.value = {};\n } finally {\n model.value.version = latestVersion;\n }\n}\n\n/**\n * If a model has a version, return it.\n * If it doesn't, but contains anything at all, that's version 0,\n * which is a pre-versioning version.\n * Otherwise, emtpy model is treated as the latest model.\n */\nfunction getCurrentVersion(model: PlMultiSequenceAlignmentModel) {\n if (model.version !== undefined) return model.version;\n if (Object.keys(model).length) return 0;\n return latestVersion;\n}\n"],"names":["latestVersion","runMigrations","model","currentVersion","getCurrentVersion","oldLabelColumnIds","id","parseJson","_a","error"],"mappings":";AAQA,MAAMA,IAAgB;AAEf,SAASC,EAAcC,GAA2C;;AACvE,QAAMC,IAAiBC,EAAkBF,EAAM,KAAK;AACpD,MAAI;AACF,QAAIC,IAAiB,GAAG;AACtB,YAAME,IAAoBH,EAAM,MAAM;AAGtC,MAAIG,MACFH,EAAM,MAAM,iBAAiBG,EAC1B,IAAI,CAACC,MAAOC,EAAUD,CAAE,CAAC;AAAA,IAEhC;AACA,IAAIH,IAAiB,OACfK,IAAAN,EAAM,MAAM,gBAAZ,gBAAAM,EAAyB,UAAS,YACpC,OAAON,EAAM,MAAM;AAAA,EAGzB,SAASO,GAAO;AACd,YAAQ,MAAMA,CAAK,GACnBP,EAAM,QAAQ,CAAA;AAAA,EAChB,UAAA;AACE,IAAAA,EAAM,MAAM,UAAUF;AAAA,EACxB;AACF;AAQA,SAASI,EAAkBF,GAAsC;AAC/D,SAAIA,EAAM,YAAY,SAAkBA,EAAM,UAC1C,OAAO,KAAKA,CAAK,EAAE,SAAe,IAC/BF;AACT;"}
@@ -1,6 +0,0 @@
1
- import { PlMultiSequenceAlignmentSettings } from '@platforma-sdk/model';
2
- export type RequestMessage = {
3
- sequences: string[];
4
- params: PlMultiSequenceAlignmentSettings['alignmentParams'];
5
- };
6
- export type ResponseMessage = string[];
@@ -1,7 +0,0 @@
1
- export type RequestMessage = string[];
2
- export type ResponseMessage = TreeNodeData[];
3
- export interface TreeNodeData {
4
- id: number;
5
- length?: number;
6
- parentId?: number;
7
- }
@@ -1,2 +0,0 @@
1
- import { ResidueCounts } from './types';
2
- export declare function getResidueCounts(alignedSequences: string[]): ResidueCounts;
@@ -1,13 +0,0 @@
1
- function c(n) {
2
- const e = [];
3
- for (const r of n)
4
- for (const [t, o] of r.split("").entries()) {
5
- const s = e[t] ?? (e[t] = {});
6
- s[o] = (s[o] ?? 0) + 1;
7
- }
8
- return e;
9
- }
10
- export {
11
- c as getResidueCounts
12
- };
13
- //# sourceMappingURL=residue-counts.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"residue-counts.js","sources":["../../../src/components/PlMultiSequenceAlignment/residue-counts.ts"],"sourcesContent":["import type { ResidueCounts } from './types';\n\nexport function getResidueCounts(\n alignedSequences: string[],\n): ResidueCounts {\n const columns: ResidueCounts = [];\n for (const sequence of alignedSequences) {\n for (const [columnIndex, residue] of sequence.split('').entries()) {\n const column = columns[columnIndex] ??= {};\n column[residue] = (column[residue] ?? 0) + 1;\n }\n }\n return columns;\n}\n\nif (import.meta.vitest) {\n const { test, expect } = import.meta.vitest;\n\n test('getAlignmentStats', () => {\n const alignedSequences = [\n 'GKGDPKKPRG-KMSSYAFFVQTSREEHKKKHPDASVNFSEFSKKCSERWKTMSAKEKGKFEDMAKADKARYEREMKTY-IPPKGE---------',\n '-----MQDRV-KRPMNAFIVWSRDQRRKMALENPRMRNSEISKQLGYQWKMLTEAEKWPFFQEAQKLQAMHREKYPNYKYRPRRKAKMLPK---',\n 'MKKLKKHPDFPKKPLTPYFRFFMEKRAKYAKLHPEMSNLDLTKILSKKYKELPEKKKMKYIQDFQREKQ-EFERNLARFREDHPDLIQNAKK--',\n '-----MHI---KKPLNAFMLYMKEMRANVVAESTLKESAAINQILGRRWHALSREEQAKYYELARKERQLHMQLYPGWSARDNYGKKKKRKREK',\n ];\n\n expect(getResidueCounts(alignedSequences)).toEqual([\n { '-': 2, 'G': 1, 'M': 1 },\n { '-': 2, 'K': 2 },\n { '-': 2, 'G': 1, 'K': 1 },\n { '-': 2, 'D': 1, 'L': 1 },\n { '-': 2, 'K': 1, 'P': 1 },\n { K: 2, M: 2 },\n { H: 2, K: 1, Q: 1 },\n { D: 1, I: 1, P: 2 },\n { '-': 1, 'D': 1, 'R': 2 },\n { '-': 1, 'F': 1, 'G': 1, 'V': 1 },\n { '-': 3, 'P': 1 },\n { K: 4 },\n { K: 2, M: 1, R: 1 },\n { P: 3, S: 1 },\n { L: 2, M: 1, S: 1 },\n { N: 2, T: 1, Y: 1 },\n { A: 3, P: 1 },\n { F: 3, Y: 1 },\n { F: 2, I: 1, M: 1 },\n { L: 1, R: 1, V: 2 },\n { F: 1, Q: 1, W: 1, Y: 1 },\n { F: 1, M: 1, S: 1, T: 1 },\n { K: 1, M: 1, R: 1, S: 1 },\n { D: 1, E: 2, R: 1 },\n { E: 1, K: 1, M: 1, Q: 1 },\n { E: 1, R: 3 },\n { A: 2, H: 1, R: 1 },\n { K: 3, N: 1 },\n { K: 1, M: 1, V: 1, Y: 1 },\n { A: 2, K: 1, V: 1 },\n { A: 1, H: 1, K: 1, L: 1 },\n { E: 2, L: 1, P: 1 },\n { D: 1, H: 1, N: 1, S: 1 },\n { A: 1, P: 2, T: 1 },\n { E: 1, L: 1, R: 1, S: 1 },\n { K: 1, M: 2, V: 1 },\n { E: 1, N: 1, R: 1, S: 1 },\n { F: 1, N: 2, S: 1 },\n { A: 1, L: 1, S: 2 },\n { A: 1, D: 1, E: 2 },\n { F: 1, I: 2, L: 1 },\n { N: 1, S: 2, T: 1 },\n { K: 3, Q: 1 },\n { I: 2, K: 1, Q: 1 },\n { C: 1, L: 3 },\n { G: 2, S: 2 },\n { E: 1, K: 1, R: 1, Y: 1 },\n { K: 1, Q: 1, R: 2 },\n { W: 3, Y: 1 },\n { H: 1, K: 3 },\n { A: 1, E: 1, M: 1, T: 1 },\n { L: 3, M: 1 },\n { P: 1, S: 2, T: 1 },\n { A: 1, E: 2, R: 1 },\n { A: 1, E: 1, K: 2 },\n { E: 3, K: 1 },\n { K: 3, Q: 1 },\n { A: 1, G: 1, M: 1, W: 1 },\n { K: 3, P: 1 },\n { F: 2, Y: 2 },\n { E: 1, F: 1, I: 1, Y: 1 },\n { D: 1, E: 1, Q: 2 },\n { D: 1, E: 1, L: 1, M: 1 },\n { A: 3, F: 1 },\n { K: 1, Q: 2, R: 1 },\n { A: 1, K: 2, R: 1 },\n { D: 1, E: 2, L: 1 },\n { K: 2, Q: 1, R: 1 },\n { A: 2, Q: 2 },\n { '-': 1, 'L': 1, 'M': 1, 'R': 1 },\n { E: 1, H: 2, Y: 1 },\n { E: 1, F: 1, M: 1, R: 1 },\n { E: 2, Q: 1, R: 1 },\n { E: 1, K: 1, L: 1, R: 1 },\n { M: 1, N: 1, Y: 2 },\n { K: 1, L: 1, P: 2 },\n { A: 1, G: 1, N: 1, T: 1 },\n { R: 1, W: 1, Y: 2 },\n { '-': 1, 'F': 1, 'K': 1, 'S': 1 },\n { A: 1, I: 1, R: 1, Y: 1 },\n { E: 1, P: 1, R: 2 },\n { D: 2, P: 2 },\n { H: 1, K: 1, N: 1, R: 1 },\n { G: 1, P: 1, R: 1, Y: 1 },\n { D: 1, E: 1, G: 1, K: 1 },\n { '-': 1, 'A': 1, 'K': 1, 'L': 1 },\n { '-': 1, 'I': 1, 'K': 2 },\n { '-': 1, 'K': 1, 'M': 1, 'Q': 1 },\n { '-': 1, 'K': 1, 'L': 1, 'N': 1 },\n { '-': 1, 'A': 1, 'P': 1, 'R': 1 },\n { '-': 1, 'K': 3 },\n { '-': 2, 'K': 1, 'R': 1 },\n { '-': 3, 'E': 1 },\n { '-': 3, 'K': 1 },\n ]);\n });\n}\n"],"names":["getResidueCounts","alignedSequences","columns","sequence","columnIndex","residue","column"],"mappings":"AAEO,SAASA,EACdC,GACe;AACf,QAAMC,IAAyB,CAAA;AAC/B,aAAWC,KAAYF;AACrB,eAAW,CAACG,GAAaC,CAAO,KAAKF,EAAS,MAAM,EAAE,EAAE,WAAW;AACjE,YAAMG,IAASJ,EAAAE,OAAAF,EAAAE,KAAyB,CAAA;AACxC,MAAAE,EAAOD,CAAO,KAAKC,EAAOD,CAAO,KAAK,KAAK;AAAA,IAC7C;AAEF,SAAOH;AACT;"}
@@ -1,2 +0,0 @@
1
- import { PlMultiSequenceAlignmentSettings } from '@platforma-sdk/model';
2
- export declare const defaultSettings: PlMultiSequenceAlignmentSettings;