@platforma-sdk/ui-vue 1.45.34 → 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.
- package/.turbo/turbo-build.log +216 -222
- package/.turbo/turbo-type-check.log +1 -1
- package/CHANGELOG.md +16 -0
- package/dist/AgGridVue/useAgGridOptions.js +2 -3
- package/dist/AgGridVue/useAgGridOptions.js.map +1 -1
- package/dist/components/{PlMultiSequenceAlignment/Legend.vue.d.ts → PlAdvancedFilter/OperandButton.vue.d.ts} +4 -2
- package/dist/components/{PlMultiSequenceAlignment/Toolbar.vue.js → PlAdvancedFilter/OperandButton.vue.js} +3 -3
- package/dist/components/PlAdvancedFilter/OperandButton.vue.js.map +1 -0
- package/dist/components/PlAdvancedFilter/OperandButton.vue2.js +25 -0
- package/dist/components/PlAdvancedFilter/OperandButton.vue2.js.map +1 -0
- package/dist/components/PlAdvancedFilter/OperandButton.vue3.js +13 -0
- package/dist/components/PlAdvancedFilter/OperandButton.vue3.js.map +1 -0
- package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue.d.ts +39 -0
- package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue.js +10 -0
- package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue.js.map +1 -0
- package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue2.js +199 -0
- package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue2.js.map +1 -0
- package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue3.js +17 -0
- package/dist/components/PlAdvancedFilter/PlAdvancedFilter.vue3.js.map +1 -0
- package/dist/components/PlAdvancedFilter/SingleFilter.vue.d.ts +37 -0
- package/dist/components/{PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.js → PlAdvancedFilter/SingleFilter.vue.js} +3 -3
- package/dist/components/PlAdvancedFilter/SingleFilter.vue.js.map +1 -0
- package/dist/components/PlAdvancedFilter/SingleFilter.vue2.js +306 -0
- package/dist/components/PlAdvancedFilter/SingleFilter.vue2.js.map +1 -0
- package/dist/components/PlAdvancedFilter/SingleFilter.vue3.js +35 -0
- package/dist/components/PlAdvancedFilter/SingleFilter.vue3.js.map +1 -0
- package/dist/components/PlAdvancedFilter/constants.d.ts +4 -0
- package/dist/components/PlAdvancedFilter/constants.js +41 -0
- package/dist/components/PlAdvancedFilter/constants.js.map +1 -0
- package/dist/components/PlAdvancedFilter/index.d.ts +1 -0
- package/dist/components/PlAdvancedFilter/types.d.ts +57 -0
- package/dist/components/PlAdvancedFilter/types.js +8 -0
- package/dist/components/PlAdvancedFilter/types.js.map +1 -0
- package/dist/components/PlAdvancedFilter/utils.js +150 -0
- package/dist/components/PlAdvancedFilter/utils.js.map +1 -0
- package/dist/components/PlAgDataTable/PlAgRowCount.vue.js +7 -8
- package/dist/components/PlAgDataTable/PlAgRowCount.vue.js.map +1 -1
- package/dist/components/PlAgRowNumCheckbox/PlAgRowNumCheckbox.vue.js +9 -10
- package/dist/components/PlAgRowNumCheckbox/PlAgRowNumCheckbox.vue.js.map +1 -1
- package/dist/components/PlAgRowNumHeader.vue.js +2 -3
- package/dist/components/PlAgRowNumHeader.vue.js.map +1 -1
- package/dist/index.js +32 -32
- package/dist/lib.d.ts +1 -1
- package/package.json +6 -7
- package/src/components/PlAdvancedFilter/OperandButton.vue +53 -0
- package/src/components/PlAdvancedFilter/PlAdvancedFilter.vue +209 -0
- package/src/components/PlAdvancedFilter/SingleFilter.vue +425 -0
- package/src/components/PlAdvancedFilter/constants.ts +42 -0
- package/src/components/PlAdvancedFilter/index.ts +1 -0
- package/src/components/PlAdvancedFilter/types.ts +77 -0
- package/src/components/PlAdvancedFilter/utils.ts +215 -0
- package/src/lib.ts +2 -2
- package/dist/assets/multi-sequence-alignment.worker-Cm0gZp19.js +0 -6
- package/dist/assets/multi-sequence-alignment.worker-Cm0gZp19.js.map +0 -1
- package/dist/assets/phylogenetic-tree.worker-4CrExYEo.js +0 -5
- package/dist/assets/phylogenetic-tree.worker-4CrExYEo.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/Consensus.vue.d.ts +0 -9
- package/dist/components/PlMultiSequenceAlignment/Consensus.vue.js +0 -10
- package/dist/components/PlMultiSequenceAlignment/Consensus.vue.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/Consensus.vue2.js +0 -122
- package/dist/components/PlMultiSequenceAlignment/Consensus.vue2.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/Consensus.vue3.js +0 -9
- package/dist/components/PlMultiSequenceAlignment/Consensus.vue3.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/Legend.vue.js +0 -10
- package/dist/components/PlMultiSequenceAlignment/Legend.vue.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/Legend.vue2.js +0 -28
- package/dist/components/PlMultiSequenceAlignment/Legend.vue2.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/Legend.vue3.js +0 -13
- package/dist/components/PlMultiSequenceAlignment/Legend.vue3.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue.d.ts +0 -25
- package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue.js +0 -10
- package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue2.js +0 -138
- package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue2.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue3.js +0 -31
- package/dist/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue3.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue.d.ts +0 -8
- package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue.js +0 -10
- package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue2.js +0 -77
- package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue2.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue3.js +0 -9
- package/dist/components/PlMultiSequenceAlignment/PhylogeneticTree.vue3.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.d.ts +0 -71
- package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js +0 -224
- package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue2.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue3.js +0 -9
- package/dist/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue3.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue.d.ts +0 -8
- package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue.js +0 -10
- package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue2.js +0 -127
- package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue2.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue3.js +0 -9
- package/dist/components/PlMultiSequenceAlignment/SeqLogo.vue3.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/Toolbar.vue.d.ts +0 -16
- package/dist/components/PlMultiSequenceAlignment/Toolbar.vue.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/Toolbar.vue2.js +0 -228
- package/dist/components/PlMultiSequenceAlignment/Toolbar.vue2.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/Toolbar.vue3.js +0 -19
- package/dist/components/PlMultiSequenceAlignment/Toolbar.vue3.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/cell-size.d.ts +0 -4
- package/dist/components/PlMultiSequenceAlignment/cell-size.js +0 -8
- package/dist/components/PlMultiSequenceAlignment/cell-size.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/chemical-properties.d.ts +0 -44
- package/dist/components/PlMultiSequenceAlignment/chemical-properties.js +0 -132
- package/dist/components/PlMultiSequenceAlignment/chemical-properties.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/data.d.ts +0 -61
- package/dist/components/PlMultiSequenceAlignment/data.js +0 -370
- package/dist/components/PlMultiSequenceAlignment/data.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/index.d.ts +0 -1
- package/dist/components/PlMultiSequenceAlignment/markup.d.ts +0 -16
- package/dist/components/PlMultiSequenceAlignment/markup.js +0 -84
- package/dist/components/PlMultiSequenceAlignment/markup.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/migrations.d.ts +0 -3
- package/dist/components/PlMultiSequenceAlignment/migrations.js +0 -24
- package/dist/components/PlMultiSequenceAlignment/migrations.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/multi-sequence-alignment.worker.d.ts +0 -6
- package/dist/components/PlMultiSequenceAlignment/phylogenetic-tree.worker.d.ts +0 -7
- package/dist/components/PlMultiSequenceAlignment/residue-counts.d.ts +0 -2
- package/dist/components/PlMultiSequenceAlignment/residue-counts.js +0 -13
- package/dist/components/PlMultiSequenceAlignment/residue-counts.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/settings.d.ts +0 -2
- package/dist/components/PlMultiSequenceAlignment/settings.js +0 -9
- package/dist/components/PlMultiSequenceAlignment/settings.js.map +0 -1
- package/dist/components/PlMultiSequenceAlignment/types.d.ts +0 -5
- package/dist/components/PlMultiSequenceAlignment/useMiPlots.d.ts +0 -4
- package/dist/components/PlMultiSequenceAlignment/useMiPlots.js +0 -19
- package/dist/components/PlMultiSequenceAlignment/useMiPlots.js.map +0 -1
- package/src/components/PlMultiSequenceAlignment/Consensus.vue +0 -165
- package/src/components/PlMultiSequenceAlignment/Legend.vue +0 -44
- package/src/components/PlMultiSequenceAlignment/MultiSequenceAlignmentView.vue +0 -299
- package/src/components/PlMultiSequenceAlignment/PhylogeneticTree.vue +0 -110
- package/src/components/PlMultiSequenceAlignment/PlMultiSequenceAlignment.vue +0 -314
- package/src/components/PlMultiSequenceAlignment/README.md +0 -216
- package/src/components/PlMultiSequenceAlignment/SeqLogo.vue +0 -166
- package/src/components/PlMultiSequenceAlignment/Toolbar.vue +0 -228
- package/src/components/PlMultiSequenceAlignment/cell-size.ts +0 -4
- package/src/components/PlMultiSequenceAlignment/chemical-properties.ts +0 -199
- package/src/components/PlMultiSequenceAlignment/data.ts +0 -661
- package/src/components/PlMultiSequenceAlignment/index.ts +0 -1
- package/src/components/PlMultiSequenceAlignment/markup.ts +0 -141
- package/src/components/PlMultiSequenceAlignment/migrations.ts +0 -46
- package/src/components/PlMultiSequenceAlignment/multi-sequence-alignment.worker.ts +0 -54
- package/src/components/PlMultiSequenceAlignment/phylogenetic-tree.worker.ts +0 -89
- package/src/components/PlMultiSequenceAlignment/residue-counts.ts +0 -124
- package/src/components/PlMultiSequenceAlignment/settings.ts +0 -7
- package/src/components/PlMultiSequenceAlignment/types.ts +0 -3
- 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,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,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;"}
|