diff --git a/README.md b/README.md index c571463..15c11dc 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,23 @@ # Bimodularity Framework -Code to replicate analyses and figures of A. Cionca, C.H.M. Chan, & D. Van De Ville, Community detection for directed networks revisited using bimodularity, Proc. Natl. Acad. Sci. U.S.A. 122 (35) e2500571122, [https://doi.org/10.1073/pnas.2500571122](https://doi.org/10.1073/pnas.2500571122) (2025). +Main code for the analysis of directed graph communities, or *bicommunities*. + +If you use parts of this code and framework, please cite the following article: + +> A. Cionca, C.H.M. Chan, & D. Van De Ville, Community detection for directed networks revisited using bimodularity, Proc. Natl. Acad. Sci. U.S.A. 122 (35) e2500571122, [https://doi.org/10.1073/pnas.2500571122](https://doi.org/10.1073/pnas.2500571122) (2025). ## Requirements ### Data +#### *C. elegans* + *C. elegans* data can be accessed on [WormAtlas.org](https://www.wormatlas.org/neuronalwiring.html#NeuronalconnectivityII) under "Neuronal Connectivity II: by L.R. Varshney, B.L. Chen, E. Paniagua, D.H. Hall and D.B. Chklovskii" (see [Varshney et al., 2011](https://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1001066) for more information). +All data used are summarized in `./data/celegans`. + +#### Human + +All data used in the analysis of bicommunities of the directed human connectome are present in `./data/brain` (see the [brain data directory](./data/brain) for further details). ### Python 3.11.8 @@ -20,6 +31,16 @@ Note that compatiblity is ensured for **python 3.11.8** - you may have to play w ## Usage +All the code is compiled within the main `bimodularity` module which include: +- `dgsp` for processing and analyses, +- `data_load` for handling the datasets, +- `bimod_plot` for visualization, +- `bundle` for utilities specific to the analysis of white matter fiber bundles. + +### Replication of [Cionca, et al., 2025](https://doi.org/10.1073/pnas.2500571122) + +In `./notebooks/01-bimodularity`, you may find the main figure (`Bimodularity-Figures.ipynb`) and supplementary (`Bimodularity-Supplementary.ipynb`) notebooks to reproduce the analyses and figures of the article. + The `Bimodularity-Figures.ipynb` notebook: - generates the canonical graphs, - loads the *C. elegans* data, @@ -29,4 +50,19 @@ The `Bimodularity-Figures.ipynb` notebook: The `Bimodularity-Supplementary.ipynb` notebook: - creates all the supplementary figures in the article. -Both notebooks are self-sufficient and should run when using the `run all` command. \ No newline at end of file +### Bicommunities of the Directed Connectome + +In `./notebooks/02-brain_bicommunities`, you may find the main figure (`brainbicom-Figures.ipynb`) and supplementary (`brainbicom-Supplementary.ipynb`) notebooks to produce the analyses and figures of bicommunities of the human brain. + +The `brainbicom-ConsensusClustering.ipynb` notebook: +- Computes the consensus matrix for specific settings of the bicommunity detection and for various definition of directed connectomes (later saved in `./data/brain/derivatives/consensus_clustering`). Note that you **NEED** to first run this notebook to generate the consensus data (if not already present) before running the figures notebooks. + +The `brainbicom-Figures.ipynb` notebook: +- loads consensus data, +- computes the analyses of bicommunity structure, +- and creates all the visualizations. + +The `brainbicom-Supplementary.ipynb` notebook: +- creates additional figures. + +All notebooks are self-sufficient and should run when using the `run all` command. \ No newline at end of file diff --git a/bimod_plots.py b/bimod_plots.py deleted file mode 100644 index b7ea088..0000000 --- a/bimod_plots.py +++ /dev/null @@ -1,1041 +0,0 @@ -# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*- -# vi: set ft=python sts=4 ts=4 sw=4 et: - -import pandas as pd - -from matplotlib.figure import Figure -from matplotlib.gridspec import GridSpecFromSubplotSpec - -from matplotlib.lines import Line2D -import numpy as np -from scipy.linalg import block_diag -import networkx as nx - -from typing import Optional - -from matplotlib.axes import Axes -import matplotlib.pyplot as plt -from matplotlib.patches import FancyArrowPatch -from matplotlib.colors import to_rgb, to_rgba, ListedColormap -from matplotlib.patheffects import withStroke - -import dgsp - -PALETTE = ["#FFADAD", "#A0C4FF", "#CAFFBF", "#FFC6FF"] - - -def plot_palette(): - palette_rgb = [to_rgb(color) for color in PALETTE] - - plt.scatter([0, 1, 2, 3], [0] * 4, c=palette_rgb, s=400, edgecolors="k", lw=2) - - -def get_custom_cmap() -> ListedColormap: - - palette_rgb = [to_rgb(color) for color in PALETTE] - - custom_cmap = ListedColormap([(0, 0, 0), (1, 1, 1)] + palette_rgb) - - return custom_cmap - - -def add_cbar(fig: Figure, ax: Axes, **kwargs) -> Axes: - """Add a colorbar to an existing figure/axis. - - Parameters - ---------- - fig : matplotlib.figure.Figure - figure to get the colorbar from - ax : matplotlib.axes.Axes - axes to add the colorbar to - - Returns - ------- - tuple(matplotlib.figure.Figure, matplotlib.axes.Axes) - tuple of figure and axes with the colorbar added - """ - from mpl_toolkits.axes_grid1 import make_axes_locatable - - divider = make_axes_locatable(ax) - cax = divider.append_axes("right", size="5%", pad=0.05) - fig.colorbar(ax.get_children()[0], cax=cax, orientation="vertical", **kwargs) - return fig, ax - - -def draw_self_loop( - axes: Axes, - posx: float, - posy: float, - size: float, - rad: float = 0.4, - offset: float = 0.01, - mutation_scale: int = 20, - onearrow: bool = True, -) -> Axes: - - all_arrows_pos = [ - (posx, posy, posx + size, posy, rad), - (posx + size - offset, posy - offset, posx + size - offset, posy + size, rad), - (posx + size, posy + size - offset, posx, posy + size - offset, rad), - (posx + offset, posy + size, posx + offset, posy - offset, rad), - ] - - for pos_i, arr_pos in enumerate(all_arrows_pos): - px, py, sx, sy, rad = arr_pos - - style = "-" - if onearrow: - if pos_i == len(all_arrows_pos) - 1: - style = "-|>" - elif pos_i % 2: - style = "-|>" - - arrow = FancyArrowPatch( - (px, py), - (sx, sy), - arrowstyle=style, - mutation_scale=mutation_scale, - linewidth=2, - color="k", - connectionstyle=f"arc3,rad={rad}", - ) - - axes.add_patch(arrow) - - return axes - - -def draw_smaller_self_loop( - axes: Axes, - posx: float, - posy: float, - size: float, - rad: float = 0.4, - offset: float = 0.01, - mutation_scale: int = 20, - onearrow: bool = True, -) -> Axes: - - all_arrows_pos = [ - (posx, posy, posx, posy - size, rad), - (posx - offset, posy - size + offset, posx + size, posy - size, rad), - (posx + size - offset, posy - size - offset, posx + size, posy, rad), - ] - - all_arrows_pos = [ - (posx, posy, posx, posy - size, rad), - ( - posx - offset, - posy - size + offset, - posx + size + offset, - posy - size + offset, - rad, - ), - (posx + size, posy - size, posx + size, posy, rad), - ] - - for pos_i, arr_pos in enumerate(all_arrows_pos): - px, py, sx, sy, rad = arr_pos - - style = "-" - if onearrow: - if pos_i == len(all_arrows_pos) - 1: - style = "-|>" - elif pos_i % 2: - style = "-|>" - - arrow = FancyArrowPatch( - (px, py), - (sx, sy), - arrowstyle=style, - mutation_scale=mutation_scale, - linewidth=2, - color="k", - connectionstyle=f"arc3,rad={rad}", - ) - - axes.add_patch(arrow) - - return axes - - -def plot_community_scheme( - ax: Optional[Axes] = None, - use_cmap: bool = True, - title_letter: str = "", - fontscale: float = 1.2, - com_names: Optional[np.ndarray] = None, - com_names_yoffset: float = 0, - x_names: [str, str] = ["Sending 1", "Sending 2"], - y_names: [str, str] = ["Receiving 1", "Receiving 2"], - arrow_colors: Optional[np.ndarray] = None, - plot_cycle: bool = False, - override_title: Optional[str] = None, -) -> Optional[Axes]: - # First plot (A) - xy_pos = np.array([[-0.5, -0.5], [0.5, -0.5], [-0.5, 0.5], [0.5, 0.5]]) - pos = {i: xy_pos[i] for i in range(4)} - - if ax is None: - _, ax = plt.subplots(figsize=(8, 8)) - - colors = "none" - if use_cmap: - palette_indices = [3, 2, 1, 0] - colors = [to_rgba(PALETTE[color_i], alpha=0.5) for color_i in palette_indices] - # colors = [to_rgba(color, alpha=0.5) for color in PALETTE] - - ax.scatter( - xy_pos[:, 0], - xy_pos[:, 1], - marker="s", - s=1.5e4, - color=colors, - edgecolor="black", - linewidth=2, - zorder=1, - ) - - # Definition of arrows - mid_point = 0.5 - - starting_points = [ - (-0.2, -mid_point), - (mid_point, -0.2), - (0.2, mid_point), - (-mid_point, 0.2), - (0.3, -0.2), - (-0.3, 0.2), - ] - ending_points = [ - (0.2, -mid_point), - (mid_point, 0.2), - (-0.2, mid_point), - (-mid_point, -0.2), - (-0.2, 0.3), - (0.2, -0.3), - ] - - if plot_cycle: - starting_points = starting_points[:-2] - ending_points = ending_points[:-2] - - if arrow_colors is None: - arrow_colors = ["black"] * len(starting_points) - - for start, end, col in zip(starting_points, ending_points, arrow_colors): - arrow = FancyArrowPatch( - start, - end, - arrowstyle="-|>", - mutation_scale=30, - linewidth=2, - facecolor=col, - edgecolor=col, - ) - ax.add_patch(arrow) - - # Drawing the rectangles (communities) - if com_names is None: - com_names = ["$S_4$", "$S_3$", "$S_2$", "$S_1$"] - - for pos, com_name in zip(xy_pos, com_names): - ax.text( - pos[0], - pos[1] + com_names_yoffset, - com_name, - fontsize=24 * fontscale, - fontweight="bold", - ha="center", - va="center", - ) - - # Ticks parameters - ax.set_title( - title_letter, - loc="left", - fontsize=22 * fontscale, - fontdict={"fontweight": "bold"}, - ) - - if override_title is None: - override_title = "Community structure scheme" - ax.set_title(override_title, fontsize=20 * fontscale) - - ax.set_xticks( - np.linspace(-0.5, 0.5, 2), - labels=x_names, - fontsize=18 * fontscale, - ) - ax.set_yticks( - np.linspace(-0.5, 0.5, 2), - labels=y_names, - fontsize=18 * fontscale, - rotation=90, - va="center", - ) - ax.tick_params(left=False, bottom=False, labelleft=True, labelbottom=True) - ax.spines[:].set_visible(False) - ax.set_xlabel("Sending communities", fontsize=18 * fontscale) - ax.set_ylabel("Receiving communities", fontsize=18 * fontscale) - ax.set_xlim(-0.9, 0.9) - ax.set_ylim(-0.9, 0.9) - - return ax - - -def plot_adjacency( - matrix: np.ndarray, - ax: Optional[Axes] = None, - use_cmap: bool = True, - fontscale: float = 1.2, - title_letter: str = "", - override_title: Optional[str] = None, -) -> Optional[Axes]: - - if ax is None: - _, ax = plt.subplots(figsize=(8, 8)) - - plot_adj = matrix.copy() - - n_per_com = matrix.shape[0] // 4 - - cmap = "binary_r" - if use_cmap: - cmap = get_custom_cmap() - for i in range(4): - plot_adj[ - i * n_per_com : (i + 1) * n_per_com, i * n_per_com : (i + 1) * n_per_com - ] = matrix[ - i * n_per_com : (i + 1) * n_per_com, i * n_per_com : (i + 1) * n_per_com - ] * ( - i + 2 - ) - - ax.imshow(plot_adj, cmap=cmap, interpolation="none") - # ax.pcolormesh(np.zeros_like(plot_adj), cmap=cmap, vmin=0, vmax=1, edgecolors="face") - # ax.pcolormesh(plot_adj, cmap=cmap, edgecolors="face", linewidth=0) - # ax.set_ylim(len(plot_adj), 0) - # axes[1].imshow(graph, cmap="binary_r") - - # Parameters B - ax.set_title( - title_letter, - loc="left", - fontsize=22 * fontscale, - fontdict={"fontweight": "bold"}, - ) - if override_title is None: - override_title = "Graph adjacency matrix" - ax.set_title(override_title, fontsize=20 * fontscale) - - ax.set_xticks( - np.arange(n_per_com // 2, matrix.shape[0] + 1, n_per_com), - labels=["$S_1$", "$S_2$", "$S_3$", "$S_4$"], - fontsize=18 * fontscale, - ) - ax.set_yticks( - np.arange(n_per_com // 2, matrix.shape[0] + 1, n_per_com), - labels=["$S_1$", "$S_2$", "$S_3$", "$S_4$"], - fontsize=18 * fontscale, - ) - return ax - - -def plot_spectrum( - matrix: np.ndarray, - vector_id: int = 0, - show_n_eig: int = 10, - write_s: bool = False, - fig: Optional[Figure] = None, - ax: Optional[Axes] = None, - split_ax: bool = False, - fix_negative: bool = True, - fontscale: float = 1.2, - title_letter: str = "", - override_title: Optional[str] = None, - normalize_s: bool = False, - **kwargs, -) -> Axes: - - # Building the modularity matrix - modmat = dgsp.modularity_matrix(matrix, null_model="outin") - - U, S, Vh = dgsp.sorted_SVD(modmat, fix_negative=fix_negative) - V = Vh.T - - r_squared = S[vector_id] ** 2 / (S**2).sum() - print(f"s (norm) = {S[vector_id] / (2 * matrix.sum())}") - print(f"R^2 = {r_squared}") - - n_nodes = matrix.shape[0] - - # Starting the plot - if fig is None and ax is None: - fig, ax = plt.subplots(figsize=(10, 10)) - - if split_ax: - gs1 = GridSpecFromSubplotSpec( - 1, 2, subplot_spec=ax.get_subplotspec(), wspace=0.04 - ) - axes = [fig.add_subplot(gs1[0]), fig.add_subplot(gs1[1])] - else: - axes = [ax] * 2 - - node_colors = "k" - if not fix_negative: - node_colors = [] - for i in range(show_n_eig): - # angle = V[:, i] @ U[:, i].T - angle = U[:, i] @ V[:, i] - # node_colors.append(angle) - col_id = 1 - (np.sign(angle) + 1) // 2 - node_colors.append(PALETTE[col_id.astype(int)]) - - # Figure A (eigenvalues) - - # Clear the 1st subplot (in the background) - - if split_ax: - ax.set_xticks([0], labels=[0], fontsize=16 * fontscale, fontdict={"color": "w"}) - ax.tick_params( - left=False, - bottom=False, - labelleft=False, - labelbottom=True, - labelsize=16 * fontscale, - color="w", - ) - - if split_ax: - for _, s in ax.spines.items(): - s.set_visible(False) - - if normalize_s: - S = S / (2 * matrix.sum()) - - # axes[0].plot(S, marker="o", lw=4, ms=10, color="k") - axes[0].plot(S, marker="o", lw=4, ms=20, markeredgewidth=1, color="k") - - if split_ax: - axes[1].plot(S, marker="o", lw=4, ms=10, color="k") - - if not fix_negative: - axes[0].scatter( - np.arange(show_n_eig), - S[:show_n_eig], - color=node_colors, - # color=np.sign(node_colors), - # cmap="coolwarm", - edgecolors="k", - lw=2, - s=220, - zorder=2, - ) - - x_id = np.arange(n_nodes)[vector_id] - if (vector_id >= 0) and (vector_id < show_n_eig): - if write_s: - axes[0].plot( - x_id, - S[vector_id], - marker="s", - lw=4, - ms=22, - # color=PALETTE[0], - color=node_colors[vector_id], - markeredgecolor="k", - markeredgewidth=4, - ) - angle = (V.T @ U)[vector_id, vector_id] - axes[0].text( - x_id + 1, - S[vector_id], - # f"$\\mu_{{{x_id+1}}}={S[vector_id]:2.2f}, R^2={r_squared:1.2f}$", - # f"$\\mu_{{{x_id+1}}}={S[vector_id]:2.2f},\,\\mathbf{{v}}_{{{vector_id+1}}}^{{T}}\\mathbf{{u}}_{{{vector_id+1}}}={angle:1.2f}$", - f"$\\mu_{{{x_id+1}}}={S[vector_id]:2.2f}$\n$\\mathbf{{v}}_{{{vector_id+1}}}^{{T}}\\mathbf{{u}}_{{{vector_id+1}}}={angle:1.2f}$", - # f"$s_{{{x_id}}}={S[vector_id]:2.2f}, R^2={r_squared:1.2f}$", - fontsize=18 * fontscale, - ha="left", - va="center", - path_effects=[ - withStroke( - linewidth=3 * fontscale, - foreground="w", - alpha=0.8, - ) - ], - ) - else: - axes[1].plot( - x_id, - S[vector_id], - marker="s", - lw=4, - ms=14, - # color=PALETTE[0], - color=node_colors[vector_id], - markeredgecolor="k", - markeredgewidth=2, - ) - - # Plotting the horizontal line at y=0 - ax.set_ylim(axes[0].get_ylim()) - ax.plot([-10, 10], [0] * 2, color="k", ls="--", alpha=0.8, zorder=5) - - if split_ax: - axes[0].plot([-2, show_n_eig], [0] * 2, color="k", ls="--", alpha=0.8) - axes[1].plot( - [len(S) - show_n_eig, len(S) + 2], [0] * 2, color="k", ls="--", alpha=0.8 - ) - else: - # ax.set_ylim(S[:show_n_eig].min() - 1, S[:show_n_eig].max() + 1) - ax.set_ylim(0.9 * S[:show_n_eig].min(), 1.1 * S[:show_n_eig].max()) - - # From matplotlib examples - d = 0.5 # proportion of vertical to horizontal extent of the slanted line - kwargs = dict( - marker=[(-1, -d), (1, d)], - markersize=12, - color="k", - mec="k", - mew=1, - clip_on=False, - ) - - if split_ax: - axes[0].plot([1], [0], transform=axes[0].transAxes, **kwargs) - axes[1].plot([0], [0], transform=axes[1].transAxes, **kwargs) - - # Parameters - if override_title is None: - override_title = "Eigenspectrum" - ax.set_title(override_title, fontsize=20 * fontscale) - axes[0].set_title( - title_letter, - loc="left", - fontsize=22 * fontscale, - fontdict={"fontweight": "bold"}, - ) - - axes[0].set_xlim(-2, show_n_eig - 0.5) - - n_ticks = show_n_eig // 3 - axes[0].set_xticks( - np.arange(0, show_n_eig, n_ticks), labels=np.arange(0, show_n_eig, n_ticks) + 1 - ) - - if split_ax: - axes[1].set_xlim(len(S) - show_n_eig + 0.5, len(S) + 2) - axes[1].set_xticks( - np.arange(len(S) - show_n_eig + n_ticks, len(S) + 2, n_ticks) - ) - - axes[0].spines.right.set_visible(False) - - if split_ax: - axes[1].spines.left.set_visible(False) - - ax.set_xlabel("Indices $n$", fontsize=18 * fontscale) - axes[0].set_ylabel("Singular Values $\\mu_n$", fontsize=18 * fontscale) - # axes[0].set_ylabel("Singular values $s_i$", fontsize=18 * fontscale) - - for ax in axes[:2]: - ax.spines[["top", "right"]].set_visible(False) - ax.spines[:].set_linewidth(2) - - # ax.set_xticks(np.linspace(-.1, .1, 3), labels=np.linspace(-.1, .1, 3), fontsize=18*fontscale) - # ax.set_yticks(np.linspace(-.1, .1, 3), labels=np.linspace(-.1, .1, 3), fontsize=18*fontscale) - - axes[0].tick_params( - left=True, - bottom=True, - labelleft=True, - labelbottom=True, - labelsize=16 * fontscale, - width=2, - ) - - if split_ax: - axes[1].tick_params( - left=False, - bottom=True, - labelleft=False, - labelbottom=True, - labelsize=16 * fontscale, - ) - - return ax - - -def plot_graph_embedding( - matrix: np.ndarray, - vector_id: int = 0, - n_com: int = 4, - ax: Optional[Axes] = None, - use_cmap: bool = True, - cmap: str = "plasma", - static_color: str = "tab:blue", - write_label: bool = False, - write_var: bool = False, - label_lw: int = 3, - directed_edges: bool = True, - edge_alpha: float = 0.02, - fontscale: float = 1.2, - title_letter: str = "", - override_title: Optional[str] = None, - node_clusers: Optional[np.ndarray] = None, - **kwargs, -) -> Axes: - - # Building the modularity matrix - modmat = dgsp.modularity_matrix(matrix, null_model="outin") - - U, S, Vh = dgsp.sorted_SVD(modmat, **kwargs) - V = Vh.T - - n_nodes = matrix.shape[0] - n_per_com = n_nodes // n_com - - graph_pos = {i: (U[i, vector_id], V[i, vector_id]) for i in range(n_nodes)} - labels = {i: "" for i in range(n_nodes)} - - if ax is None: - _, ax = plt.subplots(figsize=(8, 8)) - - if directed_edges: - graph = nx.DiGraph(matrix) - else: - graph = nx.Graph(matrix) - - nx.draw_networkx_edges(graph, pos=graph_pos, alpha=edge_alpha, ax=ax) - - if use_cmap: - if node_clusers is None: - palette_rgb = [to_rgb(color) for color in PALETTE] - colors = [palette_rgb[i // n_per_com] for i in np.arange(n_nodes)] - else: - try: - cmap = plt.get_cmap(cmap, int(node_clusers.max() + 1)) - colors = [cmap(int(i)) for i in node_clusers] - except ValueError: - colors = [cmap] * n_nodes - else: - colors = static_color - - ax.scatter( - U[:, vector_id], - V[:, vector_id], - s=200, - color=colors, - edgecolor="k", - linewidth=2, - zorder=2, - ) - - if write_var: - expl_var = S[vector_id] ** 2 / np.sum(S**2) - ax.text( - 0.05, - 0.90, - f"$R^2={expl_var:1.3f}$", - transform=ax.transAxes, - fontsize=16 * fontscale, - path_effects=[ - withStroke( - linewidth=label_lw, - foreground="w", - alpha=0.8, - ) - ], - ) - - angle = (V.T @ U)[vector_id, vector_id] - ax.text( - 0.05, - 0.85, - f"$\\mathbf{{v}}^T\\mathbf{{u}}={angle:1.2f}$", - transform=ax.transAxes, - fontsize=16 * fontscale, - path_effects=[ - withStroke( - linewidth=label_lw, - foreground="w", - alpha=0.8, - ) - ], - ) - - if write_label: - for com_i in range(n_com): - mean_u = np.mean(U[com_i * n_per_com : (com_i + 1) * n_per_com, vector_id]) - mean_v = np.mean(V[com_i * n_per_com : (com_i + 1) * n_per_com, vector_id]) - ax.text( - mean_u, - mean_v, - f"$S_{com_i+1}$", - fontsize=26 * fontscale, - color="k", - # color="w", - # color=PALETTE[com_i], - fontweight="bold", - path_effects=[ - withStroke( - linewidth=label_lw, - foreground="w", - alpha=0.8, - # foreground="k", - # foreground=PALETTE[com_i], - ) - ], - ha="center", - va="center", - zorder=4, - ) - # ax.scatter( - # mean_u, mean_v, s=1000, marker="o", color="w", alpha=0.8, zorder=3 - # ) - - # Parameters - ax.set_title( - title_letter, - loc="left", - fontsize=22 * fontscale, - fontdict={"fontweight": "bold"}, - ) - if override_title is None: - override_title = f"Bimodularity Embedding $(n={{{vector_id+1}}})$" - ax.set_title(override_title, fontsize=20 * fontscale) - ax.tick_params( - left=True, - bottom=True, - labelleft=True, - labelbottom=True, - labelsize=16 * fontscale, - width=2, - ) - ax.spines[["top", "right"]].set_visible(False) - ax.spines[:].set_linewidth(2) - - ax.set_xticks( - np.linspace(-0.1, 0.1, 3), - labels=np.linspace(-0.1, 0.1, 3), - fontsize=18 * fontscale, - ) - ax.set_yticks( - np.linspace(-0.1, 0.1, 3), - labels=np.linspace(-0.1, 0.1, 3), - fontsize=18 * fontscale, - ) - - ax.set_xlabel( - f"Left Singular Vector $\\mathbf{{u}}_{{{vector_id+1}}}$", - fontsize=18 * fontscale, - ) - ax.set_ylabel( - f"Right Singular Vector $\\mathbf{{v}}_{{{vector_id+1}}}$", - fontsize=18 * fontscale, - ) - - return ax - - -def plot_bicommunity( - adjacency, - send_com, - receive_com, - fig=None, - axes=None, - graph_pos=None, - lw=1, - edge_alpha=0.05, - draw_arrows=False, - cmap=None, - s=80, - s_scale=5 / 8, -): - if fig is None: - fig, axes = plt.subplots(figsize=(10, 10)) - - if graph_pos is None: - graph_pos = nx.spring_layout(nx.DiGraph(adjacency)) - - node_pos = np.array(list(graph_pos.values())).T - - if draw_arrows: - nx.draw_networkx_edges( - nx.DiGraph(adjacency), pos=graph_pos, alpha=edge_alpha, ax=axes - ) - else: - nx.draw_networkx_edges( - nx.Graph(adjacency), pos=graph_pos, alpha=edge_alpha, ax=axes - ) - - is_in_none = np.logical_and(send_com == 0, receive_com == 0) - is_in_both = np.logical_and(send_com > 0, receive_com > 0) - send_only = np.logical_and(send_com > 0, receive_com == 0) - receive_only = np.logical_and(send_com == 0, receive_com > 0) - - if cmap is None: - cmap = "RdBu_r" - - axes.scatter( - node_pos[0, is_in_none], - node_pos[1, is_in_none], - s=s * s_scale, - c="tab:gray", - edgecolor="k", - linewidth=lw / 2, - zorder=2, - ) - axes.scatter( - node_pos[0, send_only], - node_pos[1, send_only], - s=s, - c=send_com[send_only], - # cmap="RdBu_r", - cmap=cmap, - edgecolor="k", - marker="s", - linewidth=lw, - zorder=2, - vmin=-1, - vmax=1, - ) - axes.scatter( - node_pos[0, receive_only], - node_pos[1, receive_only], - s=s, - c=-receive_com[receive_only], - # cmap="RdBu_r", - cmap=cmap, - edgecolor="k", - marker="D", - linewidth=lw, - zorder=2, - vmin=-1, - vmax=1, - ) - axes.scatter( - node_pos[0, is_in_both], - node_pos[1, is_in_both], - s=s, - c=send_com[is_in_both] - receive_com[is_in_both], - cmap=cmap, - # c="w", - edgecolor="k", - marker="o", - linewidth=lw, - zorder=2, - vmin=-1, - vmax=1, - ) - - return fig, axes - - -def plot_all_bicommunity( - adjacency, - send_com, - receive_com, - fig=None, - axes=None, - layout="embedding", - scatter_only=False, - titles=None, - nrows=1, - ncols=None, - draw_legend=True, - legend_on_ax=False, - cmap=None, - gspec_wspace=0, - gspec_hspace=0.05, - right_pad=None, - **kwargs, -): - if ncols is None: - ncols = len(send_com) // nrows + (len(send_com) % nrows) - - if right_pad is not None: - com_gs = GridSpecFromSubplotSpec( - nrows=nrows, - ncols=ncols + 1, - # ncols=len(send_com) // nrows, - subplot_spec=axes.get_subplotspec(), - wspace=gspec_wspace, - hspace=gspec_hspace, - width_ratios=[1] * ncols + [right_pad], - ) - com_axes = [ - fig.add_subplot(gs) - for gi, gs in enumerate(com_gs) - if (gi + 1) % (ncols + 1) - ] - else: - com_gs = GridSpecFromSubplotSpec( - nrows=nrows, - ncols=ncols, - # ncols=len(send_com) // nrows, - subplot_spec=axes.get_subplotspec(), - wspace=gspec_wspace, - hspace=gspec_hspace, - ) - com_axes = [fig.add_subplot(gs) for gs in com_gs] - # axes.set_visible(False) - axes.axis("off") - - if isinstance(layout, dict): - graph_pos = layout.copy() - elif layout == "embedding": - U, _, Vh = dgsp.sorted_SVD(dgsp.modularity_matrix(adjacency)) - V = Vh.T - - if np.allclose(adjacency, adjacency.T): - graph_pos = {i: (U[i, 0], V[i, 1]) for i, _ in enumerate(adjacency)} - else: - graph_pos = {i: (U[i, 0], V[i, 0]) for i, _ in enumerate(adjacency)} - else: - graph_pos = nx.spring_layout(nx.DiGraph(adjacency)) - - if titles is None: - titles = [f"Com {i+1}" for i in range(len(send_com))] - - for i, title in enumerate(titles): - com_axes[i].set_title(title, fontsize=20) - - if cmap is None: - cmap = plt.get_cmap("RdBu") - elif isinstance(cmap, str): - cmap = plt.get_cmap(cmap, 5) - - for i, (send, receive) in enumerate(zip(send_com, receive_com)): - - com_axes[i].set_facecolor("none") - - if scatter_only: - com_axes[i].scatter(send, receive) - else: - plot_bicommunity( - adjacency, - send, - receive, - fig=fig, - axes=com_axes[i], - graph_pos=graph_pos, - cmap=cmap, - **kwargs, - ) - - com_axes[i].spines[:].set_visible(False) - com_axes[-1].spines[:].set_visible(False) - com_axes[-1].tick_params( - left=False, bottom=False, labelleft=False, labelbottom=False - ) - - leg_titles = ["Send", "Both", "Receive"] - markers = ["s", "o", "D"] - - custom_legend = [ - Line2D( - [0], - [0], - color="w", - marker=markers[i], - markeredgecolor="k", - markerfacecolor=cmap(1 + i), - markersize=10, - ) - for i, _ in enumerate(leg_titles) - ] - - if draw_legend: - if legend_on_ax: - axes.legend( - custom_legend, - leg_titles, - loc="lower center", - ncol=3, - fontsize=20, - bbox_to_anchor=(0.5, -0.12), - ) - else: - fig.legend( - custom_legend, leg_titles, loc="lower center", ncol=3, fontsize=20 - ) - - return fig, axes - - -def plot_bicommunity_types( - sending_communities, - receiving_communities, - types, - type_colors=None, - titles=None, - fontsize=14, - fig=None, - axes=None, -): - - if type_colors is None: - cmap = plt.get_cmap("Set1") - type_colors = {t: cmap(i) for i, t in enumerate(types.unique())} - - if titles is None: - titles = [f"Community {com_i+1}" for com_i in range(len(sending_communities))] - - if axes is None: - fig, axes = plt.subplots(figsize=(5 * len(sending_communities), 5)) - - types_series = pd.Series(types) - # print(types_series) - - for com_i, (s, r) in enumerate(zip(sending_communities, receiving_communities)): - types_send = types_series[s > 0].value_counts() - types_receive = types_series[r > 0].value_counts() - - # print(types_send, types_receive) - - axes[com_i].set_visible(False) - gs_com = GridSpecFromSubplotSpec( - 2, 1, subplot_spec=axes[com_i].get_subplotspec(), hspace=0.05, wspace=0 - ) - axes_com = [fig.add_subplot(gs_com[i]) for i in range(2)] - - # axes_com[0].set_title(f"Community {com_i+1}", fontsize=20) - # axes_com[0].set_title(titles[com_i], fontsize=20) - - # axes_com[0].set_title("Sending", fontsize=14) - # axes_com[1].set_title("Receiving", fontsize=14) - - # axes_com[0].set_ylabel("Sending\n", fontsize=fontsize + 2, labelpad=-30) - # axes_com[1].set_ylabel("Receiving\n", fontsize=fontsize + 2, labelpad=-30) - - axes_com[0].set_ylabel("Sending\n", fontsize=fontsize + 2, labelpad=0) - axes_com[1].set_ylabel("Receiving\n", fontsize=fontsize + 2, labelpad=0) - - axes_com[0].yaxis.set_label_position("right") - axes_com[1].yaxis.set_label_position("right") - - axes_com[0].pie( - types_send, - colors=[type_colors[t] for t in types_send.index], - labels=types_send.index, - labeldistance=0.6, - # rotatelabels=True, - wedgeprops={"edgecolor": "w", "linewidth": 2}, - textprops={"fontsize": fontsize, "ha": "center"}, - # textprops={"size": "smaller"}, - ) - axes_com[1].pie( - types_receive, - colors=[type_colors[t] for t in types_receive.index], - labels=types_receive.index, - labeldistance=0.6, - # rotatelabels=True, - wedgeprops={"edgecolor": "w", "linewidth": 2}, - textprops={"fontsize": fontsize, "ha": "center"}, - # textprops={"size": "smaller"}, - ) - - return axes diff --git a/bimodularity/__init__.py b/bimodularity/__init__.py new file mode 100644 index 0000000..1f4dfc7 --- /dev/null +++ b/bimodularity/__init__.py @@ -0,0 +1,12 @@ +"""Bimodularity module""" + +__version__ = "0.1.0" +__author__ = "Alexandre Cionca" + +# Import main classes/functions for easier access +# from .core import SomeClass, some_function + +__all__ = [ + # "SomeClass", + # "some_function", +] diff --git a/bimodularity/bimod_plots.py b/bimodularity/bimod_plots.py new file mode 100644 index 0000000..c6f6c1a --- /dev/null +++ b/bimodularity/bimod_plots.py @@ -0,0 +1,2362 @@ +# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*- +# vi: set ft=python sts=4 ts=4 sw=4 et: + +from matplotlib import animation +from matplotlib.figure import Figure +from matplotlib.gridspec import GridSpecFromSubplotSpec +from matplotlib.lines import Line2D +from matplotlib.cm import ScalarMappable + +import pandas as pd +import numpy as np +from scipy.linalg import block_diag +from scipy.stats import gaussian_kde, spearmanr +from scipy.cluster.hierarchy import dendrogram, fcluster +from sklearn.linear_model import LinearRegression +import networkx as nx + +import os.path as op +from typing import Optional + +from matplotlib.axes import Axes +import matplotlib.pyplot as plt +from matplotlib.patches import FancyArrowPatch +from matplotlib.colors import ( + to_rgb, + to_rgba, + ListedColormap, + LinearSegmentedColormap, + Normalize, +) +from matplotlib.patheffects import withStroke +from matplotlib.colorbar import Colorbar +from matplotlib.patches import ArrowStyle + +import nibabel as nib +from dipy.viz import window, actor +from dipy.tracking.metrics import spline +from dipy.tracking.streamline import ( + set_number_of_points, + select_random_set_of_streamlines, +) + +from nilearn.datasets import fetch_surf_fsaverage +from nilearn.surface import load_surf_mesh + +from . import dgsp +from . import bundle +from .palettes import ( + CLUSTER, + CLUSTER_CB, + CLUSTER_SOFT, + DIV_RB, + EXTENDED_NCAR, + PASTEL, + DIV_RB_SILVER, + SHORT_NCAR, +) + + +def get_all_cmaps(): + all_colors = [ + CLUSTER, + CLUSTER_CB, + CLUSTER_SOFT, + DIV_RB, + DIV_RB_SILVER, + EXTENDED_NCAR, + SHORT_NCAR, + ] + cmap_names = [ + "cluster_palette", + "cluster_palette_cb", + "cluster_palette_soft", + "div_rb", + "div_rb_silver", + "extended_ncar", + "short_ncar", + ] + + fig, axes = plt.subplots(figsize=(8, 2)) + x_plot = np.linspace(0, 1, 256) + + cmaps = {} + for i, (name, cmap) in enumerate(zip(cmap_names, all_colors)): + cmap = LinearSegmentedColormap.from_list("colors", cmap) + cmaps[name] = cmap + axes.scatter( + x_plot, np.ones_like(x_plot) * i, c=cmap(x_plot), marker="o", s=100 + ) + axes.set_yticks(np.arange(len(cmap_names)), labels=cmap_names) + axes.set_xticks([]) + + return cmaps + + +def plot_palette(): + palette_rgb = [to_rgb(color) for color in PASTEL] + plt.scatter([0, 1, 2, 3], [0] * 4, c=palette_rgb, s=400, edgecolors="k", lw=2) + + +def get_custom_cmap() -> ListedColormap: + + palette_rgb = [to_rgb(color) for color in PASTEL] + + custom_cmap = ListedColormap([(0, 0, 0), (1, 1, 1)] + palette_rgb) + + return custom_cmap + + +def add_cbar(fig: Figure, ax: Axes, **kwargs) -> (Figure, Axes, Colorbar): + """Add a colorbar to an existing figure/axis. + + Parameters + ---------- + fig : matplotlib.figure.Figure + figure to get the colorbar from + ax : matplotlib.axes.Axes + axes to add the colorbar to + + Returns + ------- + tuple(matplotlib.figure.Figure, matplotlib.axes.Axes, matplotlib.colorbar.Colorbar) + tuple of figure and axes with the colorbar added + """ + from mpl_toolkits.axes_grid1 import make_axes_locatable + + divider = make_axes_locatable(ax) + cax = divider.append_axes("right", size="5%", pad=0.05) + cbar = fig.colorbar(ax.get_children()[0], cax=cax, orientation="vertical", **kwargs) + return fig, ax, cbar + + +def draw_cbar( + fig, + cmap, + ax_pos, + ticks=[0, 5, 10], + labels=["Receiving", "Both", "Sending"], + fontsize: int = 18, + orientation: str = "horizontal", + **kwargs, +): + cax = fig.add_axes(ax_pos) # [left, bottom, width, height] + + norm = Normalize(vmin=0, vmax=10) + sm = ScalarMappable(cmap=cmap, norm=norm) + sm.set_array([]) + + cb = plt.colorbar(sm, cax=cax, orientation=orientation, **kwargs) + cb.set_ticks(ticks) + cb.set_ticklabels(labels, fontsize=fontsize) + + return cb + + +def draw_self_loop( + axes: Axes, + posx: float, + posy: float, + size: float, + rad: float = 0.4, + offset: float = 0.01, + mutation_scale: int = 20, + onearrow: bool = True, +) -> Axes: + + all_arrows_pos = [ + (posx, posy, posx + size, posy, rad), + (posx + size - offset, posy - offset, posx + size - offset, posy + size, rad), + (posx + size, posy + size - offset, posx, posy + size - offset, rad), + (posx + offset, posy + size, posx + offset, posy - offset, rad), + ] + + for pos_i, arr_pos in enumerate(all_arrows_pos): + px, py, sx, sy, rad = arr_pos + + style = "-" + if onearrow: + if pos_i == len(all_arrows_pos) - 1: + style = "-|>" + elif pos_i % 2: + style = "-|>" + + arrow = FancyArrowPatch( + (px, py), + (sx, sy), + arrowstyle=style, + mutation_scale=mutation_scale, + linewidth=2, + color="k", + connectionstyle=f"arc3,rad={rad}", + ) + + axes.add_patch(arrow) + + return axes + + +def draw_smaller_self_loop( + axes: Axes, + posx: float, + posy: float, + size: float, + rad: float = 0.4, + offset: float = 0.01, + mutation_scale: int = 20, + onearrow: bool = True, +) -> Axes: + + all_arrows_pos = [ + (posx, posy, posx, posy - size, rad), + (posx - offset, posy - size + offset, posx + size, posy - size, rad), + (posx + size - offset, posy - size - offset, posx + size, posy, rad), + ] + + all_arrows_pos = [ + (posx, posy, posx, posy - size, rad), + ( + posx - offset, + posy - size + offset, + posx + size + offset, + posy - size + offset, + rad, + ), + (posx + size, posy - size, posx + size, posy, rad), + ] + + for pos_i, arr_pos in enumerate(all_arrows_pos): + px, py, sx, sy, rad = arr_pos + + style = "-" + if onearrow: + if pos_i == len(all_arrows_pos) - 1: + style = "-|>" + elif pos_i % 2: + style = "-|>" + + arrow = FancyArrowPatch( + (px, py), + (sx, sy), + arrowstyle=style, + mutation_scale=mutation_scale, + linewidth=2, + color="k", + connectionstyle=f"arc3,rad={rad}", + ) + + axes.add_patch(arrow) + + return axes + + +def plot_community_scheme( + ax: Optional[Axes] = None, + use_cmap: bool = True, + title_letter: str = "", + fontscale: float = 1.2, + com_names: Optional[np.ndarray] = None, + com_names_yoffset: float = 0, + x_names: [str, str] = ["Sending 1", "Sending 2"], + y_names: [str, str] = ["Receiving 1", "Receiving 2"], + arrow_colors: Optional[np.ndarray] = None, + plot_cycle: bool = False, + override_title: Optional[str] = None, +) -> Optional[Axes]: + # First plot (A) + xy_pos = np.array([[-0.5, -0.5], [0.5, -0.5], [-0.5, 0.5], [0.5, 0.5]]) + pos = {i: xy_pos[i] for i in range(4)} + + if ax is None: + _, ax = plt.subplots(figsize=(8, 8)) + + colors = "none" + if use_cmap: + palette_indices = [3, 2, 1, 0] + colors = [to_rgba(PASTEL[color_i], alpha=0.5) for color_i in palette_indices] + # colors = [to_rgba(color, alpha=0.5) for color in PASTEL] + + ax.scatter( + xy_pos[:, 0], + xy_pos[:, 1], + marker="s", + s=1.5e4, + color=colors, + edgecolor="black", + linewidth=2, + zorder=1, + ) + + # Definition of arrows + mid_point = 0.5 + + starting_points = [ + (-0.2, -mid_point), + (mid_point, -0.2), + (0.2, mid_point), + (-mid_point, 0.2), + (0.3, -0.2), + (-0.3, 0.2), + ] + ending_points = [ + (0.2, -mid_point), + (mid_point, 0.2), + (-0.2, mid_point), + (-mid_point, -0.2), + (-0.2, 0.3), + (0.2, -0.3), + ] + + if plot_cycle: + starting_points = starting_points[:-2] + ending_points = ending_points[:-2] + + if arrow_colors is None: + arrow_colors = ["black"] * len(starting_points) + + for start, end, col in zip(starting_points, ending_points, arrow_colors): + arrow = FancyArrowPatch( + start, + end, + arrowstyle="-|>", + mutation_scale=30, + linewidth=2, + facecolor=col, + edgecolor=col, + ) + ax.add_patch(arrow) + + # Drawing the rectangles (communities) + if com_names is None: + com_names = ["$S_4$", "$S_3$", "$S_2$", "$S_1$"] + + for pos, com_name in zip(xy_pos, com_names): + ax.text( + pos[0], + pos[1] + com_names_yoffset, + com_name, + fontsize=24 * fontscale, + fontweight="bold", + ha="center", + va="center", + ) + + # Ticks parameters + ax.set_title( + title_letter, + loc="left", + fontsize=22 * fontscale, + fontdict={"fontweight": "bold"}, + ) + + if override_title is None: + override_title = "Community structure scheme" + ax.set_title(override_title, fontsize=20 * fontscale) + + ax.set_xticks( + np.linspace(-0.5, 0.5, 2), + labels=x_names, + fontsize=18 * fontscale, + ) + ax.set_yticks( + np.linspace(-0.5, 0.5, 2), + labels=y_names, + fontsize=18 * fontscale, + rotation=90, + va="center", + ) + ax.tick_params(left=False, bottom=False, labelleft=True, labelbottom=True) + ax.spines[:].set_visible(False) + ax.set_xlabel("Sending communities", fontsize=18 * fontscale) + ax.set_ylabel("Receiving communities", fontsize=18 * fontscale) + ax.set_xlim(-0.9, 0.9) + ax.set_ylim(-0.9, 0.9) + + return ax + + +def plot_adjacency( + matrix: np.ndarray, + ax: Optional[Axes] = None, + use_cmap: bool = True, + fontscale: float = 1.2, + title_letter: str = "", + override_title: Optional[str] = None, +) -> Optional[Axes]: + + if ax is None: + _, ax = plt.subplots(figsize=(8, 8)) + + plot_adj = matrix.copy() + + n_per_com = matrix.shape[0] // 4 + + cmap = "binary_r" + if use_cmap: + cmap = get_custom_cmap() + for i in range(4): + plot_adj[ + i * n_per_com : (i + 1) * n_per_com, i * n_per_com : (i + 1) * n_per_com + ] = matrix[ + i * n_per_com : (i + 1) * n_per_com, i * n_per_com : (i + 1) * n_per_com + ] * ( + i + 2 + ) + + ax.imshow(plot_adj, cmap=cmap, interpolation="none") + # axes[1].imshow(graph, cmap="binary_r") + + # Parameters B + ax.set_title( + title_letter, + loc="left", + fontsize=22 * fontscale, + fontdict={"fontweight": "bold"}, + ) + if override_title is None: + override_title = "Graph adjacency matrix" + ax.set_title(override_title, fontsize=20 * fontscale) + + ax.set_xticks( + np.arange(n_per_com // 2, matrix.shape[0] + 1, n_per_com), + labels=["$S_1$", "$S_2$", "$S_3$", "$S_4$"], + fontsize=18 * fontscale, + ) + ax.set_yticks( + np.arange(n_per_com // 2, matrix.shape[0] + 1, n_per_com), + labels=["$S_1$", "$S_2$", "$S_3$", "$S_4$"], + fontsize=18 * fontscale, + ) + return ax + + +def plot_spectrum( + matrix: np.ndarray, + vector_id: int = 0, + show_n_eig: int = 10, + write_s: bool = False, + fig: Optional[Figure] = None, + ax: Optional[Axes] = None, + split_ax: bool = False, + fix_negative: bool = True, + fontscale: float = 1.2, + title_letter: str = "", + override_title: Optional[str] = None, + normalize_s: bool = False, + **kwargs, +) -> Axes: + + # Building the modularity matrix + modmat = dgsp.modularity_matrix(matrix, null_model="outin") + + U, S, Vh = dgsp.sorted_SVD(modmat, fix_negative=fix_negative) + V = Vh.T + + r_squared = S[vector_id] ** 2 / (S**2).sum() + print(f"s (norm) = {S[vector_id] / (2 * matrix.sum())}") + print(f"R^2 = {r_squared}") + + n_nodes = matrix.shape[0] + + # Starting the plot + if fig is None and ax is None: + fig, ax = plt.subplots(figsize=(10, 10)) + + if split_ax: + gs1 = GridSpecFromSubplotSpec(1, 2, subplot_spec=ax, wspace=0.04) + axes = [fig.add_subplot(gs1[0]), fig.add_subplot(gs1[1])] + else: + axes = [ax] * 2 + + node_colors = "k" + if not fix_negative: + node_colors = [] + for i in range(show_n_eig): + # angle = V[:, i] @ U[:, i].T + angle = U[:, i] @ V[:, i] + # node_colors.append(angle) + col_id = 1 - (np.sign(angle) + 1) // 2 + node_colors.append(PASTEL[col_id.astype(int)]) + + # Figure A (eigenvalues) + + # Clear the 1st subplot (in the background) + + if split_ax: + ax.set_xticks([0], labels=[0], fontsize=16 * fontscale, fontdict={"color": "w"}) + ax.tick_params( + left=False, + bottom=False, + labelleft=False, + labelbottom=True, + labelsize=16 * fontscale, + color="w", + ) + + if split_ax: + for _, s in ax.spines.items(): + s.set_visible(False) + + if normalize_s: + S = S / (2 * matrix.sum()) + + # axes[0].plot(S, marker="o", lw=4, ms=10, color="k") + axes[0].plot(S, marker="o", lw=4, ms=20, markeredgewidth=1, color="k") + + if split_ax: + axes[1].plot(S, marker="o", lw=4, ms=10, color="k") + + if not fix_negative: + axes[0].scatter( + np.arange(show_n_eig), + S[:show_n_eig], + color=node_colors, + # color=np.sign(node_colors), + # cmap="coolwarm", + edgecolors="k", + lw=2, + s=220, + zorder=2, + ) + + x_id = np.arange(n_nodes)[vector_id] + if (vector_id >= 0) and (vector_id < show_n_eig): + if write_s: + axes[0].plot( + x_id, + S[vector_id], + marker="s", + lw=4, + ms=22, + # color=PASTEL[0], + color=node_colors[vector_id], + markeredgecolor="k", + markeredgewidth=4, + ) + axes[0].text( + x_id + 1, + S[vector_id], + f"$\\mu_{{{x_id+1}}}={S[vector_id]:2.2f}, R^2={r_squared:1.2f}$", + # f"$s_{{{x_id}}}={S[vector_id]:2.2f}, R^2={r_squared:1.2f}$", + fontsize=18 * fontscale, + ha="left", + va="center", + path_effects=[ + withStroke( + linewidth=3 * fontscale, + foreground="w", + alpha=0.8, + ) + ], + ) + else: + axes[1].plot( + x_id, + S[vector_id], + marker="s", + lw=4, + ms=14, + # color=PASTEL[0], + color=node_colors[vector_id], + markeredgecolor="k", + markeredgewidth=2, + ) + + # Plotting the horizontal line at y=0 + ax.set_ylim(axes[0].get_ylim()) + ax.plot([-10, 10], [0] * 2, color="k", ls="--", alpha=0.8, zorder=5) + + if split_ax: + axes[0].plot([-2, show_n_eig], [0] * 2, color="k", ls="--", alpha=0.8) + axes[1].plot( + [len(S) - show_n_eig, len(S) + 2], [0] * 2, color="k", ls="--", alpha=0.8 + ) + else: + # ax.set_ylim(S[:show_n_eig].min() - 1, S[:show_n_eig].max() + 1) + ax.set_ylim(0.9 * S[:show_n_eig].min(), 1.1 * S[:show_n_eig].max()) + + # From matplotlib examples + d = 0.5 # proportion of vertical to horizontal extent of the slanted line + kwargs = dict( + marker=[(-1, -d), (1, d)], + markersize=12, + color="k", + mec="k", + mew=1, + clip_on=False, + ) + + if split_ax: + axes[0].plot([1], [0], transform=axes[0].transAxes, **kwargs) + axes[1].plot([0], [0], transform=axes[1].transAxes, **kwargs) + + # Parameters + if override_title is None: + override_title = "Eigenspectrum" + ax.set_title(override_title, fontsize=20 * fontscale) + axes[0].set_title( + title_letter, + loc="left", + fontsize=22 * fontscale, + fontdict={"fontweight": "bold"}, + ) + + axes[0].set_xlim(-2, show_n_eig - 0.5) + + n_ticks = show_n_eig // 3 + axes[0].set_xticks( + np.arange(0, show_n_eig, n_ticks), labels=np.arange(0, show_n_eig, n_ticks) + 1 + ) + + if split_ax: + axes[1].set_xlim(len(S) - show_n_eig + 0.5, len(S) + 2) + axes[1].set_xticks( + np.arange(len(S) - show_n_eig + n_ticks, len(S) + 2, n_ticks) + ) + + axes[0].spines.right.set_visible(False) + + if split_ax: + axes[1].spines.left.set_visible(False) + + ax.set_xlabel("Indices $n$", fontsize=18 * fontscale) + axes[0].set_ylabel("Singular Values $\\mu_n$", fontsize=18 * fontscale) + # axes[0].set_ylabel("Singular values $s_i$", fontsize=18 * fontscale) + + for ax in axes[:2]: + ax.spines[["top", "right"]].set_visible(False) + ax.spines[:].set_linewidth(2) + + # ax.set_xticks(np.linspace(-.1, .1, 3), labels=np.linspace(-.1, .1, 3), fontsize=18*fontscale) + # ax.set_yticks(np.linspace(-.1, .1, 3), labels=np.linspace(-.1, .1, 3), fontsize=18*fontscale) + + axes[0].tick_params( + left=True, + bottom=True, + labelleft=True, + labelbottom=True, + labelsize=16 * fontscale, + width=2, + ) + + if split_ax: + axes[1].tick_params( + left=False, + bottom=True, + labelleft=False, + labelbottom=True, + labelsize=16 * fontscale, + ) + + return ax + + +def plot_graph_embedding( + matrix: np.ndarray, + vector_id: int = 0, + n_com: int = 4, + ax: Optional[Axes] = None, + use_cmap: bool = True, + cmap: str = "plasma", + static_color: str = "tab:blue", + write_label: bool = False, + write_var: bool = False, + label_lw: int = 3, + directed_edges: bool = True, + edge_alpha: float = 0.02, + fontscale: float = 1.2, + title_letter: str = "", + override_title: Optional[str] = None, + node_clusers: Optional[np.ndarray] = None, + **kwargs, +) -> Axes: + + # Building the modularity matrix + modmat = dgsp.modularity_matrix(matrix, null_model="outin") + + U, S, Vh = dgsp.sorted_SVD(modmat, **kwargs) + V = Vh.T + + n_nodes = matrix.shape[0] + n_per_com = n_nodes // n_com + + graph_pos = {i: (U[i, vector_id], V[i, vector_id]) for i in range(n_nodes)} + labels = {i: "" for i in range(n_nodes)} + + if ax is None: + _, ax = plt.subplots(figsize=(8, 8)) + + if directed_edges: + graph = nx.DiGraph(matrix) + else: + graph = nx.Graph(matrix) + + nx.draw_networkx_edges(graph, pos=graph_pos, alpha=edge_alpha, ax=ax) + + if use_cmap: + if node_clusers is None: + palette_rgb = [to_rgb(color) for color in PASTEL] + colors = [palette_rgb[i // n_per_com] for i in np.arange(n_nodes)] + else: + try: + cmap = plt.get_cmap(cmap, int(node_clusers.max() + 1)) + colors = [cmap(int(i)) for i in node_clusers] + except ValueError: + colors = [cmap] * n_nodes + else: + colors = static_color + + ax.scatter( + U[:, vector_id], + V[:, vector_id], + s=200, + color=colors, + edgecolor="k", + linewidth=2, + zorder=2, + ) + + if write_var: + expl_var = S[vector_id] ** 2 / np.sum(S**2) + ax.text( + 0.05, + 0.90, + f"$R^2={expl_var:1.3f}$", + transform=ax.transAxes, + fontsize=16 * fontscale, + path_effects=[ + withStroke( + linewidth=label_lw, + foreground="w", + alpha=0.8, + ) + ], + ) + + angle = (V.T @ U)[vector_id, vector_id] + ax.text( + 0.05, + 0.85, + f"$\\mathbf{{v}}^T\\mathbf{{u}}={angle:1.2f}$", + transform=ax.transAxes, + fontsize=16 * fontscale, + path_effects=[ + withStroke( + linewidth=label_lw, + foreground="w", + alpha=0.8, + ) + ], + ) + + if write_label: + for com_i in range(n_com): + mean_u = np.mean(U[com_i * n_per_com : (com_i + 1) * n_per_com, vector_id]) + mean_v = np.mean(V[com_i * n_per_com : (com_i + 1) * n_per_com, vector_id]) + ax.text( + mean_u, + mean_v, + f"$S_{com_i+1}$", + fontsize=26 * fontscale, + color="k", + # color="w", + # color=PASTEL[com_i], + fontweight="bold", + path_effects=[ + withStroke( + linewidth=label_lw, + foreground="w", + alpha=0.8, + # foreground="k", + # foreground=PASTEL[com_i], + ) + ], + ha="center", + va="center", + zorder=4, + ) + # ax.scatter( + # mean_u, mean_v, s=1000, marker="o", color="w", alpha=0.8, zorder=3 + # ) + + # Parameters + ax.set_title( + title_letter, + loc="left", + fontsize=22 * fontscale, + fontdict={"fontweight": "bold"}, + ) + if override_title is None: + override_title = f"Bimodularity Embedding $(n={{{vector_id+1}}})$" + ax.set_title(override_title, fontsize=20 * fontscale) + ax.tick_params( + left=True, + bottom=True, + labelleft=True, + labelbottom=True, + labelsize=16 * fontscale, + width=2, + ) + ax.spines[["top", "right"]].set_visible(False) + ax.spines[:].set_linewidth(2) + + ax.set_xticks( + np.linspace(-0.1, 0.1, 3), + labels=np.linspace(-0.1, 0.1, 3), + fontsize=18 * fontscale, + ) + ax.set_yticks( + np.linspace(-0.1, 0.1, 3), + labels=np.linspace(-0.1, 0.1, 3), + fontsize=18 * fontscale, + ) + + ax.set_xlabel( + f"Left Singular Vector $\\mathbf{{u}}_{{{vector_id+1}}}$", + fontsize=18 * fontscale, + ) + ax.set_ylabel( + f"Right Singular Vector $\\mathbf{{v}}_{{{vector_id+1}}}$", + fontsize=18 * fontscale, + ) + + return ax + + +def plot_bicommunity( + adjacency, + send_com, + receive_com, + fig=None, + axes=None, + graph_pos=None, + lw=1, + edge_alpha=0.05, + draw_arrows=False, + cmap=None, + s=80, + s_scale=5 / 8, +): + if fig is None: + fig, axes = plt.subplots(figsize=(10, 10)) + + if graph_pos is None: + graph_pos = nx.spring_layout(nx.DiGraph(adjacency)) + + node_pos = np.array(list(graph_pos.values())).T + + if draw_arrows: + nx.draw_networkx_edges( + nx.DiGraph(adjacency), pos=graph_pos, alpha=edge_alpha, ax=axes + ) + else: + nx.draw_networkx_edges( + nx.Graph(adjacency), pos=graph_pos, alpha=edge_alpha, ax=axes + ) + + is_in_none = np.logical_and(send_com == 0, receive_com == 0) + is_in_both = np.logical_and(send_com > 0, receive_com > 0) + send_only = np.logical_and(send_com > 0, receive_com == 0) + receive_only = np.logical_and(send_com == 0, receive_com > 0) + + if cmap is None: + cmap = "RdBu_r" + + axes.scatter( + node_pos[0, is_in_none], + node_pos[1, is_in_none], + s=s * s_scale, + c="tab:gray", + edgecolor="k", + linewidth=lw / 2, + zorder=2, + ) + axes.scatter( + node_pos[0, send_only], + node_pos[1, send_only], + s=s, + c=send_com[send_only], + # cmap="RdBu_r", + cmap=cmap, + edgecolor="k", + marker="s", + linewidth=lw, + zorder=2, + vmin=-1, + vmax=1, + ) + axes.scatter( + node_pos[0, receive_only], + node_pos[1, receive_only], + s=s, + c=-receive_com[receive_only], + # cmap="RdBu_r", + cmap=cmap, + edgecolor="k", + marker="D", + linewidth=lw, + zorder=2, + vmin=-1, + vmax=1, + ) + axes.scatter( + node_pos[0, is_in_both], + node_pos[1, is_in_both], + s=s, + c=send_com[is_in_both] - receive_com[is_in_both], + cmap=cmap, + # c="w", + edgecolor="k", + marker="o", + linewidth=lw, + zorder=2, + vmin=-1, + vmax=1, + ) + + return fig, axes + + +def plot_all_bicommunity( + adjacency, + send_com, + receive_com, + fig=None, + axes=None, + layout="embedding", + scatter_only=False, + titles=None, + nrows=1, + ncols=None, + draw_legend=True, + legend_on_ax=False, + cmap=None, + gspec_wspace=0, + gspec_hspace=0.05, + right_pad=None, + **kwargs, +): + if ncols is None: + ncols = len(send_com) // nrows + (len(send_com) % nrows) + + if right_pad is not None: + com_gs = GridSpecFromSubplotSpec( + nrows=nrows, + ncols=ncols + 1, + # ncols=len(send_com) // nrows, + subplot_spec=axes.get_subplotspec(), + wspace=gspec_wspace, + hspace=gspec_hspace, + width_ratios=[1] * ncols + [right_pad], + ) + com_axes = [ + fig.add_subplot(gs) + for gi, gs in enumerate(com_gs) + if (gi + 1) % (ncols + 1) + ] + else: + com_gs = GridSpecFromSubplotSpec( + nrows=nrows, + ncols=ncols, + # ncols=len(send_com) // nrows, + subplot_spec=axes.get_subplotspec(), + wspace=gspec_wspace, + hspace=gspec_hspace, + ) + com_axes = [fig.add_subplot(gs) for gs in com_gs] + # axes.set_visible(False) + axes.axis("off") + + if isinstance(layout, dict): + graph_pos = layout.copy() + elif layout == "embedding": + U, _, Vh = dgsp.sorted_SVD(dgsp.modularity_matrix(adjacency)) + V = Vh.T + + if np.allclose(adjacency, adjacency.T): + graph_pos = {i: (U[i, 0], V[i, 1]) for i, _ in enumerate(adjacency)} + else: + graph_pos = {i: (U[i, 0], V[i, 0]) for i, _ in enumerate(adjacency)} + else: + graph_pos = nx.spring_layout(nx.DiGraph(adjacency)) + + if titles is None: + titles = [f"Com {i+1}" for i in range(len(send_com))] + + for i, title in enumerate(titles): + com_axes[i].set_title(title, fontsize=20) + + if cmap is None: + cmap = plt.get_cmap("RdBu") + elif isinstance(cmap, str): + cmap = plt.get_cmap(cmap, 5) + + for i, (send, receive) in enumerate(zip(send_com, receive_com)): + + com_axes[i].set_facecolor("none") + + if scatter_only: + com_axes[i].scatter(send, receive) + else: + plot_bicommunity( + adjacency, + send, + receive, + fig=fig, + axes=com_axes[i], + graph_pos=graph_pos, + cmap=cmap, + **kwargs, + ) + + com_axes[i].spines[:].set_visible(False) + com_axes[-1].spines[:].set_visible(False) + com_axes[-1].tick_params( + left=False, bottom=False, labelleft=False, labelbottom=False + ) + + leg_titles = ["Send", "Both", "Receive"] + markers = ["s", "o", "D"] + + custom_legend = [ + Line2D( + [0], + [0], + color="w", + marker=markers[i], + markeredgecolor="k", + markerfacecolor=cmap(1 + i), + markersize=10, + ) + for i, _ in enumerate(leg_titles) + ] + + if draw_legend: + if legend_on_ax: + axes.legend( + custom_legend, + leg_titles, + loc="lower center", + ncol=3, + fontsize=20, + bbox_to_anchor=(0.5, -0.12), + ) + else: + fig.legend( + custom_legend, leg_titles, loc="lower center", ncol=3, fontsize=20 + ) + + return fig, axes + + +def plot_bicommunity_types( + sending_communities, + receiving_communities, + types, + type_colors=None, + titles=None, + fontsize=14, + fig=None, + axes=None, +): + + if type_colors is None: + cmap = plt.get_cmap("Set1") + type_colors = {t: cmap(i) for i, t in enumerate(types.unique())} + + if titles is None: + titles = [f"Community {com_i+1}" for com_i in range(len(sending_communities))] + + if axes is None: + fig, axes = plt.subplots(figsize=(5 * len(sending_communities), 5)) + + types_series = pd.Series(types) + + for com_i, (s, r) in enumerate(zip(sending_communities, receiving_communities)): + types_send = types_series[s > 0].value_counts() + types_receive = types_series[r > 0].value_counts() + + axes[com_i].set_visible(False) + gs_com = GridSpecFromSubplotSpec( + 2, 1, subplot_spec=axes[com_i].get_subplotspec(), hspace=0.05, wspace=0 + ) + axes_com = [fig.add_subplot(gs_com[i]) for i in range(2)] + + axes_com[0].set_ylabel("Sending\n", fontsize=fontsize + 2, labelpad=0) + axes_com[1].set_ylabel("Receiving\n", fontsize=fontsize + 2, labelpad=0) + + axes_com[0].yaxis.set_label_position("right") + axes_com[1].yaxis.set_label_position("right") + + axes_com[0].pie( + types_send, + colors=[type_colors[t] for t in types_send.index], + labels=types_send.index, + labeldistance=0.6, + # rotatelabels=True, + wedgeprops={"edgecolor": "w", "linewidth": 2}, + textprops={"fontsize": fontsize, "ha": "center"}, + # textprops={"size": "smaller"}, + ) + axes_com[1].pie( + types_receive, + colors=[type_colors[t] for t in types_receive.index], + labels=types_receive.index, + labeldistance=0.6, + # rotatelabels=True, + wedgeprops={"edgecolor": "w", "linewidth": 2}, + textprops={"fontsize": fontsize, "ha": "center"}, + # textprops={"size": "smaller"}, + ) + + return axes + + +def random_circle_patch(n_samples: int, center_offset: tuple = (0, 0), rmax: float = 1): + rand_angle = np.random.uniform(0, 2 * np.pi, n_samples) + rand_radius = np.random.uniform(0, rmax, n_samples) + + rand = ( + np.vstack([np.cos(rand_angle), np.sin(rand_angle)]) * np.sqrt(rand_radius) + + np.array(center_offset)[:, None] + ) + + return rand + + +def generate_grid_circle( + n_samples: int, center_offset: tuple = (0, 0), radius: float = 1.0 +): + n_r = 2 + n_theta = n_samples - 1 + + r = np.linspace(0, radius, n_r) + theta = np.linspace(0, 2 * np.pi, n_theta, endpoint=False) + # r, theta = np.meshgrid(r, theta) + theta, r = np.meshgrid(theta, r) + x = (r * np.cos(theta)).flatten() + center_offset[0] + y = (r * np.sin(theta)).flatten() + center_offset[1] + return np.vstack((x, y))[:, n_samples - 2 :] + # return x, y + + +def circular_layout( + n_blocks: int, + n_per_com: int, + radius: float = 1, + small_radius: float = 0.3, + return_dict: bool = False, + even_circles: bool = False, + offset: Optional[float] = None, +): + if offset is None: + offset = np.pi * (n_blocks - 2) / (2 * n_blocks) + + circular_centers = ( + np.array( + [ + [ + np.cos(offset + 2 * np.pi * i / n_blocks), + np.sin(offset + 2 * np.pi * i / n_blocks), + ] + for i in range(n_blocks) + ] + ) + * radius + ) + + if even_circles: + circular_pos = np.array( + [generate_grid_circle(n_per_com, c, small_radius) for c in circular_centers] + ) + else: + circular_pos = np.array( + [random_circle_patch(n_per_com, c, small_radius) for c in circular_centers] + ) + circular_pos = np.swapaxes(circular_pos, 0, 1).reshape(2, -1) + + if return_dict: + circ_dict = {i: (c[0], c[1]) for i, c in enumerate(circular_pos.T)} + return circular_pos, circ_dict + + return circular_pos + + +def graph_signal_gif( + all_recon: np.ndarray, + graph_pos: dict, + figure_loc: str, + gif_name: str, + savegif: bool = False, +): + + fig, ax = plt.subplots( + ncols=2, + nrows=2, + figsize=(10, 10), + gridspec_kw={"wspace": 0, "height_ratios": [2, 1]}, + ) + + def animate(i): + scat.set_offsets((x[i], 0)) + return (scat,) + + ani = animation.FuncAnimation( + fig, animate, repeat=True, frames=len(x) - 1, interval=50 + ) + + if savegif: + writer = animation.PillowWriter( + fps=15, metadata=dict(artist="Me"), bitrate=1800 + ) + ani.save(op.join(figure_loc, gif_name), writer=writer) + + plt.show() + + +def plot_lobe_lines( + axes, + lobe_sizes, + lobe_labels, + draw_grid=True, + plot_labels=True, + y_only=False, + x_only=False, + grid_color="w", + grid_lw=1, + fontsize=12, + no_insula=True, + x_hemi=True, +): + lobe_cumsum = np.concatenate([[0], np.cumsum(lobe_sizes)]) + + if draw_grid: + for l_s in lobe_cumsum[1:-1]: + # axes.axhline(l_s, color=grid_color, lw=grid_lw) + # axes.axvline(l_s, color=grid_color, lw=grid_lw) + axes.axhline(l_s - 0.5, color=grid_color, lw=grid_lw) + axes.axvline(l_s - 0.5, color=grid_color, lw=grid_lw) + + if plot_labels: + tick_pos = lobe_cumsum[:-1] + (np.diff(lobe_cumsum) / 2) + tick_pos = tick_pos[:-1] # removing brainstem + + plot_labs = lobe_labels[:-1] + plot_labs = [lab.replace("_lobe", "").replace("-", " ") for lab in plot_labs] + + if no_insula: + plot_labs = [lab if "insul" not in lab else "" for lab in plot_labs] + + if x_hemi: + labs_no_hemi = [lab.split(" ")[-1].capitalize() for lab in plot_labs] + axes.set_yticks(tick_pos, labels=labs_no_hemi) + + n_reg = np.sum(lobe_sizes) + axes.set_xticks([n_reg / 4, 3 * n_reg / 4], labels=["Left", "Right"]) + else: + if not y_only: + axes.set_xticks(tick_pos, labels=plot_labs, rotation=-40, ha="right") + if not x_only: + axes.set_yticks(tick_pos, labels=plot_labs) + axes.tick_params( + labelsize=fontsize, + labelbottom=False, + bottom=False, + labeltop=True, + top=True, + ) + return axes + + +def plot_summary_graph( + summary, + labels, + axes, + cmap, + e_strength: float = 5.0, + scatter_size: float = 400, + pos: dict = None, + text: bool = False, + legend: bool = True, +): + sum_graph = nx.DiGraph(summary) + edges = sum_graph.edges() + + e_str = np.array([summary[i, j] for i, j in edges]) + e_str = e_strength * e_str / e_str.max() + + if pos is None: + pos = nx.spring_layout(sum_graph) + pos = nx.kamada_kawai_layout(sum_graph) + + pos_array = np.array(list(pos.values())) + + net_colors = cmap.resampled(len(labels) + 1) + axes.scatter( + pos_array[:, 0], + pos_array[:, 1], + s=scatter_size, + zorder=3, + c=np.arange(len(labels)) + 1, + cmap=net_colors, + edgecolor="k", + linewidth=2, + vmin=0, + ) + _ = nx.draw_networkx_edges( + sum_graph, + pos, + ax=axes, + arrowstyle="-|>", + arrowsize=30, + edge_color="k", + edgelist=edges, + alpha=1, + width=e_str, + connectionstyle="arc3,rad=0.3", # ,angleA=-80,angleB=10", + # connectionstyle="angle3,angleA=50,angleB=-40", + ) + # connectionstyle='arc,angleA=0.2,angleB=0.2,rad=0.5') + + handles = [ + Line2D( + [0], + [0], + marker="o", + color="w", + label=labels[i], + markerfacecolor=net_colors(i + 1), + markersize=10, + ) + for i in range(len(labels)) + ] + + if text: + # Handling overlapping text labels + texty = pos_array[:, 1] + 0.05 + textdiff = texty[None, :] - texty[:, None] + i_over, j_over = np.array(np.where(np.abs(textdiff) < 0.05)) + for i, j in zip(i_over, j_over): + if i != j: + texty[j] += 0.02 * np.sign(textdiff[i, j]) + + for i, label in enumerate(labels): + axes.text( + pos_array[i, 0], + texty[i], + label, + fontsize=14, + # fontweight="bold", + ha="center", + va="center", + color=net_colors(i + 1), + path_effects=[ + withStroke( + linewidth=2, + foreground="k", + alpha=0.8, + ) + ], + ) + if legend and not text: + axes.legend(handles=handles, ncols=2, fontsize=14) + + +def plot_dendrogram(model, **kwargs): + # Create linkage matrix and then plot the dendrogram + + # create the counts of samples under each node + counts = np.zeros(model.children_.shape[0]) + n_samples = len(model.labels_) + for i, merge in enumerate(model.children_): + current_count = 0 + for child_idx in merge: + if child_idx < n_samples: + current_count += 1 # leaf node + else: + current_count += counts[child_idx - n_samples] + counts[i] = current_count + + linkage_matrix = np.column_stack( + [model.children_, model.distances_, counts] + ).astype(float) + + # Plot the corresponding dendrogram + return dendrogram(linkage_matrix, **kwargs) + + +def styled_dendrogram( + Z, + k=None, + cut_height=None, + top_color="k", + cmap=None, + p=0, + lw=2, + dyn_lw=True, + line_styles=None, + ax=None, + **kwargs, +): + """ + Draw a dendrogram with custom per-branch style. + line_styles: list of dicts, same length as number of merges. + Each dict can have keys like 'color', 'linewidth', 'linestyle'. + """ + + if ax is None: + fig, ax = plt.subplots(figsize=(10, 5)) + + d = dendrogram(Z, no_plot=True, **kwargs) + n_leaves = len(d["leaves"]) + + ordered_labs = None + if k is not None: + labs = fcluster(Z, t=k, criterion="maxclust") + ordered_labs = labs[d["leaves"]] + elif cut_height is not None: + labs = fcluster(Z, t=cut_height, criterion="distance") + ordered_labs = labs[d["leaves"]] + + print(labs.min(), labs.max()) + + if cmap is None: + cmap = plt.get_cmap("tab20") + + cluster_colors = {} + if ordered_labs is not None: + uniq = np.unique(ordered_labs) + if len(uniq) == 1: + cluster_colors[uniq[0]] = cmap(1) + else: + for i, u in enumerate(uniq): + cluster_colors[u] = cmap((i + 1) / (len(uniq))) + + for i, (xs, ys) in enumerate(zip(d["icoord"], d["dcoord"])): + height = max(ys) + + if height < p: + continue + # height = min(ys) + if (cut_height is not None) and (height > cut_height): + color = top_color + l_lw = lw / 2 if dyn_lw else lw + elif ordered_labs is None: + # fallback to provided style or black + color = ( + line_styles[i].get("color") + if line_styles and i < len(line_styles) and "color" in line_styles[i] + else "k" + ) + else: + # map branch x-range to leaf index range in the leaf order + left_x, right_x = min(xs), max(xs) + left_idx = int(np.clip(np.floor((left_x - 5) / 10 + 1e-9), 0, n_leaves - 1)) + right_idx = int( + np.clip(np.ceil((right_x - 5) / 10 - 1e-9), 0, n_leaves - 1) + ) + branch_labels = ordered_labs[left_idx : (right_idx + 1)] + # choose majority cluster for that branch + vals, counts = np.unique(branch_labels, return_counts=True) + maj = vals[np.argmax(counts)] + color = cluster_colors.get(maj, top_color) + l_lw = lw + + style = line_styles[i] if line_styles and i < len(line_styles) else {} + # ensure we don't pass 'color' from style (we override it) + style = {k: v for k, v in style.items() if k != "color"} + ax.plot(xs, ys, color=color, lw=l_lw, **style) + + return d, ax + + +def get_camera_pos(view="transverse"): + if (view == "transverse-vertical") or ("verti" in view): + yoffset = -15 + position = (0, yoffset, 400) + focal_point = (0, yoffset, 0) + view_up = (0.0, 0.0, 0.0) + elif (view == "transverse") or ("tra" in view): + xoffset = 8 + yoffset = -15 + position = (xoffset, yoffset, 350) + focal_point = (xoffset, yoffset, 0) + view_up = (-0.5, 0.0, 0.0) + elif (view == "sagittal-left") or ("left" in view): + yoffset = -18 + position = (-350, yoffset, 0) + focal_point = (0, yoffset, 0) + view_up = (0.0, 0.0, 1.0) + elif (view == "sagittal-right") or ("right" in view): + yoffset = -18 + position = (350, yoffset, 0) + focal_point = (0, yoffset, 0) + view_up = (0.0, 0.0, 1.0) + elif (view == "coronal-back") or ("back" in view): + zoffset = 10 + position = (0, -330, zoffset) + focal_point = (0, 0, zoffset) + view_up = (0.0, 0.0, 1.0) + elif (view == "coronal-front") or ("front" in view): + zoffset = 10 + position = (0, 330, zoffset) + focal_point = (0, 0, zoffset) + view_up = (0.0, 0.0, 1.0) + elif view == "custom": + angle = np.deg2rad(-45) # -35 # -45 + dist = 300 + posx = dist * np.sin(angle) + posy = dist * np.cos(angle) + position = (posx, posy, 80) # z=80 + # position = (-350, 350, 0) + focal_point = (30, -50, 0) + view_up = (0.0, 0.0, 1.0) + elif view == "custom2": + yoffset = -18 + zoffset = 10 + position = (-250, 250 + yoffset, zoffset) + focal_point = (0, yoffset, zoffset) + view_up = (0.0, 0.0, 1.0) + else: + raise ValueError(f"Unknown view: {view}") + + return position, focal_point, view_up + + +def get_brain_actors(opacity=0.3): + fsaverage = fetch_surf_fsaverage() + + brain_actors = [] + for surf in ["pial_left", "pial_right"]: + coords, faces = load_surf_mesh(fsaverage[surf]) + # surf_act = actor.surface(coords, faces, smooth="loop") + surf_act = actor.surface(coords, faces=faces, smooth="loop") + surf_act.GetProperty().SetOpacity(opacity) + brain_actors.append(surf_act) + + return brain_actors + + +def get_tube_actor( + tractogram, + cmap, + n_centroids=1, + linewidth=0.4, + upsample=None, + bidir_col=None, + bundle_list=None, + alpha=1, +): + if upsample is not None: + space = int(400 / (12 * upsample)) + sl_interp = [spline(sl, k=3, s=0, nest=1) for sl in tractogram.streamlines] + slines = [sl[::space] for sl in sl_interp] + else: + slines = tractogram.streamlines + + n_segments = len(slines[0]) + sline_cmap = cmap.resampled(n_segments) + + col_val = np.array( + [ + np.linspace(dir_col[0], dir_col[-1], len(sl)) + for dir_col, sl in zip(tractogram.data_per_point["dir_col"], slines) + ] + ) + + colors = np.array([sline_cmap((1 + cv) / 2) for cv in col_val]) + + if bundle_list is not None: + colors = np.repeat(bidir_col[bundle_list][:, None, :], n_segments, axis=1) + else: + if bidir_col is None: + bidir_col = (0.5, 0.5, 0.8, 1) + + bidir_col = np.array(bidir_col) + for i, col in enumerate(colors): + if np.allclose(col[0], col[-1]): + colors[i, :] = bidir_col + + if colors.ndim > 3: + colors = colors[:, :, 0] + + if alpha != 1: + colors[..., -1] = alpha + + # Add actors to the scene + # stream_actor = actor.line(streamlines, colors=np.asarray(colors, dtype=object), linewidth=2) + + return actor.streamtube( + slines, + colors=np.asarray(colors, dtype=object), + linewidth=linewidth, + ) + + +def apply_actor_parameters(tube_actor, brain_actors, gloss_brain=False): + + prop = tube_actor.GetProperty() + + prop.SetAmbient(0.4) # base light + prop.SetDiffuse(0.6) # directional light response + prop.SetSpecular(0.05) # shininess amount + prop.SetSpecularPower(5) # shininess tightness + + for act in brain_actors: + p = act.GetProperty() + p.SetLighting(True) + p.SetInterpolationToPhong() + + if gloss_brain: + p.SetAmbient(0.15) + p.SetDiffuse(0.6) + p.SetSpecular(0.3) + p.SetSpecularPower(25) + else: + p.SetAmbient(0.3) + p.SetDiffuse(0.6) + p.SetSpecular(0.01) + p.SetSpecularPower(5) + + return tube_actor, brain_actors + + +def plot_bundle_surf( + tube_actor, + brain_actors, + view=None, + axes=None, + overlay_slines=False, + scene_size=(2000, 2000), +): + + if axes is None: + fig, axes = plt.subplots(figsize=(8, 8)) + scene = window.Scene() + + # White background + scene.SetBackground((1, 1, 1)) + + tube_actor, brain_actors = apply_actor_parameters(tube_actor, brain_actors) + + for surf_act in brain_actors: + scene.add(surf_act) + + if not overlay_slines: + # scene.add(stream_actor) + scene.add(tube_actor) + + if view is not None: + position, focal_point, view_up = get_camera_pos(view=view) + else: + position = (0, 0, 350) + focal_point = (0, -15, 0) + view_up = (0.0, 0.0, 0.0) + + scene.set_camera(position=position, focal_point=focal_point, view_up=view_up) + + try: + win = window.snapshot(scene, size=scene_size, offscreen=True) + scene.clear() + scene = None + except Exception as e: + print(f"Rendering failed: {e}. Returning empty axes.") + return axes + + win = np.ascontiguousarray(win) + + alpha_mask = ((win == (255, 255, 255)).sum(axis=-1) < 3).astype(float) + win = np.concatenate([win, 255 * alpha_mask[:, :, None]], axis=-1).astype(int) + axes.imshow(win) + + if overlay_slines: + scene2 = window.Scene() + scene2.SetBackground((1, 1, 1)) + scene2.add(tube_actor) + + if view is not None: + position, focal_point, view_up = get_camera_pos(view=view) + else: + position = (0, 0, 350) + focal_point = (0, -15, 0) + view_up = (0.0, 0.0, 0.0) + + scene2.set_camera(position=position, focal_point=focal_point, view_up=view_up) + win = window.snapshot(scene2, size=scene_size, offscreen=True) + scene2.clear() + scene2 = None + win = np.ascontiguousarray(win) + + win_mask = ((win == (255, 255, 255)).sum(axis=-1) < 3).astype(float) + win = np.concatenate([win, 255 * win_mask[:, :, None]], axis=-1).astype(int) + + axes.imshow(win) + return axes + + +def plot_kde( + data, + data_range=None, + ax=None, + bw_adjust=1, + fill=False, + color="silver", + alpha=0.8, + normalize=True, + vertical=False, +): + + if ax is None: + _, ax = plt.subplots(figsize=(8, 6)) + + if data_range is None: + data_range = np.linspace(data.min(), data.max(), 100) + + kde = gaussian_kde(data, bw_method=bw_adjust) + y_val = kde(data_range) + + if normalize: + y_val = y_val / y_val.max() + + if vertical: + x_plot = y_val + y_plot = data_range + else: + x_plot = data_range + y_plot = y_val + + ax.plot(x_plot, y_plot, lw=2, color=color, alpha=alpha) + if fill: + ax.fill_between( + x_plot, y_plot, lw=2, color=color, alpha=alpha / 2, edgecolor="none" + ) + + +def plot_actors( + tube_actor, + brain_actors, + cmap="RdBu_r", + overlay_slines=True, + view="custom", + plot_cbar=False, + cbar_pos=None, + fig=None, + axes=None, + cbar_fontsize=18, +): + if axes is None: + fig, axes = plt.subplots(figsize=(8, 8)) + + axes.axis("off") + if "ortho" not in view: + axes = plot_bundle_surf( + tube_actor, + brain_actors, + view=view, + axes=axes, + overlay_slines=overlay_slines, + ) + else: + if fig is None: + raise ValueError("fig must be provided when using orthogonal views") + + gs1 = GridSpecFromSubplotSpec( + 2, 2, subplot_spec=axes.get_subplotspec(), wspace=0, hspace=0 + ) + ax_tra = fig.add_subplot(gs1[:, 0]) + b_axes = [ax_tra] + [fig.add_subplot(gs1[i, 1]) for i in range(2)] + + for ax, view in zip(b_axes, ["transverse-vertical", "back", "right"]): + scene_size = (2000, 2000) + if "tra" in view: + scene_size = (2000, 3000) + plot_bundle_surf( + tube_actor, + brain_actors, + view=view, + axes=ax, + overlay_slines=overlay_slines, + scene_size=scene_size, + ) + ax.axis("off") + + if plot_cbar: + if cbar_pos is None: + cbar_pos = [0.15, 0.15, 0.8, 0.02] + + draw_cbar( + fig, + cmap, + ax_pos=cbar_pos, + ticks=[0, 10], + labels=["Receiving", "Sending"], + fontsize=cbar_fontsize, + ) + + return axes + + +def plot_bicom_tracts( + bicom_id, + edge_clusters_mat, + labels, + scale, + cmap="RdBu_r", + atlas_dir="/Users/acionca/data/atlas_data", + n_centroids=2, + upsample=None, + brain_opacity=1, + overlay_slines=True, + linewidth=0.4, + slines_alpha=1, + bidir_col=(0.5, 0.5, 0.8, 1), + view="custom", + plot_cbar=False, + cbar_pos=None, + cbar_fontsize=18, + fig=None, + axes=None, +): + + centroid_dir = op.join( + atlas_dir, "centroids", f"scale{scale}", f"group_centroids_scale{scale}" + ) + + selected_bundles, selected_bundles_dir = bundle.get_bicom_bundles( + bicom_id, edge_clusters_mat, labels, scale=scale + ) + + centroid_tractogram = bundle.get_bundle_centroid( + centroid_dir, + scale, + selected_bundles, + selected_bundles_dir, + n_centroids=n_centroids, + ) + + if isinstance(cmap, str): + cmap = plt.get_cmap(cmap) + + brain_actors = get_brain_actors(opacity=brain_opacity) + tube_actor = get_tube_actor( + centroid_tractogram, + cmap, + n_centroids=n_centroids, + upsample=upsample, + linewidth=linewidth, + alpha=slines_alpha, + bidir_col=bidir_col, + ) + + axes = plot_actors( + tube_actor, + brain_actors, + cmap=cmap, + overlay_slines=overlay_slines, + view=view, + plot_cbar=plot_cbar, + cbar_pos=cbar_pos, + cbar_fontsize=cbar_fontsize, + fig=fig, + axes=axes, + ) + + return axes + + +def plot_trk( + path_to_trk, + cmap="RdBu_r", + n_slines=None, + upsample=None, + brain_opacity=1, + overlay_slines=True, + linewidth=0.4, + slines_alpha=1, + trk_color_list=None, + view="custom", + plot_cbar=False, + fig=None, + axes=None, +): + if isinstance(path_to_trk, list): + print(f"Merging {len(path_to_trk)} tractogram files...") + all_sls = [] + bundle_index = [] + n_segments = 20 + for i, p in enumerate(path_to_trk): + trk = nib.streamlines.load(p) + + # if i == 0: + # n_segments = len(trk.streamlines[0]) + + if n_slines is not None: + rng = np.random.default_rng(seed=42) + sel_sls = select_random_set_of_streamlines( + trk.streamlines, n_slines, rng=rng + ) + else: + sel_sls = trk.streamlines + + for sl in sel_sls: + # all_sls.append(sl) + # if len(sl) == n_segments: + all_sls.append(np.array(sl)) + bundle_index.append(i) + + all_sls = set_number_of_points(all_sls, nb_points=20) + centroid_trk = nib.streamlines.Tractogram(all_sls, affine_to_rasmm=np.eye(4)) + + # n_segments = len(centroid_trk.streamlines[0]) + + dircol = [np.zeros(len(sl)) for sl in centroid_trk.streamlines] + centroid_trk.data_per_point = { + "dir_col": dircol + # (len(centroid_trk.streamlines), n_segments), dtype=float) + } + else: + centroid_trk = nib.streamlines.load(path_to_trk) + slines = centroid_trk.streamlines + n_segments = len(slines[0]) + + centroid_trk.data_per_point = { + "dir_col": np.zeros( + (centroid_trk.streamlines._data.shape[0], n_segments), dtype=float + ) + } + bundle_index = None + + tube_actor = get_tube_actor( + centroid_trk, + cmap=cmap, + upsample=upsample, + linewidth=linewidth, + alpha=slines_alpha, + bidir_col=trk_color_list, + bundle_list=bundle_index, + ) + brain_actors = get_brain_actors(opacity=brain_opacity) + + axes = plot_actors( + tube_actor, + brain_actors, + cmap=cmap, + overlay_slines=overlay_slines, + view=view, + plot_cbar=plot_cbar, + fig=fig, + axes=axes, + ) + return axes + + +def get_loo_curves(e_ratio, f_ratio, x_plot=None): + if x_plot is None: + x_plot = np.linspace(0, 1, 100) + + all_yvals = [] + all_corrs = [] + for k, _ in enumerate(f_ratio): + loo_mask = ~np.eye(len(f_ratio), dtype=bool)[k] + ftract_loo = f_ratio[loo_mask] + ec_loo = e_ratio[loo_mask] + + # all_corrs.append(np.corrcoef(ec_loo, ftract_loo)[0, 1]) + all_corrs.append(spearmanr(ec_loo, ftract_loo)[0]) + + reg = LinearRegression().fit(ec_loo.reshape(-1, 1), ftract_loo.reshape(-1, 1)) + reg.score(ec_loo.reshape(-1, 1), ftract_loo.reshape(-1, 1)) + + y_vals = reg.intercept_[0] + reg.coef_[0] * x_plot + all_yvals.append(y_vals) + + return np.array(all_yvals), np.array(all_corrs) + + +def plot_yeo_summary( + subnet_mat, + yeo_labels, + cmap, + fig=None, + axes=None, + label_space=1.2, + width_mod=4, + r_lab_only=False, + l_lab_only=False, + manual_arrows=False, + net_alpha=False, +): + angles_raw = np.linspace(-np.pi / 4, np.pi / 4, len(yeo_labels)) + all_angles = np.concatenate([np.pi + angles_raw, -angles_raw]) + + nodal_pos = np.array([(np.cos(angle), np.sin(angle)) for angle in all_angles]) + + zero_block = np.zeros((len(yeo_labels), len(yeo_labels))) + bipartite_mat = np.block([[zero_block, subnet_mat], [zero_block, zero_block]]) + + bipartite_graph = nx.DiGraph(bipartite_mat) + edges = bipartite_graph.edges() + + strengths = np.array([bipartite_graph[u][v]["weight"] for u, v in edges]) + strengths /= strengths.max() + + if axes is None: + fig, axes = plt.subplots(figsize=(10, 8)) + + if manual_arrows: + for e_i, e in enumerate(edges): + arrow = FancyArrowPatch( + nodal_pos[e[0]], + nodal_pos[e[1]] * np.array([0.9, 1]), + mutation_scale=3, + facecolor="k", + edgecolor="none", + # mutation_scale=10, facecolor="tab:purple", edgecolor="none", + arrowstyle=ArrowStyle( + "Simple", + tail_width=width_mod * strengths[e_i], + head_width=1 + 2 * width_mod * strengths[e_i], + head_length=2 + strengths[e_i], + ), + alpha=strengths[e_i], + connectionstyle="arc3", + ) + axes.add_patch(arrow) + else: + nx.draw_networkx_edges( + bipartite_graph, + pos={i: nodal_pos[i] for i in range(len(nodal_pos))}, + ax=axes, + edge_color="k", + alpha=strengths, + # arrowsize=10, + arrowsize=20, + width=width_mod * strengths, + ) + + axes.scatter( + nodal_pos[:, 0], + nodal_pos[:, 1], + s=100, + color="w", + edgecolors="none", + ) + + if net_alpha: + norm_send = subnet_mat.sum(axis=1) + norm_recv = subnet_mat.sum(axis=0) + norm_send /= norm_send.max() + norm_recv /= norm_recv.max() + + node_alpha = np.concatenate([norm_send, norm_recv]) + node_alpha = node_alpha / node_alpha.max() + node_alpha = 0.5 + 0.5 * node_alpha + else: + node_alpha = 1 + + axes.scatter( + nodal_pos[:, 0], + nodal_pos[:, 1], + s=100, + c=np.concatenate([norm_send, -norm_recv]), + cmap=cmap, + # color="k", + edgecolors="none", + alpha=node_alpha, + ) + + axes.set_xlim(-2.5, 1.5) + if not r_lab_only: + for i, net in enumerate(yeo_labels): + axes.text( + label_space * nodal_pos[i, 0], + nodal_pos[i, 1], + net, + fontsize=12, + ha="right", + va="center", + ) + else: + # axes.set_xlim(-1.2, 1.5) + axes.set_xlim(-1.2, 3) + + if not l_lab_only: + for i, net in enumerate(yeo_labels): + axes.text( + label_space * nodal_pos[len(yeo_labels) + i, 0], + nodal_pos[len(yeo_labels) + i, 1], + net, + fontsize=12, + ha="left", + va="center", + ) + + # axes.set_ylim(-1.1, 0.9) + axes.set_ylim(-1.15, 0.9) + + return axes + + +def get_2d_colormap(n=256, center_strength=0.5, white_val=1): + c_send_uni = np.array([240, 50, 50]) / 255 + c_send_trans = np.array([240, 240, 50]) / 255 + c_recv_uni = np.array([80, 80, 240]) / 255 + c_recv_trans = np.array([80, 240, 80]) / 255 + + c_send_uni = np.array(to_rgb("#F8C768")) + c_send_trans = np.array(to_rgb("#A50721")) + c_recv_uni = np.array(to_rgb("#7DD0ED")) + c_recv_trans = np.array(to_rgb("#19367E")) + + x = np.linspace(0, 1, n) # send → receive + y = np.linspace(0, 1, n) # unimodal → transmodal + + WHITE = np.array([1, 1, 1]) * white_val + + cmap = np.zeros((n, n, 3)) + + for i, yi in enumerate(y): + # interpolate vertically (unimodal → transmodal) + left = (1 - yi) * c_recv_trans + yi * c_recv_uni + right = (1 - yi) * c_send_trans + yi * c_send_uni + + # interpolate horizontally (send → receive) + for j, xj in enumerate(x): + base_color = (1 - xj) * left + xj * right + + # distance to center (0.5, 0.5) + # d = np.sqrt((xj - 0.5) ** 2 + (yi - 0.5) ** 2) + # d /= np.sqrt(2 * (0.5**2)) # normalize to [0,1] + d = np.abs(xj - 0.5) * 2 + + # nonlinear emphasis of center + w = d**center_strength + + cmap[i, j] = (1 - w) * WHITE + w * base_color + # cmap[i, j] = (1 - xj) * left + xj * right + + return cmap + + +def get_2d_color(send, rec, cmap2d): + + send_norm = (send - send.min()) / (send.max() - send.min()) + recv_norm = (rec - rec.min()) / (rec.max() - rec.min()) + + n = cmap2d.shape[0] + i = (send_norm * (n - 1)).astype(int) + j = (recv_norm * (n - 1)).astype(int) + return cmap2d[j, i] + + +def plot_node_summary( + e_clust_mask, + node_pos, + gradient, + fig=None, + axes=None, + label_space=1.2, + width_mod=4, + r_lab_only=False, + l_lab_only=False, + manual_arrows=False, + net_alpha=False, +): + n_nodes = e_clust_mask.shape[0] + angles_raw = np.linspace(-np.pi / 4, np.pi / 4, n_nodes) + all_angles = np.concatenate([np.pi + angles_raw, -angles_raw]) + + nodal_pos = np.array([(np.cos(angle), np.sin(angle)) for angle in all_angles]) + + nodal_pos = node_pos.copy() # [:, [1, 2]] + + # zero_block = np.zeros((n_nodes, n_nodes)) + # bipartite_mat = np.block([[zero_block, e_clust_mask], [zero_block, zero_block]]) + + # bipartite_graph = nx.DiGraph(bipartite_mat) + bipartite_graph = nx.DiGraph(e_clust_mask) + edges = bipartite_graph.edges() + + strengths = np.array([e_clust_mask[u, v] for u, v in edges]) + strengths /= strengths.max() + + if axes is None: + fig, axes = plt.subplots(figsize=(10, 8)) + + # if manual_arrows: + # for e_i, e in enumerate(edges): + # arrow = FancyArrowPatch( + # nodal_pos[e[0]], + # nodal_pos[e[1]], # * np.array([0.9, 1]), + # mutation_scale=1, + # facecolor="k", + # edgecolor="none", + # # mutation_scale=10, facecolor="tab:purple", edgecolor="none", + # arrowstyle=ArrowStyle( + # "Simple", + # tail_width=width_mod * strengths[e_i], + # head_width=5 + 2 * width_mod * strengths[e_i], + # head_length=5 + strengths[e_i], + # ), + # # alpha=strengths[e_i], + # alpha=0.2 + 0.2 * strengths[e_i], + # connectionstyle="arc3", + # ) + # axes.add_patch(arrow) + # else: + # nx.draw_networkx_edges( + # bipartite_graph, + # pos={i: nodal_pos[i] for i in range(len(nodal_pos))}, + # ax=axes, + # edge_color="k", + # alpha=strengths, + # # arrowsize=10, + # arrowsize=10, + # width=width_mod * strengths, + # ) + + norm_send = e_clust_mask.sum(axis=1) + norm_recv = e_clust_mask.sum(axis=0) + norm_send = norm_send / norm_send.max() + norm_recv = norm_recv / norm_recv.max() + + if net_alpha: + # node_alpha = np.concatenate([norm_send, norm_recv]) + node_alpha = (norm_send + norm_recv) / 2 + node_alpha = node_alpha / node_alpha.max() + + # node_alpha = 0.2 + 0.8 * node_alpha + else: + node_alpha = 1 + + sort_by_alpha = np.argsort(node_alpha) + + node_s = 20 + 180 * node_alpha + axes.scatter( + nodal_pos[:, 0], + nodal_pos[:, 1], + s=node_s, + color="w", + edgecolors="k", + lw=0.5, + alpha=0.5 + 0.5 * (node_alpha > 0), + ) + + # node_color = np.concatenate([norm_send, -norm_recv]) + node_color = norm_send - norm_recv + + node_color = nodal_pos[:, 0] + + cmap2d = get_2d_colormap() + node_color = get_2d_color(norm_send - norm_recv, gradient, cmap2d) + # node_color = gradient / gradient.max() + + axes.scatter( + nodal_pos[sort_by_alpha, 0], + nodal_pos[sort_by_alpha, 1], + s=node_s[sort_by_alpha], + c=node_color[sort_by_alpha], + edgecolors="k", + lw=0.5, + # cmap="RdBu_r", + # cmap="turbo_r", + alpha=(node_alpha[sort_by_alpha] > 0).astype(float), + # alpha=node_alpha[sort_by_alpha], + ) + + # print(axes.get_xlim()) + if axes.get_xlim()[0] < -90: + axes.set_xlim(-110, 80) + else: + axes.set_xlim(-80, 110) + axes.set_ylim(-80, 80) + + return axes + + +def plot_gradient_legend( + axes=None, aspect="equal", labels_out=False, arrowscale=30, label_fs=16 +): + + if axes is None: + fig, axes = plt.subplots(figsize=(5, 5)) + + mid_color = 255 / 2 + all_a_pos = [ + [[100, mid_color], [255, mid_color]], + [[200, mid_color], [0, mid_color]], + [[mid_color, 100], [mid_color, 255]], + [[mid_color, 200], [mid_color, 0]], + ] + for a_pos in all_a_pos: + arrow = FancyArrowPatch( + a_pos[0], + a_pos[1], + mutation_scale=arrowscale, + facecolor="k", + edgecolor="none", + arrowstyle="simple", + ) + axes.add_patch(arrow) + + cmap2d = get_2d_colormap() + axes.imshow(cmap2d, origin="lower", aspect=aspect) + + if labels_out: + axes.text( + 0.5, + 1.2, + "Node Colors: Gradient Value", + fontsize=16, + ha="center", + va="bottom", + transform=axes.transAxes, + ) + + axes.text( + 0.5, + -0.03, + "Transmodal", + fontsize=label_fs, + ha="center", + va="top", + transform=axes.transAxes, + ) + axes.text( + 0.5, + 1, + "Unimodal", + fontsize=label_fs, + ha="center", + va="bottom", + transform=axes.transAxes, + ) + axes.text( + -0.02, + 0.5, + "Receiving", + fontsize=label_fs, + ha="right", + va="center", + transform=axes.transAxes, + ) + axes.text( + 1.01, + 0.5, + "Sending", + fontsize=label_fs, + ha="left", + va="center", + transform=axes.transAxes, + ) + else: + axes.text(110, 5, "Transmodal", fontsize=label_fs, ha="right", va="bottom") + axes.text(140, 250, "Unimodal", fontsize=label_fs, ha="left", va="top") + axes.text(10, 110, "Receiving", fontsize=label_fs, ha="left", va="top") + axes.text(240, 140, "Sending", fontsize=label_fs, ha="right", va="bottom") + + # axes.set_xlabel("Sending → Receiving") + # axes.set_ylabel("Unimodal → Transmodal") + axes.set_xticks([]) + axes.set_yticks([]) + # axes.axis("off") diff --git a/bimodularity/bundle.py b/bimodularity/bundle.py new file mode 100644 index 0000000..f8e5732 --- /dev/null +++ b/bimodularity/bundle.py @@ -0,0 +1,525 @@ +import os +import os.path as op + +import pandas as pd +import numpy as np + +import h5py +import nibabel as nib + +from dipy.tracking.streamline import set_number_of_points +from dipy.tracking.distances import bundles_distances_mdf + +from tqdm.notebook import tqdm + + +def fix_thalamus( + labels, + matrix=None, + atlas_data=None, + pos=None, + timeseries=None, + use_max=False, +): + + # Average the Thalamus SubRegions + is_r_thal = ["thal-rh-" in lab for lab in labels] + is_l_thal = ["thal-lh-" in lab for lab in labels] + + r_thal_idx = np.where(is_r_thal)[0] + l_thal_idx = np.where(is_l_thal)[0] + + remove_dupl = np.logical_or(is_r_thal, is_l_thal) + remove_dupl[r_thal_idx.min()] = False + remove_dupl[l_thal_idx.min()] = False + + new_labels = labels.copy() + new_labels[r_thal_idx] = "subc-rh-thalamus" + new_labels[l_thal_idx] = "subc-lh-thalamus" + new_labels = new_labels[~remove_dupl] + + if pos is None and matrix is None and atlas_data is None and timeseries is None: + return new_labels + + if pos is not None: + new_pos = pos.copy() + new_pos[r_thal_idx] = pos[r_thal_idx].mean(axis=0, keepdims=True) + new_pos[l_thal_idx] = pos[l_thal_idx].mean(axis=0, keepdims=True) + new_pos = new_pos[~remove_dupl] + + if matrix is None and atlas_data is None: + return new_labels, new_pos + + if matrix is not None: + new_matrix = matrix.copy() + + if use_max: + new_matrix[is_r_thal, :] = matrix[is_r_thal, :].max(axis=0, keepdims=True) + new_matrix[is_l_thal, :] = matrix[is_l_thal, :].max(axis=0, keepdims=True) + new_matrix[:, is_r_thal] = matrix[:, is_r_thal].max(axis=1, keepdims=True) + new_matrix[:, is_l_thal] = matrix[:, is_l_thal].max(axis=1, keepdims=True) + else: + new_matrix[is_r_thal, :] = matrix[is_r_thal, :].mean(axis=0, keepdims=True) + new_matrix[is_l_thal, :] = matrix[is_l_thal, :].mean(axis=0, keepdims=True) + new_matrix[:, is_r_thal] = matrix[:, is_r_thal].mean(axis=1, keepdims=True) + new_matrix[:, is_l_thal] = matrix[:, is_l_thal].mean(axis=1, keepdims=True) + + new_matrix = matrix[~remove_dupl, :][:, ~remove_dupl] + if atlas_data is None: + return new_labels, new_matrix + + if atlas_data is not None: + new_atlas_data = atlas_data.copy() + + for i in r_thal_idx: + new_atlas_data[atlas_data == i + 1] = r_thal_idx.min() + 1 + + r_remove = len(r_thal_idx) - 1 + new_atlas_data[new_atlas_data > r_thal_idx.min() + 1] -= r_remove + for i in l_thal_idx: + new_atlas_data[atlas_data == i + 1] = l_thal_idx.min() + 1 - r_remove + new_atlas_data[new_atlas_data > l_thal_idx.min() + 1] -= len(l_thal_idx) - 1 + if matrix is None: + return new_labels, new_atlas_data, new_pos + if pos is None: + return new_labels, new_matrix, new_atlas_data + + if timeseries is not None: + new_ts = timeseries.copy() + new_ts[is_r_thal, :] = timeseries[is_r_thal, :].mean(axis=0, keepdims=True) + new_ts[is_l_thal, :] = timeseries[is_l_thal, :].mean(axis=0, keepdims=True) + + new_ts = timeseries[~remove_dupl] + return new_labels, new_ts + + return new_labels, new_matrix, new_atlas_data, new_pos + + +def get_bundle_data( + path_to_data, path_to_ressources, scale=1, path_to_bundles="./data/bundles" +): + b_atlas = op.join(path_to_data, "atlas_data", "fiber_atlas") + + # connFilename = op.join(path_to_bundles, f'wm.connatlas.scale{scale}.h5') + connFilename = op.join(b_atlas, "probconnatlas", f"wm.connatlas.scale{scale}.h5") + hf = h5py.File(connFilename, "r") + atlas_dict = hf.get("atlas") + + # b_count_img = nib.load(op.join(path_to_bundles, f"wmatlas.scale{scale}.bundcount.nii.gz")) + b_count_img = nib.load( + op.join(b_atlas, f"bundcount_and_tdi", f"wmatlas.scale{scale}.bundcount.nii.gz") + ) + + # gm_rois = nib.load(op.join(path_to_ressources, f"roi_atlas-ftract-scale{scale}-GM.nii.gz")) + gm_rois = nib.load( + op.join(path_to_ressources, f"Laus2018_roi_atlas-ftract-scale{scale}-GM.nii.gz") + ) + gm_rois_array = gm_rois.get_fdata().astype(int) + + return atlas_dict, b_count_img, gm_rois_array + + +def bundle_bicom( + edge_clusters_mat, + c_out, + c_in, + adj_matrix, + b_count_img, + gm_rois_array, + atlas_dict, + prob=True, + weight=True, + bundle_only=False, +): + n_clusters = edge_clusters_mat.max() + + match_indexes = np.arange(c_out.shape[1]) + mni_array = np.zeros( + (b_count_img.shape[0], b_count_img.shape[1], b_count_img.shape[2], n_clusters), + dtype=float, + ) + matching_str = (match_indexes + 1).astype(str) + + if bundle_only: + mni_send_receive = None + else: + mni_send_receive = np.zeros( + ( + b_count_img.shape[0], + b_count_img.shape[1], + b_count_img.shape[2], + n_clusters, + 2, + ), + dtype=float, + ) + + for k in range(n_clusters): + cluster_edges_ids = np.argwhere(edge_clusters_mat == k + 1) + + idx0, idx1 = cluster_edges_ids[:, 0], cluster_edges_ids[:, 1] + mask_flip = match_indexes[idx0] > match_indexes[idx1] + cluster_edges_ids[mask_flip] = np.stack( + [idx1[mask_flip], idx0[mask_flip]], axis=1 + ) + + mask_valid = matching_str[cluster_edges_ids[:, 0]] != "0" + if not all(mask_valid): + print( + f"Warning: cluster {k+1} has {np.sum(~mask_valid)} edges with 0 index, ignored." + ) + b_ids = ( + matching_str[cluster_edges_ids[:, 0]] + + "_" + + matching_str[cluster_edges_ids[:, 1]] + ) + + cluster_edges_ids = cluster_edges_ids[mask_valid] + + if not bundle_only: + roi_val = c_out[k, i].copy() + for i in np.where(c_out[k] > 0)[0]: + mni_send_receive[gm_rois_array == i + 1, k, 0] = roi_val + roi_val = c_in[k, i].copy() + for i in np.where(c_in[k] > 0)[0]: + mni_send_receive[gm_rois_array == i + 1, k, 1] = roi_val + + for edge, bundle_id in zip(cluster_edges_ids, b_ids): + + fill = 1.0 + if prob: + fill = atlas_dict.get(bundle_id)[:, -1].astype(float) + + if weight: + fill *= adj_matrix[edge[0], edge[1]] + + coords = atlas_dict.get(bundle_id)[:, :3].T + mni_array[coords[0], coords[1], coords[2], k] += fill + + mni_array = mni_array / mni_array.max(axis=(0, 1, 2), keepdims=True) + + return mni_array, mni_send_receive + + +def get_thalamus_bundles_info(labels, scale): + if scale != 2: + raise NotImplementedError( + "Thalamus bundles info (and centroid data) is only implemented for scale 2" + ) + + thal_ids = np.array(np.where(["thalamus" in l for l in labels])[0]) + 1 + n_thal_sub = 7 + + thal_ids_scale = {2: [np.arange(58, 65), np.arange(128, 135)]} + thal_ids_bundles = thal_ids_scale[scale] + + return thal_ids, thal_ids_bundles, n_thal_sub + + +def get_bicom_bundles(bicom_id, edge_clusters_mat, labels, scale=2): + # print(f"Bicom {bicom_id} selected") + + thal_ids, thal_ids_bundles, n_thal_sub = get_thalamus_bundles_info(labels, scale) + + e_array = np.array(np.where(edge_clusters_mat == bicom_id)) + 1 + + selected_bundles = [] + selected_bundles_dir = [] + for e in e_array.T: + + s_r_list = [] + for s_r in e: + if s_r < thal_ids[0]: + s_r_list.append([s_r]) + elif s_r == thal_ids[0]: + s_r_list.append(thal_ids_bundles[0]) + elif s_r < thal_ids[1]: + s_r_list.append([s_r + n_thal_sub - 1]) + elif s_r == thal_ids[1]: + s_r_list.append(thal_ids_bundles[1]) + else: + s_r_list.append([s_r + n_thal_sub * 2 - 2]) + + # fixed_e = [f"{s}_{r}" for s in s_r_list[0] for r in s_r_list[1]] + fixed_e = [[s, r] for s in s_r_list[0] for r in s_r_list[1]] + dir_e = [s > r for s, r in fixed_e] + + fixed_e = [ + f"{s}_{r}" if not d else f"{r}_{s}" for (s, r), d in zip(fixed_e, dir_e) + ] + + selected_bundles.extend(fixed_e) + selected_bundles_dir.extend(dir_e) + + selected_bundles_dir = np.array(selected_bundles_dir) + selected_bundles = np.array(selected_bundles) + return selected_bundles, selected_bundles_dir + + +def get_bundle_centroid( + centroid_dir, scale, selected_bundles, selected_bundles_dir, n_centroids=2 +): + # Location of the atlas + # group_bund_cent = "/media/COSAS/Yasser/Work2Do/Connectome_Atlas/Results/Concatenated/scale2/group_centroids/" + # centroid_dir = ( + # "/Users/acionca/data/atlas_data/centroids/scale2/group_centroids_scale2" + # ) + + h5_centroids_file = os.path.join( + centroid_dir, f"wm.connatlas.scale{scale}.centroids.h5" + ) + + # Reading the HDF5 file + hf = h5py.File(h5_centroids_file, "r") + bundles = list(hf.get("centroids").keys()) + + # Creating the new h5 file + # tempVar = hf.get("header/affine") + # affine = np.array(tempVar) + # print("Affine:", affine) + + # Select only the selected bundles + # bundles = [b for b in bundles if b in selected_bundles] + bundles_dir = [ + d for b, d in zip(selected_bundles, selected_bundles_dir) if b in bundles + ] + bundles = [b for b in selected_bundles if b in bundles] + + # print( + # f"Plotting {len(bundles)} bundles out of {len(selected_bundles)} selected bundles !" + # ) + + stl_coord_list = [] + stl_bund_id = [] + stl_dir_list = [] + + already_seen = [] + + # n_bidir = 0 + for bund_id, (bund, inv_dir) in enumerate(zip(bundles, bundles_dir)): + # Read the group data + data = hf.get("centroids/" + bund) + streamlines_matrix = np.array(data) + + sl_coords = [] + sl_id = [] + sl_dir = [] + + # Handling bidirectional bundles + if bund in already_seen: + where = np.where(np.array(already_seen) == bund)[0][0] + stl_dir_list[n_centroids * where : n_centroids * (where + 1)] = [ + np.zeros_like(d) + for d in stl_dir_list[n_centroids * where : n_centroids * (where + 1)] + ] + # n_bidir += 1 + continue + + # Do a loop along the streamlines + stl_ids = np.unique(streamlines_matrix[:, 3]) + for stl_id in stl_ids: + ind = streamlines_matrix[:, 3] == stl_id + stl_coord = streamlines_matrix[ind, :3] + stl_send = streamlines_matrix[ind, 4] + stl_rec = streamlines_matrix[ind, 5] + + # Append coordinates + sl_coords.append(stl_coord) + + # For data_per_point, each streamline needs its own array + # Reshape to (n_points, 1) for TRK format + sl_id.append(np.ones((len(stl_coord), 1), dtype=np.float32) * bund_id) + # sl_send.append(stl_send.reshape(-1, 1).astype(np.float32)) + # sl_rec.append(stl_rec.reshape(-1, 1).astype(np.float32)) + + if inv_dir: + dir = stl_rec.reshape(-1, 1).astype(np.float32) + else: + dir = stl_send.reshape(-1, 1).astype(np.float32) + + if bund in already_seen: + print("THIS SHOULD NEVER HAPPEN") + dir = np.zeros_like(dir) + + sl_dir.append(dir) + + # sl_dir.append(stl_rec.reshape(-1, 1).astype(np.float32)) + + # # Append coordinates + # stl_coord_list.append(stl_coord) + + # # For data_per_point, each streamline needs its own array + # # Reshape to (n_points, 1) for TRK format + # stl_bund_id.append(np.ones((len(stl_coord), 1), dtype=np.float32) * bund_id) + # stl_send_list.append(stl_send.reshape(-1, 1).astype(np.float32)) + # stl_rec_list.append(stl_rec.reshape(-1, 1).astype(np.float32)) + + mean_sl = np.median(sl_coords, axis=0) + + # if n_centroids == 1: + # stl_coord_list.extend([mean_sl]) + # stl_bund_id.extend([(np.ones(len(mean_sl)) * bund_id).reshape(-1, 1)]) + # stl_dir_list.extend(np.linspace(-1, 1, len(mean_sl), endpoint=True).reshape(-1, 1)) + + d_mat = np.pow(np.array(sl_coords) - mean_sl, 2).sum(axis=(1, 2)) + kept_sl = np.argsort(d_mat)[:n_centroids] + + stl_coord_list.extend(np.array(sl_coords)[kept_sl]) + stl_bund_id.extend(np.array(sl_id)[kept_sl]) + stl_dir_list.extend(np.array(sl_dir)[kept_sl]) + + already_seen.append(bund) + + # print(f"Number of bidirectional bundles found: {n_bidir} (out of {len(bundles)})") + + # Close the HDF5 file + hf.close() + + # Create tractogram with the affine matrix + centroid_tractogram = nib.streamlines.Tractogram( + stl_coord_list, affine_to_rasmm=np.eye(4) + ) + + # Add data per_point to the tractogram + centroid_tractogram.data_per_point["bundle_id"] = stl_bund_id + centroid_tractogram.data_per_point["dir_col"] = stl_dir_list + + # centroid_file = os.path.join( + # centroid_dir, + # f"saved_centroids-scale{scale}", + # f"wm.connatlas.scale{scale}.bicom{selected_bicom}of{edge_clusters_mat.max()}.trk", + # ) + # os.makedirs(os.path.dirname(centroid_file), exist_ok=True) + # Save with a reference image if available, or just with the tractogram + # nib.streamlines.save( + # centroid_tractogram, + # centroid_file, + # ) + + return centroid_tractogram + + +path_to_data = "/Users/acionca/data" +path_to_bundles = "./data/bundles" +b_atlas = op.join(path_to_data, "atlas_data", "fiber_atlas") + + +def get_edge_to_bundle( + graph: np.ndarray, scale: str, labels: pd.DataFrame, overlap_thresh: float = 0.1 +): + # connFilename = op.join(path_to_bundles, f'wm.connatlas.scale{scale}.h5') + connFilename = op.join(b_atlas, "probconnatlas", f"wm.connatlas.scale{scale}.h5") + hf = h5py.File(connFilename, "r") + atlas_dict = hf.get("atlas") + atlas_list = list(atlas_dict.keys()) + + # b_count_img = nib.load(op.join(path_to_bundles, f"wmatlas.scale{scale}.bundcount.nii.gz")) + b_count_img = nib.load( + op.join(b_atlas, f"bundcount_and_tdi", f"wmatlas.scale{scale}.bundcount.nii.gz") + ) + + # Loading anatomical bundle atlas + path_to_a_bundles = "/Users/acionca/data/atlas_SCIL/atlas" + + bundle_fname = "probability_maps_all_0.1.nii.gz" + a_bundles = nib.load(op.join(path_to_a_bundles, bundle_fname)) + a_bundles_data = a_bundles.get_fdata() + a_bundles_labels = pd.read_csv(op.join(path_to_a_bundles, "bundle_names.csv")) + a_bundles_labels = a_bundles_labels.rename(columns={"Unnamed: 0": "BundleNum"}) + a_bundles_labels["Both"] = ( + a_bundles_labels["BundleNum"].astype(str) + "_" + a_bundles_labels["BundleName"] + ) + + b_id_mat = np.zeros_like(graph, dtype=int) + b_id_mat[graph > 0] = np.arange(1, np.sum(graph > 0) + 1) + + edge_to_bundle = np.zeros((b_id_mat.max(), a_bundles_data.shape[-1]), dtype=float) + a_masks = np.zeros( + ( + a_bundles_data.shape[-1], + a_bundles_data.shape[0] * a_bundles_data.shape[1] * a_bundles_data.shape[2], + ), + dtype=int, + ) + + for anat_i in range(a_bundles_data.shape[-1]): + a_masks[anat_i] = ( + (a_bundles_data[:, :, :, anat_i] > overlap_thresh).astype(int).flatten() + ) + + print(f"Estimatinge edge to bundle overlap ...") + for e_id in tqdm(range(b_id_mat.max())): + b, _ = get_bicom_bundles(e_id + 1, b_id_mat, labels) + + mni_array = np.zeros( + (b_count_img.shape[0], b_count_img.shape[1], b_count_img.shape[2]), + dtype=float, + ) + + for b_i in b: + if b_i in atlas_list: + fill = atlas_dict[b_i][:, -1].astype(float) + coords = atlas_dict[b_i][:, :3].T + mni_array[coords[0], coords[1], coords[2]] += fill + + mni_array = ( + (mni_array / np.max(mni_array) > overlap_thresh).astype(int).flatten() + ) + intersect = a_masks @ mni_array + + edge_to_bundle[e_id] = intersect / np.sum(mni_array) + + return np.nan_to_num(edge_to_bundle) + + +def compute_edge_to_bundle_distance( + graph, + labels, + scale, + path_to_edge_centroids, + path_to_atlas_centroids, + a_bundles_labels=None, + edge_n_points=12, +): + if a_bundles_labels is None: + a_bundles_labels = pd.read_csv( + op.join(path_to_atlas_centroids, "bundle_names.csv") + ) + a_bundles_labels = a_bundles_labels.rename(columns={"Unnamed: 0": "BundleNum"}) + + all_a_cent = [] + for a_i, a_name in enumerate(a_bundles_labels.BundleName): + # print(a_i, a_name) + b_cent_fname = op.join( + path_to_atlas_centroids, "centroids", f"{a_name}_centroid.trk" + ) + a_slines = nib.streamlines.load(b_cent_fname).streamlines + a_slines = set_number_of_points(a_slines, nb_points=edge_n_points) + all_a_cent.append(a_slines) + + b_id_mat = np.zeros_like(graph, dtype=int) + b_id_mat[graph > 0] = np.arange(1, np.sum(graph > 0) + 1) + + edge_to_bundle_Bmdf = np.zeros((np.sum(graph > 0), len(all_a_cent))) + all_e_cent = [] + for b_id in tqdm(np.arange(1, np.sum(graph > 0) + 1)): + selected_bundles, selected_bundles_dir = get_bicom_bundles( + b_id, b_id_mat, labels, scale=scale + ) + tract = get_bundle_centroid( + path_to_edge_centroids, + scale, + selected_bundles=selected_bundles, + selected_bundles_dir=selected_bundles_dir, + n_centroids=1, + ) + + e_cent = tract.streamlines + + for a_i, a_cent in enumerate(all_a_cent): + dist = bundles_distances_mdf(a_cent, e_cent) + edge_to_bundle_Bmdf[b_id - 1, a_i] = dist.min(axis=1).mean() + + edge_to_bundle_Bmdf = 1 / edge_to_bundle_Bmdf + + return edge_to_bundle_Bmdf diff --git a/bimodularity/clustering.py b/bimodularity/clustering.py new file mode 100644 index 0000000..22eaef9 --- /dev/null +++ b/bimodularity/clustering.py @@ -0,0 +1,247 @@ +import numpy as np + +from tqdm.notebook import tqdm + +from sklearn.cluster import KMeans +from scipy.optimize import linear_sum_assignment + +from joblib import Parallel, delayed + +from dgsp import modularity_matrix, sorted_SVD + + +def get_op_SVD(adj, operator="modularity", norm=False): + if "mod" in operator: + op_mat = modularity_matrix(adj) + elif "lap" in operator: + op_mat = np.diag(adj.sum(axis=1)) - adj + if norm: + op_mat = op_mat / adj.sum(axis=1) + elif "adj" in operator: + op_mat = adj + + U, S, Vh = sorted_SVD(op_mat) + V = Vh.T + + if "lap" in operator: + U = np.flip(U, axis=1) + S = np.flip(S) + V = np.flip(V, axis=1) + + return U, S, V + + +def get_recon_mat(adj, comp_range, operator="modularity", **kwargs): + U, _, V = get_op_SVD(adj, operator=operator, **kwargs) + + uk = U[:, comp_range[0] : comp_range[1]] + vk = V[:, comp_range[0] : comp_range[1]] + + # Project and reconstruct + C_mat = np.block([[uk, np.zeros_like(vk)], [np.zeros_like(uk), vk]]) + C_pinv = np.linalg.pinv(C_mat) + + rec_mat = C_mat @ C_pinv + + return rec_mat + + +def edge_signal_product( + adj, x_concat, comp_range, operator="modularity", sqrt=False, **kwargs +): + n_nodes = adj.shape[0] + if "naive" in operator: + rec_mat = np.eye(2 * len(adj)) + else: + rec_mat = get_recon_mat(adj, comp_range, operator=operator, **kwargs) + + C_rec = rec_mat @ x_concat.T + + # Outer product and edge masking + # outer1 = np.array([np.outer(rec[:n_nodes], rec[n_nodes:]) for rec in C_rec.T]) + # edge_assignments_vec = outer[..., adj != 0] + outer = C_rec[:n_nodes, None, :] * C_rec[None, n_nodes:, :] + + if sqrt: + outer = np.sign(outer) * np.sqrt(np.abs(outer)) + edge_assignments_vec = outer[adj != 0].T + + return edge_assignments_vec + + +def norm_clustering(x_proj, k_clust, norm=True): + + norm_val = 1 + if norm: + norm_val = np.linalg.norm(x_proj, axis=1)[:, None] + + kmeans = KMeans(n_clusters=k_clust).fit(x_proj / norm_val) + + return kmeans.labels_, kmeans.cluster_centers_ + + +def prepare_benchmark( + graph, + x_test, + x_retest, + all_comps=np.arange(2, 10, 1), + all_operators=["modularity", "laplacian"], + start_comp=0, + sqrt=False, +): + all_edge_test = np.zeros( + (len(all_comps), len(all_operators), len(x_test), np.sum(graph != 0)) + ) + all_edge_retest = np.zeros( + (len(all_comps), len(all_operators), len(x_retest), np.sum(graph != 0)) + ) + + if isinstance(start_comp, int): + start_comp = [start_comp] * len(all_operators) + + for n, n_comp in enumerate(all_comps): + print(f"Computing for {n_comp} components") + for i, operator in enumerate(all_operators): + e_both = edge_signal_product( + graph, + np.concatenate([x_test, x_retest]), + (start_comp[i], start_comp[i] + n_comp), + operator=operator, + norm=True, + sqrt=sqrt, + ) + all_edge_test[n, i] = e_both[: len(x_test)] + all_edge_retest[n, i] = e_both[len(x_test) :] + + return all_edge_test, all_edge_retest + + +def benchmark_clustering( + graph, + x_test, + x_retest, + all_comps=np.arange(2, 10, 1), + all_k_clusters=np.arange(2, 15, 1), + all_operators=["modularity", "laplacian"], + start_comp=0, + norm=True, + sqrt=False, +): + + test_labels = np.zeros( + (len(all_k_clusters), len(all_comps), len(all_operators), len(x_test)) + ) + retest_labels = np.zeros( + (len(all_k_clusters), len(all_comps), len(all_operators), len(x_retest)) + ) + + test_centroids = [ + np.zeros((len(all_comps), len(all_operators), k, np.sum(graph != 0))) + for k in all_k_clusters + ] + retest_centroids = [ + np.zeros((len(all_comps), len(all_operators), k, np.sum(graph != 0))) + for k in all_k_clusters + ] + + if isinstance(start_comp, int): + start_comp = [start_comp] * len(all_operators) + + pbar = tqdm(total=len(all_comps) * len(all_operators) * len(all_k_clusters)) + + for n, n_comp in enumerate(all_comps): + print(f"Computing for {n_comp} components") + for i, operator in enumerate(all_operators): + edge_test = edge_signal_product( + graph, + x_test, + (start_comp[i], start_comp[i] + n_comp), + operator=operator, + norm=True, + sqrt=sqrt, + ) + edge_retest = edge_signal_product( + graph, + x_retest, + (start_comp[i], start_comp[i] + n_comp), + operator=operator, + norm=True, + sqrt=sqrt, + ) + + for k, k_clust in enumerate(all_k_clusters): + test_labels[k, n, i], test_centroids[k][n, i] = norm_clustering( + edge_test, k_clust, norm=norm + ) + retest_labels[k, n, i], retest_centroids[k][n, i] = norm_clustering( + edge_retest, k_clust, norm=norm + ) + pbar.update(1) + pbar.close() + + return test_labels, retest_labels, test_centroids, retest_centroids + + +def benchmark_clustering_fast( + stat_test_edge, + stat_retest_edge, + all_k_clusters=np.arange(2, 15, 1), + norm=True, +): + n_comp, n_op, n_t_test, n_edges = stat_test_edge.shape + n_t_retest = stat_retest_edge.shape[2] + + test_labels = np.zeros((len(all_k_clusters), n_comp, n_op, n_t_test)) + retest_labels = np.zeros((len(all_k_clusters), n_comp, n_op, n_t_retest)) + + test_centroids = [np.zeros((n_comp, n_op, k, n_edges)) for k in all_k_clusters] + retest_centroids = [np.zeros((n_comp, n_op, k, n_edges)) for k in all_k_clusters] + + pbar = tqdm(total=n_comp * n_op * len(all_k_clusters)) + for n in range(n_comp): + for i in range(n_op): + for k, k_clust in enumerate(all_k_clusters): + test_labels[k, n, i], test_centroids[k][n, i] = norm_clustering( + stat_test_edge[n, i], k_clust, norm=norm + ) + retest_labels[k, n, i], retest_centroids[k][n, i] = norm_clustering( + stat_retest_edge[n, i], k_clust, norm=norm + ) + pbar.update(1) + pbar.close() + + return test_labels, retest_labels, test_centroids, retest_centroids + + +def get_centroid_similarities(t_centroids, rt_centroids): + all_ks = [cent.shape[2] for cent in t_centroids] + comp_n = t_centroids[0].shape[0] + op_n = t_centroids[0].shape[1] + + all_cent_match = [np.zeros((comp_n, op_n, k, k)) for k in all_ks] + all_diag_means = np.zeros((len(all_ks), comp_n, op_n), dtype=float) + all_off_diag_means = np.zeros((len(all_ks), comp_n, op_n), dtype=float) + + for k, k_clust in enumerate(all_ks): + for n in range(comp_n): + for i in range(op_n): + corr_input = np.vstack([t_centroids[k][n, i], rt_centroids[k][n, i]]) + corr = np.corrcoef(corr_input)[:k_clust][:, k_clust:] + + row_ind, col_ind = linear_sum_assignment(corr, maximize=True) + all_cent_match[k][n, i] = corr[row_ind][:, col_ind] + + all_diag_means[k, n, i] = np.diag(all_cent_match[k][n, i]).mean() + # all_off_diag_means[k, n, i] = all_cent_match[k][n, i][~np.eye(k_clust, dtype=bool)].mean() + all_off_diag_means[k, n, i] = np.abs( + all_cent_match[k][n, i][~np.eye(k_clust, dtype=bool)] + ).mean() + return all_cent_match, all_diag_means, all_off_diag_means + + +def main(): + pass + + +if __name__ == "__main__": + main() diff --git a/bimodularity/data_load.py b/bimodularity/data_load.py new file mode 100644 index 0000000..a770659 --- /dev/null +++ b/bimodularity/data_load.py @@ -0,0 +1,760 @@ +import os +import os.path as op + +import pandas as pd +import numpy as np +from scipy.io import loadmat + +import pickle +import h5py + +import nibabel as nib + +from .bundle import fix_thalamus + + +def save(pickle_filename: str, iterable: object) -> None: + """ + Pickle an object to a file. + + Parameters + ---------- + pickle_filename : str + Path to the file where the object will be pickled. + iterable : object + The object to be pickled. + + Returns + ------- + None + """ + with open(pickle_filename, "wb") as handle: + pickle.dump(iterable, handle, protocol=pickle.HIGHEST_PROTOCOL) + + +def load(pickle_filename: str) -> object: + """ + Load a pickled object from the specified file. + + Parameters + ---------- + pickle_filename : str + The filename of the pickled object to load. + + Returns + ------- + object + The loaded object. + """ + with open(pickle_filename, "rb") as handle: + b = pickle.load(handle) + return b + + +def get_aggprop(h5dict: h5py._hl.files.File, property: str): + """ + Get the bundles statistics on whole brain level from the HDF5 file. + + Parameters + ---------- + h5dict : h5py._hl.files.File + The opened HDF5 file. + property : str + The property to extract from the HDF5 file. + + Returns + ------- + ret : np.arrasy + The array containing the requested property values. + """ + + ret = np.array(h5dict.get("matrices").get(property)) + + return ret + + +def load_celegans_graph( + path_to_worm_data: str = "data", + path_to_worm_matrices: str = "data/celegans-bullmore", + thresh: float = 0, + no_sex: bool = False, + gap_junc: bool = False, +): + + adj_filename = "SI 5 Connectome adjacency matrices, corrected July 2020.xlsx" + neurons_types_filename = "NeuronFixedPoints.xls" + + matrix_filename = "Worm279dir.mat" + + neuron_adj_df = pd.ExcelFile(op.join(path_to_worm_data, adj_filename)) + + chem_df = neuron_adj_df.parse("hermaphrodite chemical") + + # Getting neuron informations + # Dropping Nans + neuron_def_df = chem_df.iloc[:, :3].dropna(how="all").ffill() + neuron_def_df.columns = ["Type", "Detail", "Neuron"] + # Dropping Pharynx neurons + neuron_def_df = neuron_def_df[neuron_def_df.Type != "PHARYNX"].reset_index( + drop=True + ) + + lab_to_id = {lab: i for i, lab in enumerate(neuron_def_df["Neuron"].values)} + + # Adding landmark information (average position on antero-posterior axis) + path_to_neurons_types = op.join(path_to_worm_data, neurons_types_filename) + neuron_AvgLandmarkPos = ( + pd.read_excel(path_to_neurons_types) + .groupby("Neuron")["Landmark Position"] + .mean() + ) + + neuron_def_df = neuron_def_df.merge(neuron_AvgLandmarkPos, on="Neuron", how="left") + + # Order Neurons by Type and Landmark Position + # neuron_def_df = neuron_def_df.sort_values(["Type", "Landmark Position"]) + + type_to_num = {t: i for i, t in enumerate(neuron_def_df["Type"].unique())} + neuron_def_df["Type_num"] = [type_to_num[t] for t in neuron_def_df["Type"]] + + all_labels = neuron_def_df["Neuron"].values.tolist() + print(f"There are {len(all_labels)} neurons in the dataset") + + fixed_details = [ + lab.replace(" MOTOR NEURONS", "") if "MOTOR NEURONS" in str(lab) else lab + for lab in neuron_def_df.loc[:, "Detail"] + ] + neuron_def_df.loc[:, "Detail"] = fixed_details + + neuron_def_df["Type_long"] = ( + neuron_def_df["Type"] + "_" + neuron_def_df["Detail"].astype(str) + ) + + type_long_to_num = {t: i for i, t in enumerate(neuron_def_df["Type_long"].unique())} + neuron_def_df["TypeLong_num"] = [ + type_long_to_num[t] for t in neuron_def_df["Type_long"] + ] + + print("All neuron sub-types are:") + print(neuron_def_df.loc[:, "Type_long"].unique()) + + worm_dict = loadmat(op.join(path_to_worm_matrices, matrix_filename)) + + worm_adj_gap = worm_dict["Worm279_ejunct_matrix_dir"] + worm_adj_chem = worm_dict["Worm279_synapse_matrix_dir"] + + worm_label = np.array([lab[0][0] for lab in worm_dict["Worm279_labels"]]) + worm_type = [ + neuron_def_df[neuron_def_df["Neuron"] == lab]["Type"].values[0] + for lab in worm_label + ] + worm_type_num = [ + neuron_def_df[neuron_def_df["Neuron"] == lab]["Type_num"].values[0] + for lab in worm_label + ] + worm_landmark = [ + neuron_def_df[neuron_def_df["Neuron"] == lab]["Landmark Position"].values[0] + for lab in worm_label + ] + + worm_pos = worm_dict["Worm279_positions"] + + # REMOVE SEX SPECIFIC NEURONS + if no_sex: + no_sex_spec = np.array(worm_type_num, dtype=int) < 3 + worm_type = np.array(worm_type)[no_sex_spec] + worm_type_num = np.array(worm_type_num)[no_sex_spec] + worm_label = np.array(worm_label)[no_sex_spec] + worm_pos = np.array(worm_pos)[no_sex_spec] + worm_adj_gap = np.array(worm_adj_gap)[no_sex_spec][:, no_sex_spec] + worm_adj_chem = np.array(worm_adj_chem)[no_sex_spec][:, no_sex_spec] + + if gap_junc: + wiring_adj = worm_adj_gap + worm_adj_chem + else: + wiring_adj = worm_adj_chem + wiring_adj -= np.diag(np.diag(wiring_adj)) + + wiring_sym = (wiring_adj > thresh).astype(int) + + worm_df = pd.DataFrame( + { + "Neuron": worm_label, + "Type": worm_type, + "Type_num": worm_type_num, + "Position x": [p[0] for p in worm_pos], + "Position y": [p[1] for p in worm_pos], + } + ) + + return wiring_sym, worm_df + + +def normalize_slines_vol( + mat: np.ndarray, + atlas_path: str, + atlas_fname: str = "roi_atlas-ftract-scale1-GM.nii.gz", + labels: list = None, +) -> np.ndarray: + + atlas_data = nib.load(op.join(atlas_path, atlas_fname)).get_fdata() + n_roi = int(atlas_data.max()) + + volumes = np.zeros(n_roi, dtype=int) + for i in range(n_roi): + volumes[i] = np.sum(atlas_data == (i + 1)) + + # for vol_i in np.argsort(volumes)[:6]: + # print(labels[vol_i], volumes[vol_i]) + + # Normalizing by average volume of each pair of regions + vol_matrix = (volumes[:, None] + volumes[None, :]) / 2 + + # print(vol_matrix.shape) + + return mat / vol_matrix + + +def load_brain_graph( + path_to_data="./data/brain", + data_suffix="", + delay_max=100, + scale=1, + b_prob_threshold=0.0, + f_prob_threshold=0.0, + slines_theshold=0, + k_threshold=0.9, + undirected=True, + use_delay=True, + normalize_slines=False, + log_slines=False, + gamma_dir=1, + verbose=False, +): + + b_prob_fname = f"{data_suffix}bundle_probability_atlas-scale{scale}.pkl" + bundle_prob = load(op.join(path_to_data, b_prob_fname)) + # bundle_prob = bundle_prob[:-2][:, :-2] + np.fill_diagonal(bundle_prob, val=0) + + slines_fname = f"{data_suffix}bundle_streamlines_atlas-scale{scale}.pkl" + slines_mat = load(op.join(path_to_data, slines_fname)) + # slines_mat = np.nan_to_num(slines_mat[:-2][:, :-2]) + slines_mat = np.nan_to_num(slines_mat) + np.fill_diagonal(slines_mat, val=0) + slines_mat = (slines_mat + slines_mat.T) // 2 + + if not undirected: + f_prob_fname = ( + f"{data_suffix}adj_probability_ftract-d{delay_max}-scale{scale}.pkl" + ) + ftract_prob = load(op.join(path_to_data, f_prob_fname)) + ftract_prob = ftract_prob[:-2][:, :-2] + + delay_fname = f"{data_suffix}adj_delay_ftract-d{delay_max}-scale{scale}.pkl" + ftract_delays = load(op.join(path_to_data, delay_fname)) + ftract_delays = ftract_delays[:-2][:, :-2] + + # Mask for existing f-tract prob and delay (not NaN or 0) + noprob = np.logical_or(ftract_prob == 0, np.isnan(ftract_prob)) + noprob = np.logical_or(ftract_delays == 0, noprob) + noprob = np.logical_or(np.isnan(ftract_delays), noprob) + + ftract_delays = np.divide( + 1, + ftract_delays, + where=np.logical_not(noprob), + out=np.zeros_like(ftract_delays), + ) + + node_centers = load( + op.join(path_to_data, f"{data_suffix}roi_centers-ftract-scale{scale}.pkl") + ) # [:82] + + try: + labels = np.genfromtxt( + op.join(path_to_data, f"{data_suffix}brain_labels.csv"), dtype=str + ) + except FileNotFoundError: + labels = np.genfromtxt( + op.join(path_to_data, f"{data_suffix}brain_labels-scale{scale}.csv"), + dtype=str, + ) + + # print(labels[-5:]) + # for i, lab in enumerate(labels): + # print(i + 1, lab) + + # s_mat = bundle_prob + # f_mat = ftract_prob + + if use_delay: + s_mat = np.zeros_like(slines_mat) + if log_slines: + s_mat[slines_mat > 1] = np.log(slines_mat[slines_mat > 1]) + else: + s_mat = slines_mat.copy() + + if not undirected: + f_mat = ftract_delays + else: + s_mat = np.ones_like(slines_mat) + s_mat = bundle_prob.copy() + + # s_mat = np.ones_like(slines_mat) + + s_mat[bundle_prob < b_prob_threshold] = 0 + s_mat[slines_mat < slines_theshold] = 0 + + if not undirected: + f_mat[ftract_prob < f_prob_threshold] = 0 + + if verbose: + print(f"There are {len(labels)} nodes in the graph") + print( + f"{(s_mat > 0).sum()/(slines_mat > 0).sum():.2%} of connections ", + "remain after thresholding", + ) + + if normalize_slines and use_delay: + s_mat = normalize_slines_vol( + s_mat, + atlas_path=path_to_data, + atlas_fname=f"{data_suffix}roi_atlas-ftract-scale{scale}-GM.nii.gz", + labels=labels, + ) + + if gamma_dir != 1: + f_mat = f_mat**gamma_dir + + if undirected: + k_matrix = s_mat.copy() + # k_matrix = bundle_prob + bundle_prob.T + else: + # k_matrix = (2 * s_mat) * (f_mat / (f_mat + f_mat.T)) + k_matrix = s_mat * (f_mat / (f_mat + f_mat.T)) + k_matrix = np.nan_to_num(k_matrix) + + if k_threshold > 0: + k_matrix = (k_matrix >= k_threshold).astype(int) + + if verbose: + print("Is it undirected ?", np.allclose(k_matrix, k_matrix.T)) + + return k_matrix, labels, node_centers + + +def load_bundle_graph( + path_to_data="./data/brain", + data_suffix="", + scale=1, + b_prob_threshold=0.0, + slines_theshold=0, + normalize_slines=False, + log_slines=False, + verbose=False, +): + + b_prob_fname = f"{data_suffix}bundle_probability_atlas-scale{scale}.pkl" + bundle_prob = load(op.join(path_to_data, b_prob_fname)) + np.fill_diagonal(bundle_prob, val=0) + + slines_fname = f"{data_suffix}bundle_streamlines_atlas-scale{scale}.pkl" + slines_mat = load(op.join(path_to_data, slines_fname)) + np.fill_diagonal(np.nan_to_num(slines_mat), val=0) + + # Ensure symmetry + slines_mat = (slines_mat + slines_mat.T) // 2 + + node_centers = load( + op.join(path_to_data, f"{data_suffix}roi_centers-ftract-scale{scale}.pkl") + ) + + try: + labels = np.genfromtxt( + op.join(path_to_data, f"{data_suffix}brain_labels.csv"), dtype=str + ) + except FileNotFoundError: + labels = np.genfromtxt( + op.join(path_to_data, f"{data_suffix}brain_labels-scale{scale}.csv"), + dtype=str, + ) + + s_mat = np.zeros_like(slines_mat) + if log_slines: + s_mat[slines_mat > 1] = np.log(slines_mat[slines_mat > 1]) + else: + s_mat = slines_mat.copy() + + s_mat[bundle_prob < b_prob_threshold] = 0 + s_mat[slines_mat < slines_theshold] = 0 + + if verbose: + print(f"There are {len(labels)} nodes in the graph") + print( + f"{(s_mat > 0).sum()/(slines_mat > 0).sum():.2%} of connections remain", + " after thresholding", + ) + + if normalize_slines: + s_mat = normalize_slines_vol( + s_mat, + atlas_path=path_to_data, + atlas_fname=f"{data_suffix}roi_atlas-ftract-scale{scale}-GM.nii.gz", + labels=labels, + ) + + return s_mat, labels, node_centers + + +def get_ec_data( + scale, + path_to_ec="./results/atlas_correspondence", + fix_thal=True, + remove_neg=True, + verbose=False, +): + fname = f"Laus2018_EffConnFromSch414-scale{scale}{'OneThal'*fix_thal}.pkl" + ec_data = load(op.join(path_to_ec, fname)) + ec_mat = ec_data["conv"] + + if remove_neg: + negative_mask = ec_mat < 0 + if verbose: + print( + f"Removing {np.sum(negative_mask)/ec_mat.size*100:.2f}% negative weights" + f" from EC matrix", + ) + ec_mat[negative_mask] = 0 + + return ec_mat + + +def load_nodal_fmri( + path_to_atlased="/Users/acionca/data/HCP-MIP/atlased", + atlas="Laus2008_smth6_lp0.15", + task="rest1_dir-LR", + concat=True, +): + path_to_fmri = op.join(path_to_atlased, atlas) + + # task = "motor" + # task = "rest1_dir-LR" + # task = "rest1" + # task = "emotion" + # task = "gambling" + # task = "language" + + all_fnames = sorted([f for f in os.listdir(path_to_fmri) if task in f]) + # all_fnames = [f for f in os.listdir(path_to_fmri) if "timeseries" in f] + print(all_fnames) + # all_fnames = [f for f in all_fnames if f"{sub}" in f] + # print(f"Found {len(all_fnames)} matching files") + + all_nodals = [ + np.genfromtxt(op.join(path_to_fmri, f), delimiter=",") + for f in all_fnames + if "timeseries" in f + ] + print(f"Found {len(all_nodals)} timeseries") + + all_reg = [ + np.genfromtxt(op.join(path_to_fmri, f), delimiter=",") + for f in all_fnames + if "regressor" in f + ] + print(f"Found {len(all_reg)} regressors") + + if not concat: + return all_nodals + else: + nodal_fmri = np.concatenate(all_nodals, axis=0) + print("Nodal fMRI has shape:", nodal_fmri.shape) + + all_lengths = [len(n) for n in all_nodals] + all_para_lengths = [len(n) for n in all_reg] + + for i, (l_nodal, l_para) in enumerate(zip(all_lengths, all_para_lengths)): + if l_nodal != l_para: + print( + f"Warning: Length mismatch between nodal fMRI ({l_nodal}) and", + f" paradygm ({l_para}) for subject {i} !", + ) + all_reg[i] = all_reg[i][:l_nodal] + + # TODO: Implement the paradygm loading and concatenation + if "rest" not in task: + paradygm = np.concatenate(all_reg, axis=0).astype(int) + else: + paradygm = np.zeros(len(nodal_fmri), dtype=int) + # if "rest" not in task: + # path_to_paradygm = op.join( + # path_to_fmri, fname.replace("timeseries", "regressor") + # ) + # paradygm = np.genfromtxt(path_to_paradygm, delimiter=",").astype(int) + # else: + # paradygm = np.zeros(len(nodal_fmri), dtype=int) + + return nodal_fmri, all_lengths, paradygm + + +def load_nodal_mat( + path_to_hcp: str, + task: str = "rest1", + dir="LR", + atlas="Glasser360", + mat_suffix="bp_z", + n_subset: int = None, + concat: bool = True, +): + all_subs = sorted(os.listdir(path_to_hcp)) + + task_suffix = "r" if "rest" in task else "t" + if "dir" in task: + task_dir = f"{task_suffix}fMRI_{task.split('_dir')[0].upper()}_{dir}" + else: + task_dir = f"{task_suffix}fMRI_{task.upper()}_{dir}" + + fname_suffix = f"{atlas}S_{mat_suffix}.mat" + + if n_subset is not None: + all_subs = all_subs[:n_subset] + + all_nodals = [] + for sub in all_subs: + path_to_mat = op.join(path_to_hcp, sub, task_dir, atlas) + fnames = sorted([f for f in os.listdir(path_to_mat) if fname_suffix in f]) + + if len(fnames) > 1: + print("More than one matching file, taking the first one only") + + mat = loadmat(op.join(path_to_mat, fnames[0])) + all_nodals.append(mat["TS"].T) + + if not concat: + return all_nodals + else: + nodal_fmri = np.concatenate(all_nodals, axis=0) + print("Nodal fMRI has shape:", nodal_fmri.shape) + + all_lengths = [len(n) for n in all_nodals] + + # TODO: Implement the paradygm loading and concatenation + # if "rest" not in task: + # path_to_paradygm = op.join( + # path_to_fmri, fname.replace("timeseries", "regressor") + # ) + # paradygm = np.genfromtxt(path_to_paradygm, delimiter=",").astype(int) + # else: + # paradygm = np.zeros(len(nodal_fmri), dtype=int) + + return nodal_fmri, all_lengths # , paradygm + + +def get_lobe_info(scale, labels, path_to_lobe="./results/atlas_correspondence"): + lobe_info = load(op.join(path_to_lobe, f"Laus2018_LobeMNI-scale{scale}OneThal.pkl")) + lobe_labels = lobe_info["labels"] + maxlobe = np.argmax(lobe_info["dice"], axis=0) + + lobe_df = pd.DataFrame( + { + "roi_id": np.arange(len(labels)), + "roi_name": labels, + "lobe_id": maxlobe, + "lobe_label": [lobe_labels[ll] for ll in maxlobe], + } + ) + + is_subc = ["subc-rh" in n for n in lobe_df["roi_name"].values] + lobe_df.loc[is_subc, "lobe_id"] = 17 + lobe_df.loc[is_subc, "lobe_label"] = "rh-subcortical" + lobe_labels[17] = "rh-subcortical" + + is_subc = ["subc-lh" in n for n in lobe_df["roi_name"].values] + lobe_df.loc[is_subc, "lobe_id"] = 8 + lobe_df.loc[is_subc, "lobe_label"] = "lh-subcortical" + lobe_labels[8] = "lh-subcortical" + + lobe_df.loc[lobe_df.roi_name == "Brain_Stem", "lobe_id"] = 18 + lobe_df.loc[lobe_df.roi_name == "Brain_Stem", "lobe_label"] = "brainstem" + lobe_labels.append("brainstem") + + new_order = [2, 5, 4, 7, 3, 8, 11, 14, 13, 16, 12, 17, 18] + reorder_ids = {old_id: new_id for new_id, old_id in enumerate(new_order)} + + lobe_df["lobe_id_reorder"] = lobe_df["lobe_id"].map(reorder_ids) + order_by_lobe = np.argsort(lobe_df["lobe_id_reorder"].values) + lobe_sizes = lobe_df["lobe_id_reorder"].value_counts().sort_index().values + lobe_labels = [lobe_labels[old_id] for old_id in new_order] + + if len(lobe_labels) > len(lobe_sizes): + lobe_sizes = np.append(lobe_sizes, 1) # for brainstem + + return order_by_lobe, lobe_sizes, lobe_labels, lobe_df + + +def get_ftract_confidence( + path_to_features, + delay_max=None, + atlas_year="2008", + min_measurements=0, + min_implants=0, +): + if delay_max is None: + delay_max = int(path_to_features.split("/")[-1]) + print(delay_max) + + if atlas_year == "2008": + n_imp_fname = op.join(path_to_features, "Laus2018_NImplants.txt") + unq_imp_fname = op.join(path_to_features, "Laus2018_NUniqueImplantCounts.txt") + + n_implants = np.genfromtxt(n_imp_fname, dtype=float) + n_unq_implants = np.genfromtxt(unq_imp_fname, dtype=float) + else: + n_implants = np.genfromtxt( + op.join( + path_to_features, + f"max_peak_delay_{delay_max}__zth5/min_value_gen__0/implantation_name/N_with_value.txt.gz", + ), + dtype=float, + ) + count_unq = np.genfromtxt( + op.join( + path_to_features, + f"max_peak_delay_{delay_max}__zth5/min_value_gen__0/implantation_name/count_unique_str.txt.gz", + ), + dtype=float, + ) + n_unq_implants = np.nan_to_num(n_implants / count_unq) + # n_unq_implants = np.nan_to_num(count_unq) + n_implants = n_implants.astype(float) + + implants_mask = n_unq_implants > min_implants + implants_mask = np.logical_and(implants_mask, n_implants > min_measurements) + + return implants_mask + + +def get_ftract_data( + path_to_ftract, + scale, + atlas_year="2008", + maxdelay=50, + feature=None, + return_conf=False, + min_measurements=0, + min_implants=0, + verbose=False, + # conf_threshold=0.0, + # implant_threshold=0, + # unq_implant_threshold=0, +): + scale2nroi = {1: 33, 2: 60, 3: 125, 4: 250} + + # /Users/acionca/data/F-TRACT-Lausanne2008/Lausanne2008-125/Lausanne2008-125_2018.txt + if atlas_year == "2008": + path_to_feat = op.join( + path_to_ftract, + f"Lausanne{atlas_year}-{scale2nroi[scale]}/15_inf/{maxdelay}", + ) + ftract_labels = np.genfromtxt( + op.join( + path_to_ftract, + f"Lausanne{atlas_year}-{scale2nroi[scale]}/Lausanne{atlas_year}-{scale2nroi[scale]}_2018.txt", + ), + dtype=str, + ) + + path_to_prob = op.join(path_to_feat, "probability_2018.txt") + prob = np.genfromtxt(path_to_prob) + is_not_wm = np.ones(len(ftract_labels), dtype=bool) + else: + path_to_feat = op.join( + path_to_ftract, f"Lausanne{atlas_year}-scale{scale}/15_inf/{maxdelay}" + ) + path_to_prob = op.join(path_to_feat, "probability.txt") + + all_labels = np.genfromtxt( + op.join( + path_to_ftract, + f"Lausanne{atlas_year}-scale{scale}", + f"Lausanne2018-scale{scale}.txt", + ), + dtype=str, + ) + + is_not_wm = np.array(["wm-" not in lab for lab in all_labels]) + labels_no_wm = np.array(all_labels)[is_not_wm] + + is_not_wm = np.concatenate([is_not_wm, [False]]) # for unlabelled + + prob = np.genfromtxt(path_to_prob) + ftract_labels, prob = fix_thalamus( + labels_no_wm, matrix=prob[is_not_wm][:, is_not_wm] + ) + + # path_to_conf = op.join(path_to_feat, "Laus2018_ConfidenceMask.txt") + # conf = np.genfromtxt(path_to_conf) + # low_conf_mask = conf <= conf_threshold + + conf = get_ftract_confidence( + path_to_features=path_to_feat, + atlas_year=atlas_year, + delay_max=maxdelay, + min_measurements=min_measurements, + min_implants=min_implants, + ) + low_conf_mask = conf == False + + if verbose: + print( + f"{np.sum(low_conf_mask)} entries have low-confidence (out of {low_conf_mask.size})" + ) + + path_to_feat_list = op.join( + path_to_feat, f"max_peak_delay_{maxdelay}__zth5", "min_value_gen__0" + ) + all_features = [f for f in os.listdir(path_to_feat_list) if "DS_Store" not in f] + + if atlas_year == "2008": + data_fname = "nan_median_abs_deviation.txt_2018.gz" + else: + # data_fname = "nan_median_abs_deviation.txt.gz" + data_fname = "nanquantile_0.5.txt.gz" + all_features = [ + f + for f in all_features + if data_fname in os.listdir(op.join(path_to_feat_list, f)) + ] + + if verbose: + print(f"Data fname is : {data_fname}") + + delay_dict = {} + for f in all_features: + # mat = np.nan_to_num(np.genfromtxt(op.join(path_to_feat_list, f, data_fname))) + mat = np.genfromtxt(op.join(path_to_feat_list, f, data_fname)) + mat[low_conf_mask] = np.nan + + if atlas_year == "2018": + mat = mat[is_not_wm][:, is_not_wm] + _, mat = fix_thalamus(labels_no_wm, matrix=mat) + + delay_dict[f] = mat + + if feature is not None: + feat_name = [f for f in all_features if feature in f][0] + if verbose: + print(f"Selected feature is: {feat_name}") + delay = delay_dict[feat_name] + else: + delay = delay_dict + + # max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nan_median_abs_deviation.txt_2018.gz + # delay = np.genfromtxt(op.join(path_to_feat_list, data_fname)) + # delay = np.nan_to_num(delay) + + if return_conf: + return prob, conf, delay, ftract_labels + + return prob, delay, ftract_labels diff --git a/bimodularity/dgsp.py b/bimodularity/dgsp.py new file mode 100644 index 0000000..31d16b1 --- /dev/null +++ b/bimodularity/dgsp.py @@ -0,0 +1,977 @@ +# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*- +# vi: set ft=python sts=4 ts=4 sw=4 et: + +from typing import Optional, Union +import numpy as np +from scipy.linalg import svd +import matplotlib.pyplot as plt +from sklearn.cluster import KMeans, AgglomerativeClustering +from sklearn.metrics import silhouette_score +from sklearn.metrics.cluster import adjusted_rand_score +from sklearn.decomposition import PCA + +from scipy.optimize import linear_sum_assignment +from scipy.spatial.distance import cdist +from scipy.cluster.hierarchy import linkage, fcluster +from scipy.spatial.distance import squareform +from scipy.sparse import csr_matrix, lil_matrix, dok_matrix +from scipy.stats import spearmanr + +from pingouin import corr as p_corr + +from joblib import Parallel, delayed +from tqdm.notebook import tqdm + +# Some directed modularity tools +def configuration_null(a_mat: np.ndarray, null_model: str = "outin"): + k_in = a_mat.sum(axis=0).reshape((1, -1)) + k_out = a_mat.sum(axis=1).reshape((1, -1)) + + if null_model == "in": + z = k_in.T @ k_in + elif null_model == "out": + z = k_out.T @ k_out + elif null_model == "inout": + z = k_in.T @ k_out + elif null_model == "outin": + z = k_out.T @ k_in + elif null_model == "avg": + z = (k_in.T @ k_in + k_out.T @ k_out) / 2 + elif null_model == "send": + z = send_receive_probability(a_mat)[0] + elif null_model == "receive": + z = send_receive_probability(a_mat)[1] + + return z / a_mat.sum() + + +def send_receive_probability(adj: np.ndarray): + n_edges = adj.sum() + + in_deg = np.atleast_2d(adj.sum(axis=0)) + out_deg = np.atleast_2d(adj.sum(axis=1)) + + in_deg_squared = (in_deg**2).sum() + out_deg_squared = (out_deg**2).sum() + + send_prob = np.outer(out_deg, out_deg) * in_deg_squared / n_edges**2 + receive_prob = np.outer(in_deg, in_deg) * out_deg_squared / n_edges**2 + + return send_prob, receive_prob + + +def modularity_matrix(a_mat: np.ndarray, null_model: str = "outin"): + + z = configuration_null(a_mat, null_model) + + return a_mat - z + + +def modularity_quadratic(mod_mat, signal): + + signal = signal.reshape((-1, 1)) + mod_value = signal.T @ mod_mat @ signal + + return mod_value[0, 0] + + +def sorted_SVD(matrix: np.ndarray, fix_negative: bool = False, sort_by_q: bool = False): + + U, S, Vh = np.linalg.svd(matrix) + # U, S, Vh = svd(matrix) + + if fix_negative: + for i, _ in enumerate(matrix): + if U[:, i].T @ Vh[i] < 0: + Vh[i] *= -1 + S[i] *= -1 + + sort_id = np.flip(np.argsort(S)) + if sort_by_q: + q_s = S * np.diag(Vh @ U) + sort_id = np.flip(np.argsort(q_s)) + + S = S[sort_id] + U = U[:, sort_id] + Vh = Vh[sort_id] + + return U, S, Vh + + +def make_directed( + a_mat: np.ndarray, + n_dir_edge: int, + p: float = 0.5, + seed: Optional[int] = None, +) -> np.ndarray: + + triu_idx = np.array(np.triu_indices_from(a_mat, k=1)) + + lined_triu = a_mat[*triu_idx] + lined_tril = a_mat.T[*triu_idx] + + undir_edges_id = np.where(np.logical_and(lined_triu, lined_tril))[0] + + np.random.seed(seed) + to_direct = np.random.choice(undir_edges_id, n_dir_edge, replace=False) + + a_dir = a_mat.copy() + + dir_in = np.random.choice([True, False], p=[p, 1 - p]) + + if dir_in: + a_dir[*triu_idx[:, to_direct]] = 0 + else: + a_dir.T[*triu_idx[:, to_direct]] = 0 + + return a_dir, triu_idx[:, to_direct] + + +def random_imbalance(adjacency: np.ndarray, sigma: float = 0.1) -> np.ndarray: + + non_zero = adjacency != 0 + + imbalance = np.zeros_like(adjacency, dtype=float) + imbalance[non_zero] = np.random.normal(0, sigma, non_zero.sum(dtype=int)) + + return adjacency + imbalance + + +def random_edge_decrease( + adjacency: np.ndarray, sigma: float = 0.1, chosen: Optional[tuple] = None +) -> np.ndarray: + + non_zero = adjacency != 0 + if chosen is None: + non_zero_id = np.array(np.where(non_zero)).T + chosen = non_zero_id[np.random.choice(len(non_zero_id), replace=False)] + + adj_imbalance = adjacency.copy() + adj_imbalance[*chosen] -= sigma + + return adj_imbalance, chosen + + +def incremental_directed_SVD( + adjacency: np.ndarray, + null_model: str = "in", + initial_seed: int = 123, + fix_negative: bool = True, + sort_by_q: bool = False, + store_adjacency: bool = False, + **kwargs, +): + s_list = [] + q_list = [] + u_list = [] + v_list = [] + dir_id_list = [] + + adj_list = [] + + rand_adj = adjacency.copy() + + while not (rand_adj + rand_adj.T == adjacency).all(): + + mod_mat = modularity_matrix(rand_adj, null_model=null_model) + U, S, Vh = sorted_SVD(mod_mat, fix_negative=fix_negative, sort_by_q=sort_by_q) + + u_list.append(U) + v_list.append(Vh) + s_list.append(S) + q_list.append([modularity_quadratic(mod_mat, U[:, i]) for i, _ in enumerate(S)]) + + rand_adj, dir_id = make_directed( + rand_adj, n_dir_edge=1, seed=initial_seed, **kwargs + ) + adj_list.append(rand_adj) + dir_id_list.append(dir_id) + + initial_seed += 1 + + if store_adjacency: + return ( + np.array(u_list), + np.array(v_list), + np.array(s_list), + np.array(q_list), + dir_id_list, + np.array(adj_list), + ) + return ( + np.array(u_list), + np.array(v_list), + np.array(s_list), + np.array(q_list), + dir_id_list, + ) + + +def SVD_prediction( + a_mat: np.ndarray, + null_model: str = "in", + predictor_id: int = 0, + y_true: np.ndarray = None, + return_dict: bool = True, +) -> Union[dict, np.ndarray]: + + # Get SVD decomposition of the modularity matrix + mod_mat = modularity_matrix(a_mat, null_model=null_model) + U, S, Vh = sorted_SVD(mod_mat) + + # Set small values to 0 + tol = 1e-5 + U[np.abs(U) < tol] = 0 + Vh[np.abs(Vh) < tol] = 0 + + # Get the modularity value for the selected singular vectors + u_quad = modularity_quadratic(mod_mat, U[:, predictor_id]) + v_quad = modularity_quadratic(mod_mat, Vh[predictor_id]) + + # Find consensus between predictors + U_pred = np.sign(U[:, predictor_id]) + Vh_pred = np.sign(Vh[predictor_id]) + + # Ensure the first element is positive + Vh_pred = Vh_pred * np.sign(U_pred[0] * Vh_pred[0]) + + disagree = U_pred * Vh_pred < 0 + + consensus = np.where( + np.abs(U[:, predictor_id]) > np.abs(Vh[predictor_id]), U_pred, Vh_pred + ) + + # Run the prediction + if y_true is None: + y_true = np.hstack([np.ones(len(a_mat) // 2), -np.ones(len(a_mat) // 2)]) + + n_error_pos = sum(y_true - consensus != 0) + n_error_neg = sum(y_true + consensus != 0) + + n_error = min(n_error_pos, n_error_neg) + + if return_dict: + results = { + "pred_error": n_error, + "disagree": sum(disagree), + "u_quad": u_quad, + "v_quad": v_quad, + } + + return results + return n_error, sum(disagree), u_quad, v_quad + +# Community detection part + + +def edge_bicommunities( + adjacency, + U, + V, + n_components, + n_kmeans=10, + verbose=False, + scale_S=None, + assign_only=False, + return_centroids=False, + max_k=20, + undirected=False, + return_kmeans=False, + kwargs_kmeans1={}, + kwargs_kmeans2={}, + clust_only=False, + d_thresh=0., + **kwargs, +) -> tuple: + + n_nodes = adjacency.shape[0] + + if n_components > len(U): + print( + f"Warning: `n_components` too large, fixing to {len(U)} (was {n_components})." + ) + n_components = len(U) + + if scale_S is None: + scale_S = np.ones(n_components) + + u_features = U[:, :n_components] * scale_S[:n_components] + v_features = V[:, :n_components] * scale_S[:n_components] + + # Slower method + # edge_out = np.array([u_features] * n_nodes).T + # edge_in = np.array([v_features] * n_nodes) + # edge_in = np.moveaxis(edge_in, -1, 0) + # edge_assignments = np.concatenate([edge_out, edge_in], axis=0) + # edge_assignments_vec = edge_assignments[:, adjacency != 0].T + + rows, cols = np.where(adjacency != 0) + edge_assignments_vec = np.hstack([u_features[rows], v_features[cols]]) + + if assign_only: + return edge_assignments_vec + + if n_kmeans is None: + n_kmeans = get_best_k(edge_assignments_vec, verbose=verbose, max_k=max_k) + + kmeans = KMeans(n_clusters=n_kmeans, **kwargs_kmeans1).fit( + edge_assignments_vec + ) + + if undirected: + edge_clusters_inter = kmeans.labels_ + 1 + + # Slower method + # angle_signs = np.sign([v.T @ u for u, v in zip(U[:, :n_components].T, V[:, :n_components].T)]) + # flipped_centers = np.concatenate([kmeans.cluster_centers_[:, n_components:], + # kmeans.cluster_centers_[:, :n_components]] * angle_signs, axis=1) + angle_signs = np.sign(np.sum(U[:, :n_components] * V[:, :n_components], axis=0)) + flipped_centers = np.concatenate([ + kmeans.cluster_centers_[:, n_components:], + kmeans.cluster_centers_[:, :n_components] + ], axis=1) + flipped_centers = flipped_centers * np.concatenate([angle_signs]*2)[None, :] + + dist_mat = cdist(kmeans.cluster_centers_, flipped_centers) + row, col = linear_sum_assignment(dist_mat) + updated_centroids = (kmeans.cluster_centers_[row] + flipped_centers[col])/2 + + if d_thresh > 0: + cent_to_keep = np.ones(updated_centroids.shape[0], dtype=bool) + is_self = np.array(row == col) + row_col = np.vstack([row[~is_self], col[~is_self]]) + row_col = np.unique(np.array([[r, c] if r < c else [c, r] for r, c in row_col.T]).T, axis=1) + + for r, c in row_col.T: + dist = np.linalg.norm(updated_centroids[r] - updated_centroids[c]) + + if dist < d_thresh: + updated_centroids[r] = (updated_centroids[r] + updated_centroids[c])/2 + cent_to_keep[c] = False + updated_centroids = updated_centroids[cent_to_keep] + + if verbose: + print(f"Removed {n_kmeans - len(updated_centroids)} centroids after merging !") + + # added_centroids = (updated_centroids[row_col[0]] + updated_centroids[row_col[1]])/2 + # print(np.allclose(added_centroids[0, :n_components], added_centroids[0, n_components:]*angle_signs)) + # updated_centroids = np.vstack([updated_centroids, added_centroids]) + added_centroids = [] + + # max_self_dist = dist_mat[is_self, is_self].max() + # print(max_self_dist) + + kmeans = KMeans(n_clusters=len(updated_centroids), init=updated_centroids, **kwargs_kmeans2).fit( + edge_assignments_vec + ) + + # dist_mat = cdist(kmeans.cluster_centers_[row], kmeans.cluster_centers_[col]) + # dist_mat2 = cdist(updated_centroids[row], updated_centroids[col]) + # for i in range(n_kmeans): + # print(row[i], col[i], dist_mat[i, i], dist_mat2[i, i], dist_mat[i, i] < max_self_dist) + + if return_kmeans: + # return kmeans, edge_assignments[:, adjacency != 0].T + return kmeans, edge_assignments_vec + + edge_clusters = kmeans.labels_ + 1 + + if clust_only and undirected: + return edge_clusters_inter, edge_clusters + + n_clusters = edge_clusters.max() + if verbose: + print(f"Found {n_clusters} clusters !") + + edge_clusters_mat = np.zeros((n_nodes, n_nodes), dtype=int) + edge_clusters_mat[adjacency != 0] = edge_clusters + + if return_centroids: + # cluster_centroids = np.zeros((n_clusters, 2, n_components)) + cluster_centroids = kmeans.cluster_centers_.reshape( + (n_clusters, 2, n_components) + ) + + return edge_clusters, edge_clusters_mat, cluster_centroids + + return edge_clusters, edge_clusters_mat + + +def get_best_k(X, max_k=10, verbose=False, return_silhouette=False, parallel=False, n_init=100): + print(f"Running silhouette analysis for k = 2 to {max_k} ...") + n_clusters = np.arange(2, max_k) + silhouette = np.zeros(n_clusters.shape[0]) + + if parallel: + print(f"Using parallel computation ...") + def _get_silhouette(n, data): + kmeans = KMeans(n_clusters=n, init="random", n_init=n_init).fit(data) + return silhouette_score(data, kmeans.labels_) + + count = tqdm(total=len(n_clusters)) + par = Parallel(n_jobs=np.min([10, len(n_clusters)]), return_as="generator") + gen_res = par(delayed(_get_silhouette)(n, X) for n in n_clusters) + + for i, sil in enumerate(gen_res): + silhouette[i] = sil + count.update(1) + count.close() + + else: + for i, n in enumerate(n_clusters): + # kmeans = KMeans(n_clusters=n, random_state=0, n_init="auto").fit(X) + kmeans = KMeans(n_clusters=n, init="random", n_init=n_init).fit(X) + silhouette[i] = silhouette_score(X, kmeans.labels_) + + if verbose: + print(f"Silhouette score for K={n} is : {silhouette[i]:1.3f}") + + print( + f"Best average silhouette_score is : {np.max(silhouette):1.2f} for K={n_clusters[np.argmax(silhouette)]}" + ) + if return_silhouette: + return silhouette + return n_clusters[np.argmax(silhouette)] + + +def get_node_clusters( + edge_clusters, + edge_clusters_mat, + method="bimod", + scale=True, +): + n_nodes = edge_clusters_mat.shape[0] + n_clusters = np.max(edge_clusters) + + if method == "probability": + # Aggregate edges to nodes using cluster probability (number of edges) + n_per_cluster = np.zeros((n_nodes, n_clusters)) + for cluster_id in np.arange(1, np.max(edge_clusters_mat) + 1): + n_per_cluster[:, cluster_id - 1] = np.sum( + edge_clusters_mat == cluster_id, axis=1 + ) + n_per_cluster[:, cluster_id - 1] += np.sum( + edge_clusters_mat == cluster_id, axis=1 + ) + + cluster_prob = n_per_cluster / n_per_cluster.sum(axis=1)[:, None] + + cluster_maxprob = np.argmax(cluster_prob, axis=1) + 1 + + return cluster_maxprob, cluster_prob + if "bimod" in method: + sending_communities = np.zeros((n_clusters, n_nodes)) + receiving_communities = np.zeros((n_clusters, n_nodes)) + + for cluster_id in np.arange(1, np.max(edge_clusters_mat) + 1): + sending_communities[cluster_id - 1] = np.sum( + edge_clusters_mat == cluster_id, axis=1 + ) + receiving_communities[cluster_id - 1] = np.sum( + edge_clusters_mat == cluster_id, axis=0 + ) + + if scale: + sending_communities = np.divide( + sending_communities, + np.sum(edge_clusters_mat > 0, axis=1), + where=np.sum(edge_clusters_mat > 0, axis=1) != 0, + out=np.zeros_like(sending_communities), + ) + receiving_communities = np.divide( + receiving_communities, + np.sum(edge_clusters_mat > 0, axis=0), + where=np.sum(edge_clusters_mat > 0, axis=0) != 0, + out=np.zeros_like(receiving_communities), + ) + + return sending_communities, receiving_communities + + +def bimod_index_edges(adjacency, edge_clusters_mat, scale=False): + n_clusters = np.max(edge_clusters_mat) + + null_model = configuration_null(adjacency, null_model="outin") + + bimod_indices = np.zeros(n_clusters) + + for cluster_id in np.arange(n_clusters): + adj_contrib = adjacency[edge_clusters_mat == cluster_id + 1] + null_contrib = null_model[edge_clusters_mat == cluster_id + 1] + + bimod_indices[cluster_id] = np.sum(adj_contrib - null_contrib) + + if scale: + bimod_indices[cluster_id] /= np.sum(adj_contrib > 0) + + return bimod_indices + + +def bimod_index_nodes(adjacency, send_com, receive_com, scale=False): + n_clusters = len(send_com) + + null_model = configuration_null(adjacency, null_model="outin") + + bimod_indices = np.zeros(n_clusters) + + for cluster_id in np.arange(n_clusters): + send_fltr = send_com[cluster_id] > 0 + receive_fltr = receive_com[cluster_id] > 0 + + adj_contrib = adjacency[send_fltr][:, receive_fltr] + null_contrib = null_model[send_fltr][:, receive_fltr] + + bimod_indices[cluster_id] = np.sum(adj_contrib - null_contrib) + + if scale: + # all_edges = np.sum(np.atleast_2d(send_fltr).T @ np.atleast_2d(receive_fltr)) + all_edges = np.sum(adjacency) + bimod_indices[cluster_id] /= all_edges + # / np.sum(adj_contrib > 0) + + return bimod_indices + + +def bimod_index_quad(adjacency, send_com, receive_com, scale=None): + n_clusters = len(send_com) + + modmat = modularity_matrix(adjacency, null_model="outin") + + bimod_indices = np.zeros(n_clusters) + + for cluster_id in np.arange(n_clusters): + quad_form = send_com[cluster_id] @ modmat @ receive_com[cluster_id] + # quad_form = (send_com[cluster_id] > 0) @ modmat @ (receive_com[cluster_id] > 0) + + if scale: + bimod_indices[cluster_id] = 1 / (2 * adjacency.sum()) * quad_form + else: + bimod_indices[cluster_id] = quad_form + + return bimod_indices + + +def benchmark_bimod( + adjacency, k_max=10, n_vec_max=10, use_nodes=False, scale_features=True +): + + U, S, Vh = sorted_SVD(modularity_matrix(adjacency, null_model="outin")) + V = Vh.T + + if scale_features: + scale_factor = S + else: + scale_factor = np.ones(S.shape[0]) + + if use_nodes: + bimod_func = bimod_index_nodes + else: + bimod_func = bimod_index_quad + + all_results = [] + for vector_id_max in np.arange(1, n_vec_max + 1): + all_per_vectors = [] + for n_kmeans in np.arange(2, k_max + 1): + + edge_clusters, edge_clusters_mat = edge_bicommunities( + adjacency, + U, + V, + vector_id_max, + method="kmeans", + n_kmeans=n_kmeans, + scale_S=scale_factor[:vector_id_max], + ) + + sending_communities, receiving_communities = get_node_clusters( + edge_clusters, edge_clusters_mat, method="bimodularity" + ) + + bimod = bimod_func( + adjacency, sending_communities, receiving_communities, scale=True + ) + # sum_power = 2 + # bimod = bimod**sum_power / np.sum(bimod**sum_power) + sorted = np.flip(np.argsort(np.abs(bimod))) + + all_per_vectors.append(bimod[sorted]) + all_results.append(all_per_vectors) + + return all_results + + +def get_c_pinv( + adjacency: np.ndarray, + n_vec_max: int, + n_kmeans: int, + sort_bimod: bool = True, + normalize: bool = True, + ones: bool = False, + return_clusters: bool = False, + **kwargs, +): + B = modularity_matrix(adjacency) + U, S, Vh = sorted_SVD(B, fix_negative=False) + V = Vh.T + + scale_factor = S[:n_vec_max] + edge_clusters, edge_clusters_mat = edge_bicommunities( + adjacency, + U, + V, + n_vec_max, + method="kmeans", + n_kmeans=n_kmeans, + scale_S=scale_factor, + **kwargs, + ) + + c_out, c_in = get_node_clusters(edge_clusters, edge_clusters_mat) + + bimod_idx = bimod_index_nodes(adjacency, c_out, c_in, scale=True) + if sort_bimod: + sorting_array = np.flip(np.argsort(bimod_idx)) + bimod_idx = bimod_idx[sorting_array] + + edge_clusters_mat_sorted = edge_clusters_mat.copy() + edge_clusters_sorted = edge_clusters.copy() + for i_new, i in enumerate(sorting_array): + edge_clusters_mat_sorted[edge_clusters_mat == i + 1] = i_new + 1 + edge_clusters_sorted[edge_clusters == i + 1] = i_new + 1 + + edge_clusters_mat = edge_clusters_mat_sorted + edge_clusters = edge_clusters_sorted + + c_out = c_out[sorting_array] + c_in = c_in[sorting_array] + + C_mat_out = c_out.T + C_mat_in = c_in.T + + if ones: + C_mat_out = (C_mat_out > 0).astype(float) + C_mat_in = (C_mat_in > 0).astype(float) + + if normalize: + C_mat_out /= np.linalg.norm(C_mat_out, axis=0) + C_mat_in /= np.linalg.norm(C_mat_in, axis=0) + + c_pinv_out = np.linalg.pinv(C_mat_out) + c_pinv_in = np.linalg.pinv(C_mat_in) + + if return_clusters: + return ( + C_mat_out, + c_pinv_out, + C_mat_in, + c_pinv_in, + bimod_idx, + edge_clusters, + edge_clusters_mat, + ) + + return C_mat_out, c_pinv_out, C_mat_in, c_pinv_in, bimod_idx + + +def columnwise_corr(pred, truth): + # Standardize columns (z-scoring) + pred_std = (pred - pred.mean(axis=0)) / pred.std(axis=0) + truth_std = (truth - truth.mean(axis=0)) / truth.std(axis=0) + + # Correlation = normalized dot product + corr = pred_std.T @ truth_std / (pred.shape[0] - 1) + return corr + + +def reorder_corr(c_mat, sort_rows=False, assign="linear", pca_comp=0): + n_rows, n_columns = c_mat.shape + size = max(n_rows, n_columns) + cost = np.zeros((size, size)) + + cost[:n_rows, :n_columns] = c_mat + + if "linear" in assign: + # Hungarian algorithm + row_ind, col_ind = linear_sum_assignment(cost, maximize=True) + elif "PCA" in assign: + pca = PCA(n_components=pca_comp + 1) + + components = pca.fit_transform(cost)[:, pca_comp] + row_ind = np.argsort(components) + col_ind = np.arange(n_columns) + + sort = np.argsort(col_ind) + if sort_rows: + sort = np.argsort(row_ind) + + row_ind = row_ind[sort] + col_ind = col_ind[sort] + if n_rows < n_columns: + row_ind = row_ind[row_ind < n_rows] + else: + col_ind = col_ind[col_ind < n_columns] + + return cost[row_ind][:, col_ind], row_ind, col_ind + + +def get_ideal_conjugates(send, rec, normalize=True): + send_rec = np.concatenate([send, rec], axis=1) + conj = np.concatenate([rec, send], axis=1) + if normalize: + send_rec = send_rec / np.linalg.norm(send_rec, axis=1, keepdims=True) + conj = conj / np.linalg.norm(conj, axis=1, keepdims=True) + + return send_rec, conj + +def get_unique_conjugates(row, col): + row_col = np.vstack([row, col]) + row_col = np.unique( + np.array([[r, c] if r <= c else [c, r] for r, c in row_col.T]).T, + axis=1 + ) + return row_col + + +def get_conjugates_matching(send, rec, unique=True, return_matrix=False): + send_rec, conj = get_ideal_conjugates(send, rec, normalize=True) + + dist = cdist(send_rec, conj, metric="cosine")#'euclidean') + row_ind, col_ind = linear_sum_assignment(dist) + + if unique: + return get_unique_conjugates(row_ind, col_ind) + + if return_matrix: + return row_ind, col_ind, dist + + return row_ind, col_ind + + +def get_asym_ratio(adj, bicom_masks=None, edge_clusters_mat=None, use_median=True, fast=True): + if bicom_masks is None: + bicom_masks = np.array([edge_clusters_mat == (i+1) for i in range(edge_clusters_mat.max())]) + + if use_median: + agg_func = np.median + else: + agg_func = np.mean + + if fast: + if bicom_masks.ndim == 3: + bicom_masks = bicom_masks[:, adj != 0] + bicom_vals = [adj[bm] for bm in bicom_masks] + ratio = np.array([agg_func(bv[~np.isnan(bv)]) for bv in bicom_vals]) + + return ratio + else: + + # sum_per_com = (adj * bicom_masks).sum(axis=(1, 2)) + # count_per_com = (adj * bicom_masks > 0).sum(axis=(1, 2)) + # mean_per_com = sum_per_com / count_per_com + + ratio = np.zeros(len(bicom_masks), dtype=float) + for i, mask in enumerate(bicom_masks): + vals = adj[mask] + # valsT = adj[mask.T] + + nanmask = np.isnan(vals) + # nanmask = np.logical_or(np.isnan(vals), np.isnan(valsT)) + if sum(~nanmask) == 0: + ratio[i] = np.nan + continue + + # vals = vals[~nanmask] + # valsT = valsT[~nanmask] + # ratio[i] = agg_func(vals / (vals + valsT)) + vals = vals[~nanmask] + ratio[i] = agg_func(vals) + + # vals = agg_func(vals[~np.isnan(vals)]) + # valsT = agg_func(valsT[~np.isnan(valsT)]) + + # ratio[i] = vals[~np.isnan(vals)].mean() / (vals[~np.isnan(vals)].mean() + valsT[~np.isnan(valsT)].mean()) + # ratio[i] = np.divide(vals[~np.isnan(vals)].mean(), + # (vals[~np.isnan(vals)].mean() + valsT[~np.isnan(valsT)].mean()), + # where=(vals[~np.isnan(vals)].mean() + valsT[~np.isnan(valsT)].mean()) != 0) + + # ratio[i] = vals / (vals + valsT) if (vals + valsT) != 0 else np.nan + + return ratio + + +def get_conjugate_ratio(adj, row_ind, col_ind, bicom_masks=None, edge_clusters_mat=None): + if bicom_masks is None: + bicom_masks = np.array([edge_clusters_mat == (i+1) for i in range(edge_clusters_mat.max())]) + + sum_per_com = (adj * bicom_masks).sum(axis=(1, 2)) + count_per_com = (adj * bicom_masks > 0).sum(axis=(1, 2)) + mean_per_com = sum_per_com / count_per_com + mean_per_com[count_per_com < 1e-10] = 1e-10 + + ratio = np.zeros_like(row_ind, dtype=float) + for i, _ in enumerate(row_ind): + ratio[i] = mean_per_com[row_ind[i]] / (mean_per_com[col_ind[i]] + mean_per_com[row_ind[i]]) + + return ratio + + +def get_bicom_ratio(adj, labels, ft_mat, ec_mat, use_median=True, use_spearman=False, use_beta=False, return_scatter=False, fast=False, corr_type=None): + e_mat = np.zeros_like(adj, dtype=int) + e_mat[adj != 0] = labels + + if fast: + bi_masks = np.array([labels == (i+1) for i in range(labels.max())]) + else: + bi_masks = np.array([e_mat == (i+1) for i in range(labels.max())]) + + if fast: + ft_ratio = get_asym_ratio(ft_mat[adj != 0], bicom_masks=bi_masks, use_median=use_median, fast=fast) + ec_ratio = get_asym_ratio(ec_mat[adj != 0], bicom_masks=bi_masks, use_median=use_median, fast=fast) + else: + ft_ratio = get_asym_ratio(ft_mat, bicom_masks=bi_masks, use_median=use_median, fast=fast) + ec_ratio = get_asym_ratio(ec_mat, bicom_masks=bi_masks, use_median=use_median, fast=fast) + + nanratio = np.logical_or(np.isnan(ft_ratio), np.isnan(ec_ratio)) + ft_ratio = ft_ratio[~nanratio] + ec_ratio = ec_ratio[~nanratio] + + n_nans = nanratio.sum() + # if n_nans == len(nanratio): + # print("All ratios are NaN !") + # if len(ec_ratio) < 2: + # print("Not enough valid ratios to compute correlation !") + # if np.any(np.isnan(ft_ratio)) or np.any(np.isnan(ec_ratio)): + # print("Some ratios are NaN !") + + if corr_type is not None: + corr = p_corr(ft_ratio, ec_ratio, method=corr_type)['r'].values[0] + else: + if use_spearman: + corr = spearmanr(ft_ratio, ec_ratio).correlation + elif use_beta: + from sklearn.linear_model import LinearRegression + corr = LinearRegression().fit(ec_ratio[:,None], ft_ratio).coef_[0] + else: + corr = np.corrcoef(ft_ratio, ec_ratio)[0, 1] + + # if np.isnan(corr): + # print("Correlation is NaN !") + # print(ft_ratio, ec_ratio) + # print(corr) + # exit() + + if return_scatter: + return corr, n_nans, ft_ratio, ec_ratio + return corr, n_nans + +# Permutation Testing + +def shuffle_edges(adj, perm_prop, n_shuffle=1, edge_mask=None): + if edge_mask is None: + edge_mask = adj > 0 + n_zer_edges = adj[edge_mask] + + n_perm_edges = int(perm_prop * len(n_zer_edges)) + # shuffled = np.zeros_like(adj) + shuffled = np.zeros((n_shuffle, *adj.shape)) + + for s in range(n_shuffle): + selected_edges = np.random.choice(len(n_zer_edges), size=n_perm_edges, replace=False) + perm_edges = n_zer_edges.copy() + perm_edges[selected_edges] = np.random.permutation(n_zer_edges[selected_edges]) + + shuffled[s, edge_mask] = perm_edges + + return shuffled + +def shuffle_edges_sym(adj, perm_prop, n_shuffle=1): + triu = np.array(np.triu_indices_from(adj, k=1)).T + n_triu = len(triu) + n_perm_edges = int(perm_prop * n_triu) + + shuffled = np.repeat(adj[np.newaxis, :, :], n_shuffle, axis=0) + + for s in range(n_shuffle): + selected_edges = np.random.choice(n_triu, size=n_perm_edges, replace=False) + selected_triu = triu[selected_edges].T + + shuffled[s, selected_triu[0], selected_triu[1]] = adj[selected_triu[1], selected_triu[0]] + shuffled[s, selected_triu[1], selected_triu[0]] = adj[selected_triu[0], selected_triu[1]] + + return shuffled + + +def _get_cons_chunk(run_labels): + n_samples = run_labels.shape[0] + + uniq, inv = np.unique(run_labels, return_inverse=True) + k = uniq.size + rows = np.arange(n_samples) + cols = inv + # build sparse indicator H (n_samples x k) + H = csr_matrix((np.ones(n_samples, dtype=np.int8), (rows, cols)), shape=(n_samples, k)) + # co-occurrence (sparse) + C = (H @ H.T).tocoo() + # add only nonzero entries + # consensus[C.row, C.col] += C.data + + return C.row, C.col, C.data + + +def consensus_matrix(all_labels, reorder=False, consensus_labels=False, consensus_k=None, fast=False, + njobs: int = 1): + n_runs, n_samples = all_labels.shape + + consensus = np.zeros((n_samples, n_samples), dtype=np.int8) + # consensus = csr_matrix((n_samples, n_samples), dtype=np.int8) + labels = None + + if njobs > 1: + results = Parallel(n_jobs=njobs, return_as="generator_unordered")( + delayed(_get_cons_chunk)(run_labels) for run_labels in all_labels + ) + for r, c, d in results: + consensus[r, c] += d + else: + for run_labels in all_labels: + r, c, d = _get_cons_chunk(run_labels) + consensus[r, c] += d + + # 42 seconds with division and 18 seconds without ! + if consensus_labels: + # consensus = consensus.astype(float) / n_runs + # dist = 1 - consensus + + dist = n_runs - consensus + + if consensus_k is None: + consensus_k = all_labels.max() + 1 + + cons_linkage = linkage(squareform(dist), method="average") + labels = fcluster(cons_linkage, consensus_k, criterion="maxclust") + + if reorder: + reorder_id = np.argsort(labels) + consensus = consensus[reorder_id][:, reorder_id] + + return consensus, labels + + +def consensus_score(consensus_matrix, consensus_label, is_sorted=False): + if is_sorted: + sorted_lab = np.sort(consensus_label) + else: + sorted_lab = consensus_label.copy() + # sorted_lab = np.sort(consensus_label) + within_mask = (sorted_lab[:, None] == sorted_lab[None, :]) + between_mask = ~within_mask + + within_vals = consensus_matrix[within_mask] + between_vals = consensus_matrix[between_mask] + + # Not deflating the between values by the many zeros + between_vals = between_vals[between_vals > 0] + within_vals = within_vals[within_vals > 0] + + # return np.mean(within_vals, where=within_mask > 0), np.mean(between_vals, where=between_mask > 0) + return np.mean(within_vals), np.mean(between_vals) \ No newline at end of file diff --git a/graph_examples.py b/bimodularity/graph_examples.py similarity index 63% rename from graph_examples.py rename to bimodularity/graph_examples.py index d33c927..e88ea67 100644 --- a/graph_examples.py +++ b/bimodularity/graph_examples.py @@ -1,7 +1,95 @@ -from typing import Optional +from typing import Optional, Union import numpy as np +# Toy examples of directed graphs and communities +def make_directed_clique(n_nodes, dir_out=False, weighted=False, density=1): + a_mat = np.zeros((n_nodes, n_nodes)) + + indices = np.triu_indices_from(a_mat, k=1) + n_indices = len(indices[0]) + n_sparse = int((1 - density) * n_indices) + + sample_val = np.ones(n_indices) + if weighted: + sample_val = np.random.normal(np.ones(n_indices), 0.2) + sample_val[np.random.choice(np.arange(n_indices), size=n_sparse, replace=False)] = 0 + a_mat[indices] = sample_val + + if dir_out: + a_mat = a_mat.T + return a_mat + + +def toy_bifurc( + n_nodes, + nodes_per_clique, + n_connecting_edges, + directed=False, + out_nodes=False, + **kwargs, +): + n_connecting_nodes = n_nodes - 2 * nodes_per_clique + + C1 = make_directed_clique(nodes_per_clique, **kwargs) + C2 = make_directed_clique(nodes_per_clique, dir_out=directed, **kwargs) + L = np.hstack( + [ + np.ones((n_connecting_nodes, n_connecting_edges)), + np.zeros((n_connecting_nodes, nodes_per_clique - n_connecting_edges)), + ] + ) + + L_out1 = L + L_out2 = L + L_in1 = np.zeros_like(L).T + L_in2 = np.zeros_like(L).T + + if directed: + L_out2 = np.zeros_like(L) + L_in2 = L.T + elif out_nodes: + L_in1 = L.T + L_in2 = L.T + L_out1 = np.zeros_like(L) + L_out2 = np.zeros_like(L) + + all_zeros = np.zeros((nodes_per_clique, nodes_per_clique)) + + toy_mat = np.block( + [ + [C1, L_in1, all_zeros], + [L_out1, np.zeros((n_connecting_nodes, n_connecting_nodes)), L_out2], + [all_zeros, L_in2, C2], + ] + ) + return toy_mat + + +def toy_fully(n_nodes, density=1, out_prob=0.5, seed=None): + half_nodes = int(n_nodes / 2) + fully_directed = np.zeros((n_nodes, n_nodes)) + + triu_idx = np.array(np.triu_indices(half_nodes, k=1)) + triu_idx = np.hstack([triu_idx, triu_idx + half_nodes]) + tril_idx = np.flip(triu_idx, axis=0) + + np.random.seed(seed) + randomized_indices = np.random.normal(np.zeros(triu_idx.shape[-1])) > 0 + + all_idx = np.hstack( + [triu_idx[:, randomized_indices], tril_idx[:, ~randomized_indices]] + ) + + n_sparse = int(all_idx.shape[1] * (1 - density)) + + sparse_ones = np.ones_like(all_idx[0]) + sparse_ones[np.random.choice(len(sparse_ones), n_sparse)] = 0 + fully_directed[*all_idx] = sparse_ones + + return fully_directed + + def random_directed_edges_id( ids: list, edge_prob: float = 0.5, @@ -268,6 +356,77 @@ def toy_random_seeded( return a_mat +def toy_random_old(n_nodes, densities=0.5, seed=None): + if isinstance(densities, list): + half_nodes = int(n_nodes / 2) + blocks = [ + toy_random_old(n_nodes=half_nodes, densities=dens, seed=seed + i) + for i, dens in enumerate(densities) + ] + random_directed = np.block([blocks[:2], blocks[2:]]) + return random_directed + + np.random.seed(seed) + random_directed = np.random.normal(np.zeros((n_nodes, n_nodes)), 1) + thresh = np.percentile(random_directed.flatten(), 100 * densities, method="linear") + + random_directed = (random_directed < thresh).astype(int) + + random_directed -= np.diag(np.diag(random_directed)) + + return random_directed + + +def toy_magnetic(n_nodes, connect_center=False): + a_mag = np.zeros((n_nodes, n_nodes)) + + a_mag[0, 1:-1] = 1 + a_mag[1:-1, -1] = 1 + + if connect_center: + a_mag[-1, 0] = 1 + + return a_mag + + +def toy_bipartite(n_nodes, out_prop=0.5, density=1, seed=None): + half_nodes = int(n_nodes / 2) + + n_max_con = half_nodes**2 + n_con = int(density * n_max_con) + + if seed is None: + seed = int(np.random.normal(10000, 100)) + + np.random.seed(seed=seed) + sparse_edges_id = np.random.choice(n_max_con, n_con, replace=False) + np.random.seed(seed=seed + 1) + directed_edges_id = np.random.choice( + sparse_edges_id, int(out_prop * n_con), replace=False + ) + + out_con = np.zeros(n_max_con) + in_con = np.zeros(n_max_con) + + out_con[directed_edges_id] = 1 + in_con[[i for i in sparse_edges_id if i not in directed_edges_id]] = 1 + + a_bip = np.block( + [ + [ + np.zeros((half_nodes, half_nodes)), + out_con.reshape((half_nodes, half_nodes)), + ], + [ + in_con.reshape((half_nodes, half_nodes)).T, + np.zeros((half_nodes, half_nodes)), + ], + ] + ) + + return a_bip + + def toy_n_communities( nodes_per_com: int, n_com: int = 3, @@ -331,3 +490,52 @@ def toy_n_communities( ) return adj + + +def block_cycle( + nodes_per_com: int, + n_blocks: int = 3, + com_density: float = 0.5, + connect_density: Union[list[float], float] = 0.5, + seed: Optional[int] = None, +) -> np.ndarray: + + if seed is None: + seed = int(np.random.normal(10000, 100)) + + if isinstance(connect_density, (int, float)): + connect_density = [connect_density] * n_blocks + + communities = [ + random_graph( + nodes_per_com, edge_prob=com_density, directed=True, seed=seed + seed_i + ) + for seed_i in range(n_blocks) + ] + + connectors = [ + random_connector( + nodes_per_com, + edge_prob=p_edge, + directed=True, + out_prob=1, + seed=seed + seed_i, + )[0] + for seed_i, p_edge in enumerate(connect_density) + ] + + zero_com = np.zeros_like(communities[0]) + row_blocks = np.array( + [ + [communities[i], connectors[i]] + [zero_com] * (n_blocks - 2) + for i in range(n_blocks) + ] + ) + + for i in range(n_blocks): + row_blocks[i] = np.roll(row_blocks[i], i, axis=0) + + rows_conc = [np.concatenate(row_blocks[i], axis=1) for i in range(n_blocks)] + adj = np.concatenate(rows_conc, axis=0) + + return adj diff --git a/bimodularity/graph_plot.py b/bimodularity/graph_plot.py new file mode 100644 index 0000000..040d6e3 --- /dev/null +++ b/bimodularity/graph_plot.py @@ -0,0 +1,175 @@ +import numpy as np +import matplotlib.pyplot as plt +import networkx as nx + + +def plot_brain_graph( + graph, node_signal=None, edge_signal=None, layout="transverse", fig=None, ax=None +): + if ax is None: + fig, ax = plt.subplots(figsize=(10, 10)) + else: + fig = ax.figure + + return fig, ax + + +def plot_centroids( + edge_centroids, + adj, + labels, + clust_cmap, + node_pos, + e_cmap_name="turbo", + plot_graph=True, + plot_sag=False, + use_ratio=False, + centroid_threshold: float = 0, +): + n_clusters = edge_centroids.shape[0] + if plot_sag: + fig, axes = plt.subplots( + nrows=3, + ncols=n_clusters, + # figsize=(20, 10), + # figsize=(n_clusters * 3, 13), + figsize=(n_clusters * 5, 15), + gridspec_kw={"hspace": 0, "wspace": 0.02, "height_ratios": [1, 1, 0.6]}, + ) + elif plot_graph: + fig, axes = plt.subplots( + nrows=2, + ncols=n_clusters, + # figsize=(20, 10), + figsize=(n_clusters * 3, 10), + gridspec_kw={"hspace": 0, "wspace": 0.02}, + ) + else: + fig, axes = plt.subplots( + ncols=n_clusters, + # figsize=(20, 10), + figsize=(n_clusters * 3, 5), + gridspec_kw={"hspace": 0, "wspace": 0.02}, + ) + axes = axes[None, :] + + if n_clusters == 1: + axes = axes[:, None] + + # edge_list = nx.DiGraph(adj).edges() + edge_cmap = plt.get_cmap(e_cmap_name) + + for ax in axes.flat: + ax.axis("off") + + maxval = np.abs(edge_centroids).max() + minval = -maxval + + for k in range(n_clusters): + centroid_mat = np.zeros_like(adj, dtype=float) + edge_signal = edge_centroids[k].copy() + centroid_mat[adj != 0] = edge_signal + + if centroid_threshold > 0: + centroid_mat[np.abs(centroid_mat) < centroid_threshold] = 0 + + if use_ratio: + diff_mat = centroid_mat - centroid_mat.T + + # Removing negative values to show only directionality + dir_mask = diff_mat < 0 + centroid_mat[dir_mask] = 0 + # centroid_mat = centroid_mat**2 + + edge_signal = centroid_mat[centroid_mat != 0] + + graph_plot = nx.DiGraph(centroid_mat) + # maxval = np.abs(centroid_mat).max() + # minval = -maxval + imshow_cmap = "RdBu_r" + else: + edge_signal = centroid_mat[centroid_mat != 0] + + graph_plot = nx.Graph(centroid_mat) + # maxval = np.abs(centroid_mat).max() + # minval = -maxval + imshow_cmap = edge_cmap + + edge_list = nx.DiGraph(centroid_mat).edges() + + perc = np.sum(labels == k) / len(labels) + + axes[0, k].imshow( + centroid_mat, + cmap=imshow_cmap, + interpolation="none", + vmin=minval, + vmax=maxval, + ) + axes[0, k].plot([-0.5, len(adj) - 0.5], [-3, -3], color=clust_cmap(k), lw=4) + # axes[0, k].set_title(f"Cluster {k+1} $({100*perc:2.2f}\%)$", fontsize=16) + axes[0, k].axis("off") + + alpha = np.abs(edge_signal) # **2 + alpha = alpha / np.max(alpha) + + e_order = np.argsort(np.abs(edge_signal)) + # e_order = np.arange(len(edge_list)) + + if plot_graph: + axes[1, k].set_title( + f"Cluster {k+1} $({100*perc:2.2f}\%)$", fontsize=16, y=0.95 + ) + axes[1, k].scatter( + node_pos[:, 0], + node_pos[:, 1], + s=20, + color="silver", + edgecolors="k", + linewidths=1, + zorder=2, + ) + + graph_pos = { + i: (x, y) + for i, (x, y) in enumerate(zip(node_pos[:, 0], node_pos[:, 1])) + } + nx.draw_networkx_edges( + graph_plot, + pos=graph_pos, + ax=axes[1, k], + alpha=alpha[e_order], + edge_color=edge_signal[e_order], + edgelist=np.array(edge_list)[e_order], + edge_cmap=edge_cmap, + edge_vmin=minval, + edge_vmax=maxval, + ) + + if plot_sag: + axes[2, k].scatter( + node_pos[:, 1], + node_pos[:, 2], + s=20, + color="silver", + edgecolors="k", + linewidths=1, + zorder=2, + ) + graph_pos = { + i: (x, y) + for i, (x, y) in enumerate(zip(node_pos[:, 1], node_pos[:, 2])) + } + nx.draw_networkx_edges( + graph_plot, + pos=graph_pos, + ax=axes[2, k], + alpha=alpha[e_order], + edge_color=edge_signal[e_order], + edgelist=np.array(edge_list)[e_order], + edge_cmap=edge_cmap, + edge_vmin=minval, + edge_vmax=maxval, + ) + + return fig, axes diff --git a/bimodularity/palettes.py b/bimodularity/palettes.py new file mode 100644 index 0000000..84f6397 --- /dev/null +++ b/bimodularity/palettes.py @@ -0,0 +1,97 @@ +# Define Palettes +PASTEL = ["#FFADAD", "#A0C4FF", "#CAFFBF", "#FFC6FF"] + +CLUSTER = ["#3B4CC0", "#6C9BD2", "#9FD497", "#F6D746", "#F49B42", "#D34E24", "#8B1A1A"] + +CLUSTER_CB = [ + "#000000", + "#e6ab02", + "#1b9e77", + "#d95f02", + "#66a61e", + "#e7298a", + "#666666", + "#7570b3", + "#a6761d", +] + +CLUSTER_SOFT = [ + "#000000", + "#3B4CC0", + "#4878CF", + "#5DC863", + "#93D35C", + "#E6E681", + "#F6C141", + "#F49B42", + "#E66101", + "#D34E24", + "#B62F70", + "#7E3D8A", +] + +DIV_RB = [ + "#011959", + "#49C2EE", + "#ECECEC", + "#FEC461", + "#A3001E", +] + +DIV_RB_SILVER = [ + "#011959", + "#49C2EE", + "#ABABAB", + "#FEC461", + "#A3001E", +] + +EXTENDED_NCAR = [ + "#030303", + "#402F96", + "#88CCEE", + "#44AA99", + "#117733", + "#999933", + "#DDCC77", + "#CC6677", + "#882255", + "#AA4499", + "#DDDDDD", + "#77AADD", + "#4477AA", + "#66CCEE", + "#228833", + "#CCBB44", + "#EE6677", + "#AA3377", + "#BBBBBB", + "#6699CC", + "#4477AA", + "#77AADD", + "#99DDFF", + "#44BB99", + "#AAAA44", + "#DD6644", + "#BB4488", + "#CC99BB", +] + +SHORT_NCAR = [ + "#030303", + "#402F96", + "#88CCEE", + "#CC6677", + "#44AA99", + "#882255", + "#117733", + "#AA4499", + "#999933", + "#4477AA", + "#DDCC77", + "#DDDDDD", + "#2AA884", + "#7C7C7C", + "#AAAA44", + "#CC99BB", +] diff --git a/bimodularity/plotting.py b/bimodularity/plotting.py new file mode 100644 index 0000000..345c5c3 --- /dev/null +++ b/bimodularity/plotting.py @@ -0,0 +1,1778 @@ +from typing import Optional +from matplotlib.gridspec import GridSpecFromSubplotSpec +from matplotlib.colors import to_rgb +import pandas as pd +import numpy as np +import matplotlib.pyplot as plt +from matplotlib.lines import Line2D +from matplotlib.colors import Normalize +from matplotlib.cm import ScalarMappable + +import networkx as nx +import nibabel as nib +from nilearn import datasets +from nilearn.surface import vol_to_surf +from nilearn.plotting import plot_surf_stat_map, plot_surf_contours + +from skimage.segmentation import expand_labels + +# from dgsp import configuration_null, modularity_matrix, modularity_quadratic, sorted_SVD +from dgsp import ( + configuration_null, + modularity_matrix, + modularity_quadratic, + sorted_SVD, + bimod_index_edges, + bimod_index_nodes, + bimod_index_quad, +) + +# Red, Blue, Green, Purple +PALETTE = ["#FFADAD", "#A0C4FF", "#CAFFBF", "#FFC6FF"] +PALETTE_RGB = [to_rgb(c) for c in PALETTE] +EDGE_PALETTE = np.array(["tab:red", "tab:blue", "tab:green", "tab:gray"]) + + +def community_pos(n_nodes, seed=123, n_nodes_per_com=None): + + if n_nodes_per_com is None: + half_node = int(n_nodes / 2) + n_nodes_per_com = [half_node] * 2 + + com_spaces = np.linspace(-0.5, 0.5, len(n_nodes_per_com)) + + np.random.seed(seed) + + pos_com = {} + k = 0 + for com_id, n_in_com in enumerate(n_nodes_per_com): + + scatters = np.random.normal(np.zeros((n_in_com, 2)), 0.1) + pos_com.update( + { + k + i: np.array([scatters[i, 0], com_spaces[com_id] + scatters[i, 1]]) + for i in range(n_in_com) + } + ) + k = len(pos_com) + + return pos_com + + +def square_community_pos(nodes_per_com: int, n_com: int, seed=1234): + np.random.seed(seed) + + random_scatter = np.random.normal(0, 0.1, (nodes_per_com, 2)) + + com_square = np.array([[0.5, 0.5], [-0.5, 0.5], [0.5, -0.5], [-0.5, -0.5]]) + + pos_com = {} + for com_id in np.arange(n_com): + pos_com.update( + { + com_id * nodes_per_com + + i: np.array( + [ + com_square[com_id, 0] + random_scatter[i, 0], + com_square[com_id, 1] + random_scatter[i, 1], + ] + ) + for i in range(nodes_per_com) + } + ) + return pos_com + + +def draw_graph( + G, + pos, + ax: Optional[plt.Axes] = None, + arrows: Optional[bool] = None, + with_labels: bool = True, + node_kwds: dict = {}, + edge_kwds: dict = {}, + label_kwds: dict = {}, +): + """_summary_ + + Parameters + ---------- + G : _type_ + _description_ + pos : _type_ + _description_ + ax : Optional[plt.Axes], optional + _description_, by default None + arrows : Optional[bool], optional + _description_, by default None + with_labels : bool, optional + _description_, by default True + node_kwds : dict, optional + _description_, by default {} + edge_kwds : dict, optional + _description_, by default {} + label_kwds : dict, optional + _description_, by default {} + """ + + nx.draw_networkx_nodes(G, pos, ax=ax, **node_kwds) + nx.draw_networkx_edges(G, pos, arrows=arrows, ax=ax, **edge_kwds) + if with_labels: + nx.draw_networkx_labels(G, pos, ax=ax, **label_kwds) + + +def custom_draw( + axis, + a_mat: np.ndarray, + position: str = "com", + community_vector: Optional[np.ndarray] = None, + node_size: int = 300, + edge_alpha: float = 0.1, + cm_scale: int = 20, + labels: Optional[dict] = None, + colors: Optional[np.ndarray] = None, + direct: bool = True, + **kwargs, +): + n_nodes = len(a_mat) + + edge_kw = {"alpha": edge_alpha, "connectionstyle": "arc3,rad=0.2"} + if direct: + mytoy_graph = nx.DiGraph(a_mat) + edge_kw.update({"arrowsize": 20}) + else: + mytoy_graph = nx.Graph(a_mat) + + pos = nx.spring_layout(mytoy_graph) + if isinstance(position, dict): + pos = position + else: + if "com" in position: + pos = community_pos(n_nodes, **kwargs) + elif "bip" in position: + pos = nx.bipartite_layout(mytoy_graph, **kwargs) + elif "square" in position: + pos = square_community_pos(n_nodes // 4, 4) + + node_color = "tab:blue" + if community_vector is not None: + if isinstance(community_vector[0], float): + mycm = plt.cm.get_cmap("coolwarm", cm_scale) + node_color = mycm( + ( + cm_scale // 2 + + np.trunc(cm_scale * community_vector) + + np.sign(community_vector) + ).astype(int) + ) + else: + if colors is None: + mycm = plt.cm.get_cmap("tab10") + node_color = mycm(community_vector) + else: + node_color = [colors[i] for i in community_vector] + + # nx.draw( + # mytoy_graph, + # pos=pos, + # with_labels=True, + # ax=axis, + # arrowsize=20, + # node_color=node_color, + # # connectionstyle="arc3,rad=0.1", + # ) + + draw_graph( + mytoy_graph, + pos=pos, + ax=axis, + node_kwds={"node_size": node_size, "node_color": node_color}, + edge_kwds=edge_kw, + label_kwds={"labels": labels}, + ) + + return axis + + +def plot_graph( + a_mat: np.ndarray, + position: str = "com", + draw_half_line: bool = False, + community_vector: Optional[np.ndarray] = None, + edge_alpha: float = 0.1, + labels: Optional[dict] = None, + colors: Optional[np.ndarray] = None, + **kwargs, +): + n_nodes = len(a_mat) + + fig, ax = plt.subplots(ncols=3, figsize=(20, 8)) + + ax[0].imshow(a_mat) + + if draw_half_line: + ax[0].plot([-0.5, n_nodes - 0.5], [n_nodes / 2 - 0.5] * 2, c="w") + ax[0].plot([n_nodes / 2 - 0.5] * 2, [-0.5, n_nodes - 0.5], c="w") + + mytoy_graph = nx.Graph(a_mat) + + pos = nx.spring_layout(mytoy_graph) + if isinstance(position, dict): + pos = position + else: + if "com" in position: + pos = community_pos(n_nodes, **kwargs) + elif "bip" in position: + pos = nx.bipartite_layout(mytoy_graph, **kwargs) + elif "square" in position: + pos = square_community_pos(n_nodes // 4, 4) + + node_color = "tab:blue" + if community_vector is not None: + if isinstance(community_vector[0], float): + mycm = plt.cm.get_cmap("coolwarm", 20) + # node_color = mycm(1 + np.sign(np.around(community_vector, 3))) + node_val = (10 + 30 * community_vector).astype(int) + node_color = mycm(node_val) + else: + if colors is None: + mycm = plt.cm.get_cmap("tab10") + node_color = mycm(community_vector) + else: + node_color = [colors[i] for i in community_vector] + + if labels is None: + labels = {i: i for i in range(n_nodes)} + + draw_graph( + mytoy_graph, + pos=pos, + ax=ax[1], + node_kwds={"node_color": node_color}, + edge_kwds={"alpha": edge_alpha}, + label_kwds={"labels": labels}, + ) + + mytoy_graph = nx.DiGraph(a_mat) + + draw_graph( + mytoy_graph, + pos=pos, + ax=ax[2], + node_kwds={"node_color": node_color}, + edge_kwds={"alpha": edge_alpha, "arrowsize": 20, "connectionstyle": "arc3"}, + label_kwds={"labels": labels}, + ) + + ax[1].set_axis_off() + ax[2].set_axis_off() + + return fig, ax + + +def plot_graph_community( + a_mat: np.ndarray, + community_vector: np.ndarray, + position: str = "com", + draw_half_line: bool = False, + **kwargs, +): + n_nodes = len(a_mat) + + fig, ax = plt.subplots(ncols=3, figsize=(15, 8)) + + mytoy_graph = nx.Graph(a_mat) + + pos = nx.spring_layout(mytoy_graph) + if "com" in position: + pos = community_pos(n_nodes, **kwargs) + elif "bip" in position: + pos = nx.bipartite_layout(mytoy_graph, **kwargs) + + nx.draw(mytoy_graph, pos=pos, with_labels=True, ax=ax[0]) + + for ax_i, com_vec in enumerate(community_vector): + if isinstance(com_vec[0], float): + cmap = "coolwarm" + max_val = np.max(np.abs(com_vec)) + vmin = -max_val + vmax = max_val + else: + cmap = "tab10" + vmin = com_vec.min() + vmax = com_vec.max() + + ax[1 + ax_i].set_title(f"Community {ax_i+1}") + mytoy_graph = nx.DiGraph(a_mat) + nx.draw( + mytoy_graph, + pos=pos, + with_labels=True, + ax=ax[1 + ax_i], + arrowsize=20, + node_color=com_vec, + cmap=cmap, + vmin=vmin, + vmax=vmax, + ) + + return fig, ax + + +def plot_bipartite_SVD( + adj: np.ndarray, + U: np.ndarray, + Vh: np.ndarray, + vector_id: int = 0, + node_size: int = 300, + edge_alpha: float = 0.1, + clusters: Optional[np.ndarray] = None, + colors: Optional[np.ndarray] = None, + labels: Optional[str] = None, + ax=None, + **kwargs, +): + + # Building bipartite graph + graph_bip = np.hstack([np.zeros_like(adj), adj]) + graph_bip = np.vstack([graph_bip, np.zeros_like(graph_bip)]) + + # Sorting rows by U and columns by Vh + sort_by_U = np.argsort(U[:, vector_id]) + sort_by_V = np.argsort(Vh[vector_id]) + + row_ids = np.concatenate([sort_by_U, len(sort_by_U) + sort_by_U]) + col_ids = np.concatenate([sort_by_V, len(sort_by_V) + sort_by_V]) + + sorted_graph_bip = graph_bip[row_ids][:, col_ids] + + if clusters is None: + com_vec = np.concatenate([U[sort_by_U, vector_id], Vh[vector_id, sort_by_V]]) + else: + com_vec = np.concatenate([clusters, clusters]) + # com_vec = np.concatenate([clusters[sort_by_U], clusters[sort_by_V]]) + + no_labels = {i: "" for i in range(graph_bip.shape[0])} + + pos_x = [ + ((2 * i) // (graph_bip.shape[0])) * 2 - 1 for i in range(graph_bip.shape[0]) + ] + pos_y = np.concatenate([U[:, vector_id], Vh[vector_id]]) + + pos = {i: (x, y) for i, (x, y) in enumerate(zip(pos_x, pos_y))} + # pos = {i: (((2 * i) // (graph_bip.shape[0])) * 2 - 1, ) for i in range(graph_bip.shape[0])} + + fig, axes = plt.subplots(figsize=(8, 10)) + axes = custom_draw( + axes, + sorted_graph_bip, + position=pos, + # position="bipartite", + nodes=np.arange(graph_bip.shape[0] // 2), + community_vector=com_vec, + node_size=node_size, + edge_alpha=edge_alpha, + labels=no_labels, + colors=colors, + **kwargs, + ) + + if labels is not None: + side_x = np.array([-1.1, 1.1]) + + for side_id, (side, vect) in enumerate(zip([sort_by_U, sort_by_V], [U, Vh.T])): + for i, label in enumerate(labels[side]): + axes.text( + side_x[side_id], + vect[side[i], vector_id], + label, + ha="center", + va="center", + fontsize=10, + color="k", + ) + + plt.tick_params(left=True, bottom=True, labelleft=True, labelbottom=True) + + return fig, ax + + +def plot_cluster_bipartite( + adj: np.ndarray, + U: np.ndarray, + Vh: np.ndarray, + clusters: np.ndarray, + vector_id: int = 0, + node_size: int = 300, + edge_alpha: float = 0.1, + colors: Optional[np.ndarray] = None, + labels: Optional[str] = None, + ax=None, + **kwargs, +): + + # Building bipartite graph + graph_bip = np.hstack([np.zeros_like(adj), adj]) + graph_bip = np.vstack([graph_bip, np.zeros_like(graph_bip)]) + + sorting_df = pd.DataFrame( + { + "cluster": clusters, + "U": np.sign((U[:, vector_id])), + "V": np.sign((Vh[vector_id])), + "label": labels, + } + ) + sort_by_U = sorting_df.sort_values(["U", "cluster"]).index.to_numpy() + sort_by_V = sorting_df.sort_values(["V", "cluster"]).index.to_numpy() + + # Sorting rows by U and columns by Vh + sort_by_com = np.argsort(clusters) + + # row_ids = np.concatenate([sort_by_com, len(sort_by_com) + sort_by_com]) + row_ids = np.concatenate([sort_by_U, len(sort_by_U) + sort_by_U]) + col_ids = np.concatenate([sort_by_V, len(sort_by_V) + sort_by_V]) + + sorted_graph_bip = graph_bip[row_ids][:, col_ids] + + # com_vec = np.concatenate([U[sort_by_com, vector_id], Vh[vector_id, sort_by_com]]) + com_vec = np.concatenate([U[sort_by_U, vector_id], Vh[vector_id, sort_by_V]]) + + no_labels = {i: "" for i in range(graph_bip.shape[0])} + + pos_y = [ + -(((2 * i) // (graph_bip.shape[0])) * 2 - 1) for i in range(graph_bip.shape[0]) + ] + + pos_x = np.concatenate([np.arange(graph_bip.shape[0] // 2)] * 2) + # pos_x = np.concatenate([sort_by_U, sort_by_V]) + + # space = 5 + # pos_y = np.concatenate([np.arange(0, space * graph_bip.shape[0] // 2, space)] * 2) + + pos = {i: (x, y) for i, (x, y) in enumerate(zip(pos_x, pos_y))} + + # fig, axes = plt.subplots(figsize=(8, 30)) + fig, axes = plt.subplots(figsize=(30, 8)) + axes = custom_draw( + axes, + sorted_graph_bip, + position=pos, + # position="bipartite", + nodes=np.arange(graph_bip.shape[0] // 2), + community_vector=com_vec, + node_size=node_size, + edge_alpha=edge_alpha, + cm_scale=3, + labels=no_labels, + direct=False, + **kwargs, + ) + + if labels is not None: + + # for i, label in enumerate(labels[sort_by_com]): + # axes.text( + # -1.08, + # pos_y[i], + # label, + # ha="right", + # va="center", + # fontsize=8, + # color="k", + # ) + + side_x = np.array([-1.08, 1.08]) + va = ["top", "bottom"] + for side_id in [0, 1]: + for i, label in enumerate(labels[[sort_by_V, sort_by_U][side_id]]): + axes.text( + # side_x[side_id], + # pos_y[i], + pos_x[i], + side_x[side_id], + label, + ha="center", + va=va[side_id], + rotation=90, + fontsize=6, + color="k", + ) + + scatter_pos = np.array(list(pos.values())).T + + plt.scatter( + scatter_pos[0], + 1.05 * scatter_pos[1], + c=np.concatenate([clusters[sort_by_U], clusters[sort_by_V]]), + s=30, + marker="s", + cmap="Set1", + vmax=9, + ) + + cumsum_start = -0.5 + cluster_series = pd.Series(clusters) + + # for n_type, c in zip(np.unique(clusters), colors): + # + # cumsum_end = cumsum_start + cluster_series.value_counts()[n_type] + # # axes.plot([-1, 1], [cumsum_end] * 2, lw=4, color="tab:green", alpha=0.5) + # # axes.plot([-1.05] * 2, [cumsum_start, cumsum_end], lw=6, color=c, alpha=0.8) + # # axes.plot([1.05] * 2, [cumsum_start, cumsum_end], lw=6, color=c, alpha=0.8) + # + # axes.plot([cumsum_start, cumsum_end], [-1.05] * 2, lw=6, color=c, alpha=0.8) + # axes.plot([cumsum_start, cumsum_end], [1.05] * 2, lw=6, color=c, alpha=0.8) + # cumsum_start = cumsum_end + + # plt.axis([-1.2, 1.2, -1, len(clusters) + 1]) + plt.axis([-1, len(clusters) + 1, -1.3, 1.3]) + # plt.tick_params(left=True, bottom=True, labelleft=True, labelbottom=True) + + return fig, ax + + +def plot_flow( + adj: np.ndarray, + U: np.ndarray, + Vh: np.ndarray, + clusters: np.ndarray, + vector_id: int = 0, + node_size: int = 300, + edge_alpha: float = 0.1, + colors: Optional[np.ndarray] = None, + labels: Optional[str] = None, + ax=None, + **kwargs, +): + pos_x = [] + + for i, cluster_val in enumerate(np.unique(clusters)): + cluster_mask = clusters == cluster_val + + # Sorting rows by U and columns by Vh + sort_by_com = np.argsort(clusters) + + row_ids = np.concatenate([sort_by_com, len(sort_by_com) + sort_by_com]) + + sorted_graph_bip = graph_bip[row_ids][:, row_ids] + + com_vec = np.concatenate([U[sort_by_com, vector_id], Vh[vector_id, sort_by_com]]) + + no_labels = {i: "" for i in range(graph_bip.shape[0])} + + pos_x = [ + ((2 * i) // (graph_bip.shape[0])) * 2 - 1 for i in range(graph_bip.shape[0]) + ] + + pos_y = np.concatenate([np.arange(graph_bip.shape[0] // 2)] * 2) + # space = 5 + # pos_y = np.concatenate([np.arange(0, space * graph_bip.shape[0] // 2, space)] * 2) + + pos = {i: (x, y) for i, (x, y) in enumerate(zip(pos_x, pos_y))} + + fig, axes = plt.subplots(figsize=(8, 30)) + axes = custom_draw( + axes, + sorted_graph_bip, + position=pos, + # position="bipartite", + nodes=np.arange(graph_bip.shape[0] // 2), + community_vector=com_vec, + node_size=node_size, + edge_alpha=edge_alpha, + cm_scale=3, + labels=no_labels, + **kwargs, + ) + + if labels is not None: + + for i, label in enumerate(labels[sort_by_com]): + axes.text( + -1.08, + pos_y[i], + label, + ha="right", + va="center", + fontsize=8, + color="k", + ) + + cumsum_start = -0.5 + cluster_series = pd.Series(clusters) + + for n_type, c in zip(np.unique(clusters), colors): + + cumsum_end = cumsum_start + cluster_series.value_counts()[n_type] + # axes.plot([-1, 1], [cumsum_end] * 2, lw=4, color="tab:green", alpha=0.5) + axes.plot([-1.05] * 2, [cumsum_start, cumsum_end], lw=6, color=c, alpha=0.8) + axes.plot([1.05] * 2, [cumsum_start, cumsum_end], lw=6, color=c, alpha=0.8) + cumsum_start = cumsum_end + + # plt.axis([-1.2, 1.2, -1, len(clusters) + 1]) + # plt.tick_params(left=True, bottom=True, labelleft=True, labelbottom=True) + + return fig, ax + + +def SVD_summary( + a_mat, + nulls_names: Optional[list] = None, + reconstructions_ids: list = [0, 1, -1], + show_mod: bool = True, + vector_subsample: int = 5, + sort_by_q: bool = False, + add_undirected: list = [], +) -> list[tuple]: + # Overview of SVD decomposition of the modularity matrix + + all_nulls_names = nulls_names.copy() + if nulls_names is None: + all_nulls_names = ["z_in", "z_out", "z_inout", "z_outin"] + + if isinstance(add_undirected, str): + add_undirected = [add_undirected] + + all_nulls_names += ["z_in"] * len(add_undirected) + + n_reco = len(reconstructions_ids) + + mod_id = 1 + if show_mod: + mod_id = 2 + + _, ax = plt.subplots( + nrows=len(all_nulls_names), + ncols=mod_id + 3 + n_reco, + figsize=(5 * (n_reco + 2), 4 * len(all_nulls_names)), + ) + + # Make it work when all_nulls_names has only 1 element + ax = np.atleast_2d(ax) + + all_svds = [] + + undir_i = 0 + + # for i_null, (null, null_name) in enumerate(zip(all_nulls, all_nulls_names)): + for i_null, null_name in enumerate(all_nulls_names): + + if i_null == len(all_nulls_names) - len(add_undirected) + undir_i: + if add_undirected[undir_i] == "sum": + a_undir = a_mat + a_mat.T + ax[i_null, 0].set_title("$A+A^T$") + elif add_undirected[undir_i] == "ATA": + a_undir = a_mat.T @ a_mat + ax[i_null, 0].set_title(r"$A^T\dot A$") + elif add_undirected[undir_i] == "AAT": + a_undir = a_mat @ a_mat.T + ax[i_null, 0].set_title(r"$A\dot A^T$") + undir_i += 1 + + null = configuration_null(a_undir, null_model=null_name.split("_")[-1]) + mod_mat = a_undir - null / a_undir.sum() + + ax[i_null, 0].matshow(a_undir) + + else: + null = configuration_null(a_mat, null_model=null_name.split("_")[-1]) + mod_mat = a_mat - null / a_mat.sum() + + ax[i_null, 0].matshow(a_mat) + ax[i_null, 0].set_title("$A$") + + ax[i_null, 1].matshow(null) + ax[i_null, 1].set_title(null_name) + + if show_mod: + ax[i_null, mod_id].matshow(mod_mat) + ax[i_null, mod_id].set_title("$M=A-Z$") + + U, S, Vh = sorted_SVD(mod_mat, sort_by_q=sort_by_q) + + all_svds.append((U, S, Vh)) + + # SVD Reconstructions + for i_rec, rec_id in enumerate(reconstructions_ids): + s_vec = np.zeros(len(a_mat)) + s_vec[rec_id] = S[rec_id] + + rec = U @ np.diag(s_vec) @ Vh + + q = modularity_quadratic(mod_mat, U[:, rec_id]) + + ax[i_null, mod_id + 1 + i_rec].matshow( + rec, vmin=-0.1, vmax=0.1, cmap="coolwarm" + ) + ax[i_null, mod_id + 1 + i_rec].set_title( + f"i={rec_id}, S={S[rec_id]:1.2f}, Q={q:1.2f}" + ) + + # SVD Vectors + maxval = 0.5 + + u_quad = modularity_quadratic(mod_mat, U[:, 0]) + v_quad = modularity_quadratic(mod_mat, Vh[0]) + + u_id = mod_id + 1 + n_reco + ax[i_null, u_id].imshow( + np.vstack([S[:vector_subsample], U[:, :vector_subsample]]), + cmap="coolwarm", + vmin=-maxval, + vmax=maxval, + ) + ax[i_null, u_id].plot( + [-0.5, len(S[:vector_subsample]) - 0.5], [0.5, 0.5], lw=2, c="k" + ) + ax[i_null, u_id].set_title(f"$U$, $Q={u_quad:1.5f}$") + + v_id = u_id + 1 + ax[i_null, v_id].imshow( + np.hstack([S.reshape((-1, 1))[:vector_subsample], Vh[:vector_subsample]]), + cmap="coolwarm", + vmin=-maxval, + vmax=maxval, + ) + ax[i_null, v_id].plot( + [0.5, 0.5], [-0.5, len(S[:vector_subsample]) - 0.5], lw=2, c="k" + ) + ax[i_null, v_id].set_title(f"$V^H$, $Q={v_quad:1.5f}$") + return all_svds + + +def plot_benchmark_results( + benchmark_results: np.ndarray, + e_prob_range: list, + con_prob_range: list, + out_prob_range: list, + null_model: str = "z_in", +): + fig, axes = plt.subplots( + 1, len(out_prob_range), figsize=(5 * (1 + len(out_prob_range)), 5) + ) + + fig.suptitle( + f"SVD prediction with different output probabilities - Null model: {null_model}" + ) + + for ax_i, ax in enumerate(axes): + image = ax.imshow( + benchmark_results.mean(axis=0)[:, :, ax_i, 0], vmin=0, vmax=10 + ) + plt.colorbar(image, ax=ax) + + ax.set_title(f"Prediction errors (#) - out_prob={out_prob_range[ax_i]}") + ax.set_xlabel("connection probability") + ax.set_xticks( + np.arange(len(con_prob_range)), labels=[f"{i:1.2f}" for i in con_prob_range] + ) + ax.set_ylabel("edge probability") + ax.set_yticks( + np.arange(len(e_prob_range)), labels=[f"{i:1.2f}" for i in e_prob_range] + ) + + return + + +def plot_s_and_q(a_mat, null_model="in", fix_negative=True): + mod_mat = modularity_matrix(a_mat, null_model=null_model) + U, S, Vh = sorted_SVD(mod_mat, fix_negative=fix_negative) + + q_ui = np.array([modularity_quadratic(mod_mat, U[:, i]) for i in range(len(S))]) + q_vi = np.array([modularity_quadratic(mod_mat, Vh[i]) for i in range(len(S))]) + + fig, axes = plt.subplots(figsize=(8, 8)) + axes.plot(S, label="Singular values", lw=4) + axes.plot(q_ui, label="Modularity index (U)", lw=2, ls="--") + axes.plot(q_vi, label="Modularity index (V)", lw=2, ls=":") + + axes.set_xlabel("Singular value/vector index") + axes.set_ylabel("Value") + + axes.legend() + + return + + +def plot_singular_against_modality(a_mat, null_model="in", fix_negative=True): + + mod_mat = modularity_matrix(a_mat, null_model=null_model) + U, S, Vh = sorted_SVD(mod_mat, fix_negative=fix_negative) + + mod_values = np.zeros_like(S) + + for rec_id in np.arange(mod_mat.shape[0]): + ui = U[:, rec_id] + mod_values[rec_id] = modularity_quadratic(mod_mat, ui) + + _, axes = plt.subplots(figsize=(8, 8)) + + axes.scatter(S, mod_values, c=np.arange(len(S)), cmap="plasma", s=100) + axes.plot([S.min(), S.max()], [S.min(), S.max()], c="k", ls="--") + axes.set_xlabel("Singular values") + axes.set_ylabel("Modularity index") + + +def plot_svect_evolution( + u_list: np.ndarray, + v_list: np.ndarray, + dir_edge_list: np.ndarray, + n_subset: int = 10, + offset: float = 0.15, +) -> None: + + lowest_sub = min([n_subset, len(u_list)]) + + _, ax_solo = plt.subplots(1, 1, figsize=(25, 5 + lowest_sub)) + + line_styles = [":", "--"] + line_labels = ["$u_1$", "$v_1$"] + scatter_mark = ["$u$", "$v$"] + + for vec_id, vect in enumerate([u_list, np.moveaxis(v_list, 1, 2)]): + colors = plt.colormaps["plasma"](np.linspace(0, 1, lowest_sub)) + + for i, u in enumerate(vect[1:lowest_sub, :, 0]): + if offset > 0: + ax_solo.plot(vect[0, :, 0] - i * offset, lw=1, c="tab:green") + + ax_solo.scatter( + dir_edge_list[i][vec_id, 0], + u[dir_edge_list[i][vec_id, 0]] - i * offset, + s=150, + marker=scatter_mark[vec_id], + color=colors[i], + ) + ax_solo.plot( + u - i * offset, line_styles[vec_id], lw=3, c=colors[i], alpha=0.8 + ) + + custom_legend = [ + Line2D([0], [0], ls=style, color=colors[0], lw=2) for style in line_styles + ] + + ax_solo.legend(custom_legend, line_labels, handlelength=6) + + +def plot_svect_evolution_stem( + u_list: np.ndarray, + v_list: np.ndarray, + dir_edge_list: np.ndarray, + n_subset: int = 10, + offset: float = 0.15, +) -> None: + + lowest_sub = min([n_subset, len(u_list)]) + + _, ax_solo = plt.subplots(1, 1, figsize=(25, 5 + lowest_sub)) + + line_styles = [":", "--"] + line_labels = ["$u_1$", "$v_1$"] + scatter_mark = ["o", "s"] + + for vec_id, vect in enumerate([u_list, np.moveaxis(v_list, 1, 2)]): + colors = plt.colormaps["plasma"](np.linspace(0, 1, lowest_sub)) + + for i, u in enumerate(vect[1:lowest_sub, :, 0]): + diff = vect[0, :, 0] - u + mark, stem, base = ax_solo.stem( + diff - i * offset, + bottom=-i * offset, + markerfmt="", + linefmt=line_styles[vec_id], + ) + base.set_color(colors[i]) + stem.set_color(colors[i]) + stem.set_linewidth(2) + ax_solo.scatter( + dir_edge_list[i][vec_id, 0], + diff[dir_edge_list[i][vec_id, 0]] - i * offset, + s=50, + marker=scatter_mark[vec_id], + edgecolor=colors[i], + color="none", + ) + + custom_legend = [ + Line2D([0], [0], ls=style, color=colors[0], lw=2) for style in line_styles + ] + + ax_solo.legend(custom_legend, line_labels, handlelength=6) + + ax_solo.set_yticks( + -offset * np.arange(lowest_sub - 1), labels=np.arange(lowest_sub - 1) + 1 + ) + ax_solo.set_ylabel("Number of directed edges") + + +def add_cbar(fig, ax, **kwargs): + """Add a colorbar to an existing figure/axis. + + Parameters + ---------- + fig : matplotlib.figure.Figure + figure to get the colorbar from + ax : matplotlib.axes.Axes + axes to add the colorbar to + + Returns + ------- + tuple(matplotlib.figure.Figure, matplotlib.axes.Axes) + tuple of figure and axes with the colorbar added + """ + from mpl_toolkits.axes_grid1 import make_axes_locatable + + divider = make_axes_locatable(ax) + cax = divider.append_axes("right", size="5%", pad=0.05) + fig.colorbar(ax.get_children()[0], cax=cax, orientation="vertical", **kwargs) + return fig, ax + + +def plot_bicommunity_lines(send_com, receive_com, axes=None): + + n_clusters = send_com.shape[0] + + cmap = plt.get_cmap("tab20") + + for i in np.arange(1, n_clusters + 1): + axes.plot(0.9 * send_com[i - 1].T + i, lw=2, color=cmap(i)) + axes.plot(0.9 * receive_com[i - 1].T + i, lw=2, ls="--", color=cmap(i)) + + axes.set_yticks( + np.arange(1, n_clusters + 1) + 0.4, + labels=[f"$C_{{{i}}}$" for i in np.arange(1, n_clusters + 1)], + fontsize=15, + ) + axes.set_ylabel("Node cluster probabilities", fontsize=15) + axes.set_xlabel("Nodes", fontsize=15) + + return axes + + +def plot_bicommunity( + adjacency, + send_com, + receive_com, + fig=None, + axes=None, + graph_pos=None, + lw=1, + edge_alpha=0.05, + draw_arrows=False, + cmap=None, + s=80, + s_scale=5 / 8, +): + if fig is None: + fig, axes = plt.subplots(figsize=(10, 10)) + + if graph_pos is None: + graph_pos = nx.spring_layout(nx.DiGraph(adjacency)) + + node_pos = np.array(list(graph_pos.values())).T + + if draw_arrows: + nx.draw_networkx_edges( + nx.DiGraph(adjacency), pos=graph_pos, alpha=edge_alpha, ax=axes + ) + else: + nx.draw_networkx_edges( + nx.Graph(adjacency), pos=graph_pos, alpha=edge_alpha, ax=axes + ) + + is_in_none = np.logical_and(send_com == 0, receive_com == 0) + is_in_both = np.logical_and(send_com > 0, receive_com > 0) + send_only = np.logical_and(send_com > 0, receive_com == 0) + receive_only = np.logical_and(send_com == 0, receive_com > 0) + + if cmap is None: + cmap = "RdBu_r" + + axes.scatter( + node_pos[0, is_in_none], + node_pos[1, is_in_none], + s=s * s_scale, + c="tab:gray", + edgecolor="k", + linewidth=lw / 2, + zorder=2, + ) + axes.scatter( + node_pos[0, send_only], + node_pos[1, send_only], + s=s, + c=send_com[send_only], + # cmap="RdBu_r", + cmap=cmap, + edgecolor="k", + marker="s", + linewidth=lw, + zorder=2, + vmin=-1, + vmax=1, + ) + axes.scatter( + node_pos[0, receive_only], + node_pos[1, receive_only], + s=s, + c=-receive_com[receive_only], + # cmap="RdBu_r", + cmap=cmap, + edgecolor="k", + marker="D", + linewidth=lw, + zorder=2, + vmin=-1, + vmax=1, + ) + axes.scatter( + node_pos[0, is_in_both], + node_pos[1, is_in_both], + s=s, + c=send_com[is_in_both] - receive_com[is_in_both], + cmap=cmap, + # c="w", + edgecolor="k", + marker="o", + linewidth=lw, + zorder=2, + vmin=-1, + vmax=1, + ) + + return fig, axes + + +def plot_bimod_indices( + bimod, + fig=None, + axes=None, + sum_power=2, + offset=0, + title="", + width=0.4, + color=None, +): + if axes is None: + fig, axes = plt.subplots(figsize=(20, 10)) + + if color is None: + color = PALETTE[0] + + com_gs = GridSpecFromSubplotSpec(nrows=1, ncols=2, subplot_spec=axes) + axes.set_visible(False) + + com_axes = [fig.add_subplot(gs) for gs in com_gs] + + sort_i = np.flip(np.argsort(bimod)) + + com_axes[0].bar( + np.arange(len(sort_i)) + offset, + bimod[sort_i], + label=title, + width=width, + color=color, + linewidth=2, + edgecolor="tab:blue", + ) + + com_axes[0].axhline(0, color="k", zorder=0, lw=2) + + c_labels = [f"$C_{{{i+1}}}$" for i in sort_i] + com_axes[0].set_ylabel("Contribution to bimodularity", fontsize=20) + com_axes[0].set_xticks(np.arange(len(bimod)), labels=c_labels) + com_axes[0].tick_params(labelsize=18) + + bimod = bimod**sum_power / np.sum(bimod**sum_power) + + com_axes[1].plot( + np.cumsum(bimod[sort_i]), + lw=4, + marker="o", + markersize=10, + color=color, + label=title, + ) + + com_axes[1].axhline(1, color="k", ls=":", zorder=0, lw=2, alpha=0.5) + + com_axes[1].set_ylim(0, 1.1) + com_axes[1].set_ylabel("Cumulative bimodularity", fontsize=20) + com_axes[1].set_xticks(np.arange(len(bimod)), labels=c_labels) + com_axes[1].tick_params(labelsize=18) + + return fig, axes + + +def plot_all_bicommunity( + adjacency, + send_com, + receive_com, + fig=None, + axes=None, + layout="embedding", + scatter_only=False, + titles=None, + nrows=1, + draw_legend=True, + legend_on_ax=False, + cmap=None, + gspec_wspace=0, + gspec_hspace=0.05, + **kwargs, +): + + com_gs = GridSpecFromSubplotSpec( + nrows=nrows, + ncols=len(send_com) // nrows + (len(send_com) % nrows), + # ncols=len(send_com) // nrows, + subplot_spec=axes, + wspace=gspec_wspace, + hspace=gspec_hspace, + ) + # axes.set_visible(False) + axes.axis("off") + com_axes = [fig.add_subplot(gs) for gs in com_gs] + + if isinstance(layout, dict): + graph_pos = layout.copy() + elif layout == "embedding": + U, _, Vh = sorted_SVD(modularity_matrix(adjacency)) + V = Vh.T + + graph_pos = {i: (U[i, 0], V[i, 0]) for i, _ in enumerate(adjacency)} + else: + graph_pos = nx.spring_layout(nx.DiGraph(adjacency)) + + if titles is None: + titles = [f"Com {i+1}" for i in range(len(send_com))] + + for i, title in enumerate(titles): + com_axes[i].set_title(title, fontsize=20) + + if cmap is None: + cmap = plt.get_cmap("RdBu_r") + elif isinstance(cmap, str): + cmap = plt.get_cmap(cmap, 5) + + for i, (send, receive) in enumerate(zip(send_com, receive_com)): + + com_axes[i].set_facecolor("none") + + if scatter_only: + com_axes[i].scatter(send, receive) + else: + plot_bicommunity( + adjacency, + send, + receive, + fig=fig, + axes=com_axes[i], + graph_pos=graph_pos, + cmap=cmap, + **kwargs, + ) + + com_axes[i].spines[:].set_visible(False) + com_axes[-1].spines[:].set_visible(False) + com_axes[-1].tick_params( + left=False, bottom=False, labelleft=False, labelbottom=False + ) + + leg_titles = ["Send", "Both", "Receive"] + markers = ["s", "o", "D"] + + colors = [cmap(i) for i in range(3)] + custom_legend = [ + Line2D( + [0], + [0], + color="w", + marker=markers[i], + markeredgecolor="k", + markerfacecolor=cmap(1 + i), + markersize=10, + ) + for i, _ in enumerate(leg_titles) + ] + + if draw_legend: + if legend_on_ax: + axes.legend( + custom_legend, + leg_titles, + loc="lower center", + ncol=3, + fontsize=20, + bbox_to_anchor=(0.5, -0.12), + ) + else: + fig.legend( + custom_legend, leg_titles, loc="lower center", ncol=3, fontsize=20 + ) + + return fig, axes + + +def plot_all_bimod_indices( + graph, + edge_clusters_mat=None, + sending_communities=None, + receiving_communities=None, + fig=None, + axes=None, + sum_power=2, + palette=None, + sort_by_quad=False, + scale_indices=False, +): + if axes is None: + fig, axes = plt.subplots(figsize=(20, 10)) + + if palette is None: + palette = EDGE_PALETTE + + com_gs = GridSpecFromSubplotSpec(nrows=1, ncols=2, subplot_spec=axes) + axes.set_visible(False) + + com_axes = [fig.add_subplot(gs) for gs in com_gs] + + bimod = bimod_index_edges(graph, edge_clusters_mat, scale=scale_indices) + bimod_node = bimod_index_nodes( + graph, sending_communities, receiving_communities, scale=scale_indices + ) + bimod_quad = bimod_index_quad( + graph, sending_communities, receiving_communities, scale=scale_indices + ) + + if sort_by_quad: + sort_i = np.flip(np.argsort(bimod_quad)) + else: + sort_i = np.flip(np.argsort(bimod_node)) + + bar_offset = 0.2 + for data, title, off, col in zip( + [bimod, bimod_node, bimod_quad], + ["$Q_{{bi}}$ edges", "$Q_{{bi}}$ nodes", "$Q_{{bi}}$ quad"], + [-bar_offset, 0, bar_offset], + palette, + ): + com_axes[0].bar( + np.arange(len(sort_i)) + off, + # data[sort_i] / np.sum(data[sort_i]), + data[sort_i], + label=title, + width=bar_offset, + color=col, + ) + + c_labels = [f"$C_{{{i+1}}}$" for i in sort_i] + com_axes[0].legend(fontsize=20) + com_axes[0].set_ylabel("Contribution to bimodularity", fontsize=20) + com_axes[0].set_xticks(np.arange(len(bimod)), labels=c_labels) + com_axes[0].tick_params(labelsize=18) + + bimod = bimod**sum_power / np.sum(bimod**sum_power) + bimod_node = bimod_node**sum_power / np.sum(bimod_node**sum_power) + bimod_quad = bimod_quad**sum_power / np.sum(bimod_quad**sum_power) + + for data, title, col in zip( + [bimod, bimod_node, bimod_quad], + ["$Q_{{bi}}$ edges", "$Q_{{bi}}$ nodes", "$Q_{{bi}}$ quad"], + palette, + ): + com_axes[1].plot( + np.cumsum(data[sort_i]), + lw=4, + marker="o", + markersize=10, + color=col, + label=title, + ) + + com_axes[1].axhline(1, color="k", ls=":", zorder=0, lw=2, alpha=0.5) + + com_axes[1].legend(fontsize=20) + com_axes[1].set_ylim(0, 1.1) + com_axes[1].set_ylabel("Cumulative bimodularity", fontsize=20) + com_axes[1].set_xticks(np.arange(len(bimod)), labels=c_labels) + com_axes[1].tick_params(labelsize=18) + + return fig, axes + + +def plot_bicommunity_types( + sending_communities, + receiving_communities, + types, + type_colors=None, + titles=None, + fontsize=14, + fig=None, + axes=None, +): + + if type_colors is None: + cmap = plt.get_cmap("Set1") + type_colors = {t: cmap(i) for i, t in enumerate(types.unique())} + + if titles is None: + titles = [f"Community {com_i+1}" for com_i in range(len(sending_communities))] + + if axes is None: + fig, axes = plt.subplots(figsize=(5 * len(sending_communities), 5)) + + types_series = pd.Series(types) + # print(types_series) + + for com_i, (s, r) in enumerate(zip(sending_communities, receiving_communities)): + types_send = types_series[s > 0].value_counts() + types_receive = types_series[r > 0].value_counts() + + # print(types_send, types_receive) + + axes[com_i].set_visible(False) + gs_com = GridSpecFromSubplotSpec( + 2, 1, subplot_spec=axes[com_i], hspace=0.05, wspace=0 + ) + axes_com = [fig.add_subplot(gs_com[i]) for i in range(2)] + + # axes_com[0].set_title(f"Community {com_i+1}", fontsize=20) + # axes_com[0].set_title(titles[com_i], fontsize=20) + + # axes_com[0].set_title("Sending", fontsize=14) + # axes_com[1].set_title("Receiving", fontsize=14) + + # axes_com[0].set_ylabel("Sending\n", fontsize=fontsize + 2, labelpad=-30) + # axes_com[1].set_ylabel("Receiving\n", fontsize=fontsize + 2, labelpad=-30) + + axes_com[0].set_ylabel("Sending\n", fontsize=fontsize + 2, labelpad=0) + axes_com[1].set_ylabel("Receiving\n", fontsize=fontsize + 2, labelpad=0) + + axes_com[0].yaxis.set_label_position("right") + axes_com[1].yaxis.set_label_position("right") + + axes_com[0].pie( + types_send, + colors=[type_colors[t] for t in types_send.index], + labels=types_send.index, + labeldistance=0.6, + # rotatelabels=True, + wedgeprops={"edgecolor": "w", "linewidth": 2}, + textprops={"fontsize": fontsize, "ha": "center"}, + # textprops={"size": "smaller"}, + ) + axes_com[1].pie( + types_receive, + colors=[type_colors[t] for t in types_receive.index], + labels=types_receive.index, + labeldistance=0.6, + # rotatelabels=True, + wedgeprops={"edgecolor": "w", "linewidth": 2}, + textprops={"fontsize": fontsize, "ha": "center"}, + # textprops={"size": "smaller"}, + ) + + return axes + + +def get_node_surface(node_signal, path_to_atlas, expand=0): + + roi_atlas = nib.load(path_to_atlas) + atlas_data = roi_atlas.get_fdata() + + atlas_data = expand_labels(atlas_data, distance=expand) + + n_roi = len(np.unique(atlas_data)) - 1 + + if not isinstance(node_signal, list): + signals = [node_signal] + else: + signals = node_signal.copy() + + surf_map = np.zeros( + (len(signals), atlas_data.shape[0], atlas_data.shape[1], atlas_data.shape[2]), + dtype=float, + ) + + for i in range(n_roi): + for sig_i, sig in enumerate(signals): + surf_map[sig_i][atlas_data == i + 1] = sig[i] + + all_maps = [ + nib.Nifti1Image(s_map, roi_atlas.affine, dtype=np.float32) for s_map in surf_map + ] + # surf_map.header.set_data_dtype(np.float32) + + return all_maps + + +def plot_node_surface( + surf_map, + contours=[], + contour_colors=["red", "blue"], + surf_cmap="RdBu_r", + surface_name="fsaverage5", + inflate=True, + fig=None, + axes=None, + max_value=1, + per_hemi=True, + figsize=(20, 5), + plot_cbar=False, + cbar_h=1, +): + + fsaverage = datasets.fetch_surf_fsaverage(surface_name) + + # max_value = 0.9 * np.abs(node_signal).max() # 0.5 + + if axes is None: + fig, axes = plt.subplots( + ncols=4, + nrows=1, + figsize=figsize, + subplot_kw={"projection": "3d"}, + gridspec_kw={"wspace": 0, "hspace": 0}, + ) + + if plot_cbar: + + x_pos = [] + y_pos = [] + sizes = [] + for ax in axes: + x_pos.append(ax.get_position().bounds[0]) + y_pos.append(ax.get_position().bounds[1]) + sizes.append(ax.get_position().bounds[2]) + + # cmap_ax = fig.add_axes([0.1, 0.5, 0.8, 0.05]) + # cmap_ax = fig.add_axes([0.2, 0.5, 0.6, 0.025]) + ax_pos = [ + np.mean(x_pos), + np.mean(y_pos) + np.mean(sizes) / 2, + np.mean(sizes), + cbar_h * np.mean(sizes) / 10, + ] + cmap_ax = fig.add_axes(ax_pos) + + norm = Normalize(vmin=-max_value, vmax=max_value) + cbar = fig.colorbar( + ScalarMappable(norm=norm, cmap=surf_cmap), + cax=cmap_ax, + orientation="horizontal", + ticks=np.linspace(-max_value, max_value, 5), + ) + cbar.ax.tick_params(labelsize=18) + + # fig.suptitle(f"$Q(C_{{{i+1}}})={bimod[com_id]:1.2f}$") + + hemis = ["left", "right"] + surf_def = [fsaverage.pial_left, fsaverage.pial_right] + if inflate: + hemis_def = [fsaverage.infl_left, fsaverage.infl_right] + else: + hemis_def = [fsaverage.pial_left, fsaverage.pial_right] + bgs = [fsaverage.sulc_left, fsaverage.sulc_right] + + views = ["lateral", "medial"] + + if per_hemi: + # left - right + view_order = [0, 1, 1, 0] + hemi_order = [0, 0, 1, 1] + else: + # lateral - medial + view_order = [0, 0, 1, 1] + hemi_order = [0, 1, 0, 1] + + for ax_i, ax in enumerate(axes): + + texture = vol_to_surf( + surf_map, + # surf_def[ax_i % 2], + surf_def[hemi_order[ax_i]], + interpolation="nearest", + radius=0.0, + n_samples=1, + ) + figure = plot_surf_stat_map( + # hemis_def[ax_i % 2], + hemis_def[hemi_order[ax_i]], + texture, + # hemi=hemis[ax_i % 2], + # view=views[ax_i // 2], + hemi=hemis[hemi_order[ax_i]], + view=views[view_order[ax_i]], + # colorbar=bool(ax_i % 4 == 3), + symmetric_cbar=True, + colorbar=False, + threshold=1e-4, + # bg_map=bgs[ax_i % 2], + bg_map=bgs[hemi_order[ax_i]], + cmap=surf_cmap, + bg_on_data=True, + darkness=1, + vmax=max_value, + axes=ax, + ) + + for contour, cont_c in zip(contours, contour_colors): + texture = vol_to_surf( + contour, + # surf_def[ax_i % 2], + surf_def[hemi_order[ax_i]], + interpolation="nearest", + radius=0.0, + n_samples=1, + ) + plot_surf_contours( + # hemis_def[ax_i % 2], + hemis_def[hemi_order[ax_i]], + texture, + # hemi=hemis[ax_i % 2], + # view=views[ax_i // 2], + hemi=hemis[hemi_order[ax_i]], + view=views[view_order[ax_i]], + levels=[0], + colors=[cont_c], + axes=ax, + ) + + return fig, axes + + +def plot_send_receive_surface( + surf_map, + contour_color, + surf_cmap="RdBu_r", + surface_name="fsaverage5", + inflate=True, + fig=None, + axes=None, + max_value=1, + per_hemi=True, + view_top=False, + figsize=(20, 5), + plot_cbar=False, + cbar_h=1, +): + + fsaverage = datasets.fetch_surf_fsaverage(surface_name) + + # max_value = 0.9 * np.abs(node_signal).max() # 0.5 + + if axes is None: + fig, axes = plt.subplots( + ncols=4 + 1 * view_top, + nrows=1, + figsize=figsize, + subplot_kw={"projection": "3d"}, + gridspec_kw={"wspace": 0, "hspace": 0}, + ) + + if plot_cbar: + + x_pos = [] + y_pos = [] + sizes = [] + for ax in axes: + x_pos.append(ax.get_position().bounds[0]) + y_pos.append(ax.get_position().bounds[1]) + sizes.append(ax.get_position().bounds[2]) + + # cmap_ax = fig.add_axes([0.1, 0.5, 0.8, 0.05]) + # cmap_ax = fig.add_axes([0.2, 0.5, 0.6, 0.025]) + ax_pos = [ + np.mean(x_pos) - np.mean(sizes) / 2, + np.mean(y_pos), + 2 * np.mean(sizes), + cbar_h * np.mean(sizes) / 10, + ] + cmap_ax = fig.add_axes(ax_pos) + + norm = Normalize(vmin=-max_value, vmax=max_value) + cbar = fig.colorbar( + ScalarMappable(norm=norm, cmap=surf_cmap), + cax=cmap_ax, + orientation="horizontal", + ticks=np.linspace(-max_value, max_value, 5), + ) + cbar.ax.tick_params(labelsize=18) + + # fig.suptitle(f"$Q(C_{{{i+1}}})={bimod[com_id]:1.2f}$") + + hemis = ["left", "right"] + surf_def = [fsaverage.pial_left, fsaverage.pial_right] + if inflate: + hemis_def = [fsaverage.infl_left, fsaverage.infl_right] + else: + hemis_def = [fsaverage.pial_left, fsaverage.pial_right] + bgs = [fsaverage.sulc_left, fsaverage.sulc_right] + + views = ["lateral", "medial", (90, -90.0)] + + axes_show = axes + if per_hemi: + if view_top: + # left - right + view_order = [0, 1, 2, 2, 1, 0] + hemi_order = [0, 0, 0, 1, 1, 1] + axes_show = np.array(axes)[[0, 1, 2, 2, 3, 4]] + else: + # left - right + view_order = [0, 1, 1, 0] + hemi_order = [0, 0, 1, 1] + else: + # lateral - medial + view_order = [0, 0, 1, 1] + hemi_order = [0, 1, 0, 1] + + for ax_i, ax in enumerate(axes_show): + + texture = vol_to_surf( + surf_map, + surf_def[hemi_order[ax_i]], + interpolation="nearest", + radius=0.0, + n_samples=1, + ) + figure = plot_surf_stat_map( + hemis_def[hemi_order[ax_i]], + texture, + hemi=hemis[hemi_order[ax_i]], + view=views[view_order[ax_i]], + # colorbar=bool(ax_i % 4 == 3), + symmetric_cbar=True, + colorbar=False, + threshold=1e-4, + bg_map=bgs[hemi_order[ax_i]], + cmap=surf_cmap, + bg_on_data=True, + # darkness=1, + darkness=0.7, + vmax=max_value, + axes=ax, + ) + + plot_surf_contours( + hemis_def[hemi_order[ax_i]], + texture, + hemi=hemis[hemi_order[ax_i]], + view=views[view_order[ax_i]], + levels=[0], + colors=[contour_color], + axes=ax, + ) + + return fig, axes + + +def plot_send_receive_surface_top( + surf_map, + contour_color, + surf_cmap="RdBu_r", + surface_name="fsaverage5", + inflate=True, + fig=None, + axes=None, + max_value=1, + figsize=(20, 5), + plot_cbar=False, + cbar_h=1, +): + + fsaverage = datasets.fetch_surf_fsaverage(surface_name) + + # max_value = 0.9 * np.abs(node_signal).max() # 0.5 + + if axes is None: + fig, axes = plt.subplots( + figsize=figsize, + subplot_kw={"projection": "3d"}, + ) + + ax = axes + + if plot_cbar: + + x_pos = ax.get_position().bounds[0] + y_pos = ax.get_position().bounds[1] + sizex = ax.get_position().bounds[2] + sizey = ax.get_position().bounds[3] + + # cmap_ax = fig.add_axes([0.1, 0.5, 0.8, 0.05]) + # cmap_ax = fig.add_axes([0.2, 0.5, 0.6, 0.025]) + ax_pos = [ + x_pos + sizex, + y_pos + sizey / 4, + # np.mean(sizes), + # cbar_h * np.mean(sizes) / 10, + cbar_h * sizex / 20, + sizey * 2 / 3, + ] + cmap_ax = fig.add_axes(ax_pos) + + norm = Normalize(vmin=-max_value, vmax=max_value) + cbar = fig.colorbar( + ScalarMappable(norm=norm, cmap=surf_cmap), + cax=cmap_ax, + # orientation="horizontal", + orientation="vertical", + ticks=np.linspace(-max_value, max_value, 5), + ) + cbar.ax.tick_params(labelsize=18) + + # fig.suptitle(f"$Q(C_{{{i+1}}})={bimod[com_id]:1.2f}$") + + hemis = ["left", "right"] + surf_def = [fsaverage.pial_left, fsaverage.pial_right] + if inflate: + hemis_def = [fsaverage.infl_left, fsaverage.infl_right] + else: + hemis_def = [fsaverage.pial_left, fsaverage.pial_right] + bgs = [fsaverage.sulc_left, fsaverage.sulc_right] + + # views = ["lateral", "medial"] + # views = ["dorsal"] * 2 + views = [(90, -90.0)] * 2 + + for ax_i in range(2): + + texture = vol_to_surf( + surf_map, + surf_def[ax_i], + interpolation="nearest", + radius=0.0, + n_samples=1, + ) + figure = plot_surf_stat_map( + hemis_def[ax_i], + texture, + hemi=hemis[ax_i], + view=views[ax_i], + # colorbar=bool(ax_i % 4 == 3), + symmetric_cbar=True, + colorbar=False, + threshold=1e-4, + bg_map=bgs[ax_i], + cmap=surf_cmap, + bg_on_data=True, + # darkness=1, + darkness=0.7, + vmax=max_value, + axes=ax, + ) + + # plot_surf_contours( + # hemis_def[ax_i], + # texture, + # hemi=hemis[ax_i], + # view=views[ax_i], + # levels=[0], + # colors=[contour_color], + # axes=ax, + # ) + + return fig, axes diff --git a/data/README.md b/data/README.md new file mode 100644 index 0000000..84f844b --- /dev/null +++ b/data/README.md @@ -0,0 +1,17 @@ +# Data used in Bimodularity or Bicommunities studies + +## 1. Bimodularity Optimization and Directed Communities of the Caenorhabditis Elegans (C. Elegans) Worm + +In `./data/celegans`, you may find all the data required to: +- build the directed wiring diagram on of the C. Elegans (with or without inclusion of electric gap junctions), +- visualize graph embeddings or bicommunities at the physical location of neurons. +- reproduce the figures and supplementary of: + > A. Cionca, C.H.M. Chan, & D. Van De Ville, Community detection for directed networks revisited using bimodularity, Proc. Natl. Acad. Sci. U.S.A. 122 (35) e2500571122, [https://doi.org/10.1073/pnas.2500571122](https://doi.org/10.1073/pnas.2500571122) (2025). + +## 2. Bicommunity Structure of the Directed Human Brain + +In `./data/brain`, you may find all the data required to: +- build directed connectivity matrices of the human brain, +- validate directionality using intracranial recordings of directed electrical conduction in the brain (F-Tract), +- visualize bicommunities as groups of white matter fiber bundles, +- evaluate the lobes or resting-state networks representations of the sending and/or receiving nodes of bicommunities. \ No newline at end of file diff --git a/data/brain/BundleAtlas/centroids/scale2/group_centroids_scale2/wm.connatlas.scale2.centroids.h5.gz b/data/brain/BundleAtlas/centroids/scale2/group_centroids_scale2/wm.connatlas.scale2.centroids.h5.gz new file mode 100644 index 0000000..4fa7431 Binary files /dev/null and b/data/brain/BundleAtlas/centroids/scale2/group_centroids_scale2/wm.connatlas.scale2.centroids.h5.gz differ diff --git a/data/brain/BundleAtlas/centroids/scale2/lausanne2018.scale2.sym.corrected+aseg_MaxProb.nii b/data/brain/BundleAtlas/centroids/scale2/lausanne2018.scale2.sym.corrected+aseg_MaxProb.nii new file mode 100644 index 0000000..a76473f Binary files /dev/null and b/data/brain/BundleAtlas/centroids/scale2/lausanne2018.scale2.sym.corrected+aseg_MaxProb.nii differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/N_total.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/N_total.txt.gz new file mode 100644 index 0000000..b454650 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/N_total.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/N_with_value.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/N_with_value.txt.gz new file mode 100644 index 0000000..e98d264 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/N_with_value.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nan_median_abs_deviation.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nan_median_abs_deviation.txt.gz new file mode 100644 index 0000000..f884d2f Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nan_median_abs_deviation.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanmax.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanmax.txt.gz new file mode 100644 index 0000000..fe0afc1 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanmax.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanmean.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanmean.txt.gz new file mode 100644 index 0000000..ea3e628 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanmean.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanmin.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanmin.txt.gz new file mode 100644 index 0000000..3e07a60 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanmin.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanquantile_0.25.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanquantile_0.25.txt.gz new file mode 100644 index 0000000..fadf8ab Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanquantile_0.25.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanquantile_0.5.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanquantile_0.5.txt.gz new file mode 100644 index 0000000..1014ad5 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanquantile_0.5.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanquantile_0.75.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanquantile_0.75.txt.gz new file mode 100644 index 0000000..fa5753c Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanquantile_0.75.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanstd.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanstd.txt.gz new file mode 100644 index 0000000..47cfcd2 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_ampl_zth5/nanstd.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/N_with_value.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/N_with_value.txt.gz new file mode 100644 index 0000000..ba0a919 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/N_with_value.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nan_median_abs_deviation.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nan_median_abs_deviation.txt.gz new file mode 100644 index 0000000..fd1fd42 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nan_median_abs_deviation.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanmax.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanmax.txt.gz new file mode 100644 index 0000000..a9b34ca Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanmax.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanmean.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanmean.txt.gz new file mode 100644 index 0000000..ef0381e Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanmean.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanmin.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanmin.txt.gz new file mode 100644 index 0000000..64dd8a8 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanmin.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanquantile_0.25.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanquantile_0.25.txt.gz new file mode 100644 index 0000000..39853c2 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanquantile_0.25.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanquantile_0.5.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanquantile_0.5.txt.gz new file mode 100644 index 0000000..d44c311 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanquantile_0.5.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanquantile_0.75.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanquantile_0.75.txt.gz new file mode 100644 index 0000000..6205c52 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanquantile_0.75.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanstd.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanstd.txt.gz new file mode 100644 index 0000000..01704ab Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_duration/nanstd.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/N_with_value.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/N_with_value.txt.gz new file mode 100644 index 0000000..ba0a919 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/N_with_value.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nan_median_abs_deviation.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nan_median_abs_deviation.txt.gz new file mode 100644 index 0000000..07be7d4 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nan_median_abs_deviation.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanmax.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanmax.txt.gz new file mode 100644 index 0000000..6eb6841 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanmax.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanmean.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanmean.txt.gz new file mode 100644 index 0000000..aa54561 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanmean.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanmin.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanmin.txt.gz new file mode 100644 index 0000000..6018c81 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanmin.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanquantile_0.25.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanquantile_0.25.txt.gz new file mode 100644 index 0000000..a15ee1c Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanquantile_0.25.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanquantile_0.5.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanquantile_0.5.txt.gz new file mode 100644 index 0000000..6fbcae5 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanquantile_0.5.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanquantile_0.75.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanquantile_0.75.txt.gz new file mode 100644 index 0000000..a864bbf Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanquantile_0.75.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanstd.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanstd.txt.gz new file mode 100644 index 0000000..50b5412 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_integral/nanstd.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/N_with_value.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/N_with_value.txt.gz new file mode 100644 index 0000000..6ae49c6 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/N_with_value.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nan_median_abs_deviation.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nan_median_abs_deviation.txt.gz new file mode 100644 index 0000000..a4e73ce Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nan_median_abs_deviation.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanmax.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanmax.txt.gz new file mode 100644 index 0000000..62ddadb Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanmax.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanmean.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanmean.txt.gz new file mode 100644 index 0000000..86ff8fe Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanmean.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanmin.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanmin.txt.gz new file mode 100644 index 0000000..a2b5f4e Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanmin.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanquantile_0.25.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanquantile_0.25.txt.gz new file mode 100644 index 0000000..4e6a22f Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanquantile_0.25.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanquantile_0.5.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanquantile_0.5.txt.gz new file mode 100644 index 0000000..e57ae15 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanquantile_0.5.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanquantile_0.75.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanquantile_0.75.txt.gz new file mode 100644 index 0000000..45182da Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanquantile_0.75.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanstd.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanstd.txt.gz new file mode 100644 index 0000000..d9ca0f9 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_lat_start/nanstd.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/N_with_value.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/N_with_value.txt.gz new file mode 100644 index 0000000..501e035 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/N_with_value.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nan_median_abs_deviation.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nan_median_abs_deviation.txt.gz new file mode 100644 index 0000000..89a628b Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nan_median_abs_deviation.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanmax.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanmax.txt.gz new file mode 100644 index 0000000..ef0ae1d Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanmax.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanmean.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanmean.txt.gz new file mode 100644 index 0000000..d255acb Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanmean.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanmin.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanmin.txt.gz new file mode 100644 index 0000000..1de3dad Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanmin.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanquantile_0.25.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanquantile_0.25.txt.gz new file mode 100644 index 0000000..5fce5fc Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanquantile_0.25.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanquantile_0.5.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanquantile_0.5.txt.gz new file mode 100644 index 0000000..c6a8a25 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanquantile_0.5.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanquantile_0.75.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanquantile_0.75.txt.gz new file mode 100644 index 0000000..6615f4e Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanquantile_0.75.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanstd.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanstd.txt.gz new file mode 100644 index 0000000..d19734a Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_onset_delay_zth5/nanstd.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/N_with_value.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/N_with_value.txt.gz new file mode 100644 index 0000000..501e035 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/N_with_value.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nan_median_abs_deviation.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nan_median_abs_deviation.txt.gz new file mode 100644 index 0000000..98d1267 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nan_median_abs_deviation.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanmax.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanmax.txt.gz new file mode 100644 index 0000000..e1305c7 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanmax.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanmean.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanmean.txt.gz new file mode 100644 index 0000000..aa1d22e Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanmean.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanmin.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanmin.txt.gz new file mode 100644 index 0000000..14f56e3 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanmin.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanquantile_0.25.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanquantile_0.25.txt.gz new file mode 100644 index 0000000..df61a6f Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanquantile_0.25.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanquantile_0.5.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanquantile_0.5.txt.gz new file mode 100644 index 0000000..463e680 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanquantile_0.5.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanquantile_0.75.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanquantile_0.75.txt.gz new file mode 100644 index 0000000..0347a5f Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanquantile_0.75.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanstd.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanstd.txt.gz new file mode 100644 index 0000000..fb9efa9 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_peak_delay_zth5/nanstd.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/N_with_value.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/N_with_value.txt.gz new file mode 100644 index 0000000..58ccda6 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/N_with_value.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nan_median_abs_deviation.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nan_median_abs_deviation.txt.gz new file mode 100644 index 0000000..d3953a4 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nan_median_abs_deviation.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanmax.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanmax.txt.gz new file mode 100644 index 0000000..631a4bf Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanmax.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanmean.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanmean.txt.gz new file mode 100644 index 0000000..8988c98 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanmean.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanmin.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanmin.txt.gz new file mode 100644 index 0000000..f43d4ce Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanmin.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanquantile_0.25.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanquantile_0.25.txt.gz new file mode 100644 index 0000000..56fddab Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanquantile_0.25.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanquantile_0.5.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanquantile_0.5.txt.gz new file mode 100644 index 0000000..382b6f4 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanquantile_0.5.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanquantile_0.75.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanquantile_0.75.txt.gz new file mode 100644 index 0000000..7e2b878 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanquantile_0.75.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanstd.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanstd.txt.gz new file mode 100644 index 0000000..73be2eb Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/feature_slope_zth5/nanstd.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/implantation_name/N_with_value.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/implantation_name/N_with_value.txt.gz new file mode 100644 index 0000000..45f916f Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/implantation_name/N_with_value.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/implantation_name/count_unique_str.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/implantation_name/count_unique_str.txt.gz new file mode 100644 index 0000000..3753125 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/implantation_name/count_unique_str.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/patient_name/N_with_value.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/patient_name/N_with_value.txt.gz new file mode 100644 index 0000000..45f916f Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/patient_name/N_with_value.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/patient_name/count_unique_str.txt.gz b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/patient_name/count_unique_str.txt.gz new file mode 100644 index 0000000..d983030 Binary files /dev/null and b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0/patient_name/count_unique_str.txt.gz differ diff --git a/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/probability.txt b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/probability.txt new file mode 100644 index 0000000..85b9b5d --- /dev/null +++ b/data/brain/F-Tract/Lausanne2018-scale2/15_inf/50/probability.txt @@ -0,0 +1,257 @@ +8.624277456647398976e-01 6.344086021505376261e-01 7.159565580618212355e-01 6.666666666666666574e-02 5.833333333333333703e-01 6.685472496473906512e-01 6.031379787724965302e-01 3.833560709413369461e-01 2.470941132358455139e-01 3.083765752409192151e-01 3.981324278438030384e-01 1.699834162520729719e-01 8.059701492537313383e-02 6.493506493506492894e-02 6.608357628765791636e-02 1.603343465045592720e-01 2.551020408163265363e-02 1.839464882943143975e-02 1.094890510948905160e-02 5.849582172701950356e-01 2.615384615384615530e-01 1.662763466042154470e-01 1.028037383177570069e-01 8.247422680412370977e-02 2.555910543130990309e-02 3.755868544600939052e-02 6.267539756782039562e-02 3.333333333333333287e-02 0.000000000000000000e+00 0.000000000000000000e+00 6.489675516224188700e-02 2.972972972972973138e-01 4.494382022471909988e-02 4.390243902439024126e-02 7.619047619047619735e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.369863013698630061e-01 2.046153846153846156e-01 9.248554913294797231e-02 3.248407643312101745e-01 3.966346153846153633e-01 2.565947242206235157e-01 2.110091743119266172e-01 2.213375796178344013e-01 2.954918032786885140e-01 9.066666666666667318e-02 9.894867037724180969e-02 2.670401493930905645e-01 7.887323943661972425e-02 3.413173652694611038e-01 7.420269312544295337e-01 0.000000000000000000e+00 nan nan nan nan nan 0.000000000000000000e+00 9.333333333333333481e-01 9.111111111111110938e-01 nan 9.523809523809523281e-01 3.186003683241252493e-01 1.130091984231274688e-01 3.250000000000000111e-01 3.458445040214477295e-01 1.265822784810126667e-01 nan 2.884615384615384359e-01 3.585858585858585634e-01 1.402214022140221283e-01 9.561752988047808599e-02 4.882812500000000000e-02 1.285714285714285587e-01 1.184834123222748836e-01 7.894736842105262720e-02 1.694915254237288130e-02 0.000000000000000000e+00 8.771929824561403022e-03 2.857142857142857054e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.052631578947368474e-01 1.923076923076923184e-01 8.333333333333332871e-02 3.448275862068965469e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 3.546099290780142105e-02 5.263157894736841813e-02 1.632653061224489666e-01 9.411764705882352811e-02 8.208955223880597118e-02 4.918032786885245811e-02 7.272727272727272374e-02 8.730158730158729674e-02 0.000000000000000000e+00 1.418439716312056703e-02 1.129943502824858753e-02 2.631578947368420907e-02 7.831325301204819511e-02 1.827956989247311870e-01 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan 5.263157894736841813e-02 3.125000000000000000e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.803129074315515168e-01 +6.914062500000000000e-01 8.328664799253034934e-01 6.969416126042632387e-01 3.333333333333333148e-01 6.262458471760797840e-01 6.311239193083573173e-01 4.872465663832570293e-01 2.686688311688311681e-01 3.288307302659350118e-01 4.984871406959152651e-01 2.965779467680608183e-01 1.297709923664122078e-01 5.271828665568369099e-02 2.866242038216560567e-02 1.076023391812865465e-01 8.921933085501858318e-02 3.703703703703703498e-02 1.627906976744186024e-02 0.000000000000000000e+00 4.816933638443935961e-01 2.149999999999999967e-01 1.257668711656441674e-01 6.666666666666666574e-02 5.190839694656488451e-02 1.754385964912280604e-02 6.849315068493150305e-02 2.338129496402877733e-02 4.237288135593220151e-02 0.000000000000000000e+00 2.857142857142857054e-02 4.186046511627906919e-02 3.773584905660377214e-02 8.771929824561403022e-03 1.754385964912280604e-02 2.500000000000000139e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 6.521739130434782428e-02 0.000000000000000000e+00 4.516129032258064252e-02 6.542056074766354479e-02 9.212481426448737576e-02 5.000000000000000278e-02 1.085526315789473728e-01 1.661237785016286550e-01 9.708737864077669755e-02 1.656050955414012649e-01 1.840731070496083588e-01 1.759562841530054600e-01 5.853658536585366196e-02 5.946791862284819818e-02 1.205936920222634573e-01 4.471544715447154511e-02 1.914323962516733535e-01 4.357005758157389552e-01 0.000000000000000000e+00 nan nan nan nan nan nan 9.047619047619047672e-01 7.631578947368421462e-01 nan 8.571428571428570953e-01 1.209016393442622905e-01 4.128053917438921638e-02 3.666666666666666408e-01 4.555873925501432442e-01 3.014705882352941013e-01 nan 2.881355932203389925e-01 2.500000000000000000e-01 1.131221719457013580e-01 8.227848101265822223e-02 3.968253968253968034e-02 2.088607594936708889e-01 7.987220447284344715e-02 5.555555555555555247e-02 2.255639097744360777e-02 0.000000000000000000e+00 4.081632653061224164e-02 3.797468354430379861e-02 0.000000000000000000e+00 nan nan 1.666666666666666574e-01 1.538461538461538547e-02 1.111111111111111049e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.555555555555555247e-02 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 3.125000000000000000e-02 5.882352941176470507e-02 1.785714285714285754e-01 9.756097560975610095e-02 6.756756756756757132e-02 1.764705882352941291e-01 1.063829787234042562e-01 4.843304843304842983e-02 0.000000000000000000e+00 4.761904761904761640e-02 6.451612903225806273e-02 2.439024390243902524e-02 1.470588235294117627e-02 1.000000000000000056e-01 nan nan nan nan nan nan nan 5.000000000000000278e-02 nan nan nan 3.809523809523809867e-02 3.167420814479637858e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.330152671755725047e-01 +6.387832699619772070e-01 5.638190954773869557e-01 8.559322033898305593e-01 0.000000000000000000e+00 3.244680851063829752e-01 3.489583333333333148e-01 6.509207365892714092e-01 3.278179937952430123e-01 2.766685681688533793e-01 3.987804878048780699e-01 2.849002849002849058e-01 1.509009009009009139e-01 6.435643564356435808e-02 5.699481865284974219e-02 1.422351233671988457e-01 1.196473551637279586e-01 4.640371229698375677e-02 3.214285714285713969e-02 3.174603174603174427e-02 3.411131059245960384e-01 1.027397260273972546e-01 6.910569105691057035e-02 4.000000000000000083e-02 6.285714285714286143e-02 3.937007874015747977e-02 5.600000000000000117e-02 5.972696245733788434e-02 2.531645569620253125e-02 0.000000000000000000e+00 7.407407407407406996e-02 4.494382022471909988e-02 6.060606060606060774e-02 7.692307692307692735e-02 3.061224489795918297e-02 2.325581395348837177e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan 1.923076923076923184e-02 1.111111111111111049e-01 7.692307692307692735e-02 6.250000000000000000e-02 7.142857142857142461e-02 9.775967413441954967e-02 7.619047619047619735e-02 6.866952789699570792e-02 1.642335766423357601e-01 7.961165048543689116e-02 1.444444444444444309e-01 1.442786069651741387e-01 1.494809688581314744e-01 4.210526315789473589e-02 6.327985739750445482e-02 1.112347052280311388e-01 4.858299595141700455e-02 7.662337662337662114e-02 3.518716577540106916e-01 1.818181818181818232e-01 nan nan nan nan nan nan 6.521739130434782705e-01 5.000000000000000000e-01 nan 5.000000000000000000e-01 1.474201474201474182e-01 3.389830508474576259e-02 1.600000000000000033e-01 1.257485029940119681e-01 3.571428571428571508e-01 nan 6.578947368421052266e-02 4.347826086956521618e-02 1.188811188811188801e-01 5.063291139240506250e-02 1.923076923076923184e-02 1.956521739130434867e-01 3.468208092485548788e-02 3.174603174603174427e-02 1.149425287356321823e-02 0.000000000000000000e+00 2.985074626865671585e-02 0.000000000000000000e+00 nan nan nan 7.142857142857142461e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000056e-01 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 1.562500000000000000e-01 0.000000000000000000e+00 2.571428571428571175e-01 0.000000000000000000e+00 1.267605633802816878e-01 7.692307692307692735e-02 0.000000000000000000e+00 6.147540983606557263e-02 0.000000000000000000e+00 0.000000000000000000e+00 6.060606060606060774e-02 0.000000000000000000e+00 1.492537313432835792e-02 5.369127516778523374e-02 nan nan nan nan nan nan nan 9.090909090909091161e-02 nan nan nan 5.555555555555555247e-02 3.546099290780142105e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.036437246963562542e-01 +0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 6.999999999999999556e-01 nan 2.727272727272727071e-01 1.250000000000000000e-01 3.333333333333333148e-01 3.333333333333333148e-01 1.000000000000000000e+00 5.000000000000000000e-01 nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 5.999999999999999778e-01 nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.666666666666666574e-01 2.500000000000000000e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.500000000000000000e-01 5.000000000000000000e-01 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 5.000000000000000000e-01 nan 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.105263157894736725e-01 +4.629629629629629650e-01 5.296874999999999778e-01 3.465783664459161084e-01 5.555555555555555802e-01 8.541666666666666297e-01 7.029702970297029285e-01 1.550868486352357245e-01 4.809286898839137958e-02 1.564774381368267964e-01 4.413919413919413781e-01 6.110458284371327320e-01 1.987421383647798856e-01 2.301790281329923332e-02 1.675977653631284883e-02 2.956521739130434784e-02 4.288499025341130366e-02 3.517587939698492427e-02 1.098901098901098987e-02 2.597402597402597574e-02 6.785009861932939090e-01 2.335600907029478368e-01 3.500000000000000333e-02 1.142857142857142821e-01 2.670623145400593396e-02 1.369863013698630061e-02 3.076923076923077094e-02 2.419354838709677352e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan 1.086956521739130405e-02 0.000000000000000000e+00 2.195121951219512202e-01 0.000000000000000000e+00 1.250000000000000000e-01 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 4.878048780487805047e-02 2.916666666666666852e-01 1.299212598425196763e-01 1.404958677685950452e-01 1.617647058823529493e-01 2.407407407407407274e-01 1.895910780669144979e-01 1.549295774647887203e-01 1.346153846153846090e-01 2.208672086720867289e-01 4.166666666666666435e-02 6.597222222222222376e-02 1.228501228501228532e-01 3.333333333333333287e-02 1.060070671378091946e-02 1.877828054298642524e-01 0.000000000000000000e+00 nan nan nan nan nan nan 5.789473684210526550e-01 1.000000000000000000e+00 nan 8.000000000000000444e-01 1.287878787878787845e-01 4.112149532710280414e-02 0.000000000000000000e+00 1.602564102564102699e-01 9.836065573770491621e-02 nan 7.746478873239436291e-01 4.400000000000000022e-01 2.205882352941176613e-02 2.816901408450704289e-02 3.461538461538461731e-02 1.481481481481481399e-01 2.550335570469798863e-01 4.615384615384615641e-02 1.098901098901098987e-02 0.000000000000000000e+00 9.090909090909090468e-03 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 6.546762589928057929e-01 8.000000000000000167e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 4.166666666666666435e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.355932203389830504e-01 1.333333333333333315e-01 4.074074074074073848e-01 9.090909090909091161e-02 2.459016393442622905e-01 0.000000000000000000e+00 0.000000000000000000e+00 1.964285714285714246e-01 0.000000000000000000e+00 1.176470588235294101e-02 3.448275862068965469e-02 5.000000000000000278e-02 0.000000000000000000e+00 2.197802197802197974e-02 nan nan nan nan nan nan nan 2.500000000000000000e-01 nan nan nan 0.000000000000000000e+00 7.812500000000000000e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.660944206008583612e-01 +6.293103448275861878e-01 5.659955257270693485e-01 3.328671328671328755e-01 nan 7.680722891566265087e-01 8.637681159420289578e-01 1.645445641527913672e-01 4.718217562254259367e-02 1.295774647887323883e-01 3.478787878787878984e-01 4.537540805223068685e-01 1.633045148895292953e-01 2.287581699346405081e-02 1.445086705202312111e-02 3.044140030441400135e-02 4.311543810848400549e-02 1.381215469613259611e-02 5.797101449275362389e-03 1.554404145077720178e-02 6.737481031866464631e-01 2.079002079002079117e-01 1.530944625407166249e-01 9.401709401709401615e-02 1.980198019801980222e-02 1.075268817204301161e-02 1.156069364161849654e-02 2.429149797570850228e-02 2.272727272727272790e-02 0.000000000000000000e+00 0.000000000000000000e+00 8.064516129032257841e-03 3.846153846153846367e-02 6.382978723404254817e-02 9.259259259259258745e-03 5.494505494505494414e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 7.692307692307692735e-02 0.000000000000000000e+00 6.122448979591836593e-02 9.523809523809523281e-02 2.193877551020408101e-01 1.012658227848101250e-01 2.500000000000000000e-01 3.041237113402061598e-01 2.982062780269058022e-01 2.024291497975708454e-01 9.420289855072463969e-02 3.460046547711403964e-01 3.726708074534161586e-02 6.967741935483870441e-02 1.950078003120124803e-01 2.475247524752475364e-02 6.734006734006733885e-02 1.950146627565982338e-01 0.000000000000000000e+00 nan nan nan nan nan nan 5.555555555555555802e-01 5.000000000000000000e-01 nan 1.000000000000000000e+00 2.675159235668789770e-01 7.726763717805151810e-02 3.518518518518518601e-01 3.349282296650717972e-01 6.306306306306305731e-02 nan 4.177215189873417778e-01 7.307692307692307265e-01 8.108108108108108558e-02 3.333333333333333287e-02 3.548387096774193589e-02 1.056910569105691117e-01 9.589041095890410427e-02 5.000000000000000278e-02 3.676470588235294240e-02 1.034482758620689641e-01 2.127659574468085055e-02 2.777777777777777624e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.935483870967741993e-01 8.196721311475409222e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 7.692307692307692735e-02 0.000000000000000000e+00 nan nan 3.333333333333333148e-01 nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 1.097560975609756101e-01 0.000000000000000000e+00 3.260869565217391353e-01 5.882352941176470507e-02 1.976744186046511531e-01 0.000000000000000000e+00 3.225806451612903136e-02 1.314285714285714224e-01 6.666666666666666574e-02 2.061855670103092744e-02 6.422018348623853568e-02 0.000000000000000000e+00 6.944444444444444753e-02 3.448275862068965469e-02 nan nan nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 1.000000000000000000e+00 nan nan 7.692307692307692735e-02 4.739336492890994929e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.745664739884393080e-01 +5.450525152017688946e-01 4.525018129079042550e-01 6.650246305418718862e-01 2.999999999999999889e-01 2.103064066852367575e-01 1.731493099121706458e-01 8.071205007824726607e-01 6.269374665954035031e-01 4.164046870534438560e-01 3.441975308641975206e-01 3.015006821282401051e-01 2.523636363636363455e-01 2.211101000909918013e-01 1.027190332326284039e-01 2.811918063314711169e-01 4.159919028340081093e-01 1.600771456123432912e-01 3.612167300380227791e-02 3.413654618473895702e-02 3.353242320819112554e-01 3.415948275862069061e-01 7.960199004975124226e-02 3.179190751445086505e-02 1.644815256257449454e-01 4.566210045662100203e-02 2.273838630806845895e-01 1.185410334346504585e-01 4.399999999999999745e-02 3.846153846153846367e-02 6.250000000000000000e-02 1.683991683991684085e-01 7.499999999999999722e-02 9.811320754716981729e-02 4.729729729729729992e-02 9.340659340659340781e-02 2.222222222222222307e-02 1.041666666666666609e-02 0.000000000000000000e+00 2.857142857142857054e-02 4.477611940298507204e-02 0.000000000000000000e+00 1.754385964912280604e-02 4.399999999999999745e-02 8.695652173913043237e-02 3.076923076923077094e-02 1.240875912408759135e-01 1.547861507128309444e-01 1.034482758620689641e-01 9.433962264150944077e-02 1.686844229217110691e-01 1.438986953184957784e-01 2.141327623126338398e-01 1.457541191381495627e-01 2.226540810660743996e-01 8.134920634920635163e-02 2.317708333333333426e-01 5.735047512576858519e-01 1.538461538461538547e-01 nan nan 3.333333333333333148e-01 nan nan 5.000000000000000000e-01 5.714285714285713969e-01 4.799999999999999822e-01 nan 6.153846153846154188e-01 1.595197255574614115e-01 4.988789237668161264e-02 3.392857142857143016e-01 1.395348837209302306e-01 1.354838709677419484e-01 nan 2.013422818791946178e-02 4.214559386973180249e-02 4.455205811138014393e-01 2.463768115942029102e-01 1.028315946348733190e-01 1.496062992125984370e-01 4.210526315789473589e-02 7.936507936507936067e-02 2.314814814814814686e-02 4.918032786885245811e-02 4.977375565610859393e-02 1.818181818181818094e-02 3.783783783783783994e-02 5.172413793103448204e-02 0.000000000000000000e+00 8.730158730158729674e-02 4.166666666666666435e-02 4.237288135593220151e-02 2.816901408450704289e-02 1.013513513513513570e-02 6.666666666666667095e-03 0.000000000000000000e+00 2.617801047120418834e-02 0.000000000000000000e+00 nan nan 1.666666666666666574e-01 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.703703703703703498e-02 4.395604395604395948e-02 7.843137254901960675e-02 1.941747572815533812e-02 5.714285714285714107e-02 0.000000000000000000e+00 1.818181818181818094e-02 2.173913043478260809e-02 2.992957746478873068e-02 2.222222222222222099e-01 1.769911504424778736e-02 2.884615384615384776e-02 1.785714285714285615e-02 4.225352112676056260e-02 1.774809160305343414e-01 nan nan nan nan nan nan nan 7.142857142857142461e-02 0.000000000000000000e+00 nan nan 6.140350877192982115e-02 3.878116343490304457e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.767908309455587634e-01 +3.998599439775910591e-01 2.196485623003194831e-01 3.618181818181818166e-01 1.111111111111111049e-01 1.157167530224525037e-01 9.343065693430656349e-02 5.850718590635141103e-01 7.969247083775186091e-01 3.451043338683787987e-01 2.139737991266375539e-01 2.133995037220843549e-01 2.179487179487179516e-01 4.346774193548387233e-01 1.783216783216783341e-01 3.719420868696954319e-01 6.775745909528392286e-01 2.446319018404908008e-01 7.808564231738035488e-02 3.810975609756097476e-02 2.014690451206715693e-01 4.340551181102362266e-01 2.130115424973766936e-01 3.888888888888888951e-02 3.530534351145038219e-01 8.886255924170616272e-02 3.003337041156841081e-01 2.110236220472440916e-01 6.142506142506142658e-02 5.154639175257731687e-02 2.564102564102564014e-02 2.157164869029275789e-01 4.605263157894736586e-02 8.080808080808081495e-02 5.847953216374268681e-02 5.685618729096989649e-02 0.000000000000000000e+00 3.076923076923077094e-02 3.278688524590164105e-02 1.886792452830188607e-02 2.857142857142857054e-02 1.818181818181818094e-02 2.531645569620253125e-02 8.071748878923766524e-02 1.272727272727272596e-01 1.118644067796610159e-01 1.513513513513513598e-01 2.119565217391304324e-01 1.379657603222557982e-01 1.214128035320088256e-01 1.725239616613418459e-01 1.264559068219633930e-01 2.232142857142857262e-01 1.786439301664636548e-01 2.787803360298693467e-01 1.499013806706114282e-01 3.605870020964360712e-01 6.149217809867629780e-01 3.125000000000000000e-02 nan nan 1.000000000000000000e+00 nan nan 2.500000000000000000e-01 4.680851063829787329e-01 7.619047619047618625e-01 nan 4.000000000000000222e-01 2.335600907029478368e-01 7.301173402868317563e-02 1.978021978021977934e-01 5.957446808510638570e-02 8.749999999999999445e-02 nan 4.605263157894736586e-02 3.973509933774834607e-02 1.986531986531986649e-01 4.022140221402213944e-01 8.221476510067114718e-02 1.804511278195488622e-01 5.809128630705394369e-02 1.459854014598540028e-01 1.589147286821705474e-01 9.803921568627450844e-02 8.365019011406843452e-02 1.955307262569832283e-01 2.898550724637681195e-02 0.000000000000000000e+00 0.000000000000000000e+00 9.756097560975610095e-02 2.708333333333333148e-01 6.666666666666666574e-02 4.054054054054054279e-02 3.535353535353535220e-02 8.771929824561403022e-03 2.826086956521738913e-01 1.104972375690607689e-02 1.212121212121212155e-01 1.000000000000000000e+00 5.999999999999999778e-01 4.705882352941176405e-01 nan 8.571428571428571508e-02 4.000000000000000222e-01 3.448275862068965747e-01 1.000000000000000000e+00 nan nan 6.666666666666666297e-01 nan 1.000000000000000000e+00 2.999999999999999889e-01 3.571428571428571508e-01 1.264367816091954144e-01 1.694915254237288060e-01 2.653061224489796088e-01 0.000000000000000000e+00 2.285714285714285643e-01 1.323529411764705899e-01 1.630434782608695676e-01 1.037463976945244976e-01 3.076923076923077094e-02 2.422907488986784236e-02 8.467741935483870386e-02 4.000000000000000083e-02 9.890109890109889668e-02 3.037694013303769425e-01 nan nan nan nan nan nan nan 8.620689655172414367e-02 1.578947368421052544e-01 nan nan 1.011235955056179747e-01 8.766233766233766378e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.665086887835702911e-01 +1.753278290432248587e-01 2.067574382249117437e-01 3.032178217821782096e-01 2.777777777777777901e-01 1.708407871198568961e-01 1.323763955342902587e-01 3.831111111111111245e-01 3.169924812030074923e-01 5.825471698113207086e-01 3.693181818181818232e-01 3.772652388797363976e-01 3.670323928944618785e-01 2.754039497307002038e-01 2.150776053215077699e-01 3.798836242726517098e-01 1.946232487694055380e-01 1.563421828908554689e-01 6.806068060680606213e-02 4.617713853141559160e-02 2.548125633232016241e-01 3.311817279046673224e-01 1.548913043478260809e-01 8.398950131233595684e-02 8.223872073101085034e-02 6.003159557661927326e-02 1.608465608465608487e-01 6.835592221567471372e-02 5.140961857379768019e-02 7.172995780590717130e-02 9.482758620689654694e-02 1.331484049930651836e-01 1.233480176211453755e-01 7.906976744186046402e-02 1.067415730337078622e-01 1.162790697674418589e-01 5.555555555555555247e-02 0.000000000000000000e+00 1.428571428571428492e-01 0.000000000000000000e+00 5.555555555555555247e-02 0.000000000000000000e+00 1.354166666666666574e-01 7.220216606498194856e-02 9.292035398230089061e-02 1.022364217252396124e-01 5.411255411255411207e-02 1.021897810218978103e-01 7.415406767458602999e-02 1.011804384485666120e-01 1.015689512799339417e-01 7.383578431372549156e-02 6.571936056838366402e-02 8.193277310924369783e-02 1.026360067302299478e-01 8.103130755064456847e-02 8.742886704604242720e-02 2.028698664027709098e-01 5.116279069767442067e-01 nan nan 5.000000000000000000e-01 nan nan nan 3.888888888888888951e-01 3.666666666666666408e-01 nan 7.500000000000000000e-01 5.945121951219511924e-02 3.900325027085590340e-02 5.797101449275362389e-02 8.605341246290801327e-02 6.211180124223602411e-02 nan 8.424908424908425508e-02 2.904564315352697185e-02 1.201201201201201191e-01 6.985294117647058987e-02 1.459915611814346093e-01 6.862745098039216285e-02 6.737588652482269513e-02 6.995884773662551515e-02 3.891050583657587603e-02 2.054794520547945091e-02 7.885906040268456096e-02 2.094240837696335206e-02 0.000000000000000000e+00 1.388888888888888812e-02 0.000000000000000000e+00 5.733944954128440685e-02 6.437768240343347270e-02 4.693140794223826795e-02 3.225806451612903136e-02 1.812688821752266033e-02 1.149425287356321823e-02 2.647058823529411797e-01 1.550387596899224785e-02 7.407407407407406996e-02 3.333333333333333148e-01 6.666666666666666297e-01 1.093750000000000000e-01 nan 2.307692307692307820e-01 9.090909090909091161e-02 5.714285714285714107e-02 2.857142857142856984e-01 0.000000000000000000e+00 0.000000000000000000e+00 1.724137931034482873e-01 1.000000000000000056e-01 1.666666666666666574e-01 1.020408163265306145e-01 1.063829787234042562e-01 8.888888888888889228e-02 7.812500000000000000e-02 2.467532467532467522e-01 3.389830508474576259e-02 1.708860759493670833e-01 9.574468085106382920e-02 1.058823529411764691e-01 7.017543859649122417e-02 5.263157894736841813e-02 2.439024390243902524e-02 4.938271604938271331e-02 6.185567010309278579e-02 4.089219330855018569e-02 1.056701030927835044e-01 nan nan nan nan nan nan nan 3.333333333333333287e-02 0.000000000000000000e+00 nan nan 9.420289855072463969e-02 8.556149732620320358e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.286637931034482873e-01 +2.508960573476702316e-01 3.238792314730100652e-01 3.924581005586592064e-01 5.652173913043477826e-01 3.505263157894736858e-01 2.211690363349131105e-01 3.563772775991425612e-01 1.803852889667250381e-01 3.492487479131886619e-01 5.739008419083255763e-01 3.735498839907192559e-01 2.083906464924346613e-01 9.822361546499477902e-02 4.194630872483221667e-02 1.559000861326442777e-01 1.119648737650933007e-01 2.684563758389261687e-02 2.139800285306704686e-02 1.813471502590673426e-02 3.062438057482655962e-01 1.648998822143698528e-01 1.076923076923076983e-01 9.183673469387755584e-02 3.984063745019920250e-02 6.338028169014084390e-02 1.176470588235294101e-01 4.491725768321513240e-02 6.338028169014084390e-02 2.000000000000000111e-01 2.500000000000000139e-02 8.108108108108108558e-02 0.000000000000000000e+00 1.494252873563218509e-01 0.000000000000000000e+00 6.521739130434782428e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 8.333333333333332871e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.816901408450704289e-02 8.695652173913043237e-02 9.002433090024331008e-02 1.145833333333333287e-01 6.250000000000000000e-02 1.405405405405405483e-01 8.688524590163934636e-02 1.482649842271293317e-01 1.195286195286195258e-01 6.706507304116865464e-02 2.339181286549707472e-02 7.894736842105262720e-02 1.119081779053084647e-01 7.344632768361582242e-02 9.407665505226481262e-02 1.623036649214659732e-01 4.000000000000000222e-01 nan nan nan nan nan nan 5.714285714285713969e-01 0.000000000000000000e+00 nan 2.500000000000000000e-01 8.906882591093116808e-02 3.806228373702422174e-02 7.954545454545454419e-02 1.384615384615384692e-01 1.219512195121951192e-01 nan 1.330645161290322509e-01 9.282700421940928703e-02 8.490566037735848559e-02 5.485232067510548842e-02 1.444444444444444309e-01 2.690058479532163593e-01 1.125000000000000028e-01 4.854368932038834877e-02 3.333333333333333287e-02 1.470588235294117627e-02 5.306122448979591621e-02 4.938271604938271331e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.072664359861591754e-01 4.878048780487805047e-02 1.886792452830188607e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan nan nan nan nan nan 8.461538461538462008e-02 5.405405405405405705e-02 2.500000000000000000e-01 0.000000000000000000e+00 1.391304347826086973e-01 0.000000000000000000e+00 0.000000000000000000e+00 6.707317073170732113e-02 0.000000000000000000e+00 6.578947368421052266e-03 4.411764705882353227e-02 3.921568627450980338e-02 0.000000000000000000e+00 6.666666666666666574e-02 nan nan nan nan nan nan nan nan nan nan nan 3.125000000000000000e-02 6.172839506172839164e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.803560076287349156e-01 +3.605328892589508838e-01 2.775024777006937504e-01 3.185483870967741882e-01 1.000000000000000000e+00 6.082089552238806318e-01 5.000000000000000000e-01 3.189600507292327247e-01 1.619217081850533868e-01 3.533196841181632242e-01 4.845791949817041533e-01 7.747909199522102774e-01 5.093650068524440133e-01 2.523427041499330392e-01 1.012658227848101250e-01 1.364985163204747720e-01 3.246753246753246447e-02 1.271860095389507235e-02 2.089552238805970213e-02 4.848484848484848481e-02 7.534685165421558528e-01 4.933741080530071321e-01 2.181208053691275073e-01 1.470588235294117696e-01 3.131115459882582996e-02 5.154639175257731687e-02 8.275862068965517127e-02 4.135338345864661425e-02 3.947368421052631360e-02 7.692307692307692735e-02 3.278688524590164105e-02 4.615384615384615641e-02 6.250000000000000000e-02 4.000000000000000083e-02 9.836065573770491621e-02 5.487804878048780505e-02 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.030927835051546372e-02 6.324110671936758465e-02 2.830188679245283084e-02 6.842105263157895190e-02 1.441441441441441429e-01 1.051625239005736095e-01 7.608695652173913526e-02 1.161731207289293799e-01 1.609686609686609704e-01 1.086956521739130405e-01 7.079646017699114946e-02 1.117318435754189876e-01 3.448275862068965469e-02 6.003752345215759845e-02 2.933526011560693703e-01 8.000000000000000444e-01 nan nan nan nan nan nan 6.875000000000000000e-01 0.000000000000000000e+00 nan 5.000000000000000000e-01 7.335907335907336513e-02 4.710632570659488427e-02 5.172413793103448204e-02 1.401869158878504551e-01 4.761904761904761640e-02 nan 3.233830845771144546e-01 1.796407185628742520e-01 3.149606299212598381e-02 2.904564315352697185e-02 1.055045871559633086e-01 2.919708029197080196e-02 4.327272727272727382e-01 1.709090909090908994e-01 7.163323782234956583e-02 4.918032786885245811e-02 1.045296167247386845e-02 1.785714285714285615e-02 2.702702702702702853e-02 3.225806451612903136e-02 9.090909090909091161e-02 5.082508250825082952e-01 2.694610778443113919e-01 6.481481481481481122e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.127659574468085055e-02 nan 0.000000000000000000e+00 1.388888888888888951e-01 nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan nan nan nan nan nan 0.000000000000000000e+00 1.000000000000000056e-01 6.666666666666666574e-02 1.052631578947368363e-01 0.000000000000000000e+00 0.000000000000000000e+00 nan 6.329113924050633333e-02 0.000000000000000000e+00 3.333333333333333287e-02 1.923076923076923184e-02 0.000000000000000000e+00 5.263157894736841813e-02 7.446808510638297518e-02 nan nan nan nan nan nan nan 2.500000000000000000e-01 nan nan nan 0.000000000000000000e+00 5.882352941176470507e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.732335827098919312e-01 +1.943396226415094463e-01 1.719383617193836200e-01 2.460896767466110580e-01 4.615384615384615641e-01 2.533172496984318345e-01 1.879954699886749736e-01 3.137508069722401705e-01 2.484807562457798658e-01 4.184265490833140033e-01 3.416030534351144898e-01 5.146853146853146432e-01 6.938775510204081565e-01 4.478747203579418468e-01 3.545816733067729265e-01 4.138467522364838724e-01 7.346938775510204744e-02 1.118881118881118880e-01 5.201342281879194757e-02 6.849315068493150305e-02 3.954128440366972419e-01 5.822368421052631637e-01 3.746530989824236602e-01 2.794759825327510772e-01 2.708803611738148931e-02 2.642007926023778180e-02 6.666666666666666574e-02 1.842546063651591404e-02 2.272727272727272790e-02 5.208333333333333044e-03 4.000000000000000083e-02 6.224066390041493868e-02 7.352941176470588480e-02 1.188118811881188064e-01 1.321839080459770166e-01 9.831460674157303792e-02 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 3.448275862068965469e-02 1.162790697674418589e-02 6.428571428571427937e-02 9.090909090909091161e-02 3.067484662576687102e-02 4.861111111111111188e-02 7.178217821782177654e-02 1.124031007751938038e-01 1.046831955922865043e-01 1.488549618320610668e-01 7.407407407407406996e-02 5.868263473053892537e-02 7.849293563579277933e-02 4.102564102564102561e-02 7.782101167315175205e-02 1.969696969696969613e-01 1.000000000000000000e+00 nan nan nan nan nan nan 4.444444444444444198e-01 4.615384615384615641e-01 nan 6.666666666666666297e-01 5.596107055961070664e-02 5.874499332443257338e-02 5.333333333333333676e-02 8.024691358024690913e-02 7.692307692307692735e-02 nan 8.130081300813007950e-02 8.536585365853659180e-02 5.072463768115942351e-02 6.896551724137930939e-02 4.049844236760124366e-02 6.802721088435374763e-02 1.290983606557377095e-01 2.371134020618556604e-01 1.312500000000000056e-01 1.000000000000000056e-01 8.487084870848708718e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.333333333333333419e-02 0.000000000000000000e+00 1.013513513513513570e-01 1.818181818181818232e-01 7.947019867549669214e-02 0.000000000000000000e+00 1.190476190476190410e-02 1.030927835051546372e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 8.333333333333332871e-02 5.882352941176470507e-02 2.500000000000000000e-01 0.000000000000000000e+00 2.824858757062146883e-02 0.000000000000000000e+00 3.125000000000000000e-02 3.225806451612903136e-02 0.000000000000000000e+00 8.333333333333332871e-02 5.932203389830508627e-02 nan nan nan 2.500000000000000000e-01 nan nan nan 1.875000000000000000e-01 0.000000000000000000e+00 nan nan 2.325581395348837177e-02 5.376344086021505458e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.051282051282051322e-01 +6.099518459069020598e-02 8.176100628930817182e-02 7.366482504604052184e-02 3.333333333333333148e-01 9.005628517823639767e-02 5.067567567567567849e-02 1.680129240710823979e-01 3.034013605442176797e-01 2.683189655172413812e-01 1.532012195121951192e-01 2.717733473242392450e-01 4.358974358974359031e-01 7.522195318805487974e-01 6.885325558794946899e-01 4.590303373972214329e-01 4.407806191117092931e-01 4.146067415730337324e-01 4.396306818181818232e-01 4.739960500329163939e-01 2.078521939953810738e-01 6.529459241323648522e-01 6.406460296096904150e-01 1.888888888888888840e-01 1.263157894736842146e-01 1.727386934673366958e-01 1.072210065645514271e-01 8.172043010752688685e-02 1.388429752066115686e-01 9.009009009009008584e-02 1.458333333333333426e-01 7.526881720430107781e-02 9.433962264150944077e-02 3.125000000000000000e-02 1.495327102803738206e-01 2.273276904474002547e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 4.848484848484848481e-02 9.183673469387755584e-02 6.493506493506492894e-02 2.083333333333333218e-02 2.768166089965398008e-02 2.500000000000000139e-02 4.545454545454545581e-02 4.589707927677329907e-02 5.185185185185185036e-02 6.705539358600583200e-02 6.849315068493150305e-02 4.166666666666666435e-02 1.969045571797076455e-01 1.693386773547094215e-01 7.142857142857143016e-01 nan nan nan nan nan nan 1.355932203389830504e-01 2.820512820512820484e-01 nan nan 4.761904761904761640e-02 7.722007722007721842e-02 3.896103896103896014e-02 2.564102564102564014e-02 0.000000000000000000e+00 nan 3.896103896103896014e-02 1.574803149606299191e-02 0.000000000000000000e+00 9.322033898305084887e-02 1.172248803827751207e-01 0.000000000000000000e+00 5.617977528089887485e-02 2.064343163538873982e-01 5.310344827586206407e-01 3.875598086124402153e-01 1.736972704714640214e-01 3.084112149532710068e-01 2.513089005235601969e-01 3.167701863354037140e-01 3.411764705882353033e-01 9.340659340659340781e-02 4.227272727272727293e-01 2.539682539682539542e-01 4.615384615384615641e-02 1.265822784810126563e-02 3.553299492385787045e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.428571428571428527e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 5.000000000000000278e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 6.250000000000000000e-02 2.000000000000000111e-01 0.000000000000000000e+00 0.000000000000000000e+00 2.409638554216867595e-02 0.000000000000000000e+00 2.083333333333333218e-02 3.448275862068965469e-02 9.375000000000000000e-02 6.185567010309278579e-02 1.000000000000000056e-01 nan nan nan nan nan nan nan 5.357142857142856845e-02 nan nan nan 0.000000000000000000e+00 5.555555555555555247e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.649083594099240324e-01 +1.990049751243781057e-02 2.407002188183807526e-02 3.289473684210526133e-03 nan 4.573170731707316972e-02 2.034883720930232703e-02 6.953223767383059917e-02 1.606591143151390455e-01 2.313489073097211857e-01 1.061007957559681747e-01 1.348402182385035064e-01 3.182302771855010648e-01 6.906845084920226752e-01 7.219178082191780588e-01 5.092748735244518876e-01 2.144821264894592183e-01 2.912482065997130665e-01 4.492830589484864690e-01 3.299065420560747808e-01 5.518394648829431232e-02 3.981042654028436045e-01 4.167550371155885336e-01 1.833910034602076189e-01 6.847826086956521063e-02 1.381118881118880981e-01 1.055555555555555552e-01 5.843071786310517768e-02 2.000000000000000111e-01 2.460937500000000000e-01 4.528301886792452935e-01 2.164383561643835607e-01 2.231404958677686012e-01 1.632653061224489666e-01 2.187500000000000000e-01 2.921739130434782838e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.846153846153846367e-02 9.900990099009901110e-03 4.347826086956521618e-02 7.894736842105262720e-02 1.869158878504672758e-02 1.970443349753694603e-02 8.695652173913043237e-02 8.536585365853659180e-02 5.189620758483033669e-02 7.199999999999999456e-02 4.936014625228519331e-02 6.790123456790123080e-02 4.729729729729729992e-02 9.053069719042663999e-02 7.417582417582417598e-02 8.000000000000000444e-01 nan nan nan nan nan nan 0.000000000000000000e+00 1.315789473684210453e-01 nan nan 2.247191011235954994e-02 2.380952380952380820e-02 5.555555555555555247e-02 2.631578947368420907e-02 7.142857142857142461e-02 nan 6.849315068493150305e-03 1.408450704225352144e-02 0.000000000000000000e+00 5.454545454545454281e-02 8.522727272727272096e-02 3.125000000000000000e-02 6.285714285714286143e-02 7.246376811594203160e-02 2.857142857142856984e-01 4.450000000000000067e-01 1.566265060240963902e-01 2.272727272727272652e-01 8.641975308641974829e-02 1.639344262295081844e-01 1.290322580645161255e-01 5.208333333333333565e-02 1.578947368421052544e-01 1.444444444444444309e-01 2.040816326530612082e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.278688524590164105e-02 1.428571428571428492e-01 nan 0.000000000000000000e+00 nan nan nan 1.190476190476190410e-02 nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan 4.761904761904761640e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 1.492537313432835792e-02 nan 3.846153846153846367e-02 0.000000000000000000e+00 1.000000000000000056e-01 2.083333333333333218e-02 6.578947368421052266e-02 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.364485981308411033e-01 +9.351753453772582159e-02 9.020044543429843464e-02 1.392722710163111777e-01 0.000000000000000000e+00 6.194690265486725578e-02 6.540447504302926429e-02 2.983725135623869762e-01 3.735941320293398316e-01 3.788714467543487507e-01 2.407282535401213674e-01 1.914191419141914319e-01 3.829047949965253550e-01 4.672648720505151454e-01 5.235355648535564566e-01 7.160273565269105189e-01 3.656152820968458506e-01 5.060052219321148348e-01 2.288313505948215421e-01 1.127765881513204810e-01 8.249312557286893333e-02 3.842652795838751856e-01 3.267827063447501512e-01 2.243346007604562764e-01 1.376854599406528157e-01 1.667628390075014400e-01 3.050279329608938661e-01 1.699092088197146633e-01 2.442455242966752038e-01 3.217993079584774985e-01 4.255319148936170248e-01 3.750000000000000000e-01 3.957446808510638459e-01 2.834645669291338543e-01 2.102102102102102188e-01 2.601626016260162877e-01 4.761904761904761640e-02 5.000000000000000278e-02 nan 2.000000000000000111e-01 3.703703703703703498e-02 0.000000000000000000e+00 1.626016260162601798e-02 2.380952380952380820e-02 2.967359050445103966e-02 4.651162790697674354e-02 2.857142857142857054e-02 4.022988505747126381e-02 4.494382022471909988e-02 5.244755244755244794e-02 1.329787234042553168e-01 9.313338595106550322e-02 1.400000000000000133e-01 1.197564276048714432e-01 8.301306687163720333e-02 1.086956521739130405e-01 1.231578947368421051e-01 1.333333333333333315e-01 6.600000000000000311e-01 nan nan nan nan nan nan 2.200000000000000011e-01 1.219512195121951192e-01 nan nan 1.046511627906976799e-01 6.794258373205741552e-02 4.310344827586207184e-02 2.586206896551724102e-02 0.000000000000000000e+00 nan 2.051282051282051280e-02 2.290076335877862593e-02 2.923976608187134341e-02 8.527131782945736316e-02 1.008849557522123880e-01 4.651162790697674354e-02 9.876543209876542662e-02 1.387434554973822065e-01 1.441605839416058299e-01 2.277777777777777735e-01 3.584905660377358250e-01 1.024590163934426257e-01 3.090909090909090828e-01 1.428571428571428492e-01 5.747126436781609116e-02 6.800000000000000488e-02 5.025125628140703765e-02 8.467741935483870386e-02 2.000000000000000042e-02 3.083700440528634387e-02 8.187134502923976154e-02 1.666666666666666574e-01 0.000000000000000000e+00 2.272727272727272790e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 3.636363636363636187e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.250000000000000000e-01 1.000000000000000056e-01 2.500000000000000000e-01 4.166666666666666435e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.439024390243902524e-02 3.448275862068965469e-02 4.166666666666666435e-02 0.000000000000000000e+00 7.692307692307692735e-02 2.173913043478260809e-02 6.060606060606060774e-02 1.255230125523012531e-02 0.000000000000000000e+00 9.900990099009901110e-03 1.986754966887417304e-02 0.000000000000000000e+00 5.263157894736841813e-02 4.014598540145985356e-02 nan nan nan nan nan nan nan 1.587301587301587213e-02 nan nan nan 0.000000000000000000e+00 4.022988505747126381e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.884910485933504076e-01 +1.547085201793721998e-01 9.452201933404941192e-02 1.098779134295227583e-01 7.142857142857142461e-02 6.397306397306397330e-02 4.329004329004328827e-02 3.586534311609840264e-01 6.180335296782962784e-01 2.177725811166325576e-01 1.078806426931905177e-01 5.776173285198556162e-02 8.852005532503458285e-02 4.857142857142857095e-01 2.387387387387387427e-01 3.388764044943819997e-01 8.370833333333332904e-01 5.611303344867358822e-01 3.145384190160309679e-01 2.535070140280560880e-01 5.452865064695009562e-02 3.626168224299065601e-01 3.496214728148657747e-01 3.099510603588907093e-02 7.618847286495582516e-01 1.730639730639730589e-01 3.189149560117301996e-01 4.829821717990275265e-01 1.488673139158576131e-01 8.843537414965986498e-02 4.242424242424242681e-02 1.511758118701007902e-01 8.823529411764706454e-02 8.390022675736961977e-02 3.598484848484848758e-02 8.695652173913043237e-02 2.500000000000000139e-02 9.569377990430621636e-03 7.575757575757575968e-03 0.000000000000000000e+00 1.818181818181818094e-02 8.264462809917355601e-03 3.643724696356274995e-02 8.612440191387560340e-02 1.394129979035639288e-01 9.915611814345991204e-02 1.337448559670781911e-01 2.155555555555555558e-01 1.286795626576955343e-01 1.402660217654171648e-01 1.273677335075114325e-01 1.103067907618062726e-01 1.353135313531353134e-01 2.876755070202808295e-01 3.221793221793221584e-01 3.159303882195448332e-01 5.913757700205338752e-01 4.153488372093023240e-01 1.904761904761904656e-01 nan nan nan nan nan nan 3.793103448275861878e-01 8.260869565217391353e-01 nan 3.636363636363636465e-01 2.018072289156626620e-01 8.408023900981646814e-02 2.333333333333333370e-01 4.081632653061224164e-02 2.127659574468085055e-02 nan 4.166666666666666435e-02 3.773584905660377214e-02 5.405405405405405705e-02 2.184466019417475591e-01 1.450980392156862864e-01 1.190476190476190410e-01 2.564102564102564014e-02 9.090909090909091161e-02 1.278195488721804440e-01 2.631578947368420907e-02 4.972375690607734600e-02 4.423592493297587303e-01 6.217616580310880714e-02 1.186440677966101725e-01 7.692307692307692735e-02 7.042253521126760896e-02 1.219512195121951192e-01 6.896551724137930939e-02 0.000000000000000000e+00 1.948051948051948146e-01 1.621621621621621712e-02 5.660377358490566169e-02 2.745098039215686236e-02 6.666666666666666574e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan nan 5.555555555555555247e-02 0.000000000000000000e+00 1.000000000000000000e+00 1.250000000000000000e-01 nan nan nan 0.000000000000000000e+00 2.000000000000000042e-02 1.818181818181818094e-02 6.382978723404254817e-02 1.282051282051282007e-02 3.205128205128205399e-01 4.411764705882353227e-02 1.788079470198675469e-01 4.310344827586207184e-02 1.834862385321101019e-02 8.647140864714086828e-02 0.000000000000000000e+00 1.464435146443514649e-02 7.075471698113207364e-02 2.439024390243902524e-02 1.634446397188049072e-01 9.239130434782608092e-02 nan nan nan nan nan nan nan 0.000000000000000000e+00 3.548387096774193727e-01 nan nan 4.026845637583892357e-02 4.107142857142857123e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.629936939926982964e-01 +3.156384505021520709e-02 2.653399668325041524e-02 4.888888888888889145e-02 0.000000000000000000e+00 3.179190751445086505e-02 1.446654611211573190e-02 1.576168929110105532e-01 2.225705329153604972e-01 1.207464324917672943e-01 4.809052333804809259e-02 4.984093319194061317e-02 7.730923694779116839e-02 3.567937438905181002e-01 2.508624938393297366e-01 4.070097884433217517e-01 4.663293110159595356e-01 7.068414322250639037e-01 4.379481522338665167e-01 2.779661016949152574e-01 2.769535113748763586e-02 1.310272536687631106e-01 3.854282536151279470e-01 1.014799154334038028e-01 3.925152306353350551e-01 3.769072164948453763e-01 2.699386503067484622e-01 3.265833692373976693e-01 2.198275862068965469e-01 1.467576791808873626e-01 2.000000000000000111e-01 2.101827676240208831e-01 1.681034482758620718e-01 1.130952380952380959e-01 1.511627906976744096e-01 1.134969325153374203e-01 4.166666666666666435e-02 1.190476190476190410e-02 9.722222222222222376e-02 4.761904761904761640e-02 1.250000000000000000e-01 0.000000000000000000e+00 1.666666666666666644e-02 6.849315068493150305e-02 1.005586592178770999e-01 1.205673758865248163e-01 7.216494845360824084e-02 3.649635036496350071e-02 5.882352941176470507e-02 6.770833333333332871e-02 7.366482504604052184e-02 6.467259498787389371e-02 1.525423728813559421e-01 1.343001261034048044e-01 6.466302367941711982e-02 1.146666666666666667e-01 1.983805668016194457e-01 8.420268256333830748e-02 0.000000000000000000e+00 nan nan nan nan nan nan 2.068965517241379282e-01 4.666666666666666741e-01 nan nan 5.714285714285714107e-02 3.948772678762006716e-02 1.304347826086956486e-01 0.000000000000000000e+00 1.818181818181818232e-01 nan 0.000000000000000000e+00 2.857142857142857054e-02 2.702702702702702853e-02 1.298701298701298787e-02 3.804347826086956763e-02 1.052631578947368363e-01 2.702702702702702853e-02 2.830188679245283084e-02 7.812500000000000000e-02 9.243697478991597105e-02 1.861471861471861444e-01 1.094527363184079616e-01 4.444444444444444198e-01 1.436464088397789995e-01 5.797101449275362389e-02 3.488372093023255766e-02 4.166666666666666435e-02 1.126760563380281716e-01 0.000000000000000000e+00 7.092198581560284210e-02 9.790209790209790375e-02 0.000000000000000000e+00 2.083333333333333218e-02 9.090909090909091161e-02 0.000000000000000000e+00 nan 2.439024390243902524e-02 nan 0.000000000000000000e+00 4.545454545454545581e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 6.250000000000000000e-02 3.125000000000000000e-02 0.000000000000000000e+00 2.439024390243902524e-02 0.000000000000000000e+00 4.347826086956521618e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.030456852791878014e-02 0.000000000000000000e+00 2.898550724637681195e-02 6.818181818181817677e-02 5.494505494505494934e-03 3.826530612244898044e-02 2.409638554216867595e-02 nan nan nan nan nan nan nan 6.451612903225806273e-02 nan nan nan 8.695652173913043237e-02 1.324503311258278145e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.717420212765957577e-01 +2.777777777777777624e-02 2.737752161383285449e-02 4.940711462450592811e-02 nan 2.421307506053268707e-02 1.183431952662721866e-02 6.369426751592356661e-02 5.514885309907271993e-02 6.380988023952095800e-02 9.166666666666666019e-02 5.217391304347825803e-02 8.430145963658028374e-02 3.363217833777562560e-01 3.375603864734299520e-01 1.766903914590747249e-01 1.699070160608622260e-01 3.413092550790067792e-01 6.511070370892680925e-01 5.465479913399086120e-01 3.660714285714285893e-02 1.017052375152253385e-01 3.689801699716713790e-01 1.260115606936416111e-01 1.263035921205098444e-01 4.510340112801230483e-01 1.562795089707270935e-01 1.286274509803921606e-01 2.302568981921979119e-01 1.755952380952380820e-01 2.753036437246963453e-01 7.196315486470926392e-02 7.721280602636534929e-02 3.947368421052631360e-02 9.606299212598425064e-02 2.049486461251167069e-01 0.000000000000000000e+00 1.754385964912280604e-02 5.063291139240506250e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.325581395348837177e-02 3.846153846153846367e-02 1.234567901234567833e-02 1.149425287356321823e-02 1.044776119402985037e-01 2.586206896551724102e-02 3.047091412742382321e-02 2.290076335877862593e-02 2.949061662198391304e-02 4.062126642771803769e-02 6.896551724137930939e-02 6.116433308769344407e-02 4.662698412698412787e-02 6.233062330623306141e-02 1.183063511830635128e-01 5.439056356487548954e-02 7.187500000000000000e-01 nan nan 1.000000000000000000e+00 3.333333333333333148e-01 nan nan 0.000000000000000000e+00 8.333333333333332871e-02 nan nan 2.162162162162162282e-02 2.863961813842482232e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 2.040816326530612082e-02 8.928571428571428076e-03 2.040816326530612082e-02 6.122448979591836593e-02 2.857142857142857054e-02 5.063291139240506250e-02 1.138952164009111589e-01 2.000000000000000111e-01 6.806282722513089245e-02 4.329004329004328827e-02 1.722222222222222210e-01 2.385964912280701677e-01 2.761904761904762085e-01 3.076923076923077094e-02 5.228758169934640682e-02 1.541850220264317228e-01 0.000000000000000000e+00 2.298850574712643646e-02 5.327868852459016064e-02 0.000000000000000000e+00 3.952569169960474041e-03 7.499999999999999722e-02 3.030303030303030387e-02 nan 9.090909090909091161e-02 nan nan 0.000000000000000000e+00 5.797101449275362389e-02 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 3.225806451612903136e-02 2.777777777777777624e-02 2.421307506053268707e-02 2.120141342756183891e-02 nan nan nan nan nan nan nan 1.666666666666666574e-01 nan nan nan nan 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.581780538302277161e-01 +4.501607717041800766e-02 7.853403141361256154e-03 2.242152466367712885e-02 nan 1.734104046242774394e-02 2.985074626865671585e-02 4.582484725050916391e-02 2.976669348350764396e-02 4.239212717638152911e-02 2.313167259786476707e-02 6.276747503566333652e-02 1.007234279354479733e-01 4.071702944942381386e-01 4.081419624217119124e-01 1.480061349693251593e-01 1.463414634146341375e-01 2.342588971450919044e-01 6.394090719933416267e-01 8.257940327237728306e-01 3.629764065335753381e-02 2.215709261430246213e-01 6.032138442521631783e-01 3.102253032928942722e-01 8.733087330873308407e-02 3.636363636363636465e-01 1.529801324503311244e-01 1.366191093817552826e-01 3.168851195065535697e-01 1.352657004830917775e-01 2.314049586776859568e-01 7.991940899932840903e-02 1.272727272727272596e-01 1.299435028248587531e-01 1.623931623931623991e-01 3.684895833333333148e-01 9.523809523809523281e-02 4.210526315789473589e-02 1.562500000000000000e-01 3.333333333333333287e-02 1.250000000000000000e-01 1.369863013698630061e-02 1.052631578947368397e-02 5.555555555555555247e-02 1.724137931034482735e-02 1.333333333333333315e-01 1.709401709401709574e-02 4.444444444444444614e-02 2.400000000000000050e-02 5.813953488372092943e-02 5.982905982905983161e-02 2.852348993288590651e-02 4.166666666666666435e-02 4.801670146137786838e-02 5.128205128205128027e-02 1.000000000000000056e-01 1.630952380952380987e-01 7.804878048780487798e-02 2.000000000000000111e-01 nan nan 5.999999999999999778e-01 2.000000000000000111e-01 nan nan nan 1.071428571428571369e-01 nan nan 9.009009009009008931e-03 5.357142857142856845e-02 0.000000000000000000e+00 nan nan nan nan 0.000000000000000000e+00 2.631578947368420907e-01 9.803921568627450844e-03 3.351955307262569767e-02 3.921568627450980338e-02 6.849315068493150305e-02 5.223880597014925187e-02 1.398809523809523836e-01 8.196721311475409222e-02 5.327868852459016064e-02 1.851851851851851749e-02 7.352941176470588480e-02 1.696428571428571508e-01 5.961538461538461453e-01 2.857142857142857054e-02 3.260869565217391214e-02 3.208955223880596841e-01 1.290322580645161255e-01 0.000000000000000000e+00 4.712041884816754039e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.428571428571428492e-01 6.521739130434782428e-02 0.000000000000000000e+00 2.564102564102564014e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 4.347826086956521618e-02 1.428571428571428492e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.176470588235294101e-01 1.176470588235294101e-01 0.000000000000000000e+00 8.730158730158729674e-02 1.428571428571428527e-02 nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.584724005134788394e-01 +4.774096385542168641e-01 3.893591293833131850e-01 2.840690978886756257e-01 8.888888888888888395e-01 7.197452229299362569e-01 6.673003802281368690e-01 2.896368467670504820e-01 9.989142236699240229e-02 2.322834645669291376e-01 3.797101449275362417e-01 6.922300706357215061e-01 2.999999999999999889e-01 1.299363057324840753e-01 3.164556962025316666e-02 5.427135678391959567e-02 3.098927294398092988e-02 2.401746724890829743e-02 2.108963093145869994e-02 3.846153846153846367e-02 9.365426695842450355e-01 6.887519260400616350e-01 3.710691823899370800e-01 1.875000000000000000e-01 3.749999999999999861e-02 2.575107296137339047e-02 2.867383512544802865e-02 3.293413173652694897e-02 9.174311926605505096e-03 9.090909090909091161e-02 5.769230769230769551e-02 2.898550724637681195e-02 0.000000000000000000e+00 1.162790697674418589e-02 4.629629629629629373e-02 6.741573033707864981e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 9.090909090909091161e-02 0.000000000000000000e+00 0.000000000000000000e+00 5.357142857142856845e-02 0.000000000000000000e+00 5.016722408026755980e-02 5.063291139240506250e-02 1.015228426395939076e-01 1.379310344827586188e-01 1.056910569105691117e-01 3.980099502487562113e-02 4.687500000000000000e-02 9.677419354838709409e-02 1.840490797546012400e-02 3.135888501742160189e-02 6.762589928057553823e-02 3.105590062111801206e-02 4.807692307692307959e-02 4.224924012158054465e-01 0.000000000000000000e+00 nan nan nan nan nan nan 2.647058823529411797e-01 0.000000000000000000e+00 nan 1.000000000000000000e+00 2.198275862068965469e-01 5.143540669856459108e-02 1.730769230769230727e-01 1.441441441441441429e-01 1.290322580645161255e-01 nan 4.545454545454545303e-01 1.978021978021977934e-01 2.047244094488188948e-01 7.453416149068323171e-02 1.137724550898203540e-01 2.921348314606741492e-01 5.132743362831858613e-01 1.726618705035971313e-01 8.139534883720930813e-02 2.325581395348837177e-02 2.890173410404624221e-02 2.739726027397260122e-02 3.030303030303030387e-02 9.756097560975610095e-02 0.000000000000000000e+00 7.948717948717948234e-01 3.058823529411764941e-01 1.000000000000000056e-01 0.000000000000000000e+00 1.343283582089552231e-01 1.219512195121951262e-02 0.000000000000000000e+00 9.090909090909091161e-02 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 4.545454545454545581e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.111111111111111049e-01 3.448275862068965469e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.724137931034482735e-02 6.250000000000000000e-02 7.692307692307692735e-03 2.439024390243902524e-02 0.000000000000000000e+00 4.687500000000000000e-02 1.338028169014084390e-01 nan nan nan nan nan nan nan 5.405405405405405705e-02 nan nan nan 4.166666666666666435e-02 3.361344537815125905e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.572101790763430595e-01 +1.718750000000000000e-01 1.875968992248062128e-01 9.812108559498956828e-02 1.000000000000000000e+00 4.022988505747126520e-01 3.714285714285714413e-01 2.763157894736842368e-01 3.742277140335392716e-01 3.384677746250506769e-01 2.918032786885245700e-01 4.434947768281101710e-01 4.865258557902403247e-01 5.814905814905815262e-01 2.966101694915254106e-01 2.873090481786134132e-01 2.740434332988624377e-01 1.488888888888888762e-01 1.060985797827903032e-01 2.962406015037594154e-01 6.700581395348836899e-01 8.768472906403941280e-01 7.184065934065934078e-01 4.249999999999999889e-01 9.673024523160762833e-02 2.614379084967320341e-02 1.202672605790645888e-01 4.417670682730923809e-02 7.191780821917807820e-02 9.333333333333333759e-02 1.132075471698113234e-01 8.154506437768239968e-02 5.376344086021505458e-02 1.489361702127659504e-01 2.213740458015267254e-01 2.706766917293232932e-01 0.000000000000000000e+00 2.500000000000000000e-01 3.333333333333333148e-01 2.500000000000000000e-01 0.000000000000000000e+00 0.000000000000000000e+00 2.631578947368420907e-01 0.000000000000000000e+00 1.140350877192982393e-01 2.241379310344827624e-01 1.164383561643835552e-01 1.018518518518518462e-01 8.873720136518771506e-02 7.092198581560284210e-02 1.310861423220973654e-01 6.854345165238677484e-02 1.226415094339622647e-01 5.006257822277847269e-02 1.267123287671232945e-01 5.027932960893854997e-02 2.293814432989690622e-01 3.909985935302390803e-01 3.333333333333333148e-01 nan nan nan nan nan nan 3.333333333333333148e-01 1.666666666666666574e-01 nan nan 1.635220125786163436e-01 8.856088560885608252e-02 1.333333333333333315e-01 1.250000000000000069e-02 3.749999999999999861e-02 nan 4.687500000000000000e-02 3.149606299212598381e-02 7.142857142857142461e-02 2.030456852791878153e-01 1.119402985074626905e-01 7.619047619047619735e-02 1.484593837535014005e-01 2.760416666666666852e-01 4.520547945205479201e-01 1.199999999999999956e-01 1.592592592592592671e-01 4.545454545454545581e-02 8.771929824561403022e-02 5.084745762711864736e-02 7.692307692307692735e-02 2.222222222222222099e-01 7.407407407407406996e-01 3.978494623655913776e-01 5.555555555555555247e-02 9.375000000000000000e-02 4.225352112676056260e-02 0.000000000000000000e+00 0.000000000000000000e+00 9.523809523809523281e-02 0.000000000000000000e+00 nan 3.448275862068965469e-02 nan 0.000000000000000000e+00 0.000000000000000000e+00 6.250000000000000000e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 4.166666666666666435e-02 1.724137931034482735e-02 0.000000000000000000e+00 1.428571428571428492e-01 1.428571428571428492e-01 2.941176470588235253e-02 2.777777777777777624e-02 0.000000000000000000e+00 5.309734513274336209e-02 0.000000000000000000e+00 7.777777777777777901e-02 4.838709677419354704e-02 2.040816326530612082e-02 2.631578947368420907e-02 2.020202020202020166e-01 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 2.857142857142857054e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 5.365853658536585691e-01 +1.492537313432835688e-01 1.332007952286282382e-01 6.569343065693430961e-02 nan 2.119205298013245031e-01 3.277511961722487932e-01 1.142546245919477677e-01 1.201044386422976534e-01 1.772277227722772186e-01 2.554585152838427797e-01 3.107617896009673419e-01 3.589562764456981636e-01 5.936708860759494222e-01 4.132653061224489943e-01 2.697201017811705070e-01 2.616243025418474866e-01 3.106575963718820610e-01 3.092269326683291797e-01 6.563307493540051496e-01 4.200626959247649173e-01 7.366459627329192683e-01 8.935361216730037803e-01 7.442273534635879262e-01 1.824370319945541052e-01 1.864716636197440713e-01 1.878072763028515169e-01 1.929716399506781754e-01 2.382310984308131374e-01 1.764705882352941291e-01 1.709844559585492196e-01 1.877794336810730269e-01 1.505016722408026864e-01 1.072796934865900415e-01 4.691629955947136388e-01 4.977375565610859809e-01 1.120689655172413812e-01 4.240282685512367783e-02 2.919708029197080196e-02 3.680981595092024800e-02 5.797101449275362389e-02 0.000000000000000000e+00 7.239819004524887525e-02 2.247191011235954994e-02 6.198347107438016701e-02 3.062500000000000222e-01 3.982300884955752157e-02 5.405405405405405705e-02 8.247422680412370977e-02 2.952029520295202866e-02 7.993474714518759849e-02 4.557640750670241547e-02 4.304635761589403753e-02 6.875000000000000555e-02 6.738281250000000000e-02 1.023255813953488358e-01 2.778450363196126038e-01 1.148825065274151486e-01 7.500000000000000000e-01 nan nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 4.285714285714285476e-01 nan nan 9.248554913294797231e-02 1.889616463985032691e-01 2.222222222222222099e-01 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 7.499999999999999722e-02 5.084745762711864736e-02 6.220095693779904150e-02 2.777777777777777624e-02 0.000000000000000000e+00 3.478260869565217434e-02 5.000000000000000278e-02 2.243589743589743668e-01 2.258064516129032195e-01 4.285714285714285754e-02 1.162790697674418589e-01 1.309523809523809590e-01 2.913385826771653364e-01 6.206896551724138122e-01 2.500000000000000139e-02 3.839285714285714524e-01 7.027027027027027417e-01 2.835820895522387919e-01 1.797235023041474644e-01 3.797468354430379861e-02 5.882352941176470507e-02 3.076923076923077094e-02 5.263157894736841813e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.842105263157894635e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 4.081632653061224164e-02 3.703703703703703498e-02 2.631578947368420907e-02 8.823529411764706454e-02 5.714285714285714107e-02 1.250000000000000000e-01 8.695652173913043237e-02 2.083333333333333218e-02 7.317073170731706877e-02 3.181818181818181490e-02 6.250000000000000000e-02 2.013422818791946178e-02 3.076923076923077094e-02 2.684563758389261687e-02 1.271186440677966045e-01 1.612903225806451568e-02 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 1.744186046511627883e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 5.948414830736162839e-01 +1.557788944723618174e-01 1.639344262295081844e-01 3.067484662576687102e-02 nan 2.352941176470588203e-01 4.786324786324786529e-01 6.402439024390244038e-02 5.943152454780361443e-02 9.923664122137404453e-02 1.363636363636363535e-01 2.100840336134453812e-01 1.862745098039215730e-01 1.957295373665480509e-01 6.698564593301435666e-02 6.952965235173824698e-02 5.641025641025641107e-02 6.683168316831683553e-02 7.389937106918238741e-02 3.097165991902833815e-01 3.859649122807017330e-01 5.423728813559322015e-01 7.842778793418647698e-01 8.775510204081632404e-01 7.486631016042780140e-02 5.350318471337579818e-02 2.013942680092951076e-01 1.473771856786011691e-01 2.464678178963893296e-01 2.600732600732600930e-01 3.070539419087137123e-01 2.766689607708189835e-01 3.559322033898305038e-01 2.495049504950495045e-01 6.860916860916861371e-01 5.700389105058365491e-01 2.177985948477751676e-01 2.009080590238365438e-01 2.019002375296912177e-01 1.411149825783972189e-01 1.718377088305489131e-01 1.519999999999999962e-01 3.146666666666666501e-01 2.107843137254901966e-01 2.900136798905608715e-01 5.330296127562642594e-01 2.162162162162162282e-01 7.471264367816092544e-02 1.301247771836007150e-01 1.787592008412197675e-01 1.815950920245398836e-01 1.360095865787896985e-01 2.317757009345794428e-01 1.152375750955761946e-01 9.969481180061037784e-02 1.373493975903614384e-01 7.827788649706457491e-02 7.216494845360824084e-02 1.000000000000000000e+00 nan nan nan nan nan 0.000000000000000000e+00 nan 4.666666666666666741e-01 nan nan 2.244897959183673464e-01 5.235457063711911330e-01 7.142857142857142461e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan 1.666666666666666574e-01 0.000000000000000000e+00 3.076923076923077094e-02 3.669724770642202039e-02 1.298701298701298787e-02 0.000000000000000000e+00 5.882352941176470507e-02 7.692307692307692735e-02 5.405405405405405705e-02 0.000000000000000000e+00 4.545454545454545581e-02 9.708737864077669061e-03 0.000000000000000000e+00 0.000000000000000000e+00 2.857142857142856984e-01 0.000000000000000000e+00 8.695652173913043237e-02 5.882352941176470784e-01 7.027027027027027417e-01 9.333333333333333759e-02 1.515151515151515194e-02 2.037037037037036924e-01 7.801418439716312214e-02 1.212121212121212155e-01 1.428571428571428492e-01 1.578947368421052544e-01 1.314285714285714224e-01 1.481481481481481399e-01 2.235294117647058931e-01 4.343434343434343647e-01 2.068965517241379282e-01 1.818181818181818232e-01 1.111111111111111049e-01 0.000000000000000000e+00 1.111111111111111049e-01 8.333333333333332871e-02 3.030303030303030387e-02 2.774193548387096642e-01 1.250000000000000000e-01 1.186440677966101725e-01 1.263157894736842146e-01 0.000000000000000000e+00 1.428571428571428492e-01 4.761904761904761640e-02 1.296296296296296224e-01 1.485714285714285765e-01 6.962025316455695834e-02 1.250000000000000000e-01 6.181818181818182073e-02 2.061855670103092744e-02 1.603773584905660299e-01 8.771929824561403022e-02 5.369127516778523374e-02 0.000000000000000000e+00 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 6.060606060606060774e-02 1.039755351681957152e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 5.479658463083877384e-01 +1.051502145922746795e-01 4.750869061413673378e-02 9.284627092846270413e-02 0.000000000000000000e+00 3.773584905660377214e-02 5.964214711729622087e-02 1.630754162585700273e-01 4.088696592752839587e-01 8.778625954198472636e-02 4.761904761904761640e-02 2.927580893682588462e-02 3.142536475869809470e-02 2.002328288707799775e-01 8.196721311475409222e-02 1.662790697674418616e-01 7.330628803245435865e-01 4.515669515669515910e-01 1.607611548556430459e-01 1.122544434050514461e-01 3.810623556581985844e-02 1.862170087976539601e-01 1.973587674247982426e-01 5.548037889039242332e-02 8.183609141055949721e-01 3.049925852694018724e-01 3.097238895558223071e-01 5.504964053406368185e-01 1.184919210053859973e-01 5.390835579514825088e-02 6.934306569343065552e-02 1.514869888475836313e-01 1.107784431137724540e-01 8.865248226950354915e-02 6.633499170812603984e-02 7.479674796747967647e-02 2.083333333333333218e-02 2.341920374707260125e-02 2.112676056338028130e-02 3.719008264462810021e-02 2.484472049689440826e-02 2.758620689655172376e-02 5.230125523012552069e-02 6.382978723404254817e-02 1.710344827586206817e-01 9.360730593607305416e-02 1.032863849765258274e-01 1.568627450980392135e-01 1.344086021505376261e-01 9.668508287292817971e-02 1.332912192040429655e-01 1.295930462267878280e-01 1.752577319587628746e-01 4.084594010497066829e-01 2.563229571984435573e-01 4.656488549618320594e-01 5.980225025571087594e-01 2.696004046535154242e-01 7.142857142857142461e-02 nan nan nan nan nan nan nan 6.666666666666666297e-01 nan nan 1.588594704684317682e-01 8.534136546184739602e-02 0.000000000000000000e+00 2.083333333333333218e-02 0.000000000000000000e+00 nan 4.000000000000000083e-02 1.111111111111111049e-01 4.142011834319526964e-02 7.258064516129032751e-02 1.129943502824858753e-02 0.000000000000000000e+00 nan 2.272727272727272790e-02 7.035175879396984855e-02 2.521008403361344602e-02 2.857142857142857054e-02 1.250000000000000000e-01 1.036585365853658486e-01 0.000000000000000000e+00 4.166666666666666435e-02 5.970149253731343170e-02 6.521739130434782428e-02 9.090909090909091161e-02 2.000000000000000042e-02 3.400503778337531369e-01 9.259259259259258745e-03 1.388888888888888951e-01 1.785714285714285615e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 2.500000000000000000e-01 nan nan nan 0.000000000000000000e+00 nan 4.000000000000000083e-02 0.000000000000000000e+00 4.938271604938271331e-02 4.918032786885245811e-02 1.162790697674418589e-01 0.000000000000000000e+00 2.999999999999999889e-01 0.000000000000000000e+00 3.125000000000000000e-02 5.966587112171837376e-02 3.797468354430379861e-02 3.208556149732620655e-02 4.545454545454545581e-02 5.785123966942148921e-02 2.534246575342465890e-01 8.296943231441047950e-02 nan nan nan nan nan nan nan nan 5.000000000000000000e-01 nan nan 6.250000000000000000e-02 4.966887417218542738e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.297345132743362606e-01 +2.670623145400593396e-02 1.811594202898550790e-02 2.500000000000000139e-02 0.000000000000000000e+00 2.051282051282051280e-02 1.655629139072847811e-02 7.367387033398821450e-02 8.185053380782918164e-02 4.914618908788005031e-02 6.622516556291391243e-02 3.082851637764932526e-02 3.196066379840196980e-02 2.040289256198347112e-01 1.762711864406779627e-01 1.358870967741935554e-01 2.642436149312377136e-01 4.270992366412213470e-01 5.203284598437812880e-01 4.835900870730073797e-01 2.304964539007092056e-02 6.447368421052632192e-02 3.269330565646081932e-01 1.228070175438596423e-01 3.144086021505376194e-01 5.781285231116122247e-01 2.968369829683698558e-01 3.368863955119214548e-01 3.344947735191637905e-01 1.206077872744539398e-01 1.943844492440604810e-01 9.832015810276679979e-02 1.068840579710144956e-01 5.463182897862232934e-02 1.129363449691991733e-01 1.824162679425837263e-01 2.352941176470588203e-02 2.611940298507462593e-02 5.641025641025641107e-02 2.702702702702702853e-02 7.228915662650602092e-02 2.608695652173912902e-02 1.687763713080168634e-02 5.681818181818181976e-03 2.788844621513944175e-02 1.595744680851063704e-02 5.586592178770949380e-02 9.433962264150943036e-03 4.361370716510903217e-02 6.567164179104477417e-02 6.553911205073996438e-02 2.746693794506612288e-02 4.929577464788732072e-02 9.180708890180128146e-02 4.845115170770452478e-02 8.977556109725685907e-02 2.713111207269580105e-01 5.882352941176470507e-02 5.000000000000000000e-01 nan nan 8.571428571428570953e-01 4.285714285714285476e-01 nan nan nan 1.034482758620689641e-01 nan nan 1.526717557251908337e-02 3.290246768507638225e-02 1.666666666666666574e-01 nan 0.000000000000000000e+00 nan nan nan 2.631578947368420907e-02 1.910828025477706929e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 1.189591078066914442e-01 1.328125000000000000e-01 3.553299492385787045e-02 2.797202797202797200e-02 2.762430939226519222e-02 2.380952380952380820e-02 2.173913043478260809e-02 2.222222222222222307e-02 3.488372093023255766e-02 3.649635036496350071e-02 4.918032786885245811e-02 5.911330049261083464e-02 2.802547770700636875e-01 0.000000000000000000e+00 8.368200836820082963e-03 3.076923076923077094e-02 0.000000000000000000e+00 5.555555555555555247e-02 2.272727272727272790e-02 5.999999999999999778e-02 4.347826086956521618e-02 0.000000000000000000e+00 2.112676056338028130e-02 0.000000000000000000e+00 0.000000000000000000e+00 5.555555555555555247e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000056e-01 3.703703703703703498e-02 3.773584905660377214e-02 2.941176470588235253e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.380952380952380820e-02 0.000000000000000000e+00 1.176470588235294101e-01 1.626016260162601798e-02 0.000000000000000000e+00 2.469135802469135665e-02 4.504504504504504292e-02 2.105263157894736795e-02 4.891304347826087168e-02 6.756756756756757132e-03 nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 5.102040816326530726e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.832745382859514272e-01 +5.000000000000000278e-02 9.718670076726342033e-02 1.191222570532915331e-01 0.000000000000000000e+00 1.324503311258278145e-02 3.517587939698492427e-02 2.084848484848484951e-01 2.786885245901639108e-01 2.174922600619195179e-01 1.090487238979118284e-01 1.130742049469964650e-01 1.402061855670103108e-01 1.602708803611738175e-01 1.454545454545454475e-01 2.830739299610894877e-01 3.321247280638143784e-01 2.608257804632426735e-01 2.413793103448275967e-01 2.218649517684887496e-01 1.068493150684931559e-01 1.234567901234567833e-01 1.920000000000000040e-01 1.535433070866141780e-01 2.890888638920134923e-01 2.757628094415658926e-01 5.670764297167290025e-01 4.831704668838219252e-01 3.002832861189801972e-01 2.720994475138121538e-01 1.740576496674057783e-01 3.771699105733824497e-01 3.181818181818181768e-01 2.340093603744149708e-01 1.292234736218138835e-01 2.134920634920634830e-01 2.766798418972332002e-02 1.661129568106312418e-02 7.073954983922829676e-02 5.405405405405405705e-02 1.031390134529148045e-01 2.500000000000000139e-02 4.651162790697674354e-02 7.741116751269035146e-02 7.969798657718120405e-02 7.395498392282957856e-02 4.789272030651341161e-02 9.174311926605505096e-02 9.853249475890984987e-02 1.733232856066314886e-01 2.081239530988274744e-01 9.506790564689063250e-02 2.980769230769230727e-01 1.611583254642744711e-01 1.007484168105929750e-01 1.007518796992481203e-01 1.897356143079315660e-01 1.200701139351446067e-01 3.846153846153846367e-01 nan nan 0.000000000000000000e+00 nan nan nan 1.000000000000000000e+00 2.372881355932203451e-01 nan 0.000000000000000000e+00 8.085106382978723971e-02 5.023547880690738127e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 2.150537634408602322e-02 4.142011834319526964e-02 1.136363636363636395e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.703703703703703498e-02 0.000000000000000000e+00 5.714285714285714107e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.029411764705882304e-01 4.580152671755725186e-02 1.388888888888888812e-02 1.481481481481481538e-02 1.181102362204724393e-01 5.882352941176470507e-02 7.352941176470588480e-02 6.451612903225806273e-02 6.756756756756757132e-02 6.217616580310880714e-02 4.545454545454545581e-02 8.791208791208791895e-02 8.108108108108108558e-02 5.303030303030303177e-02 5.333333333333333676e-02 2.702702702702702853e-02 1.176470588235294101e-01 2.631578947368420907e-02 4.054054054054054279e-02 3.921568627450980338e-02 4.705882352941176405e-02 3.669724770642202039e-02 5.426356589147286746e-02 2.542372881355932368e-02 2.739726027397260122e-02 7.407407407407406996e-02 2.030456852791878014e-02 1.976284584980237194e-02 3.723404255319148759e-02 4.805914972273567232e-02 2.013422818791946178e-02 1.593625498007968100e-02 4.741379310344827347e-02 0.000000000000000000e+00 3.767123287671232668e-02 2.678571428571428423e-02 nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 2.898550724637681195e-02 3.015075376884421982e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.277548918640576514e-01 +9.857612267250821791e-02 6.946983546617915839e-02 1.358428805237315851e-01 0.000000000000000000e+00 4.347826086956521618e-02 2.517985611510791324e-02 2.816901408450704358e-01 3.695175438596491335e-01 1.312863949179459977e-01 8.866995073891625889e-02 6.020942408376963456e-02 5.107084019769357608e-02 1.993957703927492497e-01 1.285714285714285587e-01 2.092409240924092417e-01 6.075898264029067075e-01 3.894616265750286410e-01 2.609208972845336594e-01 2.811387900355871716e-01 4.279279279279279286e-02 1.618320610687022931e-01 3.359486447931526176e-01 9.276437847866418618e-02 5.872051465332380760e-01 3.754071661237785018e-01 5.057870370370370905e-01 7.479871175523349347e-01 3.071428571428571619e-01 1.277080957810718398e-01 9.983896940418679478e-02 2.176966292134831504e-01 1.302428256070640167e-01 1.656952539550374803e-01 7.052096569250317082e-02 1.676056338028169002e-01 2.444987775061124857e-02 3.163017031630170617e-02 3.399433427762039994e-02 3.711790393013100764e-02 9.215017064846416084e-02 6.849315068493150305e-03 5.357142857142856845e-02 7.794676806083650211e-02 1.430096051227321141e-01 1.256983240223463749e-01 7.379134860050889921e-02 7.036247334754797134e-02 1.228710462287104649e-01 1.904761904761904656e-01 2.157744176542705228e-01 1.092592592592592643e-01 3.861386138613861485e-01 4.178230702515177697e-01 1.610369206598586123e-01 4.787234042553191737e-01 5.296317606444188586e-01 2.587446094873023239e-01 1.666666666666666574e-01 nan nan nan nan nan nan nan 4.660194174757281704e-01 nan nan 1.544401544401544368e-01 6.210964607911172858e-02 6.250000000000000000e-02 3.614457831325301046e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 8.000000000000000167e-02 3.389830508474576259e-02 4.743083003952568849e-02 1.744186046511627883e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 4.494382022471909988e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.649006622516556289e-02 6.617647058823529493e-02 3.448275862068965469e-02 0.000000000000000000e+00 6.521739130434782428e-02 0.000000000000000000e+00 5.882352941176470507e-02 3.947368421052631360e-02 4.958677685950413361e-02 0.000000000000000000e+00 5.882352941176470507e-02 1.164658634538152659e-01 1.470588235294117627e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.702702702702702853e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 7.142857142857142461e-02 nan 1.574803149606299191e-02 0.000000000000000000e+00 2.197802197802197974e-02 3.921568627450980338e-02 5.797101449275362389e-02 0.000000000000000000e+00 3.260869565217391214e-02 2.238805970149253602e-02 3.921568627450980338e-02 4.047217537942664201e-02 2.105263157894736795e-02 3.787878787878787984e-02 1.801801801801801786e-02 7.228915662650602092e-02 1.139430284857571168e-01 4.219409282700421759e-02 nan nan nan nan nan nan nan nan 1.250000000000000000e-01 nan nan 0.000000000000000000e+00 3.348214285714285615e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.149506346967559711e-01 +9.859154929577464144e-02 2.877697841726618855e-02 3.389830508474576259e-02 nan 0.000000000000000000e+00 4.672897196261682068e-02 5.415162454873646142e-02 7.311320754716980896e-02 7.887700534759357895e-02 1.493506493506493449e-01 6.486486486486486847e-02 4.975124378109452988e-02 1.738241308793455897e-01 2.458333333333333204e-01 2.437956204379562175e-01 1.888412017167382106e-01 3.167420814479637858e-01 4.708063021316033492e-01 4.814814814814814548e-01 2.013422818791946178e-02 1.219512195121951192e-01 3.248811410459587767e-01 1.973466003316749484e-01 1.756978653530377743e-01 4.273224043715846965e-01 4.139784946236559349e-01 3.325396825396825240e-01 6.334661354581673232e-01 5.970149253731342753e-01 3.753424657534246700e-01 3.629707112970711469e-01 3.849658314350797306e-01 2.775000000000000244e-01 2.460063897763578311e-01 4.358727097396335459e-01 5.963302752293578313e-02 6.267806267806268206e-02 1.528662420382165543e-01 1.559633027522935866e-01 1.656441717791410917e-01 2.285714285714285712e-02 6.395348837209302584e-02 5.434782608695652023e-02 1.224489795918367319e-01 6.870229007633588125e-02 2.479338842975206680e-02 1.206896551724137984e-01 6.896551724137930939e-02 1.187214611872146053e-01 1.041666666666666713e-01 7.845744680851063357e-02 1.327433628318584191e-01 1.526066350710900410e-01 9.325681492109039183e-02 9.667673716012084584e-02 1.518072289156626453e-01 5.970149253731343170e-02 8.000000000000000444e-01 nan nan nan nan nan nan nan 2.105263157894736725e-01 nan nan 6.153846153846154188e-02 3.402187120291615824e-02 nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 3.333333333333333287e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.500000000000000000e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 5.882352941176470507e-02 0.000000000000000000e+00 2.083333333333333218e-02 0.000000000000000000e+00 5.263157894736841813e-02 5.769230769230769551e-02 3.571428571428571508e-01 3.125000000000000000e-02 5.208333333333333565e-02 2.702702702702702853e-02 3.846153846153846367e-02 5.882352941176470507e-02 1.090909090909090856e-01 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 2.272727272727272790e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 1.111111111111111049e-01 9.756097560975610095e-02 2.702702702702702853e-02 3.448275862068965469e-02 0.000000000000000000e+00 1.960784313725490169e-02 1.290322580645161255e-01 3.703703703703703498e-02 0.000000000000000000e+00 4.545454545454545581e-02 nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.969974979149291094e-01 +0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 7.142857142857142461e-02 6.912442396313364656e-02 1.066666666666666735e-01 2.647058823529411797e-01 9.677419354838709409e-02 7.975460122699386256e-02 9.090909090909091161e-02 1.678832116788321061e-01 2.000000000000000111e-01 1.325301204819277212e-01 1.384615384615384692e-01 1.683937823834196768e-01 2.582582582582582664e-01 0.000000000000000000e+00 1.136363636363636326e-01 3.366336633663366551e-01 1.966873706004140798e-01 7.862407862407862214e-02 1.501766784452296943e-01 2.072829131652661194e-01 1.698513800424628351e-01 4.917257683215129904e-01 5.835140997830802201e-01 4.923076923076923350e-01 3.002421307506053516e-01 4.170305676855894927e-01 3.037694013303769425e-01 3.289817232375978895e-01 4.786206896551724044e-01 1.208791208791208799e-01 5.405405405405405705e-02 2.248520710059171701e-01 1.490196078431372528e-01 1.286549707602339110e-01 1.384083044982699004e-02 6.217616580310880714e-02 1.156716417910447769e-01 1.009771986970684071e-01 9.740259740259740728e-02 7.692307692307692735e-02 1.290322580645161255e-01 5.202312138728323876e-02 1.215932914046121555e-01 1.051805337519623185e-01 6.559405940594059681e-02 8.602150537634409289e-02 6.763285024154588876e-02 8.663366336633662734e-02 6.694560669456066371e-02 9.868421052631579093e-02 3.804347826086956763e-02 1.000000000000000000e+00 nan nan nan nan nan nan nan 9.523809523809523281e-02 nan nan 9.821428571428571230e-02 6.755126658624849290e-02 nan nan nan nan nan 1.666666666666666574e-01 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.333333333333333148e-01 0.000000000000000000e+00 0.000000000000000000e+00 1.333333333333333315e-01 6.250000000000000000e-02 0.000000000000000000e+00 5.000000000000000278e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.666666666666666574e-01 5.882352941176470507e-02 1.250000000000000000e-01 1.724137931034482735e-02 0.000000000000000000e+00 1.600000000000000033e-01 6.451612903225806273e-02 nan nan 2.307692307692307820e-01 0.000000000000000000e+00 6.896551724137930939e-02 4.838709677419354704e-02 0.000000000000000000e+00 0.000000000000000000e+00 8.333333333333332871e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 3.488372093023255766e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.423597678916827647e-01 +0.000000000000000000e+00 2.857142857142857054e-02 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 8.333333333333332871e-02 1.562500000000000000e-02 2.654867256637168105e-02 2.857142857142857054e-02 3.278688524590164105e-02 9.302325581395348708e-02 1.375000000000000111e-01 5.333333333333333259e-01 2.777777777777777901e-01 9.883720930232557655e-02 1.612903225806451568e-01 1.889763779527559029e-01 2.413793103448275967e-01 0.000000000000000000e+00 1.754385964912280604e-02 2.585365853658536661e-01 2.106038291605301926e-01 9.016393442622951115e-02 1.127819548872180389e-01 1.751824817518248256e-01 1.537132987910189985e-01 2.989417989417989530e-01 6.321525885558583191e-01 7.714617169373549910e-01 2.746913580246913567e-01 4.538106235565819713e-01 5.174035747883348746e-01 5.258001306335727820e-01 4.388947927736450705e-01 4.413892908827785622e-01 3.632478632478632341e-01 6.024464831804281495e-01 3.818181818181818343e-01 5.360000000000000320e-01 2.358604091456077134e-01 1.864181091877496754e-01 2.899999999999999800e-01 9.633911368015414534e-02 2.006172839506172867e-01 3.460207612456747683e-02 4.918032786885245811e-02 2.413793103448275829e-02 1.636582430806257649e-01 1.537132987910189985e-01 6.291390728476821403e-02 9.829867674858222548e-02 6.785137318255250738e-02 6.034482758620689918e-02 1.296296296296296224e-01 7.640449438202247257e-02 8.270676691729322849e-02 1.000000000000000056e-01 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan nan 6.315789473684210731e-02 7.350096711798839721e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 7.142857142857142461e-02 nan 0.000000000000000000e+00 0.000000000000000000e+00 7.894736842105262720e-02 3.061224489795918297e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.960784313725490169e-02 2.702702702702702853e-02 2.173913043478260809e-02 5.555555555555555247e-02 2.661290322580645018e-01 3.673469387755102372e-02 1.973684210526315819e-01 1.826086956521739135e-01 1.126760563380281716e-01 7.826086956521739746e-02 7.246376811594203160e-02 5.333333333333333676e-02 5.405405405405405705e-02 2.941176470588235253e-02 1.199999999999999956e-01 0.000000000000000000e+00 2.392344497607655496e-02 4.054054054054054279e-02 4.950495049504950729e-02 2.857142857142857054e-02 3.333333333333333148e-01 0.000000000000000000e+00 0.000000000000000000e+00 2.747252747252747207e-02 5.797101449275362389e-02 2.439024390243902524e-02 1.960784313725490169e-02 9.756097560975609748e-03 3.448275862068965469e-02 2.000000000000000042e-02 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 2.482269503546099404e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.893291072371896644e-01 +3.767123287671232668e-02 3.982300884955752157e-02 9.036144578313252962e-02 0.000000000000000000e+00 1.162790697674418589e-02 4.081632653061224164e-02 1.319587628865979412e-01 1.541850220264317228e-01 1.248142644873699858e-01 1.086956521739130405e-01 7.947019867549669214e-02 7.042253521126760896e-02 5.000000000000000278e-02 8.503401360544217413e-02 2.781954887218044958e-01 8.826945412311265615e-02 1.181988742964352745e-01 5.662650602409638467e-02 8.524173027989821738e-02 5.208333333333333565e-02 1.004366812227074218e-01 1.469265367316341941e-01 1.766037735849056711e-01 8.139534883720930813e-02 5.596763317599460358e-02 3.967674661105318190e-01 1.570084200099058913e-01 2.434691745036572652e-01 2.565564424173318314e-01 2.072072072072072002e-01 5.720147722609766339e-01 4.929729729729729892e-01 3.240469208211143592e-01 2.205882352941176405e-01 2.626603646185010077e-01 3.379721669980119414e-02 4.611443210930828152e-02 1.085594989561586704e-01 9.397590361445783136e-02 1.644859813084112166e-01 3.059581320450885725e-02 5.495495495495495569e-02 7.236061684460261267e-02 7.468123861566484945e-02 5.477308294209702610e-02 4.487179487179487197e-02 9.025270758122744263e-02 1.038461538461538519e-01 1.681547619047619180e-01 2.395704254440313985e-01 1.673561489281684966e-01 3.185279187817258717e-01 1.263197586726998445e-01 9.659485753995830648e-02 4.223227752639517607e-02 6.419939577039275591e-02 7.187112763320942233e-02 3.529411764705882582e-01 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 6.250000000000000000e-02 1.000000000000000056e-01 nan nan 4.988123515439429889e-02 7.926371149511644842e-02 1.250000000000000000e-01 nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 1.980198019801980222e-02 1.829268292682926719e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.000000000000000278e-02 1.785714285714285615e-02 1.851851851851851749e-02 3.571428571428571230e-02 0.000000000000000000e+00 0.000000000000000000e+00 5.128205128205128027e-02 0.000000000000000000e+00 6.666666666666666574e-02 2.857142857142857054e-02 1.626016260162601798e-02 0.000000000000000000e+00 1.323529411764705899e-01 6.285714285714286143e-02 5.769230769230769551e-02 2.222222222222222099e-01 8.928571428571428076e-03 1.212121212121212155e-01 3.030303030303030387e-02 6.923076923076923461e-02 4.575163398692810163e-02 8.000000000000000167e-02 3.508771929824561209e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.851851851851851749e-02 4.032258064516128920e-02 3.508771929824561209e-02 5.263157894736841813e-02 2.702702702702702853e-02 8.045977011494252762e-02 8.396946564885496289e-02 1.369863013698630061e-02 1.428571428571428492e-01 7.453416149068323171e-02 7.633587786259542207e-02 1.020408163265306145e-01 9.585492227979273971e-02 2.941176470588235253e-02 2.493074792243767449e-02 3.381642512077294438e-02 4.195804195804195974e-02 3.883495145631067624e-02 1.379310344827586188e-02 nan nan nan nan nan nan nan 3.448275862068965469e-02 nan nan nan 0.000000000000000000e+00 5.655526992287917415e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.935072635635932459e-01 +2.222222222222222307e-02 5.555555555555555247e-02 0.000000000000000000e+00 nan nan 5.555555555555555247e-02 2.777777777777777624e-02 2.580645161290322578e-02 6.338028169014084390e-02 5.128205128205128027e-02 1.749999999999999889e-01 9.433962264150944077e-02 5.737704918032787010e-02 1.222222222222222182e-01 1.989528795811518203e-01 7.373271889400921653e-02 8.064516129032257841e-02 4.247104247104246944e-02 1.481481481481481399e-01 5.882352941176470507e-02 8.823529411764706454e-02 1.769547325102880653e-01 2.640000000000000124e-01 5.487804878048780505e-02 5.782312925170068202e-02 2.669172932330827197e-01 1.558603491271820518e-01 2.240000000000000047e-01 3.595800524934383291e-01 3.582278481012658444e-01 5.192719486081370794e-01 6.535836177474402264e-01 4.391304347826087140e-01 2.997676219984508061e-01 3.458282950423216540e-01 8.559498956158663463e-02 6.060606060606060774e-02 1.811764705882352999e-01 1.385826771653543288e-01 2.000000000000000111e-01 4.059040590405903898e-02 4.865771812080536829e-02 1.250000000000000000e-01 8.904109589041095396e-02 7.553956834532374320e-02 7.142857142857142461e-02 8.849557522123893682e-03 9.495548961424332690e-02 1.611940298507462677e-01 2.004405286343612369e-01 1.128584643848288688e-01 1.106557377049180307e-01 6.172839506172839164e-02 5.527638190954774211e-02 4.529616724738676214e-02 4.411764705882353227e-02 1.465201465201465200e-02 0.000000000000000000e+00 1.250000000000000000e-01 nan nan nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 3.763440860215053890e-02 7.142857142857142461e-02 nan nan nan nan nan nan 1.111111111111111049e-01 0.000000000000000000e+00 3.125000000000000000e-02 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.703703703703703498e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.500000000000000139e-02 2.739726027397260122e-02 1.785714285714285615e-02 3.174603174603174427e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.631578947368420907e-02 0.000000000000000000e+00 2.419354838709677352e-02 5.882352941176470507e-02 6.666666666666666574e-02 1.470588235294117627e-02 2.040816326530612082e-02 0.000000000000000000e+00 2.083333333333333218e-02 1.587301587301587213e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.052631578947368397e-02 1.960784313725490169e-02 7.518796992481202590e-03 1.724137931034482735e-02 0.000000000000000000e+00 2.857142857142857054e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 2.797202797202797200e-02 3.448275862068965469e-02 0.000000000000000000e+00 2.777777777777777624e-02 6.849315068493150305e-03 2.000000000000000042e-02 1.111111111111111154e-02 1.470588235294117627e-02 1.000000000000000056e-01 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 1.744186046511627883e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.477504499100179891e-01 +1.666666666666666644e-02 3.418803418803419147e-02 3.921568627450980338e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.234567901234567833e-02 2.016460905349794219e-01 7.560137457044673048e-02 6.167400881057268774e-02 4.545454545454545581e-02 0.000000000000000000e+00 4.444444444444444614e-02 1.000000000000000056e-01 2.941176470588235253e-02 1.937984496124031120e-01 7.481296758104738487e-02 1.870503597122302186e-01 9.803921568627450844e-03 7.051282051282051211e-02 0.000000000000000000e+00 5.084745762711864736e-02 7.526881720430107781e-02 1.687571265678449173e-01 5.935251798561150954e-02 4.810996563573883417e-02 2.755186721991701448e-01 1.768953068592057642e-01 2.233009708737864196e-01 2.723404255319148981e-01 4.139004149377593089e-01 3.681022880215343296e-01 4.988986784140969077e-01 6.669059583632448440e-01 3.441662226957911686e-01 2.866817155756207769e-01 1.413994169096209896e-01 1.581166549543218669e-01 4.087301587301587213e-01 3.037608486017358000e-01 4.612326043737574599e-01 7.019562715765247096e-02 1.851441241685144179e-01 2.812160694896851387e-01 2.295081967213114804e-01 2.138492871690427788e-01 4.181184668989547382e-02 7.086614173228346358e-02 9.003215434083601532e-02 2.743431221020092847e-01 3.040037243947858459e-01 1.288370082144401074e-01 2.902408111533587021e-01 1.446056210335448788e-01 6.918238993710691676e-02 4.848484848484848481e-02 7.542579075425791257e-02 4.322200392927308399e-02 8.333333333333332871e-02 nan nan nan nan nan nan 0.000000000000000000e+00 1.428571428571428492e-01 nan nan 4.724409448818897572e-02 8.369283865401208611e-02 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.000000000000000278e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.000000000000000042e-02 0.000000000000000000e+00 6.060606060606060774e-02 0.000000000000000000e+00 9.756097560975610095e-02 9.790209790209790375e-02 1.805555555555555525e-01 2.072072072072072002e-01 3.164556962025316666e-02 0.000000000000000000e+00 6.306306306306305731e-02 4.115226337448560021e-03 2.985074626865671585e-02 8.974358974358974395e-02 8.280254777070063243e-02 0.000000000000000000e+00 5.533596837944664004e-02 7.017543859649122417e-02 4.929577464788732072e-02 1.011235955056179747e-01 0.000000000000000000e+00 0.000000000000000000e+00 2.816901408450704289e-02 4.054054054054054279e-02 7.317073170731706877e-02 1.858736059479553990e-02 1.388888888888888812e-02 4.081632653061224164e-02 1.418439716312056703e-02 8.547008547008547868e-03 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 4.337349397590361394e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.058963197467352568e-01 +5.291005291005290712e-02 2.343750000000000000e-02 9.900990099009901110e-03 nan 0.000000000000000000e+00 1.869158878504672758e-02 7.119741100323624672e-02 1.986754966887417304e-02 4.054054054054054279e-02 1.369863013698630061e-02 5.468750000000000000e-02 1.317365269461077959e-01 6.666666666666666574e-02 5.357142857142856845e-02 7.142857142857142461e-02 3.318584070796460478e-02 6.967213114754097769e-02 9.595959595959595301e-02 1.994818652849740803e-01 8.490566037735848559e-02 1.153846153846153910e-01 4.324324324324324564e-01 6.778350515463917869e-01 4.251700680272108707e-02 4.913294797687861593e-02 1.683804627249357311e-01 1.153342070773263478e-01 3.176661264181523392e-01 4.635352286773795072e-01 5.811247575953458755e-01 3.223552894211577091e-01 4.035216434336023617e-01 4.089005235602094501e-01 7.438972162740898897e-01 5.916193181818182323e-01 5.416666666666666297e-01 3.633720930232557933e-01 3.388338833883388079e-01 2.445414847161571925e-01 3.090909090909090828e-01 2.155172413793103314e-01 3.958521190261496958e-01 2.021957913998170264e-01 1.373966942148760195e-01 2.996632996632996870e-01 6.539509536784740562e-02 4.878048780487805047e-02 7.504363001745201212e-02 1.250930752047654526e-01 1.442351860358291327e-01 5.949656750572082653e-02 1.004842615012106477e-01 7.459207459207459201e-02 4.370179948586118412e-02 6.886227544910179799e-02 6.834910620399579917e-02 4.835924006908463163e-02 1.212121212121212155e-01 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 nan nan 3.125000000000000000e-02 nan nan 1.028571428571428553e-01 1.912061315046389709e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 4.761904761904761640e-02 2.127659574468085055e-02 nan 0.000000000000000000e+00 3.125000000000000000e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 4.687500000000000000e-02 8.333333333333332871e-02 0.000000000000000000e+00 0.000000000000000000e+00 3.703703703703703498e-02 0.000000000000000000e+00 2.452830188679245293e-01 3.228346456692913202e-01 3.174603174603174427e-02 1.190476190476190410e-02 2.739726027397260122e-02 1.075268817204301161e-02 6.666666666666666574e-02 0.000000000000000000e+00 1.459854014598540028e-01 2.123552123552123472e-01 1.372549019607843257e-01 2.837837837837837718e-01 2.801724137931034253e-01 1.185185185185185230e-01 6.666666666666666574e-02 8.230452674897119347e-02 5.263157894736841813e-02 2.307692307692307820e-01 2.052980132450331063e-01 3.448275862068965469e-02 1.830508474576271194e-01 1.607142857142857262e-01 8.396946564885496289e-02 1.692307692307692402e-01 0.000000000000000000e+00 0.000000000000000000e+00 1.234567901234567833e-02 1.471861471861471982e-01 1.310344827586207017e-01 3.559870550161812336e-02 1.688311688311688319e-01 3.205128205128204844e-02 2.116402116402116285e-02 4.697986577181208212e-02 8.695652173913043237e-02 2.564102564102564014e-02 0.000000000000000000e+00 nan nan nan nan nan nan 3.333333333333333148e-01 nan nan nan 1.612903225806451568e-02 3.252032520325203596e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.261869436201780603e-01 +9.677419354838709409e-02 4.255319148936170109e-02 5.263157894736841813e-02 nan 2.500000000000000000e-01 1.584158415841584178e-01 1.262135922330097082e-01 4.804804804804804763e-02 1.074218750000000000e-01 1.125827814569536484e-01 1.337579617834394885e-01 1.454545454545454475e-01 1.971580817051509782e-01 2.521739130434782483e-01 1.717032967032967039e-01 1.092278719397363485e-01 1.128107074569789647e-01 1.691068814055636804e-01 4.727891156462585287e-01 8.849557522123893682e-02 2.594142259414226048e-01 5.252387448840382111e-01 5.504115226337448208e-01 8.029197080291970712e-02 1.735474006116208001e-01 2.373660030627871287e-01 2.015355086372360716e-01 3.802698145025295018e-01 5.835140997830802201e-01 4.013671875000000000e-01 3.532608695652174058e-01 3.554216867469879304e-01 2.250996015936254924e-01 5.246666666666666146e-01 7.026279391424619103e-01 2.424242424242424310e-01 1.107174490699734254e-01 1.138392857142857123e-01 7.971014492753622505e-02 1.012658227848101250e-01 3.577512776831345831e-02 7.346938775510204744e-02 4.222972972972972860e-02 9.683098591549295364e-02 2.358803986710963363e-01 3.375527426160337269e-02 6.451612903225806273e-02 4.336734693877550978e-02 7.905544147843943104e-02 9.945609945609945601e-02 7.083906464924347168e-02 1.477832512315271074e-01 7.755359394703656428e-02 7.169344870210135612e-02 6.928406466512701534e-02 8.091286307053942306e-02 5.156950672645740225e-02 5.000000000000000000e-01 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 nan 6.666666666666666297e-01 0.000000000000000000e+00 nan nan 6.557377049180328210e-02 8.712121212121212710e-02 1.666666666666666574e-01 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 1.153846153846153910e-01 2.500000000000000139e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 1.666666666666666574e-01 0.000000000000000000e+00 0.000000000000000000e+00 4.545454545454545581e-02 3.333333333333333148e-01 nan 0.000000000000000000e+00 2.745098039215686514e-01 2.475247524752475226e-01 0.000000000000000000e+00 3.409090909090908839e-02 6.410256410256409687e-02 2.000000000000000042e-02 1.960784313725490169e-02 4.347826086956521618e-02 5.309734513274336209e-02 3.260869565217391214e-02 7.352941176470588480e-02 5.555555555555555247e-02 6.730769230769230449e-02 4.134615384615384359e-01 2.272727272727272790e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 4.225352112676056260e-02 0.000000000000000000e+00 9.259259259259258745e-03 4.918032786885245811e-02 5.357142857142856845e-02 0.000000000000000000e+00 1.666666666666666574e-01 0.000000000000000000e+00 1.428571428571428492e-01 0.000000000000000000e+00 2.564102564102564014e-02 5.319148936170212810e-02 5.128205128205128027e-02 1.315789473684210453e-02 7.692307692307692735e-02 2.702702702702702853e-02 4.000000000000000083e-02 6.666666666666666574e-02 nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 2.343750000000000000e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.246407663650878184e-01 +4.285714285714285476e-01 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 2.564102564102564014e-02 1.538461538461538547e-01 0.000000000000000000e+00 5.000000000000000000e-01 0.000000000000000000e+00 2.000000000000000111e-01 0.000000000000000000e+00 2.333333333333333370e-01 1.834862385321101019e-02 5.479452054794520244e-02 2.127659574468085055e-02 8.421052631578947179e-02 6.666666666666666297e-01 1.724137931034482873e-01 1.007751937984496110e-01 1.550925925925925875e-01 7.142857142857142461e-02 4.761904761904761640e-02 6.576402321083171798e-02 3.414634146341463672e-02 1.169811320754716999e-01 2.038834951456310607e-01 6.045918367346938549e-01 1.057347670250896043e-01 1.616341030195381778e-01 3.498727735368956648e-01 5.933831376734258756e-01 3.302034428794992094e-01 8.507042253521126529e-01 6.883604505632040516e-01 5.541044776119402604e-01 3.740573152337858254e-01 5.128205128205127750e-01 3.668831168831168665e-01 4.773519163763066397e-01 2.484599589322381841e-01 4.664723032069970771e-02 1.681818181818181823e-01 1.863354037267080793e-02 8.139534883720930813e-02 4.545454545454545581e-02 1.355685131195335236e-01 1.289506953223767405e-01 5.675675675675675991e-02 7.828282828282828731e-02 1.010830324909747224e-01 9.115281501340483095e-02 6.132075471698113234e-02 5.555555555555555247e-02 6.493506493506492894e-02 2.222222222222222099e-01 nan nan nan nan nan nan nan nan nan nan 4.950495049504950729e-02 4.425612052730696494e-02 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 1.333333333333333315e-01 2.564102564102564014e-02 0.000000000000000000e+00 5.555555555555555247e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.325581395348837177e-02 0.000000000000000000e+00 1.652892561983471120e-01 1.709401709401709574e-02 6.756756756756757132e-02 1.486486486486486569e-01 7.518796992481202590e-02 3.305785123966942241e-02 1.219512195121951192e-01 1.176470588235294101e-01 1.250000000000000000e-01 2.272727272727272790e-02 4.000000000000000083e-02 1.600000000000000033e-01 2.962962962962963076e-02 6.329113924050633333e-02 6.593406593406593574e-02 1.562500000000000000e-02 8.333333333333333703e-01 0.000000000000000000e+00 3.181818181818181768e-01 5.882352941176470507e-02 1.342281879194630878e-01 9.756097560975610095e-02 7.894736842105262720e-02 0.000000000000000000e+00 2.325581395348837177e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 8.474576271186440649e-03 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.145539906103286265e-01 +0.000000000000000000e+00 2.439024390243902524e-02 2.500000000000000139e-02 nan nan 0.000000000000000000e+00 2.631578947368420907e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.857142857142857054e-02 9.090909090909091161e-02 4.347826086956521618e-02 4.000000000000000083e-02 4.545454545454545581e-02 8.333333333333332871e-02 5.901639344262295250e-02 1.992481203007518686e-01 1.489361702127659642e-02 9.737827715355805436e-02 2.594594594594594461e-02 4.755784061696657905e-02 1.164179104477611887e-01 1.363636363636363535e-01 5.787671232876712146e-01 6.145251396648044456e-02 1.332547169811320875e-01 3.140437544107269052e-01 4.902723735408560102e-01 1.982160555004955360e-01 7.812911725955203890e-01 8.185554903112155500e-01 6.592920353982301140e-01 5.240346729708431628e-01 5.984126984126983961e-01 6.460084033613445742e-01 5.310907237512741963e-01 3.604910714285714524e-01 1.087248322147651020e-01 2.301790281329923193e-01 1.858736059479553990e-02 1.612903225806451568e-02 3.125000000000000000e-02 1.369230769230769251e-01 9.805045871559632531e-02 2.220851326341764451e-02 7.986111111111110494e-02 6.562311860325105439e-02 4.475853945818610014e-02 6.783369803063457604e-02 3.815580286168521185e-02 1.685393258426966245e-02 8.333333333333332871e-02 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 1.818181818181818094e-02 5.648330058939095982e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan nan nan nan 1.578947368421052544e-01 1.612903225806451568e-02 4.166666666666666435e-02 nan 1.234567901234567833e-02 1.388888888888888812e-02 0.000000000000000000e+00 0.000000000000000000e+00 3.571428571428571508e-01 1.801801801801801786e-02 3.846153846153846367e-02 1.008403361344537841e-01 1.367521367521367659e-01 0.000000000000000000e+00 1.341463414634146423e-01 4.838709677419354704e-02 3.703703703703703498e-02 2.727272727272727140e-02 1.116279069767441845e-01 7.291666666666667129e-02 5.911330049261083464e-02 7.777777777777777901e-02 2.678571428571428423e-02 5.263157894736841813e-02 3.333333333333333148e-01 nan 3.225806451612903136e-02 2.880658436213991841e-02 3.937007874015747977e-02 1.395348837209302306e-02 5.357142857142856845e-02 1.290322580645161289e-02 1.282051282051282007e-02 4.000000000000000083e-02 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 2.747252747252747207e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.989927252378287492e-01 +nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 2.702702702702702853e-02 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000056e-01 1.587301587301587213e-02 2.898550724637681195e-02 4.545454545454545581e-02 4.464285714285714385e-02 0.000000000000000000e+00 0.000000000000000000e+00 5.333333333333333676e-02 5.352798053527980243e-02 1.418439716312056703e-02 4.195804195804195974e-02 3.642987249544626938e-02 3.625377643504532066e-02 8.024691358024690913e-02 3.563218390804597790e-01 5.629629629629629983e-01 9.550561797752808724e-02 1.901840490797546135e-01 3.997584541062801922e-01 3.057324840764331086e-01 1.770114942528735746e-01 3.780219780219780112e-01 4.364060676779463188e-01 7.433489827856024634e-01 6.256476683937823857e-01 5.511551155115511635e-01 3.504823151125401881e-01 2.533333333333333548e-01 4.574829931972789199e-01 8.113590263691683457e-02 1.220338983050847509e-01 5.128205128205128027e-02 4.385964912280701511e-02 4.702970297029702984e-02 1.917098445595854794e-01 1.196078431372549072e-01 4.026115342763873783e-02 1.055363321799307891e-01 3.263157894736842118e-02 3.728070175438596284e-02 1.081081081081081141e-02 3.875968992248061962e-02 2.906976744186046471e-02 2.999999999999999889e-01 nan nan nan nan nan nan nan 2.000000000000000111e-01 nan nan 5.050505050505050414e-02 3.899926416482708130e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 2.127659574468085055e-02 nan 5.000000000000000278e-02 2.564102564102564014e-02 0.000000000000000000e+00 1.000000000000000056e-01 0.000000000000000000e+00 2.307692307692307820e-01 9.803921568627450844e-03 1.000000000000000056e-01 1.860465116279069742e-01 7.317073170731706877e-02 5.263157894736841813e-02 1.333333333333333315e-01 6.410256410256409687e-02 6.666666666666666574e-02 8.064516129032257841e-02 1.499999999999999944e-01 1.250000000000000000e-01 8.064516129032257841e-03 1.724137931034482873e-01 2.941176470588235253e-02 2.777777777777777624e-02 0.000000000000000000e+00 nan 3.225806451612903136e-02 5.932203389830508627e-02 1.680672268907562952e-02 3.370786516853932491e-02 4.545454545454545581e-02 2.439024390243902524e-02 0.000000000000000000e+00 0.000000000000000000e+00 6.250000000000000000e-02 nan nan nan nan nan nan nan nan nan nan nan nan 5.263157894736841813e-02 1.485148514851485080e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.041916167664670545e-01 +0.000000000000000000e+00 2.777777777777777624e-02 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 1.666666666666666574e-01 0.000000000000000000e+00 8.000000000000000167e-02 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan 5.555555555555555247e-02 5.940594059405940319e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.785714285714285615e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.209944751381215378e-02 7.089552238805969797e-02 2.100840336134453951e-02 2.702702702702702853e-02 5.390334572490706327e-02 4.433497536945812945e-02 1.834319526627218866e-01 1.737288135593220428e-01 3.928112965340179730e-01 9.280742459396751354e-02 1.660958904109589018e-01 2.994475138121546753e-01 1.821705426356589053e-01 8.667736757624397437e-02 2.948960302457466764e-01 3.612374886260236728e-01 6.671309192200557403e-01 7.709190672153635182e-01 6.788079470198675747e-01 3.812154696132596943e-01 2.834890965732086987e-01 4.794721407624633613e-01 1.283524904214559392e-01 8.630952380952380820e-02 2.439024390243902524e-02 3.763440860215053890e-02 5.943152454780361443e-02 2.024336283185840801e-01 1.218441273326015400e-01 4.329371816638370035e-02 1.075471698113207586e-01 4.722222222222222099e-02 3.683241252302026092e-02 4.741379310344827347e-02 3.716216216216216423e-02 3.913043478260869873e-02 0.000000000000000000e+00 nan nan nan nan nan nan nan 9.090909090909091161e-02 nan nan 3.243243243243243423e-02 7.206068268015171363e-02 nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 3.448275862068965469e-02 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 8.333333333333332871e-02 0.000000000000000000e+00 1.351351351351351426e-01 6.666666666666666574e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.538461538461538547e-01 0.000000000000000000e+00 0.000000000000000000e+00 8.620689655172414367e-02 0.000000000000000000e+00 6.060606060606060774e-02 1.333333333333333315e-01 1.234567901234567833e-02 5.882352941176470507e-02 0.000000000000000000e+00 nan 7.142857142857142461e-02 6.521739130434782428e-02 4.477611940298507204e-02 3.370786516853932491e-02 8.108108108108108558e-02 1.923076923076923184e-02 2.127659574468085055e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.129890453834116015e-01 +1.136363636363636326e-01 1.176470588235294101e-01 8.695652173913043237e-02 nan nan 1.379310344827586188e-01 6.410256410256409687e-02 1.153846153846153910e-01 1.250000000000000000e-01 3.225806451612903136e-02 0.000000000000000000e+00 3.225806451612903136e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.290322580645161255e-01 8.888888888888889228e-02 2.999999999999999889e-01 0.000000000000000000e+00 5.555555555555555247e-02 1.000000000000000056e-01 0.000000000000000000e+00 8.695652173913043237e-02 5.027932960893854997e-02 5.732484076433121134e-02 5.194805194805195148e-02 8.755760368663594029e-02 9.621993127147766833e-02 1.521739130434782705e-01 1.325301204819277212e-01 3.841961852861035531e-01 1.948998178506375356e-01 2.376543209876543217e-01 4.459724950884086381e-01 1.630094043887147237e-01 7.932011331444759061e-02 2.033195020746887960e-01 2.444061962134251309e-01 4.705882352941176405e-01 6.201298701298700866e-01 8.075117370892018753e-01 2.335025380710659959e-01 3.371824480369515209e-01 6.010928961748633892e-01 2.072936660268714093e-01 1.479289940828402428e-01 4.301075268817204644e-02 7.258064516129032751e-02 7.913669064748200810e-02 3.690685413005272419e-01 2.881165919282511201e-01 7.627118644067797104e-02 2.514124293785310882e-01 8.123569794050343462e-02 6.886227544910179799e-02 1.100000000000000006e-01 5.769230769230769551e-02 7.246376811594203160e-02 0.000000000000000000e+00 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 1.067961165048543631e-01 1.047904191616766401e-01 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 3.333333333333333148e-01 nan nan nan nan 0.000000000000000000e+00 7.500000000000000000e-01 nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 1.724137931034482735e-02 1.153846153846153910e-01 0.000000000000000000e+00 2.325581395348837177e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.369863013698630061e-02 0.000000000000000000e+00 3.488372093023255766e-02 0.000000000000000000e+00 6.666666666666666574e-02 4.000000000000000083e-02 2.020202020202020374e-02 1.818181818181818094e-02 1.666666666666666644e-02 1.571428571428571397e-01 3.571428571428571230e-02 4.000000000000000083e-02 5.882352941176470507e-02 8.870967741935484319e-02 3.278688524590164105e-02 1.666666666666666574e-01 0.000000000000000000e+00 1.093750000000000000e-01 4.347826086956521618e-02 7.361963190184049599e-02 1.308016877637130926e-01 0.000000000000000000e+00 5.847953216374268681e-03 7.000000000000000666e-02 4.285714285714285754e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 3.149606299212598381e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.505434782608695676e-01 +0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 1.562500000000000000e-02 1.960784313725490169e-02 3.703703703703703498e-02 4.761904761904761640e-02 0.000000000000000000e+00 3.225806451612903136e-02 0.000000000000000000e+00 0.000000000000000000e+00 3.225806451612903136e-02 4.065040650406503975e-02 4.000000000000000083e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.142857142857142738e-01 2.083333333333333218e-02 1.677018633540372783e-01 3.045685279187817368e-02 5.128205128205128027e-02 4.444444444444444614e-02 4.118993135011441570e-02 2.547770700636942803e-02 1.446945337620578753e-01 4.499314128943758817e-01 7.814761215629521807e-02 6.321839080459770721e-02 2.378902045209903005e-01 3.004444444444444584e-01 1.581027667984189755e-01 4.444444444444444198e-01 6.330777656078860893e-01 5.284552845528455167e-01 5.217391304347825942e-01 5.121951219512195230e-01 7.592891760904685317e-01 5.560975609756098059e-01 5.370370370370370905e-01 1.926605504587156070e-01 2.721649484536082242e-01 9.569377990430621636e-03 2.597402597402597574e-02 5.325443786982248656e-02 1.629464285714285754e-01 7.788461538461538547e-02 4.023972602739726151e-02 7.528957528957529177e-02 2.536231884057971175e-02 4.967602591792656674e-02 4.700854700854700807e-02 5.347593582887700397e-02 2.127659574468085055e-02 nan nan nan nan nan nan nan nan 5.882352941176470507e-02 nan nan 3.174603174603174427e-02 8.516129032258064335e-02 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 5.000000000000000278e-02 0.000000000000000000e+00 0.000000000000000000e+00 4.545454545454545303e-01 4.000000000000000083e-02 0.000000000000000000e+00 3.142857142857142794e-01 0.000000000000000000e+00 nan 2.258064516129032195e-01 4.504504504504504292e-02 3.404255319148936088e-01 1.428571428571428492e-01 5.882352941176470507e-02 1.194029850746268634e-01 1.168384879725085923e-01 3.174603174603174427e-02 4.166666666666666435e-02 5.263157894736841813e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.631578947368420907e-02 2.575107296137339047e-02 4.347826086956521618e-02 1.250000000000000069e-02 5.747126436781609116e-02 5.847953216374268681e-03 8.264462809917355601e-03 1.834862385321101019e-02 4.255319148936170109e-02 0.000000000000000000e+00 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 2.564102564102564014e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.821585903083700164e-01 +4.729729729729729992e-02 4.878048780487805047e-02 1.122448979591836732e-01 0.000000000000000000e+00 5.000000000000000278e-02 5.263157894736841813e-02 6.635071090047393871e-02 2.621722846441947724e-02 1.273885350318471332e-01 3.703703703703703498e-02 6.521739130434782428e-02 2.409638554216867595e-02 0.000000000000000000e+00 0.000000000000000000e+00 5.645161290322580488e-02 5.479452054794520244e-02 9.039548022598870025e-02 6.666666666666666574e-02 1.682242990654205517e-01 2.105263157894736795e-02 5.714285714285714107e-02 4.878048780487805047e-02 2.450248756218905422e-01 5.850091407678244954e-02 4.727272727272727182e-02 5.049396267837541474e-02 6.840796019900496905e-02 9.649122807017543324e-02 1.280788177339901579e-01 3.849259757738896504e-01 1.024868123587038410e-01 1.320754716981132060e-01 3.517786561264822365e-01 4.907692307692307909e-01 1.565585331452750417e-01 5.122377622377621842e-01 4.807692307692307820e-01 3.646833013435700765e-01 3.950953678474114494e-01 5.127737226277372384e-01 5.361445783132530174e-01 8.127962085308056972e-01 5.779527559055117614e-01 3.381057268722467146e-01 5.259391771019678030e-01 7.462686567164178442e-02 7.621951219512194953e-02 7.952622673434855960e-02 2.356185973207249873e-01 1.844660194174757295e-01 7.905138339920948776e-02 1.382352941176470673e-01 7.641025641025640802e-02 1.126620139581256258e-01 5.952380952380952051e-02 6.027060270602706271e-02 6.864988558352402848e-02 2.666666666666666630e-01 nan nan nan nan nan nan 0.000000000000000000e+00 2.857142857142856984e-01 nan nan 1.156716417910447769e-01 1.958806221101302980e-01 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 7.843137254901960675e-02 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 9.696969696969696961e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.469135802469135665e-02 0.000000000000000000e+00 0.000000000000000000e+00 9.090909090909091161e-02 2.054794520547945091e-01 4.109589041095890183e-02 1.034482758620689641e-01 2.864864864864865024e-01 6.617647058823529493e-02 1.639344262295082053e-02 3.401360544217687382e-02 5.357142857142856845e-02 2.222222222222222307e-02 6.306306306306305731e-02 8.021390374331550943e-02 4.081632653061224164e-02 3.324538258575198135e-01 2.628205128205128305e-01 1.194539249146757687e-01 2.666666666666666630e-01 1.176470588235294101e-01 5.555555555555555247e-02 4.721030042918455266e-02 1.728723404255319285e-01 1.166253101736972747e-01 8.854166666666667129e-02 1.199999999999999956e-01 4.950495049504950729e-02 3.684210526315789130e-02 6.993006993006993001e-03 2.238805970149253602e-02 0.000000000000000000e+00 5.000000000000000000e-01 nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan 3.846153846153846367e-02 5.436573311367380590e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.039945528824330223e-01 +1.181102362204724393e-01 1.090909090909090856e-01 1.208791208791208799e-01 0.000000000000000000e+00 2.978723404255319007e-01 1.578947368421052544e-01 9.774436090225563367e-02 1.006711409395973089e-01 1.058495821727019476e-01 1.118421052631578955e-01 2.197802197802197974e-02 6.896551724137930939e-03 1.851851851851851749e-02 1.923076923076923184e-02 5.673758865248226813e-02 1.036717062634989195e-01 6.060606060606060774e-02 8.196721311475409222e-02 2.362204724409448786e-02 5.263157894736841813e-02 8.571428571428571508e-02 4.428044280442804126e-02 1.741214057507987356e-01 3.504672897196261377e-02 1.731601731601731600e-02 7.954545454545454419e-02 7.401812688821751696e-02 8.191126279863480963e-02 1.678571428571428437e-01 3.274215552523874750e-01 1.162079510703363933e-01 1.510128913443830601e-01 3.949748743718592969e-01 1.980830670926517489e-01 1.058020477815699717e-01 2.273641851106639744e-01 3.558352402745995624e-01 4.539363484087102218e-01 5.646437994722954823e-01 7.062780269058296367e-01 4.328358208955223607e-01 5.621890547263681537e-01 7.839195979899497013e-01 4.434782608695652106e-01 4.208566108007448792e-01 1.859838274932614499e-01 1.631944444444444475e-01 1.855670103092783574e-01 5.331734612310151666e-01 3.405535499398315014e-01 1.141038197845249819e-01 2.364864864864864857e-01 8.120386144236228787e-02 1.133720930232558072e-01 5.524861878453038444e-02 7.766990291262135249e-02 9.130434782608695676e-02 1.538461538461538547e-01 nan nan 2.500000000000000000e-01 nan nan nan 1.052631578947368363e-01 0.000000000000000000e+00 nan nan 1.529411764705882470e-01 2.544348707551951083e-01 nan nan nan nan nan nan 0.000000000000000000e+00 4.347826086956521618e-02 nan nan nan nan 6.666666666666666574e-02 2.500000000000000000e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 1.734693877551020391e-01 1.052631578947368363e-01 4.545454545454545581e-02 1.235955056179775247e-01 4.556962025316455556e-01 4.225352112676056260e-02 2.777777777777777624e-02 8.333333333333332871e-02 1.901408450704225317e-01 1.754385964912280604e-01 3.814432989690721421e-01 6.194690265486725578e-02 3.448275862068965469e-02 9.836065573770491621e-02 1.988950276243093840e-01 8.988764044943819975e-02 2.920353982300885054e-01 3.194444444444444198e-01 2.745098039215686514e-01 2.874493927125505999e-01 3.913043478260869734e-01 3.088235294117647189e-01 3.119266055045871733e-01 4.320987654320987414e-01 0.000000000000000000e+00 2.666666666666666630e-01 2.246376811594202882e-01 1.958333333333333315e-01 2.237903225806451568e-01 1.510791366906474864e-01 1.650165016501650012e-02 1.413612565445026281e-01 7.299270072992700489e-03 2.000000000000000042e-02 1.749999999999999889e-01 5.000000000000000000e-01 nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan 3.518518518518518601e-01 7.939508506616256567e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.034676663542642872e-01 +1.955719557195571834e-01 1.658031088082901616e-01 1.064572425828970298e-01 3.703703703703703498e-02 1.155378486055776838e-01 1.148325358851674666e-01 1.136363636363636326e-01 7.950310559006211475e-02 7.297514033680833900e-02 5.352112676056337837e-02 5.181347150259067030e-02 1.834862385321101019e-02 5.741626794258373329e-02 2.586206896551724102e-02 2.184466019417475799e-02 6.746765249537892140e-02 3.658536585365853439e-02 0.000000000000000000e+00 2.459016393442622905e-02 1.024590163934426257e-01 1.391941391941391992e-01 1.769436997319034921e-01 3.111353711790392773e-01 5.694305694305694387e-02 9.546539379474940773e-03 7.317073170731706877e-02 7.421576128538638628e-02 5.882352941176470507e-02 5.835543766578249469e-02 1.394230769230769273e-01 1.279650436953807813e-01 1.015911872705018426e-01 3.046511627906976494e-01 1.511142061281336990e-01 9.192546583850931541e-02 1.100746268656716403e-01 1.519198664440734592e-01 1.460674157303370746e-01 1.406250000000000000e-01 3.390501319261213786e-01 2.214111922141119293e-01 4.242424242424242542e-01 4.511986301369863006e-01 6.002331002331002807e-01 6.048136645962732816e-01 5.528281750266809125e-01 3.972222222222221988e-01 4.568020631850419067e-01 4.391382405745062889e-01 3.664935774801858503e-01 3.405868776788658070e-01 2.398648648648648574e-01 1.790646959050157527e-01 3.033630748112560171e-01 1.397694524495677326e-01 1.835125448028673834e-01 2.421695951107715739e-01 7.777777777777777901e-01 0.000000000000000000e+00 nan 8.750000000000000000e-01 5.000000000000000000e-01 0.000000000000000000e+00 nan 3.703703703703703498e-01 3.076923076923077094e-01 nan 5.555555555555555802e-01 5.837651122625215905e-01 6.086956521739130821e-01 0.000000000000000000e+00 1.796407185628742451e-02 1.694915254237288130e-02 nan 1.129032258064516098e-01 2.654867256637168105e-02 6.410256410256410034e-03 8.620689655172413673e-03 2.362204724409448786e-02 4.651162790697674354e-02 1.470588235294117627e-02 4.000000000000000083e-02 nan 0.000000000000000000e+00 5.426356589147286746e-02 4.310344827586207184e-02 nan 0.000000000000000000e+00 nan 5.319148936170212810e-02 0.000000000000000000e+00 1.499999999999999944e-01 1.157024793388429784e-01 1.754385964912280604e-02 0.000000000000000000e+00 1.142857142857142821e-01 2.272727272727272790e-02 7.407407407407406996e-02 1.428571428571428492e-01 2.962962962962962798e-01 7.100591715976331542e-02 1.199999999999999956e-01 1.176470588235294101e-01 1.325301204819277212e-01 7.407407407407406996e-02 1.363636363636363535e-01 2.325581395348837177e-02 0.000000000000000000e+00 5.128205128205128027e-02 6.802721088435373896e-03 1.212121212121212155e-01 1.370370370370370405e-01 1.115879828326180323e-01 1.460905349794238695e-01 2.192982456140350755e-01 2.008196721311475419e-01 5.714285714285714107e-02 1.298701298701298579e-01 4.929577464788732072e-02 5.681818181818181629e-02 1.007025761124121788e-01 3.571428571428571230e-02 2.777777777777777624e-02 8.263305322128851327e-02 3.083700440528634387e-02 6.574394463667819488e-02 6.250000000000000000e-02 1.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 9.326424870466321071e-02 8.870967741935484319e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.262580491295015706e-01 +1.180555555555555525e-01 5.750000000000000250e-02 7.213114754098361170e-02 0.000000000000000000e+00 2.195121951219512202e-01 8.591065292096219941e-02 6.438356164383561564e-02 1.224489795918367319e-01 1.258941344778254645e-01 8.624708624708624094e-02 4.455445544554455239e-02 1.851851851851851749e-02 4.545454545454545581e-02 0.000000000000000000e+00 4.633204633204632966e-02 9.818731117824773535e-02 1.769911504424778736e-02 0.000000000000000000e+00 2.539682539682539542e-01 6.734006734006733885e-02 1.851851851851851749e-01 2.500000000000000000e-01 5.730519480519480346e-01 1.061093247588424382e-01 1.129943502824858753e-02 8.913043478260869457e-02 1.436388508891928983e-01 9.210526315789473173e-02 1.402877697841726501e-01 2.279792746113989688e-01 9.510869565217391908e-02 1.170212765957446832e-01 2.419006479481641547e-01 2.780586450960566003e-01 2.386831275720164569e-01 1.508515815085158251e-01 1.043115438108483950e-01 1.387163561076604490e-01 6.598240469208210834e-02 1.578947368421052544e-01 2.263083451202262952e-01 5.815347721822542448e-01 3.957783641160949606e-01 5.423097392229909719e-01 7.128491620111732097e-01 4.087363494539781317e-01 3.445945945945945721e-01 3.233695652173912971e-01 2.966002344665885082e-01 3.181818181818181768e-01 2.611899563318777484e-01 3.098782138024357424e-01 1.704347826086956563e-01 2.128487994808565820e-01 1.503759398496240518e-01 1.770222743259085574e-01 1.377551020408163129e-01 8.260869565217391353e-01 nan nan nan 2.500000000000000000e-01 nan 0.000000000000000000e+00 2.307692307692307820e-01 2.903225806451613100e-01 nan 1.875000000000000000e-01 4.822190611664295967e-01 6.869192280200142608e-01 6.451612903225806273e-02 1.333333333333333419e-02 5.263157894736841813e-02 nan 0.000000000000000000e+00 5.000000000000000278e-02 1.923076923076923184e-02 5.825242718446602130e-02 2.068965517241379282e-01 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.458333333333333426e-01 3.658536585365853439e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 8.928571428571428770e-02 4.054054054054054279e-02 5.882352941176470507e-02 8.547008547008547175e-02 1.345291479820627870e-02 6.666666666666666574e-02 0.000000000000000000e+00 3.030303030303030387e-02 2.843601895734597026e-02 2.083333333333333426e-01 3.278688524590164105e-02 9.523809523809523281e-02 0.000000000000000000e+00 2.173913043478260809e-02 4.069767441860465407e-02 4.545454545454545581e-02 3.529411764705882304e-02 5.970149253731343170e-02 1.000000000000000056e-01 7.692307692307692735e-02 4.147465437788018516e-02 1.160409556313993229e-01 2.800000000000000266e-01 1.793478260869565133e-01 4.878048780487805047e-02 1.352833638025594254e-01 3.828828828828828579e-02 3.428571428571428742e-02 8.406304728546409866e-02 4.716981132075472039e-02 2.500000000000000139e-02 6.369426751592356661e-02 3.947368421052631360e-02 5.394190871369294871e-02 6.467661691542288260e-02 2.000000000000000111e-01 nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan 9.777777777777778290e-02 8.845829823083403709e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.287133891213389059e-01 +2.628205128205128305e-01 9.914529914529914001e-02 1.281337047353760528e-01 0.000000000000000000e+00 1.071428571428571369e-01 1.415384615384615297e-01 9.950859950859951286e-02 1.403508771929824483e-01 7.108081791626096047e-02 2.429906542056074759e-02 2.952029520295202866e-02 8.583690987124463490e-03 4.142011834319526964e-02 1.000000000000000021e-02 3.780068728522336524e-02 1.420289855072463803e-01 2.312138728323699308e-02 2.857142857142857054e-02 4.054054054054054279e-02 7.758620689655172653e-02 7.425742574257425399e-02 2.480314960629921295e-01 4.025974025974026205e-01 1.161695447409733101e-01 0.000000000000000000e+00 8.210180623973727110e-02 1.200750469043151969e-01 8.500000000000000611e-02 9.459459459459459985e-02 3.289473684210526133e-02 9.677419354838709409e-02 4.946996466431095169e-02 7.594936708860759722e-02 1.144859813084112138e-01 9.446254071661237817e-02 1.507537688442210991e-02 3.323262839879154162e-02 5.741626794258373329e-02 4.221635883905013042e-02 5.947955390334572212e-02 3.973509933774834607e-02 2.063492063492063378e-01 1.918604651162790775e-01 6.203830369357045127e-01 5.585185185185185253e-01 7.643504531722054018e-01 5.584415584415584055e-01 4.540094339622641750e-01 1.960975609756097637e-01 2.277966101694915146e-01 3.129796463129796424e-01 2.202020202020202044e-01 1.645962732919254712e-01 3.442742523705324409e-01 2.523961661341853069e-01 3.604193971166448351e-01 3.828125000000000000e-01 8.499999999999999778e-01 nan nan 1.000000000000000000e+00 5.000000000000000000e-01 nan 2.000000000000000111e-01 3.529411764705882582e-01 4.210526315789473450e-01 nan 5.999999999999999778e-01 7.241379310344827624e-01 7.889525794684731919e-01 1.574074074074074125e-01 5.797101449275362389e-02 7.272727272727272374e-02 nan 8.695652173913043237e-02 6.837606837606838295e-02 5.442176870748299117e-02 8.695652173913043237e-02 9.595959595959595301e-02 2.150537634408602322e-02 2.000000000000000111e-01 0.000000000000000000e+00 5.263157894736841813e-02 0.000000000000000000e+00 2.040816326530612082e-02 1.785714285714285615e-02 0.000000000000000000e+00 nan 1.000000000000000000e+00 6.153846153846154188e-02 0.000000000000000000e+00 5.714285714285713969e-01 3.088235294117647189e-01 1.276595744680850963e-01 5.999999999999999778e-01 2.195121951219512202e-01 5.555555555555555802e-01 4.000000000000000222e-01 nan nan 2.892561983471074183e-01 5.714285714285713969e-01 6.111111111111111605e-01 2.068965517241379282e-01 0.000000000000000000e+00 1.000000000000000000e+00 6.744186046511627675e-01 1.000000000000000000e+00 2.823529411764705843e-01 3.947368421052631637e-01 4.482758620689655249e-01 3.902439024390244038e-01 2.903225806451613100e-01 1.220159151193633967e-01 2.654867256637168382e-01 2.183908045977011603e-01 4.519774011299435013e-02 1.939546599496221602e-01 2.123287671232876594e-01 1.720930232558139650e-01 1.300211416490486271e-01 1.239669421487603340e-01 3.030303030303030387e-02 1.167108753315649894e-01 9.433962264150944077e-02 1.000000000000000056e-01 9.500000000000000111e-02 nan nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 1.714285714285714302e-01 1.283524904214559392e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.725328947368420907e-01 +2.291666666666666574e-01 8.593750000000000000e-02 1.466165413533834505e-01 1.111111111111111049e-01 2.500000000000000000e-01 1.960784313725490169e-01 1.312910284463894850e-01 1.054054054054054113e-01 9.677419354838709409e-02 1.147540983606557402e-01 4.347826086956521618e-02 3.658536585365853439e-02 0.000000000000000000e+00 1.818181818181818094e-02 4.635761589403973593e-02 1.405405405405405483e-01 1.250000000000000069e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.749999999999999889e-01 7.216494845360824084e-02 8.602150537634409289e-02 2.087378640776698935e-01 3.986710963455149248e-02 2.127659574468085055e-02 2.492211838006230459e-02 5.773672055427251509e-02 6.250000000000000000e-02 3.571428571428571230e-02 1.351351351351351426e-02 5.050505050505050414e-02 2.238805970149253602e-02 8.668730650154798933e-02 7.692307692307692735e-02 4.419889502762430755e-02 1.639344262295082053e-02 2.713178294573643373e-02 1.408450704225352144e-02 2.252252252252252146e-02 3.921568627450980338e-02 1.734104046242774394e-02 1.312741312741312616e-01 1.353846153846153810e-01 3.920529801324503238e-01 4.327868852459016424e-01 5.454545454545454142e-01 8.000000000000000444e-01 4.831130690161526964e-01 1.328571428571428681e-01 1.308411214953270896e-01 3.868461936820300484e-01 1.866666666666666752e-01 1.178797468354430417e-01 4.954864593781344029e-01 1.052631578947368363e-01 2.338902147971360368e-01 4.407894736842105088e-01 3.333333333333333148e-01 nan nan nan nan nan nan nan 2.222222222222222099e-01 nan nan 6.767441860465116532e-01 6.288461538461538325e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 2.739726027397260122e-02 0.000000000000000000e+00 0.000000000000000000e+00 6.557377049180328210e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 6.666666666666666574e-02 nan 0.000000000000000000e+00 2.380952380952380820e-02 nan nan 0.000000000000000000e+00 8.403361344537814762e-03 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 2.500000000000000000e-01 nan 0.000000000000000000e+00 8.333333333333332871e-02 0.000000000000000000e+00 0.000000000000000000e+00 3.703703703703703498e-02 0.000000000000000000e+00 0.000000000000000000e+00 3.636363636363636187e-02 5.803571428571428770e-02 2.272727272727272790e-02 4.310344827586206629e-01 6.122448979591836593e-02 1.363636363636363535e-01 1.298701298701298787e-02 0.000000000000000000e+00 1.232492997198879614e-01 6.944444444444444753e-02 2.325581395348837177e-02 8.849557522123893682e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.754385964912280604e-02 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan 7.216494845360824084e-02 4.724409448818897572e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.456310679611650449e-01 +2.463592233009708754e-01 7.133243606998654340e-02 1.038461538461538519e-01 0.000000000000000000e+00 1.518324607329842868e-01 1.918918918918919025e-01 9.659714599341383268e-02 9.484346224677715764e-02 5.748502994011975981e-02 5.074257425742574601e-02 4.355400696864111798e-02 1.089324618736383504e-02 5.327868852459016064e-02 6.578947368421052266e-03 5.758157389635316925e-02 9.319526627218935322e-02 6.129032258064515820e-02 5.780346820809248269e-03 6.334841628959275717e-02 1.232142857142857206e-01 1.003460207612456717e-01 9.855769230769230449e-02 2.002781641168289162e-01 8.459869848156181815e-02 5.102040816326530205e-03 1.238170347003154509e-01 1.054817275747508276e-01 6.004618937644341792e-02 4.395604395604395948e-02 3.171247357293868752e-02 1.159929701230228427e-01 5.017921146953405187e-02 1.150442477876106179e-01 7.668393782383420287e-02 6.280193236714975979e-02 4.032258064516128920e-02 2.377807133421400154e-02 3.533568904593639703e-02 3.548387096774193589e-02 5.543237250554323980e-02 5.496828752642705929e-02 1.469489414694894192e-01 1.089681774349083865e-01 4.346426271732131141e-01 3.947841726618704916e-01 5.369198312236287407e-01 5.262368815592204374e-01 5.567928730512249347e-01 2.417448022829188636e-01 2.887208155212101501e-01 4.675733952562614038e-01 2.569721115537848544e-01 1.969131192432163335e-01 3.650050184008029608e-01 8.823529411764706454e-02 1.956181533646322301e-01 3.020134228187919545e-01 5.200000000000000178e-01 nan nan 1.000000000000000000e+00 nan nan nan 1.600000000000000033e-01 4.328358208955223607e-01 nan 4.375000000000000000e-01 4.757525083612040295e-01 5.477247502774694743e-01 2.564102564102564014e-02 1.986754966887417304e-02 2.000000000000000042e-02 nan 8.421052631578947179e-02 1.587301587301587213e-02 7.812500000000000000e-03 9.708737864077669061e-03 2.654867256637168105e-02 5.405405405405405705e-02 1.960784313725490169e-02 2.564102564102564014e-02 nan nan 5.319148936170212810e-02 0.000000000000000000e+00 1.000000000000000000e+00 nan nan 1.538461538461538547e-02 0.000000000000000000e+00 1.250000000000000000e-01 5.185185185185185036e-02 3.448275862068965469e-02 0.000000000000000000e+00 5.050505050505050414e-02 4.145077720207254041e-02 2.702702702702702853e-02 0.000000000000000000e+00 2.083333333333333426e-01 1.092896174863387942e-01 0.000000000000000000e+00 2.790697674418604612e-01 1.219512195121951192e-01 1.428571428571428492e-01 2.000000000000000111e-01 8.333333333333332871e-02 0.000000000000000000e+00 2.439024390243902524e-02 5.882352941176470507e-02 1.111111111111111049e-01 1.027397260273972546e-01 3.726708074534161586e-02 6.389452332657201417e-02 2.604166666666666782e-02 1.028037383177570069e-01 5.464480874316939712e-02 8.808933002481389440e-02 4.942965779467680537e-02 3.898305084745763011e-02 7.391537225495446728e-02 2.962962962962963076e-02 2.958579881656804578e-02 5.216284987277353818e-02 3.731343283582089221e-02 6.521739130434782428e-02 2.941176470588235253e-02 5.999999999999999778e-01 nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 7.616707616707617257e-02 5.560538116591928065e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.677074298930326446e-01 +1.445497630331753491e-01 1.447721179624665011e-01 6.375838926174497157e-02 7.692307692307692735e-02 1.666666666666666574e-01 1.258992805755395628e-01 8.417997097242380100e-02 1.057827926657263773e-01 1.069587628865979329e-01 8.278145695364239054e-02 4.975124378109452641e-03 7.246376811594203160e-02 8.403361344537815802e-02 5.154639175257731687e-02 6.157635467980295679e-02 1.165146909827760868e-01 6.128133704735375803e-02 9.259259259259258745e-03 1.161616161616161602e-01 6.691449814126393392e-02 1.641025641025641024e-01 5.787037037037037063e-02 1.683417085427135751e-01 1.022944550669215996e-01 4.943820224719101125e-02 2.217036172695449336e-01 1.932299012693935170e-01 1.647634584013050463e-01 1.447562776957163899e-01 1.696178937558247835e-01 2.280439121756487053e-01 2.421875000000000000e-01 3.522180652057723127e-01 1.078278900984966371e-01 8.051235132662397376e-02 6.048387096774193727e-02 9.786950732356856919e-02 1.703296703296703352e-01 2.295514511873350816e-01 4.126149802890933249e-01 8.591408591408591922e-02 2.187720536344389677e-01 4.021406727828746308e-01 4.163851351351351426e-01 3.572607260726072820e-01 1.794520547945205602e-01 1.686046511627906919e-01 2.536231884057971175e-01 6.250000000000000000e-01 5.273870098772822645e-01 2.420118343195266364e-01 3.592156862745097823e-01 1.703545721141029035e-01 1.456055968517708799e-01 7.086614173228346358e-02 1.664325842696629254e-01 1.266968325791855143e-01 5.789473684210526550e-01 5.000000000000000000e-01 nan 2.500000000000000000e-01 nan 0.000000000000000000e+00 nan 1.851851851851851749e-01 2.698412698412698263e-01 nan 0.000000000000000000e+00 1.842966194111232414e-01 3.158156911581568860e-01 0.000000000000000000e+00 0.000000000000000000e+00 4.166666666666666435e-02 nan 0.000000000000000000e+00 3.773584905660377214e-02 2.816901408450704289e-02 1.886792452830188607e-02 0.000000000000000000e+00 5.429864253393665297e-02 1.098901098901098987e-02 0.000000000000000000e+00 nan nan 3.389830508474576259e-02 2.542372881355932368e-02 6.451612903225806273e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 2.857142857142857054e-02 5.555555555555555247e-02 3.389830508474576259e-02 2.272727272727272790e-02 2.479338842975206680e-02 3.658536585365853439e-02 4.000000000000000083e-02 0.000000000000000000e+00 1.190476190476190410e-02 2.487562189054726494e-02 1.428571428571428527e-02 4.827586206896551657e-02 4.216867469879517771e-02 2.898550724637681195e-02 0.000000000000000000e+00 2.020202020202020374e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.564102564102564014e-02 0.000000000000000000e+00 5.633802816901408578e-02 3.964757709251101603e-02 6.869220607661823130e-02 4.721030042918455266e-02 1.369863013698630061e-01 2.475247524752475364e-02 1.206611570247933946e-01 7.398273736128237188e-02 4.973357015985790247e-02 6.504702194357367406e-02 4.861111111111111188e-02 1.411290322580645122e-02 2.807775377969762287e-02 1.010101010101010187e-02 3.061224489795918297e-02 3.968253968253968034e-02 nan nan nan nan nan nan nan 8.333333333333332871e-02 0.000000000000000000e+00 nan nan 2.790697674418604612e-02 4.052780395852968731e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.954601226993864849e-01 +1.298482293423271483e-01 1.023738872403560790e-01 9.632224168126093944e-02 3.225806451612903136e-02 4.017857142857143155e-02 5.109489051094890516e-02 1.052208835341365417e-01 1.119648737650933007e-01 7.710464201416207530e-02 5.319148936170212810e-02 3.571428571428571230e-02 2.444987775061124857e-02 6.666666666666666574e-02 2.564102564102564014e-02 1.043478260869565161e-01 1.038435603506405874e-01 6.095238095238095233e-02 1.282051282051282007e-02 1.138461538461538469e-01 4.831932773109243878e-02 1.021021021021021047e-01 9.018987341772151389e-02 1.064094586185438673e-01 1.106965174129353191e-01 2.697095435684647435e-02 2.378444084278768245e-01 1.971252566735113010e-01 1.428571428571428492e-01 8.292682926829268719e-02 1.375000000000000111e-01 2.880061115355233015e-01 2.671546203110704565e-01 3.155555555555555336e-01 9.700491729995529278e-02 9.876543209876542662e-02 5.092592592592592310e-02 7.509663169519602277e-02 1.056603773584905703e-01 1.420863309352518034e-01 3.260153677277716766e-01 9.442870632672333009e-02 1.658084449021627327e-01 2.389730085582620067e-01 2.888425443169968521e-01 2.570397111913357291e-01 1.316326530612244861e-01 1.075268817204301092e-01 2.147533828022697433e-01 4.526508226691042247e-01 5.824529168580615535e-01 3.001661129568106157e-01 4.782352941176470362e-01 2.777472023481930008e-01 2.043795620437956206e-01 1.807116104868913831e-01 1.455723542116630631e-01 1.214723926380368163e-01 5.357142857142856984e-01 nan nan nan nan nan nan 3.030303030303030387e-02 3.584905660377358250e-01 nan 0.000000000000000000e+00 1.336254107338444574e-01 2.042292710072342865e-01 0.000000000000000000e+00 1.398601398601398600e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 1.515151515151515194e-02 8.333333333333333218e-03 8.438818565400843172e-03 2.941176470588235253e-02 2.127659574468085055e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 6.666666666666666574e-02 0.000000000000000000e+00 4.237288135593220324e-03 0.000000000000000000e+00 0.000000000000000000e+00 6.250000000000000000e-02 2.222222222222222307e-02 nan 6.034482758620689918e-02 3.678929765886287950e-02 6.382978723404254817e-02 1.265822784810126563e-02 7.968127490039840499e-02 4.530744336569579589e-02 5.154639175257731687e-02 8.823529411764706454e-02 6.849315068493150305e-02 4.958677685950413361e-02 2.500000000000000139e-02 6.269592476489027622e-02 5.303030303030303177e-02 0.000000000000000000e+00 4.519774011299435013e-02 2.439024390243902524e-02 0.000000000000000000e+00 2.631578947368420907e-02 1.993355481727574624e-02 5.042016806722689204e-02 5.382436260623229413e-02 5.460750853242320874e-02 6.007509386733416584e-02 4.918032786885245811e-02 8.854166666666667129e-02 7.843137254901960675e-02 7.235621521335806883e-02 7.087827426810477949e-02 6.595744680851063635e-02 6.789413118527042046e-02 4.528301886792452519e-02 1.338432122370936984e-02 4.376657824933687102e-02 3.508771929824561209e-02 4.683840749414520249e-02 3.131991051454138808e-02 1.250000000000000000e-01 nan nan nan nan nan nan 0.000000000000000000e+00 5.000000000000000000e-01 nan nan 5.020920502092050125e-02 3.880764904386951875e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.651399491094147409e-01 +1.527839643652561252e-01 6.402604449267498832e-02 1.275033377837116177e-01 3.076923076923077094e-02 1.522070015220700068e-01 1.907356948228882965e-01 8.453922315308454172e-02 6.700842182350787157e-02 5.319148936170212810e-02 5.211726384364821080e-02 7.375886524822694579e-02 3.622693096377306576e-02 4.173622704507512493e-02 2.869757174392936067e-02 3.396851698425849136e-02 9.247311827956988806e-02 4.655326768128916631e-02 2.164502164502164414e-02 5.183585313174945974e-02 1.374367622259696498e-01 5.046480743691898752e-02 8.250497017892644003e-02 1.350681536555142503e-01 9.050861033239887554e-02 1.447661469933184814e-02 9.610389610389610815e-02 7.484076433121018834e-02 7.069408740359897636e-02 3.883495145631067624e-02 3.746877601998335056e-02 1.781447645818692860e-01 1.101214574898785464e-01 1.238390092879256971e-01 4.132606721162579433e-02 7.668944570994684629e-02 1.876675603217158039e-02 2.537764350453172377e-02 1.857923497267759474e-02 2.707006369426751685e-02 6.218144750254842035e-02 2.767857142857142738e-02 7.920193470374849165e-02 7.826086956521739746e-02 2.779286619590802254e-01 2.920634920634920806e-01 3.259182617692705786e-01 3.478260869565217295e-01 3.769121309142653975e-01 1.879649890590809613e-01 2.790185592953758897e-01 5.368098159509202549e-01 2.495210727969348619e-01 2.656689546528637202e-01 3.612452139170967413e-01 1.431608788093550744e-01 1.141270820481184445e-01 1.852738700987728304e-01 5.882352941176470784e-01 nan nan nan nan nan 0.000000000000000000e+00 6.382978723404254817e-02 4.418604651162790775e-01 nan 4.090909090909091161e-01 3.197143990479968112e-01 4.166561034351629056e-01 1.470588235294117627e-02 3.978300180831826488e-02 4.310344827586206837e-03 nan 6.827309236947791404e-02 4.790419161676646997e-02 3.345724907063196696e-02 4.007633587786259277e-02 6.521739130434782428e-02 4.308390022675737119e-02 4.255319148936170109e-02 9.646302250803859279e-03 0.000000000000000000e+00 0.000000000000000000e+00 1.315789473684210453e-02 2.046035805626598633e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.000000000000000111e-01 2.678571428571428423e-02 4.545454545454545581e-02 1.558441558441558406e-01 6.271777003484320379e-02 3.114186851211072499e-02 5.102040816326530726e-02 7.467532467532467244e-02 3.907637655417407069e-02 2.051282051282051211e-01 9.677419354838709409e-02 1.351351351351351426e-01 7.182320441988949977e-02 1.724137931034482873e-01 7.943925233644859307e-02 6.306306306306305731e-02 1.290322580645161255e-01 4.545454545454545581e-02 2.611940298507462593e-02 0.000000000000000000e+00 7.006369426751592189e-02 5.597014925373134525e-02 6.400000000000000133e-02 5.410122164048865312e-02 4.499999999999999833e-02 4.924068108605614280e-02 6.349206349206348854e-02 1.127659574468085069e-01 4.556354916067146404e-02 7.793575566087414253e-02 2.947368421052631512e-02 3.953488372093023201e-02 7.929704243463352176e-02 2.773722627737226429e-02 2.361042793900639328e-02 4.769152714358193546e-02 5.450236966824644619e-02 5.898491083676268842e-02 6.866952789699570792e-02 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 5.029585798816568060e-02 5.710491367861885575e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.853772361939331204e-01 +6.687898089171974425e-02 2.926829268292683098e-02 7.142857142857142461e-02 0.000000000000000000e+00 1.111111111111111154e-02 1.948051948051948007e-02 2.151029748283752874e-01 2.023809523809523836e-01 6.666666666666666574e-02 3.910614525139664843e-02 5.095541401273885607e-02 4.597701149425287293e-02 6.666666666666666574e-02 1.886792452830188607e-02 1.744548286604361287e-01 2.222222222222222099e-01 1.889763779527559029e-01 7.377049180327868716e-02 7.199999999999999456e-02 2.285714285714285712e-02 6.194690265486725578e-02 7.876712328767122850e-02 1.060606060606060635e-01 1.597938144329896781e-01 5.243445692883895448e-02 4.039125431530494748e-01 3.212719298245614308e-01 1.120218579234972672e-01 7.203389830508474811e-02 4.911591355599213837e-02 3.846153846153846367e-01 1.499999999999999944e-01 3.099762470308788376e-01 9.529411764705882082e-02 1.113043478260869606e-01 5.633802816901408578e-02 6.473594548551958594e-02 9.532062391681109248e-02 8.139534883720930813e-02 3.136645962732919068e-01 6.346153846153845812e-02 1.052631578947368363e-01 1.900000000000000022e-01 2.137320044296788513e-01 1.613756613756613667e-01 8.522727272727272096e-02 9.881422924901185623e-02 1.842105263157894635e-01 4.052910052910053129e-01 6.399217221135029554e-01 2.905027932960894121e-01 8.395061728395061262e-01 5.062836624775582939e-01 2.648936170212766172e-01 3.212290502793296310e-01 1.413881748071979527e-01 7.093425605536332612e-02 3.636363636363636465e-01 nan nan nan nan nan nan 5.882352941176470507e-02 5.238095238095238360e-01 nan 0.000000000000000000e+00 5.000000000000000278e-02 1.333333333333333315e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 1.000000000000000056e-01 0.000000000000000000e+00 2.298850574712643646e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 2.127659574468085055e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.555555555555555247e-02 1.298701298701298787e-02 0.000000000000000000e+00 0.000000000000000000e+00 4.166666666666666435e-02 1.449275362318840597e-02 0.000000000000000000e+00 0.000000000000000000e+00 5.405405405405405705e-02 5.555555555555555247e-02 6.153846153846154188e-02 8.771929824561403022e-02 1.791044776119402882e-01 1.351351351351351426e-02 1.709401709401709574e-02 1.043478260869565161e-01 0.000000000000000000e+00 0.000000000000000000e+00 2.830188679245283084e-02 1.333333333333333315e-01 4.016064257028112428e-02 5.102040816326530205e-03 5.905511811023621965e-02 9.090909090909091161e-02 3.773584905660377214e-02 7.547169811320754429e-02 5.676855895196506602e-02 4.635761589403973593e-02 6.349206349206348854e-02 3.181818181818181490e-02 4.827586206896551657e-02 2.702702702702702853e-02 3.584229390681003408e-02 3.100775193798449569e-02 6.077348066298342288e-02 2.721088435374149558e-02 1.000000000000000000e+00 nan nan nan nan nan nan 5.660377358490566169e-02 0.000000000000000000e+00 nan nan 6.756756756756757132e-02 5.507745266781411547e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.221278167713335638e-01 +1.119356833642547872e-01 6.411201179071480960e-02 7.858376511226251859e-02 1.372549019607843257e-01 5.187835420393559910e-02 3.274215552523874334e-02 2.560228664761127204e-01 2.259654889071487371e-01 7.978723404255319562e-02 8.688524590163934636e-02 8.301886792452829733e-02 4.333694474539544900e-02 7.308377896613191260e-02 6.435643564356435808e-02 1.694644284572342230e-01 3.152064451158106961e-01 1.977124183006535862e-01 4.623513870541611642e-02 8.782742681047765732e-02 5.439330543933054707e-02 6.451612903225806273e-02 9.083850931677019125e-02 6.277533039647577306e-02 4.434840425531915153e-01 7.242339832869081062e-02 2.349744245524296726e-01 3.478260869565217295e-01 1.232464929859719421e-01 5.494505494505494414e-02 5.250596658711217252e-02 1.550960118168389912e-01 7.698113207547169212e-02 1.703806870937790152e-01 6.785714285714285199e-02 9.897828863346104511e-02 4.578313253012047945e-02 5.029239766081871482e-02 3.846153846153846367e-02 5.073086844368013965e-02 1.112372304199772954e-01 2.930402930402930400e-02 6.283987915407855673e-02 6.447453255963894736e-02 1.971066907775768651e-01 1.509167842031029494e-01 1.056451612903225867e-01 1.452914798206277891e-01 2.184014869888475929e-01 1.979695431472081324e-01 3.829787234042553168e-01 3.559034097803664420e-01 5.377417342482844198e-01 7.508946631398786264e-01 4.744412480637308915e-01 7.072135785007072073e-01 4.111196123437898531e-01 2.355185570586194876e-01 5.000000000000000000e-01 nan nan nan nan nan 0.000000000000000000e+00 1.199999999999999956e-01 5.873015873015873245e-01 nan 2.142857142857142738e-01 2.062717770034843134e-01 1.205264002567806164e-01 4.901960784313725422e-02 1.843317972350230413e-02 9.523809523809524669e-03 nan 3.947368421052631360e-02 6.410256410256409687e-02 1.396648044692737345e-02 6.149732620320855908e-02 3.196347031963470142e-02 0.000000000000000000e+00 2.325581395348837177e-02 4.347826086956521618e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.307692307692307820e-02 1.421800947867298513e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.409090909090908839e-02 4.878048780487805047e-02 2.710027100271002881e-02 2.409638554216867595e-02 3.608247422680412042e-02 4.050632911392405139e-02 4.444444444444444614e-02 0.000000000000000000e+00 7.142857142857142461e-02 3.804347826086956763e-02 1.000000000000000021e-02 4.255319148936170109e-02 2.127659574468085055e-02 1.184210526315789408e-01 0.000000000000000000e+00 2.673796791443850199e-02 0.000000000000000000e+00 3.191489361702127409e-02 1.960784313725490169e-02 1.769911504424778736e-02 1.404494382022471871e-02 4.232804232804232569e-02 5.384615384615384914e-02 8.394160583941605303e-02 1.173913043478260892e-01 4.629629629629629373e-02 1.033994334277620331e-01 1.646090534979424008e-02 4.314329738058551855e-02 6.395048994326972547e-02 1.081081081081081141e-01 2.515060240963855609e-01 6.554121151936444234e-02 2.352941176470588203e-01 5.579399141630901615e-02 2.111613876319758804e-02 0.000000000000000000e+00 nan nan nan nan nan nan nan 2.500000000000000000e-01 nan nan 7.317073170731706877e-02 4.065573770491803102e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.086838534599728456e-01 +2.149805447470817255e-01 1.055088702147525676e-01 1.588032220943613460e-01 8.000000000000000167e-02 1.576086956521739191e-01 1.213675213675213665e-01 1.849162011173184350e-01 2.221518987341772056e-01 1.285493030459473329e-01 1.319857312722948761e-01 1.234567901234567833e-01 5.057096247960848195e-02 5.765407554671968249e-02 6.629834254143646133e-02 7.532467532467532201e-02 2.650705429670799362e-01 3.931203931203931107e-02 3.150912106135986962e-02 6.427221172022684614e-02 1.442441054091539443e-01 8.277027027027027140e-02 5.081081081081081224e-02 6.490872210953346766e-02 2.292179045745204036e-01 2.869565217391304227e-02 9.762979683972912437e-02 1.221060492905153144e-01 8.874172185430463655e-02 5.955334987593052104e-02 5.734767025089605730e-02 1.022443890274314232e-01 3.801169590643274643e-02 8.361774744027303252e-02 4.437140509449465781e-02 7.006369426751592189e-02 5.013927576601671238e-02 3.191489361702127409e-02 1.489361702127659642e-02 2.432045779685264655e-02 5.426356589147286746e-02 2.339181286549707472e-02 1.246169560776302365e-01 8.127572016460905824e-02 2.906799083269671624e-01 2.283834586466165495e-01 3.230593607305936033e-01 4.460000000000000075e-01 3.654379706698375196e-01 1.587926509186351753e-01 2.481159420289855144e-01 4.584694754944110273e-01 2.530991735537190257e-01 4.717896865520728178e-01 6.808080808080808621e-01 3.569060773480662863e-01 3.084660519698239622e-01 4.150141643059490071e-01 5.161290322580645018e-01 nan nan 5.000000000000000000e-01 1.000000000000000000e+00 nan nan 1.363636363636363535e-01 4.878048780487804770e-01 nan 3.333333333333333148e-01 4.590443686006825952e-01 2.511515151515151256e-01 4.385964912280701511e-02 1.600000000000000033e-02 1.515151515151515194e-02 nan 1.129032258064516098e-01 8.641975308641974829e-02 1.190476190476190410e-02 2.990033222591362283e-02 8.275862068965517127e-02 0.000000000000000000e+00 5.000000000000000278e-02 4.545454545454545581e-02 5.882352941176470507e-02 3.571428571428571230e-02 2.083333333333333218e-02 1.302931596091205270e-02 0.000000000000000000e+00 4.545454545454545581e-02 0.000000000000000000e+00 3.809523809523809867e-02 4.166666666666666435e-02 2.040816326530612082e-02 1.869158878504672758e-02 3.378378378378378566e-03 0.000000000000000000e+00 2.040816326530612082e-02 1.403508771929824588e-02 0.000000000000000000e+00 0.000000000000000000e+00 5.000000000000000278e-02 2.150537634408602322e-02 2.941176470588235253e-02 0.000000000000000000e+00 3.030303030303030387e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 4.938271604938271331e-02 2.083333333333333218e-02 0.000000000000000000e+00 1.874999999999999931e-02 2.479338842975206680e-02 1.181506849315068497e-01 1.313868613138686192e-01 2.980769230769230727e-01 1.063829787234042562e-01 1.996370235934664117e-01 3.618421052631579093e-02 3.389830508474576259e-02 1.104972375690607689e-01 2.072538860103627020e-02 5.270863836017569692e-02 1.101449275362318819e-01 5.577689243027888349e-02 3.063457330415754812e-02 4.072398190045248972e-02 nan nan nan nan nan nan nan 0.000000000000000000e+00 6.666666666666666297e-01 nan nan 1.090909090909090856e-01 6.911636045494312652e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.550012051096649524e-01 +1.058020477815699717e-01 6.666666666666666574e-02 7.462686567164178442e-02 0.000000000000000000e+00 1.204819277108433798e-02 2.604166666666666782e-02 2.234636871508379752e-01 2.309160305343511410e-01 6.610169491525423602e-02 5.699481865284974219e-02 5.555555555555555247e-02 4.368932038834951598e-02 1.307189542483660205e-01 6.363636363636362980e-02 1.036414565826330597e-01 3.504380475594492950e-01 2.755905511811023723e-01 8.000000000000000167e-02 7.971014492753622505e-02 2.439024390243902524e-02 8.796296296296296502e-02 1.064935064935064873e-01 4.576659038901601667e-02 6.359338061465721337e-01 5.538461538461538630e-02 1.724137931034482873e-01 4.590476190476190377e-01 1.230283911671924274e-01 3.928571428571428492e-02 3.669724770642202039e-02 9.419152276295134074e-02 4.778156996587031025e-02 9.423076923076922906e-02 4.956268221574344074e-02 9.318181818181818510e-02 0.000000000000000000e+00 9.960159362549800624e-03 2.564102564102564014e-02 3.333333333333333287e-02 4.694835680751173468e-02 4.166666666666666609e-03 6.206896551724137845e-02 5.743243243243243562e-02 1.548117154811715357e-01 1.617021276595744794e-01 8.878504672897195860e-02 1.273584905660377353e-01 1.510574018126888129e-01 1.053639846743295028e-01 3.090246125797629917e-01 2.419955323901712696e-01 5.190217391304348116e-01 7.791245791245791086e-01 3.758542141230068467e-01 9.004149377593361203e-01 7.097130242825606672e-01 2.710674157303371024e-01 3.571428571428571508e-01 nan nan nan nan nan nan 5.000000000000000000e-01 5.333333333333333259e-01 nan 0.000000000000000000e+00 2.145922746781115942e-01 1.419068736141906872e-01 5.000000000000000000e-01 7.692307692307692735e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 1.875000000000000000e-01 8.108108108108108558e-02 1.857142857142857206e-01 1.612903225806451568e-01 0.000000000000000000e+00 1.000000000000000000e+00 5.000000000000000278e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.128205128205128027e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.000000000000000111e-01 1.851851851851851749e-01 0.000000000000000000e+00 1.612903225806451568e-01 6.122448979591836593e-02 5.263157894736841813e-02 8.000000000000000167e-02 6.060606060606060774e-02 4.938271604938271331e-02 2.307692307692307820e-01 0.000000000000000000e+00 0.000000000000000000e+00 6.122448979591836593e-02 0.000000000000000000e+00 6.250000000000000000e-02 2.222222222222222307e-02 1.499999999999999944e-01 0.000000000000000000e+00 1.785714285714285615e-02 0.000000000000000000e+00 nan 3.030303030303030387e-02 0.000000000000000000e+00 3.478260869565217434e-02 1.724137931034482735e-02 1.214953271028037379e-01 9.677419354838709409e-02 1.428571428571428492e-01 0.000000000000000000e+00 1.735537190082644676e-01 8.928571428571428076e-03 6.603773584905660299e-02 8.169014084507042472e-02 6.779661016949152519e-02 4.658119658119658224e-01 1.029411764705882304e-01 7.039999999999999591e-01 1.728971962616822344e-01 8.208955223880597118e-02 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan 1.562500000000000000e-01 8.571428571428571508e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.221476510067113885e-01 +2.245059288537549491e-01 1.275933609958506132e-01 9.539473684210526827e-02 0.000000000000000000e+00 3.021148036253776606e-02 6.793048973143760161e-02 2.106932487539646681e-01 3.475147430497051437e-01 9.062742060418280121e-02 8.071278825995807649e-02 5.299860529986052948e-02 7.837582625118036384e-02 1.656378600823045222e-01 7.636363636363636964e-02 1.068660022148394256e-01 5.653937140925988647e-01 1.987612612612612573e-01 1.272206303724928433e-01 1.330761812921890108e-01 5.314009661835748799e-02 2.169696969696969790e-01 2.269457161543492474e-01 6.465899025686448753e-02 5.965180207697006187e-01 1.667527103768714491e-01 1.669691470054446569e-01 3.830007774034723811e-01 1.020642201834862373e-01 3.677758318739054316e-02 5.405405405405405705e-02 9.355246523388116575e-02 6.746626686656671812e-02 8.485499462943071891e-02 8.535489667565139549e-02 5.307262569832402188e-02 4.255319148936170109e-02 4.269972451790633727e-02 3.174603174603174427e-02 2.486187845303867300e-02 5.780346820809248443e-02 2.362204724409448786e-02 7.898089171974521927e-02 6.835066864784546115e-02 2.201761409127301894e-01 1.827956989247311870e-01 3.202146690518783423e-01 2.304900181488203359e-01 1.993127147766323159e-01 1.253687315634218202e-01 1.814611154752553135e-01 1.636223308464111181e-01 1.558164354322305323e-01 4.579162875341219463e-01 4.171575846833578960e-01 7.208413001912046258e-01 8.232181761593526659e-01 5.385166606950914092e-01 3.333333333333333148e-01 nan nan 4.000000000000000222e-01 1.000000000000000000e+00 nan 6.250000000000000000e-02 4.000000000000000222e-01 8.942307692307692735e-01 nan 2.000000000000000111e-01 3.706896551724138122e-01 2.145373038744796679e-01 6.818181818181817677e-02 3.301886792452830149e-02 2.173913043478260809e-02 nan 0.000000000000000000e+00 6.542056074766354479e-02 5.323193916349809596e-02 8.968609865470851539e-02 1.054131054131054179e-01 3.389830508474576259e-02 8.988764044943819975e-02 5.825242718446602130e-02 1.886792452830188607e-02 0.000000000000000000e+00 6.993006993006993001e-03 1.144164759725400521e-01 1.063829787234042527e-02 1.298701298701298787e-02 1.250000000000000000e-01 8.333333333333332871e-02 1.090909090909090856e-01 7.142857142857142461e-02 6.666666666666666574e-02 1.143552311435523106e-01 2.999999999999999889e-02 7.462686567164178962e-03 7.722007722007721842e-02 1.621621621621621712e-01 6.250000000000000000e-02 5.882352941176470507e-02 2.631578947368420907e-02 0.000000000000000000e+00 1.875000000000000000e-01 8.888888888888889228e-02 1.875000000000000000e-01 0.000000000000000000e+00 1.587301587301587213e-02 9.523809523809523281e-02 4.545454545454545581e-02 3.191489361702127409e-02 0.000000000000000000e+00 1.075268817204301092e-01 4.210526315789473589e-02 1.050228310502283047e-01 7.608695652173913526e-02 1.268656716417910502e-01 1.515151515151515194e-02 2.129277566539923838e-01 2.684563758389261687e-02 4.374999999999999722e-02 5.781057810578105888e-02 3.260869565217391214e-02 5.410447761194029509e-02 7.196029776674937872e-02 1.556603773584905592e-01 3.171324422843256330e-01 1.023936170212765978e-01 0.000000000000000000e+00 nan nan nan nan nan nan nan 7.619047619047618625e-01 nan nan 1.037735849056603821e-01 8.293460925039872200e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.482334047109207908e-01 +6.226880394574598743e-01 4.534377719756310099e-01 4.039179104477612081e-01 0.000000000000000000e+00 2.141057934508815985e-01 3.299270072992700475e-01 5.464480874316940406e-01 6.044467425025853435e-01 2.837500000000000022e-01 2.538975501113585609e-01 3.260188087774294474e-01 1.662895927601809876e-01 2.122641509433962348e-01 5.020080321285140534e-02 1.579341317365269559e-01 4.427015250544662495e-01 7.156308851224105205e-02 3.728362183754993509e-02 1.720430107526881719e-02 4.522207267833108779e-01 4.395424836601307117e-01 6.772009029345373021e-02 4.341317365269461298e-02 2.008733624454148436e-01 2.917152858809801685e-02 6.772207563764291727e-02 8.056206088992974579e-02 4.925053533190577870e-02 4.545454545454545581e-02 1.760563380281690224e-02 5.913410770855332538e-02 6.069364161849710726e-02 4.006410256410256748e-02 2.008608321377331266e-02 4.347826086956521618e-02 3.191489361702127409e-02 1.970443349753694603e-02 4.639175257731958935e-02 1.067615658362989356e-02 5.405405405405405705e-02 8.928571428571428076e-03 4.838709677419354704e-02 8.843537414965986498e-02 2.954369682907965755e-01 1.886269070735090148e-01 4.476479514415781513e-01 5.024469820554648969e-01 3.379026730637422760e-01 1.680751173708920077e-01 1.877394636015325691e-01 3.247539742619227621e-01 7.142857142857142461e-02 2.068571428571428505e-01 5.657165479018210208e-01 2.811188811188811143e-01 6.219702892885066170e-01 8.715113217482886032e-01 2.380952380952380820e-01 nan nan nan nan nan nan 9.411764705882352811e-01 6.440677966101694407e-01 nan 8.750000000000000000e-01 5.112499999999999822e-01 1.921954777534646275e-01 1.304347826086956486e-01 9.848484848484848064e-02 4.838709677419354704e-02 nan 1.176470588235294101e-01 2.816901408450704289e-02 8.722741433021806434e-02 5.980861244019138739e-02 1.014492753623188470e-01 8.633093525179856564e-02 1.250000000000000000e-01 7.070707070707070441e-02 1.098901098901098883e-01 0.000000000000000000e+00 1.626016260162601798e-02 2.359882005899704982e-02 2.608695652173912902e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.505376344086021556e-01 4.600000000000000200e-01 1.358024691358024616e-01 7.692307692307692735e-02 3.359173126614987265e-02 0.000000000000000000e+00 1.818181818181818232e-01 3.886925795053003396e-02 2.571428571428571175e-01 6.666666666666666297e-01 4.500000000000000111e-01 2.666666666666666630e-01 0.000000000000000000e+00 1.951219512195122019e-01 2.368421052631578816e-01 1.923076923076923184e-01 6.666666666666666297e-01 0.000000000000000000e+00 0.000000000000000000e+00 4.285714285714285476e-01 0.000000000000000000e+00 6.666666666666666297e-01 1.739130434782608647e-01 1.428571428571428492e-01 1.565495207667731703e-01 1.555555555555555580e-01 2.745098039215686514e-01 6.250000000000000000e-02 2.454873646209386195e-01 1.280487804878048808e-01 1.150000000000000050e-01 1.235356762513312029e-01 7.352941176470588480e-02 2.982107355864811044e-02 8.731808731808732293e-02 7.179487179487178961e-02 9.401709401709401615e-02 2.144607843137254777e-01 nan nan nan nan nan nan nan 0.000000000000000000e+00 1.212121212121212155e-01 nan nan 1.176470588235294101e-01 8.823529411764706454e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.175420528664607001e-01 +6.250000000000000000e-02 4.000000000000000083e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.172413793103448204e-02 1.649484536082474195e-01 3.243243243243243423e-01 4.285714285714285476e-01 3.750000000000000000e-01 2.857142857142856984e-01 5.000000000000000000e-01 3.571428571428571508e-01 2.352941176470588203e-01 0.000000000000000000e+00 5.000000000000000000e-01 nan 9.090909090909091161e-02 1.428571428571428492e-01 8.000000000000000444e-01 6.666666666666666297e-01 1.000000000000000056e-01 3.333333333333333148e-01 5.789473684210526550e-01 3.333333333333333148e-01 5.714285714285713969e-01 5.000000000000000000e-01 1.499999999999999944e-01 2.666666666666666630e-01 0.000000000000000000e+00 1.707317073170731836e-01 1.639344262295081844e-01 1.538461538461538547e-01 1.111111111111111049e-01 2.000000000000000111e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 6.666666666666666297e-01 2.500000000000000000e-01 3.389830508474576259e-02 6.250000000000000000e-02 0.000000000000000000e+00 1.000000000000000056e-01 2.040816326530612082e-02 0.000000000000000000e+00 2.999999999999999889e-01 1.239669421487603340e-01 2.105263157894736725e-01 2.352941176470588203e-01 1.527777777777777901e-01 2.857142857142856984e-01 1.562500000000000000e-01 1.363636363636363535e-01 5.000000000000000000e-01 nan nan nan nan nan nan nan nan nan nan 2.777777777777777901e-01 5.531914893617021489e-01 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 7.692307692307692735e-02 0.000000000000000000e+00 0.000000000000000000e+00 8.333333333333332871e-02 0.000000000000000000e+00 0.000000000000000000e+00 5.882352941176470507e-02 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 8.333333333333332871e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.068965517241379282e-01 6.666666666666666574e-02 nan 2.500000000000000000e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan 5.555555555555555247e-02 3.584905660377358250e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.858974358974359031e-01 +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 2.500000000000000000e-01 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan nan 1.250000000000000000e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +0.000000000000000000e+00 nan nan nan nan nan 6.250000000000000000e-02 2.083333333333333426e-01 1.250000000000000000e-01 nan nan 1.666666666666666574e-01 1.666666666666666574e-01 nan 0.000000000000000000e+00 1.666666666666666574e-01 1.000000000000000000e+00 nan nan nan nan nan 0.000000000000000000e+00 5.952380952380952328e-01 nan nan 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.166666666666666435e-02 0.000000000000000000e+00 2.727272727272727071e-01 1.111111111111111049e-01 2.500000000000000000e-01 1.666666666666666574e-01 8.333333333333332871e-02 1.071428571428571369e-01 nan 1.388888888888888951e-01 6.666666666666666297e-01 nan 1.666666666666666574e-01 nan nan nan nan nan nan nan 1.000000000000000000e+00 nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan 3.333333333333333148e-01 nan nan 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 5.555555555555555247e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.222222222222222099e-01 +9.444444444444444198e-01 5.714285714285713969e-01 5.000000000000000000e-01 0.000000000000000000e+00 2.727272727272727071e-01 3.529411764705882582e-01 4.827586206896551935e-01 4.468085106382978511e-01 4.382022471910112515e-01 1.428571428571428492e-01 5.671641791044775838e-01 2.040816326530612290e-01 6.896551724137930939e-02 0.000000000000000000e+00 2.692307692307692180e-01 8.695652173913043237e-02 1.034482758620689641e-01 0.000000000000000000e+00 nan 5.277777777777777901e-01 5.999999999999999778e-01 1.666666666666666574e-01 nan 1.666666666666666574e-01 nan 0.000000000000000000e+00 2.222222222222222099e-01 nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 3.333333333333333148e-01 7.692307692307692735e-02 8.333333333333332871e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 4.761904761904761640e-02 2.564102564102564014e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.125000000000000000e-01 nan nan nan nan nan nan nan 7.222222222222222099e-01 nan nan 1.000000000000000000e+00 0.000000000000000000e+00 2.222222222222222307e-02 nan 1.428571428571428492e-01 0.000000000000000000e+00 nan 0.000000000000000000e+00 1.052631578947368363e-01 0.000000000000000000e+00 9.090909090909091161e-02 1.785714285714285615e-02 nan 2.777777777777777624e-02 1.000000000000000056e-01 0.000000000000000000e+00 0.000000000000000000e+00 6.818181818181817677e-02 2.500000000000000000e-01 0.000000000000000000e+00 5.000000000000000278e-02 1.250000000000000000e-01 1.000000000000000056e-01 0.000000000000000000e+00 2.500000000000000000e-01 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan 5.999999999999999778e-02 nan nan nan nan 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.657754010695187130e-01 +4.666666666666666741e-01 0.000000000000000000e+00 nan nan nan nan 2.857142857142856984e-01 3.499999999999999778e-01 7.142857142857142461e-02 2.500000000000000000e-01 1.538461538461538547e-01 1.153846153846153910e-01 1.714285714285714302e-01 5.555555555555555247e-02 7.407407407407406996e-02 5.999999999999999778e-01 7.692307692307692735e-02 0.000000000000000000e+00 2.222222222222222099e-01 2.500000000000000000e-01 5.000000000000000000e-01 4.000000000000000222e-01 0.000000000000000000e+00 2.142857142857142738e-01 0.000000000000000000e+00 9.090909090909091161e-02 1.666666666666666574e-01 0.000000000000000000e+00 6.250000000000000000e-02 0.000000000000000000e+00 7.142857142857142461e-02 2.500000000000000000e-01 1.875000000000000000e-01 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 2.000000000000000111e-01 3.636363636363636465e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.000000000000000111e-01 2.258064516129032195e-01 2.999999999999999889e-01 2.857142857142856984e-01 1.111111111111111049e-01 6.842105263157894912e-01 4.102564102564102422e-01 1.818181818181818232e-01 2.142857142857142738e-01 1.428571428571428492e-01 2.571428571428571175e-01 6.190476190476190688e-01 1.250000000000000000e-01 5.999999999999999778e-01 5.609756097560976151e-01 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan nan nan nan 1.000000000000000000e+00 nan nan 3.333333333333333148e-01 3.404255319148936088e-01 nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.564102564102564014e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000056e-01 5.000000000000000278e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan 1.818181818181818232e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 8.333333333333332871e-02 nan nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan nan 2.500000000000000000e-01 0.000000000000000000e+00 nan nan 2.000000000000000111e-01 nan nan 1.000000000000000056e-01 nan 0.000000000000000000e+00 1.538461538461538547e-01 0.000000000000000000e+00 0.000000000000000000e+00 8.000000000000000167e-02 nan nan nan nan nan nan nan nan 1.666666666666666574e-01 nan nan nan 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.260869565217391297e-01 +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +5.333333333333333259e-01 4.210526315789473450e-01 1.875000000000000000e-01 0.000000000000000000e+00 2.500000000000000000e-01 3.333333333333333148e-01 1.304347826086956486e-01 0.000000000000000000e+00 8.888888888888889228e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 nan nan nan 2.142857142857142738e-01 3.333333333333333148e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 7.142857142857142461e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.333333333333333287e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.999999999999999889e-01 nan nan nan nan nan nan nan 1.000000000000000000e+00 8.000000000000000444e-01 nan nan nan 4.761904761904761640e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.999999999999999889e-01 +3.286573146292585124e-01 1.720733427362482471e-01 2.322274881516587786e-01 7.142857142857142461e-02 2.631578947368420907e-01 1.395348837209302306e-01 2.104519774011299471e-01 1.380042462845010587e-01 9.459459459459459985e-02 7.597173144876324946e-02 6.329113924050633333e-02 2.089552238805970213e-02 3.846153846153846367e-02 2.739726027397260122e-02 7.392996108949416445e-02 8.611111111111111049e-02 2.272727272727272790e-02 3.488372093023255766e-02 6.382978723404254817e-02 1.232091690544412643e-01 1.448275862068965636e-01 1.739130434782608647e-01 1.754385964912280604e-01 5.142857142857142766e-02 1.694915254237288130e-02 5.472636815920398079e-02 4.047976011994002671e-02 4.761904761904761640e-02 8.333333333333333218e-03 1.734104046242774394e-02 4.654654654654654528e-02 5.045871559633027803e-02 5.945945945945946276e-02 1.855955678670360154e-01 3.870967741935484041e-02 0.000000000000000000e+00 4.230769230769231004e-02 0.000000000000000000e+00 2.339181286549707472e-02 7.446808510638297518e-02 1.086956521739130405e-02 1.441241685144124263e-01 9.619238476953907713e-02 4.165222414789139238e-01 4.584040747028862439e-01 6.944444444444444198e-01 6.247987117552334935e-01 3.895027624309392311e-01 1.182432432432432429e-01 1.215053763440860218e-01 3.184302036761053056e-01 9.009009009009008584e-02 1.178274200613228240e-01 3.823216187433439717e-01 1.424936386768447805e-01 2.241014799154334158e-01 4.386189258312020445e-01 5.000000000000000000e-01 nan nan 4.166666666666666852e-01 nan nan nan 3.750000000000000000e-01 6.153846153846154188e-01 nan nan 8.533916849015317219e-01 6.474741988049972363e-01 1.000000000000000021e-02 3.292181069958848016e-02 4.310344827586207184e-02 nan 1.315789473684210453e-02 4.237288135593220151e-02 0.000000000000000000e+00 1.250000000000000069e-02 1.639344262295082053e-02 4.255319148936170109e-02 1.149425287356321823e-02 3.278688524590164105e-02 0.000000000000000000e+00 nan 9.756097560975610095e-02 4.597701149425287293e-02 0.000000000000000000e+00 nan nan 3.676470588235294240e-02 0.000000000000000000e+00 0.000000000000000000e+00 3.333333333333333287e-02 4.545454545454545581e-02 0.000000000000000000e+00 1.818181818181818094e-02 2.083333333333333218e-02 0.000000000000000000e+00 1.666666666666666574e-01 2.222222222222222099e-01 0.000000000000000000e+00 1.111111111111111049e-01 0.000000000000000000e+00 0.000000000000000000e+00 1.250000000000000000e-01 2.500000000000000000e-01 0.000000000000000000e+00 0.000000000000000000e+00 1.764705882352941291e-01 2.061855670103092744e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 7.363420427553443726e-02 1.145833333333333287e-01 4.218750000000000000e-01 1.460674157303370746e-01 1.378299120234603992e-01 1.793721973094170377e-02 5.202312138728323876e-02 8.993576017130620881e-02 2.608695652173912902e-02 2.976190476190476025e-02 1.002044989775051076e-01 2.325581395348837177e-02 3.571428571428571230e-02 4.587155963302752548e-02 nan nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 1.014492753623188470e-01 8.102766798418972738e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.888004548038658470e-01 +1.466591166477916319e-01 9.787444389520513766e-02 5.861070911722141702e-02 1.980198019801980222e-02 1.020092735703245768e-01 9.796672828096118779e-02 5.179282868525896671e-02 7.727975270479134351e-02 5.676587910401963838e-02 4.841075794621026857e-02 5.222437137330754320e-02 2.474690663667041685e-02 3.398058252427184345e-02 1.834862385321101019e-02 3.968253968253968034e-02 6.379876048122493093e-02 4.617117117117117142e-02 5.177993527508090860e-02 4.618937644341801485e-02 7.576953433307025143e-02 1.131805157593123168e-01 2.512363996043521230e-01 4.442548350398179968e-01 7.918115102356121371e-02 1.686121919584954512e-02 8.363059849385652555e-02 7.934238741958542229e-02 4.799107142857143155e-02 6.642066420664206883e-02 1.073919107391910766e-01 1.166077738515901019e-01 8.352849336455893392e-02 1.339694656488549518e-01 1.852605863192182400e-01 9.383202099737532331e-02 6.679035250463821738e-02 7.829977628635347020e-02 6.152647975077881609e-02 5.799457994579945708e-02 9.609826589595375779e-02 1.074481074481074550e-01 3.344608879492600439e-01 2.666666666666666630e-01 5.344009489916963229e-01 6.014617368873602654e-01 5.513404147698532931e-01 3.592423252775963638e-01 3.566162204113310086e-01 2.775748721694667465e-01 3.129338433205836600e-01 3.200071073205401628e-01 2.328638497652582295e-01 1.642022418316241295e-01 2.893175074183976236e-01 1.833130328867235148e-01 1.984242777939889124e-01 1.907181571815718124e-01 7.962962962962962798e-01 nan nan 8.571428571428570953e-01 5.555555555555555802e-01 nan 3.750000000000000000e-01 2.686567164179104461e-01 5.492957746478873693e-01 nan 5.000000000000000000e-01 6.835806606031593624e-01 8.175427872860635548e-01 3.651685393258426865e-02 3.096539162112932689e-02 9.374999999999999653e-03 nan 3.846153846153846367e-02 5.263157894736841813e-02 1.649484536082474265e-02 5.736137667304015003e-02 1.024390243902438963e-01 6.101694915254237545e-02 1.132075471698113234e-01 3.007518796992481036e-02 5.405405405405405705e-02 0.000000000000000000e+00 1.874999999999999931e-02 2.466367713004484138e-02 0.000000000000000000e+00 7.692307692307692735e-02 3.333333333333333148e-01 2.654867256637168105e-02 0.000000000000000000e+00 9.375000000000000000e-02 8.439897698209718191e-02 7.279693486590038676e-02 8.139534883720930813e-02 9.873417721518987222e-02 7.706766917293232655e-02 2.417582417582417598e-01 1.025641025641025605e-01 1.057692307692307682e-01 8.258527827648115549e-02 2.626262626262626521e-01 1.122715404699738961e-01 7.672634271099744441e-02 4.225352112676056260e-02 5.376344086021505458e-02 5.714285714285714107e-02 3.333333333333333287e-02 7.183908045977011048e-02 1.048824593128390575e-01 1.291866028708134051e-01 8.368200836820083310e-02 9.246575342465752911e-02 1.079182630906768831e-01 1.277258566978193011e-01 1.193317422434367475e-01 4.054054054054054279e-02 1.336336336336336472e-01 5.336426914153132028e-02 8.512330946698488943e-02 9.971346704871060507e-02 6.082289803220036067e-02 3.010890454836643096e-02 1.020663744520976801e-01 5.987055016181229428e-02 7.848443843031123468e-02 7.293868921775897851e-02 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 2.500000000000000000e-01 nan nan 1.210653753026634388e-01 7.502404616864379039e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.185894206549118590e-01 +6.231884057971014412e-01 4.000000000000000222e-01 3.559322033898305038e-01 nan 4.000000000000000222e-01 3.456790123456789932e-01 4.333333333333333481e-01 1.509433962264150886e-01 1.519999999999999962e-01 1.343283582089552231e-01 1.224489795918367319e-01 3.797468354430379861e-02 1.369863013698630061e-02 0.000000000000000000e+00 3.030303030303030387e-02 4.210526315789473589e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.243243243243243423e-01 8.771929824561403022e-02 2.000000000000000111e-01 0.000000000000000000e+00 5.000000000000000278e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.380952380952380820e-02 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 nan 2.777777777777777624e-02 5.357142857142856845e-02 1.000000000000000056e-01 0.000000000000000000e+00 4.347826086956521618e-02 2.000000000000000111e-01 3.703703703703703498e-02 2.620087336244541348e-02 2.000000000000000111e-01 9.090909090909090468e-03 5.263157894736841813e-02 0.000000000000000000e+00 2.999999999999999889e-02 4.444444444444444198e-01 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan 5.555555555555555247e-02 6.403940886699507895e-02 8.538913362701908705e-01 6.845188284518828326e-01 7.291666666666666297e-01 nan 5.711538461538461231e-01 6.223776223776223970e-01 6.613698630136986001e-01 5.097493036211698803e-01 3.147699757869249493e-01 5.100671140939597725e-01 3.954849498327759338e-01 2.043478260869565355e-01 1.552901023890785048e-01 4.878048780487805047e-02 1.058601134215500922e-01 2.119089316987740890e-01 5.463182897862232934e-02 1.675977653631284883e-02 1.923076923076923184e-02 6.370044052863436113e-01 4.247787610619468968e-01 2.318840579710144956e-01 7.692307692307692735e-02 4.193138500635323895e-02 2.702702702702702853e-02 3.688524590163934358e-02 4.626865671641790939e-02 6.666666666666666574e-02 0.000000000000000000e+00 0.000000000000000000e+00 4.306220095693780170e-02 2.777777777777777624e-02 0.000000000000000000e+00 3.061224489795918297e-02 2.631578947368420907e-02 1.250000000000000000e-01 nan nan nan 3.333333333333333148e-01 0.000000000000000000e+00 1.052631578947368397e-02 2.777777777777777624e-02 7.832618025751073021e-02 7.428571428571428825e-02 2.214876033057851246e-01 3.875205254515599607e-01 1.616161616161616299e-01 1.536926147704590906e-01 1.654929577464788748e-01 2.330298013245033217e-01 6.228373702422144997e-02 4.792851340373679991e-02 2.059000602046959782e-01 6.145251396648044456e-02 3.021645021645021911e-01 7.255192878338279083e-01 nan nan nan nan nan nan nan 1.000000000000000000e+00 5.000000000000000000e-01 nan 1.000000000000000000e+00 3.551401869158878344e-01 7.510599636583888128e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.981072555205047436e-01 +3.204633204633204890e-01 4.799999999999999822e-01 1.138211382113821085e-01 nan 2.750000000000000222e-01 2.307692307692307820e-01 6.392694063926940284e-02 7.777777777777777901e-02 5.687203791469194053e-02 9.174311926605505096e-02 5.454545454545454281e-02 1.029411764705882304e-01 1.481481481481481399e-01 0.000000000000000000e+00 5.357142857142856845e-02 1.960784313725490169e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan 2.153846153846153966e-01 4.545454545454545581e-02 0.000000000000000000e+00 0.000000000000000000e+00 4.347826086956521618e-02 nan 3.448275862068965469e-02 4.545454545454545581e-02 nan nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 4.516129032258064252e-02 1.492537313432835792e-02 4.545454545454545581e-02 5.882352941176470507e-02 3.428571428571428742e-02 4.444444444444444614e-02 6.250000000000000000e-02 4.452690166975881159e-02 2.941176470588235253e-02 7.731958762886598224e-02 3.448275862068965469e-02 1.071428571428571369e-01 4.093567251461988077e-02 9.166666666666666019e-02 nan nan nan nan nan nan nan 3.333333333333333148e-01 nan nan 3.333333333333333148e-01 1.408450704225352144e-02 2.572347266881028910e-02 6.074074074074073959e-01 8.523533204384268203e-01 7.361963190184048766e-01 0.000000000000000000e+00 6.228571428571428870e-01 6.351228389444949496e-01 5.211342964151952639e-01 3.268460217515741228e-01 3.288472791105909732e-01 5.985781990521327200e-01 3.369098712446351729e-01 1.751287711552612092e-01 5.418719211822660420e-02 3.080082135523613818e-02 8.409986859395532366e-02 1.012176560121765545e-01 4.712041884816754039e-02 1.769911504424778736e-02 2.602230483271375516e-02 5.141914191419142410e-01 2.741935483870967527e-01 2.090261282660332565e-01 4.593639575971731476e-02 6.311207834602829136e-02 3.203661327231121375e-02 4.450261780104711878e-02 2.337228714524207038e-02 1.121495327102803724e-01 4.545454545454545581e-02 3.703703703703703498e-02 3.684210526315789130e-02 0.000000000000000000e+00 3.225806451612903136e-02 5.426356589147286746e-02 3.333333333333333287e-02 1.250000000000000000e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 9.803921568627450844e-02 5.128205128205128027e-02 8.719135802469135665e-02 2.947368421052631512e-02 9.421487603305785108e-02 1.179039301310043641e-01 1.013257575757575690e-01 1.666666666666666574e-01 1.434370771312584447e-01 1.166912850812407698e-01 3.740648379052369243e-02 3.870162297128589002e-02 8.461538461538462008e-02 4.696132596685082677e-02 1.883817427385892085e-01 4.113229347198151253e-01 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan nan nan 6.999999999999999556e-01 3.061224489795918435e-01 0.000000000000000000e+00 1.000000000000000000e+00 1.167979002624671969e-01 3.901950975487743917e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.961651917404130030e-01 +1.448275862068965636e-01 2.075471698113207641e-01 2.142857142857142738e-01 nan 2.500000000000000139e-02 1.406250000000000000e-01 9.259259259259258745e-02 2.127659574468085055e-02 3.030303030303030387e-02 7.920792079207920888e-02 1.041666666666666713e-01 1.304347826086956486e-01 2.500000000000000000e-01 2.500000000000000000e-01 3.750000000000000000e-01 1.333333333333333419e-02 8.333333333333332871e-02 nan nan 5.128205128205128027e-02 8.823529411764706454e-02 5.555555555555555247e-02 0.000000000000000000e+00 3.571428571428571230e-02 0.000000000000000000e+00 7.692307692307692735e-02 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 1.052631578947368363e-01 4.000000000000000083e-02 5.882352941176470507e-02 0.000000000000000000e+00 6.250000000000000000e-02 1.538461538461538547e-01 2.857142857142857054e-02 3.846153846153846367e-02 0.000000000000000000e+00 3.749999999999999861e-02 9.756097560975610095e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.112676056338028130e-02 nan nan nan nan nan nan nan nan nan nan nan 5.555555555555555247e-02 4.145077720207254041e-02 5.490196078431373028e-01 5.786407766990291357e-01 8.369565217391304879e-01 nan 3.179824561403508665e-01 3.333333333333333148e-01 5.436781609195402432e-01 3.140096618357487990e-01 2.533333333333333548e-01 5.316062176165803344e-01 2.500000000000000000e-01 1.884057971014492794e-01 4.259259259259259162e-02 6.060606060606060774e-02 1.065789473684210509e-01 7.152496626180836203e-02 4.970760233918128379e-02 1.369863013698630061e-02 7.575757575757575968e-03 2.525252525252525415e-01 1.453744493392070403e-01 4.932735426008968277e-02 6.547619047619047949e-02 5.545617173524150512e-02 2.293577981651376274e-02 4.430379746835443056e-02 3.409090909090908839e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.081081081081081141e-01 1.250000000000000000e-01 0.000000000000000000e+00 5.454545454545454281e-02 0.000000000000000000e+00 nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 4.545454545454545581e-02 9.302325581395348708e-02 7.142857142857142461e-02 5.970149253731343170e-02 1.137931034482758674e-01 1.024999999999999939e-01 1.014760147601476009e-01 6.907894736842105921e-02 1.250000000000000000e-01 1.040312093628088380e-01 5.291005291005290712e-02 5.764411027568921986e-02 9.501411100658513353e-02 3.398058252427184345e-02 5.761316872427983682e-02 2.198830409356725135e-01 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan nan nan 5.999999999999999778e-01 2.564102564102563875e-01 nan nan 8.360128617363343784e-02 3.270564915758176344e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.296398891966759170e-01 +nan 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 5.000000000000000278e-02 nan nan nan nan nan nan nan nan nan 2.500000000000000000e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 5.263157894736841813e-02 1.428571428571428492e-01 nan 3.333333333333333148e-01 0.000000000000000000e+00 0.000000000000000000e+00 8.333333333333332871e-02 9.090909090909091161e-02 3.478260869565217295e-01 5.833333333333333703e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.000000000000000111e-01 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan nan nan 7.692307692307692735e-02 nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.428571428571428492e-01 +1.941747572815533951e-01 2.448979591836734637e-01 2.500000000000000000e-01 nan 7.820512820512820484e-01 4.500000000000000111e-01 7.476635514018691031e-02 1.428571428571428527e-02 6.976744186046511531e-02 1.078431372549019662e-01 4.160583941605839331e-01 0.000000000000000000e+00 2.040816326530612082e-02 0.000000000000000000e+00 2.362204724409448786e-02 0.000000000000000000e+00 8.000000000000000167e-02 0.000000000000000000e+00 nan 4.848484848484848619e-01 5.617977528089887485e-02 4.878048780487805047e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.449275362318840597e-02 0.000000000000000000e+00 6.818181818181817677e-02 0.000000000000000000e+00 1.111111111111111154e-02 0.000000000000000000e+00 2.631578947368420907e-02 2.723735408560311322e-02 nan 1.388888888888888812e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.405405405405405705e-02 nan nan nan nan nan nan nan 7.500000000000000000e-01 0.000000000000000000e+00 nan nan 2.439024390243902524e-02 2.222222222222222307e-02 4.563106796116505048e-01 5.909090909090909394e-01 3.422131147540983798e-01 1.000000000000000000e+00 8.607305936073059716e-01 7.478813559322033955e-01 1.564927857935627109e-01 4.872881355932203590e-02 1.440677966101694962e-01 4.312839059674502540e-01 5.880640465793304239e-01 1.809045226130653328e-01 3.846153846153846367e-02 1.709401709401709574e-02 2.706027060270602830e-02 1.602136181575434040e-02 1.224489795918367284e-02 5.434782608695652023e-03 1.063829787234042527e-02 7.039627039627039951e-01 2.283813747228381485e-01 1.348837209302325701e-01 1.826086956521739135e-01 2.336448598130841034e-02 5.494505494505494934e-03 5.844155844155844021e-02 1.754385964912280604e-02 2.298850574712643646e-02 1.250000000000000000e-01 nan 5.714285714285714107e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.052631578947368363e-01 2.432432432432432567e-01 nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 1.785714285714285615e-02 4.347826086956521618e-02 6.537530266343825891e-02 4.237288135593220151e-02 4.153354632587859252e-02 5.376344086021505458e-02 5.397727272727272790e-02 5.581395348837209225e-02 6.744868035190615396e-02 1.590296495956873279e-01 3.821656050955413858e-02 7.082152974504249410e-02 6.653019447287615573e-02 3.482587064676617022e-02 1.701323251417769314e-02 1.143958868894601605e-01 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan nan nan 1.000000000000000000e+00 6.666666666666666574e-02 0.000000000000000000e+00 nan 5.660377358490566169e-02 4.326923076923076816e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.170329670329670391e-01 +3.476394849785407470e-01 3.095238095238095344e-01 7.299270072992700142e-02 nan 4.777777777777778012e-01 8.499999999999999778e-01 5.579399141630901615e-02 2.150537634408602322e-02 1.886792452830188607e-02 4.721030042918455266e-02 1.069182389937106958e-01 1.239669421487603340e-01 1.801801801801801786e-02 3.030303030303030387e-02 4.615384615384615641e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 4.148936170212765839e-01 8.139534883720930813e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.052631578947368363e-01 0.000000000000000000e+00 0.000000000000000000e+00 3.333333333333333148e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 9.848484848484848064e-02 1.639344262295082053e-02 1.052631578947368363e-01 1.190476190476190410e-01 8.670520231213872664e-02 6.382978723404254817e-02 4.477611940298507204e-02 5.978260869565217572e-02 0.000000000000000000e+00 6.293706293706294308e-02 6.521739130434782428e-02 1.199999999999999956e-01 5.882352941176470507e-02 5.844155844155844021e-02 nan nan nan nan nan nan nan 5.000000000000000000e-01 0.000000000000000000e+00 nan 1.000000000000000000e+00 3.846153846153846367e-02 5.022831050228310223e-02 5.308108108108108292e-01 6.294820717131474064e-01 3.410493827160493985e-01 1.000000000000000000e+00 8.019230769230769607e-01 8.662420382165605393e-01 1.639597834493426165e-01 6.042553191489361680e-02 1.236867239732569179e-01 3.122590593677717630e-01 4.766839378238341696e-01 1.582822085889570574e-01 4.660452729693741886e-02 5.899705014749262455e-03 2.731092436974789928e-02 3.829787234042553168e-02 6.928406466512702401e-03 1.153846153846153910e-02 1.895734597156398249e-02 7.123552123552123749e-01 2.422680412371134018e-01 2.613981762917932938e-01 1.228070175438596423e-01 3.367003367003366943e-02 2.439024390243902524e-02 1.069518716577540045e-02 1.372997711670480465e-02 1.224489795918367319e-01 0.000000000000000000e+00 0.000000000000000000e+00 1.744186046511627883e-02 0.000000000000000000e+00 0.000000000000000000e+00 5.454545454545454281e-02 0.000000000000000000e+00 nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 7.291666666666667129e-02 1.521739130434782705e-01 1.145552560646900253e-01 6.461538461538461620e-02 1.503759398496240518e-01 2.034220532319391539e-01 1.905424200278164060e-01 1.020881670533642649e-01 1.184466019417475674e-01 3.068465767116441700e-01 9.128630705394190359e-02 5.711610486891385841e-02 1.037868162692847096e-01 3.435114503816794063e-02 7.057256990679094955e-02 1.988416988416988329e-01 nan nan nan 3.333333333333333287e-02 nan nan 1.250000000000000000e-01 4.827586206896551935e-01 4.210526315789473450e-01 2.500000000000000000e-01 1.000000000000000000e+00 1.698841698841698777e-01 5.551443375277571868e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.134920634920634885e-01 +1.421800947867298548e-01 1.310344827586207017e-01 2.035398230088495686e-01 7.500000000000000000e-01 1.749999999999999889e-01 1.834862385321101019e-02 3.110047846889952283e-01 2.258064516129032195e-01 1.306532663316583021e-01 1.212121212121212155e-01 1.029411764705882304e-01 1.304347826086956486e-01 3.225806451612903136e-02 0.000000000000000000e+00 2.727272727272727140e-02 4.545454545454545581e-02 3.571428571428571230e-02 0.000000000000000000e+00 nan 1.475409836065573743e-01 1.250000000000000000e-01 9.302325581395348708e-02 4.477611940298507204e-02 4.054054054054054279e-02 1.428571428571428527e-02 0.000000000000000000e+00 3.846153846153846367e-02 nan nan 0.000000000000000000e+00 1.123595505617977497e-02 0.000000000000000000e+00 3.703703703703703498e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.040816326530612082e-02 0.000000000000000000e+00 3.208556149732620655e-02 2.803738317757009310e-02 1.229508196721311453e-01 2.564102564102564014e-02 3.157894736842105365e-02 3.529411764705882304e-02 2.583025830258302638e-02 5.042016806722689204e-02 9.333333333333333759e-02 2.756892230576440950e-02 4.587155963302752548e-02 7.499999999999999722e-02 4.104477611940298559e-02 1.433447098976109169e-01 nan nan nan nan nan nan nan 5.000000000000000278e-02 1.428571428571428492e-01 nan 0.000000000000000000e+00 1.351351351351351426e-02 7.073954983922829676e-02 6.016949152542372392e-01 4.764044943820224809e-01 6.130177514792899407e-01 0.000000000000000000e+00 1.966824644549763079e-01 1.754670999187652181e-01 8.280930992241731792e-01 6.738653001464128822e-01 4.474011439940313584e-01 4.601671309192200687e-01 2.736504543025120029e-01 2.540154669839381207e-01 2.087611225188227282e-01 8.675078864353312491e-02 2.274066797642436133e-01 3.955783655744176674e-01 1.109478324761205004e-01 2.993197278911564549e-02 5.578512396694215031e-02 2.912946428571428492e-01 3.629505448449287242e-01 1.386046511627906930e-01 2.929936305732484120e-02 1.043663471778487756e-01 3.512623490669593979e-02 1.032863849765258274e-01 1.089266737513283761e-01 8.273381294964028687e-02 0.000000000000000000e+00 5.747126436781609116e-02 1.728971962616822344e-01 1.720430107526881858e-01 6.250000000000000000e-02 3.980099502487562113e-02 2.538071065989847691e-02 1.639344262295082053e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 4.347826086956521618e-02 6.310679611650485410e-02 4.663212435233160535e-02 1.147982062780269069e-01 6.901615271659324036e-02 1.336515513126491639e-01 1.842105263157894635e-01 1.202582728006456880e-01 9.769335142469470767e-02 1.914460285132382755e-01 1.162011173184357565e-01 1.836506159014557604e-01 8.263598326359831991e-02 1.855635001702417297e-01 6.186868686868687156e-02 2.103746397694524484e-01 4.860769860769860728e-01 0.000000000000000000e+00 nan nan 2.500000000000000000e-01 nan nan nan 2.162162162162162282e-01 3.589743589743589758e-01 0.000000000000000000e+00 nan 1.859154929577464810e-01 4.614248800295311925e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.982142857142857095e-01 +1.552511415525114069e-01 6.716417910447761153e-02 9.433962264150944077e-02 0.000000000000000000e+00 6.796116504854368690e-02 4.716981132075472039e-02 2.305389221556886359e-01 4.392935982339956080e-01 1.239669421487603340e-01 9.787234042553191737e-02 1.144278606965174194e-01 1.470588235294117627e-02 1.548672566371681325e-01 7.894736842105262720e-02 1.625766871165644223e-01 3.358585858585858563e-01 8.609271523178807506e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.111111111111111049e-01 4.920634920634920362e-01 7.499999999999999722e-02 1.818181818181818094e-02 6.626506024096386060e-02 0.000000000000000000e+00 1.442307692307692388e-02 4.676258992805755466e-02 4.166666666666666435e-02 0.000000000000000000e+00 0.000000000000000000e+00 3.389830508474576259e-02 5.000000000000000278e-02 0.000000000000000000e+00 1.639344262295082053e-02 2.631578947368420907e-02 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 1.250000000000000000e-01 7.692307692307692735e-02 2.061855670103092744e-02 2.173913043478260809e-02 1.043478260869565161e-01 1.052631578947368363e-01 5.999999999999999778e-02 0.000000000000000000e+00 3.070175438596491058e-02 4.313725490196078372e-02 8.547008547008547868e-03 4.050632911392405139e-02 5.033557046979865446e-02 6.756756756756757132e-02 7.518796992481202590e-02 2.732240437158470203e-01 nan nan nan nan nan nan nan 4.545454545454545581e-02 2.631578947368420907e-01 nan nan 4.225352112676056260e-02 3.440366972477064411e-02 4.921030756442227871e-01 3.622722400857449343e-01 4.546568627450980338e-01 5.319148936170212810e-02 1.360174102285092446e-01 1.082746478873239382e-01 6.784692417739628389e-01 8.905685179099572801e-01 4.676958261863922162e-01 3.672014260249554241e-01 2.364990689013035385e-01 3.881773399014778470e-01 3.926780341023068943e-01 2.462882096069869131e-01 3.832236842105263275e-01 6.704217215482379810e-01 2.541544477028347959e-01 4.985337243401759266e-02 7.954545454545454419e-02 2.334774552192711572e-01 5.446841294298921943e-01 1.760840998685939685e-01 4.878048780487805047e-02 3.333333333333333148e-01 6.949352179034157251e-02 2.539981185324552970e-01 2.688953488372092804e-01 7.530647985989491477e-02 3.463203463203463200e-02 4.494382022471909988e-02 2.306034482758620718e-01 2.439024390243902524e-02 6.271777003484320379e-02 6.950672645739910949e-02 6.118881118881119158e-02 2.083333333333333218e-02 0.000000000000000000e+00 0.000000000000000000e+00 6.521739130434782428e-02 3.669724770642202039e-02 0.000000000000000000e+00 5.089820359281437001e-02 3.375527426160337269e-02 1.036941023979261189e-01 7.361268403171007668e-02 1.521252796420581588e-01 1.546162402669633007e-01 1.489526764934057390e-01 1.524201853759011294e-01 2.050147492625368773e-01 1.395348837209302306e-01 2.425793244626407441e-01 1.946949602122015899e-01 2.875571083042193221e-01 1.274976213130352143e-01 3.991717107359031291e-01 6.369068541300527686e-01 7.142857142857142461e-02 nan nan nan nan nan 1.000000000000000000e+00 5.194805194805194315e-01 6.979166666666666297e-01 0.000000000000000000e+00 nan 1.768631813125695340e-01 6.986506746626686137e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.767416934619506885e-01 +6.770833333333332871e-02 6.086956521739130682e-02 6.598984771573604413e-02 nan 1.216931216931216864e-01 2.678571428571428423e-02 1.354723707664884091e-01 4.092071611253197266e-02 1.518438177874186501e-01 1.624365482233502411e-01 7.327586206896551102e-02 7.055961070559610415e-02 8.361204013377926403e-02 5.263157894736841813e-02 9.750566893424036929e-02 5.504587155963303058e-02 7.228915662650602092e-02 0.000000000000000000e+00 2.912621359223301065e-02 4.362416107382550284e-02 8.888888888888889228e-02 5.084745762711864736e-02 1.587301587301587213e-02 1.764705882352941152e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.040816326530612082e-02 1.111111111111111049e-01 0.000000000000000000e+00 0.000000000000000000e+00 2.339181286549707472e-02 2.941176470588235253e-02 1.000000000000000056e-01 4.347826086956521618e-02 0.000000000000000000e+00 nan nan nan nan nan nan nan 1.000000000000000000e+00 1.327433628318584191e-01 1.463414634146341375e-01 1.226415094339622647e-01 3.846153846153846367e-02 9.523809523809523281e-02 1.333333333333333315e-01 1.481481481481481538e-02 9.842519685039370636e-02 4.651162790697674354e-02 6.276150627615062483e-02 9.523809523809523281e-02 1.232876712328767055e-01 5.673758865248226813e-02 1.440677966101694962e-01 nan nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 8.000000000000000167e-02 9.731543624161073658e-02 2.315465729349736324e-01 2.384428223844282102e-01 2.773386034255599375e-01 1.250000000000000000e-01 1.313506815365551306e-01 1.095334685598377267e-01 3.982080637132902057e-01 3.948115119578435306e-01 6.232546331556232388e-01 4.277144571085783054e-01 2.828139754485363699e-01 3.863337713534822360e-01 2.542467279309384431e-01 2.257304429783223432e-01 3.774250440917107374e-01 1.894238358326756078e-01 1.486028789161727426e-01 6.768265351860151824e-02 6.714060031595577016e-02 1.774033696729435117e-01 3.751062022090059234e-01 1.578372474057891939e-01 1.000000000000000056e-01 9.163059163059163181e-02 4.679284963196635172e-02 1.448863636363636465e-01 1.316897173782321240e-01 7.939508506616256567e-02 4.294478527607362150e-02 8.108108108108108558e-02 1.695906432748537918e-01 8.396946564885496289e-02 1.428571428571428492e-01 1.046511627906976799e-01 8.812949640287769115e-02 0.000000000000000000e+00 2.500000000000000000e-01 0.000000000000000000e+00 nan 1.875000000000000000e-01 0.000000000000000000e+00 1.323529411764705899e-01 5.555555555555555247e-02 5.584129316678912436e-02 4.651162790697674354e-02 5.786618444846292758e-02 4.477611940298507204e-02 5.740181268882175308e-02 8.291873963515754287e-02 8.866995073891625889e-02 7.223708582012759727e-02 8.080808080808081495e-02 6.487617718869899408e-02 6.164582727537074730e-02 6.064073226544622330e-02 9.492515516611901849e-02 2.261940522679483367e-01 0.000000000000000000e+00 nan nan 8.000000000000000444e-01 nan nan 0.000000000000000000e+00 3.636363636363636465e-01 3.181818181818181768e-01 0.000000000000000000e+00 nan 6.947608200455580862e-02 4.509618416903184851e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.152941176470588358e-01 +8.661417322834645549e-02 1.408450704225352179e-01 1.190476190476190410e-01 nan 2.222222222222222099e-01 7.692307692307692735e-02 2.000000000000000111e-01 6.250000000000000000e-02 1.052631578947368363e-01 8.536585365853659180e-02 1.186440677966101725e-01 9.523809523809523281e-02 4.166666666666666435e-02 1.030927835051546372e-02 2.500000000000000139e-02 0.000000000000000000e+00 1.666666666666666574e-01 nan 0.000000000000000000e+00 3.333333333333333287e-02 3.614457831325301046e-02 2.307692307692307820e-01 0.000000000000000000e+00 0.000000000000000000e+00 nan 1.250000000000000000e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan nan nan nan nan nan nan nan 3.111111111111111022e-02 0.000000000000000000e+00 2.631578947368420907e-02 2.325581395348837177e-02 1.498127340823970054e-02 4.545454545454545234e-03 1.204819277108433798e-02 1.825293350717079391e-02 0.000000000000000000e+00 1.960784313725490169e-02 1.086956521739130405e-02 1.666666666666666574e-01 0.000000000000000000e+00 5.504587155963303058e-02 nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 6.993006993006993001e-03 2.040816326530612082e-02 3.647840531561462041e-01 5.161616161616161547e-01 4.775967413441954967e-01 5.000000000000000000e-01 3.517635843660629202e-01 2.866836301950805854e-01 4.703100367840252205e-01 2.783861671469740617e-01 4.667822068168688832e-01 7.561513037091442957e-01 3.340434597358329927e-01 2.277877161598091948e-01 1.198412698412698457e-01 6.622516556291391243e-02 1.819727891156462662e-01 6.001446131597975436e-02 5.611222444889779615e-02 1.892744479495268167e-02 5.213270142180094491e-02 3.314220183486238369e-01 1.693386773547094215e-01 7.042253521126760896e-02 9.032258064516128504e-02 1.684532924961715250e-02 4.602510460251046237e-02 4.761904761904761640e-02 4.069767441860465407e-02 1.025641025641025605e-01 0.000000000000000000e+00 0.000000000000000000e+00 3.191489361702127409e-02 nan nan 4.347826086956521618e-02 1.296296296296296224e-01 nan nan nan nan 0.000000000000000000e+00 nan 5.357142857142856845e-02 0.000000000000000000e+00 3.571428571428571230e-02 3.367875647668393951e-02 3.557312252964427157e-02 4.038772213247172893e-02 4.945717732207478845e-02 5.448717948717948789e-02 9.018036072144289261e-02 6.532336691582710242e-02 5.000000000000000278e-02 3.977724741447891815e-02 5.393939393939393978e-02 1.846153846153846326e-02 4.314720812182740867e-02 1.950000000000000067e-01 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan nan nan 6.428571428571429047e-01 2.424242424242424310e-01 0.000000000000000000e+00 0.000000000000000000e+00 4.385964912280701511e-02 2.090137165251469697e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.064133016627078598e-01 +2.580645161290322578e-02 2.192982456140350755e-02 3.305785123966942241e-02 nan 3.802083333333333148e-01 7.386363636363636742e-02 4.602510460251046237e-02 1.550387596899224785e-02 2.564102564102564014e-02 1.693548387096774077e-01 4.201877934272300608e-01 8.022922636103152483e-02 4.382470119521912622e-02 4.137931034482758563e-02 4.464285714285714385e-02 0.000000000000000000e+00 8.333333333333332871e-02 1.960784313725490169e-02 0.000000000000000000e+00 5.400000000000000355e-01 1.711229946524064072e-01 7.228915662650602092e-02 0.000000000000000000e+00 nan 6.666666666666666574e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.960396039603960444e-02 2.631578947368420907e-02 2.000000000000000111e-01 3.641456582633053468e-02 nan 4.597701149425287293e-02 0.000000000000000000e+00 nan 1.818181818181818094e-02 1.081081081081081141e-01 nan nan nan nan nan nan nan 1.388888888888888951e-01 0.000000000000000000e+00 nan nan 1.075268817204301161e-02 1.904761904761904934e-02 3.841515934539190269e-01 3.037280701754385692e-01 3.272727272727272707e-01 6.666666666666666297e-01 5.373352855051244381e-01 4.770206022187004624e-01 2.503945291951604202e-01 1.948640483383685673e-01 3.045182111572152794e-01 4.332176929748482452e-01 7.165131112686038417e-01 4.682146935668062282e-01 1.803797468354430278e-01 1.126005361930294962e-01 1.290601992204417625e-01 3.682539682539682363e-02 5.048335123523093465e-02 4.018547140649150057e-02 5.384615384615384914e-02 6.577319587628865927e-01 4.691780821917808098e-01 2.551505546751188791e-01 2.994350282485875869e-01 2.064220183486238647e-02 3.614457831325301046e-02 6.250000000000000000e-02 3.954802259887005983e-02 2.941176470588235253e-02 9.090909090909091161e-02 6.451612903225806273e-02 2.419354838709677352e-02 4.761904761904761640e-02 nan 3.404255319148936088e-01 1.777777777777777846e-01 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 1.818181818181818094e-02 0.000000000000000000e+00 7.550077041602465400e-02 3.004291845493562221e-02 4.787234042553191460e-02 5.360443622920517404e-02 1.201923076923076955e-01 6.108597285067873112e-02 1.056910569105691117e-01 1.883852691218130260e-01 3.125000000000000000e-02 4.403866809881847727e-02 1.000685400959561294e-01 1.358695652173913006e-02 3.717026378896882283e-02 2.319672131147541005e-01 0.000000000000000000e+00 nan nan 1.000000000000000056e-01 nan nan 0.000000000000000000e+00 8.947368421052631637e-01 5.000000000000000000e-01 nan nan 7.262569832402235304e-02 4.968944099378881651e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.033942558746736129e-01 +5.454545454545454281e-02 4.166666666666666435e-02 1.304347826086956486e-01 nan 8.000000000000000167e-02 1.718750000000000000e-01 3.191489361702127409e-02 1.063829787234042562e-01 5.515587529976018893e-02 1.098265895953757232e-01 1.890756302521008347e-01 2.690582959641255600e-01 1.873015873015873023e-01 6.083650190114068407e-02 1.373134328358208978e-01 0.000000000000000000e+00 6.862745098039216285e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.142857142857142738e-01 4.568965517241379559e-01 1.034482758620689641e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.084745762711864736e-02 0.000000000000000000e+00 nan 2.000000000000000111e-01 3.225806451612903136e-02 0.000000000000000000e+00 0.000000000000000000e+00 3.030303030303030387e-02 0.000000000000000000e+00 nan nan nan nan nan nan nan nan 3.571428571428571230e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.260869565217391214e-02 7.692307692307692735e-02 3.333333333333333148e-01 3.409090909090908839e-02 1.428571428571428492e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.173913043478260809e-02 6.185567010309278579e-02 nan nan nan nan nan nan nan 0.000000000000000000e+00 2.000000000000000111e-01 nan nan 5.263157894736841813e-02 2.479338842975206680e-02 2.247765006385696041e-01 2.347354138398914380e-01 2.190016103059581332e-01 nan 2.417251755265797386e-01 2.220956719817767655e-01 2.617486338797814227e-01 3.403656821378340247e-01 4.721465709333993455e-01 2.872807017543859698e-01 4.536082474226804107e-01 7.659033078880407297e-01 4.840864440078585518e-01 3.445800430725053931e-01 4.106422018348623859e-01 1.063420884048686677e-01 9.045584045584045829e-02 4.240000000000000019e-02 6.211180124223602411e-02 3.220000000000000084e-01 6.377829820452771692e-01 3.602693602693602948e-01 2.347417840375586873e-01 4.657293497363795831e-02 3.606237816764132353e-02 7.486631016042780140e-02 3.773584905660377214e-02 1.652892561983471120e-02 3.305785123966942241e-02 0.000000000000000000e+00 6.722689075630251809e-02 2.941176470588235253e-02 0.000000000000000000e+00 8.333333333333332871e-02 1.269841269841269771e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 2.083333333333333218e-02 1.000000000000000056e-01 4.731861198738170071e-02 5.434782608695652023e-02 6.336088154269972628e-02 4.870129870129870364e-02 1.456692913385826682e-01 1.535580524344569153e-01 1.694915254237288060e-01 1.525759577278731904e-01 6.382978723404254817e-02 3.354037267080745011e-02 7.846889952153110470e-02 2.090592334494773691e-02 5.865384615384615363e-02 2.575516693163751869e-01 0.000000000000000000e+00 nan nan 2.857142857142856984e-01 nan nan nan 5.609756097560976151e-01 2.641509433962264120e-01 nan nan 9.743589743589743668e-02 6.519065190651907038e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.655486071631608991e-01 +1.369863013698630061e-02 2.205882352941176613e-02 1.086956521739130405e-02 nan 0.000000000000000000e+00 2.816901408450704289e-02 7.555555555555555636e-02 8.139534883720930813e-02 4.285714285714285754e-02 5.294117647058823456e-02 1.003134796238244475e-01 1.162790697674418589e-01 5.330112721417069599e-01 2.740963855421686968e-01 1.610169491525423602e-01 6.086956521739130682e-02 1.526479750778816091e-01 1.749999999999999889e-01 2.066115702479338900e-01 7.333333333333333370e-02 5.061728395061728669e-01 3.051948051948051854e-01 0.000000000000000000e+00 7.692307692307692735e-02 4.000000000000000083e-02 2.702702702702702853e-02 4.587155963302752548e-02 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 nan nan 6.666666666666666574e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 2.380952380952380820e-02 1.470588235294117627e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.153846153846153910e-01 4.761904761904761640e-02 2.962962962962963076e-02 1.692307692307692402e-01 nan nan nan nan nan nan nan 2.777777777777777624e-02 2.500000000000000000e-01 nan nan 2.857142857142857054e-02 4.347826086956521618e-02 1.119133574007220161e-01 5.580215599239061325e-02 8.071748878923766524e-02 2.000000000000000042e-02 5.664488017429193667e-02 4.906333630686886965e-02 1.609006040637012691e-01 2.981366459627329268e-01 2.747807017543859587e-01 1.787819253438114042e-01 1.788102780711017248e-01 4.854815864022662963e-01 6.568126847621607034e-01 6.525840853158326738e-01 4.614994934143870076e-01 3.604135893648449107e-01 4.025604551920341501e-01 4.248366013071895320e-01 4.149704530531845292e-01 1.269554753309266037e-01 7.070985527222605205e-01 5.264169068203650159e-01 8.021390374331550943e-02 1.626336522228475079e-01 1.483803552769069889e-01 8.454810495626821631e-02 9.736842105263157632e-02 1.610942249240121527e-01 9.192200557103064051e-02 1.059602649006622516e-01 9.181636726546905936e-02 8.163265306122448328e-02 7.142857142857142461e-02 1.056511056511056507e-01 1.646942800788954719e-01 2.173913043478260809e-02 3.200000000000000067e-02 2.325581395348837177e-02 5.555555555555555247e-02 6.451612903225806273e-02 3.846153846153846367e-02 1.673640167364016593e-02 0.000000000000000000e+00 3.061224489795918297e-02 1.030303030303030276e-01 7.359307359307359908e-02 4.240282685512367783e-02 2.747252747252747207e-02 5.769230769230769551e-02 4.746835443037975000e-02 3.981481481481481677e-02 3.517587939698492427e-02 3.352490421455938535e-02 4.187437686939182724e-02 3.311258278145695622e-02 2.009222661396574405e-01 2.046511627906976716e-01 0.000000000000000000e+00 nan nan 7.291666666666666297e-01 nan nan nan 3.090909090909090828e-01 5.076923076923076650e-01 nan nan 6.111111111111110911e-02 6.752037252619325081e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.522388059701492269e-01 +0.000000000000000000e+00 0.000000000000000000e+00 6.666666666666666574e-02 nan 0.000000000000000000e+00 0.000000000000000000e+00 2.127659574468085055e-02 1.875000000000000000e-01 3.351955307262569767e-02 1.098901098901098987e-02 7.246376811594203160e-02 5.208333333333333565e-02 3.567839195979899403e-01 4.239130434782608647e-01 1.402439024390244038e-01 0.000000000000000000e+00 6.896551724137930939e-02 2.531645569620253333e-01 1.153846153846153910e-01 1.785714285714285615e-02 2.413793103448275967e-01 1.445783132530120418e-01 0.000000000000000000e+00 1.304347826086956486e-01 4.761904761904761640e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan 6.451612903225806273e-02 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan 2.500000000000000000e-01 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan 5.882352941176470507e-02 1.111111111111111049e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.000000000000000278e-02 3.571428571428571230e-02 nan nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan 1.428571428571428492e-01 5.364806866952789854e-02 1.307086614173228467e-01 7.920792079207920888e-02 0.000000000000000000e+00 6.557377049180328210e-02 2.770780856423173816e-02 1.095360824742268036e-01 1.915559030492572368e-01 3.125965996908809941e-01 1.102941176470588203e-01 1.445591739475774462e-01 3.114754098360655865e-01 6.945626477541371191e-01 7.966101694915254106e-01 5.469358838115480070e-01 2.518765638031693066e-01 3.934328358208954990e-01 5.061188811188811476e-01 4.279792746113989521e-01 6.655290102389078977e-02 4.633569739952718702e-01 4.529914529914529919e-01 6.103286384976525786e-02 9.260908281389136631e-02 1.220630372492836624e-01 6.972111553784859916e-02 1.250000000000000000e-01 2.770137524557956810e-01 1.939655172413793094e-01 3.114754098360655865e-01 1.690140845070422504e-01 1.985815602836879523e-01 0.000000000000000000e+00 2.647058823529411797e-01 3.803680981595092270e-01 0.000000000000000000e+00 0.000000000000000000e+00 2.380952380952380820e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.408450704225352144e-02 8.791208791208791895e-02 1.600000000000000033e-02 4.065040650406503975e-02 1.941747572815533812e-02 6.382978723404254817e-02 1.851851851851851749e-02 4.308797127468581845e-02 5.309734513274336209e-02 5.060728744939271134e-02 4.347826086956521618e-02 1.351351351351351426e-02 8.088235294117647467e-02 1.057692307692307682e-01 0.000000000000000000e+00 nan nan nan nan nan nan 1.499999999999999944e-01 5.000000000000000000e-01 nan nan 2.325581395348837177e-02 5.785123966942148921e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.616402116402116285e-01 +1.098901098901098987e-02 1.369863013698630061e-02 1.509433962264150886e-01 nan 0.000000000000000000e+00 2.985074626865671585e-02 8.843537414965986498e-02 1.694915254237288130e-02 5.104408352668213245e-02 2.500000000000000139e-02 2.463054187192118341e-02 9.433962264150944077e-02 1.675126903553299518e-01 1.351351351351351426e-01 4.137115839243498683e-01 2.000000000000000042e-02 2.149122807017543879e-01 1.342592592592592726e-01 4.545454545454545581e-02 2.631578947368420907e-02 2.166666666666666741e-01 1.673819742489270346e-01 0.000000000000000000e+00 9.278350515463917869e-02 1.197604790419161749e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.500000000000000000e-01 0.000000000000000000e+00 nan nan nan nan nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.666666666666666574e-01 0.000000000000000000e+00 6.250000000000000000e-01 0.000000000000000000e+00 5.333333333333333676e-02 1.960784313725490169e-02 0.000000000000000000e+00 7.462686567164178442e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.298850574712643646e-02 nan nan nan nan nan nan nan 6.818181818181817677e-02 7.692307692307692735e-02 nan nan 0.000000000000000000e+00 8.474576271186440302e-02 1.170768083519761332e-01 9.489051094890510463e-02 1.895074946466809296e-01 5.555555555555555247e-02 5.538461538461538630e-02 4.416666666666666657e-02 2.320328542094455826e-01 3.569457221711131445e-01 3.897571078892864138e-01 2.097902097902097918e-01 1.547708489857250180e-01 3.910189982728842772e-01 4.983138780804150514e-01 5.319755600814664032e-01 7.189437887577515562e-01 3.015304461087593424e-01 4.756828780812791257e-01 2.421087978509066374e-01 1.706070287539936114e-01 6.663113006396588489e-02 3.539921831379117534e-01 2.789215686274509887e-01 1.869328493647912925e-01 1.688043028547786539e-01 1.010060362173038212e-01 2.581521739130434590e-01 2.014531043593130732e-01 1.311111111111111227e-01 1.596330275229357887e-01 2.624434389140271606e-01 3.811023622047244319e-01 3.901098901098901117e-01 3.793103448275861878e-01 2.373333333333333406e-01 2.917964693665628384e-01 4.166666666666666435e-02 0.000000000000000000e+00 3.333333333333333148e-01 5.000000000000000000e-01 1.250000000000000000e-01 6.976744186046511531e-02 1.818181818181818094e-02 1.609195402298850552e-01 5.496828752642705929e-02 8.000000000000000167e-02 3.541666666666666574e-02 2.087682672233820425e-02 2.816901408450704289e-02 1.409691629955947267e-01 1.426056338028169057e-01 6.619718309859154437e-02 1.825396825396825295e-01 6.467661691542288260e-02 4.822954822954823167e-02 4.435483870967742159e-02 1.179535765040265333e-01 1.134474327628361839e-01 0.000000000000000000e+00 nan nan 1.000000000000000000e+00 nan nan nan 2.098765432098765316e-01 4.027777777777777901e-01 nan nan 5.487804878048780505e-02 3.724394785847300049e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.462631253860407932e-01 +3.200000000000000067e-02 6.756756756756757132e-02 0.000000000000000000e+00 nan 2.142857142857142738e-01 1.818181818181818094e-02 9.665427509293680886e-02 2.229299363057324901e-01 1.023622047244094474e-01 9.259259259259258745e-02 0.000000000000000000e+00 1.111111111111111049e-01 3.409090909090908839e-01 1.166666666666666685e-01 1.848739495798319421e-01 4.301994301994301884e-01 2.154696132596685132e-01 4.477611940298507204e-02 6.896551724137930939e-02 1.111111111111111049e-01 1.927710843373494076e-01 2.016129032258064391e-01 2.127659574468085055e-02 1.633333333333333304e-01 3.636363636363636187e-02 2.054794520547945091e-02 4.195804195804195974e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.818181818181818094e-02 4.347826086956521618e-02 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.173913043478260809e-02 4.000000000000000083e-02 2.142857142857142877e-02 2.380952380952380820e-02 0.000000000000000000e+00 5.000000000000000278e-02 2.941176470588235253e-02 1.612903225806451568e-02 3.319502074688796683e-02 2.874743326488706299e-02 1.111111111111111154e-02 1.207729468599033802e-02 3.215434083601285964e-02 5.555555555555555247e-02 1.716937354988399000e-01 1.308411214953270896e-01 nan nan nan nan nan nan nan 4.166666666666666435e-02 1.290322580645161255e-01 nan nan 1.123595505617977497e-01 3.389830508474576259e-02 1.269709543568464660e-01 1.615667074663402758e-01 9.415971394517282100e-02 0.000000000000000000e+00 2.409638554216867595e-02 3.636363636363636187e-02 2.938144329896907325e-01 6.284606866002214742e-01 2.006726457399103103e-01 1.113138686131386890e-01 5.587892898719441087e-02 1.358313817330210893e-01 4.093859211183225044e-01 2.093023255813953598e-01 2.786638579596749654e-01 8.017789072426937391e-01 5.040265277119848619e-01 2.318921953958450188e-01 1.940441882804995188e-01 4.219948849104859095e-02 4.225245653817082392e-01 2.806824435883324420e-01 2.333333333333333440e-02 7.162478082992401740e-01 1.767348976535197125e-01 2.555133079847908828e-01 4.887023886378308313e-01 1.534954407294832901e-01 7.506702412868632157e-02 3.930131004366812369e-02 8.761583824768323647e-02 2.136752136752136794e-02 8.467741935483870386e-02 3.864734299516908028e-02 6.815511163337249767e-02 6.024096385542168641e-02 0.000000000000000000e+00 0.000000000000000000e+00 3.448275862068965469e-02 8.270676691729322849e-02 3.738317757009345516e-02 2.448210922787193849e-02 4.193548387096774493e-02 1.289288005131494497e-01 6.356968215158924351e-02 1.048728813559322015e-01 1.135321100917431186e-01 1.073318216175359052e-01 1.054006968641114927e-01 1.180040458530006720e-01 9.498680738786278999e-02 1.306930693069306981e-01 2.896886166411434260e-01 2.987158012283640529e-01 2.762520193861066065e-01 6.376327769347496233e-01 4.140625000000000000e-01 0.000000000000000000e+00 nan nan 6.875000000000000000e-01 nan nan 1.000000000000000000e+00 1.568627450980392135e-01 7.377049180327869271e-01 0.000000000000000000e+00 nan 1.563682219419924302e-01 6.086956521739130682e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.024691358024691246e-01 +2.000000000000000042e-02 4.000000000000000083e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 4.391891891891892136e-02 8.264462809917355601e-03 4.571428571428571425e-02 0.000000000000000000e+00 3.921568627450980338e-02 1.449275362318840597e-02 1.488549618320610668e-01 7.575757575757575968e-03 1.194539249146757687e-01 5.232558139534883995e-02 4.269662921348314488e-01 2.299465240641711261e-01 7.692307692307692735e-02 0.000000000000000000e+00 9.411764705882352811e-02 1.123595505617977497e-01 0.000000000000000000e+00 2.016806722689075682e-01 1.412429378531073476e-01 7.407407407407407690e-03 2.616279069767441998e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.851851851851851749e-02 3.030303030303030387e-02 1.000000000000000056e-01 0.000000000000000000e+00 nan nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 1.111111111111111049e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.846153846153846367e-02 0.000000000000000000e+00 2.830188679245283084e-02 5.769230769230769551e-02 0.000000000000000000e+00 2.332361516034985385e-02 3.015075376884421982e-02 nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 2.000000000000000111e-01 2.380952380952380820e-02 5.197132616487454976e-02 4.194260485651214038e-02 3.734439834024896182e-02 nan 4.301075268817204644e-02 1.397205588822355259e-02 1.174477696216826711e-01 2.036563071297989025e-01 1.825581395348837288e-01 8.525033829499323312e-02 6.310254163014898665e-02 1.167002012072434619e-01 3.850148367952522244e-01 3.371513944223107351e-01 4.220365075874202843e-01 4.760233918128655151e-01 7.451580020387359449e-01 5.532094594594594295e-01 3.522588522588522841e-01 5.723905723905724219e-02 1.753355704697986683e-01 4.043412417970722039e-01 7.573415765069552164e-02 4.624373956594323709e-01 3.371165644171779108e-01 2.742268041237113652e-01 3.225388601036269232e-01 2.116716122650840748e-01 2.163588390501319236e-01 1.527093596059113378e-01 1.637831603229527033e-01 1.079545454545454558e-01 2.674418604651162545e-01 1.039999999999999952e-01 1.139240506329113889e-01 7.547169811320754429e-02 0.000000000000000000e+00 1.578947368421052544e-01 9.090909090909091161e-02 1.973684210526315819e-01 1.562500000000000000e-02 3.105590062111801206e-02 8.791208791208791895e-02 5.165289256198347251e-02 7.874015748031495954e-02 3.690036900369003583e-03 2.127659574468085055e-02 3.246753246753246447e-02 9.909909909909909997e-02 8.847736625514403264e-02 5.019815059445178335e-02 2.231884057971014468e-01 1.184062850729517419e-01 4.875076173065204244e-02 1.243339253996447596e-01 2.115041086102179280e-01 6.373626373626373187e-02 2.500000000000000000e-01 nan nan 1.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 3.571428571428571508e-01 nan nan 4.000000000000000083e-02 4.599524187153053445e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.947332653754671905e-01 +4.347826086956521618e-02 7.142857142857142461e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 5.442176870748299117e-02 2.000000000000000042e-02 4.184100418410041482e-03 7.499999999999999722e-02 8.333333333333332871e-02 2.484472049689440826e-02 1.780821917808219079e-01 9.523809523809523281e-02 6.271777003484320379e-02 2.906976744186046471e-02 9.282700421940928703e-02 3.869346733668341809e-01 2.682926829268292845e-01 0.000000000000000000e+00 2.999999999999999889e-02 2.658227848101265556e-01 0.000000000000000000e+00 4.072398190045248972e-02 8.333333333333332871e-02 1.058823529411764691e-01 8.720930232558139761e-02 2.800000000000000266e-01 0.000000000000000000e+00 0.000000000000000000e+00 4.166666666666666435e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.785714285714285615e-02 1.702127659574468044e-01 0.000000000000000000e+00 nan nan nan nan nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 3.191489361702127409e-02 1.886792452830188815e-01 1.351351351351351426e-02 4.347826086956521618e-02 0.000000000000000000e+00 1.538461538461538547e-02 0.000000000000000000e+00 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan nan 3.636363636363636187e-02 5.982905982905983161e-02 2.946273830155979323e-02 3.971119133574007448e-02 0.000000000000000000e+00 2.283105022831050102e-02 1.003344481605351196e-02 5.534709193245778563e-02 6.993603411513858725e-02 9.713416180573167247e-02 5.893909626719057160e-02 7.455268389662027262e-02 9.395677106307895321e-02 3.818224408526587066e-01 4.648481439820022487e-01 2.328692822274452956e-01 2.099582172701949800e-01 4.560260586319218046e-01 7.573049157786180263e-01 6.361795477556531075e-01 3.249097472924187407e-02 1.491638795986622024e-01 5.341745531019979065e-01 6.165228113440197194e-02 1.672036082474226693e-01 4.195705024311183196e-01 1.232020012507817341e-01 1.387367652427893283e-01 3.517495395948434522e-01 1.497435897435897556e-01 9.115281501340483095e-02 7.198306280875088614e-02 6.534090909090908839e-02 1.111111111111111049e-01 8.112094395280236570e-02 1.778557114228457026e-01 5.479452054794520244e-02 4.347826086956521618e-02 0.000000000000000000e+00 0.000000000000000000e+00 3.529411764705882304e-02 4.761904761904761640e-02 2.380952380952380820e-02 6.060606060606060774e-02 2.575107296137339047e-02 2.212389380530973421e-02 3.370786516853932491e-02 2.688172043010752729e-02 3.314917127071823066e-02 1.702127659574468113e-02 4.022988505747126381e-02 2.310924369747899276e-02 2.153110047846890085e-02 3.092783505154639290e-02 3.493788819875776053e-02 4.464285714285714385e-02 1.470301850048685577e-01 2.898550724637681195e-02 0.000000000000000000e+00 nan nan 8.750000000000000000e-01 nan nan nan 7.936507936507936067e-02 2.999999999999999889e-01 nan nan 2.000000000000000042e-02 2.643678160919540193e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 5.202903332233586031e-01 +0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 9.090909090909091161e-02 2.325581395348837177e-02 3.030303030303030387e-02 3.333333333333333148e-01 4.347826086956521618e-02 6.818181818181817677e-02 3.106796116504854099e-01 8.888888888888889228e-02 1.318681318681318715e-01 0.000000000000000000e+00 1.499999999999999944e-01 3.134328358208955390e-01 6.507936507936508130e-01 3.571428571428571230e-02 8.333333333333332871e-02 4.516129032258064391e-01 3.846153846153846367e-02 9.090909090909091161e-02 8.695652173913043237e-02 1.428571428571428492e-01 2.250000000000000056e-01 1.153846153846153910e-01 1.000000000000000056e-01 nan 4.054054054054054279e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.250000000000000000e-01 3.333333333333333148e-01 nan nan nan nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.857142857142857054e-02 3.703703703703703498e-02 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan nan 0.000000000000000000e+00 1.734104046242774394e-02 3.074141048824593006e-02 5.243445692883895448e-02 0.000000000000000000e+00 2.877697841726618855e-02 4.472843450479233041e-02 4.279600570613409372e-02 5.804416403785488815e-02 8.369868473495416239e-02 3.857566765578634982e-02 6.104129263913823933e-02 1.026785714285714246e-01 4.048414023372287063e-01 4.285714285714285476e-01 1.447242588460312396e-01 1.691410392364793291e-01 3.177290836653386408e-01 7.170278637770898245e-01 8.930163447251114883e-01 4.000000000000000083e-02 2.777115613825983376e-01 6.995073891625616103e-01 1.370078740157480435e-01 1.408302679978980509e-01 4.015073655361425242e-01 1.089193825042881619e-01 1.501272264631043352e-01 4.581151832460733098e-01 1.761363636363636465e-01 1.141868512110726652e-01 6.926751592356687748e-02 1.030927835051546337e-01 1.168831168831168804e-01 1.144674085850556494e-01 4.047477744807121414e-01 4.255319148936170109e-02 5.769230769230769551e-02 7.894736842105262720e-02 0.000000000000000000e+00 7.874015748031495954e-03 1.333333333333333419e-02 1.438848920863309427e-02 0.000000000000000000e+00 5.161290322580645157e-02 5.369127516778523374e-02 1.023255813953488358e-01 8.928571428571428076e-03 2.752293577981651529e-02 0.000000000000000000e+00 1.827676240208877395e-02 7.816711590296496204e-02 4.956268221574344074e-02 4.494382022471909988e-02 3.379224030037546872e-02 7.446808510638297518e-02 1.994505494505494636e-01 2.728731942215088455e-02 0.000000000000000000e+00 nan nan 7.916666666666666297e-01 nan nan nan 0.000000000000000000e+00 2.874251497005987921e-01 nan nan 0.000000000000000000e+00 2.310231023102310086e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.474393530997304858e-01 +1.021276595744680799e-01 1.046511627906976799e-01 6.060606060606060774e-02 nan 6.610169491525423879e-01 3.128834355828221114e-01 1.093750000000000000e-01 4.958677685950413361e-02 9.600000000000000200e-02 1.678321678321678390e-01 6.133828996282527646e-01 9.663865546218487756e-02 1.076923076923076983e-01 4.580152671755725186e-02 4.643962848297213813e-02 7.476635514018691031e-02 0.000000000000000000e+00 0.000000000000000000e+00 6.666666666666666574e-02 7.430167597765363618e-01 3.282051282051282048e-01 2.500000000000000000e-01 0.000000000000000000e+00 1.176470588235294101e-02 0.000000000000000000e+00 0.000000000000000000e+00 8.823529411764706454e-02 nan nan 0.000000000000000000e+00 7.751937984496123923e-03 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan 1.639344262295082053e-02 0.000000000000000000e+00 8.620689655172414367e-02 0.000000000000000000e+00 5.625000000000000139e-02 5.999999999999999778e-02 1.600000000000000033e-02 5.337078651685393110e-02 0.000000000000000000e+00 1.515151515151515194e-02 4.294478527607362150e-02 1.923076923076923184e-02 5.343511450381679267e-02 1.929824561403508665e-01 nan nan nan nan nan nan nan 2.999999999999999889e-01 nan nan nan 2.884615384615384776e-02 3.940886699507389207e-02 5.021422450728363351e-01 4.187979539641943916e-01 2.690763052208835493e-01 0.000000000000000000e+00 7.151370679380214535e-01 6.885245901639344135e-01 2.275975810885101647e-01 1.437234687689508683e-01 2.129952456418383600e-01 3.678097345132743112e-01 6.802523047064531481e-01 2.923728813559322015e-01 1.267842149454240230e-01 6.261510128913444495e-02 6.082289803220036067e-02 3.234686854783207222e-02 3.035143769968050992e-02 2.189781021897810320e-02 1.992031872509960125e-02 8.833461243284727038e-01 6.079999999999999849e-01 3.080724876441515714e-01 1.631205673758865382e-01 2.512562814070351883e-02 2.261306532663316660e-02 7.168458781362006815e-02 1.757469244288225110e-02 4.615384615384615641e-02 3.703703703703703498e-02 0.000000000000000000e+00 1.126126126126126142e-01 0.000000000000000000e+00 0.000000000000000000e+00 1.014492753623188470e-01 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 nan 5.319148936170212810e-02 3.174603174603174427e-02 6.360946745562130744e-02 5.466237942122186694e-02 1.026119402985074675e-01 1.254125412541254037e-01 4.596100278551532026e-02 5.729166666666666435e-02 5.861456483126110256e-02 8.486140724946694691e-02 2.845528455284552713e-02 2.358078602620087422e-02 5.902306648575305487e-02 3.317535545023696936e-02 5.876494023904382802e-02 4.104938271604938183e-01 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan nan nan 4.166666666666666852e-01 2.000000000000000111e-01 3.333333333333333148e-01 0.000000000000000000e+00 2.798982188295165430e-01 4.713375796178344290e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.183722321962896284e-01 +1.470588235294117696e-01 0.000000000000000000e+00 1.818181818181818232e-01 nan 0.000000000000000000e+00 8.888888888888889228e-02 1.194029850746268634e-01 1.250000000000000000e-01 5.853658536585366196e-02 2.150537634408602322e-02 1.869918699186991773e-01 1.849315068493150582e-01 3.691588785046728827e-01 9.756097560975610095e-02 7.142857142857142461e-02 2.941176470588235253e-02 9.195402298850574585e-02 4.838709677419354704e-02 9.859154929577464144e-02 3.666666666666666408e-01 6.790123456790123635e-01 4.747474747474747514e-01 6.896551724137930939e-02 7.142857142857142461e-02 1.639344262295082053e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.860465116279069742e-01 0.000000000000000000e+00 0.000000000000000000e+00 1.379310344827586188e-01 1.666666666666666574e-01 0.000000000000000000e+00 nan nan nan nan nan nan nan 5.999999999999999778e-01 nan 0.000000000000000000e+00 nan 7.272727272727272929e-01 0.000000000000000000e+00 nan 1.025641025641025605e-01 0.000000000000000000e+00 0.000000000000000000e+00 2.666666666666666630e-01 0.000000000000000000e+00 1.250000000000000000e-01 3.709677419354838745e-01 nan nan nan nan nan nan nan 2.500000000000000000e-01 1.333333333333333315e-01 nan nan 7.692307692307692735e-02 1.578947368421052544e-01 2.836624775583482805e-01 2.488479262672811110e-01 1.313559322033898413e-01 0.000000000000000000e+00 4.434180138568129537e-01 4.382608695652173703e-01 2.251876563803169307e-01 3.736762481089258570e-01 3.612228479485116717e-01 2.418367346938775642e-01 4.743083003952568988e-01 5.637216575449569556e-01 6.484716157205240306e-01 3.324250681198910318e-01 2.693901716992302964e-01 2.918552036199095201e-01 1.494903737259343224e-01 1.138211382113821085e-01 3.919156414762741680e-01 5.773092369477911268e-01 9.512195121951219079e-01 7.377830750893921152e-01 5.018450184501844769e-01 1.032608695652173919e-01 4.177545691906005276e-02 1.099656357388316130e-01 6.436420722135008377e-02 1.478873239436619691e-01 1.343283582089552231e-01 5.970149253731343170e-02 6.882591093117408632e-02 1.212121212121212155e-01 1.199999999999999956e-01 1.812080536912751560e-01 1.780303030303030387e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.960784313725490169e-02 0.000000000000000000e+00 7.602339181286549286e-02 1.081081081081081141e-01 8.552631578947368640e-02 6.097560975609755962e-02 3.790087463556851555e-02 7.801418439716312214e-02 3.780068728522336524e-02 5.263157894736841813e-02 4.102564102564102561e-02 3.194888178913737886e-02 6.467181467181466747e-02 3.835616438356164587e-02 2.772828507795100372e-01 3.928571428571428492e-01 0.000000000000000000e+00 nan nan 7.500000000000000000e-01 nan nan nan 5.555555555555555802e-01 3.220338983050847204e-01 8.333333333333332871e-02 nan 1.960784313725490169e-01 7.563025210084033112e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.740313272877164086e-01 +0.000000000000000000e+00 7.407407407407406996e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.578947368421052544e-01 3.125000000000000000e-02 1.077844311377245540e-01 5.696202531645569445e-02 4.166666666666666435e-02 5.084745762711864736e-02 4.132231404958677801e-02 7.453416149068323171e-02 3.208955223880596841e-01 1.523809523809523947e-01 4.406779661016949068e-02 1.111111111111111049e-01 8.823529411764706454e-02 1.918604651162790775e-01 6.241134751773049771e-01 3.296703296703296787e-02 5.048543689320388328e-01 7.512953367875647714e-01 4.050632911392405000e-01 6.603773584905660299e-02 7.964601769911504314e-02 5.194805194805195148e-02 5.555555555555555247e-02 3.225806451612903136e-02 2.399999999999999911e-01 7.142857142857142461e-02 6.201550387596899139e-02 3.846153846153846367e-02 0.000000000000000000e+00 1.585365853658536606e-01 2.183908045977011603e-01 1.000000000000000056e-01 0.000000000000000000e+00 6.250000000000000000e-01 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 8.333333333333332871e-02 0.000000000000000000e+00 5.000000000000000000e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 6.666666666666666574e-02 1.184210526315789408e-01 0.000000000000000000e+00 1.590909090909090884e-01 1.111111111111111049e-01 1.842105263157894635e-01 1.545454545454545414e-01 1.404958677685950452e-01 nan nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 5.633802816901408578e-02 1.814814814814814936e-01 1.297509829619921395e-01 1.254901960784313708e-01 0.000000000000000000e+00 3.023255813953488191e-01 2.947845804988661889e-01 6.149341142020497974e-02 7.572614107883816892e-02 2.011428571428571510e-01 1.764705882352941291e-01 2.369477911646586388e-01 3.848797250859106733e-01 5.682579564489111945e-01 4.218009478672986035e-01 2.620390455531453333e-01 1.875295229097779792e-01 2.851335656213704883e-01 4.810526315789473428e-01 7.605042016806722316e-01 3.146997929606625277e-01 7.212389380530973559e-01 8.723404255319149314e-01 6.177325581395348708e-01 1.780243000528262121e-01 1.496470588235294108e-01 1.412322274881516460e-01 1.644398766700924941e-01 2.875354107648725455e-01 1.996434937611408222e-01 2.118644067796610075e-01 1.893719806763285163e-01 2.058823529411764608e-01 1.805555555555555525e-01 3.544776119402985315e-01 4.637450199203187462e-01 9.090909090909091161e-02 3.669724770642202039e-02 8.620689655172414367e-02 6.666666666666666574e-02 3.030303030303030387e-02 5.607476635514018620e-02 7.947019867549669214e-02 9.316770186335403270e-02 1.561938958707360936e-01 4.504716981132075304e-01 1.493975903614457867e-01 3.134796238244513811e-02 9.176470588235294268e-02 7.795100222717149530e-02 7.940446650124069472e-02 7.009925558312654625e-02 3.945111492281303672e-02 6.210268948655256471e-02 6.016597510373444119e-02 1.117917304747320095e-01 2.681388012618296512e-01 9.908536585365854132e-02 2.500000000000000000e-01 nan nan 9.166666666666666297e-01 nan nan nan 2.272727272727272652e-01 2.985074626865671377e-01 nan nan 1.256830601092896182e-01 2.117503059975520130e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.659785932721712265e-01 +5.000000000000000278e-02 5.882352941176470507e-02 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 1.403508771929824483e-01 2.298850574712643646e-02 9.433962264150944077e-02 0.000000000000000000e+00 2.564102564102564014e-02 1.818181818181818232e-01 4.918032786885245811e-02 4.444444444444444614e-02 3.921568627450980338e-02 0.000000000000000000e+00 1.818181818181818094e-02 0.000000000000000000e+00 1.470588235294117696e-01 7.407407407407406996e-02 3.428571428571428603e-01 5.942028985507246119e-01 7.175572519083969203e-01 0.000000000000000000e+00 4.166666666666666435e-02 9.740259740259740728e-02 4.040404040404040747e-02 8.333333333333332871e-02 1.304347826086956486e-01 1.262135922330097082e-01 2.244897959183673464e-01 8.749999999999999445e-02 1.571428571428571397e-01 4.610389610389610260e-01 3.084112149532710068e-01 5.263157894736841813e-02 1.818181818181818094e-02 4.545454545454545581e-02 7.692307692307692735e-02 8.064516129032257841e-02 7.317073170731706877e-02 1.523178807947019875e-01 1.807228915662650592e-01 1.555555555555555580e-01 9.345794392523364136e-02 2.432432432432432567e-01 7.317073170731706877e-02 1.294117647058823650e-01 8.130081300813007950e-02 1.163636363636363635e-01 8.978328173374612586e-02 1.891891891891891997e-01 4.489795918367346650e-02 6.818181818181817677e-02 4.687500000000000000e-02 6.338028169014084390e-02 9.638554216867470381e-02 0.000000000000000000e+00 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 8.450704225352112520e-02 1.168478260869565272e-01 7.582938388625592996e-02 7.329842931937172179e-02 0.000000000000000000e+00 3.197969543147208271e-01 3.012048192771084598e-01 6.563245823389021738e-02 4.703476482617587051e-02 7.964601769911504314e-02 1.250000000000000000e-01 1.493975903614457867e-01 2.053872053872053960e-01 1.178509532062391729e-01 5.489260143198090858e-02 7.166666666666667018e-02 3.304347826086956319e-02 7.777777777777777901e-02 7.630522088353414167e-02 2.541322314049586639e-01 2.601941747572815711e-01 3.591549295774648098e-01 6.535947712418300748e-01 7.644110275689223188e-01 4.535147392290249380e-02 4.314159292035397997e-02 2.365747460087082865e-01 1.289126853377265125e-01 2.591943957968476098e-01 3.052631578947368474e-01 2.783725910064239750e-01 3.222354340071343914e-01 3.866171003717472354e-01 2.092352092352092463e-01 5.739599383667179922e-01 3.983180428134556750e-01 2.320819112627986458e-01 1.370558375634517712e-01 6.111111111111110911e-02 8.125000000000000278e-02 1.229698375870069554e-01 1.434108527131782995e-01 2.960462873674059581e-01 1.567291311754684946e-01 2.728033472803347292e-01 6.174582798459563593e-01 1.764705882352941291e-01 8.474576271186440302e-02 1.195779601406799508e-01 1.646297627606038705e-01 1.876693766937669317e-01 1.786565030967127155e-01 1.656441717791410917e-01 1.113627784069460142e-01 6.800709639266705464e-02 8.215297450424929870e-02 6.168224299065420274e-02 6.940063091482649715e-02 3.684210526315789269e-01 nan nan 1.000000000000000000e+00 nan nan nan nan 2.619047619047619180e-01 0.000000000000000000e+00 nan 1.671924290220820064e-01 4.937701892016612693e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.351388256713700775e-01 +0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 5.000000000000000000e-01 1.000000000000000056e-01 6.597222222222222376e-02 3.021148036253776606e-02 4.385964912280701511e-02 9.090909090909091161e-02 1.111111111111111049e-01 3.225806451612903136e-02 7.462686567164178442e-02 0.000000000000000000e+00 3.763440860215053890e-02 1.970074812967581024e-01 7.522123893805310324e-02 6.578947368421052266e-02 0.000000000000000000e+00 5.263157894736841813e-02 4.444444444444444614e-02 1.910828025477706929e-02 0.000000000000000000e+00 3.707865168539326017e-01 2.013422818791946178e-02 3.703703703703703498e-02 3.293413173652694897e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 8.333333333333333218e-03 2.083333333333333218e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan 1.666666666666666574e-01 nan 0.000000000000000000e+00 0.000000000000000000e+00 8.064516129032257841e-02 5.128205128205128027e-02 2.272727272727272652e-01 2.500000000000000000e-01 1.764705882352941291e-01 1.515151515151515194e-01 8.571428571428571508e-02 4.713804713804713858e-02 2.777777777777777624e-02 8.857808857808857628e-02 4.095563139931740482e-02 9.345794392523364136e-02 1.603260869565217295e-01 6.705539358600583200e-02 nan nan nan nan nan nan nan 1.250000000000000000e-01 1.904761904761904656e-01 nan nan 1.153846153846153910e-01 5.434782608695652023e-02 9.677419354838709409e-02 1.053140096618357530e-01 6.721311475409835756e-02 nan 3.562945368171021449e-02 3.547297297297297147e-02 1.753653444676409323e-01 3.840677966101694873e-01 1.125920729568572476e-01 5.293276108726752832e-02 4.431818181818181906e-02 6.592386258124419141e-02 2.103944896681277377e-01 7.149666348903717383e-02 1.968306922435362760e-01 7.688022284122563166e-01 4.962080173347778733e-01 1.965678627145085733e-01 1.610555050045495984e-01 3.125000000000000000e-02 2.351623740201567725e-01 2.277710109622411716e-01 4.122938530734632928e-02 8.547249647390691152e-01 2.412236710130391260e-01 2.394170714781401754e-01 4.926470588235294379e-01 1.822033898305084609e-01 9.605488850771869147e-02 1.682242990654205517e-01 1.224764468371467019e-01 8.024691358024690913e-02 7.478632478632478431e-02 7.246376811594203160e-02 6.862745098039216285e-02 9.202453987730060958e-02 4.020100502512562873e-02 1.204819277108433728e-01 3.278688524590164105e-02 3.200000000000000067e-02 4.827586206896551657e-02 4.945054945054944834e-02 5.970149253731343170e-02 1.310344827586207017e-01 1.126346718903036281e-01 8.623548922056384347e-02 6.380027739251040164e-02 7.469244288224956285e-02 1.326449563145353505e-01 1.301703163017031706e-01 1.142229544206479902e-01 2.302867383512544885e-01 3.715163484748738032e-01 2.140033879164313924e-01 5.157088122605364422e-01 6.304347826086956763e-01 3.092011412268188542e-01 0.000000000000000000e+00 nan nan 8.125000000000000000e-01 nan nan 0.000000000000000000e+00 1.799999999999999933e-01 6.666666666666666297e-01 3.333333333333333148e-01 nan 1.319857312722948761e-01 8.758421559191530148e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.597811217510260007e-01 +0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan 4.545454545454545581e-02 5.681818181818181629e-02 5.309734513274336209e-02 4.405286343612335211e-03 1.111111111111111049e-01 2.247191011235954994e-02 2.702702702702702853e-02 8.333333333333332871e-02 3.409090909090908839e-02 1.960784313725490169e-02 4.641350210970464352e-02 9.803921568627450844e-02 2.992125984251968740e-01 9.090909090909091161e-02 2.631578947368420907e-02 1.486486486486486569e-01 7.499999999999999722e-02 1.470588235294117627e-02 6.103286384976525786e-02 3.445945945945945721e-01 9.868421052631578400e-03 3.685503685503685456e-02 1.562500000000000000e-01 0.000000000000000000e+00 1.785714285714285615e-02 2.985074626865671585e-02 5.940594059405940319e-02 0.000000000000000000e+00 3.821656050955413858e-02 2.366863905325443732e-02 0.000000000000000000e+00 nan nan nan 7.142857142857142461e-02 nan 4.166666666666666435e-02 2.985074626865671585e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 nan 0.000000000000000000e+00 4.411764705882353227e-02 2.985074626865671585e-02 2.183406113537117790e-02 1.111111111111111154e-02 9.448818897637795144e-02 2.999999999999999889e-02 0.000000000000000000e+00 1.156069364161849689e-01 9.090909090909090468e-03 nan nan nan nan nan nan nan 6.250000000000000000e-02 nan nan nan 4.000000000000000083e-02 1.470588235294117627e-02 4.790419161676646997e-02 4.000000000000000083e-02 4.048582995951417046e-02 0.000000000000000000e+00 1.219512195121951262e-02 4.761904761904761640e-02 3.634751773049645085e-02 7.108799306458604694e-02 6.211656441717791632e-02 3.485838779956427352e-02 3.749999999999999861e-02 5.390185036202735369e-02 2.131560028756290526e-01 1.528162511542013047e-01 1.392592592592592493e-01 2.406360424028268497e-01 4.316194473592165348e-01 5.381487682372637638e-01 5.177980132450331618e-01 3.080568720379146808e-02 9.548254620123203251e-02 3.411344704482348056e-01 5.317460317460317304e-02 3.598759048603929478e-01 6.591179976162098164e-01 2.515060240963855609e-01 3.709752683154456387e-01 4.167591564927857761e-01 1.367041198501872667e-01 1.848958333333333426e-01 8.588588588588588757e-02 1.187845303867403335e-01 8.015267175572518554e-02 3.950953678474114494e-02 1.206971677559912914e-01 5.263157894736841813e-02 3.017241379310344959e-02 2.343750000000000000e-02 2.083333333333333218e-02 5.521472392638036852e-02 2.150537634408602322e-02 2.469135802469135665e-02 5.454545454545454281e-02 2.912621359223301065e-02 2.431610942249240112e-02 4.089219330855018569e-02 2.040816326530612082e-02 3.240740740740740561e-02 4.011461318051576241e-02 4.588394062078272884e-02 3.071017274472168795e-02 9.302325581395348708e-02 5.824829931972789338e-02 2.588686481303930850e-02 1.392592592592592493e-01 2.359145156813766409e-01 4.396728016359918029e-02 nan nan nan 1.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 1.465968586387434436e-01 nan nan 3.546099290780142105e-02 2.341772151898734167e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.335950836462956759e-01 +nan 1.666666666666666574e-01 nan nan 5.000000000000000000e-01 0.000000000000000000e+00 4.444444444444444198e-01 1.666666666666666574e-01 4.634146341463414864e-01 nan nan 0.000000000000000000e+00 5.000000000000000000e-01 0.000000000000000000e+00 5.000000000000000000e-01 1.481481481481481399e-01 7.142857142857142461e-02 nan 0.000000000000000000e+00 nan 1.875000000000000000e-01 1.935483870967741882e-01 7.228915662650602092e-02 1.379310344827586188e-01 3.125000000000000000e-02 1.411042944785275977e-01 1.666666666666666574e-01 1.333333333333333419e-02 1.639344262295082053e-02 2.739726027397260122e-02 2.157676348547717948e-01 5.607476635514018620e-02 7.017543859649122417e-02 9.452736318407960192e-02 4.166666666666666435e-02 1.250000000000000000e-01 0.000000000000000000e+00 2.631578947368420907e-01 0.000000000000000000e+00 2.127659574468085055e-02 0.000000000000000000e+00 1.075268817204301161e-02 0.000000000000000000e+00 3.296703296703296787e-02 4.878048780487805047e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.234567901234567833e-02 3.409090909090908839e-02 1.524163568773234112e-01 7.770270270270270008e-02 5.333333333333333676e-02 3.846153846153846367e-02 2.105263157894736795e-02 0.000000000000000000e+00 4.861111111111111188e-02 2.741935483870967527e-01 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 6.405693950177936136e-02 6.415094339622641473e-02 9.414758269720101269e-02 1.257485029940119681e-01 nan 5.442176870748299117e-02 5.494505494505494934e-03 1.681957186544342508e-01 3.047882136279926324e-01 2.205188679245282946e-01 1.481481481481481399e-01 3.043478260869565341e-02 1.111111111111111049e-01 1.576086956521739191e-01 1.646706586826347241e-01 3.234463276836158085e-01 2.730593607305936144e-01 3.473684210526316041e-01 2.055335968379446709e-01 2.862903225806451846e-01 3.435114503816794063e-02 9.219858156028368223e-02 2.937720329024676724e-01 1.799824407374890356e-01 2.217868338557993646e-01 3.099361896080218837e-01 6.534246575342466112e-01 5.147478591817317151e-01 4.033850493653032276e-01 3.158660844250363864e-01 1.652360515021459308e-01 4.829886591060706946e-01 2.428884026258205653e-01 2.235294117647058931e-01 1.963946869070208601e-01 2.992788461538461453e-01 1.102362204724409434e-01 2.049180327868852305e-02 4.712041884816754039e-02 4.166666666666666435e-02 1.116071428571428631e-01 8.730158730158729674e-02 7.084785133565621451e-02 8.318890814558059510e-02 1.232750689972401115e-01 1.601671309192200521e-01 4.533333333333333659e-02 4.303797468354430417e-02 1.340782122905027907e-01 2.272079772079771964e-01 2.606755895474824891e-01 1.324041811846689842e-01 3.584905660377358250e-01 2.100491122024933932e-01 6.428138265615523927e-02 1.255673222390317756e-01 1.647509578544061326e-01 1.003824091778202643e-01 4.545454545454545581e-02 nan nan 6.785714285714286031e-01 nan nan nan nan 3.157894736842105088e-01 0.000000000000000000e+00 nan 4.516129032258064252e-02 6.726457399103139001e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.925373134328358216e-01 +0.000000000000000000e+00 5.000000000000000278e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 6.542056074766354479e-02 2.551020408163265363e-02 1.398601398601398600e-02 0.000000000000000000e+00 3.846153846153846367e-02 0.000000000000000000e+00 1.153846153846153910e-01 0.000000000000000000e+00 0.000000000000000000e+00 3.188405797101449141e-02 5.217391304347825803e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.941176470588235253e-02 2.631578947368420907e-02 4.000000000000000083e-02 1.910828025477706929e-02 1.016042780748663138e-01 0.000000000000000000e+00 5.860805860805860801e-02 1.395348837209302306e-01 0.000000000000000000e+00 2.083333333333333218e-02 2.941176470588235253e-02 3.515625000000000000e-02 0.000000000000000000e+00 3.658536585365853439e-02 1.694915254237288130e-02 0.000000000000000000e+00 0.000000000000000000e+00 3.174603174603174427e-02 0.000000000000000000e+00 1.000000000000000000e+00 4.761904761904761640e-02 0.000000000000000000e+00 1.052631578947368397e-02 3.333333333333333148e-01 1.071428571428571369e-01 3.797468354430379861e-02 3.076923076923077094e-01 1.639344262295082053e-02 8.387096774193548987e-02 5.263157894736841813e-02 2.755905511811023584e-02 3.968253968253968034e-02 7.228915662650602092e-02 2.974828375286041326e-02 1.792114695340501704e-02 2.941176470588235253e-02 7.199999999999999456e-02 5.158730158730158444e-02 nan nan nan nan nan nan nan nan 4.761904761904761640e-02 nan nan 1.276595744680850963e-01 5.156950672645740225e-02 1.081794195250659618e-01 1.145662847790507310e-01 5.540166204986149423e-02 nan 1.304347826086956451e-02 3.432494279176201424e-02 2.295336787564766778e-01 3.581876560827684797e-01 1.933256616800920480e-01 1.394101876675603313e-01 7.105263157894736725e-02 7.033639143730886778e-02 2.411504424778760924e-01 1.637717121588089242e-01 2.428571428571428548e-01 5.535836177474402486e-01 3.053627760252365930e-01 2.368082368082368161e-01 3.564638783269962197e-01 7.210031347962382597e-02 1.884297520661157022e-01 2.525309336332958177e-01 9.186351706036745279e-02 5.207457983193277684e-01 3.381186248583301635e-01 5.000000000000000000e-01 7.370923913043477826e-01 3.091436865021770508e-01 1.954161640530759914e-01 1.160220994475138073e-01 3.139450867052023253e-01 1.622911694510739966e-01 1.529808773903262031e-01 8.757870635374928603e-02 2.043941411451398182e-01 2.371541501976284425e-02 4.347826086956521618e-02 2.999999999999999889e-02 4.516129032258064252e-02 1.353135313531353134e-01 3.537735849056603682e-02 6.382978723404254817e-02 9.027777777777777624e-02 1.399583766909469340e-01 1.203007518796992414e-01 1.083550913838120106e-01 5.590062111801242378e-02 1.318347509113001192e-01 1.950980392156862753e-01 2.574612017508953188e-01 1.218212642286267827e-01 4.062345373577436747e-01 3.784867212293301919e-01 1.295426452410383122e-01 4.258278145695364447e-01 4.912621359223300899e-01 2.739831158864159399e-01 3.448275862068965469e-02 nan nan 9.629629629629629095e-01 nan nan nan nan 5.953757225433525813e-01 0.000000000000000000e+00 nan 9.500609013398295111e-02 7.495656490444278786e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.789928057553956786e-01 +nan 0.000000000000000000e+00 nan nan nan 6.250000000000000000e-02 7.692307692307692735e-02 1.282051282051281937e-01 8.219178082191780366e-02 4.000000000000000083e-02 1.724137931034482873e-01 0.000000000000000000e+00 1.511627906976744096e-01 2.352941176470588203e-01 1.224489795918367319e-01 1.777777777777777846e-01 0.000000000000000000e+00 4.468085106382978511e-01 3.529411764705882582e-01 0.000000000000000000e+00 1.290322580645161255e-01 2.142857142857142738e-01 0.000000000000000000e+00 0.000000000000000000e+00 1.238095238095238138e-01 4.411764705882353227e-02 2.564102564102564014e-02 2.179487179487179516e-01 0.000000000000000000e+00 2.173913043478260809e-02 6.896551724137930939e-02 1.449275362318840597e-02 3.225806451612903136e-02 6.504065040650407192e-02 1.973684210526315819e-01 0.000000000000000000e+00 0.000000000000000000e+00 nan 3.333333333333333148e-01 0.000000000000000000e+00 0.000000000000000000e+00 7.407407407407406996e-02 0.000000000000000000e+00 4.444444444444444198e-01 3.333333333333333148e-01 nan nan 6.363636363636363535e-01 3.125000000000000000e-02 2.168674698795180766e-01 1.836734693877551117e-01 0.000000000000000000e+00 0.000000000000000000e+00 3.703703703703703498e-02 0.000000000000000000e+00 1.454545454545454475e-01 1.724137931034482873e-01 nan nan nan nan nan nan nan 8.333333333333332871e-02 5.000000000000000278e-02 nan nan 2.000000000000000111e-01 8.823529411764706454e-02 7.142857142857142461e-02 4.166666666666666435e-02 9.090909090909091161e-02 nan 1.754385964912280604e-02 5.882352941176470507e-02 4.330708661417322775e-02 7.734806629834253822e-02 1.477927063339731228e-01 3.703703703703703498e-02 8.571428571428571508e-02 6.089743589743589619e-02 2.139130434782608725e-01 3.413566739606126998e-01 2.232667450058754277e-01 1.767955801104972302e-01 2.896890343698854120e-01 4.278959810874704561e-01 3.717171717171717238e-01 2.631578947368420907e-02 1.278195488721804440e-01 3.696581196581196771e-01 1.853088480801335647e-01 1.833489242282506926e-01 4.068791946308724650e-01 4.139150943396226467e-01 3.525377229080932651e-01 6.547144754316068793e-01 4.370257966616085121e-01 2.850877192982456121e-01 2.992125984251968740e-01 2.302771855010661006e-01 1.482352941176470484e-01 1.404639175257731964e-01 4.046082949308755783e-01 9.049773755656108365e-02 3.761755485893417128e-02 2.608695652173912902e-02 9.493670886075949999e-02 1.653225806451612823e-01 5.228758169934640682e-02 5.741626794258373329e-02 5.442176870748299117e-02 7.960199004975124226e-02 1.090225563909774376e-01 3.061224489795918297e-02 4.371584699453551909e-02 6.176470588235294379e-02 1.049913941480206531e-01 1.215106732348111701e-01 9.278350515463917869e-02 1.362397820163487872e-01 8.394833948339483487e-02 5.427631578947368640e-02 7.509881422924900851e-02 1.908801696712619234e-01 6.008583690987124443e-02 1.250000000000000000e-01 nan nan nan nan nan nan 3.333333333333333148e-01 3.611111111111111049e-01 nan nan 7.894736842105262720e-02 7.208588957055214741e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.554119547657512146e-01 +nan nan nan nan nan nan 1.000000000000000000e+00 6.666666666666666297e-01 2.941176470588235392e-01 nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 2.592592592592592449e-01 0.000000000000000000e+00 0.000000000000000000e+00 2.564102564102564014e-02 7.692307692307692735e-02 1.666666666666666574e-01 2.000000000000000111e-01 1.499999999999999944e-01 3.400000000000000244e-01 2.173913043478260809e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.162162162162162282e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.428571428571428492e-01 0.000000000000000000e+00 0.000000000000000000e+00 2.222222222222222099e-01 2.000000000000000111e-01 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 2.962962962962962798e-01 3.030303030303030387e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 7.142857142857143016e-01 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 8.888888888888889228e-02 1.000000000000000056e-01 5.405405405405405705e-02 0.000000000000000000e+00 nan 2.727272727272727071e-01 0.000000000000000000e+00 2.173913043478260809e-02 7.253886010362693704e-02 7.536231884057971453e-02 5.882352941176470507e-02 4.255319148936170109e-02 9.090909090909091161e-02 1.402439024390244038e-01 2.600896860986546821e-01 1.748526522593320254e-01 8.408408408408409029e-02 1.694915254237288060e-01 2.735042735042735318e-01 2.534818941504178302e-01 4.166666666666666435e-02 8.264462809917355601e-02 2.360248447204968958e-01 2.015873015873015928e-01 9.788359788359787816e-02 1.448040885860306659e-01 2.454268292682926789e-01 1.882793017456358964e-01 5.038610038610038533e-01 6.350114416475972634e-01 5.037037037037036535e-01 3.810679611650485410e-01 4.439890710382513594e-01 2.076923076923077038e-01 3.424209378407851445e-01 4.676952748312439567e-01 1.592920353982300863e-01 3.986710963455149248e-02 1.148648648648648712e-01 1.721311475409836034e-01 1.446280991735537091e-01 9.859154929577464144e-02 1.037234042553191460e-01 1.727272727272727293e-01 1.286863270777479917e-01 1.549295774647887203e-01 5.970149253731343170e-02 1.052631578947368363e-01 7.936507936507936067e-02 1.875000000000000000e-01 1.543942992874109132e-01 9.046454767726161417e-02 6.593406593406593574e-02 4.826732673267326856e-02 1.893939393939393992e-02 1.047120418848167533e-01 9.210526315789473173e-02 7.547169811320754429e-02 2.500000000000000000e-01 nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 1.186440677966101725e-01 7.352941176470588480e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.091922005571030585e-01 +nan nan nan nan nan nan 1.000000000000000000e+00 6.666666666666666297e-01 8.333333333333333703e-01 nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 3.658536585365853439e-02 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.488372093023255766e-02 8.139534883720930813e-02 1.360000000000000098e-01 9.042553191489362263e-02 3.649635036496350071e-02 2.290076335877862523e-01 4.716981132075472039e-02 3.389830508474576259e-02 1.025641025641025605e-01 1.754385964912280604e-01 2.272727272727272652e-01 2.222222222222222099e-01 2.692307692307692180e-01 2.127659574468085055e-02 6.024096385542168641e-02 3.125000000000000000e-02 2.083333333333333218e-02 1.034482758620689641e-01 nan 2.000000000000000111e-01 6.666666666666666574e-02 3.157894736842105365e-02 1.747572815533980639e-01 2.105263157894736795e-02 4.166666666666666435e-02 1.923076923076923184e-02 0.000000000000000000e+00 0.000000000000000000e+00 8.333333333333332871e-02 3.333333333333333148e-01 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 3.773584905660377214e-02 6.250000000000000000e-02 2.439024390243902524e-02 0.000000000000000000e+00 nan nan 7.142857142857142461e-02 2.898550724637681195e-02 4.166666666666666435e-02 1.509433962264150886e-01 8.333333333333332871e-02 7.407407407407406996e-02 2.941176470588235253e-02 8.823529411764706454e-02 2.338709677419354704e-01 1.926229508196721230e-01 4.663212435233160535e-02 1.049382716049382658e-01 1.836734693877551117e-01 1.304347826086956486e-01 6.666666666666666574e-02 2.941176470588235253e-02 1.837606837606837740e-01 1.896907216494845283e-01 7.581227436823104182e-02 9.059233449477352429e-02 1.105169340463458133e-01 1.509146341463414587e-01 2.655826558265582671e-01 4.762886597938144062e-01 7.222222222222222099e-01 2.533849129593810368e-01 5.689045936395760172e-01 6.242937853107344282e-01 4.205495818399044294e-01 2.759067357512953178e-01 4.576271186440677985e-01 3.390663390663390397e-01 3.466135458167330929e-01 2.857142857142856984e-01 4.089635854341736598e-01 3.417085427135678199e-01 2.600896860986546821e-01 2.482269503546099265e-01 1.178571428571428548e-01 1.338028169014084390e-01 4.109589041095890183e-02 3.174603174603174427e-02 1.142857142857142821e-01 1.675000000000000100e-01 1.509054325955734299e-01 8.390022675736961977e-02 2.112676056338028130e-01 6.300484652665590268e-02 5.263157894736841813e-02 4.878048780487805047e-02 6.083650190114068407e-02 3.149606299212598381e-02 4.000000000000000083e-02 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 9.090909090909091161e-02 6.652806652806653176e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.767857142857143016e-01 +nan nan nan nan nan 0.000000000000000000e+00 1.000000000000000056e-01 2.307692307692307820e-01 8.064516129032257841e-02 nan nan 0.000000000000000000e+00 1.666666666666666574e-01 0.000000000000000000e+00 3.125000000000000000e-02 1.428571428571428492e-01 2.439024390243902524e-02 nan 0.000000000000000000e+00 nan 3.448275862068965469e-02 5.555555555555555247e-02 5.140186915887850344e-02 0.000000000000000000e+00 0.000000000000000000e+00 4.926108374384236682e-02 2.272727272727272790e-02 4.666666666666666879e-02 1.470588235294117627e-02 3.831417624521072512e-02 1.339031339031339085e-01 9.223300970873786475e-02 6.965174129353234045e-02 3.937007874015747977e-02 1.694915254237288130e-02 1.630434782608695607e-02 0.000000000000000000e+00 4.225352112676056260e-02 1.111111111111111049e-01 0.000000000000000000e+00 2.857142857142857054e-02 1.913875598086124327e-02 3.157894736842105088e-01 3.206106870229007422e-01 1.241379310344827569e-01 6.170212765957446832e-01 1.025641025641025605e-01 1.704545454545454419e-01 2.758620689655172376e-02 8.595988538681947899e-02 8.668730650154798933e-02 1.176470588235294101e-01 3.535353535353535220e-02 3.370786516853932491e-02 4.255319148936170109e-02 2.666666666666666838e-02 1.666666666666666574e-01 0.000000000000000000e+00 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 9.732360097323601578e-02 7.614213197969543767e-02 1.199999999999999956e-01 1.666666666666666574e-01 nan 1.694915254237288130e-02 7.692307692307692735e-02 1.801566579634464871e-01 2.077777777777777835e-01 2.325581395348837177e-01 1.473684210526315652e-01 1.226415094339622647e-01 3.937007874015747977e-02 4.072398190045248972e-02 1.161825726141078874e-01 3.328025477707006186e-01 9.196515004840270791e-02 1.158301158301158346e-01 2.725724020442930190e-02 8.461538461538462008e-02 4.575163398692810163e-02 1.101321585903083655e-01 1.600928074245939747e-01 2.291390728476821181e-01 9.230769230769231282e-02 4.008667388949078980e-02 4.762833008447043270e-01 3.083717357910906176e-01 2.943925233644859585e-01 3.247100802854593904e-01 1.960985626283367478e-01 5.957656326932545543e-01 5.655241935483871218e-01 3.127187864644107584e-01 2.847999999999999976e-01 2.248062015503876077e-01 8.952380952380951940e-02 9.843937575030012321e-02 7.580174927113703109e-02 1.412556053811659107e-01 2.713414634146341653e-01 9.767441860465116144e-02 1.105141980046047551e-01 1.550068587105624118e-01 1.321548821548821639e-01 1.043083900226757371e-01 1.008902077151335314e-01 5.249999999999999806e-02 2.199488491048593453e-01 2.144133412745682088e-01 3.219978746014877657e-01 2.546614327772325770e-01 3.937341236240474163e-01 1.769259122742351531e-01 1.065088757396449731e-01 7.567567567567567988e-02 8.074074074074073792e-02 7.995226730310261987e-02 3.703703703703703498e-02 nan nan 2.500000000000000000e-01 nan nan nan nan 2.333333333333333370e-01 nan nan 1.655844155844155841e-01 9.058927000879507530e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.390957446808510745e-01 +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 5.000000000000000278e-02 nan 0.000000000000000000e+00 8.450704225352112520e-02 5.263157894736841813e-02 1.694915254237288130e-02 8.000000000000000167e-02 1.081081081081081141e-01 7.792207792207792028e-02 3.448275862068965469e-02 1.333333333333333315e-01 1.008403361344537841e-01 2.898550724637681195e-02 0.000000000000000000e+00 3.846153846153846367e-02 0.000000000000000000e+00 0.000000000000000000e+00 3.448275862068965469e-02 0.000000000000000000e+00 5.555555555555555247e-02 5.000000000000000278e-02 4.000000000000000083e-02 3.333333333333333148e-01 0.000000000000000000e+00 nan 4.705882352941176405e-01 1.960784313725490169e-02 1.411764705882352922e-01 1.636363636363636354e-01 1.694915254237288130e-02 8.771929824561403022e-03 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 1.333333333333333315e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 2.222222222222222307e-02 6.153846153846154188e-02 8.484848484848485362e-02 nan 0.000000000000000000e+00 3.921568627450980338e-02 7.975460122699386256e-02 1.458333333333333426e-01 2.118226600985221586e-01 1.327433628318584052e-02 1.157024793388429784e-01 2.732240437158469856e-02 2.500000000000000139e-02 0.000000000000000000e+00 6.896551724137930939e-02 2.193308550185873729e-01 3.295019157088122652e-01 5.279503105590062362e-02 2.877697841726618855e-02 1.364605543710021296e-01 1.807838179519595523e-01 1.797752808988763995e-01 5.244094488188976166e-01 4.914611005692599566e-01 5.333978702807357086e-01 8.188010899182561753e-01 4.216027874564459710e-01 4.776119402985074536e-01 3.527559055118110187e-01 1.453900709219858034e-01 9.254498714652956148e-02 1.162790697674418589e-01 6.206896551724137845e-02 1.566265060240963902e-01 5.000000000000000278e-02 7.474226804123711154e-02 1.116751269035533012e-01 1.346153846153846090e-01 2.011173184357541999e-01 1.612903225806451568e-02 5.970149253731343170e-02 1.157024793388429784e-01 2.222222222222222099e-01 1.372950819672131284e-01 1.681614349775784889e-01 8.333333333333332871e-02 6.067677946324387395e-02 8.571428571428571508e-02 4.807692307692307959e-02 3.424657534246575152e-02 7.432432432432432845e-02 5.263157894736841813e-02 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 7.058823529411764608e-02 6.762295081967213684e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.684210526315789269e-01 +nan nan nan nan nan nan 1.538461538461538547e-01 9.090909090909091161e-02 1.538461538461538547e-01 nan nan nan 1.250000000000000000e-01 nan 2.500000000000000000e-01 nan 3.333333333333333148e-01 nan 0.000000000000000000e+00 nan 8.333333333333332871e-02 0.000000000000000000e+00 1.232876712328767055e-01 nan 2.325581395348837177e-02 1.379310344827586188e-01 0.000000000000000000e+00 0.000000000000000000e+00 5.882352941176470507e-02 1.851851851851851749e-01 1.388888888888888951e-01 1.388888888888888812e-02 2.180451127819548751e-01 3.846153846153846367e-02 1.408450704225352144e-02 2.816901408450704289e-02 3.968253968253968034e-02 1.153846153846153910e-01 1.379310344827586188e-01 1.473684210526315652e-01 7.594936708860759722e-02 2.234636871508379960e-02 4.411764705882352811e-01 3.902439024390244038e-01 1.679389312977099258e-01 8.000000000000000444e-01 0.000000000000000000e+00 3.636363636363636465e-01 6.481481481481481122e-02 1.597222222222222099e-01 9.852216748768473364e-02 7.407407407407406996e-02 3.508771929824561209e-02 6.451612903225806273e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.187500000000000000e-01 1.666666666666666574e-01 nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 9.497206703910614223e-02 2.941176470588235253e-02 6.451612903225806273e-02 1.000000000000000056e-01 nan 0.000000000000000000e+00 2.307692307692307820e-01 1.754385964912280604e-02 4.819277108433735191e-02 1.403508771929824483e-01 0.000000000000000000e+00 3.333333333333333148e-01 2.777777777777777624e-02 9.677419354838709409e-02 1.000000000000000056e-01 3.645833333333333148e-01 3.663003663003663174e-02 1.186440677966101725e-01 3.684210526315789130e-02 4.545454545454545581e-02 0.000000000000000000e+00 2.040816326530612082e-02 1.035598705501618172e-01 1.762870514820592815e-01 7.306889352818371486e-02 5.944055944055944007e-02 1.975138121546961278e-01 1.486810551558752913e-01 2.055214723926380438e-01 1.900311526479750712e-01 4.319526627218934767e-01 3.269012485811577662e-01 4.981818181818181701e-01 6.731517509727626969e-01 2.920353982300885054e-01 2.161016949152542443e-01 2.049382716049382713e-01 2.577639751552794900e-01 3.370165745856353867e-01 4.873949579831932666e-01 4.753451676528599457e-01 2.921810699588477389e-01 2.975679542203147343e-01 3.242258652094717752e-01 2.577937649880095994e-01 2.710706150341685716e-01 1.274509803921568540e-01 5.376344086021505458e-02 2.165450121654501348e-01 3.016877637130801482e-01 3.055827619980411303e-01 2.030567685589519666e-01 2.571942446043165575e-01 1.089630931458699520e-01 9.724473257698541817e-02 8.306709265175718504e-02 1.047794117647058848e-01 1.094339622641509469e-01 0.000000000000000000e+00 nan nan nan nan nan nan nan 9.523809523809523281e-02 nan nan 2.568807339449541427e-01 1.034482758620689641e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.591417910447761153e-01 +nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan 2.500000000000000000e-01 nan 0.000000000000000000e+00 7.142857142857142461e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.071428571428571369e-01 nan 0.000000000000000000e+00 6.451612903225806273e-02 4.642857142857143016e-01 0.000000000000000000e+00 1.388888888888888812e-02 1.044776119402985037e-01 1.754385964912280604e-02 8.661417322834645549e-02 1.842105263157894635e-01 2.405063291139240556e-01 2.259259259259259189e-01 2.232142857142857262e-01 2.722222222222221988e-01 3.761755485893417128e-01 1.574074074074074125e-01 9.009009009009008584e-02 8.196721311475409222e-02 2.098765432098765316e-01 4.651162790697674354e-02 6.250000000000000000e-02 1.923076923076923184e-02 9.090909090909091161e-02 1.573033707865168496e-01 1.363636363636363535e-01 3.448275862068965469e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.451612903225806550e-01 8.737864077669903196e-02 1.081081081081081141e-01 3.587443946188340754e-02 1.694915254237288130e-02 2.564102564102564014e-02 1.818181818181818094e-02 0.000000000000000000e+00 2.000000000000000042e-02 2.857142857142857054e-02 5.000000000000000278e-02 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 2.903225806451613031e-02 3.883495145631067624e-02 8.759124087591241281e-02 1.694915254237288130e-02 nan 7.692307692307692735e-02 6.896551724137930939e-02 5.555555555555555247e-02 6.105263157894736531e-02 1.420612813370473460e-01 0.000000000000000000e+00 6.666666666666666574e-02 9.230769230769231282e-02 2.246696035242290723e-01 2.034883720930232565e-01 1.602708803611738175e-01 2.891156462585034101e-02 6.888361045130640681e-02 6.067961165048543770e-02 1.747851002865329628e-01 7.142857142857142461e-02 1.314285714285714224e-01 3.763440860215053752e-01 5.949256342957129906e-01 3.655352480417754790e-02 3.708987161198288446e-02 1.515892420537897356e-01 8.164447017950202112e-02 2.482853223593964320e-01 3.588039867109634740e-01 5.049504950495049549e-01 3.244529019980970652e-01 4.635294117647058565e-01 3.325183374083129362e-01 6.780587833219412497e-01 4.454061251664447330e-01 4.936936936936937026e-01 3.487621097954790028e-01 1.986455981941309124e-01 1.366666666666666585e-01 2.813738441215323793e-01 1.689497716894977075e-01 3.045977011494253039e-01 2.010943912448700521e-01 1.817168338907469427e-01 3.154639175257731853e-01 1.105990783410138317e-01 3.625377643504532066e-02 8.058608058608059121e-02 1.153846153846153910e-01 1.209730440499671295e-01 7.349823321554770084e-02 1.154422788605697220e-01 7.645089285714286309e-02 5.609284332688588282e-02 5.950095969289827258e-02 4.352806414662084566e-02 4.462474645030425902e-02 1.509433962264150886e-01 nan nan nan nan nan nan nan 5.128205128205128027e-02 nan nan 8.487084870848708718e-02 2.125237191650853896e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.690899847483477547e-01 +0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 2.333333333333333370e-01 2.500000000000000139e-02 0.000000000000000000e+00 1.333333333333333315e-01 4.000000000000000083e-02 0.000000000000000000e+00 4.000000000000000083e-02 3.773584905660377214e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.739130434782608647e-01 0.000000000000000000e+00 1.176470588235294101e-01 1.891891891891891997e-01 1.707317073170731836e-01 0.000000000000000000e+00 1.694915254237288130e-02 3.960396039603960444e-02 0.000000000000000000e+00 1.724137931034482735e-02 6.666666666666666574e-02 9.782608695652174335e-02 9.183673469387755584e-02 2.857142857142857054e-02 1.095890410958904049e-01 6.122448979591836593e-02 3.023255813953488191e-01 7.692307692307692735e-02 0.000000000000000000e+00 7.142857142857142461e-02 1.388888888888888951e-01 4.761904761904761640e-02 0.000000000000000000e+00 2.380952380952380820e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 9.756097560975610095e-02 6.666666666666666574e-02 5.454545454545454281e-02 3.125000000000000000e-01 1.000000000000000056e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 1.428571428571428492e-01 3.571428571428571230e-02 4.166666666666666435e-02 1.562500000000000000e-02 0.000000000000000000e+00 nan 3.548387096774193727e-01 7.407407407407406996e-02 3.067484662576687102e-02 3.368421052631578871e-02 1.530398322851153070e-01 1.315789473684210453e-02 1.645569620253164445e-01 1.293532338308457652e-01 2.169312169312169192e-01 3.494736842105263253e-01 1.573964497041420163e-01 3.513513513513513709e-02 5.438066465256797405e-02 1.437499999999999889e-01 4.875183553597650654e-01 5.405405405405405705e-02 8.764940239043825243e-02 4.885786802030456788e-01 3.760245901639344135e-01 5.687203791469194053e-02 7.207890743550834922e-02 1.973307912297426192e-01 1.455490578297595761e-01 4.189189189189189144e-01 4.587813620071684584e-01 3.215926493108728912e-01 2.299872935196950463e-01 2.828746177370030646e-01 2.015810276679841917e-01 3.738920225624496330e-01 6.567975830815709903e-01 1.308724832214765155e-01 8.227848101265822223e-02 3.076923076923077094e-02 7.738095238095238360e-02 7.514450867052023531e-02 2.422145328719723170e-02 7.383627608346710058e-02 4.140127388535031622e-02 4.384133611691023308e-02 1.328413284132841377e-01 4.716981132075472039e-02 1.639344262295082053e-02 2.970297029702970160e-02 3.759398496240601295e-02 7.281553398058251969e-02 4.834254143646408985e-02 8.407079646017699692e-02 1.215932914046121555e-01 2.755267423014586686e-02 9.422492401215805391e-02 9.005235602094241454e-02 2.880658436213991841e-02 2.500000000000000000e-01 nan nan nan nan nan nan nan 1.632653061224489666e-01 nan nan 0.000000000000000000e+00 6.555090655509066000e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.582887700534759245e-01 +nan nan nan nan nan nan 1.428571428571428492e-01 6.666666666666666297e-01 3.333333333333333148e-01 nan nan nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 1.111111111111111049e-01 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 3.614457831325301046e-02 nan 0.000000000000000000e+00 5.555555555555555247e-02 4.166666666666666435e-02 0.000000000000000000e+00 1.587301587301587213e-02 1.889763779527559029e-01 5.294117647058823456e-02 4.166666666666666435e-02 2.080536912751677903e-01 1.466666666666666674e-01 5.882352941176470507e-02 1.682242990654205517e-01 1.518987341772151944e-01 2.580645161290322509e-01 2.307692307692307820e-01 2.459016393442622905e-01 1.454545454545454475e-01 3.076923076923077094e-02 1.886792452830188607e-02 7.317073170731706877e-02 1.724137931034482873e-01 nan 5.555555555555555247e-02 0.000000000000000000e+00 1.041666666666666609e-02 1.712707182320442056e-01 3.571428571428571230e-02 3.571428571428571230e-02 1.234567901234567833e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000056e-01 6.250000000000000000e-01 6.250000000000000000e-02 nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 4.918032786885245811e-02 1.250000000000000000e-01 0.000000000000000000e+00 nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 4.838709677419354704e-02 nan 0.000000000000000000e+00 1.428571428571428492e-01 2.040816326530612082e-02 9.090909090909091161e-02 1.639344262295082053e-02 4.761904761904761640e-02 3.499999999999999778e-01 1.923076923076923184e-01 4.000000000000000083e-02 0.000000000000000000e+00 1.428571428571428492e-01 1.931818181818181768e-01 1.954022988505747238e-01 9.815950920245399003e-02 7.042253521126760896e-02 8.383233532934131205e-02 9.638554216867470381e-02 2.029850746268656581e-01 1.694214876033057759e-01 6.914414414414414845e-01 1.223328591749644340e-01 2.475884244372990317e-01 5.199063231850117317e-01 5.270758122743682828e-01 2.186915887850467421e-01 6.779661016949152241e-01 7.378190255220418159e-01 5.773809523809523281e-01 4.799999999999999822e-01 5.414201183431952558e-01 5.185185185185184897e-01 5.292792792792793133e-01 2.307692307692307820e-01 1.552795031055900499e-01 2.079207920792079112e-01 1.754385964912280604e-02 1.492537313432835688e-01 1.088435374149659823e-01 1.355498721227621495e-01 1.666666666666666574e-01 7.506053268765133790e-02 1.992481203007518686e-01 3.906250000000000000e-02 3.139013452914798247e-02 6.451612903225806273e-02 7.428571428571428825e-02 5.333333333333333676e-02 0.000000000000000000e+00 nan nan nan nan nan nan nan 1.875000000000000000e-01 nan nan 1.499999999999999944e-01 7.628865979381443951e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.932917316692667531e-01 +nan nan nan nan nan nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 5.970149253731343170e-02 nan 0.000000000000000000e+00 8.333333333333332871e-02 2.857142857142857054e-02 2.439024390243902524e-02 5.000000000000000278e-02 3.223684210526315819e-01 8.148148148148148806e-02 0.000000000000000000e+00 1.732283464566929110e-01 1.805054151624548853e-01 3.278688524590164105e-02 1.315789473684210453e-01 1.600000000000000033e-01 3.809523809523809312e-01 2.807017543859648967e-01 6.194690265486725578e-02 7.142857142857142461e-02 9.502262443438913575e-02 2.195121951219512202e-01 2.427184466019417508e-01 1.121495327102803724e-01 6.818181818181817677e-01 0.000000000000000000e+00 1.538461538461538547e-01 1.538461538461538547e-02 6.928406466512701534e-02 3.780068728522336524e-02 7.236842105263158187e-02 1.886792452830188607e-02 2.985074626865671585e-02 3.773584905660377214e-02 0.000000000000000000e+00 0.000000000000000000e+00 3.703703703703703498e-02 nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 4.952380952380952550e-02 nan nan nan nan nan nan 0.000000000000000000e+00 3.773584905660377214e-02 nan nan nan nan 3.125000000000000000e-02 3.571428571428571230e-02 2.307692307692307820e-01 1.136363636363636395e-02 1.153846153846153910e-01 0.000000000000000000e+00 1.363636363636363535e-01 nan 1.111111111111111049e-01 7.006369426751592189e-02 1.177570093457943889e-01 3.333333333333333287e-02 8.064516129032257841e-03 4.581358609794628639e-02 6.119162640901771449e-02 8.139534883720930813e-02 1.214953271028037379e-01 5.311004784688995173e-01 1.027713625866050751e-01 1.834862385321101019e-01 4.427934621099554047e-01 4.852320675105485370e-01 9.523809523809523281e-02 7.102803738317756688e-01 8.508914100486223431e-01 4.381443298969072142e-01 4.202247191011235783e-01 5.133614627285513210e-01 5.476190476190476719e-01 5.117581187010078470e-01 3.568000000000000060e-01 1.695906432748537918e-01 1.558073654390934870e-01 8.333333333333332871e-02 6.896551724137930939e-02 1.242105263157894796e-01 1.246138002059732214e-01 1.221449851042701040e-01 7.883369330453564305e-02 1.196388261851015766e-01 4.931192660550458989e-02 7.985480943738657023e-02 4.248366013071895597e-02 5.249343832020997302e-02 1.304347826086956486e-01 1.818181818181818232e-01 nan nan nan nan nan 0.000000000000000000e+00 nan 8.108108108108108558e-02 nan nan 2.429906542056074759e-01 6.755629691409507920e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.910156250000000000e-01 +nan nan nan nan nan nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 8.333333333333332871e-02 2.777777777777777624e-02 nan 4.761904761904761640e-02 9.523809523809523281e-02 3.902439024390244038e-01 1.590909090909090884e-01 0.000000000000000000e+00 0.000000000000000000e+00 5.333333333333333676e-02 nan 1.250000000000000000e-01 2.439024390243902524e-02 1.875000000000000000e-01 7.777777777777777901e-01 1.454545454545454475e-01 2.040816326530612082e-02 0.000000000000000000e+00 1.686746987951807109e-01 2.000000000000000111e-01 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 9.900990099009901110e-03 2.857142857142857054e-02 0.000000000000000000e+00 5.617977528089887485e-02 1.428571428571428492e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 1.041666666666666609e-02 nan 0.000000000000000000e+00 nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.333333333333333315e-01 2.040816326530612082e-02 5.263157894736841813e-02 0.000000000000000000e+00 2.857142857142857054e-02 nan 0.000000000000000000e+00 1.818181818181818094e-02 3.703703703703703498e-02 3.846153846153846367e-02 4.000000000000000083e-02 2.888086642599278081e-02 1.694915254237288130e-02 7.798165137614679332e-02 2.134831460674157244e-01 3.190476190476190244e-01 3.703703703703703498e-02 1.607142857142857262e-01 3.248730964467004823e-01 1.708542713567839100e-01 5.722070844686648339e-02 2.760180995475113308e-01 3.480825958702065126e-01 6.880341880341880323e-01 5.121951219512195230e-01 3.663366336633663289e-01 2.397959183673469274e-01 2.244897959183673464e-01 2.879581151832460995e-01 1.016949152542372947e-01 9.090909090909091161e-02 0.000000000000000000e+00 3.333333333333333287e-02 6.930693069306931298e-02 1.307901907356948112e-01 8.438818565400843519e-02 1.923076923076923184e-02 7.185628742514969802e-02 3.100775193798449569e-02 2.380952380952380820e-02 2.608695652173912902e-02 3.703703703703703498e-02 3.636363636363636187e-02 nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 5.263157894736841813e-02 2.873563218390804558e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.980440097799510968e-01 +nan nan nan nan nan nan 6.250000000000000000e-02 1.000000000000000000e+00 1.612903225806451568e-01 nan nan nan 0.000000000000000000e+00 nan 5.000000000000000278e-02 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 3.225806451612903136e-02 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.111111111111111049e-01 0.000000000000000000e+00 9.375000000000000000e-02 0.000000000000000000e+00 3.846153846153846367e-02 4.444444444444444614e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.204819277108433798e-02 0.000000000000000000e+00 2.000000000000000111e-01 1.499999999999999944e-01 0.000000000000000000e+00 2.803738317757009310e-02 2.380952380952380820e-01 1.683168316831683275e-01 1.194029850746268634e-01 5.294117647058823595e-01 0.000000000000000000e+00 4.651162790697674354e-02 1.492537313432835792e-02 2.926829268292683098e-02 2.597402597402597574e-02 2.222222222222222307e-02 1.052631578947368397e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 4.615384615384615641e-01 nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 6.185567010309278579e-02 nan 0.000000000000000000e+00 nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan 1.111111111111111049e-01 0.000000000000000000e+00 1.000000000000000056e-01 1.851851851851851749e-02 4.545454545454545581e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 1.020408163265306145e-01 1.085714285714285687e-01 2.343750000000000000e-02 0.000000000000000000e+00 7.264957264957265515e-02 6.413994169096209896e-02 2.380952380952380820e-01 2.392638036809816016e-01 2.391304347826087029e-01 9.923664122137404453e-02 1.021505376344086086e-01 5.057034220532319324e-01 1.779661016949152519e-01 5.806451612903226062e-02 4.393939393939393923e-01 3.651162790697674576e-01 3.630136986301369939e-01 7.276119402985075091e-01 4.360269360269360406e-01 3.250000000000000111e-01 2.684210526315789491e-01 3.453996983408748056e-01 1.450216450216450237e-01 1.302931596091205235e-01 8.000000000000000167e-02 6.593406593406593574e-02 8.950617283950616787e-02 1.417322834645669272e-01 1.252115059221658167e-01 1.050531914893617080e-01 9.067357512953368170e-02 3.767123287671232668e-02 9.090909090909091161e-02 4.444444444444444614e-02 4.149377593360995681e-02 9.836065573770491621e-02 nan nan nan nan nan nan nan nan 1.000000000000000056e-01 nan nan 2.337662337662337608e-01 7.013301088270858241e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.977834612105711931e-01 +nan nan nan nan nan nan 1.666666666666666574e-01 nan 0.000000000000000000e+00 nan nan nan 2.500000000000000000e-01 nan 3.750000000000000000e-01 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 8.823529411764706454e-02 0.000000000000000000e+00 0.000000000000000000e+00 3.797468354430379861e-02 0.000000000000000000e+00 0.000000000000000000e+00 3.571428571428571230e-02 6.593406593406593574e-02 9.090909090909091161e-02 2.020202020202020374e-02 2.264150943396226467e-01 5.594405594405594401e-02 3.225806451612903136e-02 0.000000000000000000e+00 5.714285714285714107e-02 1.190476190476190410e-01 1.129032258064516098e-01 1.896551724137930939e-01 8.849557522123893682e-03 4.444444444444444614e-02 1.811023622047244208e-01 1.439393939393939503e-01 8.000000000000000167e-02 3.703703703703703498e-01 0.000000000000000000e+00 1.499999999999999944e-01 6.956521739130434867e-02 5.970149253731343170e-02 3.501945525291828842e-02 2.631578947368420907e-02 4.761904761904761640e-02 3.947368421052631360e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 7.142857142857142461e-02 nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 4.368932038834951598e-02 3.333333333333333148e-01 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 4.347826086956521618e-02 7.017543859649122417e-02 2.000000000000000111e-01 0.000000000000000000e+00 8.333333333333332871e-02 nan 1.199999999999999956e-01 0.000000000000000000e+00 1.904761904761904656e-01 2.307692307692307820e-02 5.494505494505494414e-02 5.263157894736841813e-02 3.448275862068965469e-02 0.000000000000000000e+00 2.777777777777777624e-02 5.882352941176470507e-02 6.201550387596899139e-02 2.040816326530612082e-02 2.985074626865671585e-02 1.096774193548387122e-01 1.367127496159754318e-01 1.388888888888888951e-01 2.155477031802120191e-01 3.333333333333333148e-01 1.795275590551181077e-01 1.949458483754512583e-01 5.160642570281124275e-01 2.111888111888111930e-01 1.084337349397590383e-01 2.046511627906976716e-01 2.815057283142389788e-01 3.099173553719008489e-01 4.328859060402684422e-01 6.929637526652452362e-01 2.615803814713896225e-01 2.364457831325301185e-01 3.406113537117904100e-01 2.128801431127012589e-01 1.458966565349543998e-01 7.476635514018691031e-02 7.185628742514969802e-02 1.501416430594900986e-01 2.551020408163265363e-01 2.610294117647058987e-01 1.052631578947368363e-01 1.964735516372795865e-01 7.081807081807081627e-02 8.314087759815241840e-02 6.037735849056603821e-02 7.715133531157269964e-02 1.290322580645161255e-01 nan nan nan nan nan nan nan nan 7.407407407407406996e-02 nan nan 1.428571428571428492e-01 8.325449385052034745e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.789808917197452165e-01 +nan nan nan nan nan nan 5.263157894736841813e-02 3.333333333333333148e-01 5.714285714285714107e-02 nan nan nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 5.000000000000000000e-01 nan 0.000000000000000000e+00 0.000000000000000000e+00 2.173913043478260809e-02 nan 3.750000000000000000e-01 5.263157894736841813e-02 nan 3.921568627450980338e-02 1.086956521739130405e-01 1.449275362318840632e-01 5.294117647058823456e-02 3.125000000000000000e-02 7.462686567164178442e-02 4.320987654320987414e-02 0.000000000000000000e+00 2.127659574468085055e-02 8.510638297872340219e-02 3.333333333333333287e-02 3.421052631578947456e-01 4.761904761904761640e-02 1.621621621621621712e-01 1.020408163265306145e-01 2.540983606557377095e-01 4.098360655737705027e-01 5.142857142857142350e-01 4.444444444444444198e-01 5.882352941176470507e-02 3.870967741935483764e-01 5.376344086021505458e-02 5.521472392638036852e-02 1.052631578947368363e-01 0.000000000000000000e+00 7.299270072992700489e-03 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.636363636363636465e-01 1.428571428571428492e-01 nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 5.181347150259067030e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan 0.000000000000000000e+00 2.941176470588235253e-02 4.166666666666666435e-02 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 4.081632653061224164e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.941176470588235253e-02 nan 4.878048780487805047e-02 6.593406593406593574e-02 1.279069767441860517e-01 2.919708029197080196e-02 0.000000000000000000e+00 5.992509363295880215e-02 8.974358974358974395e-02 8.264462809917355601e-02 1.375000000000000111e-01 4.307692307692307931e-01 1.002178649237472768e-01 1.600000000000000033e-01 3.589743589743589758e-01 2.441613588110403410e-01 6.944444444444444753e-02 4.860335195530726127e-01 5.073170731707317138e-01 3.128491620111731875e-01 4.346405228758170036e-01 4.441913439635535310e-01 6.972477064220183873e-01 6.054158607350096366e-01 5.091324200913242004e-01 1.612200435729847503e-01 1.353383458646616466e-01 1.009174311926605561e-01 2.121212121212121271e-01 1.322751322751322678e-01 1.484049930651872296e-01 1.704918032786885140e-01 1.295546558704453455e-01 1.124260355029585851e-01 3.947368421052631360e-02 1.184971098265895917e-01 1.388888888888888812e-02 2.380952380952380820e-02 1.559633027522935866e-01 0.000000000000000000e+00 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 3.689320388349514590e-01 1.224188790560472029e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.553672316384180685e-01 +0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 3.125000000000000000e-02 1.176470588235294101e-01 1.250000000000000000e-01 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 7.692307692307692735e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 2.500000000000000000e-01 0.000000000000000000e+00 1.886792452830188607e-02 1.307189542483660205e-01 0.000000000000000000e+00 0.000000000000000000e+00 8.571428571428571508e-02 2.272727272727272790e-02 0.000000000000000000e+00 1.470588235294117627e-02 1.558441558441558406e-01 1.861471861471861444e-01 3.378378378378378566e-02 1.192307692307692374e-01 1.083591331269349867e-01 7.874015748031495954e-03 6.153846153846154188e-02 4.608294930875576206e-02 4.545454545454545581e-02 1.250000000000000000e-01 2.690058479532163593e-01 8.250825082508250752e-02 2.539682539682539542e-01 3.364928909952606406e-01 2.426778242677824216e-01 2.142857142857142738e-01 3.055555555555555802e-01 0.000000000000000000e+00 1.400000000000000133e-01 5.921052631578947040e-02 1.365853658536585469e-01 5.405405405405405705e-02 4.924242424242424032e-02 2.949061662198391304e-02 4.516129032258064252e-02 4.424778761061946841e-02 2.061855670103092744e-02 1.343283582089552231e-01 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 6.562847608453838133e-02 6.060606060606060774e-02 7.633587786259542207e-02 7.954545454545454419e-02 nan 6.250000000000000000e-02 7.954545454545454419e-02 6.796116504854368690e-02 5.234159779614325214e-02 1.255813953488372214e-01 5.982905982905983161e-02 8.510638297872340219e-02 3.278688524590164105e-02 1.851851851851851749e-02 0.000000000000000000e+00 8.264462809917355601e-03 3.149606299212598381e-02 3.676470588235294240e-02 1.020408163265306041e-02 1.265822784810126563e-02 1.562500000000000000e-02 3.773584905660377214e-02 1.035598705501618172e-01 2.205714285714285849e-01 4.519774011299435013e-02 2.857142857142857054e-02 9.495548961424332690e-02 6.509803921568627083e-02 1.083743842364532084e-01 1.555555555555555580e-01 3.119469026548672419e-01 1.125541125541125592e-01 1.555555555555555580e-01 3.891891891891892108e-01 4.199999999999999845e-01 1.305595408895265375e-01 4.541062801932367332e-01 4.225844004656577613e-01 1.418685121107266522e-01 3.697632058287795842e-01 4.668400520156046896e-01 5.645514223194748604e-01 8.729227761485826020e-01 6.171079429735234489e-01 3.467799009200283056e-01 4.629014396456256897e-01 6.356968215158924351e-02 5.917159763313609155e-02 9.855072463768116409e-02 2.468265162200282137e-01 2.104121475054230028e-01 9.525959367945824319e-02 1.487695749440715864e-01 5.394990366088631834e-02 6.250000000000000000e-02 6.132075471698113234e-02 6.680369989722508006e-02 1.256281407035175768e-01 2.307692307692307820e-01 nan nan nan nan nan 5.000000000000000000e-01 1.666666666666666574e-01 1.000000000000000056e-01 0.000000000000000000e+00 nan 1.007556675062972334e-01 1.756601607347876015e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.302263648468708457e-01 +0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 2.941176470588235253e-02 1.666666666666666574e-01 1.489361702127659504e-01 nan nan nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 3.703703703703703498e-02 nan 0.000000000000000000e+00 0.000000000000000000e+00 4.166666666666666435e-02 6.666666666666666574e-02 3.409090909090908839e-02 0.000000000000000000e+00 0.000000000000000000e+00 9.433962264150943036e-03 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.803738317757009310e-02 1.492537313432835792e-02 3.389830508474576259e-02 1.801801801801801786e-02 0.000000000000000000e+00 1.388888888888888812e-02 1.111111111111111154e-02 1.785714285714285615e-02 8.771929824561403022e-02 4.687500000000000000e-02 2.985074626865671585e-02 9.790209790209790375e-02 3.857142857142857317e-01 1.418918918918918859e-01 2.393162393162393264e-01 1.612903225806451568e-01 0.000000000000000000e+00 9.523809523809523281e-02 1.210526315789473700e-01 7.509881422924900851e-02 4.863221884498480224e-02 5.319148936170212810e-02 1.492537313432835792e-02 3.260869565217391214e-02 1.923076923076923184e-02 2.150537634408602322e-02 1.346153846153846090e-01 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan 5.000000000000000278e-02 4.545454545454545581e-02 7.692307692307692735e-02 2.816901408450704289e-02 1.348314606741572996e-01 nan 3.076923076923077094e-02 0.000000000000000000e+00 6.842105263157895190e-02 5.106382978723403993e-02 1.910112359550561745e-01 0.000000000000000000e+00 3.030303030303030387e-02 2.439024390243902524e-02 1.851851851851851749e-02 3.846153846153846367e-02 8.888888888888889228e-02 6.862745098039216285e-02 1.300000000000000044e-01 7.317073170731706877e-02 0.000000000000000000e+00 2.222222222222222307e-02 1.111111111111111049e-01 7.586206896551724033e-02 1.269035532994923776e-01 4.679802955665024466e-02 1.600000000000000033e-02 8.628659476117103710e-02 6.754966887417218624e-02 6.834532374100719954e-02 1.013513513513513570e-01 2.812500000000000000e-01 1.255006675567423291e-01 9.444444444444444198e-02 4.200743494423792024e-01 2.717678100263852259e-01 4.402515723270439968e-02 1.242424242424242375e-01 3.098360655737704694e-01 2.600536193029490684e-01 5.609022556390977909e-01 4.777636594663278169e-01 4.719387755102040782e-01 6.170212765957446832e-01 7.526315789473684292e-01 4.653760238272524052e-01 4.905422446406053072e-01 2.088772845953002499e-01 7.862903225806451568e-02 2.089843750000000000e-01 4.688506981740064306e-01 2.871759890859481579e-01 1.084112149532710234e-01 2.555248618784530246e-01 8.409986859395532366e-02 7.678571428571429047e-02 3.382663847780126992e-02 8.689655172413793260e-02 1.080550098231827100e-01 nan nan nan nan nan nan nan 0.000000000000000000e+00 1.754385964912280604e-02 nan nan 1.587837837837837718e-01 2.814814814814814992e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.738292011019283767e-01 +8.585858585858585634e-02 1.724137931034482735e-02 1.333333333333333315e-01 0.000000000000000000e+00 2.195121951219512202e-01 1.538461538461538547e-01 4.060913705583756028e-02 9.714285714285714191e-02 1.471698113207547121e-01 5.952380952380952051e-02 2.777777777777777624e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 4.255319148936170109e-02 7.522123893805310324e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 5.714285714285714107e-02 5.555555555555555247e-02 6.060606060606060774e-02 1.185185185185185230e-01 2.739726027397260122e-02 0.000000000000000000e+00 2.362204724409448786e-02 2.884615384615384776e-02 0.000000000000000000e+00 5.263157894736841813e-02 4.166666666666666435e-02 1.666666666666666574e-01 0.000000000000000000e+00 4.929577464788732072e-02 2.803738317757009310e-02 1.666666666666666644e-02 1.298701298701298787e-02 1.315789473684210453e-02 2.040816326530612082e-02 1.805555555555555525e-01 2.040816326530612082e-02 3.937007874015747977e-02 4.564315352697095179e-02 2.360515021459227425e-01 1.485249237029501457e-01 1.580135440180586992e-01 1.792452830188679125e-01 1.076233183856502296e-01 1.202404809619238429e-01 7.714701601164483669e-02 1.213282247765006400e-01 6.666666666666666574e-02 6.551724137931035086e-02 4.208998548621190050e-02 1.025179856115107924e-01 1.123595505617977497e-02 1.554404145077720178e-02 1.418439716312056842e-01 1.666666666666666574e-01 nan nan nan nan nan nan 0.000000000000000000e+00 1.000000000000000000e+00 nan 0.000000000000000000e+00 1.199999999999999956e-01 9.615384615384615918e-02 1.255760368663594584e-01 1.315583398590446373e-01 7.417974322396576892e-02 nan 7.785888077858880985e-02 1.428571428571428492e-01 9.386281588447653590e-02 6.093649775497113341e-02 6.795469686875416082e-02 5.172413793103448204e-02 5.900621118012422395e-02 2.222222222222222307e-02 3.571428571428571230e-02 4.464285714285714385e-02 4.285714285714285754e-02 7.256235827664399285e-02 3.603603603603603572e-02 3.883495145631067624e-02 9.230769230769231282e-02 1.208333333333333343e-01 1.781818181818181912e-01 2.140151515151515194e-01 2.355072463768115854e-01 4.718309859154929536e-02 2.807775377969762287e-02 1.427312775330396577e-01 1.023498694516971341e-01 1.536312849162011218e-01 1.163522012578616371e-01 2.248520710059171701e-01 1.317269076305220832e-01 2.032258064516128948e-01 3.439153439153438963e-01 2.599206349206349409e-01 4.360465116279069880e-02 2.229299363057324901e-01 2.152886115444617721e-01 1.594202898550724501e-01 1.656920077972709460e-01 3.417910447761193793e-01 2.487684729064039424e-01 4.848012470771628779e-01 4.665728360309641110e-01 6.730079955886407728e-01 6.920871559633027248e-01 5.835866261398175991e-01 3.116164720344191674e-01 4.580045095828635948e-01 4.795212765957446721e-01 3.780788177339901579e-01 3.450162866449511534e-01 2.883959044368600844e-01 1.534188034188034289e-01 2.839563501276990976e-01 1.624266144814089929e-01 1.763683753258036557e-01 1.942257217847769002e-01 5.454545454545454142e-01 nan nan 1.000000000000000000e+00 nan nan nan 1.666666666666666574e-01 2.833333333333333259e-01 0.000000000000000000e+00 nan 4.634146341463414864e-01 5.997536945812808051e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.318652279233649249e-01 +8.571428571428571508e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.941176470588235253e-02 1.250000000000000000e-01 7.042253521126760896e-02 2.711864406779661008e-01 7.936507936507936067e-02 0.000000000000000000e+00 4.000000000000000083e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan 6.666666666666666574e-02 2.739726027397260122e-02 0.000000000000000000e+00 nan nan 5.882352941176470507e-02 6.250000000000000000e-02 6.250000000000000000e-02 1.792452830188679125e-01 1.774193548387096864e-01 0.000000000000000000e+00 5.426356589147286746e-02 1.228070175438596423e-01 0.000000000000000000e+00 8.333333333333332871e-02 1.123595505617977497e-02 3.016759776536312998e-01 7.692307692307692735e-02 1.290322580645161255e-01 1.315789473684210453e-01 2.000000000000000042e-02 0.000000000000000000e+00 1.369863013698630061e-02 5.714285714285714107e-02 1.276595744680850963e-01 2.298850574712643646e-02 3.333333333333333287e-02 1.487179487179487170e-01 1.948051948051948146e-01 1.633333333333333304e-01 2.433628318584070693e-01 2.941176470588235392e-01 2.173913043478260809e-02 1.492537313432835688e-01 6.730769230769230449e-02 1.534883720930232676e-01 4.562268803945745965e-02 1.785714285714285615e-02 7.142857142857142461e-02 9.489051094890510463e-02 0.000000000000000000e+00 1.290322580645161255e-01 1.086956521739130405e-01 2.500000000000000000e-01 nan nan nan nan nan nan 0.000000000000000000e+00 5.000000000000000000e-01 nan nan 1.111111111111111049e-01 1.319942611190817738e-01 1.502890173410404706e-01 6.498194945848374815e-02 3.418803418803419147e-02 nan 3.404255319148936226e-02 1.245791245791245810e-01 4.231974921630093922e-02 5.343511450381679267e-02 7.666666666666666075e-02 5.769230769230769551e-02 5.263157894736841813e-02 3.225806451612903136e-02 6.918238993710691676e-02 3.738317757009345516e-02 4.620462046204620171e-02 2.868318122555410521e-02 2.222222222222222307e-02 4.347826086956521618e-02 7.920792079207920888e-02 8.727272727272727959e-02 1.965317919075144637e-01 3.908872901678657197e-01 5.634178905206942423e-01 5.940594059405940319e-02 1.503759398496240518e-02 1.732484076433120912e-01 1.147350029120559056e-01 2.007722007722007596e-01 1.206030150753768793e-01 2.705882352941176294e-01 1.412012644889357182e-01 2.031250000000000000e-01 2.303473491773309068e-01 4.207547169811320931e-01 1.608040201005025149e-01 2.428571428571428548e-01 1.455525606469002808e-01 1.938775510204081565e-01 1.163636363636363635e-01 1.901234567901234629e-01 2.094861660079051502e-01 6.176470588235294379e-01 4.201877934272300608e-01 6.733364355514193100e-01 8.483316481294236322e-01 5.831739961759082602e-01 2.885117493472584838e-01 3.564356435643564192e-01 3.269529229177444152e-01 3.048211508553654858e-01 2.474053295932678864e-01 2.213953488372092937e-01 1.249094858797972496e-01 2.117593017914561337e-01 2.037914691943127909e-01 1.693907875185735601e-01 1.815616180620884257e-01 8.333333333333333703e-01 nan nan nan nan nan nan 0.000000000000000000e+00 2.222222222222222099e-01 2.222222222222222099e-01 nan 4.793814432989690899e-01 7.707703927492447482e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 4.034423407917384075e-01 +2.238805970149253810e-01 1.463414634146341375e-01 3.953488372093023062e-01 nan 6.764705882352941568e-01 3.518518518518518601e-01 1.213872832369942145e-01 3.750000000000000000e-01 3.714285714285714413e-01 2.407407407407407274e-01 1.818181818181818232e-01 0.000000000000000000e+00 6.250000000000000000e-02 0.000000000000000000e+00 1.739130434782608647e-01 3.140495867768595128e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.666666666666666574e-01 9.523809523809523281e-02 0.000000000000000000e+00 2.702702702702702853e-02 8.474576271186440302e-02 0.000000000000000000e+00 5.063291139240506250e-02 2.702702702702702853e-02 2.142857142857142738e-01 nan 0.000000000000000000e+00 1.219512195121951262e-02 0.000000000000000000e+00 4.864864864864865135e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 8.333333333333332871e-02 0.000000000000000000e+00 1.000000000000000000e+00 2.500000000000000000e-01 2.000000000000000111e-01 2.325581395348837177e-01 5.999999999999999778e-01 2.609819121447028434e-01 1.428571428571428492e-01 2.365145228215767559e-01 4.123711340206185350e-01 1.964285714285714246e-01 2.923976608187134341e-01 2.222222222222222099e-01 1.513240857503152514e-01 6.666666666666666574e-02 2.115384615384615363e-01 3.907563025210084029e-01 2.307692307692307820e-01 1.009174311926605561e-01 2.932330827067669010e-01 1.666666666666666574e-01 nan nan nan nan nan nan nan nan nan nan 2.123893805309734484e-01 1.183035714285714246e-01 1.571906354515050230e-01 1.076581576026637010e-01 1.004672897196261655e-01 nan 9.375000000000000000e-02 1.087866108786610941e-01 1.020642201834862373e-01 1.101449275362318819e-01 3.038138332255979276e-02 4.418985270049100023e-02 5.592105263157894773e-02 2.654867256637168105e-02 5.063291139240506250e-02 0.000000000000000000e+00 3.917910447761194237e-02 1.470937129300118607e-01 4.184100418410041482e-03 1.573770491803278826e-01 8.724832214765100569e-02 7.233273056057866468e-02 3.767123287671232668e-02 1.756373937677053743e-01 2.955555555555555713e-01 1.121351766513056791e-01 2.232142857142857192e-02 5.774278215223097033e-02 6.919945725915875590e-02 5.714285714285714107e-02 7.936507936507936067e-02 9.677419354838709409e-02 1.031390134529148045e-01 8.791208791208791895e-02 1.381215469613259750e-01 1.873278236914600603e-01 4.347826086956521618e-02 7.894736842105262720e-02 1.000000000000000056e-01 8.695652173913043237e-02 1.049723756906077304e-01 1.104972375690607689e-01 1.134751773049645363e-01 1.943887775551102204e-01 1.638225255972696193e-01 5.835777126099707113e-01 6.546052631578946901e-01 7.575757575757575690e-01 5.933014354066985518e-01 4.402402402402402215e-01 1.753670473083197290e-01 2.057877813504823128e-01 3.499069396437117785e-01 1.980319803198032080e-01 1.157285639137296124e-01 3.610972568578553754e-01 1.938144329896907270e-01 3.322717622080679223e-01 4.675456389452332662e-01 5.999999999999999778e-01 nan nan nan nan nan 2.500000000000000000e-01 nan 6.428571428571429047e-01 nan nan 7.042016806722689592e-01 7.881899871630295706e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.989953354861858759e-01 +9.375000000000000000e-02 3.846153846153846367e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 2.903225806451613100e-01 1.250000000000000069e-02 2.222222222222222307e-02 2.884615384615384776e-02 3.149606299212598381e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.111111111111111049e-01 0.000000000000000000e+00 0.000000000000000000e+00 1.052631578947368397e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 2.222222222222222099e-01 5.555555555555555247e-02 0.000000000000000000e+00 1.025641025641025605e-01 1.960784313725490169e-02 0.000000000000000000e+00 1.724137931034482873e-01 3.703703703703703498e-02 nan nan 0.000000000000000000e+00 2.857142857142856984e-01 nan 3.333333333333333148e-01 5.714285714285713969e-01 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.539823008849557473e-02 5.769230769230769551e-02 5.376344086021505458e-02 1.587301587301587213e-02 5.725190839694656308e-02 2.202643171806167519e-02 6.532663316582915103e-02 3.616484440706475845e-02 1.960784313725490169e-02 2.941176470588235253e-02 1.769911504424778736e-02 0.000000000000000000e+00 3.703703703703703498e-02 2.380952380952380820e-02 2.500000000000000000e-01 nan nan nan nan nan nan nan nan nan nan 1.863354037267080793e-02 3.652173913043478548e-02 1.737649063032367935e-01 8.993157380254154787e-02 1.203703703703703637e-01 nan 9.131403118040089251e-02 1.012396694214875992e-01 9.759188846641318749e-02 1.271676300578034602e-01 2.625102543068088753e-02 7.057256990679094955e-02 6.521739130434782428e-02 1.829268292682926719e-02 3.956834532374100405e-02 2.238805970149253602e-02 2.777777777777777624e-02 1.569301260022909483e-01 4.784688995215310992e-02 3.535353535353535220e-02 1.801801801801801786e-02 1.107594936708860694e-01 8.181818181818181768e-02 1.009771986970684071e-01 1.295454545454545470e-01 6.997455470737913574e-02 2.671755725190839634e-02 4.867256637168141525e-02 4.114285714285714074e-02 7.142857142857142461e-02 4.494382022471909988e-02 1.590909090909090884e-01 3.563941299790356065e-02 7.142857142857142461e-02 6.278026905829596493e-02 1.156812339331619588e-01 8.849557522123893682e-03 8.333333333333332871e-02 1.960784313725490169e-02 6.896551724137930939e-02 5.294117647058823456e-02 6.547619047619047949e-02 9.322033898305084887e-02 1.181556195965417916e-01 5.564924114671163796e-02 3.738986784140969077e-01 4.960526315789473562e-01 6.483126110124334263e-01 6.310096153846154188e-01 3.845628415300546554e-01 9.457236842105262720e-02 1.401515151515151381e-01 4.646137223122636661e-01 1.370967741935483764e-01 9.965487489214840122e-02 4.509649468294604224e-01 1.860465116279069742e-01 3.163538873994637957e-01 4.765998089780324465e-01 7.142857142857143016e-01 nan nan nan nan nan 7.500000000000000000e-01 nan 6.764705882352941568e-01 nan nan 6.627604166666666297e-01 6.326955074875207918e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.895377128953771084e-01 +1.034482758620689641e-01 3.508771929824561209e-02 1.276595744680850963e-01 7.142857142857142461e-02 2.500000000000000000e-01 7.142857142857142461e-02 1.034482758620689641e-01 1.552795031055900499e-01 1.940298507462686617e-01 1.027397260273972546e-01 3.703703703703703498e-02 2.000000000000000111e-01 5.000000000000000000e-01 0.000000000000000000e+00 1.199999999999999956e-01 1.349693251533742311e-01 0.000000000000000000e+00 nan nan 3.333333333333333287e-02 0.000000000000000000e+00 0.000000000000000000e+00 4.651162790697674354e-02 2.236842105263157909e-01 3.030303030303030387e-02 3.301886792452830149e-02 7.017543859649122417e-02 6.666666666666666574e-02 1.666666666666666574e-01 0.000000000000000000e+00 9.708737864077669061e-03 0.000000000000000000e+00 6.211180124223602411e-02 3.448275862068965469e-02 0.000000000000000000e+00 7.692307692307692735e-02 1.123595505617977497e-02 0.000000000000000000e+00 1.818181818181818232e-01 5.660377358490566169e-02 0.000000000000000000e+00 6.190476190476190688e-02 2.582417582417582680e-01 1.168831168831168804e-01 1.086956521739130405e-01 1.382978723404255372e-01 1.606217616580310759e-01 9.557945041816010012e-02 7.772020725388600892e-02 8.243727598566308323e-02 6.814955040227164973e-02 4.897959183673469136e-02 7.584269662921348798e-02 1.213768115942028963e-01 9.345794392523364136e-02 1.290322580645161255e-01 1.229508196721311453e-01 0.000000000000000000e+00 nan nan nan nan nan nan 4.000000000000000222e-01 1.000000000000000000e+00 nan 0.000000000000000000e+00 1.196172248803827748e-01 7.640638119227539937e-02 1.013431013431013439e-01 9.238095238095238304e-02 8.319185059422749828e-02 nan 8.360128617363343784e-02 1.338155515370705317e-01 8.841201716738197880e-02 1.020761245674740442e-01 6.746765249537892140e-02 6.996381182147165534e-02 9.287257019438445449e-02 1.515151515151515194e-02 2.836879432624113406e-02 0.000000000000000000e+00 3.475935828877005362e-02 9.430438842203547889e-02 2.531645569620253125e-02 2.580645161290322578e-02 7.446808510638297518e-02 1.197822141560798553e-01 7.083333333333333148e-02 1.736842105263158020e-01 1.448863636363636465e-01 7.135969141755062195e-02 5.676855895196506602e-02 1.987767584097859253e-01 1.025132275132275145e-01 1.004366812227074218e-01 9.259259259259258745e-02 1.730769230769230727e-01 2.102351313969571256e-01 2.166666666666666741e-01 2.024691358024691412e-01 1.708185053380782970e-01 1.214285714285714274e-01 1.261261261261261146e-01 1.292682926829268331e-01 7.142857142857142461e-02 8.532423208191126929e-02 2.184873949579831942e-01 1.098901098901098883e-01 1.723756906077348050e-01 1.722846441947565588e-01 4.355317884729649203e-01 4.767123287671232723e-01 5.274365274365274692e-01 4.080824088748019052e-01 5.264483627204030736e-01 2.872798434442270232e-01 4.216141001855287507e-01 4.898727370496504530e-01 3.153409090909091161e-01 1.969608416130917694e-01 3.265973254086181332e-01 1.208791208791208799e-01 1.630129286115795384e-01 2.264516129032257963e-01 1.000000000000000000e+00 nan nan nan nan nan nan nan 2.812500000000000000e-01 1.666666666666666574e-01 nan 3.448873483535528361e-01 5.230926256698137378e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.463639062036212524e-01 +1.250000000000000000e-01 0.000000000000000000e+00 1.111111111111111049e-01 0.000000000000000000e+00 0.000000000000000000e+00 9.090909090909091161e-02 7.142857142857142461e-02 1.346153846153846090e-01 2.083333333333333426e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 3.125000000000000000e-02 1.834862385321101019e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 4.347826086956521618e-02 0.000000000000000000e+00 2.000000000000000042e-02 8.000000000000000167e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.315789473684210453e-02 6.993006993006993001e-03 5.128205128205128027e-02 4.918032786885245811e-02 2.173913043478260809e-02 1.406250000000000000e-01 3.937007874015747977e-02 4.615384615384615641e-02 1.604278074866310327e-02 1.379310344827586188e-02 3.030303030303030387e-02 1.538461538461538547e-02 2.631578947368420907e-02 5.405405405405405705e-02 3.968253968253968034e-02 3.401360544217687382e-02 3.658536585365853439e-02 9.947643979057591013e-02 7.068607068607068999e-02 7.720588235294117974e-02 1.182795698924731242e-01 4.411764705882353227e-02 5.656108597285067902e-02 7.264957264957265515e-02 1.183970856102003616e-01 3.379867744305657673e-02 6.209150326797385766e-02 3.913043478260869873e-02 1.298701298701298787e-02 1.851851851851851749e-02 3.496503496503496761e-02 1.461538461538461620e-01 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan 1.840490797546012400e-02 5.818540433925049188e-02 1.073059360730593548e-01 1.313485113835376472e-01 8.955223880597014408e-02 nan 5.500000000000000028e-02 1.154929577464788720e-01 9.635036496350364577e-02 7.922912205567451960e-02 8.854166666666667129e-02 7.949125596184419829e-02 3.669724770642202039e-02 2.554744525547445258e-02 9.708737864077669061e-03 4.347826086956521618e-02 1.703296703296703352e-01 8.743169398907103818e-02 1.028037383177570069e-01 2.197802197802197974e-02 0.000000000000000000e+00 4.607046070460704690e-02 1.801801801801801786e-02 1.386363636363636409e-01 1.225139220365950715e-01 7.404103479036575064e-02 8.465608465608465139e-02 2.751031636863823793e-01 2.156964656964656946e-01 2.019607843137254943e-01 1.653746770025839863e-01 2.354312354312354250e-01 2.151741293532338228e-01 3.222748815165876746e-01 3.490759753593429271e-01 1.607565011820331069e-01 9.437751004016063650e-02 1.242603550295857950e-01 7.717750826901874361e-02 1.262798634812286602e-01 1.976470588235293979e-01 3.577319587628866038e-01 1.290322580645161255e-01 2.655398037077426610e-01 4.227323628219484819e-01 4.368610944076969371e-01 3.989136994568497352e-01 2.247191011235954994e-01 9.979423868312757573e-02 2.747728256166162009e-01 6.561403508771930237e-01 5.357620320855615015e-01 2.511599757918095421e-01 3.366467859509609251e-01 1.502697148728487087e-01 1.107850330154071944e-01 9.695603156708004766e-02 1.304347826086956486e-01 1.343648208469055416e-01 6.315789473684210176e-01 nan nan nan nan nan nan 0.000000000000000000e+00 9.836065573770491621e-02 0.000000000000000000e+00 nan 1.338411316648530913e-01 2.876106194690265516e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.620526471458148321e-01 +0.000000000000000000e+00 0.000000000000000000e+00 2.040816326530612082e-02 nan 0.000000000000000000e+00 0.000000000000000000e+00 4.000000000000000083e-02 8.988764044943819975e-02 1.847826086956521618e-01 4.545454545454545581e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 3.225806451612903136e-02 1.694915254237288130e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 7.843137254901960675e-02 6.976744186046511531e-02 3.076923076923077094e-02 0.000000000000000000e+00 5.555555555555555247e-02 8.403361344537814762e-03 0.000000000000000000e+00 2.702702702702702853e-02 3.061224489795918297e-02 1.124497991967871452e-01 4.545454545454545581e-02 5.555555555555555247e-02 4.436860068259385753e-02 7.751937984496123923e-03 4.958677685950413361e-02 2.040816326530612082e-02 1.052631578947368397e-02 9.638554216867470381e-02 3.749999999999999861e-02 1.503759398496240518e-02 1.546391752577319645e-02 1.393034825870646809e-01 7.272727272727272374e-02 8.011869436201780881e-02 1.344086021505376261e-01 4.201680672268907901e-02 3.441295546558704316e-02 4.421052631578947095e-02 8.343125734430081875e-02 4.501125281320329796e-02 4.912280701754385970e-02 3.937007874015747977e-02 2.401746724890829743e-02 5.607476635514018620e-02 4.166666666666666435e-02 8.225108225108225535e-02 0.000000000000000000e+00 nan nan nan nan nan nan 4.545454545454545581e-02 nan nan 0.000000000000000000e+00 8.620689655172413673e-03 5.809859154929577357e-02 1.104651162790697694e-01 9.144542772861356805e-02 1.810154525386313551e-01 nan 6.268656716417909947e-02 9.879518072289156239e-02 1.948051948051948146e-01 1.613603473227206986e-01 9.514563106796115888e-02 5.664488017429193667e-02 8.685446009389671818e-02 5.676855895196506602e-02 2.057613168724279837e-02 4.000000000000000083e-02 1.443736730360934140e-01 9.650455927051672378e-02 5.326876513317191364e-02 5.382436260623229413e-02 4.678362573099414945e-02 7.370517928286852982e-02 4.301075268817204644e-02 9.816753926701571320e-02 1.062691131498470914e-01 1.034022681787858527e-01 3.072196620583717355e-02 2.472703917790622929e-01 2.027204914436156191e-01 1.357142857142857040e-01 9.577464788732394096e-02 1.325301204819277212e-01 3.236857649143532467e-01 2.362030905077262821e-01 2.755905511811023723e-01 1.238938053097345116e-01 6.379310344827586465e-02 8.352144469525960013e-02 1.024811218985976213e-01 4.824561403508771662e-02 1.282952548330404119e-01 2.484316185696361368e-01 1.233396584440227678e-01 1.597597597597597563e-01 2.207334273624823595e-01 2.718204488778054873e-01 2.361290322580645029e-01 1.393442622950819554e-01 9.551656920077972179e-02 3.417136993329912831e-01 4.681303116147308985e-01 5.852953325072284274e-01 3.771806697413274678e-01 5.418719211822660142e-01 3.331648129423660509e-01 1.912185809735921227e-01 1.659070191431175900e-01 1.341095299698145671e-01 1.370370370370370405e-01 1.000000000000000056e-01 nan nan nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 1.558441558441558406e-01 0.000000000000000000e+00 nan 1.370328425821064622e-01 1.918238993710691953e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.516881522406384519e-01 +1.002386634844868729e-01 6.177606177606177751e-02 9.523809523809523281e-02 8.333333333333332871e-02 1.612903225806451568e-01 1.063829787234042562e-01 4.220779220779220797e-02 7.375271149674619831e-02 9.137055837563451410e-02 5.839416058394160391e-02 3.125000000000000000e-02 1.000000000000000056e-01 2.857142857142857054e-02 6.451612903225806273e-02 7.037037037037037479e-02 6.629834254143646133e-02 1.522842639593908684e-02 0.000000000000000000e+00 0.000000000000000000e+00 8.695652173913043237e-02 4.672897196261682068e-02 3.669724770642202039e-02 7.167235494880545843e-02 3.472222222222222376e-02 1.515151515151515194e-02 3.368421052631578871e-02 2.283105022831050102e-02 3.333333333333333287e-02 1.538461538461538547e-02 8.264462809917355601e-03 5.774278215223097033e-02 0.000000000000000000e+00 5.468750000000000000e-02 3.481012658227847917e-02 1.923076923076923184e-02 2.777777777777777624e-02 1.775147928994082885e-02 1.176470588235294101e-02 1.555555555555555580e-01 2.209944751381215378e-02 4.072398190045248972e-02 3.424657534246575152e-02 1.498771498771498678e-01 1.064231738035264496e-01 1.009681881051175678e-01 1.173184357541899453e-01 1.257861635220125784e-01 8.833718244803695496e-02 5.555555555555555247e-02 6.835443037974683889e-02 7.707212055974166365e-02 5.240793201133144702e-02 4.258849557522123574e-02 8.118081180811807795e-02 7.167235494880545843e-02 4.477611940298507204e-02 6.510138740661686185e-02 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 5.263157894736841813e-02 nan 0.000000000000000000e+00 8.802816901408450079e-02 6.296572280178837355e-02 1.468495934959349603e-01 9.385327164573695202e-02 1.507128309572301483e-01 nan 1.696113074204947113e-01 2.008871989860583074e-01 6.850588964662120139e-02 8.284883720930232009e-02 6.233183856502241826e-02 5.839172505839172744e-02 1.490116573745565165e-01 5.190058479532163455e-02 2.348993288590604106e-02 3.170731707317073211e-02 3.241013553329404745e-02 7.413893753648569118e-02 1.604278074866310327e-02 2.141680395387150077e-02 3.385416666666666435e-02 2.261116367076632105e-01 6.057945566286215833e-02 7.275320970042796487e-02 1.369716425896201073e-01 8.687782805429863919e-02 2.314814814814814686e-02 1.104362230811706258e-01 8.907741251325557164e-02 7.272727272727272374e-02 4.188481675392670411e-02 1.171717171717171768e-01 1.946138211382113792e-01 1.927194860813704613e-01 1.622678396871945206e-01 1.471230881281864467e-01 5.787781350482314874e-02 6.987951807228916234e-02 6.951219512195122574e-02 5.999999999999999778e-02 1.009174311926605561e-01 1.247216035634743925e-01 1.367521367521367659e-01 1.259760541384695454e-01 8.063781321184509965e-02 3.096528489819833085e-01 3.442735042735042827e-01 3.446739570676387032e-01 3.203952011291461011e-01 4.296593186372745232e-01 1.898373983739837512e-01 3.650268706076891245e-01 5.833767135172652774e-01 3.112892451569806429e-01 2.562552882871993454e-01 3.792742498255408101e-01 1.509526135808500202e-01 1.161467116357504242e-01 2.194039315155358327e-01 2.121212121212121271e-01 nan nan 7.500000000000000000e-01 nan nan 3.750000000000000000e-01 nan 2.874999999999999778e-01 nan nan 2.954085077650236424e-01 4.008882149046793519e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.193854831527386195e-01 +0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.428571428571428492e-01 5.000000000000000278e-02 8.771929824561403022e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 1.549295774647887203e-01 0.000000000000000000e+00 nan 0.000000000000000000e+00 1.111111111111111049e-01 0.000000000000000000e+00 1.250000000000000000e-01 3.225806451612903136e-02 5.882352941176470507e-02 0.000000000000000000e+00 6.289308176100628922e-02 3.409090909090908839e-02 0.000000000000000000e+00 0.000000000000000000e+00 5.555555555555555247e-02 9.558823529411764053e-02 2.173913043478260809e-02 2.777777777777777624e-02 0.000000000000000000e+00 0.000000000000000000e+00 4.347826086956521618e-02 3.921568627450980338e-02 0.000000000000000000e+00 2.857142857142857054e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.652892561983471120e-02 2.666666666666666838e-02 3.125000000000000000e-02 0.000000000000000000e+00 1.754385964912280604e-02 3.813559322033898552e-02 1.739130434782608717e-02 3.984063745019920250e-02 2.611367127496159665e-02 1.345029239766081797e-01 1.865889212827988308e-01 5.699481865284974219e-02 3.174603174603174427e-02 1.754385964912280604e-02 4.225352112676056260e-02 nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan 2.702702702702702853e-02 2.570093457943925172e-02 8.333333333333332871e-02 6.537530266343825891e-02 7.537688442211054607e-02 nan 7.042253521126760722e-03 6.521739130434782428e-02 3.189033189033189108e-01 2.998137802607076519e-01 8.900523560209423757e-02 9.361702127659574102e-02 3.496503496503496761e-02 4.285714285714285754e-02 5.612244897959183659e-02 3.669724770642202039e-02 1.076115485564304447e-01 1.904761904761904656e-01 1.749999999999999889e-01 7.451923076923076816e-02 1.183206106870229035e-01 7.272727272727272374e-02 2.475247524752475364e-02 1.495327102803738206e-01 7.376058041112454333e-02 2.509920634920634885e-01 6.073752711496745865e-02 3.973214285714285476e-01 3.431919642857143016e-01 5.847953216374268681e-02 6.719367588932806390e-02 7.843137254901960675e-02 3.950953678474114494e-01 1.854838709677419373e-01 2.404580152671755844e-01 9.063444108761328777e-02 8.470588235294117252e-02 1.317829457364341206e-01 6.297229219143576917e-02 3.846153846153846367e-02 6.718346253229974530e-02 1.752808988764044951e-01 5.063291139240506250e-02 1.098527746319365866e-01 1.705521472392637905e-01 2.139764996907854155e-01 2.046843177189409391e-01 1.328903654485049934e-01 1.044176706827309176e-01 2.631058358061325597e-01 3.191489361702127825e-01 5.681233933161953242e-01 3.708187320802803222e-01 8.023809523809524169e-01 5.602369980250164749e-01 3.041474654377880338e-01 3.107569721115537864e-01 2.050898203592814439e-01 1.234684260131951039e-01 2.500000000000000000e-01 nan nan nan nan nan 5.000000000000000000e-01 0.000000000000000000e+00 2.333333333333333370e-01 nan nan 7.284768211920529535e-02 1.150935882118677839e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.622263623660922027e-01 +6.122448979591836593e-02 4.273504273504273587e-02 2.439024390243902524e-02 0.000000000000000000e+00 5.333333333333333676e-02 3.409090909090908839e-02 4.102564102564102561e-02 2.801724137931034531e-02 4.296875000000000000e-02 3.389830508474576259e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.127659574468085055e-02 0.000000000000000000e+00 1.570680628272251231e-02 4.545454545454545581e-02 8.053691275167784713e-02 0.000000000000000000e+00 7.142857142857142461e-02 4.237288135593220151e-02 4.347826086956521618e-02 7.751937984496123923e-03 1.872659176029962610e-02 2.910052910052909891e-02 3.921568627450980338e-03 2.434077079107505037e-02 3.196347031963470142e-02 1.960784313725490169e-02 0.000000000000000000e+00 9.803921568627450844e-03 3.351955307262569767e-02 2.941176470588235253e-02 8.771929824561403022e-03 1.273885350318471402e-02 2.272727272727272790e-02 0.000000000000000000e+00 2.484472049689440826e-02 1.136363636363636395e-02 0.000000000000000000e+00 4.605263157894736586e-02 5.847953216374268681e-03 1.269841269841269840e-02 2.752293577981651529e-02 3.954802259887005983e-02 5.157593123209169156e-02 1.865671641791044610e-02 2.419354838709677352e-02 3.917525773195876249e-02 4.391891891891892136e-02 5.963302752293578313e-02 3.776683087027914859e-02 6.607929515418502209e-02 2.808811959087332832e-01 6.491712707182320519e-02 2.540322580645161255e-01 6.702898550724638305e-02 4.651162790697674354e-02 2.500000000000000000e-01 nan nan nan nan nan nan 3.125000000000000000e-02 8.000000000000000167e-02 nan nan 2.551020408163265363e-02 3.747244673034533236e-02 1.168384879725085923e-01 5.147563486616334866e-02 1.245376078914919860e-01 nan 4.836193447737909684e-02 3.715170278637770773e-02 2.623239436619718146e-01 2.250666666666666649e-01 7.376502002670226599e-02 5.960854092526690629e-02 7.441860465116278966e-02 4.138702460850111897e-02 7.741935483870968082e-02 8.040201005025125747e-02 1.212343864805290189e-01 3.148541114058355239e-01 1.598897312198483689e-01 6.666666666666666574e-02 7.633587786259542207e-02 3.825136612021858007e-02 8.820160366552119713e-02 1.339816315505132360e-01 4.510961214165261357e-02 3.866906474820143713e-01 7.885117493472584838e-02 2.172161172161172216e-01 3.182521933597109998e-01 7.285974499089253875e-02 5.161290322580645157e-02 8.402203856749311528e-02 1.764705882352941291e-01 8.353510895883776988e-02 1.396917148362235017e-01 7.159221076746849488e-02 1.472701149425287293e-01 8.678500986193293798e-02 3.897685749086479690e-02 1.078167115902965018e-02 3.054989816700610927e-02 7.038123167155425908e-02 4.506065857885615394e-02 6.623181133968891743e-02 7.295251204404680501e-02 2.132370076905150402e-01 1.469879518072289282e-01 9.012875536480687011e-02 8.516974389517570354e-02 2.135686035898995971e-01 1.701696632058748992e-01 4.067879980324643485e-01 3.478311431561809663e-01 5.830195138651146358e-01 7.277871418251866675e-01 4.381355932203389592e-01 7.222471910112359117e-01 4.275657650981845026e-01 2.238805970149253810e-01 1.967213114754098324e-01 nan nan 3.333333333333333148e-01 1.666666666666666574e-01 nan nan 0.000000000000000000e+00 6.045197740112994156e-01 8.333333333333332871e-02 nan 1.074999999999999983e-01 1.235361325335618404e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.167764743692752738e-01 +3.973509933774834607e-02 8.928571428571428076e-03 0.000000000000000000e+00 0.000000000000000000e+00 3.571428571428571230e-02 1.063829787234042562e-01 2.280130293159609092e-02 2.966101694915254314e-02 1.463414634146341549e-02 3.092783505154639290e-02 2.000000000000000042e-02 2.325581395348837177e-02 5.172413793103448204e-02 0.000000000000000000e+00 0.000000000000000000e+00 4.071246819338422696e-02 1.031746031746031689e-01 0.000000000000000000e+00 5.882352941176470507e-02 1.923076923076923184e-02 6.349206349206348854e-02 3.968253968253968034e-02 6.944444444444444059e-03 2.061855670103092744e-02 8.403361344537814762e-03 4.347826086956521618e-02 1.937984496124030981e-02 8.571428571428571508e-02 0.000000000000000000e+00 1.754385964912280604e-02 3.743315508021390070e-02 1.538461538461538547e-02 0.000000000000000000e+00 1.562500000000000000e-02 3.174603174603174427e-02 2.325581395348837177e-02 2.500000000000000139e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.123595505617977497e-02 4.424778761061946841e-02 7.462686567164178962e-03 1.709401709401709574e-02 4.743833017077798975e-02 6.934306569343065552e-02 8.880308880308880604e-02 4.255319148936170109e-02 7.949125596184419829e-02 2.662721893491124328e-02 2.181818181818181990e-02 6.838074398249452401e-02 1.379310344827586188e-02 4.245283018867924280e-02 7.462686567164178442e-02 1.118421052631578955e-01 5.157593123209169156e-02 3.981264637002342177e-02 0.000000000000000000e+00 nan nan nan nan nan nan nan 2.857142857142857054e-02 nan nan 8.641975308641974829e-02 5.407725321888411790e-02 1.681850035038542357e-01 1.033687125057683454e-01 1.082568807339449601e-01 nan 8.650875386199793904e-02 1.059870550161812336e-01 1.543255131964809401e-01 1.561536305018222659e-01 4.911479154768703254e-02 5.680473372781064817e-02 8.854860186418109236e-02 4.705882352941176405e-02 4.161712247324613617e-02 2.179836512261580303e-02 2.617801047120418834e-02 2.277074976858994015e-01 3.027522935779816682e-02 1.236263736263736208e-02 2.153110047846890085e-02 9.772883688919477285e-02 6.101344364012409316e-02 5.900621118012422395e-02 4.959785522788203588e-02 1.877637130801687870e-01 2.118933697881066405e-02 6.304619225967540708e-02 9.819260857836525913e-02 6.060606060606060774e-02 1.459854014598540098e-02 8.387096774193548987e-02 8.920187793427229728e-02 8.881578947368420907e-02 6.976744186046511531e-02 8.506429277942631484e-02 2.509652509652509494e-02 5.581395348837209225e-02 5.967078189300411423e-02 5.555555555555555247e-02 7.112970711297071646e-02 7.073170731707316417e-02 7.936507936507936067e-02 8.380797396257119725e-02 6.336088154269972628e-02 2.599410898379970747e-01 1.969295923769190104e-01 2.897085068411659470e-01 3.735717834078489674e-01 3.007518796992481036e-01 1.132538569424964975e-01 2.356544165054803297e-01 4.665860628709606606e-01 2.792881858625803071e-01 4.366043401119148459e-01 6.366990942636698847e-01 3.813847900113507272e-01 3.037156704361874127e-01 4.194585901902975200e-01 4.102564102564102422e-01 nan nan 3.611111111111111049e-01 nan nan nan nan 6.016260162601626549e-01 nan nan 3.828413284132841099e-01 2.149882903981264748e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.309232480533926490e-01 +1.052631578947368363e-01 0.000000000000000000e+00 4.347826086956521618e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.369863013698630061e-02 1.149425287356321823e-02 2.298850574712643646e-02 1.851851851851851749e-02 0.000000000000000000e+00 0.000000000000000000e+00 3.448275862068965469e-02 0.000000000000000000e+00 2.222222222222222307e-02 6.403940886699507895e-02 1.402439024390244038e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.666666666666666644e-02 3.061224489795918297e-02 4.464285714285714385e-02 1.960784313725490169e-02 4.402515723270439968e-02 4.716981132075472039e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 6.382978723404254817e-02 1.204819277108433798e-02 1.030927835051546372e-02 0.000000000000000000e+00 0.000000000000000000e+00 2.325581395348837177e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 8.333333333333332871e-02 9.259259259259258745e-03 1.098901098901098987e-02 2.564102564102564014e-02 6.153846153846154188e-02 7.627118644067797104e-02 9.090909090909091161e-02 5.714285714285714107e-02 1.176470588235294101e-01 1.298701298701298787e-02 5.035971223021582649e-02 6.400000000000000133e-02 1.557377049180327933e-01 4.514170040485829816e-01 6.896551724137930939e-02 7.936507936507936067e-01 1.941747572815533951e-01 2.777777777777777624e-02 nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan 7.407407407407406996e-02 5.019305019305018989e-02 1.284916201117318468e-01 4.926108374384236682e-02 6.756756756756757132e-02 nan 3.626943005181346852e-02 3.260869565217391214e-02 2.515262515262515208e-01 2.293333333333333335e-01 1.102702702702702681e-01 8.179419525065963203e-02 9.309309309309309055e-02 4.248366013071895597e-02 1.672597864768683162e-01 5.691056910569105426e-02 1.384297520661157133e-01 3.054892601431981047e-01 1.896207584830339188e-01 7.339449541284404077e-02 1.483253588516746380e-01 4.784688995215310992e-02 1.036414565826330597e-01 1.203252032520325254e-01 5.014326647564469608e-02 6.273932253313696528e-01 1.063063063063063030e-01 1.882183908045977072e-01 3.955525606469002531e-01 1.285140562248995866e-01 5.389221556886227699e-02 6.569343065693430961e-02 1.652421652421652287e-01 6.598984771573604413e-02 8.417508417508418050e-02 9.677419354838709409e-02 2.054054054054054168e-01 5.970149253731343170e-02 1.824817518248175036e-02 2.631578947368420907e-02 3.658536585365853439e-02 6.060606060606060774e-02 3.720930232558139483e-02 5.750798722044728195e-02 4.878048780487805047e-02 1.841359773371104847e-01 1.604584527220630497e-01 4.366812227074235581e-02 9.445585215605749319e-02 1.645422943221321044e-01 1.222570532915360497e-01 3.688380281690140650e-01 2.461883408071748880e-01 4.627249357326478352e-01 7.888844462215114373e-01 4.056179775280898681e-01 9.714285714285714191e-01 6.326676176890156933e-01 2.353463587921847122e-01 5.000000000000000000e-01 nan nan nan 1.000000000000000000e+00 nan nan nan 6.279069767441860517e-01 0.000000000000000000e+00 nan 1.020942408376963317e-01 1.236055332440874621e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.705088265835929318e-01 +5.732484076433121134e-02 1.298701298701298787e-02 3.030303030303030387e-02 0.000000000000000000e+00 5.555555555555555247e-02 4.918032786885245811e-02 8.695652173913043237e-02 9.922178988326847693e-02 4.482758620689655110e-02 2.127659574468085055e-02 0.000000000000000000e+00 5.263157894736841813e-02 5.405405405405405705e-02 0.000000000000000000e+00 2.678571428571428423e-02 1.452991452991453103e-01 3.649635036496350071e-02 9.708737864077669061e-03 9.090909090909091161e-02 4.918032786885245811e-02 7.462686567164178442e-02 1.400000000000000133e-01 4.255319148936170109e-02 1.756756756756756854e-01 3.333333333333333287e-02 3.333333333333333287e-02 1.005025125628140753e-01 2.564102564102564014e-02 5.000000000000000278e-02 2.040816326530612082e-02 8.450704225352112520e-02 0.000000000000000000e+00 0.000000000000000000e+00 1.754385964912280604e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.846153846153846367e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 9.090909090909090468e-03 0.000000000000000000e+00 1.013824884792626779e-01 5.925925925925926152e-02 8.333333333333332871e-02 0.000000000000000000e+00 9.595959595959595301e-02 4.411764705882353227e-02 6.728538283062644731e-02 6.571428571428571119e-02 4.371584699453551909e-02 5.535924617196701786e-02 5.976095617529880721e-02 2.242990654205607448e-01 3.040380047505938377e-01 1.300448430493273411e-01 0.000000000000000000e+00 nan nan nan nan nan nan 1.250000000000000000e-01 1.818181818181818232e-01 nan 5.000000000000000000e-01 7.142857142857142461e-02 6.451612903225806273e-02 2.108239095315024292e-01 1.723880597014925409e-01 1.408450704225352179e-01 nan 5.902777777777777624e-02 5.585106382978723139e-02 2.305506216696270039e-01 3.832673827020915969e-01 1.145833333333333287e-01 6.995412844036696942e-02 5.225653206650831412e-02 9.550045913682277121e-02 2.433460076045627363e-01 1.259640102827763453e-01 1.516771998055420623e-01 6.172300981461287250e-01 2.870148538572113162e-01 2.024265644955300092e-01 2.062572421784472643e-01 6.963249516441005760e-02 2.933930571108622765e-01 2.054085155350978131e-01 4.821540388227927437e-02 6.336682185738790052e-01 1.979788700045934657e-01 1.535433070866141780e-01 3.695958646616541166e-01 1.772287862513426404e-01 6.730769230769230449e-02 9.310344827586207461e-02 1.195508586525759614e-01 6.643356643356643221e-02 9.859154929577464144e-02 7.819383259911893980e-02 9.549356223175965719e-02 8.333333333333332871e-02 3.151862464183381035e-02 1.739130434782608717e-02 2.336448598130841034e-02 4.373177842565597467e-02 4.858299595141700455e-02 5.989847715736040801e-02 6.631989596879063475e-02 2.202921437031188368e-01 1.948324022346368811e-01 3.224155578300921254e-01 2.401129943502824937e-01 1.690751445086705329e-01 1.289162814586543304e-01 1.671232876712328841e-01 1.614041277121185392e-01 1.959942775393419268e-01 4.243333333333333401e-01 3.675230830991569886e-01 6.560212907518296888e-01 8.510994764397905588e-01 5.969626168224299034e-01 1.764705882352941291e-01 nan nan 1.000000000000000000e+00 nan nan nan 4.545454545454545581e-02 9.226804123711340733e-01 0.000000000000000000e+00 nan 3.771517996870109579e-01 1.897435897435897356e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.377172381399718426e-01 +1.351351351351351426e-01 1.355140186915887723e-01 7.801418439716312214e-02 0.000000000000000000e+00 7.042253521126760896e-02 5.833333333333333426e-02 1.100386100386100408e-01 1.377118644067796549e-01 7.920792079207920888e-02 5.732484076433121134e-02 9.589041095890410427e-02 6.666666666666666574e-02 5.494505494505494414e-02 0.000000000000000000e+00 3.389830508474576259e-02 5.061082024432810023e-02 4.402515723270439968e-02 1.149425287356321823e-02 0.000000000000000000e+00 3.442622950819672067e-01 2.750000000000000222e-01 2.515723270440251708e-02 6.106870229007633349e-02 2.369668246445497464e-02 1.388888888888888812e-02 0.000000000000000000e+00 1.505376344086021591e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan 8.241758241758241621e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.555555555555555247e-02 nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 1.666666666666666644e-02 0.000000000000000000e+00 5.809128630705394369e-02 6.040268456375839229e-02 1.149425287356321823e-01 1.694915254237288130e-02 1.090909090909090856e-01 1.530612244897959218e-01 9.154929577464789026e-02 7.906458797327393928e-02 3.267973856209150513e-02 3.038674033149171144e-02 3.131991051454138808e-02 9.322033898305084887e-02 4.067321178120616998e-02 2.122762148337595800e-01 0.000000000000000000e+00 nan nan nan nan nan nan 4.000000000000000222e-01 6.944444444444444753e-02 nan 3.333333333333333148e-01 3.252032520325203596e-02 6.519065190651907038e-02 5.558121632024634051e-01 3.895410885805762891e-01 2.884411452810180521e-01 0.000000000000000000e+00 1.562913907284768089e-01 2.469387755102040727e-01 4.736437091188918647e-01 5.862853428664283051e-01 2.582818641212801802e-01 2.592592592592592449e-01 2.676282051282051211e-01 2.326939115929941571e-01 1.777978339350180514e-01 7.627118644067797104e-02 1.260638297872340441e-01 4.395309882747068797e-01 8.195542774982027268e-02 3.096330275229357970e-02 2.540834845735027298e-02 4.114942528735632266e-01 4.231557377049180446e-01 7.907742998352552954e-02 5.075593952483801324e-02 2.233044733044733110e-01 3.324584426946631394e-02 9.973521624007060382e-02 1.139436075704905321e-01 1.066907775768535238e-01 8.494208494208493887e-02 7.142857142857142461e-02 8.203530633437175479e-02 1.296296296296296224e-01 1.456692913385826682e-01 1.126482213438735197e-01 4.399999999999999745e-02 3.614457831325301046e-02 4.166666666666666435e-02 5.063291139240506250e-02 1.694915254237288130e-02 1.777777777777777846e-01 4.901960784313725422e-02 1.025641025641025605e-01 5.621805792163543647e-02 2.433837429111531114e-01 2.160437556973564266e-01 4.570048309178744161e-01 4.198623402163225160e-01 2.456964006259780842e-01 1.235804943219772911e-01 1.777426160337552685e-01 3.014227999297382499e-01 1.150828247602441179e-01 1.689794091316025038e-01 5.517730496453900901e-01 2.651646447140381113e-01 6.756822023665781662e-01 8.277830637488106102e-01 0.000000000000000000e+00 nan nan 1.250000000000000000e-01 nan nan 6.250000000000000000e-01 8.181818181818182323e-01 8.258706467661691697e-01 3.333333333333333148e-01 nan 4.987593052109181024e-01 2.199261992619926109e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.493883792048929626e-01 +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 5.882352941176470507e-02 nan 0.000000000000000000e+00 0.000000000000000000e+00 4.545454545454545581e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 3.333333333333333148e-01 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan nan nan nan nan 0.000000000000000000e+00 3.437500000000000000e-01 7.500000000000000000e-01 0.000000000000000000e+00 1.111111111111111049e-01 1.785714285714285754e-01 0.000000000000000000e+00 1.470588235294117696e-01 1.492537313432835688e-01 1.052631578947368363e-01 6.896551724137930939e-02 1.927710843373494076e-01 7.407407407407406996e-02 5.000000000000000278e-02 2.380952380952380820e-01 nan nan nan nan nan nan nan nan nan nan nan 5.555555555555555802e-01 8.571428571428570953e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.307692307692307820e-01 +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan 0.000000000000000000e+00 nan nan nan nan nan 2.000000000000000111e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 2.500000000000000139e-02 2.500000000000000000e-01 nan 3.333333333333333148e-01 6.666666666666666574e-02 0.000000000000000000e+00 2.857142857142856984e-01 7.500000000000000000e-01 nan 1.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00 0.000000000000000000e+00 5.999999999999999778e-01 8.000000000000000444e-01 4.666666666666666741e-01 4.736842105263157632e-01 9.000000000000000222e-01 4.571428571428571286e-01 9.117647058823529216e-01 nan nan nan 2.666666666666666630e-01 nan nan nan nan nan nan nan nan nan nan nan nan 2.000000000000000111e-01 nan nan nan nan nan nan 8.000000000000000167e-02 nan 2.666666666666666630e-01 6.666666666666666574e-02 nan 1.000000000000000000e+00 0.000000000000000000e+00 nan nan nan 1.000000000000000000e+00 nan nan nan nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 5.999999999999999778e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan 0.000000000000000000e+00 nan nan nan nan nan nan 1.875000000000000000e-01 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 3.750000000000000000e-01 2.500000000000000000e-01 4.166666666666666435e-02 0.000000000000000000e+00 nan nan nan 1.666666666666666574e-01 5.454545454545454142e-01 nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 6.666666666666666297e-01 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 6.250000000000000000e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.263157894736841813e-02 0.000000000000000000e+00 3.181818181818181768e-01 2.941176470588235253e-02 0.000000000000000000e+00 1.250000000000000000e-01 3.461538461538461453e-01 nan 6.153846153846154188e-01 2.500000000000000000e-01 nan nan nan nan nan nan 1.000000000000000000e+00 nan nan nan nan nan 4.347826086956521618e-02 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 1.764705882352941291e-01 +0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.379310344827586188e-01 9.649122807017543324e-02 nan 2.000000000000000111e-01 3.125000000000000000e-02 3.571428571428571230e-02 nan 1.428571428571428492e-01 0.000000000000000000e+00 9.677419354838709409e-02 0.000000000000000000e+00 nan 3.243243243243243423e-01 2.500000000000000000e-01 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 nan nan nan 3.333333333333333287e-02 7.142857142857142461e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.538461538461538547e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 1.724137931034482735e-02 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan 1.153846153846153910e-01 nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00 7.500000000000000000e-01 nan 5.000000000000000000e-01 4.814814814814814548e-01 7.179487179487179516e-01 4.320987654320987414e-01 3.783783783783783994e-01 7.142857142857143016e-01 3.499999999999999778e-01 1.707317073170731836e-01 5.555555555555555247e-02 5.000000000000000278e-02 3.855421686746988152e-01 5.192307692307692735e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 4.838709677419354982e-01 1.666666666666666574e-01 2.307692307692307820e-01 nan 1.428571428571428492e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 2.500000000000000000e-01 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 7.142857142857142461e-02 0.000000000000000000e+00 3.571428571428571230e-02 2.500000000000000000e-01 0.000000000000000000e+00 2.692307692307692180e-01 3.750000000000000000e-01 nan nan nan nan nan nan nan 8.750000000000000000e-01 1.000000000000000000e+00 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.570093457943924964e-01 +nan nan nan nan nan 1.000000000000000000e+00 nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 nan nan nan 5.882352941176470507e-02 nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan 2.500000000000000000e-01 2.105263157894736725e-01 nan nan nan nan nan nan nan nan 5.714285714285713969e-01 nan nan 0.000000000000000000e+00 0.000000000000000000e+00 3.571428571428571508e-01 2.916666666666666852e-01 3.333333333333333148e-01 nan 3.529411764705882582e-01 4.242424242424242542e-01 2.023809523809523836e-01 3.673469387755102233e-01 2.097902097902097918e-01 3.424657534246575152e-01 4.464285714285714524e-01 1.129032258064516098e-01 1.833333333333333204e-01 4.166666666666666435e-02 1.551724137931034531e-01 5.000000000000000000e-01 2.800000000000000266e-01 2.340425531914893664e-01 2.777777777777777624e-02 3.055555555555555802e-01 2.250000000000000056e-01 3.571428571428571508e-01 1.000000000000000056e-01 6.301369863013698280e-01 2.727272727272727071e-01 9.090909090909091161e-02 3.161764705882352811e-01 2.105263157894736725e-01 0.000000000000000000e+00 0.000000000000000000e+00 2.173913043478260809e-02 0.000000000000000000e+00 9.090909090909091161e-02 3.846153846153846367e-02 2.380952380952380820e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.128205128205128027e-02 2.325581395348837177e-02 2.972972972972973138e-01 1.000000000000000056e-01 5.217391304347825942e-01 5.555555555555555802e-01 2.424242424242424310e-01 5.660377358490566169e-02 3.090909090909090828e-01 2.857142857142856984e-01 8.823529411764706454e-02 2.684563758389261756e-01 5.581395348837209225e-01 3.030303030303030387e-01 9.399999999999999467e-01 7.861271676300578548e-01 nan nan nan 5.000000000000000000e-01 nan nan nan 1.000000000000000000e+00 9.714285714285714191e-01 nan nan 5.999999999999999778e-01 3.009708737864077444e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.857142857142856984e-01 +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 nan 1.000000000000000056e-01 8.333333333333332871e-02 3.333333333333333287e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 nan nan nan nan nan nan nan nan nan nan nan nan nan nan 5.000000000000000000e-01 nan 1.111111111111111049e-01 5.999999999999999778e-01 1.000000000000000000e+00 nan 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 5.238095238095238360e-01 0.000000000000000000e+00 0.000000000000000000e+00 5.833333333333333703e-01 0.000000000000000000e+00 8.333333333333332871e-02 2.500000000000000000e-01 nan nan nan nan nan nan nan nan 1.000000000000000000e+00 nan nan 1.666666666666666574e-01 5.999999999999999778e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.500000000000000000e-01 +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +6.818181818181817677e-02 5.970149253731343170e-02 1.914893617021276584e-01 0.000000000000000000e+00 0.000000000000000000e+00 1.111111111111111049e-01 7.978723404255319562e-02 4.379562043795620641e-02 1.028571428571428553e-01 4.326923076923076816e-02 0.000000000000000000e+00 3.125000000000000000e-02 0.000000000000000000e+00 2.439024390243902524e-02 6.779661016949152519e-02 1.025641025641025640e-02 0.000000000000000000e+00 nan 0.000000000000000000e+00 6.250000000000000000e-02 2.000000000000000111e-01 1.034482758620689641e-01 2.777777777777777624e-02 1.428571428571428527e-02 0.000000000000000000e+00 2.409638554216867595e-02 1.941747572815533812e-02 6.250000000000000000e-02 1.538461538461538547e-01 0.000000000000000000e+00 2.985074626865671585e-02 2.857142857142857054e-02 1.449275362318840597e-02 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 0.000000000000000000e+00 4.761904761904761640e-02 2.380952380952380820e-01 1.176470588235294101e-01 4.166666666666666435e-02 1.282051282051281937e-01 2.765957446808510745e-01 1.472868217054263684e-01 9.952606635071090113e-02 1.666666666666666574e-01 6.451612903225806273e-02 1.000000000000000056e-01 6.722689075630251809e-02 8.933002481389577809e-02 8.789514263685427320e-02 3.846153846153846367e-02 1.017441860465116282e-01 1.363636363636363535e-01 2.142857142857142738e-01 1.308411214953270896e-01 1.623036649214659732e-01 0.000000000000000000e+00 nan nan nan 0.000000000000000000e+00 nan nan nan 8.000000000000000444e-01 nan nan 1.258992805755395628e-01 9.335219236209335580e-02 2.658486707566461993e-01 2.038073908174692084e-01 2.269938650306748407e-01 nan 1.076115485564304447e-01 9.437751004016063650e-02 2.368064952638700982e-01 1.544799176107106153e-01 7.833655705996131480e-02 7.253886010362693704e-02 9.629629629629629650e-02 4.179104477611940427e-02 0.000000000000000000e+00 4.109589041095890183e-02 4.273504273504273587e-02 6.388526727509778735e-02 3.108808290155440357e-02 0.000000000000000000e+00 8.771929824561403022e-02 1.382978723404255372e-01 1.190476190476190410e-01 1.311475409836065642e-01 2.200000000000000011e-01 3.814064362336114233e-02 3.688524590163934358e-02 6.775700934579438617e-02 6.510138740661686185e-02 1.291866028708134051e-01 4.878048780487805047e-02 1.417910447761193959e-01 8.364312267657993127e-02 1.489361702127659504e-01 1.546961325966850764e-01 1.693811074918566695e-01 6.896551724137930939e-02 1.000000000000000056e-01 9.302325581395348708e-02 4.819277108433735191e-02 1.705426356589147263e-01 1.265822784810126667e-01 2.605042016806722871e-01 1.901840490797546135e-01 1.223300970873786447e-01 4.139709329582747510e-01 5.119496855345911923e-01 7.361111111111111605e-01 5.452229299363057224e-01 3.276167947959787163e-01 1.259309410968178777e-01 1.461877756773787007e-01 2.872977166925293480e-01 1.125827814569536484e-01 8.154350200218420108e-02 4.017887856897144894e-01 1.263157894736842146e-01 2.633181126331811117e-01 4.834337349397590522e-01 3.333333333333333148e-01 nan nan 4.166666666666666852e-01 nan nan nan 4.285714285714285476e-01 5.000000000000000000e-01 8.333333333333332871e-02 0.000000000000000000e+00 8.365384615384615641e-01 6.429675425038640091e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 2.654212195981670575e-01 +1.597796143250688750e-01 3.971119133574007448e-02 1.024390243902438963e-01 nan 2.553191489361701927e-01 9.392265193370165355e-02 5.841924398625429615e-02 1.173594132029339848e-01 1.054263565891472854e-01 9.090909090909091161e-02 7.299270072992700489e-03 8.163265306122448328e-02 0.000000000000000000e+00 7.894736842105262720e-02 8.287292817679557666e-02 6.980802792321116890e-02 2.547770700636942803e-02 0.000000000000000000e+00 0.000000000000000000e+00 3.448275862068965469e-02 4.166666666666666435e-02 6.293706293706294308e-02 9.803921568627450844e-02 4.555314533622559919e-02 2.325581395348837177e-02 2.056555269922879028e-02 2.946954813359528580e-02 2.061855670103092744e-02 5.263157894736841813e-02 1.401869158878504655e-02 5.516014234875445121e-02 4.242424242424242681e-02 4.460093896713614864e-02 3.178484107579462176e-02 3.030303030303030387e-02 1.010101010101010187e-02 1.736111111111111188e-02 1.257861635220125854e-02 1.157894736842105254e-01 2.415458937198067604e-02 1.006711409395973089e-02 9.677419354838709409e-02 2.059496567505720854e-01 1.365787694388100049e-01 1.094377510040160650e-01 1.612377850162866333e-01 1.065830721003134807e-01 1.312618896639188293e-01 1.075612353567625135e-01 8.365226899945325811e-02 9.244863964464186679e-02 7.401032702237521355e-02 6.287920573634858679e-02 1.306306306306306286e-01 8.982035928143712600e-02 1.019736842105263136e-01 9.573091849935316811e-02 2.857142857142856984e-01 nan nan nan nan nan 0.000000000000000000e+00 1.923076923076923184e-02 2.500000000000000000e-01 nan 1.000000000000000000e+00 1.336116910229644961e-01 9.800000000000000377e-02 1.081794195250659618e-01 9.424989191526156329e-02 5.730897009966777478e-02 nan 7.082833133253300939e-02 1.372397841171935362e-01 6.520905255082470875e-02 6.694686280396276723e-02 5.169951442445015755e-02 5.989110707803992767e-02 5.784469096671949334e-02 2.080443828016643668e-02 4.871060171919770754e-02 1.730103806228373842e-02 3.064066852367687901e-02 4.219948849104859095e-02 2.037037037037037202e-02 2.376910016977928572e-02 7.948717948717948234e-02 8.148148148148148806e-02 8.860759493670886111e-02 2.646276595744680993e-01 4.589302769818529026e-01 7.100999655291279078e-02 3.497085761865112441e-02 8.070953436807094816e-02 1.087225105016061261e-01 1.370629370629370680e-01 7.912087912087911734e-02 1.098748261474269822e-01 1.316073354908306459e-01 1.233140655105973010e-01 1.662817551963048368e-01 2.764673614920460931e-01 6.302521008403361158e-02 1.679245283018867829e-01 1.351582549187339555e-01 4.245283018867924280e-02 1.006423982869378980e-01 1.097666378565255035e-01 2.036516853932584248e-01 4.108761329305136156e-01 2.699020859940400308e-01 6.136857955496067829e-01 7.442322991249005204e-01 6.243523316062176143e-01 3.224261771747805039e-01 3.872588424437298782e-01 2.576699418488068716e-01 2.801505481917853091e-01 3.178449031641029654e-01 2.110260336906585044e-01 1.523145843703334890e-01 2.725280391904086885e-01 2.331628303495311139e-01 2.308216068996822579e-01 2.361248761149652986e-01 5.312500000000000000e-01 nan nan 1.000000000000000000e+00 2.500000000000000000e-01 nan 7.500000000000000000e-01 5.714285714285714107e-02 6.756756756756756577e-01 5.555555555555555802e-01 1.000000000000000000e+00 6.781893004115225887e-01 7.828763290430890143e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.034429099397004670e-01 +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan +2.301918265221017390e-01 2.100108813928182883e-01 2.352092352092352012e-01 1.807228915662650592e-01 2.746031746031746268e-01 1.885245901639344135e-01 3.155686109945446960e-01 3.450558543649152043e-01 3.838594401429422098e-01 2.951039570757880703e-01 3.072870939420544456e-01 4.176217765042979924e-01 5.158891142663961649e-01 5.000000000000000000e-01 5.600649350649350433e-01 3.745967741935483653e-01 4.665485157288435936e-01 5.034687809712586892e-01 5.033898305084745228e-01 2.907290729072907198e-01 4.189189189189189144e-01 5.880812049770792749e-01 3.956043956043955867e-01 2.870028700287002854e-01 3.362741771292840354e-01 3.701044386422976396e-01 3.429496614659994225e-01 3.748981255093724596e-01 3.187686196623634727e-01 4.165824064711829977e-01 3.628752886836027480e-01 3.122065727699530613e-01 3.979668674698795261e-01 3.614804168163852083e-01 3.227762803234501265e-01 3.346980552712384704e-01 4.280022766078542817e-01 3.858998144712430522e-01 4.211647727272727071e-01 5.178408051235132703e-01 3.080407701019252653e-01 3.388601036269430211e-01 3.812746756909193291e-01 2.537485582468281264e-01 2.784552845528455167e-01 1.819727891156462662e-01 1.525625744934445693e-01 2.026645135244247165e-01 3.069062720225511076e-01 3.281587738258989750e-01 1.790769230769230780e-01 3.098691192076405976e-01 2.206275033377837202e-01 1.767091541135573651e-01 1.874366767983789150e-01 3.246878001921229551e-01 2.145096283027317641e-01 3.750000000000000000e-01 nan nan 5.000000000000000000e-01 5.000000000000000000e-01 nan nan 2.316076294277929215e-01 3.157894736842105088e-01 nan 7.142857142857143016e-01 2.251908396946564750e-01 1.936807550266721467e-01 2.924836601307189698e-01 1.801604668125455777e-01 2.257597684515195435e-01 0.000000000000000000e+00 1.601255886970172626e-01 1.635991820040899880e-01 2.010688042752170890e-01 2.951881554595928714e-01 3.649938800489596069e-01 3.190406976744186163e-01 2.403973509933774733e-01 3.705062362435803114e-01 4.296724470134875018e-01 5.041860465116279055e-01 4.576642335766423209e-01 3.162806774974075141e-01 4.986795774647887480e-01 4.957761351636747471e-01 4.604691572545612788e-01 2.157788267026297946e-01 3.886342804766269587e-01 5.054631828978621844e-01 3.642773207990599449e-01 2.676910634856449756e-01 2.760215882806476562e-01 3.677349266702878983e-01 3.299057412167952230e-01 3.257359924026590470e-01 4.230235783633841673e-01 2.546583850931676829e-01 3.362871067789100499e-01 3.357664233576642121e-01 3.918291550603528184e-01 3.028509951586874638e-01 3.632514817950889263e-01 2.408477842003853564e-01 2.703761755485893370e-01 2.149321266968325927e-01 2.451154529307282282e-01 3.247863247863247982e-01 1.613722998729351932e-01 2.558857583944422753e-01 2.372881355932203451e-01 2.144516129032258134e-01 2.767094017094017255e-01 1.734248284466625156e-01 2.036673215455140906e-01 1.540333796940194788e-01 2.563350226727127423e-01 2.790055248618784622e-01 1.701794360581030952e-01 3.127171646977067176e-01 1.826323364784903369e-01 1.481223922114047187e-01 1.107723577235772416e-01 2.680862680862680647e-01 2.090779127948534655e-01 3.913043478260869734e-01 nan nan nan nan nan nan 2.205513784461152760e-01 2.571428571428571175e-01 1.282051282051281937e-01 nan 2.176395939086294418e-01 1.653323166857288140e-01 nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan 3.861518520821809464e-01 diff --git a/data/brain/F-Tract/Lausanne2018-scale2/Lausanne2018-scale2.txt b/data/brain/F-Tract/Lausanne2018-scale2/Lausanne2018-scale2.txt new file mode 100644 index 0000000..2df68c8 --- /dev/null +++ b/data/brain/F-Tract/Lausanne2018-scale2/Lausanne2018-scale2.txt @@ -0,0 +1,256 @@ +ctx-rh-lateralorbitofrontal_1 +ctx-rh-lateralorbitofrontal_2 +ctx-rh-parsorbitalis_1 +ctx-rh-frontalpole_1 +ctx-rh-medialorbitofrontal_1 +ctx-rh-medialorbitofrontal_2 +ctx-rh-parstriangularis_1 +ctx-rh-parsopercularis_1 +ctx-rh-rostralmiddlefrontal_1 +ctx-rh-rostralmiddlefrontal_2 +ctx-rh-superiorfrontal_1 +ctx-rh-superiorfrontal_2 +ctx-rh-superiorfrontal_3 +ctx-rh-superiorfrontal_4 +ctx-rh-caudalmiddlefrontal_1 +ctx-rh-precentral_1 +ctx-rh-precentral_2 +ctx-rh-precentral_3 +ctx-rh-paracentral_1 +ctx-rh-rostralanteriorcingulate_1 +ctx-rh-caudalanteriorcingulate_1 +ctx-rh-posteriorcingulate_1 +ctx-rh-isthmuscingulate_1 +ctx-rh-postcentral_1 +ctx-rh-postcentral_2 +ctx-rh-supramarginal_1 +ctx-rh-supramarginal_2 +ctx-rh-superiorparietal_1 +ctx-rh-superiorparietal_2 +ctx-rh-superiorparietal_3 +ctx-rh-inferiorparietal_1 +ctx-rh-inferiorparietal_2 +ctx-rh-inferiorparietal_3 +ctx-rh-precuneus_1 +ctx-rh-precuneus_2 +ctx-rh-cuneus_1 +ctx-rh-pericalcarine_1 +ctx-rh-lateraloccipital_1 +ctx-rh-lateraloccipital_2 +ctx-rh-lateraloccipital_3 +ctx-rh-lingual_1 +ctx-rh-lingual_2 +ctx-rh-fusiform_1 +ctx-rh-fusiform_2 +ctx-rh-parahippocampal_1 +ctx-rh-entorhinal_1 +ctx-rh-temporalpole_1 +ctx-rh-inferiortemporal_1 +ctx-rh-inferiortemporal_2 +ctx-rh-middletemporal_1 +ctx-rh-middletemporal_2 +ctx-rh-bankssts_1 +ctx-rh-superiortemporal_1 +ctx-rh-superiortemporal_2 +ctx-rh-transversetemporal_1 +ctx-rh-insula_1 +ctx-rh-insula_2 +thal-rh-pulvinar +thal-rh-ventral-anterior +thal-rh-mediodorsal +thal-rh-lateral-posterior-ventral-posterior-group +thal-rh-pulvinar-medial-centrolateral-group +thal-rh-ventrolateral +thal-rh-ventral-posterior-ventrolateral-group +subc-rh-caudate +subc-rh-putamen +subc-rh-pallidum +subc-rh-accumbens-area +subc-rh-amygdala +subc-rh-hippocampus +ctx-lh-lateralorbitofrontal_1 +ctx-lh-lateralorbitofrontal_2 +ctx-lh-parsorbitalis_1 +ctx-lh-frontalpole_1 +ctx-lh-medialorbitofrontal_1 +ctx-lh-medialorbitofrontal_2 +ctx-lh-parstriangularis_1 +ctx-lh-parsopercularis_1 +ctx-lh-rostralmiddlefrontal_1 +ctx-lh-rostralmiddlefrontal_2 +ctx-lh-superiorfrontal_1 +ctx-lh-superiorfrontal_2 +ctx-lh-superiorfrontal_3 +ctx-lh-superiorfrontal_4 +ctx-lh-caudalmiddlefrontal_1 +ctx-lh-precentral_1 +ctx-lh-precentral_2 +ctx-lh-precentral_3 +ctx-lh-paracentral_1 +ctx-lh-rostralanteriorcingulate_1 +ctx-lh-caudalanteriorcingulate_1 +ctx-lh-posteriorcingulate_1 +ctx-lh-isthmuscingulate_1 +ctx-lh-postcentral_1 +ctx-lh-postcentral_2 +ctx-lh-supramarginal_1 +ctx-lh-supramarginal_2 +ctx-lh-superiorparietal_1 +ctx-lh-superiorparietal_2 +ctx-lh-superiorparietal_3 +ctx-lh-inferiorparietal_1 +ctx-lh-inferiorparietal_2 +ctx-lh-inferiorparietal_3 +ctx-lh-precuneus_1 +ctx-lh-precuneus_2 +ctx-lh-cuneus_1 +ctx-lh-pericalcarine_1 +ctx-lh-lateraloccipital_1 +ctx-lh-lateraloccipital_2 +ctx-lh-lateraloccipital_3 +ctx-lh-lingual_1 +ctx-lh-lingual_2 +ctx-lh-fusiform_1 +ctx-lh-fusiform_2 +ctx-lh-parahippocampal_1 +ctx-lh-entorhinal_1 +ctx-lh-temporalpole_1 +ctx-lh-inferiortemporal_1 +ctx-lh-inferiortemporal_2 +ctx-lh-middletemporal_1 +ctx-lh-middletemporal_2 +ctx-lh-bankssts_1 +ctx-lh-superiortemporal_1 +ctx-lh-superiortemporal_2 +ctx-lh-transversetemporal_1 +ctx-lh-insula_1 +ctx-lh-insula_2 +thal-lh-pulvinar +thal-lh-ventral-anterior +thal-lh-mediodorsal +thal-lh-lateral-posterior-ventral-posterior-group +thal-lh-pulvinar-medial-centrolateral-group +thal-lh-ventrolateral +thal-lh-ventral-posterior-ventrolateral-group +subc-lh-caudate +subc-lh-putamen +subc-lh-pallidum +subc-lh-accumbens-area +subc-lh-amygdala +subc-lh-hippocampus +brain-stem +wm-brain-white_matter +wm-rh-lateralorbitofrontal_1 +wm-rh-lateralorbitofrontal_2 +wm-rh-parsorbitalis_1 +wm-rh-frontalpole_1 +wm-rh-medialorbitofrontal_1 +wm-rh-medialorbitofrontal_2 +wm-rh-parstriangularis_1 +wm-rh-parsopercularis_1 +wm-rh-rostralmiddlefrontal_1 +wm-rh-rostralmiddlefrontal_2 +wm-rh-superiorfrontal_1 +wm-rh-superiorfrontal_2 +wm-rh-superiorfrontal_3 +wm-rh-superiorfrontal_4 +wm-rh-caudalmiddlefrontal_1 +wm-rh-precentral_1 +wm-rh-precentral_2 +wm-rh-precentral_3 +wm-rh-paracentral_1 +wm-rh-rostralanteriorcingulate_1 +wm-rh-caudalanteriorcingulate_1 +wm-rh-posteriorcingulate_1 +wm-rh-isthmuscingulate_1 +wm-rh-postcentral_1 +wm-rh-postcentral_2 +wm-rh-supramarginal_1 +wm-rh-supramarginal_2 +wm-rh-superiorparietal_1 +wm-rh-superiorparietal_2 +wm-rh-superiorparietal_3 +wm-rh-inferiorparietal_1 +wm-rh-inferiorparietal_2 +wm-rh-inferiorparietal_3 +wm-rh-precuneus_1 +wm-rh-precuneus_2 +wm-rh-cuneus_1 +wm-rh-pericalcarine_1 +wm-rh-lateraloccipital_1 +wm-rh-lateraloccipital_2 +wm-rh-lateraloccipital_3 +wm-rh-lingual_1 +wm-rh-lingual_2 +wm-rh-fusiform_1 +wm-rh-fusiform_2 +wm-rh-parahippocampal_1 +wm-rh-entorhinal_1 +wm-rh-temporalpole_1 +wm-rh-inferiortemporal_1 +wm-rh-inferiortemporal_2 +wm-rh-middletemporal_1 +wm-rh-middletemporal_2 +wm-rh-bankssts_1 +wm-rh-superiortemporal_1 +wm-rh-superiortemporal_2 +wm-rh-transversetemporal_1 +wm-rh-insula_1 +wm-rh-insula_2 +wm-lh-lateralorbitofrontal_1 +wm-lh-lateralorbitofrontal_2 +wm-lh-parsorbitalis_1 +wm-lh-frontalpole_1 +wm-lh-medialorbitofrontal_1 +wm-lh-medialorbitofrontal_2 +wm-lh-parstriangularis_1 +wm-lh-parsopercularis_1 +wm-lh-rostralmiddlefrontal_1 +wm-lh-rostralmiddlefrontal_2 +wm-lh-superiorfrontal_1 +wm-lh-superiorfrontal_2 +wm-lh-superiorfrontal_3 +wm-lh-superiorfrontal_4 +wm-lh-caudalmiddlefrontal_1 +wm-lh-precentral_1 +wm-lh-precentral_2 +wm-lh-precentral_3 +wm-lh-paracentral_1 +wm-lh-rostralanteriorcingulate_1 +wm-lh-caudalanteriorcingulate_1 +wm-lh-posteriorcingulate_1 +wm-lh-isthmuscingulate_1 +wm-lh-postcentral_1 +wm-lh-postcentral_2 +wm-lh-supramarginal_1 +wm-lh-supramarginal_2 +wm-lh-superiorparietal_1 +wm-lh-superiorparietal_2 +wm-lh-superiorparietal_3 +wm-lh-inferiorparietal_1 +wm-lh-inferiorparietal_2 +wm-lh-inferiorparietal_3 +wm-lh-precuneus_1 +wm-lh-precuneus_2 +wm-lh-cuneus_1 +wm-lh-pericalcarine_1 +wm-lh-lateraloccipital_1 +wm-lh-lateraloccipital_2 +wm-lh-lateraloccipital_3 +wm-lh-lingual_1 +wm-lh-lingual_2 +wm-lh-fusiform_1 +wm-lh-fusiform_2 +wm-lh-parahippocampal_1 +wm-lh-entorhinal_1 +wm-lh-temporalpole_1 +wm-lh-inferiortemporal_1 +wm-lh-inferiortemporal_2 +wm-lh-middletemporal_1 +wm-lh-middletemporal_2 +wm-lh-bankssts_1 +wm-lh-superiortemporal_1 +wm-lh-superiortemporal_2 +wm-lh-transversetemporal_1 +wm-lh-insula_1 +wm-lh-insula_2 diff --git a/data/brain/README.md b/data/brain/README.md new file mode 100644 index 0000000..5c30533 --- /dev/null +++ b/data/brain/README.md @@ -0,0 +1,100 @@ +# Data used in the study of Brain Bicommunities + +## Summary + +This directory contains brain connectivity data and derivatives used to study directed bicommunities in the directed human connectome. + +## Primary Datasets + +### Multiscale Atlas of White Matter Connectivity (BundleAtlas) + +> Alemán-Gómez Y, Griffa A, Houde JC, Najdenovska E, Magon S, Cuadra MB, et al. A multi-scale probabilistic atlas of the human connectome. Sci Data. 2022 Aug 23;9(1):516. + +**Repository**: https://github.com/connectomicslab/probconnatlas + +Probabilistic atlas of white matter connectivity that provides structural connectivity matrices (see [derivative](#structural-connectivity)) along with probabilistic fiber bundle maps and streamline centroids. Used as the structural backbone for the directed connectome. + +- `./BundleAtlas/centroids/scale2/lausanne2018.scale2.sym.corrected+aseg_MaxProb.nii` is the volumetric definition of gray matter regions used in the atlas. +- `./BundleAtlas/centroids/scale2/group_centroids_scale2/wm.connatlas.scale2.centroids.h5.gz` is the centroid data. In detail, each edge of the structural connectome is defined by a set of white matter streamlines which are then summarized into 20 centroids. + +### Invasive Recordings of Electrical Brain Conduction (F-Tract) + +> Trebaul L, Deman P, Tuyisenge V, Jedynak M, Hugues E, Rudrauf D, et al. Probabilistic functional tractography of the human cortex revisited. NeuroImage. 2018 Nov 1;181:414–29. + +**Repository**: https://search.kg.ebrains.eu/instances/41db823e-7e1b-44c7-9c69-eaa26e226384 + +Intracranial sEEG recordings from patients with epilepsy providing ground-truth measurements of electrical signal propagation between brain regions. Used to validate the directionality of grouped connections identified through bicommunity analysis. Contains cortico-cortical evoked potentials (CCEPs) directed brain connectivity. + +- `./F-Tract/Lausanne2018-scale2/Lausanne2018-scale2.txt` is the parcel labels and order of the F-Tract dataset. +- `./F-Tract/Lausanne2018-scale2/15_inf/50/probability.txt` is the matrix of F-Tract probability that captures the proportion of patients in which a directed connection exists between regions pairs. +- `./F-Tract/Lausanne2018-scale2/15_inf/50/max_peak_delay_50__zth5/min_value_gen__0` is the directory in which F-Tract features are stored. Each feature has a specific directory (e.g., `feature_ampl_zth5`) in which several files can be found. Here are those that are used in the analyses: + - `N_with_values.txt.gz`: Number of entries (meansurements) + - `nanquantile_0.5.txt.gz`: Median of the measured value for each pairs of regions (connectivity matrix) + - Features in `implantation_name` allow to assess the robustness of measurements by considering, for example, the total number of measurement for a feature (`N_with_values`) or the number of unique implants for a connection (ratio between `N_with_values` and `count_unique_str`). + +### Segmented Anatomical White Matter Fiber Bundles (SCIL) + +> St-Onge E, Schilling KG, Rheault F. BundleSeg: A Versatile, Reliable and Reproducible Approach to White Matter Bundle Segmentation. In: Karaman M, Mito R, Powell E, Rheault F, Winzeck S, editors. Computational Diffusion MRI. Cham: Springer Nature Switzerland; 2023. p. 47–57. + +**Repository**: https://github.com/scilus/rbx_flow + +The RecoBundles X (RBX) or SCIL atlas containing 51 anatomically-defined white matter fiber bundles and provides anatomical validation for individual white matter tracts identifies as bicommunities. + +- `./SCIL/bundle_names.csv` is the name and ids of segmented anatomical bundles. +- `./SCIL/atlas/pop_average` is the directory in which individual fiber bundles are found in separated `.trk` files (with labels such as `AF_L.trk` for the left Arcuate Fasciculus). +- `./SCIL/centroids` is the directory in which streamlines centroids are found in separated `.trk` files (with labels such as `AF_L_centroid.trk` for the left Arcuate Fasciculus). + +## Derivatives + +### Structural Connectivity + +Group-averaged structural connectivity matrices derived from BundleAtlas. In `./derivatives/structural_connectome` there are several features for each scale of the Lausanne 2018 atlas: +- `Laus2018_brain_labels-scale.csv`: label and ordering of the gray matter parcels. +- `Laus2018_roi_centers-ftract-scale.pkl`: spatial location of the center of each gray matter parcel of the atlas in MNI coordinate space. +- `Laus2018_bundle_probability_atlas-scale.pkl`: structural connectome in which connections are modeled as the proportion of participants (out of $N=66$) with at least one streamline between region pairs. This is used for thresholding the structural connectome at a level of 0.5 (half of the participants). +- `Laus2018_bundle_streamlines_atlas-scale.pkl`: structural connectome in which connections are modeled as the numbe of streamlines between region pairs. This is used for thresholding the structural connectome by considering connections with least 5 streamlines. + +### rDCM (Regression Dynamic Causal Modeling) + +> Paquola C, Garber M, Frässle S, Royer J, Zhou Y, Tavakol S, et al. The architecture of the human default mode network explored through cytoarchitecture, wiring and signal flow. Nat Neurosci. 2025 Mar;28(3):654–64. + +**Repository**: https://zenodo.org/records/14034721 + +Effective connectivity estimates computed using regression dynamic causal modeling on resting-state fMRI data. Provides directionality to structural connectivity from an estimated edge-wise asymmetry of connection at the whole-brain scale. + +In `./derivatives/atlas_correspondance/rDCM`, rDCM effective connectivity matrices can be found. Note that these matrices where originally computed with the Schaeffer400 parcellation (with 14 subcortical structures) and have been mapped to the Lausanne2018 atlas. + +### Brain Lobes and Yeo 7, 17 Networks Matching + +Mapping between anatomical parcellations (Lausanne atlas, scale 2) and functional networks from the Yeo 7 and 17 network as well as the main brain lobes. Used to interpret bicommunities in terms of established anatomical lobes (frontal, parietal, temporal, occipital) and functional networks (visual, somatomotor, attention, default mode, etc.). + +The assignment of atlas parcels to brain lobes and Yeo2011 resting state networks can be found in `./derivatives/atlas_correspondance/Lobes` and `./derivatives/atlas_correspondance/YeoNetworks` respectively. The `.pkl` files contain the matrix of correspondence from the lobe/network definition to the nodal definition (size $N_{Network}\times N_{Parcels}$) where each entry $A_{ij}$ represents the normalized volumetric overlap between network $i$ and region $j$. + +### Results of Consensus Clustering + +Consensus clustering results across multiple runs (n=50 trials) of the bicommunity detection algorithm at varying k values (10-80 bicommunities). The consensus matrices (of size $N_{Edges} \times N_{Edges}$) capture the proportion of k-means runs in which two edges were found in a similar cluster. The filename `brain_consensus-EC_scale2_nvec20_trials50_ninit50_kmeans10-79_slines_thresh5____.pkl` captures the parameters of that specific run: +- `scale2`: Lausanne2018 atlas scale is `2`, +- `nvec20`: `20` first components of the SVD are included in the clustering, +- `trials50`: K-means is repeated over `50` random initializations, +- `kmeans10-79`: K-means is repeated for $K$ number of clusters going from `10` to `79`, +- `slines_thresh5`: the undirected connectome is thresholded to consider only connections with at least `5` streamlines. + +### Results of Permutation Testing + +Statistical validation through permutation testing by either: +- Randomly swapping the edge weights with the opposite direction to remove any structured directionality. This is used for non-parametric testing of significantly asymmetric bicommunities. The filename `Dir-permutations_scale2_gamma1-10000Perm-K13_RatioOnly.pkl` captures the parameters of a permuation setting in which: + - `scale2`: Lausanne2018 atlas scale is `2`, + - `gamma1`: non-linear transformation to the graph asymmetry by element-wise power by a value $\gamma=1$ (no non-linearity), + - `10000Perm`: number of permutations is `10000`, + - `K13`: testing has been made for $K=13$ bicommunities, + +- Reshuffling the edge-to-cluster assignment to generate random bicommunity structure. This is used for non-parametric testing of the meaningful aggregation of edge asymmetry at the level of true against random bicommunities. The filename `permutations_scale2_gamma1-F_meas49_impl2-4999Perm-Abs-K3.pkl` captures the parameters of the permuation setting in which: + - `scale2`: Lausanne2018 atlas scale is `2`, + - `gamma1`: non-linear transformation to the graph asymmetry by element-wise power by a value $\gamma=1$ (no non-linearity), + - `F_meas49_impl2`: F-Tract thresholding parameters considering strictly more than `49` measurements in strictly more than `2` implants, + - `4999Perm`: number of permutations is `4999`, + - `Abs`: considers the absolute value of correlations thus allowing negative correlation, + - `K3`: permutations have been computed for the `3` highest local maxima of cluster stability, + + +The permuted data and results are saved to keep a fixed state of the figures and results. While subtle changes may occur with re-computation, the results and significance are proven to remain robust. \ No newline at end of file diff --git a/data/brain/SCIL/atlas/pop_average/AC.trk b/data/brain/SCIL/atlas/pop_average/AC.trk new file mode 100644 index 0000000..fc98f80 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/AC.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/AF_L.trk b/data/brain/SCIL/atlas/pop_average/AF_L.trk new file mode 100644 index 0000000..92d2cb8 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/AF_L.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/AF_R.trk b/data/brain/SCIL/atlas/pop_average/AF_R.trk new file mode 100644 index 0000000..a24983e Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/AF_R.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/CC_Fr_1.trk b/data/brain/SCIL/atlas/pop_average/CC_Fr_1.trk new file mode 100644 index 0000000..09e0d57 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/CC_Fr_1.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/CC_Fr_2.trk b/data/brain/SCIL/atlas/pop_average/CC_Fr_2.trk new file mode 100644 index 0000000..d0dfed3 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/CC_Fr_2.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/CC_Oc.trk b/data/brain/SCIL/atlas/pop_average/CC_Oc.trk new file mode 100644 index 0000000..17d2615 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/CC_Oc.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/CC_Pa.trk b/data/brain/SCIL/atlas/pop_average/CC_Pa.trk new file mode 100644 index 0000000..635b3ff Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/CC_Pa.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/CC_Pr_Po.trk b/data/brain/SCIL/atlas/pop_average/CC_Pr_Po.trk new file mode 100644 index 0000000..287a782 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/CC_Pr_Po.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/CC_Te.trk b/data/brain/SCIL/atlas/pop_average/CC_Te.trk new file mode 100644 index 0000000..cb29d36 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/CC_Te.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/CG_L.trk b/data/brain/SCIL/atlas/pop_average/CG_L.trk new file mode 100644 index 0000000..d4e6a71 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/CG_L.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/CG_L_An.trk b/data/brain/SCIL/atlas/pop_average/CG_L_An.trk new file mode 100644 index 0000000..dc3a962 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/CG_L_An.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/CG_L_Po.trk b/data/brain/SCIL/atlas/pop_average/CG_L_Po.trk new file mode 100644 index 0000000..1b871b8 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/CG_L_Po.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/CG_L_curve.trk b/data/brain/SCIL/atlas/pop_average/CG_L_curve.trk new file mode 100644 index 0000000..dc005e4 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/CG_L_curve.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/CG_R.trk b/data/brain/SCIL/atlas/pop_average/CG_R.trk new file mode 100644 index 0000000..a4eb564 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/CG_R.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/CG_R_An.trk b/data/brain/SCIL/atlas/pop_average/CG_R_An.trk new file mode 100644 index 0000000..e4c93b0 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/CG_R_An.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/CG_R_Po.trk b/data/brain/SCIL/atlas/pop_average/CG_R_Po.trk new file mode 100644 index 0000000..a7844ac Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/CG_R_Po.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/CG_R_curve.trk b/data/brain/SCIL/atlas/pop_average/CG_R_curve.trk new file mode 100644 index 0000000..41abdfe Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/CG_R_curve.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/FAT_L.trk b/data/brain/SCIL/atlas/pop_average/FAT_L.trk new file mode 100644 index 0000000..af803aa Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/FAT_L.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/FAT_R.trk b/data/brain/SCIL/atlas/pop_average/FAT_R.trk new file mode 100644 index 0000000..34912dd Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/FAT_R.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/FPT_L.trk b/data/brain/SCIL/atlas/pop_average/FPT_L.trk new file mode 100644 index 0000000..065f557 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/FPT_L.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/FPT_L_Brainstem.trk b/data/brain/SCIL/atlas/pop_average/FPT_L_Brainstem.trk new file mode 100644 index 0000000..f640db4 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/FPT_L_Brainstem.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/FPT_R.trk b/data/brain/SCIL/atlas/pop_average/FPT_R.trk new file mode 100644 index 0000000..06c3b78 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/FPT_R.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/FPT_R_Brainstem.trk b/data/brain/SCIL/atlas/pop_average/FPT_R_Brainstem.trk new file mode 100644 index 0000000..cc4ae8a Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/FPT_R_Brainstem.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/FX_L.trk b/data/brain/SCIL/atlas/pop_average/FX_L.trk new file mode 100644 index 0000000..808531d Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/FX_L.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/FX_R.trk b/data/brain/SCIL/atlas/pop_average/FX_R.trk new file mode 100644 index 0000000..b3dce7a Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/FX_R.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/ICP_L.trk b/data/brain/SCIL/atlas/pop_average/ICP_L.trk new file mode 100644 index 0000000..f766262 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/ICP_L.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/ICP_R.trk b/data/brain/SCIL/atlas/pop_average/ICP_R.trk new file mode 100644 index 0000000..f8de694 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/ICP_R.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/IFOF_L.trk b/data/brain/SCIL/atlas/pop_average/IFOF_L.trk new file mode 100644 index 0000000..ab9cb61 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/IFOF_L.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/IFOF_R.trk b/data/brain/SCIL/atlas/pop_average/IFOF_R.trk new file mode 100644 index 0000000..9eecebd Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/IFOF_R.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/ILF_L.trk b/data/brain/SCIL/atlas/pop_average/ILF_L.trk new file mode 100644 index 0000000..d790a9a Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/ILF_L.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/ILF_R.trk b/data/brain/SCIL/atlas/pop_average/ILF_R.trk new file mode 100644 index 0000000..133bc36 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/ILF_R.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/MCP.trk b/data/brain/SCIL/atlas/pop_average/MCP.trk new file mode 100644 index 0000000..d894b08 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/MCP.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/MdLF_L.trk b/data/brain/SCIL/atlas/pop_average/MdLF_L.trk new file mode 100644 index 0000000..f2d8a5c Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/MdLF_L.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/MdLF_R.trk b/data/brain/SCIL/atlas/pop_average/MdLF_R.trk new file mode 100644 index 0000000..62cc911 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/MdLF_R.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/OR_ML_L.trk b/data/brain/SCIL/atlas/pop_average/OR_ML_L.trk new file mode 100644 index 0000000..5a5dece Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/OR_ML_L.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/OR_ML_R.trk b/data/brain/SCIL/atlas/pop_average/OR_ML_R.trk new file mode 100644 index 0000000..a9c4ea0 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/OR_ML_R.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/PC.trk b/data/brain/SCIL/atlas/pop_average/PC.trk new file mode 100644 index 0000000..c6513e4 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/PC.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/POPT_L.trk b/data/brain/SCIL/atlas/pop_average/POPT_L.trk new file mode 100644 index 0000000..86a6a61 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/POPT_L.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/POPT_L_Brainstem.trk b/data/brain/SCIL/atlas/pop_average/POPT_L_Brainstem.trk new file mode 100644 index 0000000..d94df3d Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/POPT_L_Brainstem.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/POPT_R.trk b/data/brain/SCIL/atlas/pop_average/POPT_R.trk new file mode 100644 index 0000000..ebefc60 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/POPT_R.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/POPT_R_Brainstem.trk b/data/brain/SCIL/atlas/pop_average/POPT_R_Brainstem.trk new file mode 100644 index 0000000..dbe2a25 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/POPT_R_Brainstem.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/PYT_L.trk b/data/brain/SCIL/atlas/pop_average/PYT_L.trk new file mode 100644 index 0000000..e901dea Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/PYT_L.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/PYT_L_Brainstem.trk b/data/brain/SCIL/atlas/pop_average/PYT_L_Brainstem.trk new file mode 100644 index 0000000..2daf7f6 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/PYT_L_Brainstem.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/PYT_R.trk b/data/brain/SCIL/atlas/pop_average/PYT_R.trk new file mode 100644 index 0000000..6a42d63 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/PYT_R.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/PYT_R_Brainstem.trk b/data/brain/SCIL/atlas/pop_average/PYT_R_Brainstem.trk new file mode 100644 index 0000000..5fb8666 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/PYT_R_Brainstem.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/SCP_L.trk b/data/brain/SCIL/atlas/pop_average/SCP_L.trk new file mode 100644 index 0000000..f090eb9 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/SCP_L.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/SCP_R.trk b/data/brain/SCIL/atlas/pop_average/SCP_R.trk new file mode 100644 index 0000000..80b9104 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/SCP_R.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/SLF_L.trk b/data/brain/SCIL/atlas/pop_average/SLF_L.trk new file mode 100644 index 0000000..d1c2a62 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/SLF_L.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/SLF_R.trk b/data/brain/SCIL/atlas/pop_average/SLF_R.trk new file mode 100644 index 0000000..6d3c5d9 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/SLF_R.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/UF_L.trk b/data/brain/SCIL/atlas/pop_average/UF_L.trk new file mode 100644 index 0000000..5d8dfc8 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/UF_L.trk differ diff --git a/data/brain/SCIL/atlas/pop_average/UF_R.trk b/data/brain/SCIL/atlas/pop_average/UF_R.trk new file mode 100644 index 0000000..c30f1b6 Binary files /dev/null and b/data/brain/SCIL/atlas/pop_average/UF_R.trk differ diff --git a/data/brain/SCIL/bundle_names.csv b/data/brain/SCIL/bundle_names.csv new file mode 100644 index 0000000..ac662fb --- /dev/null +++ b/data/brain/SCIL/bundle_names.csv @@ -0,0 +1,52 @@ +,BundleName +1,AC +2,AF_L +3,AF_R +4,CC_Fr_1 +5,CC_Fr_2 +6,CC_Oc +7,CC_Pa +8,CC_Pr_Po +9,CC_Te +10,CG_L +11,CG_L_An +12,CG_L_Po +13,CG_L_curve +14,CG_R +15,CG_R_An +16,CG_R_Po +17,CG_R_curve +18,FAT_L +19,FAT_R +20,FPT_L +21,FPT_L_Brainstem +22,FPT_R +23,FPT_R_Brainstem +24,FX_L +25,FX_R +26,ICP_L +27,ICP_R +28,IFOF_L +29,IFOF_R +30,ILF_L +31,ILF_R +32,MCP +33,MdLF_L +34,MdLF_R +35,OR_ML_L +36,OR_ML_R +37,PC +38,POPT_L +39,POPT_L_Brainstem +40,POPT_R +41,POPT_R_Brainstem +42,PYT_L +43,PYT_L_Brainstem +44,PYT_R +45,PYT_R_Brainstem +46,SCP_L +47,SCP_R +48,SLF_L +49,SLF_R +50,UF_L +51,UF_R diff --git a/data/brain/SCIL/centroids/AC_centroid.trk b/data/brain/SCIL/centroids/AC_centroid.trk new file mode 100644 index 0000000..6dc6deb Binary files /dev/null and b/data/brain/SCIL/centroids/AC_centroid.trk differ diff --git a/data/brain/SCIL/centroids/AF_L_centroid.trk b/data/brain/SCIL/centroids/AF_L_centroid.trk new file mode 100644 index 0000000..e34a303 Binary files /dev/null and b/data/brain/SCIL/centroids/AF_L_centroid.trk differ diff --git a/data/brain/SCIL/centroids/AF_R_centroid.trk b/data/brain/SCIL/centroids/AF_R_centroid.trk new file mode 100644 index 0000000..54ea22c Binary files /dev/null and b/data/brain/SCIL/centroids/AF_R_centroid.trk differ diff --git a/data/brain/SCIL/centroids/CC_Fr_1_centroid.trk b/data/brain/SCIL/centroids/CC_Fr_1_centroid.trk new file mode 100644 index 0000000..f803f7b Binary files /dev/null and b/data/brain/SCIL/centroids/CC_Fr_1_centroid.trk differ diff --git a/data/brain/SCIL/centroids/CC_Fr_2_centroid.trk b/data/brain/SCIL/centroids/CC_Fr_2_centroid.trk new file mode 100644 index 0000000..90eee75 Binary files /dev/null and b/data/brain/SCIL/centroids/CC_Fr_2_centroid.trk differ diff --git a/data/brain/SCIL/centroids/CC_Oc_centroid.trk b/data/brain/SCIL/centroids/CC_Oc_centroid.trk new file mode 100644 index 0000000..c6ab057 Binary files /dev/null and b/data/brain/SCIL/centroids/CC_Oc_centroid.trk differ diff --git a/data/brain/SCIL/centroids/CC_Pa_centroid.trk b/data/brain/SCIL/centroids/CC_Pa_centroid.trk new file mode 100644 index 0000000..0834ecb Binary files /dev/null and b/data/brain/SCIL/centroids/CC_Pa_centroid.trk differ diff --git a/data/brain/SCIL/centroids/CC_Pr_Po_centroid.trk b/data/brain/SCIL/centroids/CC_Pr_Po_centroid.trk new file mode 100644 index 0000000..be45959 Binary files /dev/null and b/data/brain/SCIL/centroids/CC_Pr_Po_centroid.trk differ diff --git a/data/brain/SCIL/centroids/CC_Te_centroid.trk b/data/brain/SCIL/centroids/CC_Te_centroid.trk new file mode 100644 index 0000000..7e080ea Binary files /dev/null and b/data/brain/SCIL/centroids/CC_Te_centroid.trk differ diff --git a/data/brain/SCIL/centroids/CG_L_An_centroid.trk b/data/brain/SCIL/centroids/CG_L_An_centroid.trk new file mode 100644 index 0000000..c4fde8c Binary files /dev/null and b/data/brain/SCIL/centroids/CG_L_An_centroid.trk differ diff --git a/data/brain/SCIL/centroids/CG_L_Po_centroid.trk b/data/brain/SCIL/centroids/CG_L_Po_centroid.trk new file mode 100644 index 0000000..86d3c9e Binary files /dev/null and b/data/brain/SCIL/centroids/CG_L_Po_centroid.trk differ diff --git a/data/brain/SCIL/centroids/CG_L_centroid.trk b/data/brain/SCIL/centroids/CG_L_centroid.trk new file mode 100644 index 0000000..e8a56e9 Binary files /dev/null and b/data/brain/SCIL/centroids/CG_L_centroid.trk differ diff --git a/data/brain/SCIL/centroids/CG_L_curve_centroid.trk b/data/brain/SCIL/centroids/CG_L_curve_centroid.trk new file mode 100644 index 0000000..6aac0f1 Binary files /dev/null and b/data/brain/SCIL/centroids/CG_L_curve_centroid.trk differ diff --git a/data/brain/SCIL/centroids/CG_R_An_centroid.trk b/data/brain/SCIL/centroids/CG_R_An_centroid.trk new file mode 100644 index 0000000..757aa65 Binary files /dev/null and b/data/brain/SCIL/centroids/CG_R_An_centroid.trk differ diff --git a/data/brain/SCIL/centroids/CG_R_Po_centroid.trk b/data/brain/SCIL/centroids/CG_R_Po_centroid.trk new file mode 100644 index 0000000..2df93b8 Binary files /dev/null and b/data/brain/SCIL/centroids/CG_R_Po_centroid.trk differ diff --git a/data/brain/SCIL/centroids/CG_R_centroid.trk b/data/brain/SCIL/centroids/CG_R_centroid.trk new file mode 100644 index 0000000..e8bc5c9 Binary files /dev/null and b/data/brain/SCIL/centroids/CG_R_centroid.trk differ diff --git a/data/brain/SCIL/centroids/CG_R_curve_centroid.trk b/data/brain/SCIL/centroids/CG_R_curve_centroid.trk new file mode 100644 index 0000000..fb31b62 Binary files /dev/null and b/data/brain/SCIL/centroids/CG_R_curve_centroid.trk differ diff --git a/data/brain/SCIL/centroids/FAT_L_centroid.trk b/data/brain/SCIL/centroids/FAT_L_centroid.trk new file mode 100644 index 0000000..0b55302 Binary files /dev/null and b/data/brain/SCIL/centroids/FAT_L_centroid.trk differ diff --git a/data/brain/SCIL/centroids/FAT_R_centroid.trk b/data/brain/SCIL/centroids/FAT_R_centroid.trk new file mode 100644 index 0000000..b49286b Binary files /dev/null and b/data/brain/SCIL/centroids/FAT_R_centroid.trk differ diff --git a/data/brain/SCIL/centroids/FPT_L_Brainstem_centroid.trk b/data/brain/SCIL/centroids/FPT_L_Brainstem_centroid.trk new file mode 100644 index 0000000..c55d47a Binary files /dev/null and b/data/brain/SCIL/centroids/FPT_L_Brainstem_centroid.trk differ diff --git a/data/brain/SCIL/centroids/FPT_L_centroid.trk b/data/brain/SCIL/centroids/FPT_L_centroid.trk new file mode 100644 index 0000000..6298bae Binary files /dev/null and b/data/brain/SCIL/centroids/FPT_L_centroid.trk differ diff --git a/data/brain/SCIL/centroids/FPT_R_Brainstem_centroid.trk b/data/brain/SCIL/centroids/FPT_R_Brainstem_centroid.trk new file mode 100644 index 0000000..359133f Binary files /dev/null and b/data/brain/SCIL/centroids/FPT_R_Brainstem_centroid.trk differ diff --git a/data/brain/SCIL/centroids/FPT_R_centroid.trk b/data/brain/SCIL/centroids/FPT_R_centroid.trk new file mode 100644 index 0000000..5852de5 Binary files /dev/null and b/data/brain/SCIL/centroids/FPT_R_centroid.trk differ diff --git a/data/brain/SCIL/centroids/FX_L_centroid.trk b/data/brain/SCIL/centroids/FX_L_centroid.trk new file mode 100644 index 0000000..138af41 Binary files /dev/null and b/data/brain/SCIL/centroids/FX_L_centroid.trk differ diff --git a/data/brain/SCIL/centroids/FX_R_centroid.trk b/data/brain/SCIL/centroids/FX_R_centroid.trk new file mode 100644 index 0000000..6236551 Binary files /dev/null and b/data/brain/SCIL/centroids/FX_R_centroid.trk differ diff --git a/data/brain/SCIL/centroids/ICP_L_centroid.trk b/data/brain/SCIL/centroids/ICP_L_centroid.trk new file mode 100644 index 0000000..0a2a797 Binary files /dev/null and b/data/brain/SCIL/centroids/ICP_L_centroid.trk differ diff --git a/data/brain/SCIL/centroids/ICP_R_centroid.trk b/data/brain/SCIL/centroids/ICP_R_centroid.trk new file mode 100644 index 0000000..68312a7 Binary files /dev/null and b/data/brain/SCIL/centroids/ICP_R_centroid.trk differ diff --git a/data/brain/SCIL/centroids/IFOF_L_centroid.trk b/data/brain/SCIL/centroids/IFOF_L_centroid.trk new file mode 100644 index 0000000..17d8bfa Binary files /dev/null and b/data/brain/SCIL/centroids/IFOF_L_centroid.trk differ diff --git a/data/brain/SCIL/centroids/IFOF_R_centroid.trk b/data/brain/SCIL/centroids/IFOF_R_centroid.trk new file mode 100644 index 0000000..f476ecf Binary files /dev/null and b/data/brain/SCIL/centroids/IFOF_R_centroid.trk differ diff --git a/data/brain/SCIL/centroids/ILF_L_centroid.trk b/data/brain/SCIL/centroids/ILF_L_centroid.trk new file mode 100644 index 0000000..dda03e3 Binary files /dev/null and b/data/brain/SCIL/centroids/ILF_L_centroid.trk differ diff --git a/data/brain/SCIL/centroids/ILF_R_centroid.trk b/data/brain/SCIL/centroids/ILF_R_centroid.trk new file mode 100644 index 0000000..63a6094 Binary files /dev/null and b/data/brain/SCIL/centroids/ILF_R_centroid.trk differ diff --git a/data/brain/SCIL/centroids/MCP_centroid.trk b/data/brain/SCIL/centroids/MCP_centroid.trk new file mode 100644 index 0000000..940f4d8 Binary files /dev/null and b/data/brain/SCIL/centroids/MCP_centroid.trk differ diff --git a/data/brain/SCIL/centroids/MdLF_L_centroid.trk b/data/brain/SCIL/centroids/MdLF_L_centroid.trk new file mode 100644 index 0000000..f9b4915 Binary files /dev/null and b/data/brain/SCIL/centroids/MdLF_L_centroid.trk differ diff --git a/data/brain/SCIL/centroids/MdLF_R_centroid.trk b/data/brain/SCIL/centroids/MdLF_R_centroid.trk new file mode 100644 index 0000000..1b91f91 Binary files /dev/null and b/data/brain/SCIL/centroids/MdLF_R_centroid.trk differ diff --git a/data/brain/SCIL/centroids/OR_ML_L_centroid.trk b/data/brain/SCIL/centroids/OR_ML_L_centroid.trk new file mode 100644 index 0000000..1f29de8 Binary files /dev/null and b/data/brain/SCIL/centroids/OR_ML_L_centroid.trk differ diff --git a/data/brain/SCIL/centroids/OR_ML_R_centroid.trk b/data/brain/SCIL/centroids/OR_ML_R_centroid.trk new file mode 100644 index 0000000..b94a516 Binary files /dev/null and b/data/brain/SCIL/centroids/OR_ML_R_centroid.trk differ diff --git a/data/brain/SCIL/centroids/PC_centroid.trk b/data/brain/SCIL/centroids/PC_centroid.trk new file mode 100644 index 0000000..815ec12 Binary files /dev/null and b/data/brain/SCIL/centroids/PC_centroid.trk differ diff --git a/data/brain/SCIL/centroids/POPT_L_Brainstem_centroid.trk b/data/brain/SCIL/centroids/POPT_L_Brainstem_centroid.trk new file mode 100644 index 0000000..41527be Binary files /dev/null and b/data/brain/SCIL/centroids/POPT_L_Brainstem_centroid.trk differ diff --git a/data/brain/SCIL/centroids/POPT_L_centroid.trk b/data/brain/SCIL/centroids/POPT_L_centroid.trk new file mode 100644 index 0000000..3682a51 Binary files /dev/null and b/data/brain/SCIL/centroids/POPT_L_centroid.trk differ diff --git a/data/brain/SCIL/centroids/POPT_R_Brainstem_centroid.trk b/data/brain/SCIL/centroids/POPT_R_Brainstem_centroid.trk new file mode 100644 index 0000000..3cc6b67 Binary files /dev/null and b/data/brain/SCIL/centroids/POPT_R_Brainstem_centroid.trk differ diff --git a/data/brain/SCIL/centroids/POPT_R_centroid.trk b/data/brain/SCIL/centroids/POPT_R_centroid.trk new file mode 100644 index 0000000..2dcdc4d Binary files /dev/null and b/data/brain/SCIL/centroids/POPT_R_centroid.trk differ diff --git a/data/brain/SCIL/centroids/PYT_L_Brainstem_centroid.trk b/data/brain/SCIL/centroids/PYT_L_Brainstem_centroid.trk new file mode 100644 index 0000000..ae33f93 Binary files /dev/null and b/data/brain/SCIL/centroids/PYT_L_Brainstem_centroid.trk differ diff --git a/data/brain/SCIL/centroids/PYT_L_centroid.trk b/data/brain/SCIL/centroids/PYT_L_centroid.trk new file mode 100644 index 0000000..b1edd0c Binary files /dev/null and b/data/brain/SCIL/centroids/PYT_L_centroid.trk differ diff --git a/data/brain/SCIL/centroids/PYT_R_Brainstem_centroid.trk b/data/brain/SCIL/centroids/PYT_R_Brainstem_centroid.trk new file mode 100644 index 0000000..e58f287 Binary files /dev/null and b/data/brain/SCIL/centroids/PYT_R_Brainstem_centroid.trk differ diff --git a/data/brain/SCIL/centroids/PYT_R_centroid.trk b/data/brain/SCIL/centroids/PYT_R_centroid.trk new file mode 100644 index 0000000..2f6d10b Binary files /dev/null and b/data/brain/SCIL/centroids/PYT_R_centroid.trk differ diff --git a/data/brain/SCIL/centroids/SCP_L_centroid.trk b/data/brain/SCIL/centroids/SCP_L_centroid.trk new file mode 100644 index 0000000..430c59e Binary files /dev/null and b/data/brain/SCIL/centroids/SCP_L_centroid.trk differ diff --git a/data/brain/SCIL/centroids/SCP_R_centroid.trk b/data/brain/SCIL/centroids/SCP_R_centroid.trk new file mode 100644 index 0000000..2446c2b Binary files /dev/null and b/data/brain/SCIL/centroids/SCP_R_centroid.trk differ diff --git a/data/brain/SCIL/centroids/SLF_L_centroid.trk b/data/brain/SCIL/centroids/SLF_L_centroid.trk new file mode 100644 index 0000000..f5a2503 Binary files /dev/null and b/data/brain/SCIL/centroids/SLF_L_centroid.trk differ diff --git a/data/brain/SCIL/centroids/SLF_R_centroid.trk b/data/brain/SCIL/centroids/SLF_R_centroid.trk new file mode 100644 index 0000000..c6e8e53 Binary files /dev/null and b/data/brain/SCIL/centroids/SLF_R_centroid.trk differ diff --git a/data/brain/SCIL/centroids/UF_L_centroid.trk b/data/brain/SCIL/centroids/UF_L_centroid.trk new file mode 100644 index 0000000..6ea7d7e Binary files /dev/null and b/data/brain/SCIL/centroids/UF_L_centroid.trk differ diff --git a/data/brain/SCIL/centroids/UF_R_centroid.trk b/data/brain/SCIL/centroids/UF_R_centroid.trk new file mode 100644 index 0000000..6f5171b Binary files /dev/null and b/data/brain/SCIL/centroids/UF_R_centroid.trk differ diff --git a/data/brain/derivatives/atlas_correspondence/Lobes/Laus2018_LobeMNI-scale1OneThal.pkl b/data/brain/derivatives/atlas_correspondence/Lobes/Laus2018_LobeMNI-scale1OneThal.pkl new file mode 100644 index 0000000..a3cb3ac Binary files /dev/null and b/data/brain/derivatives/atlas_correspondence/Lobes/Laus2018_LobeMNI-scale1OneThal.pkl differ diff --git a/data/brain/derivatives/atlas_correspondence/Lobes/Laus2018_LobeMNI-scale2OneThal.pkl b/data/brain/derivatives/atlas_correspondence/Lobes/Laus2018_LobeMNI-scale2OneThal.pkl new file mode 100644 index 0000000..20dc14c Binary files /dev/null and b/data/brain/derivatives/atlas_correspondence/Lobes/Laus2018_LobeMNI-scale2OneThal.pkl differ diff --git a/data/brain/derivatives/atlas_correspondence/Lobes/Laus2018_LobeMNI-scale3OneThal.pkl b/data/brain/derivatives/atlas_correspondence/Lobes/Laus2018_LobeMNI-scale3OneThal.pkl new file mode 100644 index 0000000..65b670a Binary files /dev/null and b/data/brain/derivatives/atlas_correspondence/Lobes/Laus2018_LobeMNI-scale3OneThal.pkl differ diff --git a/data/brain/derivatives/atlas_correspondence/Lobes/Laus2018_LobeMNI-scale4OneThal.pkl b/data/brain/derivatives/atlas_correspondence/Lobes/Laus2018_LobeMNI-scale4OneThal.pkl new file mode 100644 index 0000000..c4774a2 Binary files /dev/null and b/data/brain/derivatives/atlas_correspondence/Lobes/Laus2018_LobeMNI-scale4OneThal.pkl differ diff --git a/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo17-scale1OneThal.pkl b/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo17-scale1OneThal.pkl new file mode 100644 index 0000000..8523465 Binary files /dev/null and b/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo17-scale1OneThal.pkl differ diff --git a/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo17-scale2OneThal.pkl b/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo17-scale2OneThal.pkl new file mode 100644 index 0000000..db1e3eb Binary files /dev/null and b/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo17-scale2OneThal.pkl differ diff --git a/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo17-scale3OneThal.pkl b/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo17-scale3OneThal.pkl new file mode 100644 index 0000000..dad8589 Binary files /dev/null and b/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo17-scale3OneThal.pkl differ diff --git a/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo17-scale4OneThal.pkl b/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo17-scale4OneThal.pkl new file mode 100644 index 0000000..2970155 Binary files /dev/null and b/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo17-scale4OneThal.pkl differ diff --git a/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo7-scale1OneThal.pkl b/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo7-scale1OneThal.pkl new file mode 100644 index 0000000..60a6c8e Binary files /dev/null and b/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo7-scale1OneThal.pkl differ diff --git a/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo7-scale2OneThal.pkl b/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo7-scale2OneThal.pkl new file mode 100644 index 0000000..c391922 Binary files /dev/null and b/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo7-scale2OneThal.pkl differ diff --git a/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo7-scale3OneThal.pkl b/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo7-scale3OneThal.pkl new file mode 100644 index 0000000..2f44d69 Binary files /dev/null and b/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo7-scale3OneThal.pkl differ diff --git a/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo7-scale4OneThal.pkl b/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo7-scale4OneThal.pkl new file mode 100644 index 0000000..8331615 Binary files /dev/null and b/data/brain/derivatives/atlas_correspondence/YeoNetworks/Laus2018_Yeo7-scale4OneThal.pkl differ diff --git a/data/brain/derivatives/atlas_correspondence/rDCM/Laus2018_EffConnFromSch414-scale1OneThal.pkl b/data/brain/derivatives/atlas_correspondence/rDCM/Laus2018_EffConnFromSch414-scale1OneThal.pkl new file mode 100644 index 0000000..f45ffba Binary files /dev/null and b/data/brain/derivatives/atlas_correspondence/rDCM/Laus2018_EffConnFromSch414-scale1OneThal.pkl differ diff --git a/data/brain/derivatives/atlas_correspondence/rDCM/Laus2018_EffConnFromSch414-scale2OneThal.pkl b/data/brain/derivatives/atlas_correspondence/rDCM/Laus2018_EffConnFromSch414-scale2OneThal.pkl new file mode 100644 index 0000000..cca80b3 Binary files /dev/null and b/data/brain/derivatives/atlas_correspondence/rDCM/Laus2018_EffConnFromSch414-scale2OneThal.pkl differ diff --git a/data/brain/derivatives/atlas_correspondence/rDCM/Laus2018_EffConnFromSch414-scale3OneThal.pkl b/data/brain/derivatives/atlas_correspondence/rDCM/Laus2018_EffConnFromSch414-scale3OneThal.pkl new file mode 100644 index 0000000..3d27dbf Binary files /dev/null and b/data/brain/derivatives/atlas_correspondence/rDCM/Laus2018_EffConnFromSch414-scale3OneThal.pkl differ diff --git a/data/brain/derivatives/atlas_correspondence/rDCM/Laus2018_EffConnFromSch414-scale4OneThal.pkl b/data/brain/derivatives/atlas_correspondence/rDCM/Laus2018_EffConnFromSch414-scale4OneThal.pkl new file mode 100644 index 0000000..02b167c Binary files /dev/null and b/data/brain/derivatives/atlas_correspondence/rDCM/Laus2018_EffConnFromSch414-scale4OneThal.pkl differ diff --git a/data/brain/derivatives/consensus_clustering/brain_consensus-EC_scale2_nvec20_trials50_ninit50_kmeans10-79_slines_thresh5____.pkl.gz b/data/brain/derivatives/consensus_clustering/brain_consensus-EC_scale2_nvec20_trials50_ninit50_kmeans10-79_slines_thresh5____.pkl.gz new file mode 100644 index 0000000..3641d47 Binary files /dev/null and b/data/brain/derivatives/consensus_clustering/brain_consensus-EC_scale2_nvec20_trials50_ninit50_kmeans10-79_slines_thresh5____.pkl.gz differ diff --git a/data/brain/derivatives/permutations/scale2/Dir-permutations_scale2_gamma1-10000Perm-K13_RatioOnly.pkl b/data/brain/derivatives/permutations/scale2/Dir-permutations_scale2_gamma1-10000Perm-K13_RatioOnly.pkl new file mode 100644 index 0000000..598169c Binary files /dev/null and b/data/brain/derivatives/permutations/scale2/Dir-permutations_scale2_gamma1-10000Perm-K13_RatioOnly.pkl differ diff --git a/data/brain/derivatives/permutations/scale2/Dir-permutations_scale2_gamma1-10000Perm-K19_RatioOnly.pkl b/data/brain/derivatives/permutations/scale2/Dir-permutations_scale2_gamma1-10000Perm-K19_RatioOnly.pkl new file mode 100644 index 0000000..1a0f01a Binary files /dev/null and b/data/brain/derivatives/permutations/scale2/Dir-permutations_scale2_gamma1-10000Perm-K19_RatioOnly.pkl differ diff --git a/data/brain/derivatives/permutations/scale2/Dir-permutations_scale2_gamma1-10000Perm-K35_RatioOnly.pkl b/data/brain/derivatives/permutations/scale2/Dir-permutations_scale2_gamma1-10000Perm-K35_RatioOnly.pkl new file mode 100644 index 0000000..807f86f Binary files /dev/null and b/data/brain/derivatives/permutations/scale2/Dir-permutations_scale2_gamma1-10000Perm-K35_RatioOnly.pkl differ diff --git a/data/brain/derivatives/permutations/scale2/permutations_scale2_gamma1-F_meas49_impl2-4999Perm-Abs-K3.pkl b/data/brain/derivatives/permutations/scale2/permutations_scale2_gamma1-F_meas49_impl2-4999Perm-Abs-K3.pkl new file mode 100644 index 0000000..86c72a8 Binary files /dev/null and b/data/brain/derivatives/permutations/scale2/permutations_scale2_gamma1-F_meas49_impl2-4999Perm-Abs-K3.pkl differ diff --git a/data/brain/derivatives/structural_connectome/Laus2018_brain_labels-scale1.csv b/data/brain/derivatives/structural_connectome/Laus2018_brain_labels-scale1.csv new file mode 100644 index 0000000..5e11d33 --- /dev/null +++ b/data/brain/derivatives/structural_connectome/Laus2018_brain_labels-scale1.csv @@ -0,0 +1,95 @@ +ctx-rh-lateralorbitofrontal +ctx-rh-parsorbitalis +ctx-rh-frontalpole +ctx-rh-medialorbitofrontal +ctx-rh-parstriangularis +ctx-rh-parsopercularis +ctx-rh-rostralmiddlefrontal +ctx-rh-superiorfrontal +ctx-rh-caudalmiddlefrontal +ctx-rh-precentral +ctx-rh-paracentral +ctx-rh-rostralanteriorcingulate +ctx-rh-caudalanteriorcingulate +ctx-rh-posteriorcingulate +ctx-rh-isthmuscingulate +ctx-rh-postcentral +ctx-rh-supramarginal +ctx-rh-superiorparietal +ctx-rh-inferiorparietal +ctx-rh-precuneus +ctx-rh-cuneus +ctx-rh-pericalcarine +ctx-rh-lateraloccipital +ctx-rh-lingual +ctx-rh-fusiform +ctx-rh-parahippocampal +ctx-rh-entorhinal +ctx-rh-temporalpole +ctx-rh-inferiortemporal +ctx-rh-middletemporal +ctx-rh-bankssts +ctx-rh-superiortemporal +ctx-rh-transversetemporal +ctx-rh-insula +thal-rh-pulvinar +thal-rh-ventral_anterior +thal-rh-mediodorsal +thal-rh-lateral_posterior_ventral_posterior_group +thal-rh-medial_pulvinar_centrolateral +thal-rh-ventrolateral +thal-rh-ventral_posterior_ventrolateral +subc-rh-caudate +subc-rh-putamen +subc-rh-pallidum +subc-rh-accumbens_area +subc-rh-amygdala +subc-rh-hippocampus +ctx-lh-lateralorbitofrontal +ctx-lh-parsorbitalis +ctx-lh-frontalpole +ctx-lh-medialorbitofrontal +ctx-lh-parstriangularis +ctx-lh-parsopercularis +ctx-lh-rostralmiddlefrontal +ctx-lh-superiorfrontal +ctx-lh-caudalmiddlefrontal +ctx-lh-precentral +ctx-lh-paracentral +ctx-lh-rostralanteriorcingulate +ctx-lh-caudalanteriorcingulate +ctx-lh-posteriorcingulate +ctx-lh-isthmuscingulate +ctx-lh-postcentral +ctx-lh-supramarginal +ctx-lh-superiorparietal +ctx-lh-inferiorparietal +ctx-lh-precuneus +ctx-lh-cuneus +ctx-lh-pericalcarine +ctx-lh-lateraloccipital +ctx-lh-lingual +ctx-lh-fusiform +ctx-lh-parahippocampal +ctx-lh-entorhinal +ctx-lh-temporalpole +ctx-lh-inferiortemporal +ctx-lh-middletemporal +ctx-lh-bankssts +ctx-lh-superiortemporal +ctx-lh-transversetemporal +ctx-lh-insula +thal-lh-pulvinar +thal-lh-ventral_anterior +thal-lh-mediodorsal +thal-lh-lateral_posterior_ventral_posterior_group +thal-lh-medial_pulvinar_centrolateral +thal-lh-ventrolateral +thal-lh-ventral_posterior_ventrolateral +subc-lh-caudate +subc-lh-putamen +subc-lh-pallidum +subc-lh-accumbens_area +subc-lh-amygdala +subc-lh-hippocampus +brain-stem-Brain_Stem diff --git a/data/brain/derivatives/structural_connectome/Laus2018_brain_labels-scale2.csv b/data/brain/derivatives/structural_connectome/Laus2018_brain_labels-scale2.csv new file mode 100644 index 0000000..978b8bf --- /dev/null +++ b/data/brain/derivatives/structural_connectome/Laus2018_brain_labels-scale2.csv @@ -0,0 +1,141 @@ +ctx-rh-lateralorbitofrontal_1 +ctx-rh-lateralorbitofrontal_2 +ctx-rh-parsorbitalis_1 +ctx-rh-frontalpole_1 +ctx-rh-medialorbitofrontal_1 +ctx-rh-medialorbitofrontal_2 +ctx-rh-parstriangularis_1 +ctx-rh-parsopercularis_1 +ctx-rh-rostralmiddlefrontal_1 +ctx-rh-rostralmiddlefrontal_2 +ctx-rh-superiorfrontal_1 +ctx-rh-superiorfrontal_2 +ctx-rh-superiorfrontal_3 +ctx-rh-superiorfrontal_4 +ctx-rh-caudalmiddlefrontal_1 +ctx-rh-precentral_1 +ctx-rh-precentral_2 +ctx-rh-precentral_3 +ctx-rh-paracentral_1 +ctx-rh-rostralanteriorcingulate_1 +ctx-rh-caudalanteriorcingulate_1 +ctx-rh-posteriorcingulate_1 +ctx-rh-isthmuscingulate_1 +ctx-rh-postcentral_1 +ctx-rh-postcentral_2 +ctx-rh-supramarginal_1 +ctx-rh-supramarginal_2 +ctx-rh-superiorparietal_1 +ctx-rh-superiorparietal_2 +ctx-rh-superiorparietal_3 +ctx-rh-inferiorparietal_1 +ctx-rh-inferiorparietal_2 +ctx-rh-inferiorparietal_3 +ctx-rh-precuneus_1 +ctx-rh-precuneus_2 +ctx-rh-cuneus_1 +ctx-rh-pericalcarine_1 +ctx-rh-lateraloccipital_1 +ctx-rh-lateraloccipital_2 +ctx-rh-lateraloccipital_3 +ctx-rh-lingual_1 +ctx-rh-lingual_2 +ctx-rh-fusiform_1 +ctx-rh-fusiform_2 +ctx-rh-parahippocampal_1 +ctx-rh-entorhinal_1 +ctx-rh-temporalpole_1 +ctx-rh-inferiortemporal_1 +ctx-rh-inferiortemporal_2 +ctx-rh-middletemporal_1 +ctx-rh-middletemporal_2 +ctx-rh-bankssts_1 +ctx-rh-superiortemporal_1 +ctx-rh-superiortemporal_2 +ctx-rh-transversetemporal_1 +ctx-rh-insula_1 +ctx-rh-insula_2 +thal-rh-pulvinar +thal-rh-ventral_anterior +thal-rh-mediodorsal +thal-rh-lateral_posterior_ventral_posterior_group +thal-rh-medial_pulvinar_centrolateral +thal-rh-ventrolateral +thal-rh-ventral_posterior_ventrolateral +subc-rh-caudate +subc-rh-putamen +subc-rh-pallidum +subc-rh-accumbens_area +subc-rh-amygdala +subc-rh-hippocampus +ctx-lh-lateralorbitofrontal_1 +ctx-lh-lateralorbitofrontal_2 +ctx-lh-parsorbitalis_1 +ctx-lh-frontalpole_1 +ctx-lh-medialorbitofrontal_1 +ctx-lh-medialorbitofrontal_2 +ctx-lh-parstriangularis_1 +ctx-lh-parsopercularis_1 +ctx-lh-rostralmiddlefrontal_1 +ctx-lh-rostralmiddlefrontal_2 +ctx-lh-superiorfrontal_1 +ctx-lh-superiorfrontal_2 +ctx-lh-superiorfrontal_3 +ctx-lh-superiorfrontal_4 +ctx-lh-caudalmiddlefrontal_1 +ctx-lh-precentral_1 +ctx-lh-precentral_2 +ctx-lh-precentral_3 +ctx-lh-paracentral_1 +ctx-lh-rostralanteriorcingulate_1 +ctx-lh-caudalanteriorcingulate_1 +ctx-lh-posteriorcingulate_1 +ctx-lh-isthmuscingulate_1 +ctx-lh-postcentral_1 +ctx-lh-postcentral_2 +ctx-lh-supramarginal_1 +ctx-lh-supramarginal_2 +ctx-lh-superiorparietal_1 +ctx-lh-superiorparietal_2 +ctx-lh-superiorparietal_3 +ctx-lh-inferiorparietal_1 +ctx-lh-inferiorparietal_2 +ctx-lh-inferiorparietal_3 +ctx-lh-precuneus_1 +ctx-lh-precuneus_2 +ctx-lh-cuneus_1 +ctx-lh-pericalcarine_1 +ctx-lh-lateraloccipital_1 +ctx-lh-lateraloccipital_2 +ctx-lh-lateraloccipital_3 +ctx-lh-lingual_1 +ctx-lh-lingual_2 +ctx-lh-fusiform_1 +ctx-lh-fusiform_2 +ctx-lh-parahippocampal_1 +ctx-lh-entorhinal_1 +ctx-lh-temporalpole_1 +ctx-lh-inferiortemporal_1 +ctx-lh-inferiortemporal_2 +ctx-lh-middletemporal_1 +ctx-lh-middletemporal_2 +ctx-lh-bankssts_1 +ctx-lh-superiortemporal_1 +ctx-lh-superiortemporal_2 +ctx-lh-transversetemporal_1 +ctx-lh-insula_1 +ctx-lh-insula_2 +thal-lh-pulvinar +thal-lh-ventral_anterior +thal-lh-mediodorsal +thal-lh-lateral_posterior_ventral_posterior_group +thal-lh-medial_pulvinar_centrolateral +thal-lh-ventrolateral +thal-lh-ventral_posterior_ventrolateral +subc-lh-caudate +subc-lh-putamen +subc-lh-pallidum +subc-lh-accumbens_area +subc-lh-amygdala +subc-lh-hippocampus +Brain_Stem diff --git a/data/brain/derivatives/structural_connectome/Laus2018_brain_labels-scale3.csv b/data/brain/derivatives/structural_connectome/Laus2018_brain_labels-scale3.csv new file mode 100644 index 0000000..0281c22 --- /dev/null +++ b/data/brain/derivatives/structural_connectome/Laus2018_brain_labels-scale3.csv @@ -0,0 +1,243 @@ +ctx-rh-lateralorbitofrontal_1 +ctx-rh-lateralorbitofrontal_2 +ctx-rh-lateralorbitofrontal_3 +ctx-rh-lateralorbitofrontal_4 +ctx-rh-parsorbitalis_1 +ctx-rh-frontalpole_1 +ctx-rh-medialorbitofrontal_1 +ctx-rh-medialorbitofrontal_2 +ctx-rh-medialorbitofrontal_3 +ctx-rh-parstriangularis_1 +ctx-rh-parstriangularis_2 +ctx-rh-parsopercularis_1 +ctx-rh-parsopercularis_2 +ctx-rh-rostralmiddlefrontal_1 +ctx-rh-rostralmiddlefrontal_2 +ctx-rh-rostralmiddlefrontal_3 +ctx-rh-rostralmiddlefrontal_4 +ctx-rh-rostralmiddlefrontal_5 +ctx-rh-rostralmiddlefrontal_6 +ctx-rh-superiorfrontal_1 +ctx-rh-superiorfrontal_2 +ctx-rh-superiorfrontal_3 +ctx-rh-superiorfrontal_4 +ctx-rh-superiorfrontal_5 +ctx-rh-superiorfrontal_6 +ctx-rh-superiorfrontal_7 +ctx-rh-superiorfrontal_8 +ctx-rh-caudalmiddlefrontal_1 +ctx-rh-caudalmiddlefrontal_2 +ctx-rh-caudalmiddlefrontal_3 +ctx-rh-precentral_1 +ctx-rh-precentral_2 +ctx-rh-precentral_3 +ctx-rh-precentral_4 +ctx-rh-precentral_5 +ctx-rh-precentral_6 +ctx-rh-paracentral_1 +ctx-rh-paracentral_2 +ctx-rh-paracentral_3 +ctx-rh-rostralanteriorcingulate_1 +ctx-rh-caudalanteriorcingulate_1 +ctx-rh-posteriorcingulate_1 +ctx-rh-posteriorcingulate_2 +ctx-rh-isthmuscingulate_1 +ctx-rh-postcentral_1 +ctx-rh-postcentral_2 +ctx-rh-postcentral_3 +ctx-rh-postcentral_4 +ctx-rh-postcentral_5 +ctx-rh-supramarginal_1 +ctx-rh-supramarginal_2 +ctx-rh-supramarginal_3 +ctx-rh-supramarginal_4 +ctx-rh-superiorparietal_1 +ctx-rh-superiorparietal_2 +ctx-rh-superiorparietal_3 +ctx-rh-superiorparietal_4 +ctx-rh-superiorparietal_5 +ctx-rh-superiorparietal_6 +ctx-rh-superiorparietal_7 +ctx-rh-inferiorparietal_1 +ctx-rh-inferiorparietal_2 +ctx-rh-inferiorparietal_3 +ctx-rh-inferiorparietal_4 +ctx-rh-inferiorparietal_5 +ctx-rh-inferiorparietal_6 +ctx-rh-precuneus_1 +ctx-rh-precuneus_2 +ctx-rh-precuneus_3 +ctx-rh-precuneus_4 +ctx-rh-precuneus_5 +ctx-rh-cuneus_1 +ctx-rh-cuneus_2 +ctx-rh-pericalcarine_1 +ctx-rh-pericalcarine_2 +ctx-rh-lateraloccipital_1 +ctx-rh-lateraloccipital_2 +ctx-rh-lateraloccipital_3 +ctx-rh-lateraloccipital_4 +ctx-rh-lateraloccipital_5 +ctx-rh-lingual_1 +ctx-rh-lingual_2 +ctx-rh-lingual_3 +ctx-rh-fusiform_1 +ctx-rh-fusiform_2 +ctx-rh-fusiform_3 +ctx-rh-fusiform_4 +ctx-rh-parahippocampal_1 +ctx-rh-entorhinal_1 +ctx-rh-temporalpole_1 +ctx-rh-inferiortemporal_1 +ctx-rh-inferiortemporal_2 +ctx-rh-inferiortemporal_3 +ctx-rh-inferiortemporal_4 +ctx-rh-middletemporal_1 +ctx-rh-middletemporal_2 +ctx-rh-middletemporal_3 +ctx-rh-middletemporal_4 +ctx-rh-bankssts_1 +ctx-rh-superiortemporal_1 +ctx-rh-superiortemporal_2 +ctx-rh-superiortemporal_3 +ctx-rh-superiortemporal_4 +ctx-rh-superiortemporal_5 +ctx-rh-transversetemporal_1 +ctx-rh-insula_1 +ctx-rh-insula_2 +ctx-rh-insula_3 +thal-rh-pulvinar +thal-rh-ventral_anterior +thal-rh-mediodorsal +thal-rh-lateral_posterior_ventral_posterior_group +thal-rh-medial_pulvinar_centrolateral +thal-rh-ventrolateral +thal-rh-ventral_posterior_ventrolateral +subc-rh-caudate +subc-rh-putamen +subc-rh-pallidum +subc-rh-accumbens_area +subc-rh-amygdala +subc-rh-hippocampus +ctx-lh-lateralorbitofrontal_1 +ctx-lh-lateralorbitofrontal_2 +ctx-lh-lateralorbitofrontal_3 +ctx-lh-lateralorbitofrontal_4 +ctx-lh-parsorbitalis_1 +ctx-lh-frontalpole_1 +ctx-lh-medialorbitofrontal_1 +ctx-lh-medialorbitofrontal_2 +ctx-lh-medialorbitofrontal_3 +ctx-lh-parstriangularis_1 +ctx-lh-parstriangularis_2 +ctx-lh-parsopercularis_1 +ctx-lh-parsopercularis_2 +ctx-lh-rostralmiddlefrontal_1 +ctx-lh-rostralmiddlefrontal_2 +ctx-lh-rostralmiddlefrontal_3 +ctx-lh-rostralmiddlefrontal_4 +ctx-lh-rostralmiddlefrontal_5 +ctx-lh-rostralmiddlefrontal_6 +ctx-lh-superiorfrontal_1 +ctx-lh-superiorfrontal_2 +ctx-lh-superiorfrontal_3 +ctx-lh-superiorfrontal_4 +ctx-lh-superiorfrontal_5 +ctx-lh-superiorfrontal_6 +ctx-lh-superiorfrontal_7 +ctx-lh-superiorfrontal_8 +ctx-lh-caudalmiddlefrontal_1 +ctx-lh-caudalmiddlefrontal_2 +ctx-lh-caudalmiddlefrontal_3 +ctx-lh-precentral_1 +ctx-lh-precentral_2 +ctx-lh-precentral_3 +ctx-lh-precentral_4 +ctx-lh-precentral_5 +ctx-lh-precentral_6 +ctx-lh-paracentral_1 +ctx-lh-paracentral_2 +ctx-lh-paracentral_3 +ctx-lh-rostralanteriorcingulate_1 +ctx-lh-caudalanteriorcingulate_1 +ctx-lh-posteriorcingulate_1 +ctx-lh-posteriorcingulate_2 +ctx-lh-isthmuscingulate_1 +ctx-lh-postcentral_1 +ctx-lh-postcentral_2 +ctx-lh-postcentral_3 +ctx-lh-postcentral_4 +ctx-lh-postcentral_5 +ctx-lh-supramarginal_1 +ctx-lh-supramarginal_2 +ctx-lh-supramarginal_3 +ctx-lh-supramarginal_4 +ctx-lh-superiorparietal_1 +ctx-lh-superiorparietal_2 +ctx-lh-superiorparietal_3 +ctx-lh-superiorparietal_4 +ctx-lh-superiorparietal_5 +ctx-lh-superiorparietal_6 +ctx-lh-superiorparietal_7 +ctx-lh-inferiorparietal_1 +ctx-lh-inferiorparietal_2 +ctx-lh-inferiorparietal_3 +ctx-lh-inferiorparietal_4 +ctx-lh-inferiorparietal_5 +ctx-lh-inferiorparietal_6 +ctx-lh-precuneus_1 +ctx-lh-precuneus_2 +ctx-lh-precuneus_3 +ctx-lh-precuneus_4 +ctx-lh-precuneus_5 +ctx-lh-cuneus_1 +ctx-lh-cuneus_2 +ctx-lh-pericalcarine_1 +ctx-lh-pericalcarine_2 +ctx-lh-lateraloccipital_1 +ctx-lh-lateraloccipital_2 +ctx-lh-lateraloccipital_3 +ctx-lh-lateraloccipital_4 +ctx-lh-lateraloccipital_5 +ctx-lh-lingual_1 +ctx-lh-lingual_2 +ctx-lh-lingual_3 +ctx-lh-fusiform_1 +ctx-lh-fusiform_2 +ctx-lh-fusiform_3 +ctx-lh-fusiform_4 +ctx-lh-parahippocampal_1 +ctx-lh-entorhinal_1 +ctx-lh-temporalpole_1 +ctx-lh-inferiortemporal_1 +ctx-lh-inferiortemporal_2 +ctx-lh-inferiortemporal_3 +ctx-lh-inferiortemporal_4 +ctx-lh-middletemporal_1 +ctx-lh-middletemporal_2 +ctx-lh-middletemporal_3 +ctx-lh-middletemporal_4 +ctx-lh-bankssts_1 +ctx-lh-superiortemporal_1 +ctx-lh-superiortemporal_2 +ctx-lh-superiortemporal_3 +ctx-lh-superiortemporal_4 +ctx-lh-superiortemporal_5 +ctx-lh-transversetemporal_1 +ctx-lh-insula_1 +ctx-lh-insula_2 +ctx-lh-insula_3 +thal-lh-pulvinar +thal-lh-ventral_anterior +thal-lh-mediodorsal +thal-lh-lateral_posterior_ventral_posterior_group +thal-lh-medial_pulvinar_centrolateral +thal-lh-ventrolateral +thal-lh-ventral_posterior_ventrolateral +subc-lh-caudate +subc-lh-putamen +subc-lh-pallidum +subc-lh-accumbens_area +subc-lh-amygdala +subc-lh-hippocampus +Brain_Stem diff --git a/data/brain/derivatives/structural_connectome/Laus2018_brain_labels-scale4.csv b/data/brain/derivatives/structural_connectome/Laus2018_brain_labels-scale4.csv new file mode 100644 index 0000000..3d9a10a --- /dev/null +++ b/data/brain/derivatives/structural_connectome/Laus2018_brain_labels-scale4.csv @@ -0,0 +1,473 @@ +ctx-rh-lateralorbitofrontal_1 +ctx-rh-lateralorbitofrontal_2 +ctx-rh-lateralorbitofrontal_3 +ctx-rh-lateralorbitofrontal_4 +ctx-rh-lateralorbitofrontal_5 +ctx-rh-lateralorbitofrontal_6 +ctx-rh-lateralorbitofrontal_7 +ctx-rh-parsorbitalis_1 +ctx-rh-parsorbitalis_2 +ctx-rh-frontalpole_1 +ctx-rh-medialorbitofrontal_1 +ctx-rh-medialorbitofrontal_2 +ctx-rh-medialorbitofrontal_3 +ctx-rh-medialorbitofrontal_4 +ctx-rh-medialorbitofrontal_5 +ctx-rh-parstriangularis_1 +ctx-rh-parstriangularis_2 +ctx-rh-parstriangularis_3 +ctx-rh-parstriangularis_4 +ctx-rh-parsopercularis_1 +ctx-rh-parsopercularis_2 +ctx-rh-parsopercularis_3 +ctx-rh-parsopercularis_4 +ctx-rh-rostralmiddlefrontal_1 +ctx-rh-rostralmiddlefrontal_2 +ctx-rh-rostralmiddlefrontal_3 +ctx-rh-rostralmiddlefrontal_4 +ctx-rh-rostralmiddlefrontal_5 +ctx-rh-rostralmiddlefrontal_6 +ctx-rh-rostralmiddlefrontal_7 +ctx-rh-rostralmiddlefrontal_8 +ctx-rh-rostralmiddlefrontal_9 +ctx-rh-rostralmiddlefrontal_10 +ctx-rh-rostralmiddlefrontal_11 +ctx-rh-rostralmiddlefrontal_12 +ctx-rh-rostralmiddlefrontal_13 +ctx-rh-superiorfrontal_1 +ctx-rh-superiorfrontal_2 +ctx-rh-superiorfrontal_3 +ctx-rh-superiorfrontal_4 +ctx-rh-superiorfrontal_5 +ctx-rh-superiorfrontal_6 +ctx-rh-superiorfrontal_7 +ctx-rh-superiorfrontal_8 +ctx-rh-superiorfrontal_9 +ctx-rh-superiorfrontal_10 +ctx-rh-superiorfrontal_11 +ctx-rh-superiorfrontal_12 +ctx-rh-superiorfrontal_13 +ctx-rh-superiorfrontal_14 +ctx-rh-superiorfrontal_15 +ctx-rh-superiorfrontal_16 +ctx-rh-superiorfrontal_17 +ctx-rh-caudalmiddlefrontal_1 +ctx-rh-caudalmiddlefrontal_2 +ctx-rh-caudalmiddlefrontal_3 +ctx-rh-caudalmiddlefrontal_4 +ctx-rh-caudalmiddlefrontal_5 +ctx-rh-precentral_1 +ctx-rh-precentral_2 +ctx-rh-precentral_3 +ctx-rh-precentral_4 +ctx-rh-precentral_5 +ctx-rh-precentral_6 +ctx-rh-precentral_7 +ctx-rh-precentral_8 +ctx-rh-precentral_9 +ctx-rh-precentral_10 +ctx-rh-precentral_11 +ctx-rh-precentral_12 +ctx-rh-precentral_13 +ctx-rh-precentral_14 +ctx-rh-precentral_15 +ctx-rh-precentral_16 +ctx-rh-paracentral_1 +ctx-rh-paracentral_2 +ctx-rh-paracentral_3 +ctx-rh-paracentral_4 +ctx-rh-paracentral_5 +ctx-rh-paracentral_6 +ctx-rh-rostralanteriorcingulate_1 +ctx-rh-rostralanteriorcingulate_2 +ctx-rh-caudalanteriorcingulate_1 +ctx-rh-caudalanteriorcingulate_2 +ctx-rh-caudalanteriorcingulate_3 +ctx-rh-posteriorcingulate_1 +ctx-rh-posteriorcingulate_2 +ctx-rh-posteriorcingulate_3 +ctx-rh-posteriorcingulate_4 +ctx-rh-isthmuscingulate_1 +ctx-rh-isthmuscingulate_2 +ctx-rh-postcentral_1 +ctx-rh-postcentral_2 +ctx-rh-postcentral_3 +ctx-rh-postcentral_4 +ctx-rh-postcentral_5 +ctx-rh-postcentral_6 +ctx-rh-postcentral_7 +ctx-rh-postcentral_8 +ctx-rh-postcentral_9 +ctx-rh-postcentral_10 +ctx-rh-postcentral_11 +ctx-rh-postcentral_12 +ctx-rh-supramarginal_1 +ctx-rh-supramarginal_2 +ctx-rh-supramarginal_3 +ctx-rh-supramarginal_4 +ctx-rh-supramarginal_5 +ctx-rh-supramarginal_6 +ctx-rh-supramarginal_7 +ctx-rh-supramarginal_8 +ctx-rh-supramarginal_9 +ctx-rh-superiorparietal_1 +ctx-rh-superiorparietal_2 +ctx-rh-superiorparietal_3 +ctx-rh-superiorparietal_4 +ctx-rh-superiorparietal_5 +ctx-rh-superiorparietal_6 +ctx-rh-superiorparietal_7 +ctx-rh-superiorparietal_8 +ctx-rh-superiorparietal_9 +ctx-rh-superiorparietal_10 +ctx-rh-superiorparietal_11 +ctx-rh-superiorparietal_12 +ctx-rh-superiorparietal_13 +ctx-rh-inferiorparietal_1 +ctx-rh-inferiorparietal_2 +ctx-rh-inferiorparietal_3 +ctx-rh-inferiorparietal_4 +ctx-rh-inferiorparietal_5 +ctx-rh-inferiorparietal_6 +ctx-rh-inferiorparietal_7 +ctx-rh-inferiorparietal_8 +ctx-rh-inferiorparietal_9 +ctx-rh-inferiorparietal_10 +ctx-rh-inferiorparietal_11 +ctx-rh-inferiorparietal_12 +ctx-rh-precuneus_1 +ctx-rh-precuneus_2 +ctx-rh-precuneus_3 +ctx-rh-precuneus_4 +ctx-rh-precuneus_5 +ctx-rh-precuneus_6 +ctx-rh-precuneus_7 +ctx-rh-precuneus_8 +ctx-rh-precuneus_9 +ctx-rh-precuneus_10 +ctx-rh-cuneus_1 +ctx-rh-cuneus_2 +ctx-rh-cuneus_3 +ctx-rh-cuneus_4 +ctx-rh-pericalcarine_1 +ctx-rh-pericalcarine_2 +ctx-rh-pericalcarine_3 +ctx-rh-pericalcarine_4 +ctx-rh-lateraloccipital_1 +ctx-rh-lateraloccipital_2 +ctx-rh-lateraloccipital_3 +ctx-rh-lateraloccipital_4 +ctx-rh-lateraloccipital_5 +ctx-rh-lateraloccipital_6 +ctx-rh-lateraloccipital_7 +ctx-rh-lateraloccipital_8 +ctx-rh-lateraloccipital_9 +ctx-rh-lateraloccipital_10 +ctx-rh-lingual_1 +ctx-rh-lingual_2 +ctx-rh-lingual_3 +ctx-rh-lingual_4 +ctx-rh-lingual_5 +ctx-rh-lingual_6 +ctx-rh-lingual_7 +ctx-rh-fusiform_1 +ctx-rh-fusiform_2 +ctx-rh-fusiform_3 +ctx-rh-fusiform_4 +ctx-rh-fusiform_5 +ctx-rh-fusiform_6 +ctx-rh-fusiform_7 +ctx-rh-fusiform_8 +ctx-rh-parahippocampal_1 +ctx-rh-parahippocampal_2 +ctx-rh-parahippocampal_3 +ctx-rh-entorhinal_1 +ctx-rh-temporalpole_1 +ctx-rh-inferiortemporal_1 +ctx-rh-inferiortemporal_2 +ctx-rh-inferiortemporal_3 +ctx-rh-inferiortemporal_4 +ctx-rh-inferiortemporal_5 +ctx-rh-inferiortemporal_6 +ctx-rh-inferiortemporal_7 +ctx-rh-middletemporal_1 +ctx-rh-middletemporal_2 +ctx-rh-middletemporal_3 +ctx-rh-middletemporal_4 +ctx-rh-middletemporal_5 +ctx-rh-middletemporal_6 +ctx-rh-middletemporal_7 +ctx-rh-middletemporal_8 +ctx-rh-middletemporal_9 +ctx-rh-bankssts_1 +ctx-rh-bankssts_2 +ctx-rh-bankssts_3 +ctx-rh-superiortemporal_1 +ctx-rh-superiortemporal_2 +ctx-rh-superiortemporal_3 +ctx-rh-superiortemporal_4 +ctx-rh-superiortemporal_5 +ctx-rh-superiortemporal_6 +ctx-rh-superiortemporal_7 +ctx-rh-superiortemporal_8 +ctx-rh-superiortemporal_9 +ctx-rh-superiortemporal_10 +ctx-rh-superiortemporal_11 +ctx-rh-transversetemporal_1 +ctx-rh-insula_1 +ctx-rh-insula_2 +ctx-rh-insula_3 +ctx-rh-insula_4 +ctx-rh-insula_5 +ctx-rh-insula_6 +ctx-rh-insula_7 +thal-rh-pulvinar +thal-rh-ventral_anterior +thal-rh-mediodorsal +thal-rh-lateral_posterior_ventral_posterior_group +thal-rh-medial_pulvinar_centrolateral +thal-rh-ventrolateral +thal-rh-ventral_posterior_ventrolateral +subc-rh-caudate +subc-rh-putamen +subc-rh-pallidum +subc-rh-accumbens_area +subc-rh-amygdala +subc-rh-hippocampus +ctx-lh-lateralorbitofrontal_1 +ctx-lh-lateralorbitofrontal_2 +ctx-lh-lateralorbitofrontal_3 +ctx-lh-lateralorbitofrontal_4 +ctx-lh-lateralorbitofrontal_5 +ctx-lh-lateralorbitofrontal_6 +ctx-lh-lateralorbitofrontal_7 +ctx-lh-parsorbitalis_1 +ctx-lh-parsorbitalis_2 +ctx-lh-frontalpole_1 +ctx-lh-medialorbitofrontal_1 +ctx-lh-medialorbitofrontal_2 +ctx-lh-medialorbitofrontal_3 +ctx-lh-medialorbitofrontal_4 +ctx-lh-medialorbitofrontal_5 +ctx-lh-parstriangularis_1 +ctx-lh-parstriangularis_2 +ctx-lh-parstriangularis_3 +ctx-lh-parstriangularis_4 +ctx-lh-parsopercularis_1 +ctx-lh-parsopercularis_2 +ctx-lh-parsopercularis_3 +ctx-lh-parsopercularis_4 +ctx-lh-rostralmiddlefrontal_1 +ctx-lh-rostralmiddlefrontal_2 +ctx-lh-rostralmiddlefrontal_3 +ctx-lh-rostralmiddlefrontal_4 +ctx-lh-rostralmiddlefrontal_5 +ctx-lh-rostralmiddlefrontal_6 +ctx-lh-rostralmiddlefrontal_7 +ctx-lh-rostralmiddlefrontal_8 +ctx-lh-rostralmiddlefrontal_9 +ctx-lh-rostralmiddlefrontal_10 +ctx-lh-rostralmiddlefrontal_11 +ctx-lh-rostralmiddlefrontal_12 +ctx-lh-rostralmiddlefrontal_13 +ctx-lh-superiorfrontal_1 +ctx-lh-superiorfrontal_2 +ctx-lh-superiorfrontal_3 +ctx-lh-superiorfrontal_4 +ctx-lh-superiorfrontal_5 +ctx-lh-superiorfrontal_6 +ctx-lh-superiorfrontal_7 +ctx-lh-superiorfrontal_8 +ctx-lh-superiorfrontal_9 +ctx-lh-superiorfrontal_10 +ctx-lh-superiorfrontal_11 +ctx-lh-superiorfrontal_12 +ctx-lh-superiorfrontal_13 +ctx-lh-superiorfrontal_14 +ctx-lh-superiorfrontal_15 +ctx-lh-superiorfrontal_16 +ctx-lh-superiorfrontal_17 +ctx-lh-caudalmiddlefrontal_1 +ctx-lh-caudalmiddlefrontal_2 +ctx-lh-caudalmiddlefrontal_3 +ctx-lh-caudalmiddlefrontal_4 +ctx-lh-caudalmiddlefrontal_5 +ctx-lh-precentral_1 +ctx-lh-precentral_2 +ctx-lh-precentral_3 +ctx-lh-precentral_4 +ctx-lh-precentral_5 +ctx-lh-precentral_6 +ctx-lh-precentral_7 +ctx-lh-precentral_8 +ctx-lh-precentral_9 +ctx-lh-precentral_10 +ctx-lh-precentral_11 +ctx-lh-precentral_12 +ctx-lh-precentral_13 +ctx-lh-precentral_14 +ctx-lh-precentral_15 +ctx-lh-precentral_16 +ctx-lh-paracentral_1 +ctx-lh-paracentral_2 +ctx-lh-paracentral_3 +ctx-lh-paracentral_4 +ctx-lh-paracentral_5 +ctx-lh-paracentral_6 +ctx-lh-rostralanteriorcingulate_1 +ctx-lh-rostralanteriorcingulate_2 +ctx-lh-caudalanteriorcingulate_1 +ctx-lh-caudalanteriorcingulate_2 +ctx-lh-caudalanteriorcingulate_3 +ctx-lh-posteriorcingulate_1 +ctx-lh-posteriorcingulate_2 +ctx-lh-posteriorcingulate_3 +ctx-lh-posteriorcingulate_4 +ctx-lh-isthmuscingulate_1 +ctx-lh-isthmuscingulate_2 +ctx-lh-postcentral_1 +ctx-lh-postcentral_2 +ctx-lh-postcentral_3 +ctx-lh-postcentral_4 +ctx-lh-postcentral_5 +ctx-lh-postcentral_6 +ctx-lh-postcentral_7 +ctx-lh-postcentral_8 +ctx-lh-postcentral_9 +ctx-lh-postcentral_10 +ctx-lh-postcentral_11 +ctx-lh-postcentral_12 +ctx-lh-supramarginal_1 +ctx-lh-supramarginal_2 +ctx-lh-supramarginal_3 +ctx-lh-supramarginal_4 +ctx-lh-supramarginal_5 +ctx-lh-supramarginal_6 +ctx-lh-supramarginal_7 +ctx-lh-supramarginal_8 +ctx-lh-supramarginal_9 +ctx-lh-superiorparietal_1 +ctx-lh-superiorparietal_2 +ctx-lh-superiorparietal_3 +ctx-lh-superiorparietal_4 +ctx-lh-superiorparietal_5 +ctx-lh-superiorparietal_6 +ctx-lh-superiorparietal_7 +ctx-lh-superiorparietal_8 +ctx-lh-superiorparietal_9 +ctx-lh-superiorparietal_10 +ctx-lh-superiorparietal_11 +ctx-lh-superiorparietal_12 +ctx-lh-superiorparietal_13 +ctx-lh-inferiorparietal_1 +ctx-lh-inferiorparietal_2 +ctx-lh-inferiorparietal_3 +ctx-lh-inferiorparietal_4 +ctx-lh-inferiorparietal_5 +ctx-lh-inferiorparietal_6 +ctx-lh-inferiorparietal_7 +ctx-lh-inferiorparietal_8 +ctx-lh-inferiorparietal_9 +ctx-lh-inferiorparietal_10 +ctx-lh-inferiorparietal_11 +ctx-lh-inferiorparietal_12 +ctx-lh-precuneus_1 +ctx-lh-precuneus_2 +ctx-lh-precuneus_3 +ctx-lh-precuneus_4 +ctx-lh-precuneus_5 +ctx-lh-precuneus_6 +ctx-lh-precuneus_7 +ctx-lh-precuneus_8 +ctx-lh-precuneus_9 +ctx-lh-precuneus_10 +ctx-lh-cuneus_1 +ctx-lh-cuneus_2 +ctx-lh-cuneus_3 +ctx-lh-cuneus_4 +ctx-lh-pericalcarine_1 +ctx-lh-pericalcarine_2 +ctx-lh-pericalcarine_3 +ctx-lh-pericalcarine_4 +ctx-lh-lateraloccipital_1 +ctx-lh-lateraloccipital_2 +ctx-lh-lateraloccipital_3 +ctx-lh-lateraloccipital_4 +ctx-lh-lateraloccipital_5 +ctx-lh-lateraloccipital_6 +ctx-lh-lateraloccipital_7 +ctx-lh-lateraloccipital_8 +ctx-lh-lateraloccipital_9 +ctx-lh-lateraloccipital_10 +ctx-lh-lingual_1 +ctx-lh-lingual_2 +ctx-lh-lingual_3 +ctx-lh-lingual_4 +ctx-lh-lingual_5 +ctx-lh-lingual_6 +ctx-lh-lingual_7 +ctx-lh-fusiform_1 +ctx-lh-fusiform_2 +ctx-lh-fusiform_3 +ctx-lh-fusiform_4 +ctx-lh-fusiform_5 +ctx-lh-fusiform_6 +ctx-lh-fusiform_7 +ctx-lh-fusiform_8 +ctx-lh-parahippocampal_1 +ctx-lh-parahippocampal_2 +ctx-lh-parahippocampal_3 +ctx-lh-entorhinal_1 +ctx-lh-temporalpole_1 +ctx-lh-inferiortemporal_1 +ctx-lh-inferiortemporal_2 +ctx-lh-inferiortemporal_3 +ctx-lh-inferiortemporal_4 +ctx-lh-inferiortemporal_5 +ctx-lh-inferiortemporal_6 +ctx-lh-inferiortemporal_7 +ctx-lh-middletemporal_1 +ctx-lh-middletemporal_2 +ctx-lh-middletemporal_3 +ctx-lh-middletemporal_4 +ctx-lh-middletemporal_5 +ctx-lh-middletemporal_6 +ctx-lh-middletemporal_7 +ctx-lh-middletemporal_8 +ctx-lh-middletemporal_9 +ctx-lh-bankssts_1 +ctx-lh-bankssts_2 +ctx-lh-bankssts_3 +ctx-lh-superiortemporal_1 +ctx-lh-superiortemporal_2 +ctx-lh-superiortemporal_3 +ctx-lh-superiortemporal_4 +ctx-lh-superiortemporal_5 +ctx-lh-superiortemporal_6 +ctx-lh-superiortemporal_7 +ctx-lh-superiortemporal_8 +ctx-lh-superiortemporal_9 +ctx-lh-superiortemporal_10 +ctx-lh-superiortemporal_11 +ctx-lh-transversetemporal_1 +ctx-lh-insula_1 +ctx-lh-insula_2 +ctx-lh-insula_3 +ctx-lh-insula_4 +ctx-lh-insula_5 +ctx-lh-insula_6 +ctx-lh-insula_7 +thal-lh-pulvinar +thal-lh-ventral_anterior +thal-lh-mediodorsal +thal-lh-lateral_posterior_ventral_posterior_group +thal-lh-medial_pulvinar_centrolateral +thal-lh-ventrolateral +thal-lh-ventral_posterior_ventrolateral +subc-lh-caudate +subc-lh-putamen +subc-lh-pallidum +subc-lh-accumbens_area +subc-lh-amygdala +subc-lh-hippocampus +Brain_Stem diff --git a/data/brain/derivatives/structural_connectome/Laus2018_bundle_probability_atlas-scale1.pkl b/data/brain/derivatives/structural_connectome/Laus2018_bundle_probability_atlas-scale1.pkl new file mode 100644 index 0000000..84cdd46 Binary files /dev/null and b/data/brain/derivatives/structural_connectome/Laus2018_bundle_probability_atlas-scale1.pkl differ diff --git a/data/brain/derivatives/structural_connectome/Laus2018_bundle_probability_atlas-scale2.pkl b/data/brain/derivatives/structural_connectome/Laus2018_bundle_probability_atlas-scale2.pkl new file mode 100644 index 0000000..ea76412 Binary files /dev/null and b/data/brain/derivatives/structural_connectome/Laus2018_bundle_probability_atlas-scale2.pkl differ diff --git a/data/brain/derivatives/structural_connectome/Laus2018_bundle_probability_atlas-scale3.pkl b/data/brain/derivatives/structural_connectome/Laus2018_bundle_probability_atlas-scale3.pkl new file mode 100644 index 0000000..bf91388 Binary files /dev/null and b/data/brain/derivatives/structural_connectome/Laus2018_bundle_probability_atlas-scale3.pkl differ diff --git a/data/brain/derivatives/structural_connectome/Laus2018_bundle_probability_atlas-scale4.pkl b/data/brain/derivatives/structural_connectome/Laus2018_bundle_probability_atlas-scale4.pkl new file mode 100644 index 0000000..4e388eb Binary files /dev/null and b/data/brain/derivatives/structural_connectome/Laus2018_bundle_probability_atlas-scale4.pkl differ diff --git a/data/brain/derivatives/structural_connectome/Laus2018_bundle_streamlines_atlas-scale1.pkl b/data/brain/derivatives/structural_connectome/Laus2018_bundle_streamlines_atlas-scale1.pkl new file mode 100644 index 0000000..c6f1403 Binary files /dev/null and b/data/brain/derivatives/structural_connectome/Laus2018_bundle_streamlines_atlas-scale1.pkl differ diff --git a/data/brain/derivatives/structural_connectome/Laus2018_bundle_streamlines_atlas-scale2.pkl b/data/brain/derivatives/structural_connectome/Laus2018_bundle_streamlines_atlas-scale2.pkl new file mode 100644 index 0000000..e850969 Binary files /dev/null and b/data/brain/derivatives/structural_connectome/Laus2018_bundle_streamlines_atlas-scale2.pkl differ diff --git a/data/brain/derivatives/structural_connectome/Laus2018_bundle_streamlines_atlas-scale3.pkl b/data/brain/derivatives/structural_connectome/Laus2018_bundle_streamlines_atlas-scale3.pkl new file mode 100644 index 0000000..5bce6b0 Binary files /dev/null and b/data/brain/derivatives/structural_connectome/Laus2018_bundle_streamlines_atlas-scale3.pkl differ diff --git a/data/brain/derivatives/structural_connectome/Laus2018_bundle_streamlines_atlas-scale4.pkl b/data/brain/derivatives/structural_connectome/Laus2018_bundle_streamlines_atlas-scale4.pkl new file mode 100644 index 0000000..cacfe53 Binary files /dev/null and b/data/brain/derivatives/structural_connectome/Laus2018_bundle_streamlines_atlas-scale4.pkl differ diff --git a/data/brain/derivatives/structural_connectome/Laus2018_roi_centers-ftract-scale1.pkl b/data/brain/derivatives/structural_connectome/Laus2018_roi_centers-ftract-scale1.pkl new file mode 100644 index 0000000..4e7578e Binary files /dev/null and b/data/brain/derivatives/structural_connectome/Laus2018_roi_centers-ftract-scale1.pkl differ diff --git a/data/brain/derivatives/structural_connectome/Laus2018_roi_centers-ftract-scale2.pkl b/data/brain/derivatives/structural_connectome/Laus2018_roi_centers-ftract-scale2.pkl new file mode 100644 index 0000000..9d2a2ac Binary files /dev/null and b/data/brain/derivatives/structural_connectome/Laus2018_roi_centers-ftract-scale2.pkl differ diff --git a/data/brain/derivatives/structural_connectome/Laus2018_roi_centers-ftract-scale3.pkl b/data/brain/derivatives/structural_connectome/Laus2018_roi_centers-ftract-scale3.pkl new file mode 100644 index 0000000..cbf020e Binary files /dev/null and b/data/brain/derivatives/structural_connectome/Laus2018_roi_centers-ftract-scale3.pkl differ diff --git a/data/brain/derivatives/structural_connectome/Laus2018_roi_centers-ftract-scale4.pkl b/data/brain/derivatives/structural_connectome/Laus2018_roi_centers-ftract-scale4.pkl new file mode 100644 index 0000000..713c63f Binary files /dev/null and b/data/brain/derivatives/structural_connectome/Laus2018_roi_centers-ftract-scale4.pkl differ diff --git a/data/Benchmark_all_dice-N5-B18-C10-T5.npy b/data/celegans/Benchmark_all_dice-N5-B18-C10-T5.npy similarity index 100% rename from data/Benchmark_all_dice-N5-B18-C10-T5.npy rename to data/celegans/Benchmark_all_dice-N5-B18-C10-T5.npy diff --git a/data/celegans_graph.csv b/data/celegans/celegans_graph.csv similarity index 100% rename from data/celegans_graph.csv rename to data/celegans/celegans_graph.csv diff --git a/data/celegans_graph_GAP.csv b/data/celegans/celegans_graph_GAP.csv similarity index 100% rename from data/celegans_graph_GAP.csv rename to data/celegans/celegans_graph_GAP.csv diff --git a/data/celegans_neurons.csv b/data/celegans/celegans_neurons.csv similarity index 100% rename from data/celegans_neurons.csv rename to data/celegans/celegans_neurons.csv diff --git a/dgsp.py b/dgsp.py deleted file mode 100644 index 74a2f28..0000000 --- a/dgsp.py +++ /dev/null @@ -1,244 +0,0 @@ -# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*- -# vi: set ft=python sts=4 ts=4 sw=4 et: - -from typing import Optional, Union -import numpy as np -import matplotlib.pyplot as plt -from sklearn.cluster import KMeans -from sklearn.metrics import silhouette_score -from sklearn.metrics.cluster import adjusted_rand_score - -from graph_examples import toy_random - - -# Some directed modularity tools -def configuration_null(a_mat: np.ndarray, null_model: str = "outin"): - k_in = a_mat.sum(axis=0).reshape((1, -1)) - k_out = a_mat.sum(axis=1).reshape((1, -1)) - - if null_model == "in": - z = k_in.T @ k_in - elif null_model == "out": - z = k_out.T @ k_out - elif null_model == "inout": - z = k_in.T @ k_out - elif null_model == "outin": - z = k_out.T @ k_in - elif null_model == "avg": - z = (k_in.T @ k_in + k_out.T @ k_out) / 2 - elif null_model == "send": - z = send_receive_probability(a_mat)[0] - elif null_model == "receive": - z = send_receive_probability(a_mat)[1] - - return z / a_mat.sum() - - -def send_receive_probability(adj: np.ndarray): - n_edges = adj.sum() - - in_deg = np.atleast_2d(adj.sum(axis=0)) - out_deg = np.atleast_2d(adj.sum(axis=1)) - - in_deg_squared = (in_deg**2).sum() - out_deg_squared = (out_deg**2).sum() - - send_prob = np.outer(out_deg, out_deg) * in_deg_squared / n_edges**2 - receive_prob = np.outer(in_deg, in_deg) * out_deg_squared / n_edges**2 - - return send_prob, receive_prob - - -def modularity_matrix(a_mat: np.ndarray, null_model: str = "outin"): - - z = configuration_null(a_mat, null_model) - - return a_mat - z - - -def sorted_SVD(matrix: np.ndarray, fix_negative: bool = False, sort_by_q: bool = False): - - U, S, Vh = np.linalg.svd(matrix, full_matrices=True) - - if fix_negative: - for i, _ in enumerate(matrix): - if U[:, i].T @ Vh[i] < 0: - Vh[i] *= -1 - S[i] *= -1 - - sort_id = np.flip(np.argsort(S)) - if sort_by_q: - q_s = S * np.diag(Vh @ U) - sort_id = np.flip(np.argsort(q_s)) - - S = S[sort_id] - U = U[:, sort_id] - Vh = Vh[sort_id] - - return U, S, Vh - - -# Community detection part - - -def edge_bicommunities( - adjacency, - U, - V, - n_components, - method="partition", - n_kmeans=10, - verbose=False, - scale_S=None, - assign_only=False, - **kwargs, -) -> tuple: - - n_nodes = adjacency.shape[0] - - if scale_S is None: - scale_S = np.ones(n_components) - - # u_features = U[:, :n_components] * np.sqrt(scale_S) - # v_features = V[:, :n_components] * np.sqrt(scale_S) - - u_features = U[:, :n_components] * scale_S - v_features = V[:, :n_components] * scale_S - - if method in ["partition", "sign"]: - u_features = np.sign(u_features).astype(int) - v_features = np.sign(v_features).astype(int) - - edge_out = np.array([u_features] * n_nodes).T - edge_in = np.array([v_features] * n_nodes) - edge_in = np.moveaxis(edge_in, -1, 0) - - # edge-based clustering - edge_assignments = np.concatenate([edge_out, edge_in], axis=0) - edge_assignments_vec = edge_assignments.reshape((2 * n_components, -1)).T - - edge_assignments_vec = edge_assignments_vec[(adjacency != 0).reshape(-1)] - - if assign_only: - return edge_assignments_vec - - if method in ["partition", "sign"]: - clusters = np.unique(edge_assignments_vec, axis=0) - n_clusters = clusters.shape[0] - if verbose: - print(f"Found {n_clusters} clusters !") - - cluster2num = {tuple(c): i + 1 for i, c in enumerate(clusters)} - - edge_clusters = np.array([cluster2num[tuple(c)] for c in edge_assignments_vec]) - - elif method == "kmeans": - if n_kmeans is None: - n_kmeans = get_best_k(edge_assignments_vec, verbose=verbose, **kwargs) - - kmeans = KMeans(n_clusters=n_kmeans, random_state=0, n_init="auto").fit( - edge_assignments_vec - ) - edge_clusters = kmeans.labels_ + 1 - - n_clusters = edge_clusters.max() - if verbose: - print(f"Found {n_clusters} clusters !") - else: - raise ValueError( - "Method not recognized (possible values: partition, sign, kmeans)" - ) - - edge_clusters_mat = np.zeros((n_nodes, n_nodes), dtype=int) - edge_clusters_mat[adjacency != 0] = edge_clusters - - return edge_clusters, edge_clusters_mat - - -def get_best_k(X, max_k=10, verbose=False): - print(f"Running silhouette analysis for k = 2 to {max_k} ...") - n_clusters = np.arange(2, max_k) - silhouette = np.zeros(n_clusters.shape[0]) - - for i, n in enumerate(n_clusters): - kmeans = KMeans(n_clusters=n, random_state=0, n_init="auto").fit(X) - silhouette[i] = silhouette_score(X, kmeans.labels_) - - if verbose: - print(f"Silhouette score for K={n} is : {silhouette[i]:1.2f}") - - print( - f"Best average silhouette_score is : {np.max(silhouette):1.2f} for K={n_clusters[np.argmax(silhouette)]}" - ) - return n_clusters[np.argmax(silhouette)] - - -def get_node_clusters(edge_clusters, edge_clusters_mat, method="bimod", scale=True): - n_nodes = edge_clusters_mat.shape[0] - n_clusters = np.max(edge_clusters) - - if method == "probability": - # Aggregate edges to nodes using cluster probability (number of edges) - n_per_cluster = np.zeros((n_nodes, n_clusters)) - for cluster_id in np.arange(1, np.max(edge_clusters_mat) + 1): - n_per_cluster[:, cluster_id - 1] = np.sum( - edge_clusters_mat == cluster_id, axis=1 - ) - n_per_cluster[:, cluster_id - 1] += np.sum( - edge_clusters_mat == cluster_id, axis=1 - ) - - cluster_prob = n_per_cluster / n_per_cluster.sum(axis=1)[:, None] - - cluster_maxprob = np.argmax(cluster_prob, axis=1) + 1 - - return cluster_maxprob, cluster_prob - if "bimod" in method: - sending_communities = np.zeros((n_clusters, n_nodes)) - receiving_communities = np.zeros((n_clusters, n_nodes)) - - for cluster_id in np.arange(1, np.max(edge_clusters_mat) + 1): - sending_communities[cluster_id - 1] = np.sum( - edge_clusters_mat == cluster_id, axis=1 - ) - receiving_communities[cluster_id - 1] = np.sum( - edge_clusters_mat == cluster_id, axis=0 - ) - - if scale: - sending_communities = np.nan_to_num( - sending_communities / np.sum(edge_clusters_mat > 0, axis=1), - posinf=0, - neginf=0, - ) - receiving_communities = np.nan_to_num( - receiving_communities / np.sum(edge_clusters_mat > 0, axis=0), - posinf=0, - neginf=0, - ) - - return sending_communities, receiving_communities - - -def bimod_index_nodes(adjacency, send_com, receive_com, scale=False): - n_clusters = len(send_com) - - null_model = configuration_null(adjacency, null_model="outin") - - bimod_indices = np.zeros(n_clusters) - - for cluster_id in np.arange(n_clusters): - send_fltr = send_com[cluster_id] > 0 - receive_fltr = receive_com[cluster_id] > 0 - - adj_contrib = adjacency[send_fltr][:, receive_fltr] - null_contrib = null_model[send_fltr][:, receive_fltr] - - bimod_indices[cluster_id] = np.sum(adj_contrib - null_contrib) - - if scale: - all_edges = np.sum(np.atleast_2d(send_fltr).T @ np.atleast_2d(receive_fltr)) - bimod_indices[cluster_id] /= all_edges - # / np.sum(adj_contrib > 0) - - return bimod_indices diff --git a/Bimodularity-Figures.ipynb b/notebooks/01-bimodularity/Bimodularity-Figures.ipynb similarity index 99% rename from Bimodularity-Figures.ipynb rename to notebooks/01-bimodularity/Bimodularity-Figures.ipynb index e0a92cd..dc63f2a 100644 --- a/Bimodularity-Figures.ipynb +++ b/notebooks/01-bimodularity/Bimodularity-Figures.ipynb @@ -18,20 +18,22 @@ "from matplotlib.lines import Line2D\n", "from matplotlib.patheffects import withStroke\n", "from matplotlib.colors import LinearSegmentedColormap\n", - "\n", "from matplotlib.cm import ScalarMappable\n", "\n", "import networkx as nx\n", "\n", + "import importlib\n", + "\n", "import os\n", "import os.path as op\n", + "import sys\n", "\n", - "import importlib\n", - "\n", - "import dgsp\n", - "import graph_examples as dgsp_graphs\n", + "sys.path.append(\"../..\")\n", + "path_to_data = op.join(\"../..\", \"data\")\n", "\n", - "import bimod_plots as plot" + "from bimodularity import dgsp\n", + "from bimodularity import graph_examples as dgsp_graphs\n", + "from bimodularity import bimod_plots as plot" ] }, { @@ -956,8 +958,8 @@ "no_sex = False\n", "gap_junc = False\n", "\n", - "wiring_sym = np.genfromtxt(\"./data/celegans_graph\"+gap_junc*\"_GAP\"+\".csv\", delimiter=\",\")\n", - "neuron_df = pd.read_csv(\"./data/celegans_neurons.csv\")\n", + "wiring_sym = np.genfromtxt(op.join(path_to_data, \"celegans\", \"celegans_graph\"+gap_junc*\"_GAP\"+\".csv\"), delimiter=\",\")\n", + "neuron_df = pd.read_csv(op.join(path_to_data, \"celegans\", \"celegans_neurons.csv\"))\n", "\n", "wiring_mod = dgsp.modularity_matrix(wiring_sym, null_model=\"outin\")\n", "print(f\"Asymmetric wiring matrix has shape {wiring_sym.shape}\")\n", @@ -1401,7 +1403,7 @@ ], "metadata": { "kernelspec": { - "display_name": "bimod", + "display_name": "dgsp", "language": "python", "name": "python3" }, diff --git a/Bimodularity-Supplementary.ipynb b/notebooks/01-bimodularity/Bimodularity-Supplementary.ipynb similarity index 98% rename from Bimodularity-Supplementary.ipynb rename to notebooks/01-bimodularity/Bimodularity-Supplementary.ipynb index eb260dd..07550fb 100644 --- a/Bimodularity-Supplementary.ipynb +++ b/notebooks/01-bimodularity/Bimodularity-Supplementary.ipynb @@ -18,20 +18,22 @@ "from matplotlib.lines import Line2D\n", "from matplotlib.patheffects import withStroke\n", "from matplotlib.colors import LinearSegmentedColormap\n", - "\n", "from matplotlib.cm import ScalarMappable\n", "\n", "import networkx as nx\n", "\n", + "import importlib\n", + "\n", "import os\n", "import os.path as op\n", + "import sys\n", "\n", - "import importlib\n", - "\n", - "import dgsp\n", - "import graph_examples as dgsp_graphs\n", + "sys.path.append(\"../..\")\n", + "path_to_data = op.join(\"../..\", \"data\")\n", "\n", - "import bimod_plots as plot" + "from bimodularity import dgsp\n", + "from bimodularity import graph_examples as dgsp_graphs\n", + "from bimodularity import bimod_plots as plot" ] }, { @@ -135,8 +137,8 @@ "source": [ "gap_junc = False\n", "\n", - "wiring_sym = np.genfromtxt(\"./data/celegans_graph\"+gap_junc*\"_GAP\"+\".csv\", delimiter=\",\")\n", - "neuron_df = pd.read_csv(\"./data/celegans_neurons.csv\")\n", + "wiring_sym = np.genfromtxt(op.join(path_to_data, \"celegans\", \"celegans_graph\"+gap_junc*\"_GAP\"+\".csv\"), delimiter=\",\")\n", + "neuron_df = pd.read_csv(op.join(path_to_data, \"celegans\", \"celegans_neurons.csv\"))\n", "\n", "wiring_mod = dgsp.modularity_matrix(wiring_sym, null_model=\"outin\")\n", "print(f\"Asymmetric wiring matrix has shape {wiring_sym.shape}\")\n", @@ -532,24 +534,10 @@ " plot.plot_graph_embedding(graph, vector_id=0, fix_negative=False, ax=axes[0, i],\n", " node_clusers=node_clusters,\n", " override_title=f\"Bimodular Embedding\\n{n_SourceSinks} Sources and Sinks\")\n", - " # plot.plot_graph_embedding(graph, vector_id=1, fix_negative=False, ax=axes[1], node_clusers=node_clusters)\n", "\n", " axes[-1, i].set_title(\"Edge Clusters $(k=6)$\", fontsize=30)\n", " axes[-1, i].imshow(edge_clusters_mat, cmap=cmap_8clusters.resampled(n_kmeans+1), interpolation=\"none\", vmin=0, vmax=n_kmeans)\n", "\n", - " # for com_i in range(n_clusters):\n", - " # send = (edge_clusters_mat == com_i+1).sum(axis=1) > 0\n", - " # receive = (edge_clusters_mat == com_i+1).sum(axis=0) > 0\n", - "\n", - " # plot_send = (np.where(send)[0].min(), np.where(send)[0].max())\n", - " # plot_receive = (np.where(receive)[0].min(), np.where(receive)[0].max())\n", - "\n", - " # plot_send = np.where(send)[0]\n", - " # plot_receive = np.where(receive)[0]\n", - " \n", - " # axes[-1, i].scatter([-2-0.5-com_i]*len(plot_send), plot_send, marker=\"s\", s=10, color=cmap_8clusters.resampled(n_kmeans+1)(com_i+1), edgecolors=\"none\")\n", - " # axes[-1, i].scatter(plot_receive, [-2-0.5-com_i]*len(plot_receive), marker=\"s\", s=10, color=cmap_8clusters.resampled(n_kmeans+1)(com_i+1), edgecolors=\"none\")\n", - "\n", " axes[-1, i].axis(\"off\")\n", "\n", "fig.savefig(op.join(path_to_figures, f\"Suppl-Canonical-SourceSink-N{n_SourceSinks_max}.png\"), dpi=100, bbox_inches=\"tight\")\n", @@ -713,9 +701,13 @@ "con_densities = np.arange(0.1, 1.1, 0.1)\n", "#base_densities = np.hstack([np.arange(0.1, 0.3, 0.01), np.arange(0.3, 1, 0.1)])\n", "\n", - "if op.isfile(f\"./data/Benchmark_all_dice-N{len(all_n_per_coms)}-B{len(base_densities)}-C{len(con_densities)}-T{n_trials}.npy\") and not overwrite:\n", - " all_dice = np.load(f\"./data/Benchmark_all_dice-N{len(all_n_per_coms)}-B{len(base_densities)}-C{len(con_densities)}-T{n_trials}.npy\")\n", + "bm_fname = op.join(path_to_data, \"celegans\", f\"Benchmark_all_dice-N{len(all_n_per_coms)}-B{len(base_densities)}-C{len(con_densities)}-T{n_trials}.npy\")\n", + "if op.isfile(bm_fname) and not overwrite:\n", + " print(f\"Loading benchmark results from:\\n\\t{bm_fname}\")\n", + "\n", + " all_dice = np.load(bm_fname)\n", "else:\n", + " print(f\"Computing benchmark results ...\")\n", " all_dice = np.zeros((len(all_n_per_coms), len(con_densities), len(base_densities), n_trials))\n", " all_corr = np.zeros((len(all_n_per_coms), len(con_densities), len(base_densities), n_trials))\n", "\n", @@ -791,7 +783,7 @@ " all_dice[node_i, con_i, dense_i, trial_i] = dice.max(axis=0).mean()\n", " #all_corr[node_i, dense_i, trial_i] = confusion.max(axis=0).mean()\n", "\n", - " np.save(f\"./data/Benchmark_all_dice-N{len(all_n_per_coms)}-B{len(base_densities)}-C{len(con_densities)}-T{n_trials}.npy\", all_dice)" + " np.save(bm_fname, all_dice)" ] }, { @@ -1985,7 +1977,7 @@ "source": [ "gap_junc = True\n", "\n", - "wiring_sym_gap = np.genfromtxt(\"./data/celegans_graph\"+gap_junc*\"_GAP\"+\".csv\", delimiter=\",\")\n", + "wiring_sym_gap = np.genfromtxt(op.join(path_to_data, \"celegans\", \"celegans_graph\"+gap_junc*\"_GAP\"+\".csv\"), delimiter=\",\")\n", "\n", "wiring_mod_gap = dgsp.modularity_matrix(wiring_sym_gap, null_model=\"outin\")\n", "print(f\"Asymmetric wiring matrix has shape {wiring_sym_gap.shape}\")\n", @@ -2293,7 +2285,7 @@ ], "metadata": { "kernelspec": { - "display_name": "bimod", + "display_name": "dgsp", "language": "python", "name": "python3" }, diff --git a/notebooks/02-brain_bicommunities/brainbicom-ConsensusClustering.ipynb b/notebooks/02-brain_bicommunities/brainbicom-ConsensusClustering.ipynb new file mode 100644 index 0000000..ef3fdc8 --- /dev/null +++ b/notebooks/02-brain_bicommunities/brainbicom-ConsensusClustering.ipynb @@ -0,0 +1,320 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "377d8ade", + "metadata": {}, + "outputs": [], + "source": [ + "import os.path as op\n", + "import importlib\n", + "\n", + "import numpy as np\n", + "\n", + "from joblib import Parallel, delayed\n", + "from tqdm.notebook import tqdm\n", + "from time import perf_counter\n", + "\n", + "import sys\n", + "sys.path.append(\"../..\")\n", + "\n", + "from bimodularity import dgsp\n", + "from bimodularity import data_load as dload\n", + "from bimodularity import bundle as b_utils" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aaa38beb", + "metadata": {}, + "outputs": [], + "source": [ + "path_to_brain_data = op.join(\"../../data\", \"brain\")\n", + "path_to_derivatives = op.join(path_to_brain_data, \"derivatives\")\n", + "\n", + "path_to_sc = op.join(path_to_derivatives, \"structural_connectome\")\n", + "path_to_ec = op.join(path_to_derivatives, \"atlas_correspondence\", \"rDCM\")\n", + "path_to_consensus = op.join(path_to_derivatives, \"consensus_clustering\")" + ] + }, + { + "cell_type": "markdown", + "id": "39f54e74", + "metadata": {}, + "source": [ + "# Consensus Clustering" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8ba47865", + "metadata": {}, + "outputs": [], + "source": [ + "importlib.reload(b_utils)\n", + "\n", + "all_scales = [2]\n", + "\n", + "struct_type = \"\"\n", + "use_delay = False\n", + "k_threshold = 0\n", + "b_thresh = 0.5\n", + "slines_theshold = 5\n", + "\n", + "n_trials = 50\n", + "n_init = 50\n", + "dthresh = 0\n", + "selected_sort = 0\n", + "\n", + "undirected = False\n", + "nosquared = False\n", + "\n", + "run_fix = False\n", + "if undirected:\n", + " run_fix = True\n", + "\n", + "all_n_kmeans = np.arange(10, 80, 1)\n", + "all_nvecs = [20]\n", + "all_gammas = [1, 2, 2.5, 3, 3.5, 4]\n", + "all_gammas = [1]\n", + "\n", + "for gamma in all_gammas:\n", + " for n_vec_max in all_nvecs:\n", + " for scale in all_scales:\n", + " k_matrix, labels, node_centers = dload.load_bundle_graph(path_to_data=path_to_sc,\n", + " data_suffix=\"Laus2018_\",\n", + " scale=scale,\n", + " b_prob_threshold=0,\n", + " slines_theshold=slines_theshold,\n", + " log_slines=False,\n", + " normalize_slines=False,\n", + " verbose=False)\n", + "\n", + " labels, k_matrix = b_utils.fix_thalamus(labels, matrix=k_matrix)\n", + " k_matrix[k_matrix < b_thresh] = 0\n", + "\n", + " np.fill_diagonal(k_matrix, 0)\n", + "\n", + " if undirected:\n", + " graph = ((k_matrix + k_matrix.T) / 2 > 0).astype(int)\n", + " else:\n", + " ec_mat = dload.get_ec_data(scale=scale, path_to_ec=path_to_ec, remove_neg=True, fix_thal=True, verbose=False)\n", + " ec_mat /= ec_mat.max()\n", + " ec_mat = ec_mat ** gamma\n", + "\n", + " dir_ratio = np.divide(ec_mat, (ec_mat + ec_mat.T),\n", + " where=(ec_mat + ec_mat.T) > 1e-5,\n", + " out=np.zeros_like(ec_mat))\n", + " graph = (k_matrix > 0) * dir_ratio\n", + "\n", + " U, S, Vh = dgsp.sorted_SVD(dgsp.modularity_matrix(graph))\n", + " V = Vh.T\n", + "\n", + " n_nodes = len(S)\n", + " \n", + " if nosquared:\n", + " scale_factor = S[:n_vec_max]\n", + " else:\n", + " scale_factor = S[:n_vec_max] ** 2\n", + "\n", + " all_labels = np.zeros((len(all_n_kmeans), n_trials, np.sum(graph != 0)), dtype=np.int8)\n", + " all_labels_fix = np.zeros((len(all_n_kmeans), n_trials, np.sum(graph != 0)), dtype=np.int8)\n", + "\n", + " cons_lab = np.zeros((len(all_n_kmeans), np.sum(graph != 0)), dtype=np.int8)\n", + " cons_lab_fix = np.zeros((len(all_n_kmeans), np.sum(graph != 0)), dtype=np.int8)\n", + "\n", + " all_c_within = np.zeros(len(all_n_kmeans))\n", + " all_c_between = np.zeros(len(all_n_kmeans))\n", + "\n", + " all_c_within_fix = np.zeros(len(all_n_kmeans))\n", + " all_c_between_fix = np.zeros(len(all_n_kmeans))\n", + "\n", + " avg_cons = np.zeros((np.sum(graph != 0), np.sum(graph != 0)), dtype=int)\n", + " avg_cons_fix = np.zeros((np.sum(graph != 0), np.sum(graph != 0)), dtype=int)\n", + " reorder = False\n", + "\n", + " bm_fname = \"_\".join([\n", + " f\"brain_consensus-EC\",\n", + " f\"scale{scale}\",\n", + " f\"nvec{n_vec_max}\" + \"-NoSquared\"*nosquared,\n", + " f\"trials{n_trials}\",\n", + " f\"ninit{n_init}\",\n", + " f\"kmeans{all_n_kmeans[0]}-{all_n_kmeans[-1]}\",\n", + " f\"slines_thresh{slines_theshold}\",\n", + " f\"ustruct{struct_type}\"*(struct_type != \"\"),\n", + " f\"dthresh{dthresh}\"*(dthresh != 0),\n", + " f\"gamma{gamma}\"*(gamma != 1),\n", + " f\"selected{selected_sort}\"*(selected_sort != 0)\n", + " ])\n", + " bm_fname += \".pkl\"\n", + "\n", + " if undirected:\n", + " bm_fname = \"Undir_\" + bm_fname\n", + "\n", + " if op.isfile(op.join(path_to_consensus, bm_fname)):\n", + " data = dload.load(op.join(path_to_consensus, bm_fname))\n", + " graph = data[\"graph\"]\n", + " all_n_kmeans = data[\"all_n_kmeans\"]\n", + " cons_lab = data[\"cons_lab\"]\n", + " cons_lab_fix = data[\"cons_lab_fix\"]\n", + " all_c_within = data[\"all_c_within\"]\n", + " all_c_between = data[\"all_c_between\"]\n", + " all_c_within_fix = data[\"all_c_within_fix\"]\n", + " all_c_between_fix = data[\"all_c_between_fix\"]\n", + " avg_cons = data[\"avg_cons\"]\n", + " avg_cons_fix = data[\"avg_cons_fix\"]\n", + "\n", + " # # Override the anatomical bundle correspondence\n", + " # edge_to_bundle_mat = b_utils.get_edge_to_bundle(graph, scale, labels, overlap_thresh=0.1)\n", + " # dload.save(op.join(path_to_consensus, bm_fname),\n", + " # {\"graph\": graph,\n", + " # \"all_n_kmeans\": all_n_kmeans,\n", + " # \"cons_lab\": cons_lab,\n", + " # \"cons_lab_fix\": cons_lab_fix,\n", + " # \"all_c_within\": all_c_within,\n", + " # \"all_c_between\": all_c_between,\n", + " # \"all_c_within_fix\": all_c_within_fix,\n", + " # \"all_c_between_fix\": all_c_between_fix,\n", + " # \"avg_cons\": avg_cons,\n", + " # \"avg_cons_fix\": avg_cons_fix,\n", + " # \"edge_to_bundle_mat\": edge_to_bundle_mat})\n", + " elif op.isfile(op.join(path_to_consensus, bm_fname.replace(\".pkl\", \".pkl.gz\"))):\n", + " print(\"Found gzipped version of the file! Skipping.\")\n", + "\n", + " # os.system(f\"gunzip -k {op.join(path_to_consensus, bm_fname.replace('.pkl', '.pkl.gz'))}\")\n", + " \n", + " # data = dload.load(op.join(path_to_consensus, bm_fname))\n", + " # graph = data[\"graph\"]\n", + " # all_n_kmeans = data[\"all_n_kmeans\"]\n", + " # cons_lab = data[\"cons_lab\"]\n", + " # cons_lab_fix = data[\"cons_lab_fix\"]\n", + " # all_c_within = data[\"all_c_within\"]\n", + " # all_c_between = data[\"all_c_between\"]\n", + " # all_c_within_fix = data[\"all_c_within_fix\"]\n", + " # all_c_between_fix = data[\"all_c_between_fix\"]\n", + " # avg_cons = data[\"avg_cons\"]\n", + " # avg_cons_fix = data[\"avg_cons_fix\"]\n", + "\n", + " # os.system(f\"rm {op.join(path_to_consensus, bm_fname.replace('.pkl', '.pkl.gz'))}\")\n", + " else:\n", + "\n", + " njobs = 1\n", + "\n", + " parallel = Parallel(n_jobs=np.min([14, n_trials]), return_as=\"generator_unordered\")\n", + " counter = tqdm(total=len(all_n_kmeans)*n_trials)\n", + "\n", + " t_cl = []\n", + " t_co = []\n", + " t_fast = []\n", + " t_cs = []\n", + "\n", + " # for k_i, n_kmeans in tqdm(enumerate(all_n_kmeans), total=len(all_n_kmeans)):\n", + " for k_i, n_kmeans in enumerate(all_n_kmeans):\n", + " t_1 = perf_counter()\n", + " gen = parallel(delayed(dgsp.edge_bicommunities)(\n", + " graph, U, V, \n", + " n_vec_max,\n", + " method=\"kmeans\",\n", + " n_kmeans=n_kmeans,\n", + " verbose=False,\n", + " max_k=50,\n", + " scale_S=scale_factor,\n", + " clust_only=True,\n", + " undirected=True,\n", + " kwargs_kmeans1={\"n_init\":n_init, \"init\":\"random\"},\n", + " kwargs_kmeans2={\"n_init\":1, \"tol\":1e-10},\n", + " dthresh=dthresh,\n", + " ) for _ in range(n_trials))\n", + " \n", + " for t, labs in enumerate(gen):\n", + " all_labels[k_i, t] = labs[0]\n", + " all_labels_fix[k_i, t] = labs[1]\n", + " counter.update(1)\n", + "\n", + " t_2 = perf_counter()\n", + " t_cl.append(t_2 - t_1)\n", + " # print(f\"Clustering took {t_cl[-1]:.2f} seconds (mean: {np.mean(t_cl):1.2f} s)\")\n", + "\n", + " cons, cons_lab[k_i] = dgsp.consensus_matrix(all_labels[k_i], reorder=reorder, consensus_labels=True, fast=True, njobs=njobs)\n", + " if run_fix:\n", + " cons_fix, cons_lab_fix[k_i] = dgsp.consensus_matrix(all_labels_fix[k_i], reorder=reorder, consensus_labels=True, fast=True, njobs=njobs)\n", + "\n", + " t_3 = perf_counter()\n", + " t_co.append(t_3 - t_2)\n", + " # print(f\"Consensus matrix computation took {t_co[-1]:.2f} seconds (mean: {np.mean(t_co):1.2f} s)\")\n", + "\n", + " avg_cons += cons\n", + " if run_fix:\n", + " avg_cons_fix += cons_fix\n", + "\n", + " all_c_within[k_i], all_c_between[k_i] = dgsp.consensus_score(cons, cons_lab[k_i], is_sorted=not reorder)\n", + " if run_fix:\n", + " all_c_within_fix[k_i], all_c_between_fix[k_i] = dgsp.consensus_score(cons_fix, cons_lab_fix[k_i], is_sorted=not reorder)\n", + "\n", + " t_4 = perf_counter()\n", + " t_cs.append(t_4 - t_3)\n", + " # print(f\"Consensus score took {t_cs[-1]:.2f} seconds (mean: {np.mean(t_cs):1.2f} s)\")\n", + "\n", + " avg_cons = avg_cons.astype(float) / (len(all_n_kmeans) * n_trials)\n", + " if run_fix:\n", + " avg_cons_fix = avg_cons_fix.astype(float) / (len(all_n_kmeans) * n_trials)\n", + " else:\n", + " avg_cons_fix = None\n", + "\n", + " print(f\"Consensus Clustering Done\")\n", + " print(f\"\\t- Clustering took {np.mean(t_cl):1.2f}s on average\")\n", + " print(f\"\\t- Consensus Matrix took {np.mean(t_co):1.2f}s on average\")\n", + " print(f\"\\t- Consensus Score took {np.mean(t_cs):1.2f}s on average\")\n", + "\n", + " counter.close()\n", + "\n", + " edge_to_bundle_mat = b_utils.get_edge_to_bundle(graph, scale, labels, overlap_thresh=0.1)\n", + "\n", + " dload.save(op.join(path_to_consensus, bm_fname),\n", + " {\"graph\": graph,\n", + " \"all_n_kmeans\": all_n_kmeans,\n", + " \"cons_lab\": cons_lab,\n", + " \"cons_lab_fix\": cons_lab_fix,\n", + " \"all_c_within\": all_c_within,\n", + " \"all_c_between\": all_c_between,\n", + " \"all_c_within_fix\": all_c_within_fix,\n", + " \"all_c_between_fix\": all_c_between_fix,\n", + " \"avg_cons\": avg_cons,\n", + " \"avg_cons_fix\": avg_cons_fix,\n", + " \"edge_to_bundle_mat\": edge_to_bundle_mat})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a86dcd0a", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "dgsp", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/02-brain_bicommunities/brainbicom-Figures.ipynb b/notebooks/02-brain_bicommunities/brainbicom-Figures.ipynb new file mode 100644 index 0000000..af599eb --- /dev/null +++ b/notebooks/02-brain_bicommunities/brainbicom-Figures.ipynb @@ -0,0 +1,2545 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "377d8ade", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import os.path as op\n", + "\n", + "import importlib\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.lines import Line2D\n", + "from matplotlib.colors import LinearSegmentedColormap\n", + "from matplotlib.gridspec import GridSpecFromSubplotSpec\n", + "\n", + "from scipy.cluster.hierarchy import linkage, fcluster\n", + "from scipy.signal import argrelextrema\n", + "from scipy.spatial.distance import squareform\n", + "from scipy.stats import spearmanr\n", + "from sklearn.linear_model import LinearRegression\n", + "\n", + "from joblib import Parallel, delayed\n", + "from tqdm.notebook import tqdm\n", + "\n", + "import sys\n", + "sys.path.append(\"../..\")\n", + "path_to_data = op.join(\"../..\", \"data\")\n", + "\n", + "from bimodularity import dgsp\n", + "from bimodularity import bimod_plots as plot\n", + "from bimodularity import palettes\n", + "from bimodularity import data_load as dload\n", + "from bimodularity import bundle as b_utils" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "92860878", + "metadata": {}, + "outputs": [], + "source": [ + "cmaps = plot.get_all_cmaps()\n", + "print(cmaps.keys())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aaa38beb", + "metadata": {}, + "outputs": [], + "source": [ + "path_to_brain_data = op.join(\"../../data\", \"brain\")\n", + "path_to_bundles = op.join(path_to_brain_data, \"SCIL\")\n", + "\n", + "path_to_derivatives = op.join(\"../../data\", \"brain\", \"derivatives\")\n", + "\n", + "path_to_sc = op.join(path_to_derivatives, \"structural_connectome\")\n", + "path_to_ec = op.join(path_to_derivatives, \"atlas_correspondence\", \"rDCM\")\n", + "path_to_lobe = op.join(path_to_derivatives, \"atlas_correspondence\", \"Lobes\")\n", + "path_to_consensus = op.join(path_to_derivatives, \"consensus_clustering\")\n", + "\n", + "fast = True" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "59622dac", + "metadata": {}, + "outputs": [], + "source": [ + "all_scales = [1, 2, 3, 4]\n", + "\n", + "use_delay = False\n", + "k_threshold = 0\n", + "b_thresh = 0\n", + "slines_theshold = 5\n", + "\n", + "struct_type = \"\"\n", + "\n", + "scale = 2\n", + "\n", + "k_matrix, labels, node_centers = dload.load_bundle_graph(path_to_data=path_to_sc,\n", + " data_suffix=\"Laus2018_\",\n", + " scale=scale,\n", + " b_prob_threshold=0,\n", + " slines_theshold=slines_theshold,\n", + " log_slines=False,\n", + " normalize_slines=False,\n", + " verbose=True)\n", + "\n", + "labels, node_centers = b_utils.fix_thalamus(labels, pos=node_centers)\n", + "order_by_lobe, lobe_sizes, lobe_labels, lobe_df = dload.get_lobe_info(scale, labels, path_to_lobe=path_to_lobe)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "43d9a731", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "7a26b8d6", + "metadata": {}, + "source": [ + "## Consensus Clustering" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d9a56d9e", + "metadata": {}, + "outputs": [], + "source": [ + "scale = 2\n", + "n_vec_max = 20\n", + "gamma = 1\n", + "\n", + "nosquared = False\n", + "\n", + "n_trials = 50\n", + "n_init = 50\n", + "dthresh = 0\n", + "selected_sort = 0\n", + "\n", + "upsample = 3\n", + "\n", + "all_n_kmeans = np.arange(10, 80, 1)\n", + "\n", + "bm_fname = \"_\".join([\n", + " f\"brain_consensus-EC\",\n", + " f\"scale{scale}\",\n", + " f\"nvec{n_vec_max}\" + \"-NoSquared\"*nosquared,\n", + " f\"trials{n_trials}\",\n", + " f\"ninit{n_init}\",\n", + " f\"kmeans{all_n_kmeans[0]}-{all_n_kmeans[-1]}\",\n", + " f\"slines_thresh{slines_theshold}\",\n", + " f\"ustruct{struct_type}\"*(struct_type != \"\"),\n", + " f\"dthresh{dthresh}\"*(dthresh != 0),\n", + " f\"gamma{gamma}\"*(gamma != 1),\n", + " f\"selected{selected_sort}\"*(selected_sort != 0)\n", + " ])\n", + "bm_fname += \".pkl\"\n", + "\n", + "if op.isfile(op.join(path_to_consensus, bm_fname)):\n", + " data = dload.load(op.join(path_to_consensus, bm_fname))\n", + " graph = data[\"graph\"]\n", + " all_n_kmeans = data[\"all_n_kmeans\"]\n", + " cons_lab = data[\"cons_lab\"]\n", + " avg_cons = data[\"avg_cons\"]\n", + " edge_to_bundle_mat = data[\"edge_to_bundle_mat\"]\n", + "else:\n", + " print(\"No benchmark file found - Please, run the benchmarking notebook!\")\n", + " print(f\"\\t`{bm_fname}`\")\n", + "\n", + "fig_suffix = f\"gamma{gamma}_nvec{n_vec_max}\" + \"-NoSquared\"*nosquared\n", + "path_to_figures = op.join(\"./figures\", f\"scale{scale}\", fig_suffix)\n", + "\n", + "os.makedirs(path_to_figures, exist_ok=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "117314a8", + "metadata": {}, + "outputs": [], + "source": [ + "centroid_dir = op.join(\n", + " path_to_brain_data, \"BundleAtlas\", \"centroids\",\n", + " f\"scale{scale}\", f\"group_centroids_scale{scale}\"\n", + ")\n", + "\n", + "a_bundles_labels = pd.read_csv(op.join(path_to_bundles, \"bundle_names.csv\"))\n", + "a_bundles_labels = a_bundles_labels.rename(columns={\"Unnamed: 0\": \"BundleNum\"})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "559803ed", + "metadata": {}, + "outputs": [], + "source": [ + "if \"edge_to_bundle_Bmdf\" in data:\n", + " edge_to_bundle_dist = data[\"edge_to_bundle_Bmdf\"]\n", + "else:\n", + " edge_to_bundle_dist = b_utils.compute_edge_to_bundle_distance(\n", + " graph, labels=labels, scale=scale,\n", + " path_to_edge_centroids=centroid_dir,\n", + " path_to_atlas_centroids=path_to_bundles, a_bundles_labels=a_bundles_labels\n", + " )\n", + "\n", + " data.update({\"edge_to_bundle_Bmdf\": edge_to_bundle_dist})\n", + " dload.save(op.join(path_to_consensus, bm_fname), data)" + ] + }, + { + "cell_type": "markdown", + "id": "fcda4b4e", + "metadata": {}, + "source": [ + "## Hierarchical Consensus Clustering" + ] + }, + { + "cell_type": "markdown", + "id": "f2789f8b", + "metadata": {}, + "source": [ + "### Preparation Code" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "064ac701", + "metadata": {}, + "outputs": [], + "source": [ + "hierarchical_matrix = 1 - avg_cons\n", + "c_mat = 1 - hierarchical_matrix\n", + "\n", + "dist_condensed = squareform(hierarchical_matrix)\n", + "Z = linkage(dist_condensed, method='average', metric='precomputed')\n", + "distances = np.flip(Z[:, 2])\n", + "diff_dist = -np.diff(distances)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ada7123f", + "metadata": {}, + "outputs": [], + "source": [ + "n_samples = len(hierarchical_matrix)\n", + "\n", + "# Number of clusters K decreases from n_samples to 1\n", + "n_clusters = np.arange(1, n_samples)\n", + "\n", + "nshow = 100\n", + "p_idx, q_idx = np.triu_indices(n_samples, k=1)\n", + "\n", + "all_ratios = np.zeros(nshow)\n", + "all_self = np.zeros(nshow)\n", + "all_bi = np.zeros(nshow)\n", + "\n", + "if not fast:\n", + " for i, k in enumerate(n_clusters[:nshow]):\n", + " labs = fcluster(Z, t=k, criterion='maxclust')\n", + "\n", + " pair_same = (labs[p_idx] == labs[q_idx])\n", + " within_val = 1 - dist_condensed[pair_same]\n", + " between_val = 1 - dist_condensed[~pair_same]\n", + "\n", + " within_mean = within_val[within_val > 0].mean()\n", + " if len(between_val[between_val > 0]) == 0:\n", + " all_ratios[i] = np.nan\n", + " continue\n", + " else:\n", + " between_mean = between_val[between_val > 0].mean()\n", + "\n", + " all_ratios[i] = within_mean / between_mean\n", + "\n", + " e_labels = labs\n", + " e_mat = np.zeros_like(graph, dtype=int)\n", + " e_mat[graph > 0] = e_labels\n", + "\n", + " send, rec = dgsp.get_node_clusters(e_labels, e_mat)\n", + " row_ind, col_ind = dgsp.get_conjugates_matching(send, rec)\n", + "\n", + " self = np.where(row_ind == col_ind)[0]\n", + " all_self[i] = len(self)\n", + "\n", + "all_ratios = np.nan_to_num(all_ratios, nan=np.nanmax(all_ratios))\n", + "\n", + "best_k = np.argmax(diff_dist)+1\n", + "print(f\"Best k is at max diff: {best_k} with distance jump {diff_dist[best_k-1]:.4f}\")\n", + "\n", + "# Plot branching distance vs number of clusters\n", + "fig, axes = plt.subplots(ncols=2, figsize=(12, 5))\n", + "axes[0].plot(n_clusters[:nshow], distances[:nshow], marker='o', zorder=1)\n", + "axes[0].set_xlabel(\"Number of Clusters (K)\")\n", + "axes[0].set_ylabel(\"Branching Distance (linkage)\")\n", + "axes[0].set_title(\"Branching Distance\")\n", + "\n", + "ax2 = axes[0].twinx()\n", + "ax2.plot(n_clusters[:nshow], all_ratios[:nshow], marker='o', color=\"tab:orange\", zorder=0)\n", + "\n", + "nplots = np.min([nshow, 80])\n", + "axes[1].plot(n_clusters[:nplots]+1, diff_dist[:nplots], marker='o', zorder=1)\n", + "ax22 = axes[1].twinx()\n", + "ax22.plot(n_clusters[:nplots]+1, all_ratios[:nplots], color=\"tab:orange\", zorder=0)\n", + "\n", + "ax33 = axes[1].twinx()\n", + "ax33.plot(n_clusters[:nplots]+1, all_self[:nplots]/(n_clusters[:nplots]+1), color=\"tab:green\", zorder=0)\n", + "\n", + "axes[1].set_xlabel(\"Number of Clusters (K)\")\n", + "axes[1].set_ylabel(\"Difference (Distance)\")\n", + "axes[1].set_title(\"Difference in Branching Distance\")\n", + "\n", + "local_max_idx = argrelextrema(diff_dist, np.greater)[0]\n", + "ordered_maximas = local_max_idx[np.flip(np.argsort(diff_dist[local_max_idx]))]\n", + "\n", + "print(\"Top 10 largest jumps in distance:\")\n", + "for i, top10 in enumerate(ordered_maximas[:10]):\n", + " print(f\" -{i+1:02d}: K = {top10+2},\\tdist: {diff_dist[top10]:.4f}, \\tcut: {distances[top10]:.4f}\")\n", + "\n", + " axes[1].scatter(n_clusters[top10]+1, diff_dist[top10], marker='o', color=\"tab:red\", s=100)\n", + " axes[1].text(n_clusters[top10]+1, diff_dist[top10]*1.01, f\"K={top10+2}\", fontsize=12,\n", + " ha='left', va='bottom')" + ] + }, + { + "cell_type": "markdown", + "id": "8a103776", + "metadata": {}, + "source": [ + "### Figure" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "92e4ffc4", + "metadata": {}, + "outputs": [], + "source": [ + "fig, all_axes = plt.subplots(ncols=2, figsize=(25, 16), gridspec_kw={'wspace': 0, \"width_ratios\":[1, 1]})\n", + "\n", + "all_axes[0].axis(\"off\")\n", + "gs = GridSpecFromSubplotSpec(2, 1, subplot_spec=all_axes[0].get_subplotspec(), hspace=0.1, height_ratios=[1, 2])\n", + "axes_left = [fig.add_subplot(gs[i]) for i in range(2)]\n", + "\n", + "axes_left[0].axis(\"off\")\n", + "gs = GridSpecFromSubplotSpec(1, 2, subplot_spec=axes_left[0].get_subplotspec(), wspace=0.1)\n", + "axes_mat = [fig.add_subplot(gs[i]) for i in range(2)]\n", + "\n", + "axes_mat[0].spines[:].set_visible(False)\n", + "axes_mat[0].set_xticks([])\n", + "axes_mat[0].set_yticks([])\n", + "axes_mat[0].set_title(\"Directed Connectome\", fontsize=18)\n", + "axes_mat[0].set_ylabel(\"Nodes\", fontsize=16)\n", + "axes_mat[0].imshow(graph[order_by_lobe][:, order_by_lobe], cmap=cmaps[\"div_rb\"], interpolation=\"none\")\n", + "_, _, cbar = plot.add_cbar(fig, axes_mat[0])\n", + "cbar.set_ticks([0, 0.5, 1], labels=[\"0\", \"Bidirectional\", \"1\"], rotation=90, ha=\"left\", va=\"center\")\n", + "cbar.ax.tick_params(labelsize=16)\n", + "\n", + "axes_mat[1].spines[:].set_visible(False)\n", + "axes_mat[1].set_xticks([])\n", + "axes_mat[1].set_yticks([])\n", + "axes_mat[1].set_title(\"Bicommunity Consensus\", fontsize=18)\n", + "axes_mat[1].set_ylabel(\"Edges\", fontsize=16)\n", + "if not fast:\n", + " axes_mat[1].imshow(1 - hierarchical_matrix, cmap=cmaps[\"div_rb\"], interpolation=\"none\")\n", + " _, _, cbar = plot.add_cbar(fig, axes_mat[1], label=\"co-cluster probability\")\n", + "cbar.set_ticks([0, 1], labels=[\"0\", \"1\"], rotation=90, ha=\"left\", va=\"center\")\n", + "cbar.set_label(\"Co-cluster Probability\", fontsize=16, va=\"bottom\")\n", + "cbar.ax.tick_params(labelsize=16)\n", + "\n", + "axes_left[1].axis(\"off\")\n", + "axes_left[1].set_title(\"Hierarchical Clustering\", fontsize=18)\n", + "gs = GridSpecFromSubplotSpec(1, 2, subplot_spec=axes_left[1].get_subplotspec(), wspace=0, width_ratios=[0.3, 1.5])\n", + "axes = [fig.add_subplot(gs[i]) for i in range(2)]\n", + "\n", + "cut_dist = distances[:-1] - diff_dist/2\n", + "axes[0].plot(diff_dist, cut_dist, marker='o', markersize=4, lw=2, color=\"k\")\n", + "\n", + "selected_list = [-1, -2, -4]\n", + "selected_list = [-1, -9, -4]\n", + "selected_list = [0, 1, 2]\n", + "\n", + "best10_list = ordered_maximas[selected_list]\n", + "if gamma == 3:\n", + " x_dendro = [4.4e4, 4.5e4, 4.22e4]\n", + "else:\n", + " x_dendro = [6.95e4, 6.6e4, 6.83e4]\n", + "for i, top10 in enumerate(best10_list):\n", + "\n", + " axes[0].scatter(diff_dist[top10], cut_dist[top10], marker='o', color=\"tab:red\", s=50, zorder=4)\n", + " axes[0].text(1.2*diff_dist.max(), cut_dist[top10]+7e-3, f\"$K={top10+2}$\", fontsize=14,\n", + " ha='left', va='bottom', zorder=5)\n", + " \n", + " axes[0].plot([diff_dist[top10], -0.1], [cut_dist[top10]]*2, color=\"r\", lw=3, alpha=0.8, zorder=0)\n", + " axes[1].axhline(cut_dist[top10], color=\"r\", lw=3, alpha=0.8)\n", + "\n", + " axes[1].scatter(x_dendro[i], cut_dist[top10], s=200, color=\"none\", edgecolors=\"r\", lw=2)\n", + "\n", + "cut_thresh = 0.77\n", + "cut_thresh = cut_dist[best10_list[0]]\n", + "\n", + "axes[0].set_xticks([])\n", + "axes[0].set_yticks([])\n", + "axes[0].text(0.6 * diff_dist.max(), 0.42, \"Hierarchical Distance\",\n", + " fontsize=14, rotation=90, va=\"bottom\", ha=\"right\")\n", + "\n", + "axes[0].set_xlim(1.5*diff_dist.max(), -diff_dist.max()*0.1)\n", + "axes[0].spines[[\"top\", \"left\", \"right\"]].set_visible(False)\n", + "axes[0].spines[:].set_linewidth(2)\n", + "\n", + "axes[0].axis(\"off\")\n", + "axes[1].axis(\"off\")\n", + "\n", + "e_labels = fcluster(Z, t=cut_thresh, criterion='distance')\n", + "k = e_labels.max()\n", + "ls_list = [{\"lw\": 1}]*len(Z)\n", + "cluster_cmap = cmaps[\"extended_ncar\"].resampled(k+1)\n", + "d_dict, axes[1] = plot.styled_dendrogram(Z, color_threshold=0.5, cut_height=cut_thresh, lw=2, cmap=cluster_cmap, ax=axes[1], p=0.4)\n", + "\n", + "axes[1].set_xlim(-500, np.max(d_dict[\"icoord\"]) + 100)\n", + "axes[1].set_ylim(0.41, 1.0)\n", + "axes[0].set_ylim(0.41, 1.0)\n", + "\n", + "selected_cuts = np.flip(sorted(cut_dist[best10_list]))\n", + "\n", + "all_axes[1].axis(\"off\")\n", + "gs = GridSpecFromSubplotSpec(len(selected_cuts), 1, subplot_spec=all_axes[1].get_subplotspec(), hspace=0.1)\n", + "axes_bicom = [fig.add_subplot(gs[i]) for i in range(len(selected_cuts))]\n", + "\n", + "overlay_slines = False\n", + "opacity = 1\n", + "if not overlay_slines:\n", + " opacity = 0.1\n", + "\n", + "all_e_labels = []\n", + "all_e_mats = []\n", + "all_send_rec = []\n", + "all_conj = []\n", + "all_ks = []\n", + "all_dist = []\n", + "for i, axes_bc in enumerate(axes_bicom):\n", + " axes_bc.axis(\"off\")\n", + " gs = GridSpecFromSubplotSpec(1, 3, subplot_spec=axes_bc.get_subplotspec(),\n", + " wspace=0, width_ratios=[0.4, 1, 1])\n", + " ax_bc = [fig.add_subplot(gs[i]) for i in range(3)]\n", + "\n", + " e_labels = fcluster(Z, t=selected_cuts[i], criterion='distance')\n", + " print(e_labels.min(), e_labels.max())\n", + " e_mat = np.zeros_like(graph, dtype=int)\n", + " e_mat[graph != 0] = e_labels\n", + " print(e_mat.min(), e_mat.max())\n", + "\n", + " send, rec = dgsp.get_node_clusters(e_labels, e_mat, scale=False)\n", + " bimod_idx = dgsp.bimod_index_nodes(graph, send, rec, scale=True)\n", + " sorting_array = np.flip(np.argsort(bimod_idx))\n", + "\n", + " all_e_labels.append(e_labels)\n", + " all_e_mats.append(e_mat)\n", + " all_send_rec.append((send, rec))\n", + "\n", + " ax_bc[0].axis(\"off\")\n", + " cluster_cmap = cmaps[\"cluster_palette_soft\"]\n", + " cluster_cmap = cmaps[\"extended_ncar\"].resampled(e_labels.max()+1)\n", + " ax_bc[1].imshow(e_mat[order_by_lobe][:, order_by_lobe], cmap=cluster_cmap, vmin=0, vmax=len(np.unique(e_labels))+1, interpolation=\"none\")\n", + " plot.plot_lobe_lines(ax_bc[1], lobe_sizes, lobe_labels, no_insula=True, x_hemi=True, fontsize=14)\n", + " if i > 0:\n", + " ax_bc[1].set_xticks([])\n", + "\n", + " sort_lab = np.argsort(e_labels)\n", + " c_mat = 1 - hierarchical_matrix\n", + "\n", + " row, col, mat = dgsp.get_conjugates_matching(send, rec, unique=False, return_matrix=True)\n", + "\n", + " bic_id = [11, 17, 31][i]\n", + " \n", + " if not fast:\n", + " plot.plot_bicom_tracts(\n", + " bic_id,\n", + " e_mat,\n", + " labels,\n", + " scale,\n", + " cmap=cmaps[\"div_rb\"],\n", + " view=\"right\",\n", + " axes=ax_bc[2],\n", + " n_centroids=5,\n", + " linewidth=0.3,\n", + " slines_alpha=0.99,\n", + " brain_opacity=opacity,\n", + " overlay_slines=overlay_slines,\n", + " upsample=upsample,\n", + " fig=fig,)\n", + " \n", + " if i == 2:\n", + " plot.draw_cbar(fig, ax_pos=[0.76, 0.135, 0.12, 0.01],\n", + " cmap=cmaps[\"div_rb\"], ticks=[0, 10],\n", + " labels=[\"Receive\", \"Send\"])\n", + "\n", + "# Plotting letters\n", + "axes_mat[0].text(0, 1.02, \"A.\", fontsize=18, transform=axes_mat[0].transAxes, weight=\"bold\")\n", + "axes_mat[1].text(0, 1.02, \"B.\", fontsize=18, transform=axes_mat[1].transAxes, weight=\"bold\")\n", + "\n", + "axes[0].text(0.1, 1.02, \"C.\", fontsize=18, transform=axes[0].transAxes, weight=\"bold\")\n", + "\n", + "for ax, letter in zip(axes_bicom, [\"D.\", \"E.\", \"F.\"]):\n", + " ax.text(0.05, 1.02, letter, fontsize=18, transform=ax.transAxes, weight=\"bold\")\n", + "\n", + "for ax, letter in zip(axes_bicom, [\"G.\", \"H.\", \"I.\"]):\n", + " ax.text(0.6, 1.02, letter, fontsize=18, transform=ax.transAxes, weight=\"bold\")\n", + "\n", + "if not fast:\n", + " upsample_suffix = f\"_upsample{upsample}\" if upsample is not None else \"\"\n", + " trans_suffix = f\"_trans{opacity}\" if overlay_slines is not None else \"\"\n", + " fig.savefig(op.join(path_to_figures, f\"01-dendrogram-RIGHT{upsample_suffix}.png\"),\n", + " dpi=600, bbox_inches='tight')\n", + " fig.savefig(op.join(path_to_figures, f\"01-dendrogram-RIGHT{upsample_suffix}.pdf\"),\n", + " dpi=600, bbox_inches='tight', format=\"pdf\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "428c06af", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "745a6aa3", + "metadata": {}, + "source": [ + "## Adding Directionality" + ] + }, + { + "cell_type": "markdown", + "id": "f94b9f77", + "metadata": {}, + "source": [ + "### Preparation Code" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11661466", + "metadata": {}, + "outputs": [], + "source": [ + "bicom_id = 2\n", + "\n", + "e_labels = all_e_labels[bicom_id]\n", + "edge_clusters_mat = all_e_mats[bicom_id]\n", + "e_clust = edge_clusters_mat[graph > 0]\n", + "\n", + "print(edge_clusters_mat.max())\n", + "\n", + "n_shuffle = 10000\n", + "perm_prop = 0.5\n", + "\n", + "bicoms_masks = np.array([e_clust == (i+1) for i in range(e_clust.max())])\n", + "graph_asym = np.divide(graph, (graph + graph.T), where=(graph + graph.T) > 0, out=np.zeros_like(graph))\n", + "true_ratio = dgsp.get_asym_ratio(graph_asym[graph > 0], bicom_masks=bicoms_masks)\n", + "all_ratios_sym = np.zeros((n_shuffle, len(true_ratio)))\n", + "\n", + "save_perm = True\n", + "# path_to_saveperm = f\"./results/BrainKmeans/scale{scale}/permutations\"\n", + "path_to_saveperm = op.join(path_to_derivatives, \"permutations\", f\"scale{scale}\")\n", + "\n", + "fname = f\"Dir-permutations_scale{scale}_gamma{gamma}-{n_shuffle}Perm-K{edge_clusters_mat.max()}\"\n", + "fname += \".pkl\"\n", + "print(f\"Savename is {fname}\")\n", + "\n", + "if op.isfile(op.join(path_to_saveperm, fname)):\n", + " print(\"Loading existing permutations...\")\n", + " perm_data = dload.load(op.join(path_to_saveperm, fname))\n", + " all_shuffled = perm_data[\"all_shuffled\"]\n", + " all_ratios_sym = perm_data[\"all_ratios_sym\"]\n", + "else:\n", + " print(\"Computing new permutations...\")\n", + " all_shuffled = dgsp.shuffle_edges_sym(graph, perm_prop=perm_prop, n_shuffle=n_shuffle)\n", + "\n", + " for s_i, shuffled in enumerate(all_shuffled):\n", + " shuffled_asym = np.divide(shuffled, (shuffled + shuffled.T),\n", + " where=(shuffled + shuffled.T) > 0,\n", + " out=np.zeros_like(shuffled))\n", + " shuffled_ratio = dgsp.get_asym_ratio(shuffled_asym[graph > 0], bicom_masks=bicoms_masks)\n", + " all_ratios_sym[s_i] = shuffled_ratio\n", + "\n", + " all_ratios_sym = np.nan_to_num(all_ratios_sym, nan=0.5)\n", + "\n", + " if save_perm:\n", + " dload.save(op.join(path_to_saveperm, fname),\n", + " {\"all_shuffled\": all_shuffled,\n", + " \"all_ratios_sym\": all_ratios_sym})" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "75103e7b", + "metadata": {}, + "outputs": [], + "source": [ + "bw_adjust = 0.1\n", + "\n", + "perm_dist = all_ratios_sym.flatten()\n", + "\n", + "print(f\"Max p-val: {1 / (1 + n_shuffle)}\")\n", + "\n", + "all_ps = np.ones_like(true_ratio)\n", + "for i, t in enumerate(true_ratio):\n", + " biggersum = np.sum(np.abs(all_ratios_sym[:, i] - all_ratios_sym[:, i].mean()) >= abs(t - all_ratios_sym[:, i].mean()))\n", + " p_two = (1 + biggersum) / (1 + n_shuffle)\n", + " all_ps[i] = p_two\n", + "\n", + "sig_df = pd.DataFrame({\n", + " \"Bicomm_ID\": np.arange(1, len(true_ratio)+1),\n", + " \"directionality\": true_ratio,\n", + " \"abs_dir\": np.abs(true_ratio - 0.5),\n", + " \"p_value\": all_ps,\n", + " \"p_corr\": all_ps * len(all_ps)\n", + " })\n", + "\n", + "sig_df[\"is_sig\"] = sig_df[\"p_corr\"] < 0.05\n", + "sig_df.sort_values([\"is_sig\", \"abs_dir\"], ascending=[False, False], inplace=True)\n", + "sig_df.head()\n", + "\n", + "sort_by_p = sig_df[\"Bicomm_ID\"].values - 1\n", + "\n", + "sig_df" + ] + }, + { + "cell_type": "markdown", + "id": "9625ee7d", + "metadata": {}, + "source": [ + "### Figure" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cd942a65", + "metadata": {}, + "outputs": [], + "source": [ + "sort_by_p = sig_df[\"Bicomm_ID\"].values - 1\n", + "rand_x = np.random.uniform(-0.3, 0.3, n_shuffle)\n", + "cluster_cmap = cmaps[\"extended_ncar\"].resampled(edge_clusters_mat.max()+1)\n", + "\n", + "if edge_clusters_mat.max() < 15:\n", + " fig, all_axes = plt.subplots(nrows=2, figsize=(20, 10), gridspec_kw={\"height_ratios\": [1, 1.4], \"hspace\": 0.1})\n", + "else:\n", + " fig, all_axes = plt.subplots(nrows=2, figsize=(20, 14), gridspec_kw={\"height_ratios\": [1, 1.8], \"hspace\": 0.1})\n", + "\n", + "axpoly = fig.add_axes([0.1, 0.1, 0.8, 0.8], facecolor='none')\n", + "\n", + "all_axes[0].axis(\"off\")\n", + "gs = GridSpecFromSubplotSpec(1, 2, subplot_spec=all_axes[0].get_subplotspec(),\n", + " wspace=0.1, width_ratios=[1, 1.1])\n", + "axes = [fig.add_subplot(gs[0], facecolor=\"none\"), fig.add_subplot(gs[1], facecolor=\"none\")]\n", + "\n", + "maxval = np.max([all_ratios_sym.max(), true_ratio.max()*1.02])\n", + "\n", + "sig_mat = np.zeros_like(edge_clusters_mat)\n", + "non_sig_mat = np.zeros_like(edge_clusters_mat)\n", + "\n", + "for i, sort_i in enumerate(sort_by_p):\n", + " \n", + " axes[1].scatter(rand_x + i, all_ratios_sym[:, sort_i], s=10,\n", + " color=\"gray\", alpha=0.1, edgecolors=\"none\")\n", + " \n", + " col = cluster_cmap(sort_i + 1)\n", + " axes[1].bar(i, true_ratio[sort_i]-0.5, bottom=0.5, zorder=1,\n", + " lw=2, edgecolor=\"none\", color=col, alpha=0.5)\n", + " axes[1].bar(i, true_ratio[sort_i]-0.5, bottom=0.5, zorder=1,\n", + " lw=2, edgecolor=col, color=\"none\")\n", + " \n", + " if sig_df.loc[sig_df[\"Bicomm_ID\"] == (sort_i + 1), \"is_sig\"].values:\n", + " axes[1].scatter(i, maxval, marker=\"$*$\", color=\"k\")\n", + "\n", + " sig_mat[edge_clusters_mat == (sort_i + 1)] = sort_i + 1\n", + " else:\n", + " non_sig_mat[edge_clusters_mat == (sort_i + 1)] = sort_i + 1\n", + "\n", + "axes[1].axhline(0.5, lw=2, color=\"k\")\n", + "axes[1].set_ylabel(\"Bicommunity Asymmetry\", fontsize=16)\n", + "axes[1].spines[[\"top\", \"right\", \"bottom\"]].set_visible(False)\n", + "axes[1].spines[:].set_linewidth(2)\n", + "axes[1].tick_params(which='both', bottom=False, labelbottom=False, width=2, labelsize=14)\n", + "\n", + "if gamma == 3:\n", + " axes[1].set_ylim(0.281, 0.699)\n", + "else:\n", + " if edge_clusters_mat.max() < 15:\n", + " maxval = np.max(np.abs(true_ratio - 0.5)) * 2\n", + " else:\n", + " maxval = np.max(np.abs(true_ratio - 0.5)) * 1.2\n", + " axes[1].set_ylim(0.5 - maxval, 0.5 + maxval)\n", + "\n", + "axes[0].axis(\"off\")\n", + "gs = GridSpecFromSubplotSpec(3, 2, subplot_spec=axes[0].get_subplotspec(),\n", + " wspace=0, width_ratios=[1, 1], \n", + " hspace=0, height_ratios=[0.05, 1, 0.2])\n", + "ax_matrices = [fig.add_subplot(gs[1, i]) for i in range(2)]\n", + "\n", + "ax_matrices[0].set_title(\"Significantly Directed\", fontsize=16, y=-0.12)\n", + "ax_matrices[1].set_title(\"Bidirectional\", fontsize=16, y=-0.12)\n", + "\n", + "ax_matrices[0].imshow(sig_mat[order_by_lobe][:, order_by_lobe], cmap=cluster_cmap,\n", + " vmin=0, vmax=edge_clusters_mat.max(), interpolation=\"none\")\n", + "plot.plot_lobe_lines(ax_matrices[0], lobe_sizes, lobe_labels, no_insula=True, x_hemi=True) #, y_only=True\n", + "\n", + "ax_matrices[1].imshow(non_sig_mat[order_by_lobe][:, order_by_lobe], cmap=cluster_cmap,\n", + " vmin=0, vmax=edge_clusters_mat.max(), interpolation=\"none\")\n", + "plot.plot_lobe_lines(ax_matrices[1], lobe_sizes, lobe_labels, no_insula=True, x_only=True, x_hemi=True)\n", + "ax_matrices[1].set_yticks([])\n", + "\n", + "all_axes[1].axis(\"off\")\n", + "\n", + "if edge_clusters_mat.max() < 15:\n", + " n_bicom_to_show = 4\n", + "else:\n", + " n_bicom_to_show = 8\n", + "\n", + "if n_bicom_to_show > 4:\n", + " gs = GridSpecFromSubplotSpec(4, n_bicom_to_show, subplot_spec=all_axes[1].get_subplotspec(), hspace=0, wspace=0)\n", + " axes_tract = [fig.add_subplot(gs[0, i], facecolor=\"none\") for i in range(n_bicom_to_show//2)]\n", + " axes_tract2 = [fig.add_subplot(gs[1, i], facecolor=\"none\") for i in range(n_bicom_to_show//2)]\n", + " axes_tract += [fig.add_subplot(gs[2, i], facecolor=\"none\") for i in range(n_bicom_to_show//2)]\n", + " axes_tract2 += [fig.add_subplot(gs[3, i], facecolor=\"none\") for i in range(n_bicom_to_show//2)]\n", + " \n", + " axes_tract += [fig.add_subplot(gs[0, n_bicom_to_show//2 + i], facecolor=\"none\") for i in range(n_bicom_to_show//2)]\n", + " axes_tract2 += [fig.add_subplot(gs[1, n_bicom_to_show//2 + i], facecolor=\"none\") for i in range(n_bicom_to_show//2)]\n", + " axes_tract += [fig.add_subplot(gs[2, n_bicom_to_show//2 + i], facecolor=\"none\") for i in range(n_bicom_to_show//2)]\n", + " axes_tract2 += [fig.add_subplot(gs[3, n_bicom_to_show//2 + i], facecolor=\"none\") for i in range(n_bicom_to_show//2)]\n", + "else:\n", + " gs = GridSpecFromSubplotSpec(2, n_bicom_to_show*2, subplot_spec=all_axes[1].get_subplotspec(), hspace=0, wspace=0)\n", + " axes_tract = [fig.add_subplot(gs[0, i], facecolor=\"none\") for i in range(n_bicom_to_show*2)]\n", + " axes_tract2 = [fig.add_subplot(gs[1, i], facecolor=\"none\") for i in range(n_bicom_to_show*2)]\n", + "\n", + "# Tract plot parameters\n", + "view = \"custom2\"\n", + "n_centroids = 5\n", + "linewidth = 0.3\n", + "slines_alpha = 0.99\n", + "brain_opacity = 0.1\n", + "overlay_slines = False\n", + "\n", + "n_axes = len(axes_tract)\n", + "for i, ax in enumerate(axes_tract[:n_bicom_to_show]):\n", + " bic_id = sig_df['Bicomm_ID'].iloc[i]\n", + " p_plot = sig_df['p_corr'].iloc[i]\n", + " asym = sig_df['directionality'].iloc[i]\n", + " mat_cmap = LinearSegmentedColormap.from_list(\"bimask_cmap\", [\"k\", \"w\", cluster_cmap(bic_id)], N=3)\n", + " bimask = 2*(edge_clusters_mat == sig_df[\"Bicomm_ID\"].iloc[i]).astype(int)\n", + " bimask += (edge_clusters_mat > 0)\n", + "\n", + " e_clust_mask = np.zeros_like(edge_clusters_mat)\n", + " if asym > 0.5:\n", + " e_clust_mask[edge_clusters_mat == bic_id] = bic_id\n", + " else:\n", + " e_clust_mask[edge_clusters_mat.T == bic_id] = bic_id\n", + "\n", + " if not fast:\n", + " plot.plot_bicom_tracts(\n", + " bic_id,\n", + " e_clust_mask,\n", + " labels,\n", + " scale,\n", + " cmap=cmaps[\"div_rb\"],\n", + " view=\"tra\",\n", + " n_centroids=n_centroids,\n", + " linewidth=linewidth,\n", + " slines_alpha=slines_alpha,\n", + " brain_opacity=brain_opacity,\n", + " overlay_slines=overlay_slines,\n", + " axes=ax,\n", + " upsample=upsample,\n", + " fig=fig)\n", + " \n", + " ax.scatter([150], [180], marker=\"s\", s=200, color=cluster_cmap(bic_id), edgecolor=\"k\", lw=2)\n", + "\n", + " plot.plot_bicom_tracts(\n", + " bic_id,\n", + " e_clust_mask,\n", + " labels,\n", + " scale,\n", + " cmap=cmaps[\"div_rb\"],\n", + " view=\"right\",\n", + " n_centroids=n_centroids,\n", + " linewidth=linewidth,\n", + " slines_alpha=slines_alpha,\n", + " brain_opacity=brain_opacity,\n", + " overlay_slines=overlay_slines,\n", + " axes=axes_tract2[i],\n", + " upsample=upsample,\n", + " fig=fig)\n", + "\n", + "for i, ax in enumerate(axes_tract[n_bicom_to_show:]):\n", + " bic_id = sig_df['Bicomm_ID'].iloc[-n_bicom_to_show + i]\n", + " p_plot = sig_df['p_corr'].iloc[-n_bicom_to_show + i]\n", + " asym = sig_df['directionality'].iloc[-n_bicom_to_show + i]\n", + " mat_cmap = LinearSegmentedColormap.from_list(\"bimask_cmap\", [\"k\", \"w\", cluster_cmap(bic_id)], N=3)\n", + "\n", + " e_clust_mask = np.zeros_like(edge_clusters_mat)\n", + " e_clust_mask[edge_clusters_mat == bic_id] = bic_id\n", + " e_clust_mask[edge_clusters_mat.T == bic_id] = bic_id\n", + "\n", + " if not fast:\n", + " plot.plot_bicom_tracts(\n", + " bic_id,\n", + " e_clust_mask,\n", + " labels,\n", + " scale,\n", + " cmap=cmaps[\"div_rb\"],\n", + " view=\"tra\",\n", + " n_centroids=n_centroids,\n", + " linewidth=linewidth,\n", + " slines_alpha=1,\n", + " brain_opacity=brain_opacity,\n", + " overlay_slines=overlay_slines,\n", + " axes=ax,\n", + " upsample=upsample,\n", + " bidir_col=(0.6, 0.6, 0.6, 1),\n", + " fig=fig)\n", + " \n", + " ax.scatter([150], [180], s=200, color=cluster_cmap(bic_id), edgecolor=\"none\")\n", + "\n", + " plot.plot_bicom_tracts(\n", + " bic_id,\n", + " e_clust_mask,\n", + " labels,\n", + " scale,\n", + " cmap=cmaps[\"div_rb\"],\n", + " view=\"right\",\n", + " n_centroids=n_centroids,\n", + " linewidth=linewidth,\n", + " slines_alpha=1,\n", + " brain_opacity=brain_opacity,\n", + " overlay_slines=overlay_slines,\n", + " axes=axes_tract2[-n_bicom_to_show + i],\n", + " upsample=upsample,\n", + " bidir_col=(0.6, 0.6, 0.6, 1),\n", + " fig=fig)\n", + "\n", + "signif_start = 0.539\n", + "bidir_start = 0.978\n", + "\n", + "if edge_clusters_mat.max() < 15:\n", + " bicomspace = 0.027 * (1 + n_bicom_to_show)\n", + " axpoly.fill([bidir_start, bidir_start - bicomspace, bidir_start - bicomspace, bidir_start],\n", + " [0.737, 0.737, 0.74, 0.74], color=\"k\", edgecolor=\"none\")\n", + " axpoly.text(signif_start + bicomspace/2, 0.65, \"C\", fontweight=\"bold\", fontsize=14, ha=\"center\")\n", + " axpoly.text(bidir_start - bicomspace/2, 0.71, \"D\", fontweight=\"bold\", fontsize=14, ha=\"center\")\n", + "else:\n", + " bicomspace = 0.011 * (1 + n_bicom_to_show)\n", + " axpoly.fill([bidir_start, bidir_start - bicomspace, bidir_start - bicomspace, bidir_start],\n", + " [0.767, 0.767, 0.77, 0.77], color=\"k\", edgecolor=\"none\")\n", + " axpoly.text(signif_start + bicomspace/2, 0.66, \"C\", fontweight=\"bold\", fontsize=14, ha=\"center\")\n", + " axpoly.text(bidir_start - bicomspace/2, 0.75, \"D\", fontweight=\"bold\", fontsize=14, ha=\"center\")\n", + "\n", + "axpoly.fill([signif_start, signif_start + bicomspace, signif_start + bicomspace, signif_start],\n", + " [0.677, 0.677, 0.68, 0.68], color=\"k\", edgecolor=\"none\")\n", + "\n", + "axpoly.set_xlim(0, 1)\n", + "axpoly.set_ylim(0, 1)\n", + "axpoly.axis(\"off\")\n", + "\n", + "axpoly.text(0.035, 0.97, \"A.\", fontsize=18, fontweight='bold', ha='left', va='bottom', transform=axpoly.transAxes)\n", + "axpoly.text(0.47, 0.97, \"B.\", fontsize=18, fontweight='bold', ha='left', va='bottom', transform=axpoly.transAxes)\n", + "\n", + "if edge_clusters_mat.max() < 15:\n", + " cbar = plot.draw_cbar(\n", + " fig, cmap=cmaps[\"div_rb\"], ax_pos=[0.115, 0.17, 0.01, 0.3],\n", + " ticks=[0, 10], labels=[\"Receiving\", \"Sending\"], fontsize=14,\n", + " orientation=\"vertical\")\n", + " cbar.ax.tick_params(right=False, labelright=False, left=True, labelleft=True, rotation=90)\n", + " cbar.ax.set_yticks([0, 10], labels=[\"Receiving\", \"Sending\"], ha=\"right\", va=\"center\")\n", + " \n", + " axpoly.text(0.25, 0.54, \"Significantly Directed\", fontsize=20, ha='center', va='bottom', color='k')\n", + " axpoly.text(0.75, 0.54, \"Bidirectional\", fontsize=20, ha='center', va='bottom', color='k')\n", + " axpoly.text(0.035, 0.542, \"C.\", fontsize=18, fontweight='bold', ha='left', va='bottom', transform=axpoly.transAxes)\n", + " axpoly.text(0.52, 0.542, \"D.\", fontsize=18, fontweight='bold', ha='left', va='bottom', transform=axpoly.transAxes)\n", + "else:\n", + " cbar = plot.draw_cbar(\n", + " fig, cmap=cmaps[\"div_rb\"], ax_pos=[0.115, 0.17, 0.01, 0.38],\n", + " ticks=[0, 10], labels=[\"Receiving\", \"Sending\"], fontsize=14,\n", + " orientation=\"vertical\")\n", + " cbar.ax.tick_params(right=False, labelright=False, left=True, labelleft=True, rotation=90)\n", + " cbar.ax.set_yticks([0, 10], labels=[\"Receiving\", \"Sending\"], ha=\"right\", va=\"center\")\n", + "\n", + " axpoly.text(0.25, 0.611, \"Significantly Directed\", fontsize=20, ha='center', va='bottom', color='k')\n", + " axpoly.text(0.75, 0.611, \"Bidirectional\", fontsize=20, ha='center', va='bottom', color='k')\n", + " axpoly.text(0.035, 0.615, \"C.\", fontsize=18, fontweight='bold', ha='left', va='bottom', transform=axpoly.transAxes)\n", + " axpoly.text(0.52, 0.615, \"D.\", fontsize=18, fontweight='bold', ha='left', va='bottom', transform=axpoly.transAxes)\n", + "\n", + "if not fast:\n", + " upsample_suffix = f\"_upsample{upsample}\" if upsample is not None else \"\"\n", + " fig.savefig(op.join(path_to_figures, f\"02-Directionality{upsample_suffix}_K{edge_clusters_mat.max()}-show{n_bicom_to_show}.png\"),\n", + " dpi=600, bbox_inches='tight')\n", + " fig.savefig(op.join(path_to_figures, f\"02-Directionality{upsample_suffix}_K{edge_clusters_mat.max()}-show{n_bicom_to_show}.pdf\"),\n", + " dpi=600, bbox_inches='tight', format=\"pdf\")" + ] + }, + { + "cell_type": "markdown", + "id": "c5b3f739", + "metadata": {}, + "source": [ + "## Network Characterization" + ] + }, + { + "cell_type": "markdown", + "id": "d960f83c", + "metadata": {}, + "source": [ + "### Preparation Code" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "18910f1e", + "metadata": {}, + "outputs": [], + "source": [ + "n_per_block = 12\n", + "\n", + "my_graph = np.random.normal(loc=1, scale=1, size=(n_per_block*2, n_per_block*2))\n", + "rand_thresh = 1\n", + "my_graph = my_graph * (my_graph > rand_thresh)\n", + "\n", + "my_sends = np.array(\n", + " [\n", + " np.concatenate([np.ones(n_per_block), np.zeros(n_per_block)]),\n", + " np.concatenate([np.ones(n_per_block), np.zeros(n_per_block)]),\n", + " np.concatenate([np.ones(n_per_block+n_per_block//2), np.zeros(n_per_block-n_per_block//2)]),\n", + " np.concatenate([np.ones(n_per_block), np.zeros(n_per_block)]),\n", + " np.concatenate([np.zeros(n_per_block-n_per_block//4), np.ones(n_per_block-n_per_block//2), np.zeros(n_per_block-n_per_block//4)]),\n", + " np.concatenate([np.ones(n_per_block), np.zeros(n_per_block)]),\n", + " ]\n", + ")\n", + "\n", + "my_recs = np.array(\n", + " [\n", + " np.concatenate([np.ones(n_per_block), np.zeros(n_per_block)]),\n", + " np.concatenate([np.ones(n_per_block+n_per_block//2), np.zeros(n_per_block-n_per_block//2)]),\n", + " np.concatenate([np.ones(n_per_block), np.zeros(n_per_block)]),\n", + " np.concatenate([np.zeros(n_per_block-n_per_block//4), np.ones(n_per_block-n_per_block//2), np.zeros(n_per_block-n_per_block//4)]),\n", + " np.concatenate([np.ones(n_per_block), np.zeros(n_per_block)]),\n", + " np.concatenate([np.zeros(n_per_block), np.ones(n_per_block)]),\n", + " ]\n", + ")\n", + "\n", + "\n", + "ss_sr_toy = np.zeros(len(my_sends))\n", + "rr_sr_toy = np.zeros(len(my_sends))\n", + "\n", + "all_sample_graphs = []\n", + "for i in range(len(my_sends)):\n", + " bic_id = i\n", + " mymat = edge_clusters_mat.copy()\n", + " mymat[mymat != (bic_id + 1)] = 0\n", + "\n", + " ss = np.outer(my_sends[bic_id], my_sends[bic_id])\n", + " rr = np.outer(my_recs[bic_id], my_recs[bic_id])\n", + "\n", + " sr = np.outer(my_sends[bic_id], my_recs[bic_id]) * my_graph\n", + " all_sample_graphs.append(sr)\n", + "\n", + " ss_sr_toy[i] = np.sum(ss * sr)/np.sum(ss)\n", + " rr_sr_toy[i] = np.sum(rr * sr)/np.sum(rr)\n", + "\n", + "fig, axes = plt.subplots(nrows=2, figsize=(15, 8), gridspec_kw={\"height_ratios\": [1, 2], \"hspace\":0})\n", + "\n", + "for ax in axes:\n", + " ax.axis(\"off\")\n", + "\n", + "gs = GridSpecFromSubplotSpec(1, len(my_sends), subplot_spec=axes[0].get_subplotspec(), wspace=0.1)\n", + "ax_mat = [fig.add_subplot(gs[i]) for i in range(len(my_sends))]\n", + "\n", + "gs = GridSpecFromSubplotSpec(1, 2, subplot_spec=axes[1].get_subplotspec(), wspace=0.1, width_ratios=[1.8, 1])\n", + "ax_plot = fig.add_subplot(gs[0])\n", + "ax_scat = fig.add_subplot(gs[1])\n", + "\n", + "ax_plot.plot(np.arange(len(my_sends))+1, ss_sr_toy, label=\"Send-SR overlap\", lw=2, color=\"tab:red\", alpha=0.8)\n", + "ax_plot.plot(np.arange(len(my_sends))+1, rr_sr_toy, label=\"Rec-SR overlap\", lw=2, color=\"tab:blue\", alpha=0.8)\n", + "ax_plot.plot(np.arange(len(my_sends))+1, (ss_sr_toy+rr_sr_toy)/2, label=\"Mean\", lw=4, color=\"gray\", alpha=0.8, zorder=0)\n", + "\n", + "ax_plot.legend(fontsize=14)\n", + "\n", + "mean_assort = (ss_sr_toy + rr_sr_toy)/2\n", + "ax_scat.scatter(mean_assort, rr_sr_toy - ss_sr_toy, s=300, edgecolor=\"k\", c=np.arange(len(ss_sr_toy))+1,\n", + " cmap=cluster_cmap, vmin=0, vmax=len(ss_sr_toy)+1, lw=2)\n", + "maxval = np.max([ss_sr_toy.max(), rr_sr_toy.max()])\n", + "\n", + "for i in range(len(my_sends)):\n", + " ax_scat.text(mean_assort[i] + mean_assort.max()*0, rr_sr_toy[i] - ss_sr_toy[i], f\"{i+1:d}\", ha=\"center\", va=\"center\", fontsize=14, fontweight='bold')\n", + "for i, ax in enumerate(ax_mat):\n", + " mymat = np.zeros_like(my_graph)\n", + " mymat = (my_graph > rand_thresh) * np.outer(my_sends[i] > 0, my_recs[i] > 0).astype(float) * (i+1)\n", + "\n", + " sort_by_sendrec = np.flip(np.argsort(my_sends[i]))\n", + " ax.imshow(mymat, cmap=cluster_cmap, vmin=0, vmax=len(my_sends)+1, interpolation=\"none\")\n", + " ax.set_title(f\"#{i+1}\", fontsize=16)\n", + " ax.axis(\"off\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bf298957", + "metadata": {}, + "outputs": [], + "source": [ + "send, rec = all_send_rec[bicom_id]\n", + "bimod_idx = dgsp.bimod_index_nodes(graph, send, rec)\n", + "\n", + "send = send / send.sum(axis=1, keepdims=True)\n", + "rec = rec / rec.sum(axis=1, keepdims=True)\n", + "\n", + "ss_sr = np.zeros(len(send))\n", + "rr_sr = np.zeros(len(send))\n", + "\n", + "for i in range(len(send)):\n", + " ss = np.outer(send[i], send[i])\n", + " rr = np.outer(rec[i], rec[i])\n", + " \n", + " sr = graph.copy()\n", + " sr[edge_clusters_mat != (i + 1)] = 0\n", + "\n", + " ss_sr[i] = np.sum(ss * sr)/np.sum(ss)\n", + " rr_sr[i] = np.sum(rr * sr)/np.sum(rr)\n", + "\n", + "assortativity = (ss_sr + rr_sr)/2\n", + "sendrec = (rr_sr - ss_sr)\n", + "\n", + "sig_df[\"assortativity\"] = assortativity[sort_by_p]\n", + "sig_df[\"sendrec\"] = sendrec[sort_by_p]\n", + "sig_df[\"bimodality_index\"] = bimod_idx[sort_by_p]\n", + "\n", + "is_assort = sig_df[\"assortativity\"] >= 1e-1" + ] + }, + { + "cell_type": "markdown", + "id": "94af4fef", + "metadata": {}, + "source": [ + "### Figure" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "089d54c4", + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.patches import FancyArrowPatch\n", + "\n", + "fig, main_ax = plt.subplots(figsize=(30, 16))\n", + "lobe_summary = False\n", + "\n", + "all_a_pos = [\n", + " [[-0.1, 0], [0.5, 0]],\n", + " [[0.1, 0], [-0.5, 0]],\n", + " [[0, -0.1], [0, 0.95]],\n", + " [[0, 0.1], [0, -0.9]],\n", + "]\n", + "for a_pos in all_a_pos:\n", + " arrow = FancyArrowPatch(\n", + " a_pos[0],\n", + " a_pos[1],\n", + " mutation_scale=40,\n", + " facecolor=\"k\",\n", + " edgecolor=\"none\",\n", + " arrowstyle=\"simple\",\n", + " )\n", + " main_ax.add_patch(arrow)\n", + "\n", + "clust_cmap_net = cluster_cmap.resampled(edge_clusters_mat.max()+1)\n", + "\n", + "main_ax.text(0.32, 0.02, \"Assortative\", fontsize=22, ha='left', va='bottom', color='k')\n", + "main_ax.text(-0.32, 0.02, \"Disassortative\", fontsize=22, ha='right', va='bottom', color='k')\n", + "main_ax.text(0, 0.95, \"Sending\", fontsize=22, ha='center', va='bottom', color='k')\n", + "main_ax.text(0, -0.9, \"Receiving\", fontsize=22, ha='center', va='top', color='k')\n", + "\n", + "main_ax.set_xlim(-1, 1)\n", + "main_ax.set_ylim(-1.1, 1.1)\n", + "main_ax.axis(\"off\")\n", + "\n", + "gs = GridSpecFromSubplotSpec(1, 3, subplot_spec=main_ax.get_subplotspec(), wspace=0.1, width_ratios=[2, 1.5, 2])\n", + "axes = [fig.add_subplot(gs[i]) for i in range(3)]\n", + "\n", + "for ax in axes:\n", + " ax.axis(\"off\")\n", + "gs = GridSpecFromSubplotSpec(4, 2, subplot_spec=axes[1].get_subplotspec(), hspace=0.1, wspace=0.2)\n", + "\n", + "gs_disassort = GridSpecFromSubplotSpec(5, 3, subplot_spec=axes[0].get_subplotspec(),\n", + " hspace=0.02, wspace=0.02, height_ratios=[1, 1, 0.2, 1, 1])\n", + "gs_assort = GridSpecFromSubplotSpec(5, 3, subplot_spec=axes[2].get_subplotspec(),\n", + " hspace=0.02, wspace=0.02, height_ratios=[1, 1, 0.2, 1, 1])\n", + "axes_bicom = [fig.add_subplot(gs_disassort[i], facecolor=\"none\") for i in range(15) if i//3 != 2]\n", + "axes_bicom += [fig.add_subplot(gs_assort[i], facecolor=\"none\") for i in range(15) if i//3 != 2]\n", + "\n", + "send, rec = all_send_rec[bicom_id]\n", + "assortativity = np.diag(send @ rec.T)\n", + "bimod_idx = dgsp.bimod_index_nodes(graph, send, rec)\n", + "\n", + "if gamma == 3:\n", + " assort_bicom = [11, 13, 8, 21, 26, 1, 16, 24, 25, 5, 17, 7]\n", + " disassort_bicom = [6, 12, 27, 10, 9, 0, 20, 22, 23, 15, 14, 4]\n", + "else:\n", + " assort_bicom = [1, 18, 9, 1, 1, 1, 5, 15, 6, 13, 14, 14]\n", + " disassort_bicom = [11, 12, 10, 8, 16, 0, 3, 16, 4, 17, 7]\n", + "\n", + " assort_bicom = [19, 13, 3, 14, 34, 27, 6, 33, 5, 12, 29, 25]\n", + " disassort_bicom = [15, 8, 20, 17, 4, 28, 24, 10, 11, 16, 23, 1]\n", + "\n", + "lobe_vec = lobe_df.lobe_id_reorder.values\n", + "one_hot_lobe = np.array([(lobe_vec == i).astype(float) for i in range(lobe_vec.max())])\n", + "one_hot_lobe /= one_hot_lobe.sum(axis=1, keepdims=True)\n", + "\n", + "assort_mask = [False]*len(disassort_bicom[:12]) + [True]*len(assort_bicom[:12])\n", + "selected_bicoms = disassort_bicom[:12] + assort_bicom[:12]\n", + "\n", + "# If needed to adjust for 0-indexing\n", + "selected_bicoms = [x + 1 for x in selected_bicoms]\n", + "\n", + "i_assort = 0\n", + "i_disassort = 0\n", + "for i, bic_id in enumerate(selected_bicoms):\n", + " if assort_mask[i]:\n", + " ax = axes_bicom[i_assort+12]\n", + " i_assort += 1\n", + " else:\n", + " ax = axes_bicom[i_disassort]\n", + " i_disassort += 1\n", + "\n", + " e_clust_mask = np.zeros_like(edge_clusters_mat)\n", + " e_clust_mask[edge_clusters_mat == bic_id] = bic_id\n", + "\n", + " if lobe_summary:\n", + " lobe_repr = one_hot_lobe @ (e_clust_mask > 0).astype(float) @ one_hot_lobe.T\n", + "\n", + " indiv_cmap = LinearSegmentedColormap.from_list(\"indiv_cmap\", [\"k\", clust_cmap_net(bic_id)], N=100)\n", + " ax.imshow(lobe_repr, cmap=indiv_cmap, interpolation=\"none\")\n", + " scatter_pos = (10, 1)\n", + " else:\n", + " ax.imshow(e_clust_mask[order_by_lobe][:, order_by_lobe], cmap=clust_cmap_net, vmin=0,\n", + " vmax=edge_clusters_mat.max(), interpolation=\"none\")\n", + " scatter_pos = (120, 10)\n", + " \n", + " if sig_df.loc[bic_id-1, \"is_sig\"]:\n", + " ax.scatter(scatter_pos[0], scatter_pos[1], s=120, color=\"w\", marker=\"$*$\", zorder=2)\n", + "\n", + " if assortativity[bic_id-1] == 0:\n", + " ax.scatter(scatter_pos[1], scatter_pos[1], s=80, color=\"w\", marker=\"D\", zorder=2)\n", + " \n", + "for ax in axes_bicom:\n", + " ax.axis(\"off\")\n", + "\n", + "ax_scatter = fig.add_subplot(gs[1:3, 0:2], facecolor=\"none\")\n", + "\n", + "scatter_size = 300 + 2*bimod_idx\n", + "sig_mask = sig_df.sort_values(\"Bicomm_ID\").is_sig.values\n", + "\n", + "assort_plot = assortativity.copy()\n", + "min_assort = 1e-2\n", + "np.random.seed(17)\n", + "\n", + "mean_assort = (ss_sr + rr_sr)/2\n", + "assort_plot = mean_assort\n", + "\n", + "ax_scatter.scatter(assort_plot[~sig_mask], (rr_sr - ss_sr)[~sig_mask], s=scatter_size[~sig_mask],\n", + " c=np.arange(len(sig_mask))[~sig_mask]+1, cmap=clust_cmap_net, edgecolors=\"k\", lw=2,\n", + " vmin=0, vmax=len(sig_mask))\n", + "ax_scatter.scatter(assort_plot[sig_mask], (rr_sr - ss_sr)[sig_mask], s=scatter_size[sig_mask], marker=\"s\",\n", + " c=np.arange(len(sig_mask))[sig_mask]+1, cmap=clust_cmap_net, edgecolors=\"k\", lw=2,\n", + " vmin=0, vmax=len(sig_mask))\n", + "\n", + "ax_scatter.scatter(assort_plot[sig_mask], (rr_sr - ss_sr)[sig_mask], s=scatter_size[sig_mask]/3, marker=\"$*$\",\n", + " color=\"w\", edgecolors=\"w\")\n", + "\n", + "ax_scatter.axhline(0, color=\"k\", lw=2, zorder=0)\n", + "ax_scatter.axvline(0.1, color=\"k\", lw=2, zorder=0)\n", + "\n", + "limit_ratio = 1.2\n", + "ax_scatter.set_xlim(-mean_assort.max()*limit_ratio + 0.2, mean_assort.max()*limit_ratio)\n", + "ax_scatter.set_ylim(-np.abs(rr_sr - ss_sr).max()*limit_ratio, np.abs(rr_sr - ss_sr).max()*limit_ratio)\n", + "\n", + "ax_in = ax_scatter.inset_axes([0.05, 0.7, 0.3, 0.3], xlim=(-1e-3, 1e-3), ylim=(-1e-3, 1e-3))\n", + "\n", + "zero_mask = mean_assort < 1e-3\n", + "np.random.seed(7)\n", + "zero_x = np.random.uniform(-8e-4, 8e-4, zero_mask.sum())\n", + "zero_y = np.random.uniform(-8e-4, 8e-4, zero_mask.sum())\n", + "\n", + "ax_in.scatter(zero_x, zero_y, s=scatter_size[zero_mask], marker=\"D\",\n", + " c=np.arange(len(sig_mask))[zero_mask]+1, cmap=clust_cmap_net, edgecolors=\"k\", lw=2,\n", + " vmin=0, vmax=len(sig_mask), alpha=(sig_mask[zero_mask] == False).astype(float))\n", + "\n", + "ax_in.scatter(zero_x, zero_y, s=scatter_size[zero_mask], marker=\"D\",\n", + " c=np.arange(len(sig_mask))[zero_mask]+1, cmap=clust_cmap_net, edgecolors=\"k\", lw=2,\n", + " vmin=0, vmax=len(sig_mask), alpha=sig_mask[zero_mask].astype(float))\n", + "\n", + "ax_in.scatter(zero_x, zero_y, s=scatter_size[zero_mask]/3, marker=\"$*$\",\n", + " color=\"w\", edgecolors=\"w\", alpha=sig_mask[zero_mask].astype(float))\n", + "\n", + "ax_in.set_xticks([])\n", + "ax_in.set_yticks([])\n", + "ax_in.set_title(\"Assortativity = 0\", fontsize=16)\n", + "ax_in.spines[:].set_linewidth(2)\n", + "ax_scatter.indicate_inset_zoom(ax_in, edgecolor=\"black\", lw=2, zorder=0)\n", + "ax_scatter.axis(\"off\")\n", + "\n", + "toy_pos = [\n", + " [0.56, 0.46, 0.1, 0.08],\n", + " [0.53, 0.2, 0.1, 0.08],\n", + " [0.53, 0.71, 0.1, 0.08],\n", + " [0.39, 0.71, 0.1, 0.08],\n", + " [0.39, 0.2, 0.1, 0.08],\n", + " [0.368, 0.46, 0.1, 0.08],\n", + "]\n", + "toy_titles = [\n", + " \"\",\n", + " \"Receiving\\nCore-Periphery\",\n", + " \"Sending\\nCore-Periphery\",\n", + " \"Disassortative\\nFocusing\",\n", + " \"Disassortative\\nBroadcasting\",\n", + " \"\",\n", + "]\n", + "for toy_i, (toy_mat, pos) in enumerate(zip(all_sample_graphs, toy_pos)):\n", + " ax_toy = fig.add_subplot(pos, facecolor=\"none\")\n", + " ax_toy.imshow((toy_mat > 0).astype(int), cmap=cmaps[\"div_rb\"],\n", + " interpolation=\"none\", vmax=1.3)\n", + " ax_toy.set_title(toy_titles[toy_i], fontsize=18)\n", + " ax_toy.axis(\"off\")\n", + "\n", + "l1_pos = -0.25\n", + "main_ax.scatter([l1_pos-0.02], [-1.04], marker=\"D\", s=300, color=\"gray\", edgecolor=\"k\", lw=1)\n", + "main_ax.text(l1_pos, -1.045, \"Purely Disassortative\", fontsize=16, ha=\"left\", va=\"center\")\n", + "\n", + "l2_pos = 0.08\n", + "main_ax.scatter([l2_pos-0.02], [-1.04], marker=\"s\", s=400, color=\"gray\", edgecolor=\"k\", lw=2)\n", + "main_ax.scatter([l2_pos-0.02], [-1.04], marker=\"$*$\", s=100, color=\"w\")\n", + "main_ax.text(l2_pos, -1.045, \"Significantly Directed\", fontsize=16, ha=\"left\", va=\"center\")\n", + "\n", + "# lobe_sum_suffix = \"_ByLobe\" if lobe_summary else \"\"\n", + "# fig.savefig(op.join(path_to_figures, f\"03-Showcase-MATRICES_K{edge_clusters_mat.max()}{lobe_sum_suffix}{fig_suffix}.png\"),\n", + "# dpi=600, bbox_inches='tight')\n", + "# fig.savefig(op.join(path_to_figures, f\"03-Showcase-MATRICES_K{edge_clusters_mat.max()}{lobe_sum_suffix}{fig_suffix}.pdf\"),\n", + "# dpi=600, bbox_inches='tight', format=\"pdf\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "89fb82ed", + "metadata": {}, + "outputs": [], + "source": [ + "if edge_clusters_mat.max() < 20:\n", + " fig, main_ax = plt.subplots(figsize=(25, 16))\n", + "\n", + " all_a_pos = [\n", + " [[-0.1, 0], [0.5, 0]],\n", + " [[0.1, 0], [-0.5, 0]],\n", + " [[0, -0.1], [0, 0.95]],\n", + " [[0, 0.1], [0, -0.9]],\n", + " ]\n", + " for a_pos in all_a_pos:\n", + " arrow = FancyArrowPatch(\n", + " a_pos[0],\n", + " a_pos[1],\n", + " mutation_scale=40,\n", + " facecolor=\"k\",\n", + " edgecolor=\"none\",\n", + " arrowstyle=\"simple\",\n", + " )\n", + " main_ax.add_patch(arrow)\n", + "\n", + " main_ax.text(0.32, 0.02, \"Assortative\", fontsize=22, ha='left', va='bottom', color='k')\n", + " main_ax.text(-0.32, 0.02, \"Disassortative\", fontsize=22, ha='right', va='bottom', color='k')\n", + " main_ax.text(0, 0.95, \"Sending\", fontsize=22, ha='center', va='bottom', color='k')\n", + " main_ax.text(0, -0.9, \"Receiving\", fontsize=22, ha='center', va='top', color='k')\n", + "\n", + " main_ax.set_xlim(-1, 1)\n", + " main_ax.set_ylim(-1.1, 1.1)\n", + " main_ax.axis(\"off\")\n", + "\n", + " gs = GridSpecFromSubplotSpec(1, 3, subplot_spec=main_ax.get_subplotspec(), wspace=0.1, width_ratios=[2, 1.8, 2])\n", + " axes = [fig.add_subplot(gs[i]) for i in range(3)]\n", + "\n", + " for ax in axes:\n", + " ax.axis(\"off\")\n", + " gs = GridSpecFromSubplotSpec(4, 2, subplot_spec=axes[1].get_subplotspec(), hspace=0.1, wspace=0.2)\n", + " gs_disassort = GridSpecFromSubplotSpec(5, 2, subplot_spec=axes[0].get_subplotspec(),\n", + " hspace=0.02, wspace=0.02, height_ratios=[1, 1, 0.1, 1, 1])\n", + " gs_assort = GridSpecFromSubplotSpec(5, 2, subplot_spec=axes[2].get_subplotspec(),\n", + " hspace=0.02, wspace=0.02, height_ratios=[1, 1, 0.1, 1, 1])\n", + " axes_bicom = [fig.add_subplot(gs_disassort[i], facecolor=\"none\") for i in range(10) if i//2 != 2]\n", + " axes_bicom += [fig.add_subplot(gs_assort[i], facecolor=\"none\") for i in range(10) if i//2 != 2]\n", + "\n", + " send, rec = all_send_rec[bicom_id]\n", + " assortativity = np.diag(send @ rec.T)\n", + " bimod_idx = dgsp.bimod_index_nodes(graph, send, rec)\n", + "\n", + " assort_bicom = [1, 18, 9, 1, 15, 6, 13, 14]\n", + " disassort_bicom = [12, 10, 8, 0, 16, 4, 17, 7]\n", + " \n", + " manual_view = [\n", + " \"tra\", \"left\", \"tra\", \"left\",\n", + " \"right\", \"left\", \"right\", \"tra\",\n", + " \"left\", \"right\", \"tra\", \"left\",\n", + " \"right\", \"left\", \"right\", \"right\",\n", + " ]\n", + "\n", + " lobe_vec = lobe_df.lobe_id_reorder.values\n", + " one_hot_lobe = np.array([(lobe_vec == i).astype(float) for i in range(lobe_vec.max())])\n", + " one_hot_lobe /= one_hot_lobe.sum(axis=1, keepdims=True)\n", + "\n", + " assort_mask = [False]*len(disassort_bicom[:8]) + [True]*len(assort_bicom[:8])\n", + " selected_bicoms = disassort_bicom[:8] + assort_bicom[:8]\n", + "\n", + " # If needed to adjust for 0-indexing\n", + " selected_bicoms = [x + 1 for x in selected_bicoms]\n", + " # manual_view = [\"tra\"]* len(selected_bicoms)\n", + "\n", + " i_assort = 0\n", + " i_disassort = 0\n", + " for i, bic_id in enumerate(selected_bicoms):\n", + " if assort_mask[i]:\n", + " ax = axes_bicom[i_assort+8]\n", + " i_assort += 1\n", + " else:\n", + " ax = axes_bicom[i_disassort]\n", + " i_disassort += 1\n", + "\n", + " is_sig = sig_df.loc[bic_id-1, \"is_sig\"]\n", + " assym = sig_df.loc[bic_id-1, \"directionality\"]\n", + " e_clust_mask = np.zeros_like(edge_clusters_mat)\n", + "\n", + " col = \"w\"\n", + " marker = \"o\"\n", + " lw = 0\n", + "\n", + " fontweight=None\n", + " if is_sig:\n", + " fontweight=\"bold\"\n", + " marker = \"s\"\n", + " lw = 2\n", + "\n", + " if assym < 0.5:\n", + " e_clust_mask[edge_clusters_mat.T == bic_id] = bic_id\n", + " else:\n", + " e_clust_mask[edge_clusters_mat == bic_id] = bic_id\n", + " else: \n", + " e_clust_mask[edge_clusters_mat == bic_id] = bic_id\n", + " e_clust_mask[edge_clusters_mat.T == bic_id] = bic_id\n", + "\n", + " ax.scatter([200], [200], s=500, color=clust_cmap_net(bic_id),\n", + " edgecolor=\"k\", marker=marker, lw=lw, zorder=1)\n", + "\n", + "\n", + " if not fast:\n", + " plot.plot_bicom_tracts(\n", + " bic_id,\n", + " e_clust_mask,\n", + " labels,\n", + " scale,\n", + " cmap=cmaps[\"div_rb\"],\n", + " view=manual_view[i],\n", + " axes=ax,\n", + " n_centroids=5,\n", + " linewidth=0.3,\n", + " slines_alpha=1 - 0.01 * is_sig,\n", + " upsample=upsample,\n", + " overlay_slines=False,\n", + " brain_opacity=0.1,\n", + " bidir_col=(0.6, 0.6, 0.6, 1),\n", + " fig=fig)\n", + " \n", + " for ax in axes_bicom:\n", + " ax.axis(\"off\")\n", + "\n", + " ax_scatter = fig.add_subplot(gs[1:3, 0:2], facecolor=\"none\")\n", + "\n", + " scatter_size = 300 + 2*bimod_idx\n", + " sig_mask = sig_df.sort_values(\"Bicomm_ID\").is_sig.values\n", + "\n", + " assort_plot = assortativity.copy()\n", + " min_assort = 1e-2\n", + " np.random.seed(17)\n", + "\n", + " mean_assort = (ss_sr + rr_sr)/2\n", + " assort_plot = mean_assort\n", + "\n", + " ax_scatter.scatter(assort_plot[~sig_mask], (rr_sr - ss_sr)[~sig_mask], s=scatter_size[~sig_mask],\n", + " c=np.arange(len(sig_mask))[~sig_mask]+1, cmap=clust_cmap_net, edgecolors=\"k\", lw=0,\n", + " vmin=0, vmax=len(sig_mask))\n", + " ax_scatter.scatter(assort_plot[sig_mask], (rr_sr - ss_sr)[sig_mask], s=scatter_size[sig_mask], marker=\"s\",\n", + " c=np.arange(len(sig_mask))[sig_mask]+1, cmap=clust_cmap_net, edgecolors=\"k\", lw=2,\n", + " vmin=0, vmax=len(sig_mask))\n", + "\n", + " ax_scatter.axhline(0, color=\"k\", lw=2, zorder=0)\n", + " ax_scatter.axvline(0.1, color=\"k\", lw=2, zorder=0)\n", + "\n", + " limit_ratio = 1.2\n", + " ax_scatter.set_xlim(-mean_assort.max()*limit_ratio + 0.2, mean_assort.max()*limit_ratio)\n", + " ax_scatter.set_ylim(-np.abs(rr_sr - ss_sr).max()*limit_ratio, np.abs(rr_sr - ss_sr).max()*limit_ratio)\n", + "\n", + " ax_in = ax_scatter.inset_axes([0.05, 0.7, 0.3, 0.3], xlim=(-1e-3, 1e-3), ylim=(-1e-3, 1e-3))\n", + "\n", + " zero_mask = mean_assort < 1e-3\n", + " np.random.seed(7)\n", + " zero_x = np.random.uniform(-8e-4, 8e-4, zero_mask.sum())\n", + " zero_y = np.random.uniform(-8e-4, 8e-4, zero_mask.sum())\n", + "\n", + " ax_in.scatter(zero_x, zero_y, s=scatter_size[zero_mask], marker=\"o\", #marker=\"D\",\n", + " c=np.arange(len(sig_mask))[zero_mask]+1, cmap=clust_cmap_net, edgecolors=\"k\", lw=0,\n", + " vmin=0, vmax=len(sig_mask), alpha=(sig_mask[zero_mask] == False).astype(float))\n", + "\n", + " ax_in.scatter(zero_x, zero_y, s=scatter_size[zero_mask], marker=\"s\", #marker=\"D\",\n", + " c=np.arange(len(sig_mask))[zero_mask]+1, cmap=clust_cmap_net, edgecolors=\"k\", lw=2,\n", + " vmin=0, vmax=len(sig_mask), alpha=sig_mask[zero_mask].astype(float))\n", + "\n", + " ax_in.set_xticks([])\n", + " ax_in.set_yticks([])\n", + " ax_in.set_title(\"Assortativity = 0\", fontsize=16)\n", + " ax_in.spines[:].set_linewidth(2)\n", + " ax_scatter.indicate_inset_zoom(ax_in, edgecolor=\"black\", lw=2, zorder=0)\n", + " ax_scatter.axis(\"off\")\n", + "\n", + " toy_pos = [\n", + " [0.56, 0.46, 0.1, 0.08],\n", + " [0.53, 0.2, 0.1, 0.08],\n", + " [0.53, 0.71, 0.1, 0.08],\n", + " [0.39, 0.71, 0.1, 0.08],\n", + " [0.39, 0.2, 0.1, 0.08],\n", + " [0.368, 0.46, 0.1, 0.08],\n", + " ]\n", + " toy_titles = [\n", + " \"\",\n", + " \"Receiving\\nCore-Periphery\",\n", + " \"Sending\\nCore-Periphery\",\n", + " \"Disassortative\\nFocusing\",\n", + " \"Disassortative\\nBroadcasting\",\n", + " \"\",\n", + " ]\n", + " for toy_i, (toy_mat, pos) in enumerate(zip(all_sample_graphs, toy_pos)):\n", + " ax_toy = fig.add_subplot(pos, facecolor=\"none\")\n", + " ax_toy.imshow((toy_mat > 0).astype(int), cmap=cmaps[\"div_rb\"],\n", + " interpolation=\"none\", vmax=1.3)\n", + " ax_toy.set_title(toy_titles[toy_i], fontsize=18)\n", + " ax_toy.set_xticks([])\n", + " ax_toy.set_yticks([])\n", + " ax_toy.axis(\"off\")\n", + "\n", + " l1_pos = -0.21\n", + " main_ax.scatter([l1_pos-0.02], [-1], marker=\"o\", s=400, color=\"gray\", edgecolor=\"k\", lw=0)\n", + " main_ax.text(l1_pos, -1.005, \"Bidirectional\", fontsize=16, ha=\"left\", va=\"center\")\n", + "\n", + " l2_pos = 0.02\n", + " main_ax.scatter([l2_pos-0.02], [-1], marker=\"s\", s=400, color=\"gray\", edgecolor=\"k\", lw=2)\n", + " main_ax.text(l2_pos, -1.005, \"Significantly Directed\", fontsize=16, ha=\"left\", va=\"center\")\n", + "\n", + " cbar_pos = [[0.4, 0.11, 0.23, 0.01]]\n", + "\n", + " for pos in cbar_pos:\n", + " plot.draw_cbar(fig, cmap=cmaps[\"div_rb\"], ax_pos=pos, ticks=[0, 10],\n", + " labels=[\"Receiving\", \"Sending\"], fontsize=16)\n", + "\n", + " # Drawing boxes\n", + " box_lw = 2\n", + " axe_boxes = fig.add_subplot([0.1, 0.1, 0.81, 0.81], facecolor=\"none\")\n", + " axe_boxes.axis(\"off\")\n", + " axe_boxes.fill([0.03, 0.338, 0.338, 0.03], [0.525, 0.525, 0.96, 0.96], color=\"none\", edgecolor=\"k\", lw=box_lw)\n", + " axe_boxes.fill([0.03, 0.338, 0.338, 0.03], [0.04, 0.04, 0.467, 0.467], color=\"none\", edgecolor=\"k\", lw=box_lw)\n", + " axe_boxes.fill([0.68, 0.99, 0.99, 0.68], [0.525, 0.525, 0.96, 0.96], color=\"none\", edgecolor=\"k\", lw=box_lw)\n", + " axe_boxes.fill([0.68, 0.99, 0.99, 0.68], [0.04, 0.04, 0.467, 0.467], color=\"none\", edgecolor=\"k\", lw=box_lw)\n", + " axe_boxes.set_xlim(0, 1)\n", + " axe_boxes.set_ylim(0, 1)\n", + "\n", + " main_ax.plot([-0.356, -0.24], [0.7, 0.74], color=\"k\", lw=box_lw)\n", + " main_ax.plot([0.357, 0.23], [0.7, 0.74], color=\"k\", lw=box_lw)\n", + " main_ax.plot([-0.356, -0.24], [-0.7, -0.74], color=\"k\", lw=box_lw)\n", + " main_ax.plot([0.357, 0.23], [-0.7, -0.74], color=\"k\", lw=box_lw)\n", + "\n", + " main_ax.plot([0.357, 0.255], [0.24, 0.13], color=\"k\", lw=box_lw)\n", + " main_ax.plot([-0.356, -0.25], [0.24, 0.13], color=\"k\", lw=box_lw)\n", + " main_ax.plot([0.357, 0.255], [-0.21, -0.1], color=\"k\", lw=box_lw)\n", + " main_ax.plot([-0.356, -0.25], [-0.21, -0.1], color=\"k\", lw=box_lw)\n", + "\n", + " if not fast:\n", + " fig.savefig(op.join(path_to_figures, f\"03-Showcase-BICOM_K{edge_clusters_mat.max()}{fig_suffix}.png\"),\n", + " dpi=600, bbox_inches='tight')\n", + " fig.savefig(op.join(path_to_figures, f\"03-Showcase-BICOM_K{edge_clusters_mat.max()}{fig_suffix}.pdf\"),\n", + " dpi=600, bbox_inches='tight', format=\"pdf\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3f92f259", + "metadata": {}, + "outputs": [], + "source": [ + "if edge_clusters_mat.max() > 20:\n", + " fig, main_ax = plt.subplots(figsize=(30, 16))\n", + "\n", + " all_a_pos = [\n", + " [[-0.1, 0], [0.5, 0]],\n", + " [[0.1, 0], [-0.5, 0]],\n", + " [[0, -0.1], [0, 0.95]],\n", + " [[0, 0.1], [0, -0.9]],\n", + " ]\n", + " for a_pos in all_a_pos:\n", + " arrow = FancyArrowPatch(\n", + " a_pos[0],\n", + " a_pos[1],\n", + " mutation_scale=40,\n", + " facecolor=\"k\",\n", + " edgecolor=\"none\",\n", + " arrowstyle=\"simple\",\n", + " )\n", + " main_ax.add_patch(arrow)\n", + "\n", + " main_ax.text(0.32, 0.02, \"Assortative\", fontsize=22, ha='left', va='bottom', color='k')\n", + " main_ax.text(-0.32, 0.02, \"Disassortative\", fontsize=22, ha='right', va='bottom', color='k')\n", + " main_ax.text(0, 0.95, \"Sending\", fontsize=22, ha='center', va='bottom', color='k')\n", + " main_ax.text(0, -0.9, \"Receiving\", fontsize=22, ha='center', va='top', color='k')\n", + "\n", + " main_ax.set_xlim(-1, 1)\n", + " main_ax.set_ylim(-1.1, 1.1)\n", + " main_ax.axis(\"off\")\n", + "\n", + " gs = GridSpecFromSubplotSpec(1, 3, subplot_spec=main_ax.get_subplotspec(), wspace=0.1, width_ratios=[2, 1.5, 2])\n", + " axes = [fig.add_subplot(gs[i]) for i in range(3)]\n", + "\n", + " for ax in axes:\n", + " ax.axis(\"off\")\n", + " gs = GridSpecFromSubplotSpec(4, 2, subplot_spec=axes[1].get_subplotspec(), hspace=0.1, wspace=0.2)\n", + " gs_disassort = GridSpecFromSubplotSpec(5, 3, subplot_spec=axes[0].get_subplotspec(),\n", + " hspace=0.02, wspace=0.02, height_ratios=[1, 1, 0, 1, 1])\n", + " gs_assort = GridSpecFromSubplotSpec(5, 3, subplot_spec=axes[2].get_subplotspec(),\n", + " hspace=0.02, wspace=0.02, height_ratios=[1, 1, 0, 1, 1])\n", + " axes_bicom = [fig.add_subplot(gs_disassort[i], facecolor=\"none\") for i in range(15) if i//3 != 2]\n", + " axes_bicom += [fig.add_subplot(gs_assort[i], facecolor=\"none\") for i in range(15) if i//3 != 2]\n", + "\n", + " send, rec = all_send_rec[bicom_id]\n", + " assortativity = np.diag(send @ rec.T)\n", + " bimod_idx = dgsp.bimod_index_nodes(graph, send, rec)\n", + "\n", + " if gamma == 3:\n", + " assort_bicom = [11, 13, 8, 21, 26, 1, 16, 24, 25, 5, 17, 7]\n", + " disassort_bicom = [6, 12, 27, 10, 9, 0, 20, 22, 23, 15, 14, 4]\n", + "\n", + " manual_view = [\n", + " \"right\", \"left\", \"tra\", \"tra\", \"right\", \"right\",\n", + " \"left\", \"tra\", \"left\", \"tra\", \"tra\", \"right\",\n", + " \"right\", \"left\", \"right\", \"left\", \"tra\", \"right\",\n", + " \"left\", \"left\", \"left\", \"right\", \"left\", \"right\"\n", + " ]\n", + " else:\n", + " assort_bicom = [19, 13, 3, 14, 34, 27, 6, 33, 5, 12, 29, 26]\n", + " disassort_bicom = [15, 8, 20, 17, 4, 28, 24, 10, 11, 16, 23, 1]\n", + " manual_view = [\n", + " \"tra\", \"right\", \"left\", \"right\", \"left\", \"right\",\n", + " \"tra\", \"left\", \"left\", \"left\", \"tra\", \"left\",\n", + " \"tra\", \"left\", \"right\", \"left\", \"right\", \"right\",\n", + " \"left\", \"right\", \"left\", \"left\", \"right\", \"right\"\n", + " ]\n", + "\n", + " lobe_vec = lobe_df.lobe_id_reorder.values\n", + " one_hot_lobe = np.array([(lobe_vec == i).astype(float) for i in range(lobe_vec.max())])\n", + " one_hot_lobe /= one_hot_lobe.sum(axis=1, keepdims=True)\n", + "\n", + " assort_mask = [False]*len(disassort_bicom[:12]) + [True]*len(assort_bicom[:12])\n", + " selected_bicoms = disassort_bicom[:12] + assort_bicom[:12]\n", + "\n", + " # If needed to adjust for 0-indexing\n", + " selected_bicoms = [x + 1 for x in selected_bicoms]\n", + "\n", + " i_assort = 0\n", + " i_disassort = 0\n", + " for i, bic_id in enumerate(selected_bicoms):\n", + " if assort_mask[i]:\n", + " ax = axes_bicom[i_assort+12]\n", + " i_assort += 1\n", + " else:\n", + " ax = axes_bicom[i_disassort]\n", + " i_disassort += 1\n", + " \n", + " is_sig = sig_df.loc[bic_id-1, \"is_sig\"]\n", + " assym = sig_df.loc[bic_id-1, \"directionality\"]\n", + " e_clust_mask = np.zeros_like(edge_clusters_mat)\n", + "\n", + " col = \"w\"\n", + " marker = \"o\"\n", + " lw = 0\n", + "\n", + " fontweight=None\n", + " if is_sig:\n", + " fontweight=\"bold\"\n", + " marker = \"s\"\n", + " lw = 2\n", + "\n", + " if assym < 0.5:\n", + " e_clust_mask[edge_clusters_mat.T == bic_id] = bic_id\n", + " else:\n", + " e_clust_mask[edge_clusters_mat == bic_id] = bic_id\n", + " else: \n", + " e_clust_mask[edge_clusters_mat == bic_id] = bic_id\n", + " e_clust_mask[edge_clusters_mat.T == bic_id] = bic_id\n", + "\n", + " ax.scatter([200], [200], s=500, color=clust_cmap_net(bic_id),\n", + " edgecolor=\"k\", marker=marker, lw=lw, zorder=1)\n", + "\n", + " if not fast:\n", + " plot.plot_bicom_tracts(\n", + " bic_id,\n", + " e_clust_mask,\n", + " labels,\n", + " scale,\n", + " cmap=cmaps[\"div_rb\"],\n", + " view=manual_view[i],\n", + " axes=ax,\n", + " n_centroids=5,\n", + " linewidth=0.3,\n", + " slines_alpha=1 - 0.01 * is_sig,\n", + " upsample=upsample,\n", + " overlay_slines=False,\n", + " brain_opacity=0.1,\n", + " bidir_col=(0.6, 0.6, 0.6, 1),\n", + " fig=fig)\n", + " \n", + " for ax in axes_bicom:\n", + " ax.axis(\"off\")\n", + "\n", + " ax_scatter = fig.add_subplot(gs[1:3, 0:2], facecolor=\"none\")\n", + "\n", + " scatter_size = 300 + 2*bimod_idx\n", + " sig_mask = sig_df.sort_values(\"Bicomm_ID\").is_sig.values\n", + "\n", + " assort_plot = assortativity.copy()\n", + " min_assort = 1e-2\n", + " np.random.seed(17)\n", + "\n", + " mean_assort = (ss_sr + rr_sr)/2\n", + " assort_plot = mean_assort\n", + "\n", + " ax_scatter.scatter(assort_plot[~sig_mask], (rr_sr - ss_sr)[~sig_mask], s=scatter_size[~sig_mask],\n", + " c=np.arange(len(sig_mask))[~sig_mask]+1, cmap=clust_cmap_net, edgecolors=\"k\", lw=0,\n", + " vmin=0, vmax=len(sig_mask))\n", + " ax_scatter.scatter(assort_plot[sig_mask], (rr_sr - ss_sr)[sig_mask], s=scatter_size[sig_mask], marker=\"s\",\n", + " c=np.arange(len(sig_mask))[sig_mask]+1, cmap=clust_cmap_net, edgecolors=\"k\", lw=2,\n", + " vmin=0, vmax=len(sig_mask))\n", + "\n", + " ax_scatter.axhline(0, color=\"k\", lw=2, zorder=0)\n", + " ax_scatter.axvline(0.1, color=\"k\", lw=2, zorder=0)\n", + "\n", + " limit_ratio = 1.2\n", + "\n", + " if gamma == 3:\n", + " ax_scatter.set_xlim(-mean_assort.max()*limit_ratio + 0.2, mean_assort.max()*limit_ratio)\n", + " else:\n", + " limit_ratio = 1.4\n", + " ax_scatter.set_xlim(-mean_assort.max()*limit_ratio + 0.2, mean_assort.max()*limit_ratio)\n", + " ax_scatter.set_ylim(-np.abs(rr_sr - ss_sr).max()*limit_ratio, np.abs(rr_sr - ss_sr).max()*limit_ratio)\n", + "\n", + " ax_in = ax_scatter.inset_axes([0.05, 0.7, 0.3, 0.3], xlim=(-1e-3, 1e-3), ylim=(-1e-3, 1e-3))\n", + "\n", + " zero_mask = mean_assort < 1e-3\n", + " np.random.seed(7)\n", + " zero_x = np.random.uniform(-8e-4, 8e-4, zero_mask.sum())\n", + " zero_y = np.random.uniform(-8e-4, 8e-4, zero_mask.sum())\n", + "\n", + " ax_in.scatter(zero_x, zero_y, s=scatter_size[zero_mask], marker=\"o\", #marker=\"D\",\n", + " c=np.arange(len(sig_mask))[zero_mask]+1, cmap=clust_cmap_net, edgecolors=\"k\", lw=0,\n", + " vmin=0, vmax=len(sig_mask), alpha=(sig_mask[zero_mask] == False).astype(float))\n", + "\n", + " ax_in.scatter(zero_x, zero_y, s=scatter_size[zero_mask], marker=\"s\", #marker=\"D\",\n", + " c=np.arange(len(sig_mask))[zero_mask]+1, cmap=clust_cmap_net, edgecolors=\"k\", lw=2,\n", + " vmin=0, vmax=len(sig_mask), alpha=sig_mask[zero_mask].astype(float))\n", + "\n", + " ax_in.set_xticks([])\n", + " ax_in.set_yticks([])\n", + " ax_in.set_title(\"Assortativity = 0\", fontsize=16)\n", + " ax_in.spines[:].set_linewidth(2)\n", + " ax_scatter.indicate_inset_zoom(ax_in, edgecolor=\"black\", lw=2, zorder=0)\n", + " ax_scatter.axis(\"off\")\n", + "\n", + " toy_pos = [\n", + " [0.56, 0.46, 0.1, 0.08],\n", + " [0.53, 0.2, 0.1, 0.08],\n", + " [0.53, 0.71, 0.1, 0.08],\n", + " [0.39, 0.71, 0.1, 0.08],\n", + " [0.39, 0.2, 0.1, 0.08],\n", + " [0.368, 0.46, 0.1, 0.08],\n", + " ]\n", + " toy_titles = [\n", + " \"\",\n", + " \"Receiving\\nCore-Periphery\",\n", + " \"Sending\\nCore-Periphery\",\n", + " \"Disassortative\\nFocusing\",\n", + " \"Disassortative\\nBroadcasting\",\n", + " \"\",\n", + " ]\n", + " for toy_i, (toy_mat, pos) in enumerate(zip(all_sample_graphs, toy_pos)):\n", + " ax_toy = fig.add_subplot(pos, facecolor=\"none\")\n", + " ax_toy.imshow((toy_mat > 0).astype(int), cmap=cmaps[\"div_rb\"],\n", + " interpolation=\"none\", vmax=1.3)\n", + " ax_toy.set_title(toy_titles[toy_i], fontsize=18)\n", + " ax_toy.set_xticks([])\n", + " ax_toy.set_yticks([])\n", + " ax_toy.axis(\"off\")\n", + "\n", + " l1_pos = -0.21\n", + " main_ax.scatter([l1_pos-0.02], [-1], marker=\"o\", s=400, color=\"gray\", edgecolor=\"k\", lw=0)\n", + " main_ax.text(l1_pos, -1.005, \"Bidirectional\", fontsize=16, ha=\"left\", va=\"center\")\n", + "\n", + " l2_pos = 0.02\n", + " main_ax.scatter([l2_pos-0.02], [-1], marker=\"s\", s=400, color=\"gray\", edgecolor=\"k\", lw=2)\n", + " main_ax.text(l2_pos, -1.005, \"Significantly Directed\", fontsize=16, ha=\"left\", va=\"center\")\n", + "\n", + " cbar_pos = [[0.4, 0.11, 0.23, 0.01]]\n", + "\n", + " for pos in cbar_pos:\n", + " plot.draw_cbar(fig, cmap=cmaps[\"div_rb\"], ax_pos=pos, ticks=[0, 10],\n", + " labels=[\"Receiving\", \"Sending\"], fontsize=16)\n", + "\n", + " # Drawing boxes\n", + " box_lw = 2\n", + " axe_boxes = fig.add_subplot([0.1, 0.1, 0.81, 0.81], facecolor=\"none\")\n", + " axe_boxes.axis(\"off\")\n", + " axe_boxes.fill([0.03, 0.362, 0.362, 0.03], [0.525, 0.525, 0.95, 0.95], color=\"none\", edgecolor=\"k\", lw=box_lw)\n", + " axe_boxes.fill([0.03, 0.362, 0.362, 0.03], [0.04, 0.04, 0.465, 0.465], color=\"none\", edgecolor=\"k\", lw=box_lw)\n", + " axe_boxes.fill([0.66, 0.99, 0.99, 0.66], [0.525, 0.525, 0.95, 0.95], color=\"none\", edgecolor=\"k\", lw=box_lw)\n", + " axe_boxes.fill([0.66, 0.99, 0.99, 0.66], [0.04, 0.04, 0.465, 0.465], color=\"none\", edgecolor=\"k\", lw=box_lw)\n", + " axe_boxes.set_xlim(0, 1)\n", + " axe_boxes.set_ylim(0, 1)\n", + "\n", + " main_ax.plot([-0.305, -0.24], [0.7, 0.74], color=\"k\", lw=box_lw)\n", + " main_ax.plot([0.315, 0.23], [0.7, 0.74], color=\"k\", lw=box_lw)\n", + " main_ax.plot([-0.305, -0.24], [-0.7, -0.74], color=\"k\", lw=box_lw)\n", + " main_ax.plot([0.315, 0.23], [-0.7, -0.74], color=\"k\", lw=box_lw)\n", + "\n", + " main_ax.plot([0.315, 0.255], [0.24, 0.13], color=\"k\", lw=box_lw)\n", + " main_ax.plot([-0.305, -0.25], [0.24, 0.13], color=\"k\", lw=box_lw)\n", + " main_ax.plot([0.315, 0.255], [-0.21, -0.1], color=\"k\", lw=box_lw)\n", + " main_ax.plot([-0.305, -0.25], [-0.21, -0.1], color=\"k\", lw=box_lw)\n", + "\n", + " if not fast:\n", + " fig.savefig(op.join(path_to_figures, f\"03-Showcase-BICOM_K{edge_clusters_mat.max()}{fig_suffix}.png\"),\n", + " dpi=600, bbox_inches='tight')\n", + " fig.savefig(op.join(path_to_figures, f\"03-Showcase-BICOM_K{edge_clusters_mat.max()}{fig_suffix}.pdf\"),\n", + " dpi=600, bbox_inches='tight', format=\"pdf\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d7d6a6de", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "31745cb3", + "metadata": {}, + "source": [ + "## F-Tract Validation" + ] + }, + { + "cell_type": "markdown", + "id": "7f2214b0", + "metadata": {}, + "source": [ + "### Preparation code" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0047358a", + "metadata": {}, + "outputs": [], + "source": [ + "maxdelay = 50\n", + "minmeas = 49\n", + "minimpl = 2\n", + "\n", + "path_to_ftract = op.join(path_to_data, \"brain\", \"F-Tract\")\n", + "prob, delay_dict, ftract_labels = dload.get_ftract_data(\n", + " path_to_ftract,\n", + " scale=2, maxdelay=maxdelay,\n", + " min_measurements=minmeas, min_implants=minimpl,\n", + " atlas_year=\"2018\",\n", + " verbose=True\n", + " )\n", + "\n", + "selected_features = list(delay_dict.keys())\n", + "\n", + "print(\"FTract Features are:\")\n", + "for feat in selected_features:\n", + " print(f\" - {feat}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2287721f", + "metadata": {}, + "outputs": [], + "source": [ + "n_k_tested = 3\n", + "k_for_corr = best10_list + 2\n", + "\n", + "n_perm = 4999\n", + "use_beta = False\n", + "use_spearman = True\n", + "use_median = True\n", + "use_abs = True\n", + "\n", + "save_perm = True\n", + "path_to_saveperm = f\"./results/BrainKmeans/scale{scale}/permutations\"\n", + "\n", + "path_to_saveperm = op.join(path_to_derivatives, \"permutations\", f\"scale{scale}\")\n", + "\n", + "fname = f\"permutations_scale{scale}_gamma{gamma}-F_meas{minmeas}_impl{minimpl}-{n_perm}Perm\"\n", + "fname += \"-Pearson\"*(not use_spearman) + \"-Mean\"*(not use_median) + \"-Abs\"*(use_abs) + f\"-K{len(k_for_corr)}\"\n", + "fname += \".pkl\"\n", + "print(f\"Savename is {fname}\")\n", + "\n", + "if op.isfile(op.join(path_to_saveperm, fname)):\n", + "# if False:\n", + " perm_dict = dload.load(op.join(path_to_saveperm, fname))\n", + "\n", + " all_corr_bi = perm_dict[\"all_corr_bi\"]\n", + " all_corr_rand = perm_dict[\"all_corr_rand\"]\n", + " best_bi = perm_dict[\"best_bi\"]\n", + " best_rand = perm_dict[\"best_rand\"]\n", + " edge_scatter = perm_dict[\"edge_scatter\"]\n", + " edge_scatter_rand = perm_dict[\"edge_scatter_rand\"]\n", + " all_best_k = perm_dict[\"all_best_k\"]\n", + " all_n_nans = perm_dict[\"all_n_nans\"]\n", + " all_best_perms = perm_dict[\"all_best_perms\"]\n", + " k_for_corr = perm_dict[\"k_for_corr\"]\n", + " selected_features = perm_dict[\"selected_features\"]\n", + "else:\n", + " all_corr_bi = np.zeros((len(selected_features), len(k_for_corr)))\n", + " all_corr_rand = np.zeros((len(selected_features), len(k_for_corr), n_perm))\n", + "\n", + " best_bi = [0]*len(selected_features)\n", + " best_rand = [0]*len(selected_features)\n", + "\n", + " edge_scatter = [0]*len(selected_features)\n", + " edge_scatter_rand = [0]*len(selected_features)\n", + "\n", + " all_best_k = np.zeros((len(selected_features)), dtype=int)\n", + " all_n_nans = np.zeros((len(selected_features), len(k_for_corr)))\n", + " all_best_perms = np.zeros((len(selected_features), len(k_for_corr), np.sum(graph > 0)), dtype=int)\n", + "\n", + " parallel = Parallel(n_jobs=14, return_as='generator')\n", + " counter = tqdm(total=len(selected_features)*len(k_for_corr)* (1 + n_perm))\n", + " for d_i, feat in enumerate(selected_features):\n", + " delay = delay_dict[feat]\n", + " invdelay = np.divide(1, delay, out=np.zeros_like(delay), where=delay > 0)\n", + "\n", + " g_ratio = graph.copy()\n", + " \n", + " nzer_mask = np.logical_and(delay > 0, graph > 0)\n", + " nzer_mask = np.logical_and(np.isnan(delay) == False, nzer_mask)\n", + " nzer_mask = np.logical_and(np.isnan(delay.T) == False, nzer_mask)\n", + " \n", + " graph_ratio = np.divide(graph, graph + graph.T, out=np.zeros_like(graph, dtype=float), where=nzer_mask)\n", + " f_ratio = np.divide(delay, delay + delay.T, out=np.zeros_like(graph_ratio), where=nzer_mask)\n", + " \n", + " edge_scatter[d_i] = (graph_ratio[nzer_mask], f_ratio[nzer_mask])\n", + "\n", + " # Making sure we compute the correlation only on non-zero edges and on the same edges for both datasets\n", + " graph_ratio[~nzer_mask] = np.nan\n", + " f_ratio[~nzer_mask] = np.nan\n", + "\n", + " if use_abs:\n", + " maxcorr = 0\n", + " else:\n", + " maxcorr = -1\n", + "\n", + " feat_n_nans = []\n", + " b_perm = []\n", + "\n", + " print(\"Permutations for feature:\", feat)\n", + " for i, k in enumerate(k_for_corr):\n", + " labs = fcluster(Z, t=k, criterion='maxclust')\n", + "\n", + " corr, n_nans, ftract_ratio, ec_ratio = dgsp.get_bicom_ratio(\n", + " graph, labs, f_ratio, graph_ratio, use_median=use_median,\n", + " use_spearman=use_spearman, use_beta=use_beta, return_scatter=True\n", + " )\n", + " all_n_nans[d_i, i] = n_nans\n", + " all_corr_bi[d_i, i] = corr\n", + "\n", + " if use_abs and (np.abs(corr) > np.abs(maxcorr)):\n", + " maxcorr = corr\n", + " best_bi[d_i] = (ec_ratio, ftract_ratio)\n", + " all_best_k[d_i] = labs.max()\n", + " \n", + " if not use_abs and (corr > maxcorr):\n", + " maxcorr = corr\n", + " best_bi[d_i] = (ec_ratio, ftract_ratio)\n", + " all_best_k[d_i] = labs.max()\n", + " \n", + " if use_abs:\n", + " maxrand = 0\n", + " else:\n", + " maxrand = -1\n", + " e_rand = []\n", + "\n", + " all_perm = [np.random.permutation(labs) for _ in range(n_perm)]\n", + "\n", + " res_gen = parallel(\n", + " delayed(dgsp.get_bicom_ratio)(\n", + " graph, perm, f_ratio, graph_ratio, use_median=use_median,\n", + " use_spearman=use_spearman, use_beta=use_beta, return_scatter=True, corr_type=corr_type\n", + " ) for perm in all_perm)\n", + " \n", + " for j, (corr2, _, ft_perm_ratio, ec_perm_ratio) in enumerate(res_gen):\n", + " while np.isnan(corr2):\n", + " all_perm[j] = np.random.permutation(labs)\n", + " corr2, _, ft_perm_ratio, ec_perm_ratio = dgsp.get_bicom_ratio(graph, all_perm[j], f_ratio, graph_ratio, use_median=use_median, use_spearman=use_spearman, return_scatter=True)\n", + " \n", + " all_corr_rand[d_i, i, j] = corr2\n", + "\n", + " if corr == maxcorr:\n", + " if use_abs and (np.abs(corr2) > np.abs(maxrand)):\n", + " maxrand = corr2\n", + " best_rand[d_i] = (ec_perm_ratio, ft_perm_ratio)\n", + " all_best_perms[d_i, i] = all_perm[j]\n", + " \n", + " if not use_abs and (corr2 > maxrand):\n", + " maxrand = corr2\n", + " best_rand[d_i] = (ec_perm_ratio, ft_perm_ratio)\n", + " all_best_perms[d_i, i] = all_perm[j]\n", + " \n", + " counter.update(1)\n", + "\n", + " counter.close()\n", + "\n", + " if save_perm:\n", + " os.makedirs(path_to_saveperm, exist_ok=True)\n", + " dload.save(\n", + " op.join(path_to_saveperm, fname),\n", + " {\n", + " \"all_corr_bi\": all_corr_bi,\n", + " \"all_corr_rand\": all_corr_rand,\n", + " \"best_bi\": best_bi,\n", + " \"best_rand\": best_rand,\n", + " \"edge_scatter\": edge_scatter,\n", + " \"edge_scatter_rand\": edge_scatter_rand,\n", + " \"all_best_k\": all_best_k,\n", + " \"all_n_nans\": all_n_nans,\n", + " \"all_best_perms\": all_best_perms,\n", + " \"k_for_corr\": k_for_corr,\n", + " \"selected_features\": selected_features,\n", + " })" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba1c8585", + "metadata": {}, + "outputs": [], + "source": [ + "k_ids = np.array([np.where(k_for_corr == o_k + 2)[0][0] for o_k in ordered_maximas if o_k + 2 in k_for_corr])\n", + "\n", + "if len(k_ids) > 10:\n", + " k_ids = k_ids[:10]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "7ce82777", + "metadata": {}, + "outputs": [], + "source": [ + "from statsmodels.stats.multitest import multipletests\n", + "\n", + "plot_selection = [0, 1, 3, 6]\n", + "\n", + "all_pvals = []\n", + "for ax_i, d_i in enumerate(plot_selection):\n", + " print(f\"Feature: {selected_features[d_i]}\")\n", + " for i, k in enumerate(k_ids):\n", + " corr_bi = all_corr_bi[d_i]\n", + "\n", + " n_bigger = (np.abs(all_corr_rand[d_i, k]) >= np.abs(corr_bi[k])).sum()\n", + " p_val = (n_bigger + 1)/(n_perm + 1)\n", + " all_pvals.append(p_val)\n", + "\n", + "isisg, p_corr, _, _ = multipletests(all_pvals, alpha=0.05, method=\"fdr_bh\", is_sorted=False)" + ] + }, + { + "cell_type": "markdown", + "id": "c1ba8df2", + "metadata": {}, + "source": [ + "### Figure" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3dbd8b25", + "metadata": {}, + "outputs": [], + "source": [ + "bonf_thresh = 0.05 / (4 * n_k_tested)\n", + "print(f\"Bonferroni threshold: {bonf_thresh}\")\n", + "\n", + "cmap_plot = cmaps[\"cluster_palette_soft\"]\n", + "col_4plots = cmap_plot.resampled(len(selected_features) + 1)\n", + "\n", + "print(f\"Min possible p-value: {1/(1+n_perm)}\")\n", + "\n", + "x_plot = np.linspace(0, 1, 100)\n", + "perc_plot = 5\n", + "plot_loo = True\n", + "\n", + "plot_selection = [0, 1, 6, 3]\n", + "feat_titles = [\"F-Tract Asymmetries\\nOnset Delay\", \"Latency Start\", \"Peak Delay\", \"Amplitude\"]\n", + "\n", + "fig, axes = plt.subplots(nrows=2, ncols=len(plot_selection),\n", + " figsize=(6*len(plot_selection), 10), gridspec_kw={\"hspace\":0.3})\n", + "\n", + "best_per_d = np.zeros(len(plot_selection))\n", + "old_best_per_d = 0\n", + "for ax_i, d_i in enumerate(plot_selection):\n", + " corr_bi = all_corr_bi[d_i]\n", + " color = col_4plots(d_i + 1)\n", + "\n", + " rand_del = all_corr_rand[d_i]\n", + " rand_del = np.nan_to_num(rand_del, nan=0)\n", + "\n", + " corr_bi = np.nan_to_num(corr_bi, nan=0)\n", + " best_per_d = np.argmax(np.abs(corr_bi))\n", + "\n", + " axes[0, ax_i].axis(\"off\")\n", + " gs = GridSpecFromSubplotSpec(2, 2, subplot_spec=axes[0, ax_i].get_subplotspec(),\n", + " wspace=0, hspace=0, width_ratios=[5, 1], height_ratios=[1, 5])\n", + " ax_bests = [fig.add_subplot(gs[i]) for i in range(4)]\n", + "\n", + " corr_label = f\"$K={k_for_corr[best_per_d]}, \\\\rho={corr_bi[best_per_d]:.2f}$\"\n", + " ax_bests[2].scatter(best_bi[d_i][0], best_bi[d_i][1],\n", + " s=100, color=color, edgecolor=\"k\",\n", + " label=corr_label,\n", + " zorder=4)\n", + " \n", + " # linear regression line\n", + " loo_yvals, loo_corrs = plot.get_loo_curves(best_bi[d_i][0], best_bi[d_i][1], x_plot=x_plot)\n", + "\n", + " if plot_loo:\n", + " reg = LinearRegression().fit(best_bi[d_i][0].reshape(-1, 1), best_bi[d_i][1].reshape(-1, 1))\n", + " reg.score(best_bi[d_i][0].reshape(-1, 1), best_bi[d_i][1].reshape(-1, 1))\n", + "\n", + " y_vals = reg.intercept_[0] + reg.coef_[0]*x_plot\n", + " ax_bests[2].plot(x_plot, loo_yvals.mean(axis=0), color=color, zorder=3, lw=2)\n", + " ax_bests[2].fill_between(x_plot, loo_yvals.min(axis=0), loo_yvals.max(axis=0),\n", + " color=color, alpha=0.3, zorder=2, edgecolor=\"none\")\n", + " \n", + " e_corr = spearmanr(edge_scatter[d_i][0], edge_scatter[d_i][1])[0]\n", + " ax_bests[2].scatter(edge_scatter[d_i][0], edge_scatter[d_i][1],\n", + " s=20, color=\"gray\", edgecolor=\"none\", alpha=0.2,\n", + " label=f\"Edges, $\\\\rho={e_corr:.2f}$\", zorder=0)\n", + " \n", + " ax_bests[2].set_xlim(0.401, 0.599)\n", + " ax_bests[2].set_ylim(0.401, 0.599)\n", + "\n", + " ax_bests[2].set_ylabel(feat_titles[ax_i], fontsize=16)\n", + " ax_bests[2].set_xlabel(f\"Connectome Asymmetry\", fontsize=16)\n", + " ax_bests[2].spines[[\"top\", \"right\"]].set_visible(False)\n", + " ax_bests[2].spines[:].set_linewidth(2)\n", + " ax_bests[2].tick_params(labelsize=14, width=2)\n", + " ax_bests[2].legend(fontsize=14, loc='upper left')\n", + "\n", + " ax_bests[0].set_xlim(ax_bests[2].get_xlim())\n", + " ax_bests[3].set_ylim(ax_bests[2].get_ylim())\n", + "\n", + " xkde = np.linspace(-0.1, 1.1, 1000)\n", + " plot.plot_kde(edge_scatter[d_i][0], data_range=xkde, ax=ax_bests[0],\n", + " bw_adjust=0.1, fill=True, color=\"silver\", alpha=0.8)\n", + " plot.plot_kde(edge_scatter[d_i][1], data_range=xkde, ax=ax_bests[3],\n", + " bw_adjust=0.1, fill=True, color=\"silver\", alpha=0.8, vertical=True)\n", + " \n", + " plot.plot_kde(best_bi[d_i][0], data_range=xkde, ax=ax_bests[0],\n", + " bw_adjust=0.2, fill=True, color=color, alpha=1)\n", + " plot.plot_kde(best_bi[d_i][1], data_range=xkde, ax=ax_bests[3],\n", + " bw_adjust=0.2, fill=True, color=color, alpha=1, vertical=True)\n", + "\n", + " ax_bests[1].axis(\"off\")\n", + " ax_bests[0].axis(\"off\")\n", + " ax_bests[3].axis(\"off\")\n", + "\n", + " minp = 1\n", + " for i, k in enumerate(k_ids):\n", + " rand_x = np.random.uniform(-0.4, 0.4, size=len(all_corr_rand[d_i, k]))\n", + " axes[1, ax_i].scatter(\n", + " rand_x + i, all_corr_rand[d_i, k], s=20,\n", + " color=\"gray\", alpha=0.1, edgecolors=\"none\")\n", + " \n", + " axes[1, ax_i].bar(i, corr_bi[k], zorder=1,\n", + " lw=2, edgecolor=\"none\", color=color, alpha=0.5)\n", + "\n", + " if best_per_d == k:\n", + " axes[1, ax_i].bar(i, corr_bi[k], zorder=1,\n", + " lw=3, edgecolor=\"k\", color=\"none\")\n", + " else: \n", + " axes[1, ax_i].bar(i, corr_bi[k], zorder=1,\n", + " lw=3, edgecolor=color, color=\"none\")\n", + "\n", + " n_bigger = (np.abs(all_corr_rand[d_i, k]) >= np.abs(corr_bi[k])).sum()\n", + " p_val = (n_bigger + 1)/(n_perm + 1)\n", + "\n", + " if p_val < 0.05:\n", + " maxval = np.max(all_corr_rand[d_i])\n", + " maxval = 0.75\n", + "\n", + " if p_val < isisg[ax_i * n_k_tested + i]:\n", + " axes[1, ax_i].text(i, maxval, \"$**$\", ha=\"center\", va=\"center\", fontsize=20)\n", + " else:\n", + " axes[1, ax_i].text(i, maxval, \"$*$\", ha=\"center\", va=\"center\", fontsize=20)\n", + " \n", + " if p_val < minp:\n", + " minp = p_val\n", + " print(f\"Min p-val for {feat}: {minp} (Bonferroni: {bonf_thresh})\")\n", + "\n", + " axes[1, ax_i].axhline(0, color=\"k\", lw=3, zorder=3)\n", + " axes[1, ax_i].set_xticks(range(len(k_ids)), labels=[str(k_for_corr[k]) for k in k_ids])\n", + " axes[1, ax_i].set_xlabel(\"Number of Clusters (K)\", fontsize=16)\n", + " axes[1, ax_i].spines[[\"top\", \"right\"]].set_visible(False)\n", + " axes[1, ax_i].spines[:].set_linewidth(2)\n", + " axes[1, ax_i].tick_params(labelsize=14, width=2)\n", + " axes[1, ax_i].set_ylim(-0.89, 0.89)\n", + "\n", + "axes[1, 0].set_ylabel(\"Spearman Correlation\", fontsize=16)\n", + "\n", + "axes[0, 0].text(-0.18, 0.95, \"A.\", transform=axes[0, 0].transAxes, fontsize=20, fontweight='bold', va='center', ha='center')\n", + "axes[1, 0].text(-0.18, 1.05, \"B.\", transform=axes[1, 0].transAxes, fontsize=20, fontweight='bold', va='center', ha='center')\n", + "\n", + "fig.savefig(op.join(path_to_figures, f\"04-Scatter-Ftract{minmeas}_{minimpl}-{n_perm}perm-Top{n_k_tested}.png\"), dpi=300, bbox_inches='tight')\n", + "fig.savefig(op.join(path_to_figures, f\"04-Scatter-Ftract{minmeas}_{minimpl}-{n_perm}perm-Top{n_k_tested}.pdf\"), dpi=300, bbox_inches='tight', format=\"pdf\")" + ] + }, + { + "cell_type": "markdown", + "id": "74eb9ec9", + "metadata": {}, + "source": [ + "## Summary Per Bundle" + ] + }, + { + "cell_type": "markdown", + "id": "ad9304b6", + "metadata": {}, + "source": [ + "### Preparation code" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "06b2004e", + "metadata": {}, + "outputs": [], + "source": [ + "n_yeo = 7\n", + "# n_yeo = 17\n", + "\n", + "path_to_yeo_corr = op.join(path_to_derivatives, \"atlas_correspondence\", \"YeoNetworks\")\n", + "yeo_fname = f\"Laus2018_Yeo{n_yeo}-scale{scale}OneThal.pkl\"\n", + "\n", + "yeo_corr = dload.load(os.path.join(path_to_yeo_corr, yeo_fname))\n", + "\n", + "corr_mat = yeo_corr[\"dice\"]\n", + "yeo_labels = yeo_corr[\"labels\"]\n", + "\n", + "# Abrev. of networks\n", + "yeo_labels[2] = \"Dorsal Attn.\"\n", + "yeo_labels[3] = \"Ventral Attn.\"\n", + "\n", + "s_e_labels = all_e_labels[2]\n", + "s_e_mat = np.zeros_like(edge_clusters_mat)\n", + "s_e_mat[edge_clusters_mat > 0] = s_e_labels\n", + "\n", + "send, rec = dgsp.get_node_clusters(s_e_labels, s_e_mat, scale=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aaff73cd", + "metadata": {}, + "outputs": [], + "source": [ + "e_lab_one_hot = np.array([s_e_labels == k+1 for k in range(s_e_labels.max())]).astype(float)\n", + "e_lab_one_hot = e_lab_one_hot / e_lab_one_hot.sum(axis=1, keepdims=True)\n", + "\n", + "e2b = edge_to_bundle_dist / edge_to_bundle_dist.sum(axis=1, keepdims=True)\n", + "e2b_max = e2b.max(axis=0)\n", + "\n", + "bicom_to_bundle = e_lab_one_hot @ e2b\n", + "b2b_max = bicom_to_bundle.max(axis=0)\n", + "\n", + "sort_by_overlap = np.argsort(b2b_max)[::-1]\n", + "\n", + "# uncorr_p = (1 + (e2b >= b2b_max).sum(axis=0)) / (1 + e2b.shape[0])\n", + "# from statsmodels.stats.multitest import multipletests\n", + "# isisg, p_corr, _, _ = multipletests(uncorr_p, alpha=0.05, method=\"fdr_bh\", is_sorted=False)\n", + "# print(isisg)\n", + "# print(p_corr)" + ] + }, + { + "cell_type": "markdown", + "id": "9f893d24", + "metadata": {}, + "source": [ + "### Figure" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4eb4e6b7", + "metadata": {}, + "outputs": [], + "source": [ + "from string import ascii_uppercase\n", + "\n", + "path_to_centroids = op.join(path_to_bundles, \"atlas\", \"pop_average\")\n", + "\n", + "label_space = 1.2\n", + "width_mod = 4\n", + "maxoverlap = 3\n", + "surf_overlay = 0.1\n", + "node_alpha = True\n", + "\n", + "sorted_sig_df = sig_df.sort_values(by='abs_dir', ascending=False)\n", + "sort_by_dir = [ind for ind, row in sorted_sig_df.iterrows() if row['is_sig']]\n", + "\n", + "if gamma == 3:\n", + " bicom_list = [9, 24, 1, 16, 0, 12, 11, 23]\n", + " views = [\"right\", \"left\", \"right\", \"left\", \"right\", \"left\", \"right\", \"left\"]\n", + " n_abundle = 12\n", + "else:\n", + " bicom_list = [11, 29, 4, 26, 13, 33, 2, 12]\n", + " views = [\"left\", \"right\", \"left\", \"right\", \"left\", \"right\", \"left\", \"left\"]\n", + " n_abundle = 14\n", + "\n", + "maxoverlaps = [maxoverlap]*len(bicom_list)\n", + "\n", + "manual_ab_names = {\n", + " 'AC': \"Anterior Commissure\",\n", + " 'AF': \"Arcuate Fasciculus\",\n", + " 'CC_Oc': \"Corpus Callosum Occipital\",\n", + " 'CC_Te': \"Corpus Callosum Temporal\",\n", + " 'CC_Pa': \"Corpus Callosum Parietal\",\n", + " 'CC_Fr_1': \"Corpus Callosum Front. 1\",\n", + " 'CC_Fr_2': \"Corpus Callosum Front. 2\",\n", + " 'CC_Pr_Po': \"Corpus Callosum Post.\",\n", + " 'CG': \"Cingulum\",\n", + " 'CG_An': \"Cingulum Ant.\",\n", + " 'CG_Po': \"Cingulum Post.\",\n", + " 'CG_curve': \"Cingulum Curve\",\n", + " 'FAT': \"Front. Aslant Tract\",\n", + " 'FPT': \"Fronto-pontine tract\",\n", + " 'FPT_Brainstem': \"Fronto-pontine & Brainstem\",\n", + " 'FX': \"Fornix\",\n", + " 'ILF': \"Inf. Long. Fasciculus\",\n", + " 'MdLF': \"Middle Long. Fasciculus\",\n", + " 'OR_ML': \"Optic Radiation\",\n", + " 'PYT': \"Pyramidal tract\",\n", + " 'PYT_Brainstem': \"Pyramidal & Brainstem\",\n", + " 'SLF': \"Sup. Long. Fasciculus\",\n", + " 'UF': \"Uncinate Fasciculus\"\n", + " }\n", + "\n", + "nrows = len(bicom_list) // 2\n", + "fig, axes = plt.subplots(ncols=2, nrows=nrows, figsize=(20, 3 * nrows),\n", + " gridspec_kw={'wspace':0.02, 'hspace':0})\n", + "axes = axes.flatten()\n", + "\n", + "abundle_cmap = cluster_cmap.resampled(n_abundle + 1)\n", + "all_ab_names = {}\n", + "for ax_i, bic_id in enumerate(bicom_list):\n", + " best_ab = np.flip(np.argsort(bicom_to_bundle[bic_id]))\n", + "\n", + " last_overlap = 0\n", + " n_overlap = 0\n", + " ab_names = []\n", + " for ab_i, ab in enumerate(best_ab):\n", + " ab_name = a_bundles_labels.loc[ab, \"BundleName\"]\n", + " \n", + " if (ax_i in [0, 1]) or (ab_name.split(\"_\")[0] != \"AF\"):\n", + " if last_overlap == 0:\n", + " last_overlap = bicom_to_bundle[bic_id, ab]\n", + "\n", + " if (bicom_to_bundle[bic_id, ab] < 0.8 * last_overlap) or (bicom_to_bundle[bic_id, ab] < 0.5 * bicom_to_bundle[:, ab].max()) or (n_overlap >= maxoverlaps[ax_i]):\n", + " break\n", + " else:\n", + " last_overlap = bicom_to_bundle[bic_id, ab]\n", + " ab_names.append(ab_name)\n", + " n_overlap += 1\n", + "\n", + " ab_name_nolat = ab_name.replace(\"_L\", \"\").replace(\"_R\", \"\")\n", + " if ab_name_nolat not in all_ab_names.keys():\n", + " all_ab_names.update({ab_name_nolat: len(all_ab_names.keys()) + 1})\n", + " \n", + " stripednames = [name.replace(\"_L\", \"\").replace(\"_R\", \"\") for name in ab_names]\n", + " color_idxs = [all_ab_names[name] for name in stripednames]\n", + "\n", + " colors = np.array([abundle_cmap(idx) for idx in color_idxs])\n", + "\n", + " path_to_trk = [op.join(path_to_centroids, f\"{name.replace(' ', '_')}.trk\") for name in ab_names]\n", + "\n", + " e_clust_mask = np.zeros_like(edge_clusters_mat)\n", + " e_clust_mask[edge_clusters_mat == bic_id + 1] = 1\n", + "\n", + " subnet_mask = corr_mat @ e_clust_mask @ corr_mat.T\n", + "\n", + " asymmetry = sig_df.loc[sig_df['Bicomm_ID'] == bic_id + 1, 'directionality'].values[0]\n", + "\n", + " if asymmetry < 0.5:\n", + " subnet_mask = subnet_mask.T\n", + " e_clust_mask = e_clust_mask.T\n", + "\n", + " is_sig = sig_df.loc[sig_df['Bicomm_ID'] == bic_id + 1, 'is_sig'].values[0]\n", + "\n", + " if not is_sig:\n", + " print(f\"Making bicom {bic_id + 1} bidirectional\")\n", + " e_clust_mask += e_clust_mask.T\n", + " e_clust_mask[e_clust_mask > 0] = 1\n", + "\n", + " subnet_mask = (subnet_mask + subnet_mask.T)/2\n", + "\n", + " if len(ab_names) > 4:\n", + " ab_name = \", \".join(ab_names[:4]) + \"\\n\" + \", \".join(ab_names[4:]) \n", + " else:\n", + " ab_name = \" , \".join(ab_names)\n", + " axes[ax_i].axis(\"off\")\n", + " \n", + " gs = GridSpecFromSubplotSpec(1, 3, axes[ax_i].get_subplotspec(), width_ratios=[1, 1, 1.1], wspace=0)\n", + " sub_axes = [fig.add_subplot(gs[i]) for i in range(3)]\n", + " \n", + " sub_axes[0].text(0, 0.9, f\"{ascii_uppercase[ax_i]}.\", fontsize=16, transform=sub_axes[0].transAxes)\n", + "\n", + " if not fast:\n", + " # Tracks\n", + " plot.plot_trk(path_to_trk, cmap=cmaps[\"div_rb\"], upsample=None, n_slines=500,\n", + " brain_opacity=surf_overlay, overlay_slines=surf_overlay == 1,\n", + " trk_color_list=colors,\n", + " view=views[ax_i], linewidth=0.3, slines_alpha=1, axes=sub_axes[0])\n", + "\n", + " # Bicom\n", + " axpos = sub_axes[1].get_position()\n", + " cbar_pos = np.array(axpos.bounds)\n", + " cbar_pos[0] += cbar_pos[2] * 0.1\n", + " cbar_pos[2] *= 0.8\n", + " cbar_pos[1] += cbar_pos[3] * 0.2\n", + " cbar_pos[3] = 0.01\n", + " plot.plot_bicom_tracts(1, e_clust_mask, labels, scale=2, cmap=cmaps[\"div_rb\"], n_centroids=5,\n", + " brain_opacity=surf_overlay, overlay_slines=surf_overlay == 1,\n", + " linewidth=0.3, slines_alpha=1 - 0.01 * is_sig, bidir_col=(0.6, 0.6, 0.6, 1),\n", + " view=views[ax_i], axes=sub_axes[1], upsample=upsample,\n", + " fig=fig, plot_cbar=False, cbar_pos=cbar_pos, cbar_fontsize=14)\n", + " # Networks\n", + " sub_axes[2].axis(\"off\")\n", + " if views[ax_i] == \"left\":\n", + " node_pos = node_centers[:, [1, 2]] * [-1, 1]\n", + " else:\n", + " node_pos = node_centers[:, [1, 2]]\n", + " \n", + " sub_axes[2] = plot.plot_yeo_summary(subnet_mask, yeo_labels, cmap=cmaps[\"div_rb_silver\"], axes=sub_axes[2],\n", + " width_mod=1, r_lab_only=True, manual_arrows=True, net_alpha=node_alpha)\n", + "\n", + " if ax_i < 2:\n", + " sub_axes[0].set_title(\"Anatomical Bundles\", fontsize=14)\n", + " sub_axes[1].set_title(\"Bicommunity Streamlines\", fontsize=14)\n", + " sub_axes[2].set_title(\"Network Representation\", fontsize=14)\n", + "\n", + "if gamma == 3:\n", + " ax_legend = fig.add_subplot([0.12, 0.04, 0.78, 0.5], facecolor='none')\n", + "else:\n", + " ax_legend = fig.add_subplot([0.12, 0.02, 0.78, 0.5], facecolor='none')\n", + "ax_legend.axis(\"off\")\n", + "\n", + "label_names = [manual_ab_names[name] for name, num in all_ab_names.items()]\n", + "legend_handles = [\n", + " Line2D([0], [0], color=abundle_cmap(num), lw=4, label=f\"{label_names[ai]}\") for ai, (name, num) in enumerate(all_ab_names.items())\n", + "]\n", + "ax_legend.legend(handles=legend_handles, fontsize=12, loc='lower left', ncols=4, title=\"Anatomical Bundles\", title_fontsize=16)\n", + "\n", + "cb = plot.draw_cbar(fig, cmap=cmaps[\"div_rb\"].reversed(), ax_pos=[0.65, 0.05, 0.22, 0.04], fontsize=12,\n", + " ticks=[0, 10], labels=[\"Sending\", \"Receiving\"])\n", + "cb.set_label(\"Bicommunity Streamlines and Networks\", fontsize=16, labelpad=-75)\n", + "\n", + "if not fast:\n", + " overlay_suffix = f\"-overlay{surf_overlay}\" if surf_overlay < 1 else \"\"\n", + " alpha_suffix = f\"-NAlpha\" if node_alpha else \"\"\n", + " fig.savefig(op.join(path_to_figures, f\"05-Bundle_summary-K{e_clust.max()}-Bicom{bicom_list}-max{maxoverlap}{overlay_suffix}{alpha_suffix}.png\"), dpi=300, bbox_inches='tight')\n", + " fig.savefig(op.join(path_to_figures, f\"05-Bundle_summary-K{e_clust.max()}-Bicom{bicom_list}-max{maxoverlap}{overlay_suffix}{alpha_suffix}.pdf\"), dpi=300, bbox_inches='tight', format=\"pdf\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6caf1796", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "5efcfc0a", + "metadata": {}, + "source": [ + "## Centroids Visualizations" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a5bab68b", + "metadata": {}, + "outputs": [], + "source": [ + "sel_id = 1\n", + "selected_bicom = sort_by_p[sel_id] + 1\n", + "print(f\"Bicom {selected_bicom} selected (rank {sel_id+1})\")\n", + "\n", + "fig, axes = plt.subplots(figsize=(10, 10))\n", + "\n", + "plot.plot_bicom_tracts(\n", + " selected_bicom,\n", + " edge_clusters_mat,\n", + " labels,\n", + " scale,\n", + " cmap=cmaps[\"div_rb\"],\n", + " view=\"ortho\",\n", + " linewidth=0.2,\n", + " slines_alpha=0.99,\n", + " n_centroids=5,\n", + " axes=axes,\n", + " fig=fig,\n", + " plot_cbar=True,)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96ec3de6", + "metadata": {}, + "outputs": [], + "source": [ + "sel_list = [3, 13]\n", + "\n", + "fig, axes = plt.subplots(ncols=len(sel_list), figsize=(8*len(sel_list), 8))\n", + "\n", + "for i, sel in enumerate(sel_list):\n", + "\n", + " asymm = sig_df.loc[sel-1, \"directionality\"]\n", + " axes[i].text(100, 100, f\"Bicom {sel} (asym: {asymm:1.2f})\", fontsize=20, ha=\"center\")\n", + "\n", + " e_mask = np.zeros_like(edge_clusters_mat)\n", + " if asymm < 0.5:\n", + " e_mask[edge_clusters_mat.T == sel] = sel\n", + " else:\n", + " e_mask[edge_clusters_mat == sel] = sel\n", + "\n", + " plot.plot_bicom_tracts(\n", + " sel,\n", + " e_mask,\n", + " labels,\n", + " scale,\n", + " cmap=cmaps[\"div_rb\"],\n", + " view=\"back\",\n", + " axes=axes[i],\n", + " fig=fig,\n", + " n_centroids=5,\n", + " plot_cbar=False,\n", + " overlay_slines=False,\n", + " brain_opacity=0.1,\n", + " slines_alpha=0.99,\n", + " linewidth=0.2,\n", + " upsample=upsample\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b3dd3178", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "dgsp", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/02-brain_bicommunities/brainbicom-Supplementary.ipynb b/notebooks/02-brain_bicommunities/brainbicom-Supplementary.ipynb new file mode 100644 index 0000000..5388fc8 --- /dev/null +++ b/notebooks/02-brain_bicommunities/brainbicom-Supplementary.ipynb @@ -0,0 +1,1061 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "377d8ade", + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import os.path as op\n", + "\n", + "import importlib\n", + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.lines import Line2D\n", + "from matplotlib.gridspec import GridSpecFromSubplotSpec\n", + "\n", + "# import nibabel as nib\n", + "# from nilearn import datasets, image\n", + "# from matplotlib.colors import LinearSegmentedColormap\n", + "# from scipy.optimize import linear_sum_assignment\n", + "# from scipy.spatial.distance import cdist\n", + "# from scipy.stats import spearmanr\n", + "# from seaborn import kdeplot\n", + "# import networkx as nx\n", + "# from time import perf_counter\n", + "\n", + "from scipy.cluster.hierarchy import linkage, fcluster\n", + "from scipy.spatial.distance import squareform\n", + "\n", + "from joblib import Parallel, delayed\n", + "from tqdm.notebook import tqdm\n", + "\n", + "\n", + "import sys\n", + "sys.path.append(\"../..\")\n", + "path_to_data = op.join(\"../..\", \"data\")\n", + "\n", + "from bimodularity import dgsp\n", + "from bimodularity import bimod_plots as plot\n", + "from bimodularity import palettes\n", + "from bimodularity import data_load as dload\n", + "from bimodularity import bundle as b_utils" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "92860878", + "metadata": {}, + "outputs": [], + "source": [ + "cmaps = plot.get_all_cmaps()\n", + "print(cmaps.keys())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "aaa38beb", + "metadata": {}, + "outputs": [], + "source": [ + "path_to_brain_data = op.join(\"../../data\", \"brain\")\n", + "path_to_bundles = op.join(path_to_brain_data, \"SCIL\")\n", + "\n", + "path_to_derivatives = op.join(\"../../data\", \"brain\", \"derivatives\")\n", + "\n", + "path_to_sc = op.join(path_to_derivatives, \"structural_connectome\")\n", + "path_to_ec = op.join(path_to_derivatives, \"atlas_correspondence\", \"rDCM\")\n", + "path_to_lobe = op.join(path_to_derivatives, \"atlas_correspondence\", \"Lobes\")\n", + "path_to_consensus = op.join(path_to_derivatives, \"consensus_clustering\")\n", + "\n", + "fast = False" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "59622dac", + "metadata": {}, + "outputs": [], + "source": [ + "all_scales = [1, 2, 3, 4]\n", + "\n", + "use_delay = False\n", + "k_threshold = 0\n", + "b_thresh = 0\n", + "slines_theshold = 5\n", + "\n", + "struct_type = \"\"\n", + "\n", + "scale = 2\n", + "\n", + "k_matrix, labels, node_centers = dload.load_bundle_graph(path_to_data=path_to_sc,\n", + " data_suffix=\"Laus2018_\",\n", + " scale=scale,\n", + " b_prob_threshold=0,\n", + " slines_theshold=slines_theshold,\n", + " log_slines=False,\n", + " normalize_slines=False,\n", + " verbose=True)\n", + "\n", + "_, node_centers = b_utils.fix_thalamus(labels, pos=node_centers)\n", + "labels, k_matrix = b_utils.fix_thalamus(labels, matrix=k_matrix)\n", + "order_by_lobe, lobe_sizes, lobe_labels, lobe_df = dload.get_lobe_info(scale, labels, path_to_lobe=path_to_lobe)" + ] + }, + { + "cell_type": "markdown", + "id": "7a26b8d6", + "metadata": {}, + "source": [ + "## Consensus Clustering" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d9a56d9e", + "metadata": {}, + "outputs": [], + "source": [ + "scale = 2\n", + "n_vec_max = 20\n", + "gamma = 1\n", + "\n", + "nosquared = False\n", + "\n", + "n_trials = 50\n", + "n_init = 50\n", + "dthresh = 0\n", + "selected_sort = 0\n", + "\n", + "upsample = 3\n", + "\n", + "all_n_kmeans = np.arange(10, 80, 1)\n", + "\n", + "bm_fname = \"_\".join([\n", + " f\"brain_consensus-EC\",\n", + " f\"scale{scale}\",\n", + " f\"nvec{n_vec_max}\" + \"-NoSquared\"*nosquared,\n", + " f\"trials{n_trials}\",\n", + " f\"ninit{n_init}\",\n", + " f\"kmeans{all_n_kmeans[0]}-{all_n_kmeans[-1]}\",\n", + " f\"slines_thresh{slines_theshold}\",\n", + " f\"ustruct{struct_type}\"*(struct_type != \"\"),\n", + " f\"dthresh{dthresh}\"*(dthresh != 0),\n", + " f\"gamma{gamma}\"*(gamma != 1),\n", + " f\"selected{selected_sort}\"*(selected_sort != 0)\n", + " ])\n", + "bm_fname += \".pkl\"\n", + "\n", + "if op.isfile(op.join(path_to_consensus, bm_fname)):\n", + " data = dload.load(op.join(path_to_consensus, bm_fname))\n", + " graph = data[\"graph\"]\n", + " all_n_kmeans = data[\"all_n_kmeans\"]\n", + " avg_cons = data[\"avg_cons\"]\n", + "else:\n", + " print(\"No benchmark file found - Please, run the benchmarking notebook!\")\n", + " print(f\"\\t`{bm_fname}`\")\n", + "\n", + "fig_suffix = f\"gamma{gamma}_nvec{n_vec_max}\" + \"-NoSquared\"*nosquared\n", + "path_to_figures = op.join(\"./supplementary\", f\"scale{scale}\", fig_suffix)\n", + "\n", + "os.makedirs(path_to_figures, exist_ok=True)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "117314a8", + "metadata": {}, + "outputs": [], + "source": [ + "centroid_dir = op.join(\n", + " path_to_brain_data, \"BundleAtlas\", \"centroids\",\n", + " f\"scale{scale}\", f\"group_centroids_scale{scale}\"\n", + ")\n", + "\n", + "a_bundles_labels = pd.read_csv(op.join(path_to_bundles, \"bundle_names.csv\"))\n", + "a_bundles_labels = a_bundles_labels.rename(columns={\"Unnamed: 0\": \"BundleNum\"})\n", + "a_bundles_labels.loc[:, \"BundleNameShort\"] = [lab.replace(\"_Brainstem\", \"_Bstm\") for lab in a_bundles_labels.loc[:, \"BundleName\"]]\n", + "\n", + "if \"edge_to_bundle_Bmdf\" in data:\n", + " edge_to_bundle_dist = data[\"edge_to_bundle_Bmdf\"]\n", + "else:\n", + " edge_to_bundle_dist = b_utils.compute_edge_to_bundle_distance(\n", + " graph, labels=labels, scale=scale,\n", + " path_to_edge_centroids=centroid_dir,\n", + " path_to_atlas_centroids=path_to_bundles, a_bundles_labels=a_bundles_labels\n", + " )\n", + "\n", + " data.update({\"edge_to_bundle_Bmdf\": edge_to_bundle_dist})\n", + " dload.save(op.join(path_to_consensus, bm_fname), data)" + ] + }, + { + "cell_type": "markdown", + "id": "236369b7", + "metadata": {}, + "source": [ + "## SI-DirectedConnectome" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b7ae3df8", + "metadata": {}, + "outputs": [], + "source": [ + "importlib.reload(plot)\n", + "# plot.plot_kde()\n", + "\n", + "fig, all_axes = plt.subplots(ncols=2, figsize=(12, 6), gridspec_kw={\"width_ratios\": [1, 1], \"wspace\": 0.3})\n", + "\n", + "all_axes[0].imshow(graph[order_by_lobe][:, order_by_lobe], cmap=cmaps[\"div_rb\"], interpolation=\"None\")\n", + "plot.plot_lobe_lines(all_axes[0], lobe_sizes, lobe_labels, fontsize=16)\n", + "\n", + "\n", + "all_axes[1].axis(\"off\")\n", + "gs = GridSpecFromSubplotSpec(3, 1, subplot_spec=all_axes[1].get_subplotspec(),\n", + " height_ratios=[0.5, 6, 1], hspace=0)\n", + "axes = [fig.add_subplot(gs[1])]*2\n", + "\n", + "nzer_mask = np.logical_or(graph > 0, (graph == 1).T)\n", + "plot.plot_kde(graph[nzer_mask], ax=axes[1], data_range=np.linspace(0, 1, 100),\n", + " bw_adjust=0.1, fill=True, color=cmaps[\"div_rb\"](0.8))\n", + "\n", + "med = np.median(graph[nzer_mask])\n", + "perc25 = np.percentile(graph[nzer_mask], 25)\n", + "perc75 = np.percentile(graph[nzer_mask], 75)\n", + "\n", + "iszer = np.logical_and(graph < 0.01, k_matrix > 0)\n", + "iszer = np.logical_and(graph.T != 0, iszer)\n", + "isone = graph > 0.99 \n", + "\n", + "print(\"N Edges\", (graph > 0).sum())\n", + "\n", + "med_text = f\"{(np.abs(graph - 0.5) < 1e-2).sum():d} edges are close to 0.5\\n$(0.49 < a_{{ij}} < 0.51)$\"\n", + "axes[1].text(0.8, 0.95, med_text, ha=\"center\", va=\"top\")\n", + "\n", + "dir_text = f\"{iszer.sum():d} edges are close to 1\\n({100*iszer.sum()/(graph > 0).sum():1.3f}%)\"\n", + "axes[1].text(0.8, 0.5, dir_text, ha=\"center\", va=\"top\")\n", + "\n", + "axes[1].plot([med]*2, [0, 1], color=\"k\", lw=2)\n", + "axes[1].plot([perc25]*2, [0, 0.6], color=\"k\", ls=\":\", lw=2)\n", + "axes[1].plot([perc75]*2, [0, 0.6], color=\"k\", ls=\":\", lw=2)\n", + "\n", + "plot.plot_kde(graph[nzer_mask], ax=axes[1], data_range=np.linspace(0, 1, 100),\n", + " bw_adjust=0.1, fill=False, color=cmaps[\"div_rb\"](0.8))\n", + "\n", + "axes[1].text(med, 1, f\"Median\\n({med:.2f})\", fontsize=14, ha=\"center\", va=\"bottom\")\n", + "axes[1].text(perc25-0.02, 0.6, f\"Perc. 25\\n ({perc25:.2f})\", fontsize=14, ha=\"right\")\n", + "axes[1].text(perc75+0.02, 0.6, f\"Perc. 75\\n ({perc75:.2f})\", fontsize=14, ha=\"left\")\n", + "\n", + "axes[1].spines[[\"top\", \"right\"]].set_visible(False)\n", + "axes[1].spines[:].set_linewidth(2)\n", + "\n", + "axes[1].set_xlabel(\"Edge weight (Asymmetry)\", fontsize=16)\n", + "axes[1].set_ylabel(\"Density\", fontsize=16)\n", + "axes[1].tick_params(axis=\"both\", which=\"major\", labelsize=14)\n", + "\n", + "axes[1].set_xlim(0, 1)\n", + "axes[1].set_ylim(0, 1.1)\n", + "\n", + "all_axes[0].text(-0.2, 1, \"A.\", fontsize=16, fontweight=\"bold\", transform=all_axes[0].transAxes)\n", + "all_axes[0].text(1.2, 1, \"B.\", fontsize=16, fontweight=\"bold\", transform=all_axes[0].transAxes)\n", + "\n", + "_, _, cbar = plot.add_cbar(fig, ax=all_axes[0])\n", + "cbar.ax.set_yticks([0, 0.5, 1], labels=[\"0\", \"Bidirectional\", \"1\"], rotation=90, va=\"center\", fontsize=14)\n", + "\n", + "fig.savefig(op.join(path_to_figures, f\"SI-DirectedConnectome.png\"), dpi=300, bbox_inches='tight')\n", + "fig.savefig(op.join(path_to_figures, f\"SI-DirectedConnectome.pdf\"), dpi=300, bbox_inches='tight', format=\"pdf\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "010d53a8", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "fcda4b4e", + "metadata": {}, + "source": [ + "## SI-EdgeClusters" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "98b56fa2", + "metadata": {}, + "outputs": [], + "source": [ + "hierarchical_matrix = 1 - avg_cons\n", + "# hierarchical_matrix = 1 - avg_cons_fix\n", + "c_mat = 1 - hierarchical_matrix\n", + "\n", + "dist_condensed = squareform(hierarchical_matrix)\n", + "Z = linkage(dist_condensed, method='average', metric='precomputed')\n", + "distances = np.flip(Z[:, 2])\n", + "diff_dist = -np.diff(distances)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ada7123f", + "metadata": {}, + "outputs": [], + "source": [ + "from scipy.cluster.hierarchy import linkage, fcluster\n", + "from scipy.spatial.distance import squareform\n", + "from scipy.signal import argrelextrema\n", + "\n", + "n_samples = len(hierarchical_matrix)\n", + "\n", + "# Number of clusters K decreases from n_samples to 1\n", + "n_clusters = np.arange(10, 100, 1)\n", + "n_clusters = np.arange(5, 81, 1)\n", + "\n", + "# precompute pair indices for condensed vector\n", + "p_idx, q_idx = np.triu_indices(n_samples, k=1)\n", + "\n", + "best_k = np.argmax(diff_dist)+1\n", + "print(f\"Best k is at max diff: {best_k} with distance jump {diff_dist[best_k-1]:.4f}\")\n", + "\n", + "all_ratios = np.zeros(len(n_clusters))\n", + "for i, k in enumerate(n_clusters):\n", + " labs = fcluster(Z, t=k, criterion='maxclust')\n", + "\n", + " pair_same = (labs[p_idx] == labs[q_idx])\n", + " within_val = 1 - dist_condensed[pair_same]\n", + " between_val = 1 - dist_condensed[~pair_same]\n", + "\n", + " within_mean = within_val[within_val > 0].mean()\n", + " if len(between_val[between_val > 0]) == 0:\n", + " print(\"Oopsie\")\n", + " all_ratios[i] = np.nan\n", + " continue\n", + " else:\n", + " between_mean = between_val[between_val > 0].mean()\n", + "\n", + " all_ratios[i] = within_mean / between_mean\n", + "\n", + "all_ratios = np.nan_to_num(all_ratios, nan=np.nanmax(all_ratios))\n", + "\n", + "local_max_idx = argrelextrema(diff_dist, np.greater)[0]\n", + "ordered_maximas = local_max_idx[np.flip(np.argsort(diff_dist[local_max_idx]))]\n", + "\n", + "print(\"Top 10 largest jumps in distance:\")\n", + "best_ks = []\n", + "best_cuts = []\n", + "for i, top10 in enumerate(ordered_maximas[:10]):\n", + " print(f\" -{i+1:02d}: K = {top10+2},\\tdist: {diff_dist[top10]:.4f}, \\tcut: {distances[top10]:.4f}\")\n", + " best_ks.append(top10+2)\n", + " best_cuts.append(distances[top10])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "92e4ffc4", + "metadata": {}, + "outputs": [], + "source": [ + "importlib.reload(dgsp)\n", + "importlib.reload(plot)\n", + "\n", + "show_consensus = True\n", + "n_samples = len(hierarchical_matrix)\n", + "p_idx, q_idx = np.triu_indices(n_samples, k=1)\n", + "\n", + "n_top_k = 10\n", + "ncols = n_top_k // 2\n", + "fig, all_axes = plt.subplots(nrows=2, ncols=ncols, figsize=(5*ncols, 11))\n", + "all_axes = all_axes.flatten()\n", + "\n", + "cut_dist = distances[:-1] - diff_dist/2\n", + "selected_cuts = np.flip(sorted(cut_dist))\n", + "\n", + "kept_e_labels = []\n", + "for i, axes_bc in enumerate(all_axes):\n", + " dist = selected_cuts[ordered_maximas[i]]\n", + " e_labels = fcluster(Z, t=dist, criterion='distance')\n", + " e_mat = np.zeros_like(graph, dtype=int)\n", + " e_mat[graph != 0] = e_labels\n", + "\n", + " if i < 3:\n", + " kept_e_labels.append(e_labels)\n", + "\n", + " cluster_cmap = cmaps[\"extended_ncar\"].resampled(e_labels.max()+1)\n", + " axes_bc.imshow(e_mat[order_by_lobe][:, order_by_lobe], cmap=cluster_cmap, vmin=0, vmax=len(np.unique(e_labels))+1, interpolation=\"none\")\n", + " plot.plot_lobe_lines(axes_bc, lobe_sizes, lobe_labels, no_insula=True, x_hemi=True, fontsize=14)\n", + " \n", + " if i not in [0, ncols]:\n", + " axes_bc.set_yticks([])\n", + " \n", + " title_y = 1.1\n", + " if i >= ncols:\n", + " axes_bc.set_xticks([])\n", + " title_y = 1\n", + "\n", + " if show_consensus:\n", + " pair_same = (e_labels[p_idx] == e_labels[q_idx])\n", + " within_val = 1 - dist_condensed[pair_same]\n", + " between_val = 1 - dist_condensed[~pair_same]\n", + "\n", + " within_mean = within_val[within_val > 0].mean()\n", + " if len(between_val[between_val > 0]) == 0:\n", + " print(\"Oopsie\")\n", + " cons_ratio = np.nan\n", + " continue\n", + " else:\n", + " between_mean = between_val[between_val > 0].mean()\n", + "\n", + " cons_ratio = within_mean / between_mean\n", + " \n", + " axes_bc.set_title(f\"$K = {e_mat.max():d}$ Bicommunities\\n\"+\n", + " f\"Linkage Distance: {diff_dist[ordered_maximas[i]]:.3f}\\n\"+\n", + " f\"Consensus Ratio: {cons_ratio:.3f}\", fontsize=16, y=title_y)\n", + " else:\n", + " axes_bc.set_title(f\"$K = {e_mat.max():d}$ Bicommunities\\nLinkage Distance: {diff_dist[ordered_maximas[i]]:.3f}\", fontsize=16, y=title_y)\n", + "\n", + "consensus_suffix = \"_WithConsensus\" * show_consensus\n", + "fig.savefig(op.join(path_to_figures, f\"SI-EdgeClusters{consensus_suffix}.png\"), dpi=300, bbox_inches='tight')\n", + "fig.savefig(op.join(path_to_figures, f\"SI-EdgeClusters{consensus_suffix}.pdf\"), dpi=300, bbox_inches='tight', format=\"pdf\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ba1e556a", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "745a6aa3", + "metadata": {}, + "source": [ + "## SI-DirSignificance" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "11661466", + "metadata": {}, + "outputs": [], + "source": [ + "importlib.reload(dgsp)\n", + "\n", + "compute_all = False\n", + "\n", + "n_shuffle = 10000\n", + "print(f\"Max p-val: {1 / (1 + n_shuffle)}\")\n", + "print(f\"Max corr p-val (k=80): {80 / (1 + n_shuffle)}\")\n", + "perm_prop = 0.5\n", + "\n", + "all_shuffled = dgsp.shuffle_edges_sym(graph, perm_prop=perm_prop, n_shuffle=n_shuffle)\n", + "\n", + "shuffled_asym = [np.divide(shuffled, (shuffled + shuffled.T),\n", + " where=(shuffled + shuffled.T) > 0,\n", + " out=np.zeros_like(shuffled)) for shuffled in all_shuffled]\n", + "\n", + "all_sig_props = np.zeros(len(n_clusters))\n", + "\n", + "kept_ks = [elab.max() for elab in kept_e_labels]\n", + "all_sig_dfs = []\n", + "\n", + "parallel = Parallel(n_jobs=14, return_as=\"generator\")\n", + "\n", + "if compute_all:\n", + " counter = tqdm(total=len(n_clusters)*n_shuffle)\n", + "else:\n", + " counter = tqdm(total=len(kept_ks)*n_shuffle)\n", + "\n", + "save_perm = False\n", + "# path_to_saveperm = f\"./results/BrainKmeans/scale{scale}/permutations\"\n", + "path_to_saveperm = op.join(path_to_derivatives, \"permutations\", f\"scale{scale}\")\n", + "\n", + "for k_i, k in enumerate(n_clusters):\n", + " if (k not in kept_ks) and (not compute_all):\n", + " continue\n", + "\n", + " e_clust = fcluster(Z, t=k, criterion='maxclust')\n", + " edge_clusters_mat = np.zeros_like(graph, dtype=int)\n", + " edge_clusters_mat[graph != 0] = e_clust\n", + "\n", + " # bicoms_masks = np.array([edge_clusters_mat == (i+1) for i in range(edge_clusters_mat.max())])\n", + " bicoms_masks = np.array([e_clust == (i+1) for i in range(e_clust.max())])\n", + " # true_ratio = dgsp.get_conjugate_ratio(graph, row_ind=row_ind, col_ind=col_ind, bicom_masks=bicoms_masks)\n", + " graph_asym = np.divide(graph, (graph + graph.T), where=(graph + graph.T) > 0, out=np.zeros_like(graph))\n", + " true_ratio = dgsp.get_asym_ratio(graph_asym[graph > 0], bicom_masks=bicoms_masks)\n", + "\n", + " fname = f\"Dir-permutations_scale{scale}_gamma{gamma}-{n_shuffle}Perm-K{edge_clusters_mat.max()}\"\n", + " fname += \"_RatioOnly\"\n", + " fname += \".pkl\"\n", + " # print(f\"Savename is {fname}\")\n", + "\n", + " if op.isfile(op.join(path_to_saveperm, fname)):\n", + " print(\"Loading existing permutations...\")\n", + " perm_data = dload.load(op.join(path_to_saveperm, fname))\n", + " # all_shuffled = perm_data[\"all_shuffled\"]\n", + " all_ratios_sym = perm_data[\"all_ratios_sym\"]\n", + " else:\n", + " all_ratios_sym = np.zeros((n_shuffle, len(true_ratio)))\n", + " \n", + " mygen = parallel(delayed(dgsp.get_asym_ratio)(shuffled_asym[s_i][graph > 0], bicom_masks=bicoms_masks) for s_i in range(n_shuffle))\n", + " \n", + " for g_i, res in enumerate(mygen):\n", + " all_ratios_sym[g_i] = res\n", + " counter.update(1)\n", + "\n", + " all_ratios_sym = np.nan_to_num(all_ratios_sym, nan=0.5)\n", + "\n", + " if save_perm and (not compute_all):\n", + " dload.save(\n", + " op.join(path_to_saveperm, fname),\n", + " {\n", + " # \"all_shuffled\": all_shuffled,\n", + " \"all_ratios_sym\": all_ratios_sym\n", + " }\n", + " )\n", + "\n", + " all_ps = np.ones_like(true_ratio)\n", + " for i, t in enumerate(true_ratio):\n", + " # biggersum = np.sum(np.abs(all_ratios_sym[:, i] - all_ratios_sym[:, i].mean()) >= abs(t - all_ratios_sym[:, i].mean()))\n", + " biggersum = np.sum(np.abs(all_ratios_sym[:, i] - 0.5) >= abs(t - 0.5))\n", + " p_two = (1 + biggersum) / (1 + n_shuffle)\n", + " all_ps[i] = p_two\n", + "\n", + " sig_df = pd.DataFrame({\n", + " \"Bicomm_ID\": np.arange(1, len(true_ratio)+1),\n", + " \"directionality\": true_ratio,\n", + " \"abs_dir\": np.abs(true_ratio - 0.5),\n", + " \"p_value\": all_ps,\n", + " \"p_corr\": all_ps * len(all_ps)\n", + " })\n", + "\n", + " sig_df[\"is_sig\"] = sig_df[\"p_corr\"] < 0.05\n", + " sig_df.sort_values([\"is_sig\", \"abs_dir\"], ascending=[False, False], inplace=True)\n", + "\n", + " all_sig_props[k_i] = sig_df.is_sig.values.sum() / len(sig_df)\n", + "\n", + " if k in kept_ks:\n", + " all_sig_dfs.append(sig_df)\n", + "\n", + "counter.close()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9fa8900f", + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib import patheffects as PathEffects\n", + "\n", + "if compute_all:\n", + " fig, axes = plt.subplots(nrows=3, figsize=(12, 8), gridspec_kw={\"hspace\": 0.2}, sharex=True)\n", + "\n", + " axes[0].plot(n_clusters, diff_dist[n_clusters[0]-2:n_clusters[-1]-1], color=\"grey\", lw=2, marker='o', markersize=4, zorder=2)\n", + " axes[1].plot(n_clusters, all_ratios, color=\"grey\", lw=2, marker='o', markersize=4, zorder=2)\n", + " axes[2].plot(n_clusters, all_sig_props, color=\"grey\", lw=2, marker='o', markersize=4, zorder=2)\n", + "\n", + " legend_handles = [\n", + " Line2D([0], [0], color='tab:red', lw=4, label='Top 3', zorder=1),\n", + " Line2D([0], [0], color='tab:blue', lw=4, alpha=0.8, label='Top 10', zorder=2)\n", + " ]\n", + " for ax in axes:\n", + " for kept_k in ordered_maximas[:10]:\n", + " ax.axvline(kept_k + 2, color='tab:blue', lw=3, zorder=0, alpha=0.8)\n", + "\n", + " for kept_k in kept_ks:\n", + " ax.axvline(kept_k, color='tab:red', lw=3, zorder=1)\n", + " \n", + " txt = ax.text(kept_k+0.5, ax.get_ylim()[1]*0.9, f\"$K={kept_k}$\", fontsize=12)\n", + " txt.set_path_effects([PathEffects.withStroke(linewidth=2, foreground='white', alpha=0.8)])\n", + "\n", + "\n", + " ax.tick_params(labelsize=12)\n", + " ax.legend(handles=legend_handles, fontsize=14)\n", + "\n", + " # ax.set_xlim(5.5, 69.5)\n", + "\n", + " axes[2].set_xlabel(\"Number of Bicommunities $(K)$\", fontsize=16)\n", + " axes[0].set_title(\"Linkage Distance\", fontsize=14)\n", + " axes[0].set_ylabel(\"Distance\", fontsize=14)\n", + " axes[1].set_title(\"Consensus Stability\", fontsize=14)\n", + " axes[1].set_ylabel(\"Consensus Ratio\", fontsize=14)\n", + " axes[2].set_title(\"Significantly Asymmetric Bicommunities\", fontsize=14)\n", + " axes[2].set_ylabel(\"Proportion of\\nBicommunities\", fontsize=14)\n", + "\n", + " fig.savefig(op.join(path_to_figures, f\"SI-DirSignificance.png\"), dpi=300, bbox_inches='tight')\n", + " fig.savefig(op.join(path_to_figures, f\"SI-DirSignificance.pdf\"), dpi=300, bbox_inches='tight', format=\"pdf\")" + ] + }, + { + "cell_type": "markdown", + "id": "4bd8d333", + "metadata": {}, + "source": [ + "## SI-BundleOverlap" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ea244a4c", + "metadata": {}, + "outputs": [], + "source": [ + "n_yeo = 7\n", + "# n_yeo = 17\n", + "\n", + "path_to_yeo_corr = op.join(path_to_derivatives, \"atlas_correspondence\", \"YeoNetworks\")\n", + "corr_fname = f\"Laus2018_Yeo{n_yeo}-scale{scale}OneThal.pkl\"\n", + "\n", + "yeo_corr = dload.load(os.path.join(path_to_yeo_corr, corr_fname))\n", + "\n", + "corr_mat = yeo_corr[\"dice\"]\n", + "yeo_labels = yeo_corr[\"labels\"]\n", + "\n", + "if n_yeo == 7:\n", + " yeo_colors_dict = {\n", + " \"Visual\": \"#781286\",\n", + " \"Somatomotor\": \"#4682B4\",\n", + " \"Dorsal Attention\": \"#00760E\",\n", + " \"Ventral Attention\": \"#C43AFA\",\n", + " \"Limbic\": \"#DC6D04\",\n", + " \"Frontoparietal\": \"#E69422\",\n", + " \"Default\": \"#CD3E4E\",\n", + " \"Subcortical\": \"#6D0500\",\n", + " }\n", + " yeo_colors = [yeo_colors_dict[label] for label in yeo_labels]\n", + "\n", + "else:\n", + " yeo_colors = [\n", + " \"#781286\", \"#9B4F96\",\n", + " \"#4682B4\", \"#5AA0D6\",\n", + " \"#00760E\", \"#4FAF4A\",\n", + " \"#C43AFA\", \"#E89CF4\",\n", + " \"#DC6D04\", \"#F2A541\",\n", + " \"#E69422\", \"#F6C85F\", \"#FFD92F\",\n", + " \"#CD3E4E\", \"#E57373\", \"#F28E8E\",\n", + " \"#8E2F2F\", \"#6D0500\",\n", + " ]\n", + "\n", + "# Abrev. of networks\n", + "yeo_labels[2] = \"Dorsal Attn.\"\n", + "yeo_labels[3] = \"Ventral Attn.\"\n", + "\n", + "\n", + "s_e_labels = kept_e_labels[0]\n", + "sig_df = all_sig_dfs[2]\n", + "\n", + "print(s_e_labels.max(), \"edge bicommunities found at K =\", kept_ks[1])\n", + "print(len(sig_df), \"bicomm significance assessed\")\n", + "\n", + "if len(sig_df) != s_e_labels.max():\n", + " raise ValueError(\"Warning: mismatch between sig_df and s_e_labels\")\n", + "\n", + "s_e_mat = np.zeros_like(edge_clusters_mat)\n", + "s_e_mat[edge_clusters_mat > 0] = s_e_labels\n", + "\n", + "cluster_cmap = cmaps[\"extended_ncar\"].resampled(s_e_mat.max()+1)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1cf3402e", + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib.patches import Rectangle\n", + "\n", + "e_lab_one_hot = np.array([s_e_labels == k+1 for k in range(s_e_labels.max())]).astype(float)\n", + "e_lab_one_hot = e_lab_one_hot / e_lab_one_hot.sum(axis=1, keepdims=True)\n", + "e2b = edge_to_bundle_dist / edge_to_bundle_dist.sum(axis=1, keepdims=True)\n", + "\n", + "bicom_to_bundle = e_lab_one_hot @ e2b\n", + "\n", + "fig, axes_barplot = plt.subplots(figsize=(15, 8))\n", + "\n", + "e2b_max = e2b.max(axis=0)\n", + "b2b_max = bicom_to_bundle.max(axis=0)\n", + "\n", + "sort_by_overlap = np.argsort(b2b_max)[::-1]\n", + "\n", + "perc_thresh = 90\n", + "thresh = np.percentile(e2b, perc_thresh, axis=0)\n", + "overlap_mask = bicom_to_bundle >= thresh\n", + "\n", + "n_a_show = 51\n", + "\n", + "jitter_width = 0.4\n", + "for i, a_id in enumerate(sort_by_overlap[:n_a_show]):\n", + " x_scatter = np.random.uniform(-jitter_width, jitter_width, size=e2b[:, a_id].shape[0])\n", + " axes_barplot.scatter(i + x_scatter, e2b[:, a_id], color=\"gray\", alpha=0.1, s=5, edgecolors=\"none\")\n", + " axes_barplot.plot([i - jitter_width, i + jitter_width], [thresh[a_id]]*2, color=\"k\", lw=2, zorder=5)\n", + " \n", + " x_scatter = np.random.uniform(-jitter_width, jitter_width, size=bicom_to_bundle[:, a_id].shape[0])\n", + " \n", + " sort_bicom = np.flip(np.argsort(bicom_to_bundle[:, a_id]))\n", + " sort_bicom = sort_bicom[:3]\n", + " full_width = 0.7\n", + " width = full_width/sort_bicom.size\n", + " axes_barplot.bar(i - np.linspace(0.42-width/2, width/2-0.42, sort_bicom.size),\n", + " bicom_to_bundle[sort_bicom, a_id], width=width, color=cluster_cmap(sort_bicom), alpha=0.6, zorder=3)\n", + " axes_barplot.bar(i - np.linspace(0.42-width/2, width/2-0.42, sort_bicom.size),\n", + " bicom_to_bundle[sort_bicom, a_id], width=width, color=\"none\", edgecolor=cluster_cmap(sort_bicom), lw=1, zorder=4)\n", + "\n", + "legend_handles = [Line2D([0], [0], marker='o', color='w', label=f'Edge Similarity', markerfacecolor='gray', markersize=5),\n", + " Line2D([0], [0], color='k', lw=3, label=f'Edge {perc_thresh}th Percentile Threshold'),\n", + " Rectangle((0, 0), 1, 1, facecolor=cluster_cmap(6), edgecolor=cluster_cmap(6), lw=1, alpha=0.6, label='Bicommunity Similarity (top 3)')]\n", + "\n", + "axes_barplot.legend(handles=legend_handles, fontsize=14, loc='upper right')\n", + "\n", + "axes_barplot.set_xticks(np.arange(n_a_show), labels=a_bundles_labels[\"BundleNameShort\"][sort_by_overlap[:n_a_show]],\n", + " rotation=90, fontsize=10, ha=\"center\")\n", + "\n", + "axes_barplot.set_ylim(0, 1.2*b2b_max.max())\n", + "axes_barplot.set_xlim(-1, n_a_show)\n", + "axes_barplot.set_ylabel(\"Inverse MDF Distance\", fontsize=16)\n", + "axes_barplot.set_title(\"Similarity with Anatomical Bundles\", fontsize=16)\n", + "axes_barplot.tick_params(labelsize=14, width=2)\n", + "\n", + "axes_barplot.spines[[\"top\", \"right\"]].set_visible(False)\n", + "axes_barplot.spines[:].set_linewidth(2)\n", + "\n", + "fig.savefig(op.join(path_to_figures, f\"SI-BundleOverlap-K{s_e_labels.max()}-p{perc_thresh}.png\"), dpi=300, bbox_inches='tight')\n", + "fig.savefig(op.join(path_to_figures, f\"SI-BundleOverlap-K{s_e_labels.max()}-p{perc_thresh}.pdf\"), dpi=300, bbox_inches='tight', format=\"pdf\")" + ] + }, + { + "cell_type": "markdown", + "id": "82296a4c", + "metadata": {}, + "source": [ + "## SI-AnatomicalBicom" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "12411bab", + "metadata": {}, + "outputs": [], + "source": [ + "importlib.reload(plot)\n", + "path_to_centroids = op.join(path_to_bundles, \"atlas\", \"pop_average\")\n", + "\n", + "label_space = 1.2\n", + "width_mod = 4\n", + "maxoverlap = 4\n", + "surf_overlay = 0.1\n", + "node_alpha = True\n", + "\n", + "ncols = 5\n", + "nrows = np.ceil(s_e_labels.max() / ncols).astype(int)\n", + "n_nodes = graph.shape[0]\n", + "\n", + "fig, axes = plt.subplots(ncols=ncols, nrows=nrows, figsize=(10*ncols, 3*nrows),\n", + " gridspec_kw={'wspace':0.02, 'hspace':0})\n", + "axes = axes.flatten()\n", + "\n", + "for ax in axes:\n", + " ax.axis(\"off\")\n", + "\n", + "maxoverlaps = [maxoverlap]*s_e_labels.max()\n", + "\n", + "manual_ab_names = {\n", + " 'AC': \"Anterior Commissure\",\n", + " 'AF': \"Arcuate Fasciculus\",\n", + " 'CC_Oc': \"Corpus Callosum Occipital\",\n", + " 'CC_Te': \"Corpus Callosum Temporal\",\n", + " 'CC_Pa': \"Corpus Callosum Parietal\",\n", + " 'CC_Fr_1': \"Corpus Callosum Front. 1\",\n", + " 'CC_Fr_2': \"Corpus Callosum Front. 2\",\n", + " 'CC_Pr_Po': \"Corpus Callosum Post.\",\n", + " 'CG': \"Cingulum\",\n", + " 'CG_An': \"Cingulum Ant.\",\n", + " 'CG_Po': \"Cingulum Post.\",\n", + " 'CG_curve': \"Cingulum Curve\",\n", + " 'FAT': \"Front. Aslant Tract\",\n", + " 'FPT': \"Fronto-pontine tract\",\n", + " 'FPT_Brainstem': \"Fronto-pontine & Brainstem\",\n", + " 'FX': \"Fornix\",\n", + " 'ILF': \"Inf. Long. Fasciculus\",\n", + " 'MdLF': \"Middle Long. Fasciculus\",\n", + " 'OR_ML': \"Optic Radiation\",\n", + " 'PYT': \"Pyramidal tract\",\n", + " 'PYT_Brainstem': \"Pyramidal & Brainstem\",\n", + " 'SLF': \"Sup. Long. Fasciculus\",\n", + " 'UF': \"Uncinate Fasciculus\"\n", + " }\n", + "\n", + "n_abundle = len(manual_ab_names)\n", + "abundle_cmap = cluster_cmap.resampled(n_abundle + 1)\n", + "all_ab_names = {}\n", + "for ax_i in np.arange(s_e_labels.max()):\n", + " # if ax_i > 1:\n", + " # if ax_i < s_e_labels.max() - 3:\n", + " # continue\n", + " # for i, a_id in enumerate(sort_by_overlap[:n_a_show]):\n", + "\n", + " bic_id = ax_i\n", + " best_ab = np.flip(np.argsort(bicom_to_bundle[bic_id]))\n", + " \n", + " ab_names = []\n", + "\n", + " last_overlap = 0\n", + " n_overlap = 0\n", + " for ab_i, ab in enumerate(best_ab):\n", + " ab_name = a_bundles_labels.loc[ab, \"BundleName\"]\n", + "\n", + " if last_overlap == 0:\n", + " last_overlap = bicom_to_bundle[bic_id, ab]\n", + "\n", + " if (bicom_to_bundle[bic_id, ab] < 0.75 * last_overlap) or (bicom_to_bundle[bic_id, ab] < 0.5 * bicom_to_bundle[:, ab].max()) or (n_overlap >= maxoverlaps[ax_i]):\n", + " break\n", + " else:\n", + " last_overlap = bicom_to_bundle[bic_id, ab]\n", + " ab_names.append(ab_name)\n", + " n_overlap += 1\n", + "\n", + " ab_name_nolat = ab_name.replace(\"_L\", \"\").replace(\"_R\", \"\")\n", + " if ab_name_nolat not in all_ab_names.keys():\n", + " all_ab_names.update({ab_name_nolat: len(all_ab_names.keys()) + 1})\n", + " \n", + " stripednames = [name.replace(\"_L\", \"\").replace(\"_R\", \"\") for name in ab_names]\n", + " color_idxs = [all_ab_names[name] for name in stripednames]\n", + "\n", + " colors = np.array([abundle_cmap(idx) for idx in color_idxs])\n", + " path_to_trk = [op.join(path_to_centroids, f\"{name.replace(' ', '_')}.trk\") for name in ab_names]\n", + "\n", + " is_sig = sig_df.loc[sig_df['Bicomm_ID'] == bic_id + 1, 'is_sig'].values[0]\n", + " asymmetry = sig_df.loc[sig_df['Bicomm_ID'] == bic_id + 1, 'directionality'].values[0]\n", + "\n", + " e_clust_mask = np.zeros_like(s_e_mat)\n", + " e_clust_mask[s_e_mat == bic_id + 1] = 1\n", + "\n", + " subnet_mask = corr_mat @ e_clust_mask @ corr_mat.T\n", + "\n", + " asymmetry = sig_df.loc[sig_df['Bicomm_ID'] == bic_id + 1, 'directionality'].values[0]\n", + "\n", + " if asymmetry < 0.5:\n", + " subnet_mask = subnet_mask.T\n", + " e_clust_mask = e_clust_mask.T\n", + "\n", + " is_sig = sig_df.loc[sig_df['Bicomm_ID'] == bic_id + 1, 'is_sig'].values[0]\n", + "\n", + " if not is_sig:\n", + " e_clust_mask += e_clust_mask.T\n", + " e_clust_mask[e_clust_mask > 0] = 1\n", + "\n", + " subnet_mask = (subnet_mask + subnet_mask.T)/2\n", + "\n", + " if len(ab_names) > 4:\n", + " ab_name = \", \".join(ab_names[:4]) + \"\\n\" + \", \".join(ab_names[4:]) \n", + " else:\n", + " ab_name = \" , \".join(ab_names)\n", + "\n", + " # title = f\"#{bic_id + 1} - {ab_name}\" + (\" $(*)$\" if is_sig else \"\")\n", + " # axes[ax_i].set_title(title, fontsize=20, zorder=3, y=1)\n", + " axes[ax_i].axis(\"off\")\n", + " \n", + " gs = GridSpecFromSubplotSpec(1, 3, axes[ax_i].get_subplotspec(), width_ratios=[1, 1, 1.1], wspace=0)\n", + " sub_axes = [fig.add_subplot(gs[i]) for i in range(3)]\n", + " \n", + " # sub_axes[0].text(0, 0.9, f\"{ascii_uppercase[ax_i]}.\", fontsize=16, transform=sub_axes[0].transAxes)\n", + " sub_axes[0].text(0, 0.9, f\"#{ax_i+1:d}\", fontsize=16, transform=sub_axes[0].transAxes)\n", + "\n", + " RR = e_clust_mask[:n_nodes//2][:, :n_nodes//2]\n", + " LL = e_clust_mask[n_nodes//2:-1][:, n_nodes//2:-1]\n", + " LR = e_clust_mask[:n_nodes//2][:, n_nodes//2:-1] \n", + " RL = e_clust_mask[n_nodes//2:-1][:, :n_nodes//2]\n", + "\n", + " between_hemi = (LR + RL).sum() > (LL + RR).sum()\n", + " if between_hemi:\n", + " myview = \"tra\"\n", + " # if e_clust_mask[:, -1].sum() + e_clust_mask[-1].sum() > 0:\n", + " # myview = \"back\"\n", + " else:\n", + " if LL.sum() > RR.sum():\n", + " myview = \"left\"\n", + " else:\n", + " myview = \"right\"\n", + "\n", + " # if ax_i > s_e_labels.max() - 2:\n", + " if not fast:\n", + " # Tracks\n", + " plot.plot_trk(path_to_trk, cmap=cmaps[\"div_rb\"], upsample=None, n_slines=500,\n", + " brain_opacity=surf_overlay, overlay_slines=surf_overlay < 1,\n", + " trk_color_list=colors,\n", + " view=myview, linewidth=0.3, slines_alpha=1, axes=sub_axes[0])\n", + "\n", + " # Bicom\n", + " axpos = sub_axes[1].get_position()\n", + " cbar_pos = np.array(axpos.bounds)\n", + " cbar_pos[0] += cbar_pos[2] * 0.1\n", + " cbar_pos[2] *= 0.8\n", + " cbar_pos[1] += cbar_pos[3] * 0.2\n", + " cbar_pos[3] = 0.01\n", + " plot.plot_bicom_tracts(1, e_clust_mask, labels, scale=2, cmap=cmaps[\"div_rb\"], n_centroids=5,\n", + " brain_opacity=surf_overlay, overlay_slines=surf_overlay < 1,\n", + " linewidth=0.3, slines_alpha=1 - 0.01 * is_sig, bidir_col=(0.6, 0.6, 0.6, 1),\n", + " view=myview, axes=sub_axes[1], upsample=upsample,\n", + " fig=fig, plot_cbar=False, cbar_pos=cbar_pos, cbar_fontsize=14)\n", + " # Networks\n", + " sub_axes[2].axis(\"off\")\n", + " sub_axes[2] = plot.plot_yeo_summary(subnet_mask, yeo_labels, cmap=cmaps[\"div_rb_silver\"], axes=sub_axes[2],\n", + " width_mod=1, r_lab_only=True, manual_arrows=True, net_alpha=node_alpha)\n", + "\n", + " if ax_i < 3:\n", + " sub_axes[0].set_title(\"Anatomical\\nBundles\", fontsize=14)\n", + " sub_axes[1].set_title(\"Bicommunity\\nStreamlines\", fontsize=14)\n", + " sub_axes[2].set_title(\"Network\\nRepresentation\", fontsize=14)\n", + "\n", + "ax_legend = fig.add_subplot([0.12, 0.06, 0.78, 0.5], facecolor='none')\n", + "ax_legend.axis(\"off\")\n", + "\n", + "label_names = [manual_ab_names[name] for name, num in all_ab_names.items()]\n", + "legend_handles = [\n", + " # Line2D([0], [0], color=abundle_cmap(num), lw=4, label=f\"{name}\") for name, num in all_ab_names.items()\n", + " Line2D([0], [0], color=abundle_cmap(num), lw=4, label=f\"{label_names[ai]}\") for ai, (name, num) in enumerate(all_ab_names.items())\n", + "]\n", + "# ax_legend.legend(handles=legend_handles, fontsize=12, loc='lower left', ncols=3, title=\"Anatomical Bundles\", title_fontsize=16)\n", + "ax_legend.legend(handles=legend_handles, fontsize=12, loc='lower left', ncols=8, title=\"Anatomical Bundles\", title_fontsize=16)\n", + "\n", + "# cb = plot.draw_cbar(fig, cmap=cmaps[\"div_rb\"], ax_pos=[0.4, 0.03, 0.22, 0.05], fontsize=12)\n", + "cb = plot.draw_cbar(fig, cmap=cmaps[\"div_rb\"].reversed(), ax_pos=[0.625, 0.076, 0.25, 0.02], fontsize=12,\n", + " ticks=[0, 10], labels=[\"Sending\", \"Receiving\"])\n", + "cb.set_label(\"Bicommunity Streamlines and Networks\", fontsize=16, labelpad=-70)\n", + "\n", + "if not fast:\n", + " overlay_suffix = f\"-overlay{surf_overlay}\" if surf_overlay < 1 else \"\"\n", + " # alpha_suffix = f\"-NAlpha\" if node_alpha else \"\"\n", + " fig.savefig(op.join(path_to_figures, f\"SI-AnatomicalBicom-WIDE-K{s_e_labels.max()}-max{maxoverlap}{overlay_suffix}.png\"), dpi=300, bbox_inches='tight')\n", + " fig.savefig(op.join(path_to_figures, f\"SI-AnatomicalBicom-WIDE-K{s_e_labels.max()}-max{maxoverlap}{overlay_suffix}.pdf\"), dpi=300, bbox_inches='tight', format=\"pdf\")" + ] + }, + { + "cell_type": "markdown", + "id": "f5ba0d84", + "metadata": {}, + "source": [ + "# SI-BicomOverlap" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3e90f15a", + "metadata": {}, + "outputs": [], + "source": [ + "e2b_max = e2b.max(axis=0)\n", + "\n", + "bicom_to_bundle = e_lab_one_hot @ e2b\n", + "b2b_max = bicom_to_bundle.max(axis=0)\n", + "b2b_max = bicom_to_bundle.max(axis=1)\n", + "\n", + "sort_by_overlap = np.argsort(b2b_max)[::-1]\n", + "\n", + "perc_thresh = 90\n", + "thresh = np.percentile(e2b, perc_thresh, axis=0)\n", + "overlap_mask = bicom_to_bundle >= thresh\n", + "\n", + "n_a_show = 51\n", + "fig, axes = plt.subplots(figsize=(18, 6))\n", + "\n", + "jitter_width = 0.4\n", + "for i, b_id in enumerate(sort_by_overlap):\n", + " a_id = np.argmax(bicom_to_bundle[b_id])\n", + " axes.bar(i, b2b_max[b_id], width=0.6, color=cluster_cmap(b_id+1), alpha=0.6, zorder=2)\n", + " axes.bar(i, b2b_max[b_id], width=0.6, color=\"none\", edgecolor=cluster_cmap(b_id+1), lw=3, zorder=2)\n", + " \n", + " x_scatter = np.random.uniform(-jitter_width, jitter_width, size=e2b[:, a_id].shape[0])\n", + " axes.scatter(i + x_scatter, e2b[:, a_id], color=\"gray\", alpha=0.1, s=10, edgecolors=\"none\")\n", + " axes.plot([i - jitter_width, i + jitter_width], [thresh[a_id]]*2, color=\"k\", lw=3, zorder=2)\n", + "\n", + " axes.text(i, b2b_max.max() + 0.028, a_bundles_labels.loc[a_id, \"BundleName\"], color=\"k\", fontsize=12, ha=\"center\", va=\"bottom\", rotation=90)\n", + " \n", + " perc = 100- (1 + (e2b[:, a_id] >= b2b_max[b_id]).sum())/(1 + e2b.shape[0]) * 100\n", + " axes.text(i, 0.07, f\"{perc:2.1f}\", color=\"k\", fontsize=12, ha=\"center\", va=\"top\", rotation=90)\n", + " \n", + " # bicom_list = [9, 24, 1, 16, 0, 12, 11, 23]\n", + " # if b_id in [9, 24, 1, 16, 0, 12, 11, 23]:\n", + " if b_id in [11, 29, 4, 26, 13, 33, 2, 12]:\n", + " axes.scatter(i, 0.075, s=80, marker=\"s\", facecolors='r', edgecolors=\"none\", zorder=3)\n", + " \n", + " if sig_df.loc[b_id, 'is_sig']:\n", + " axes.scatter(i, 0.075, s=80, marker=\"s\", facecolors='none', edgecolors=\"k\", linewidths=1, zorder=3)\n", + " # x_scatter = np.random.uniform(-jitter_width, jitter_width, size=bicom_to_bundle[:, a_id].shape[0])\n", + " # axes.scatter(i + x_scatter, bicom_to_bundle[:, a_id], c=np.arange(bicom_to_bundle[:, a_id].shape[0]),\n", + " # cmap=cluster_cmap, alpha=1, s=50, edgecolors=\"none\")\n", + "\n", + "axes.text(-1, b2b_max.max() + 0.036, \"Bundle\\nName\", fontsize=12, rotation=90, ha=\"center\", va=\"center\")\n", + "axes.text(-1, 0.065, \"Percentile\", fontsize=12, rotation=90, ha=\"center\", va=\"center\")\n", + "\n", + "axes.set_xticks(np.arange(len(sort_by_overlap)), labels=sort_by_overlap+1, rotation=0, fontsize=10)\n", + "axes.axhline(0, color='k', lw=2)\n", + "\n", + "axes.spines[[\"top\", \"right\"]].set_visible(False)\n", + "axes.spines[:].set_linewidth(2)\n", + "axes.set_xlabel(\"Bicommunity ID\", fontsize=16)\n", + "axes.set_ylabel(\"Inverse MDF Distance\", fontsize=16)\n", + "axes.set_title(\"Bicommunity Similarity with Anatomical Bundles\", fontsize=16)\n", + "axes.tick_params(labelsize=14, width=2)\n", + "\n", + "fig.savefig(op.join(path_to_figures, f\"SI-BicomOverlap-K{s_e_labels.max()}.png\"), dpi=300, bbox_inches='tight')\n", + "fig.savefig(op.join(path_to_figures, f\"SI-BicomOverlap-K{s_e_labels.max()}.pdf\"), dpi=300, bbox_inches='tight', format=\"pdf\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "71d83c77", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "dgsp", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.8" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}