Source code for trackc.pl.links

from typing import Optional, Sequence, Union

import numpy as np
import pandas as pd
from matplotlib.axes import Axes

from trackc.pl.bigwig import _make_multi_region_ax
from trackc.tl._getRegionsCmat import GenomeRegion


def _two_degree_bc(x_l=10, x_r=90, y_lr=0, y2=10, dots_num=100):
    """
    bezier curve for loop links
    """

    xt = []
    yt = []
    x_mid = (x_l + x_r) / 2
    x_dots12 = np.linspace(x_l, x_mid, dots_num)
    y_dots12 = np.linspace(y_lr, y2, dots_num)
    x_dots23 = np.linspace(x_mid, x_r, dots_num)
    y_dots23 = np.linspace(y2, y_lr, dots_num)
    for i in range(dots_num):
        x = x_dots12[i] + (x_dots23[i] - x_dots12[i]) * i / (dots_num - 1)
        y = y_dots12[i] + (y_dots23[i] - y_dots12[i]) * i / (dots_num - 1)
        xt.append(x)
        yt.append(y)
    return (xt, yt)


def _plot_loop_arc(
    ax, loop_df, color, max_extend, invert_y, start, end, left_anchor, right_anchor
):
    if loop_df.shape[0] == 0:
        return

    top_y = 0

    for i, row in loop_df.iterrows():
        top = row["length"] / max_extend
        if top < 0.5:
            top = 0.5
        elif top > 0.8:
            top = 0.8
        else:
            pass

        xt, yt = _two_degree_bc(
            x_l=row[left_anchor], x_r=row[right_anchor], y_lr=0, y2=top, dots_num=100
        )

        ax.plot(xt, yt, color=color, linewidth=0.5, solid_capstyle="butt")
        if max(yt) > top_y:
            top_y = max(yt)

    ax.set_xlim(start, end)
    if invert_y == True:
        ax.set_ylim(0.5, 0)
    else:
        ax.set_ylim(0, 0.5)