taxonium-component
Version:
React component for exploring large phylogenetic trees in the browser
103 lines (102 loc) • 5.3 kB
JavaScript
import { s as I, u as T, l as L } from "./JBrowsePanel-ClL6pWQW.js";
import { s as V, f as U, g as $, a as B, b as F } from "./color-C448iW1a.js";
function R(t, a, n, o, r, c) {
n < 0 && (t += n, n = -n), o < 0 && (a += o, o = -o), c && (r.fillStyle = c), r.fillRect(t, a, n, o);
}
function y(t, a, n, o, r, c) {
n < 0 && (t += n, n = -n), o < 0 && (a += o, o = -o), c && (r.strokeStyle = c), r.strokeRect(t, a, n, o);
}
function j({ ctx: t, self: a, chainData: n, view: o, asm: r }) {
var c, m, N, b, _;
const C = [], { chains: A } = n, { height: v } = a, u = I.getConf(a, "featureHeight");
for (const h of A) {
let f = Number.MAX_VALUE, e = Number.MIN_VALUE;
for (const s of h) {
const i = r.getCanonicalRefName(s.refName) || s.refName, d = (c = o.bpToPx({ refName: i, coord: s.start })) === null || c === void 0 ? void 0 : c.offsetPx, l = (m = o.bpToPx({ refName: i, coord: s.end })) === null || m === void 0 ? void 0 : m.offsetPx;
d !== void 0 && l !== void 0 && (f = Math.min(f, d), e = Math.max(e, l));
}
C.push({
distance: Math.abs(e - f),
minX: f,
chain: h
});
}
const k = C.map((h) => h.distance), E = Math.log(T.max(k)), H = Math.max(Math.log(T.min(k)) - 1, 0), O = (v - 20) / (E - H), z = u / 2 - 0.5;
for (const { minX: h, distance: f, chain: e } of C) {
const s = f, i = (Math.log(s) - H) * O;
R(h - o.offsetPx, i + z, s, 1, t, "black");
const d = e[0];
let l;
d.flags & 2048 ? l = ((N = d.SA) === null || N === void 0 ? void 0 : N.split(";")[0].split(",")[2]) === "-" ? -1 : 1 : l = d.strand;
for (const P of e) {
const M = r.getCanonicalRefName(P.refName) || P.refName, g = (b = o.bpToPx({ refName: M, coord: P.start })) === null || b === void 0 ? void 0 : b.offsetPx, p = (_ = o.bpToPx({ refName: M, coord: P.end })) === null || _ === void 0 ? void 0 : _.offsetPx;
if (g !== void 0 && p !== void 0) {
const S = Math.max(p - g, 2), x = g - o.offsetPx, D = P.strand * l === -1 ? "color_rev_strand" : "color_fwd_strand";
y(x, i, S, u, t, V[D]), R(x, i, S, u, t, U[D]);
}
}
}
}
function q({ ctx: t, self: a, chainData: n, view: o, asm: r }) {
var c, m, N, b, _, C, A;
const v = [], u = I.getConf(a, "featureHeight"), k = ((c = a.colorBy) === null || c === void 0 ? void 0 : c.type) || "insertSizeAndOrientation", { chains: E, stats: H } = n;
for (const f of E)
if (f.length > 1) {
const e = f[0], s = f[1], i = r.getCanonicalRefName(e.refName) || e.refName, d = r.getCanonicalRefName(s.refName) || s.refName, l = (m = o.bpToPx({ refName: i, coord: e.start })) === null || m === void 0 ? void 0 : m.offsetPx, P = (N = o.bpToPx({ refName: i, coord: e.end })) === null || N === void 0 ? void 0 : N.offsetPx, M = (b = o.bpToPx({ refName: d, coord: s.start })) === null || b === void 0 ? void 0 : b.offsetPx, g = (_ = o.bpToPx({ refName: d, coord: s.end })) === null || _ === void 0 ? void 0 : _.offsetPx;
let p = 0;
if (l !== void 0 && P !== void 0 && M !== void 0 && g !== void 0) {
if (e.refName === s.refName) {
const S = Math.min(e.start, s.start), x = Math.max(e.end, s.end);
p = Math.abs(x - S);
}
v.push({
r1s: l,
r1e: P,
r2s: M,
r2e: g,
v0: e,
v1: s,
distance: p
});
}
} else if (a.drawSingletons) {
const e = f[0], s = r.getCanonicalRefName(e.refName) || e.refName, i = (C = o.bpToPx({ refName: s, coord: e.start })) === null || C === void 0 ? void 0 : C.offsetPx, d = (A = o.bpToPx({ refName: s, coord: e.end })) === null || A === void 0 ? void 0 : A.offsetPx;
if (i !== void 0 && d !== void 0) {
const l = Math.max(d - i, 2);
R(i - o.offsetPx, 0, l, u, t, "#f00"), y(i - o.offsetPx, 0, l, u, t, "#a00");
}
}
const O = Math.log(T.max(v.map((f) => f.distance))), z = Math.max(Math.log(T.min(v.map((f) => f.distance))) - 1, 0), h = (a.height - 20) / (O - z);
for (const { r1e: f, r1s: e, r2e: s, r2s: i, distance: d, v0: l, v1: P } of v) {
const M = Math.max(f - e, 2), g = Math.max(s - i, 2), [p, S] = G({ type: k, v0: l, v1: P, stats: H }) || [], x = (Math.log(d) - z) * h, X = u / 2 - 0.5, D = i - f;
R(f - o.offsetPx, x + X, D, 1, t, "black"), y(e - o.offsetPx, x, M, u, t, S), y(i - o.offsetPx, x, g, u, t, S), R(e - o.offsetPx, x, M, u, t, p), R(i - o.offsetPx, x, g, u, t, p);
}
}
function G({ type: t, v0: a, v1: n, stats: o }) {
if (t === "insertSizeAndOrientation")
return $(a, n, o);
if (t === "orientation")
return B(a);
if (t === "insertSize")
return F(a, n, o);
if (t === "gradient") {
const r = Math.min(a.start, n.start), c = Math.max(a.end, n.end);
return [
`hsl(${Math.log10(Math.abs(c - r)) * 10},50%,50%)`,
`hsl(${Math.log10(Math.abs(c - r)) * 10},50%,30%)`
];
}
}
function Q(t, a) {
const { chainData: n } = t;
if (!n)
return;
const { assemblyManager: o } = T.getSession(t), r = T.getContainingView(t), c = r.assemblyNames[0], m = o.get(c);
if (!m)
return;
L(n) ? q({ self: t, view: r, asm: m, ctx: a, chainData: n }) : j({ self: t, view: r, asm: m, ctx: a, chainData: n });
}
export {
Q as drawFeats
};
//# sourceMappingURL=drawFeats-C37GGM2v.js.map