From c02ca94c5ce6518f38ec2047a40fb7a7364be86c Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Tue, 22 Aug 2023 11:52:35 +0300 Subject: [PATCH 01/24] WID-223: attempt at implementing Connectivity viewer using old code from TVB - WIP --- notebooks/Connectivity.ipynb | 96 ++++++ requirements.txt | 20 +- tvbwidgets/api.py | 1 + tvbwidgets/ui/connectivity/Connectivity.css | 0 tvbwidgets/ui/connectivity/Connectivity.tsx | 303 ++++++++++++++++++ tvbwidgets/ui/connectivity/__init__.py | 1 + .../ui/connectivity/connectivity_model.py | 20 ++ .../ui/connectivity/connectivity_widget.py | 44 +++ 8 files changed, 476 insertions(+), 9 deletions(-) create mode 100644 notebooks/Connectivity.ipynb create mode 100644 tvbwidgets/ui/connectivity/Connectivity.css create mode 100644 tvbwidgets/ui/connectivity/Connectivity.tsx create mode 100644 tvbwidgets/ui/connectivity/__init__.py create mode 100644 tvbwidgets/ui/connectivity/connectivity_model.py create mode 100644 tvbwidgets/ui/connectivity/connectivity_widget.py diff --git a/notebooks/Connectivity.ipynb b/notebooks/Connectivity.ipynb new file mode 100644 index 00000000..86eee134 --- /dev/null +++ b/notebooks/Connectivity.ipynb @@ -0,0 +1,96 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Demonstrate Connectivity Widget " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "tags": [] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "22-08-2023 11:50:04 - DEBUG - tvbwidgets - Package is not fully installed\n", + "22-08-2023 11:50:04 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", + "22-08-2023 11:50:04 - INFO - tvbwidgets - Version: 1.5.0\n", + "2023-08-22 11:50:09,686 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", + "22-08-2023 11:50:09 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", + "2023-08-22 11:50:09,857 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n", + "Connectivity (\n", + " Number of connections ..... 0\n", + " Number of regions ......... 0\n", + " Undirected ................ False\n", + " areas ..................... [min, median, max] = [0, 2580.89, 10338.2] dtype = float64 shape = (76,)\n", + " tract_lengths ............. [min, median, max] = [0, 71.6635, 153.486] dtype = float64 shape = (76, 76)\n", + " tract_lengths (connections) [min, median, max] = [0, 55.8574, 138.454] dtype = float64 shape = (1560,)\n", + " tract_lengths-non-zero .... [min, median, max] = [4.93328, 74.0646, 153.486] dtype = float64 shape = (5402,)\n", + " weights ................... [min, median, max] = [0, 0, 3] dtype = float64 shape = (76, 76)\n", + " weights-non-zero .......... [min, median, max] = [0.00462632, 2, 3] dtype = float64 shape = (1560,)\n", + ")\n", + "init ConnectivityWidget\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "6e4cf60127c648d2be1aa973d6723086", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "ConnectivityWidget(connectivity={'areas': [396.44065, 937.50289, 1903.8602, 2099.4259, 1808.146, 1114.739, 191…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from tvbwidgets.api import ConnectivityWidget\n", + "from tvb.datatypes.connectivity import Connectivity\n", + "\n", + "connectivity = Connectivity.from_file() # defaults to connectivy_76.zip\n", + "print(connectivity)\n", + "\n", + "wid = ConnectivityWidget(connectivity=connectivity)\n", + "wid" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/requirements.txt b/requirements.txt index f2bfdb0a..ef9c7a05 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,16 +1,18 @@ colorcet ebrains_drive -ipympl > 0.8.5 -ipywidgets == 7.7.2 -IPython <= 8.12 +ipympl>0.8.5 +ipywidgets==7.7.2 +IPython<=8.12 joblib -mne >= 1.0 -numpy <1.24 -plotly == 5.14.0 +mne>=1.0 +numpy<1.24 +plotly==5.14.0 pythreejs -pyvista == 0.37.0 -tvb-library >= 2.5 +pyvista==0.37.0 +ipyreact==0.3.0 +tvb-library>=2.5 tvb-framework plotly-resampler pyunicore -toml \ No newline at end of file +traitlets>=5.7.1 +toml diff --git a/tvbwidgets/api.py b/tvbwidgets/api.py index d65f6686..965f658a 100644 --- a/tvbwidgets/api.py +++ b/tvbwidgets/api.py @@ -5,6 +5,7 @@ # (c) 2022-2023, TVB Widgets Team # +from .ui.connectivity.connectivity_widget import ConnectivityWidget from .ui.phase_plane_widget import PhasePlaneWidget from .ui.storage_widget import StorageWidget from .ui.head_widget import HeadBrowser, HeadWidget, HeadWidgetConfig diff --git a/tvbwidgets/ui/connectivity/Connectivity.css b/tvbwidgets/ui/connectivity/Connectivity.css new file mode 100644 index 00000000..e69de29b diff --git a/tvbwidgets/ui/connectivity/Connectivity.tsx b/tvbwidgets/ui/connectivity/Connectivity.tsx new file mode 100644 index 00000000..8498b23e --- /dev/null +++ b/tvbwidgets/ui/connectivity/Connectivity.tsx @@ -0,0 +1,303 @@ +import * as React from "react"; +// import * as d3 from "d3@4.10.0"; +import * as d3 from "d3"; + + +/** + * This separator should be present in the labels of nodes only when we want hierarchical nodes. + * Currently this is not used, but will be useful for macro-regions. + * When found in original names, will be replaced with HIERARCHY_SEPARATOR_REPLACEMENT. + */ +const HIERARCHY_SEPARATOR = "."; +const HIERARCHY_SEPARATOR_REPLACEMENT = "_"; + +/** + * A function for drawing a hierarchical edge bundle + * + * @param data The data structure that has the region labels and the adjiacence matrix + * @param testFn Callable for filtering edges + */ +export function initHierarchicalEdgeBundle(data, testFn) { + + const regionLabelsLength = data.region_labels.length; + let svgD3 = data.svg.d3; + let jsonified_region_labels = []; + let hasSpecialCharacters = false; + + for (let i = 0; i < regionLabelsLength; i++) { + let json_line = { + imports: undefined, + name: undefined + }; + json_line.imports = []; + let k = 0; //k is a counter for connected regions with the j-th region + for (let j = 0; j < regionLabelsLength; j++) { + let w = 0; + w = data.matrix && data.matrix[i * regionLabelsLength + j]; + hasSpecialCharacters = hasSpecialCharacters || (data.region_labels[i].lastIndexOf(HIERARCHY_SEPARATOR) > 0); + json_line.name = data.region_labels[i].replace(HIERARCHY_SEPARATOR, HIERARCHY_SEPARATOR_REPLACEMENT); + if (testFn(w)) { + json_line.imports[k] = data.region_labels[j].replace(HIERARCHY_SEPARATOR, HIERARCHY_SEPARATOR_REPLACEMENT); + k++; + } + } + jsonified_region_labels[i] = json_line; + } + + console.log('jsonified: ', jsonified_region_labels); + if (hasSpecialCharacters) { + console.log("Special character '" + HIERARCHY_SEPARATOR + "' has been replaced in all labels with '" + HIERARCHY_SEPARATOR_REPLACEMENT); + } + + console.log('data: ', data); + let radius = data.svg.svg.getAttribute("height") / 2; + console.log('radius: ', radius); + let innerRadius = radius - 100; // substract estimated labels size + + const cluster = d3.cluster() + .size([360, innerRadius]); + + let line = d3.radialLine() + .curve(d3.curveBundle.beta(0.85)) + .radius(function (d) { + return d.y; + }) + .angle(function (d) { + return d.x / 180 * Math.PI; + }); + + const svg = svgD3 + .append("g") + .attr("transform", "translate(" + radius + "," + radius + ")"); + + let link = svg.append("g").selectAll(".link"), + node = svg.append("g").selectAll(".node"); + console.log('before packageHierarchy'); + const root = packageHierarchy(jsonified_region_labels) + .sum(function (d) { + return d.size; + }); + console.log('before packageHierarchy'); + cluster(root); + console.log('root: ', root); + console.log('after cluster'); + + link = link + .data(packageImports(root.leaves())) + .enter().append("path") + .each(function (d) { + d.source = d[0]; + d.target = d[d.length - 1]; + }) + .attr("class", "link") + .attr("d", line); + + console.log('after link'); + + node = node + .data(root.leaves()) + .enter().append("text") + .attr("class", "node") + .attr("dy", "0.31em") + .attr("transform", function (d) { + return "rotate(" + (d.x - 90) + ")translate(" + (d.y + 8) + ",0)" + (d.x < 180 ? "" : "rotate(180)"); + }) + .attr("text-anchor", function (d) { + return d.x < 180 ? "start" : "end"; + }) + .text(function (d) { + return d.data.key; + }) + .on("mouseover", mouseovered) + .on("mouseout", mouseouted); + + console.log('after node'); + + function mouseovered(d) { + node + .each(function (n) { + n.target = n.source = false; + }); + + link + .classed("link-target", function (l) { + if (l.target === d) return l.source.source = true; + }) + .classed("link-source", function (l) { + if (l.source === d) return l.target.target = true; + }) + .filter(function (l) { + return l.target === d || l.source === d; + }) + .raise(); + + node + .classed("node-target", function (n) { + return n.target; + }) + .classed("node-source", function (n) { + return n.source; + }); + } + + function mouseouted(d) { + link + .classed("link-target", false) + .classed("link-source", false); + + node + .classed("node-target", false) + .classed("node-source", false); + } + +// Lazily construct the package hierarchy from class names. + function packageHierarchy(classes) { + var map = {}; + + function find(name, data) { + var node = map[name], i; + if (!node) { + node = map[name] = data || {name: name, children: []}; + if (name.length) { + node.parent = find(name.substring(0, i = name.lastIndexOf(HIERARCHY_SEPARATOR)), data); + console.log('node.parent: ', node.parent); + if (node.parent.children) node.parent.children.push(node); + node.key = name.substring(i + 1); + } + } + return node; + } + + classes.forEach(function (d) { + find(d.name, d); + }); + + return d3.hierarchy(map[""]); + } + +// function packageHierarchy(data, delimiter = ".") { +// let root; +// const map = new Map; +// data.forEach(function find(data) { +// const {name} = data; +// if (map.has(name)) return map.get(name); +// const i = name.lastIndexOf(delimiter); +// map.set(name, data); +// if (i >= 0) { +// find({name: name.substring(0, i), children: []}).children.push(data); +// data.name = name.substring(i + 1); +// } else { +// root = data; +// } +// return data; +// }); +// return root; +// } + +// Return a list of imports for the given array of nodes. + function packageImports(nodes) { + console.log('inside package imports'); + const map = {}; + const imports = []; + + console.log('before foreach 1'); + // Compute a map from name to node. + nodes.forEach(function (d) { + map[d.data.name] = d; + }); + + console.log('after foreach 1'); + + + // For each import, construct a link from the source to target node. + nodes.forEach(function (d) { + d.data.imports && + d.data.imports.forEach(function (i) { + console.log('d.data.imports.forEach(function (i) -> i: ', i); + console.log('d.data.imports.forEach(function (i) -> map[i]: ', map[i]); + console.log('d.data.imports.forEach(function (i) -> map[d.data.name]: ', map[d.data.name]); + map[i] && imports.push(map[d.data.name].path(map[i])); + }); + }); + console.log('before return with vallue: ', imports); + return imports; + } + + +} + +const BUNDLE = { + tracts: "tracts", + weights: "weights" +}; + +export default function Connectivity({connectivity, on_connectivity}) { + const ref = React.useRef(); + console.log('reeeeeeeeeeeef: ', ref.current); + const [bundle, setBundle] = React.useState(BUNDLE.weights); + + const connectivityEdgesData = { + region_labels: [""], + matrix: [], + svg: { + d3: null, + svg: null, + }, + data_url: "", + state: bundle + }; + + React.useEffect(() => { + const svg = d3.select("#middle-edge-bundle"); + + connectivityEdgesData.region_labels = connectivity.region_labels; + connectivityEdgesData.svg.d3 = svg; + connectivityEdgesData.svg.svg = document.querySelector("#middle-edge-bundle"); + let tracts1D = []; + let weights1D = []; + for (const subArr of connectivity.tract_lengths) { + tracts1D = tracts1D.concat(subArr); + } + for (const subArr of connectivity.weights) { + weights1D = weights1D.concat(subArr); + } + console.log(connectivityEdgesData.region_labels); + connectivityEdgesData.matrix = bundle === BUNDLE.weights ? weights1D : tracts1D; + // connectivityEdgesData.matrix = [2, 0, 1, 0]; + connectivityEdgesData.svg.d3.selectAll("*") + .transition() + .duration(100) + .style("fill-opacity", "0"); + console.log('connectivityEdgesData: ', connectivityEdgesData); + connectivityEdgesData.svg.d3.selectAll("*").remove(); + connectivityEdgesData.state = bundle; + initHierarchicalEdgeBundle(connectivityEdgesData, d => d !== 0); + + connectivityEdgesData.svg.d3.selectAll("*") + .transition() + .duration(100) + .style("fill-opacity", "1"); + + // return () => { + // svg.remove(); + // }; + }, [connectivity, bundle]); + + return (
+ + +
) +} diff --git a/tvbwidgets/ui/connectivity/__init__.py b/tvbwidgets/ui/connectivity/__init__.py new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/tvbwidgets/ui/connectivity/__init__.py @@ -0,0 +1 @@ + diff --git a/tvbwidgets/ui/connectivity/connectivity_model.py b/tvbwidgets/ui/connectivity/connectivity_model.py new file mode 100644 index 00000000..491e4e61 --- /dev/null +++ b/tvbwidgets/ui/connectivity/connectivity_model.py @@ -0,0 +1,20 @@ +from traitlets import HasTraits, Bool, List, Integer, Unicode, Float + + +class ConnectivityDTO(HasTraits): + region_labels = List() + weights = List() + undirected = Bool() + tract_lengths = List() + speed = List() + centres = List() + cortical = List(trait=Bool(), allow_none=True) + hemispheres = List(trait=Bool(), allow_none=True) + orientations = List(allow_none=True) + areas = List(trait=Float(), allow_none=True) + idelays = List(trait=Integer(), allow_none=True) + delays = List(trait=Float(), allow_none=True) + number_of_regions = Integer() + number_of_connections = Integer() + parent_connectivity = Unicode(allow_none=True) + saved_selection = List(trait=Integer()) diff --git a/tvbwidgets/ui/connectivity/connectivity_widget.py b/tvbwidgets/ui/connectivity/connectivity_widget.py new file mode 100644 index 00000000..dd3a4ab4 --- /dev/null +++ b/tvbwidgets/ui/connectivity/connectivity_widget.py @@ -0,0 +1,44 @@ +# -*- coding: utf-8 -*- +# +# "TheVirtualBrain - Widgets" package +# +# (c) 2022-2023, TVB Widgets Team +# + +import pathlib + +import ipyreact +import traitlets + +from .connectivity_model import ConnectivityDTO + + +class ConnectivityWidget(ipyreact.ReactWidget): + _esm = pathlib.Path(__file__).resolve().parent / 'Connectivity.tsx' + + connectivity = traitlets.Any().tag(sync=True) + + def __init__(self, connectivity=None, **kwargs): + self.connectivity = ConnectivityDTO( + region_labels=connectivity.region_labels.tolist(), + weights=connectivity.weights.tolist(), + undirected=connectivity.undirected, + tract_lengths=connectivity.tract_lengths.tolist(), + speed=connectivity.speed.tolist(), + centres=connectivity.centres.tolist(), + cortical=connectivity.cortical.tolist(), + hemispheres=connectivity.hemispheres.tolist(), + orientations=connectivity.orientations.tolist(), + areas=connectivity.areas.tolist(), + idelays=connectivity.idelays and connectivity.idelays.tolist(), + delays=connectivity.delays and connectivity.delays.tolist(), + number_of_regions=connectivity.number_of_regions, + number_of_connections=connectivity.number_of_connections, + parent_connectivity=connectivity.parent_connectivity, + saved_selection=connectivity.saved_selection + ).trait_values() + print('init ConnectivityWidget') + if connectivity is None: + "Please provide a connectivity" + + super().__init__(**kwargs) From eb7f9f7670e7430ab2db0d15236e6242d22d8d01 Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Tue, 22 Aug 2023 18:23:36 +0300 Subject: [PATCH 02/24] WID-223: implement edge bundle viewer (wip) --- notebooks/Connectivity.ipynb | 14 +- tvbwidgets/ui/connectivity/Connectivity.tsx | 348 +- tvbwidgets/ui/connectivity/conn.json | 3650 +++++++++++++++++++ 3 files changed, 3796 insertions(+), 216 deletions(-) create mode 100644 tvbwidgets/ui/connectivity/conn.json diff --git a/notebooks/Connectivity.ipynb b/notebooks/Connectivity.ipynb index 86eee134..918e27d7 100644 --- a/notebooks/Connectivity.ipynb +++ b/notebooks/Connectivity.ipynb @@ -18,12 +18,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "22-08-2023 11:50:04 - DEBUG - tvbwidgets - Package is not fully installed\n", - "22-08-2023 11:50:04 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", - "22-08-2023 11:50:04 - INFO - tvbwidgets - Version: 1.5.0\n", - "2023-08-22 11:50:09,686 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", - "22-08-2023 11:50:09 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", - "2023-08-22 11:50:09,857 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n", + "22-08-2023 05:58:01 - DEBUG - tvbwidgets - Package is not fully installed\n", + "22-08-2023 05:58:01 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", + "22-08-2023 05:58:01 - INFO - tvbwidgets - Version: 1.5.0\n", + "2023-08-22 17:58:07,660 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", + "22-08-2023 05:58:07 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", + "2023-08-22 17:58:07,848 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n", "Connectivity (\n", " Number of connections ..... 0\n", " Number of regions ......... 0\n", @@ -41,7 +41,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "6e4cf60127c648d2be1aa973d6723086", + "model_id": "a1385b6d305543dc8a088515a4c1e8bf", "version_major": 2, "version_minor": 0 }, diff --git a/tvbwidgets/ui/connectivity/Connectivity.tsx b/tvbwidgets/ui/connectivity/Connectivity.tsx index 8498b23e..308596b4 100644 --- a/tvbwidgets/ui/connectivity/Connectivity.tsx +++ b/tvbwidgets/ui/connectivity/Connectivity.tsx @@ -1,5 +1,4 @@ import * as React from "react"; -// import * as d3 from "d3@4.10.0"; import * as d3 from "d3"; @@ -10,6 +9,9 @@ import * as d3 from "d3"; */ const HIERARCHY_SEPARATOR = "."; const HIERARCHY_SEPARATOR_REPLACEMENT = "_"; +const colorin = "#00f"; +const colorout = "#f00"; +const colornone = "#ccc"; /** * A function for drawing a hierarchical edge bundle @@ -19,21 +21,23 @@ const HIERARCHY_SEPARATOR_REPLACEMENT = "_"; */ export function initHierarchicalEdgeBundle(data, testFn) { - const regionLabelsLength = data.region_labels.length; - let svgD3 = data.svg.d3; + const l = data.region_labels.length; + // let svgD3 = data.svg.d3; let jsonified_region_labels = []; let hasSpecialCharacters = false; - for (let i = 0; i < regionLabelsLength; i++) { + for (let i = 0; i < l; i++) { let json_line = { imports: undefined, - name: undefined + name: undefined, + // children: [] }; json_line.imports = []; + // json_line.children = []; let k = 0; //k is a counter for connected regions with the j-th region - for (let j = 0; j < regionLabelsLength; j++) { + for (let j = 0; j < l; j++) { let w = 0; - w = data.matrix && data.matrix[i * regionLabelsLength + j]; + w = data.matrix[i * l + j]; hasSpecialCharacters = hasSpecialCharacters || (data.region_labels[i].lastIndexOf(HIERARCHY_SEPARATOR) > 0); json_line.name = data.region_labels[i].replace(HIERARCHY_SEPARATOR, HIERARCHY_SEPARATOR_REPLACEMENT); if (testFn(w)) { @@ -43,187 +47,51 @@ export function initHierarchicalEdgeBundle(data, testFn) { } jsonified_region_labels[i] = json_line; } + console.log('json: ', jsonified_region_labels); + return jsonified_region_labels; +} - console.log('jsonified: ', jsonified_region_labels); - if (hasSpecialCharacters) { - console.log("Special character '" + HIERARCHY_SEPARATOR + "' has been replaced in all labels with '" + HIERARCHY_SEPARATOR_REPLACEMENT); - } - - console.log('data: ', data); - let radius = data.svg.svg.getAttribute("height") / 2; - console.log('radius: ', radius); - let innerRadius = radius - 100; // substract estimated labels size - - const cluster = d3.cluster() - .size([360, innerRadius]); - - let line = d3.radialLine() - .curve(d3.curveBundle.beta(0.85)) - .radius(function (d) { - return d.y; - }) - .angle(function (d) { - return d.x / 180 * Math.PI; - }); - - const svg = svgD3 - .append("g") - .attr("transform", "translate(" + radius + "," + radius + ")"); - - let link = svg.append("g").selectAll(".link"), - node = svg.append("g").selectAll(".node"); - console.log('before packageHierarchy'); - const root = packageHierarchy(jsonified_region_labels) - .sum(function (d) { - return d.size; - }); - console.log('before packageHierarchy'); - cluster(root); - console.log('root: ', root); - console.log('after cluster'); - - link = link - .data(packageImports(root.leaves())) - .enter().append("path") - .each(function (d) { - d.source = d[0]; - d.target = d[d.length - 1]; - }) - .attr("class", "link") - .attr("d", line); - - console.log('after link'); - - node = node - .data(root.leaves()) - .enter().append("text") - .attr("class", "node") - .attr("dy", "0.31em") - .attr("transform", function (d) { - return "rotate(" + (d.x - 90) + ")translate(" + (d.y + 8) + ",0)" + (d.x < 180 ? "" : "rotate(180)"); - }) - .attr("text-anchor", function (d) { - return d.x < 180 ? "start" : "end"; - }) - .text(function (d) { - return d.data.key; - }) - .on("mouseover", mouseovered) - .on("mouseout", mouseouted); - - console.log('after node'); - - function mouseovered(d) { - node - .each(function (n) { - n.target = n.source = false; - }); - - link - .classed("link-target", function (l) { - if (l.target === d) return l.source.source = true; - }) - .classed("link-source", function (l) { - if (l.source === d) return l.target.target = true; - }) - .filter(function (l) { - return l.target === d || l.source === d; - }) - .raise(); - - node - .classed("node-target", function (n) { - return n.target; - }) - .classed("node-source", function (n) { - return n.source; - }); - } - - function mouseouted(d) { - link - .classed("link-target", false) - .classed("link-source", false); - - node - .classed("node-target", false) - .classed("node-source", false); - } - -// Lazily construct the package hierarchy from class names. - function packageHierarchy(classes) { - var map = {}; - - function find(name, data) { - var node = map[name], i; - if (!node) { - node = map[name] = data || {name: name, children: []}; - if (name.length) { - node.parent = find(name.substring(0, i = name.lastIndexOf(HIERARCHY_SEPARATOR)), data); - console.log('node.parent: ', node.parent); - if (node.parent.children) node.parent.children.push(node); - node.key = name.substring(i + 1); - } - } - return node; +function hierarchy(data, delimiter = HIERARCHY_SEPARATOR) { + console.log('data inside hierarchy: ', data); + let root; + const map = new Map; + let newData = [] + data.forEach(function find(d) { + const {name} = d; + if (map.has(name)) { + return map.get(name); } + const i = name.lastIndexOf(delimiter); + map.set(name, d); + if (node) { + find({name: name.substring(0, i), children: []}).children.push(d); + d.name = name.substring(i + 1); + } else { + root = d; + } + newData.push(root); + }); + console.log('data after hierarchy: ', data); + console.log('map after hierarchy: ', map); + console.log('newData after hierarchy: ', newData); + return newData; +} - classes.forEach(function (d) { - find(d.name, d); - }); - - return d3.hierarchy(map[""]); - } - -// function packageHierarchy(data, delimiter = ".") { -// let root; -// const map = new Map; -// data.forEach(function find(data) { -// const {name} = data; -// if (map.has(name)) return map.get(name); -// const i = name.lastIndexOf(delimiter); -// map.set(name, data); -// if (i >= 0) { -// find({name: name.substring(0, i), children: []}).children.push(data); -// data.name = name.substring(i + 1); -// } else { -// root = data; -// } -// return data; -// }); -// return root; -// } - -// Return a list of imports for the given array of nodes. - function packageImports(nodes) { - console.log('inside package imports'); - const map = {}; - const imports = []; - - console.log('before foreach 1'); - // Compute a map from name to node. - nodes.forEach(function (d) { - map[d.data.name] = d; - }); - - console.log('after foreach 1'); - - - // For each import, construct a link from the source to target node. - nodes.forEach(function (d) { - d.data.imports && - d.data.imports.forEach(function (i) { - console.log('d.data.imports.forEach(function (i) -> i: ', i); - console.log('d.data.imports.forEach(function (i) -> map[i]: ', map[i]); - console.log('d.data.imports.forEach(function (i) -> map[d.data.name]: ', map[d.data.name]); - map[i] && imports.push(map[d.data.name].path(map[i])); - }); - }); - console.log('before return with vallue: ', imports); - return imports; +function bilink(root) { + console.log('before map'); + const map = new Map(root.leaves().map(d => [id(d), d])); + console.log('after map'); + for (const d of root.leaves()) { + d.incoming = []; + const imports = d.data.imports; + d.outgoing = imports ? imports.map(i => [d, map.get(i)]) : []; } + for (const d of root.leaves()) for (const o of d.outgoing) o[1].incoming.push(o); + return root; +} - +function id(node) { + return `${node.parent ? id(node.parent) + "." : ""}${node.data.name}`; } const BUNDLE = { @@ -233,7 +101,6 @@ const BUNDLE = { export default function Connectivity({connectivity, on_connectivity}) { const ref = React.useRef(); - console.log('reeeeeeeeeeeef: ', ref.current); const [bundle, setBundle] = React.useState(BUNDLE.weights); const connectivityEdgesData = { @@ -246,12 +113,13 @@ export default function Connectivity({connectivity, on_connectivity}) { data_url: "", state: bundle }; - + let chart = () => { + }; React.useEffect(() => { - const svg = d3.select("#middle-edge-bundle"); + // const svg = d3.select("#middle-edge-bundle"); connectivityEdgesData.region_labels = connectivity.region_labels; - connectivityEdgesData.svg.d3 = svg; + connectivityEdgesData.svg.d3 = d3.select("#middle-edge-bundle"); connectivityEdgesData.svg.svg = document.querySelector("#middle-edge-bundle"); let tracts1D = []; let weights1D = []; @@ -263,24 +131,91 @@ export default function Connectivity({connectivity, on_connectivity}) { } console.log(connectivityEdgesData.region_labels); connectivityEdgesData.matrix = bundle === BUNDLE.weights ? weights1D : tracts1D; + const dataJson = initHierarchicalEdgeBundle(connectivityEdgesData, d => d !== 0); + // const data = hierarchy(dataJson); + const data = dataJson; + + console.log("data=hierarchy(dataJson):: ", data); + // connectivityEdgesData.matrix = [2, 0, 1, 0]; - connectivityEdgesData.svg.d3.selectAll("*") - .transition() - .duration(100) - .style("fill-opacity", "0"); - console.log('connectivityEdgesData: ', connectivityEdgesData); - connectivityEdgesData.svg.d3.selectAll("*").remove(); - connectivityEdgesData.state = bundle; - initHierarchicalEdgeBundle(connectivityEdgesData, d => d !== 0); + chart = () => { + const width = 954; + const radius = width / 2; + + const tree = d3.cluster() + .size([2 * Math.PI, radius - 100]); + const root = tree(bilink(d3.hierarchy(data, d => d && d.children || []) + .sort((a, b) => d3.ascending(a.height, b.height) || d3.ascending(a.data.name, b.data.name)))); + + const svg = d3.create("svg") + .attr("width", width) + .attr("height", width) + .attr("viewBox", [-width / 2, -width / 2, width, width]) + .attr("style", "max-width: 100%; height: auto; font: 10px sans-serif;"); + // ref.current && ref.current.appendChild(svg.node()); + + const node = svg.append("g") + .selectAll() + .data(root.leaves()) + .join("g") + .attr("transform", d => `rotate(${d.x * 180 / Math.PI - 90}) translate(${d.y},0)`) + .append("text") + .attr("dy", "0.31em") + .attr("x", d => d.x < Math.PI ? 6 : -6) + .attr("text-anchor", d => d.x < Math.PI ? "start" : "end") + .attr("transform", d => d.x >= Math.PI ? "rotate(180)" : null) + .text(d => d.data.name) + .each(function (d) { + d.text = this; + }) + .on("mouseover", overed) + .on("mouseout", outed) + .call(text => text.append("title").text(d => `${id(d)} +${d.outgoing.length} outgoing +${d.incoming.length} incoming`)); + + const line = d3.lineRadial() + .curve(d3.curveBundle.beta(0.85)) + .radius(d => d.y) + .angle(d => d.x); + + const link = svg.append("g") + .attr("stroke", colornone) + .attr("fill", "none") + .selectAll() + .data(root.leaves().flatMap(leaf => leaf.outgoing)) + .join("path") + .style("mix-blend-mode", "multiply") + .attr("d", ([i, o]) => line(i.path(o))) + .each(function (d) { + d.path = this; + }); + + function overed(event, d) { + link.style("mix-blend-mode", null); + d3.select(this).attr("font-weight", "bold"); + d3.selectAll(d.incoming.map(d => d.path)).attr("stroke", colorin).raise(); + d3.selectAll(d.incoming.map(([d]) => d.text)).attr("fill", colorin).attr("font-weight", "bold"); + d3.selectAll(d.outgoing.map(d => d.path)).attr("stroke", colorout).raise(); + d3.selectAll(d.outgoing.map(([, d]) => d.text)).attr("fill", colorout).attr("font-weight", "bold"); + } + + function outed(event, d) { + link.style("mix-blend-mode", "multiply"); + d3.select(this).attr("font-weight", null); + d3.selectAll(d.incoming.map(d => d.path)).attr("stroke", null); + d3.selectAll(d.incoming.map(([d]) => d.text)).attr("fill", null).attr("font-weight", null); + d3.selectAll(d.outgoing.map(d => d.path)).attr("stroke", null); + d3.selectAll(d.outgoing.map(([, d]) => d.text)).attr("fill", null).attr("font-weight", null); + } + + // return svg.node(); + ref.current && ref.current.appendChild(svg.node()); + } - connectivityEdgesData.svg.d3.selectAll("*") - .transition() - .duration(100) - .style("fill-opacity", "1"); + console.log('chart: ', chart()); - // return () => { - // svg.remove(); - // }; + // chart(); }, [connectivity, bundle]); return (
@@ -292,12 +227,7 @@ export default function Connectivity({connectivity, on_connectivity}) { - +
) } diff --git a/tvbwidgets/ui/connectivity/conn.json b/tvbwidgets/ui/connectivity/conn.json new file mode 100644 index 00000000..0239246e --- /dev/null +++ b/tvbwidgets/ui/connectivity/conn.json @@ -0,0 +1,3650 @@ +[ + { + "imports": [ + "rA1", + "rA2", + "rCCA", + "rCCS", + "rIA", + "rIP", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPHC", + "rTCC", + "rTCS", + "rTCV" + ], + "name": "rA1", + "children": [ + "rA1", + "rA2", + "rCCA", + "rCCS", + "rIA", + "rIP", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPHC", + "rTCC", + "rTCS", + "rTCV" + ] + }, + { + "imports": [ + "rA1", + "rA2", + "rFEF", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rTCC", + "rTCS", + "rTCV" + ], + "name": "rA2", + "children": [ + "rA1", + "rA2", + "rFEF", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rTCC", + "rTCS", + "rTCV" + ] + }, + { + "imports": [ + "rAMYG", + "rPHC", + "rTCC", + "rTCI", + "rTCPOL", + "rTCV", + "lAMYG" + ], + "name": "rAMYG", + "children": [ + "rAMYG", + "rPHC", + "rTCC", + "rTCI", + "rTCPOL", + "rTCV", + "lAMYG" + ] + }, + { + "imports": [ + "rA1", + "rAMYG", + "rCCA", + "rCCP", + "rCCS", + "rFEF", + "rG", + "rHC", + "rIA", + "rIP", + "rM1", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCDM", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS2", + "rTCPOL", + "rTCV", + "rV2", + "lCCA" + ], + "name": "rCCA", + "children": [ + "rA1", + "rAMYG", + "rCCA", + "rCCP", + "rCCS", + "rFEF", + "rG", + "rHC", + "rIA", + "rIP", + "rM1", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCDM", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS2", + "rTCPOL", + "rTCV", + "rV2", + "lCCA" + ] + }, + { + "imports": [ + "rA1", + "rA2", + "rCCA", + "rCCP", + "rCCR", + "rCCS", + "rFEF", + "rIP", + "rM1", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPHC", + "rS1", + "rS2", + "rTCC", + "rTCS", + "rTCV", + "rV2", + "lCCP" + ], + "name": "rCCP", + "children": [ + "rA1", + "rA2", + "rCCA", + "rCCP", + "rCCR", + "rCCS", + "rFEF", + "rIP", + "rM1", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPHC", + "rS1", + "rS2", + "rTCC", + "rTCS", + "rTCV", + "rV2", + "lCCP" + ] + }, + { + "imports": [ + "rCCP", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "lCCR" + ], + "name": "rCCR", + "children": [ + "rCCP", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "lCCR" + ] + }, + { + "imports": [ + "rA1", + "rA2", + "rAMYG", + "rCCA", + "rCCP", + "rCCR", + "rCCS", + "rHC", + "rIA", + "rIP", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rTCC", + "rTCPOL", + "rTCS", + "rTCV", + "rV2", + "lCCS" + ], + "name": "rCCS", + "children": [ + "rA1", + "rA2", + "rAMYG", + "rCCA", + "rCCP", + "rCCR", + "rCCS", + "rHC", + "rIA", + "rIP", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rTCC", + "rTCPOL", + "rTCS", + "rTCV", + "rV2", + "lCCS" + ] + }, + { + "imports": [ + "rA1", + "rA2", + "rCCA", + "rCCP", + "rCCR", + "rFEF", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rS1", + "rTCC", + "rTCPOL", + "rTCS", + "rV2", + "lFEF" + ], + "name": "rFEF", + "children": [ + "rA1", + "rA2", + "rCCA", + "rCCP", + "rCCR", + "rFEF", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rS1", + "rTCC", + "rTCPOL", + "rTCS", + "rV2", + "lFEF" + ] + }, + { + "imports": [ + "rCCA", + "rCCP", + "rG", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPFCCL", + "rPFCORB", + "rPFCPOL", + "rPMCDL", + "rPMCM", + "rS1", + "rS2" + ], + "name": "rG", + "children": [ + "rCCA", + "rCCP", + "rG", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPFCCL", + "rPFCORB", + "rPFCPOL", + "rPMCDL", + "rPMCM", + "rS1", + "rS2" + ] + }, + { + "imports": [ + "rPHC" + ], + "name": "rHC", + "children": [ + "rPHC" + ] + }, + { + "imports": [ + "rA1", + "rA2", + "rAMYG", + "rCCA", + "rCCP", + "rCCR", + "rCCS", + "rFEF", + "rHC", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCVL", + "rS1", + "rS2", + "rTCPOL", + "rTCS", + "rTCV", + "rV2" + ], + "name": "rIA", + "children": [ + "rA1", + "rA2", + "rAMYG", + "rCCA", + "rCCP", + "rCCR", + "rCCS", + "rFEF", + "rHC", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCVL", + "rS1", + "rS2", + "rTCPOL", + "rTCS", + "rTCV", + "rV2" + ] + }, + { + "imports": [ + "rAMYG", + "rCCA", + "rCCR", + "rCCS", + "rHC", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCVL", + "rS1", + "rS2", + "rTCPOL", + "rTCV", + "rV2" + ], + "name": "rIP", + "children": [ + "rAMYG", + "rCCA", + "rCCR", + "rCCS", + "rHC", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCVL", + "rS1", + "rS2", + "rTCPOL", + "rTCV", + "rV2" + ] + }, + { + "imports": [ + "rCCA", + "rCCP", + "rIA", + "rIP", + "rM1", + "rPCIP", + "rPCM", + "rPCS", + "rPFCORB", + "rPFCPOL", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS1", + "rS2", + "rTCC", + "rV2", + "lM1" + ], + "name": "rM1", + "children": [ + "rCCA", + "rCCP", + "rIA", + "rIP", + "rM1", + "rPCIP", + "rPCM", + "rPCS", + "rPFCORB", + "rPFCPOL", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS1", + "rS2", + "rTCC", + "rV2", + "lM1" + ] + }, + { + "imports": [ + "rA2", + "rAMYG", + "rCCA", + "rCCP", + "rCCR", + "rFEF", + "rG", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCDL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS1", + "rS2", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV2" + ], + "name": "rPCI", + "children": [ + "rA2", + "rAMYG", + "rCCA", + "rCCP", + "rCCR", + "rFEF", + "rG", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCDL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS1", + "rS2", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV2" + ] + }, + { + "imports": [ + "rA2", + "rAMYG", + "rCCA", + "rCCP", + "rCCR", + "rFEF", + "rG", + "rIA", + "rIP", + "rM1", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS1", + "rS2", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV1", + "rV2" + ], + "name": "rPCIP", + "children": [ + "rA2", + "rAMYG", + "rCCA", + "rCCP", + "rCCR", + "rFEF", + "rG", + "rIA", + "rIP", + "rM1", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS1", + "rS2", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV1", + "rV2" + ] + }, + { + "imports": [ + "rCCA", + "rCCP", + "rCCR", + "rFEF", + "rIA", + "rIP", + "rM1", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCORB", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rTCC", + "rTCS", + "rTCV", + "rV2", + "lPCM" + ], + "name": "rPCM", + "children": [ + "rCCA", + "rCCP", + "rCCR", + "rFEF", + "rIA", + "rIP", + "rM1", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCORB", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rTCC", + "rTCS", + "rTCV", + "rV2", + "lPCM" + ] + }, + { + "imports": [ + "rAMYG", + "rCCA", + "rCCP", + "rCCR", + "rCCS", + "rFEF", + "rIA", + "rIP", + "rM1", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS1", + "rTCC", + "rTCI", + "rTCS", + "rTCV", + "rV1", + "rV2", + "lPCS" + ], + "name": "rPCS", + "children": [ + "rAMYG", + "rCCA", + "rCCP", + "rCCR", + "rCCS", + "rFEF", + "rIA", + "rIP", + "rM1", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS1", + "rTCC", + "rTCI", + "rTCS", + "rTCV", + "rV1", + "rV2", + "lPCS" + ] + }, + { + "imports": [ + "rA2", + "rCCA", + "rCCP", + "rCCR", + "rCCS", + "rFEF", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCDM", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS1", + "rS2", + "rTCC", + "rTCS", + "rV2", + "lPFCCL" + ], + "name": "rPFCCL", + "children": [ + "rA2", + "rCCA", + "rCCP", + "rCCR", + "rCCS", + "rFEF", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCDM", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS1", + "rS2", + "rTCC", + "rTCS", + "rV2", + "lPFCCL" + ] + }, + { + "imports": [ + "rCCA", + "rCCP", + "rCCR", + "rCCS", + "rFEF", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCDM", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS2", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV2", + "lPFCDL" + ], + "name": "rPFCDL", + "children": [ + "rCCA", + "rCCP", + "rCCR", + "rCCS", + "rFEF", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCDM", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS2", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV2", + "lPFCDL" + ] + }, + { + "imports": [ + "rCCA", + "lPFCDM" + ], + "name": "rPFCDM", + "children": [ + "rCCA", + "lPFCDM" + ] + }, + { + "imports": [ + "rA1", + "rA2", + "rAMYG", + "rCCA", + "rCCP", + "rCCR", + "rCCS", + "rHC", + "rIA", + "rIP", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPHC", + "rTCC", + "rTCPOL", + "rTCS", + "rTCV", + "rV2", + "lPFCM" + ], + "name": "rPFCM", + "children": [ + "rA1", + "rA2", + "rAMYG", + "rCCA", + "rCCP", + "rCCR", + "rCCS", + "rHC", + "rIA", + "rIP", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPHC", + "rTCC", + "rTCPOL", + "rTCS", + "rTCV", + "rV2", + "lPFCM" + ] + }, + { + "imports": [ + "rA1", + "rA2", + "rAMYG", + "rCCA", + "rCCP", + "rCCR", + "rCCS", + "rFEF", + "rHC", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS1", + "rS2", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV2" + ], + "name": "rPFCORB", + "children": [ + "rA1", + "rA2", + "rAMYG", + "rCCA", + "rCCP", + "rCCR", + "rCCS", + "rFEF", + "rHC", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS1", + "rS2", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV2" + ] + }, + { + "imports": [ + "rA2", + "rCCA", + "rCCR", + "rCCS", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS1", + "rS2", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV2", + "lPFCPOL" + ], + "name": "rPFCPOL", + "children": [ + "rA2", + "rCCA", + "rCCR", + "rCCS", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS1", + "rS2", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV2", + "lPFCPOL" + ] + }, + { + "imports": [ + "rA1", + "rA2", + "rCCA", + "rCCP", + "rCCS", + "rFEF", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS2", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV2" + ], + "name": "rPFCVL", + "children": [ + "rA1", + "rA2", + "rCCA", + "rCCP", + "rCCS", + "rFEF", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS2", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV2" + ] + }, + { + "imports": [ + "rA1", + "rA2", + "rAMYG", + "rCCA", + "rCCP", + "rCCR", + "rCCS", + "rFEF", + "rHC", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rS2", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV2" + ], + "name": "rPHC", + "children": [ + "rA1", + "rA2", + "rAMYG", + "rCCA", + "rCCP", + "rCCR", + "rCCS", + "rFEF", + "rHC", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rS2", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV2" + ] + }, + { + "imports": [ + "rA2", + "rCCA", + "rFEF", + "rIA", + "rIP", + "rM1", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCDM", + "rPFCORB", + "rPFCVL", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS1", + "rS2", + "rTCC", + "rTCS", + "rV2", + "lPMCDL" + ], + "name": "rPMCDL", + "children": [ + "rA2", + "rCCA", + "rFEF", + "rIA", + "rIP", + "rM1", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCDM", + "rPFCORB", + "rPFCVL", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS1", + "rS2", + "rTCC", + "rTCS", + "rV2", + "lPMCDL" + ] + }, + { + "imports": [ + "rA2", + "rCCA", + "rFEF", + "rIA", + "rIP", + "rM1", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCDM", + "rPFCORB", + "rPFCVL", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS1", + "rS2", + "rTCC", + "rTCS", + "rV2", + "lPMCM" + ], + "name": "rPMCM", + "children": [ + "rA2", + "rCCA", + "rFEF", + "rIA", + "rIP", + "rM1", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCDM", + "rPFCORB", + "rPFCVL", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS1", + "rS2", + "rTCC", + "rTCS", + "rV2", + "lPMCM" + ] + }, + { + "imports": [ + "rCCA", + "rIA", + "rIP", + "rM1", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCORB", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS1", + "rS2", + "rTCC", + "rV2" + ], + "name": "rPMCVL", + "children": [ + "rCCA", + "rIA", + "rIP", + "rM1", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCORB", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rS1", + "rS2", + "rTCC", + "rV2" + ] + }, + { + "imports": [ + "rG", + "rIA", + "rIP", + "rM1", + "rPCI", + "rPCIP", + "rPCS", + "rPFCCL", + "rPMCDL", + "rPMCM", + "rS1", + "rS2", + "lS1" + ], + "name": "rS1", + "children": [ + "rG", + "rIA", + "rIP", + "rM1", + "rPCI", + "rPCIP", + "rPCS", + "rPFCCL", + "rPMCDL", + "rPMCM", + "rS1", + "rS2", + "lS1" + ] + }, + { + "imports": [ + "rCCA", + "rG", + "rIP", + "rM1", + "rPCI", + "rPCIP", + "rPFCCL", + "rPMCVL", + "rS1", + "rS2" + ], + "name": "rS2", + "children": [ + "rCCA", + "rG", + "rIP", + "rM1", + "rPCI", + "rPCIP", + "rPFCCL", + "rPMCVL", + "rS1", + "rS2" + ] + }, + { + "imports": [ + "rA1", + "rA2", + "rAMYG", + "rCCA", + "rCCP", + "rCCS", + "rFEF", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPHC", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV1", + "rV2" + ], + "name": "rTCC", + "children": [ + "rA1", + "rA2", + "rAMYG", + "rCCA", + "rCCP", + "rCCS", + "rFEF", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPHC", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV1", + "rV2" + ] + }, + { + "imports": [ + "rAMYG", + "rFEF", + "rIP", + "rPCI", + "rPCIP", + "rPCS", + "rPFCORB", + "rPFCVL", + "rPHC", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV2" + ], + "name": "rTCI", + "children": [ + "rAMYG", + "rFEF", + "rIP", + "rPCI", + "rPCIP", + "rPCS", + "rPFCORB", + "rPFCVL", + "rPHC", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV2" + ] + }, + { + "imports": [ + "rA1", + "rA2", + "rAMYG", + "rCCA", + "rCCR", + "rCCS", + "rIA", + "rIP", + "rPCI", + "rPFCCL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rTCC", + "rTCI", + "rTCS", + "rTCV" + ], + "name": "rTCPOL", + "children": [ + "rA1", + "rA2", + "rAMYG", + "rCCA", + "rCCR", + "rCCS", + "rIA", + "rIP", + "rPCI", + "rPFCCL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rTCC", + "rTCI", + "rTCS", + "rTCV" + ] + }, + { + "imports": [ + "rA1", + "rA2", + "rAMYG", + "rCCP", + "rFEF", + "rIA", + "rPCI", + "rPCIP", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV2" + ], + "name": "rTCS", + "children": [ + "rA1", + "rA2", + "rAMYG", + "rCCP", + "rFEF", + "rIA", + "rPCI", + "rPCIP", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV2" + ] + }, + { + "imports": [ + "rA1", + "rA2", + "rAMYG", + "rCCA", + "rCCP", + "rCCR", + "rCCS", + "rFEF", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rS2", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV2" + ], + "name": "rTCV", + "children": [ + "rA1", + "rA2", + "rAMYG", + "rCCA", + "rCCP", + "rCCR", + "rCCS", + "rFEF", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCM", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rS2", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV2" + ] + }, + { + "imports": [ + "rAMYG", + "rPCI", + "rPCIP", + "rPHC", + "rTCC", + "rTCS", + "rV1", + "rV2", + "lV1" + ], + "name": "rV1", + "children": [ + "rAMYG", + "rPCI", + "rPCIP", + "rPHC", + "rTCC", + "rTCS", + "rV1", + "rV2", + "lV1" + ] + }, + { + "imports": [ + "rAMYG", + "rCCA", + "rCCS", + "rFEF", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV1", + "rV2", + "lV2" + ], + "name": "rV2", + "children": [ + "rAMYG", + "rCCA", + "rCCS", + "rFEF", + "rIA", + "rIP", + "rPCI", + "rPCIP", + "rPCM", + "rPCS", + "rPFCCL", + "rPFCDL", + "rPFCORB", + "rPFCPOL", + "rPFCVL", + "rPHC", + "rPMCDL", + "rPMCM", + "rPMCVL", + "rTCC", + "rTCI", + "rTCPOL", + "rTCS", + "rTCV", + "rV1", + "rV2", + "lV2" + ] + }, + { + "imports": [], + "name": "rCC", + "children": [] + }, + { + "imports": [ + "lA1", + "lA2", + "lCCA", + "lCCS", + "lIA", + "lIP", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPHC", + "lTCC", + "lTCS", + "lTCV" + ], + "name": "lA1", + "children": [ + "lA1", + "lA2", + "lCCA", + "lCCS", + "lIA", + "lIP", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPHC", + "lTCC", + "lTCS", + "lTCV" + ] + }, + { + "imports": [ + "lA1", + "lA2", + "lFEF", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lTCC", + "lTCS", + "lTCV" + ], + "name": "lA2", + "children": [ + "lA1", + "lA2", + "lFEF", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lTCC", + "lTCS", + "lTCV" + ] + }, + { + "imports": [ + "rAMYG", + "lAMYG", + "lPHC", + "lTCC", + "lTCI", + "lTCPOL", + "lTCV" + ], + "name": "lAMYG", + "children": [ + "rAMYG", + "lAMYG", + "lPHC", + "lTCC", + "lTCI", + "lTCPOL", + "lTCV" + ] + }, + { + "imports": [ + "rCCA", + "lA1", + "lAMYG", + "lCCA", + "lCCP", + "lCCS", + "lFEF", + "lG", + "lHC", + "lIA", + "lIP", + "lM1", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCDM", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS2", + "lTCPOL", + "lTCV", + "lV2" + ], + "name": "lCCA", + "children": [ + "rCCA", + "lA1", + "lAMYG", + "lCCA", + "lCCP", + "lCCS", + "lFEF", + "lG", + "lHC", + "lIA", + "lIP", + "lM1", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCDM", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS2", + "lTCPOL", + "lTCV", + "lV2" + ] + }, + { + "imports": [ + "rCCP", + "lA1", + "lA2", + "lCCA", + "lCCP", + "lCCR", + "lCCS", + "lFEF", + "lIP", + "lM1", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPHC", + "lS1", + "lS2", + "lTCC", + "lTCS", + "lTCV", + "lV2" + ], + "name": "lCCP", + "children": [ + "rCCP", + "lA1", + "lA2", + "lCCA", + "lCCP", + "lCCR", + "lCCS", + "lFEF", + "lIP", + "lM1", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPHC", + "lS1", + "lS2", + "lTCC", + "lTCS", + "lTCV", + "lV2" + ] + }, + { + "imports": [ + "rCCR", + "lCCP", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL" + ], + "name": "lCCR", + "children": [ + "rCCR", + "lCCP", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL" + ] + }, + { + "imports": [ + "rCCS", + "lA1", + "lA2", + "lAMYG", + "lCCA", + "lCCP", + "lCCR", + "lCCS", + "lHC", + "lIA", + "lIP", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lTCC", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ], + "name": "lCCS", + "children": [ + "rCCS", + "lA1", + "lA2", + "lAMYG", + "lCCA", + "lCCP", + "lCCR", + "lCCS", + "lHC", + "lIA", + "lIP", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lTCC", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ] + }, + { + "imports": [ + "rFEF", + "lA1", + "lA2", + "lCCA", + "lCCP", + "lCCR", + "lFEF", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lS1", + "lTCC", + "lTCPOL", + "lTCS", + "lV2" + ], + "name": "lFEF", + "children": [ + "rFEF", + "lA1", + "lA2", + "lCCA", + "lCCP", + "lCCR", + "lFEF", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lS1", + "lTCC", + "lTCPOL", + "lTCS", + "lV2" + ] + }, + { + "imports": [ + "lCCA", + "lCCP", + "lG", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPFCCL", + "lPFCORB", + "lPFCPOL", + "lPMCDL", + "lPMCM", + "lS1", + "lS2" + ], + "name": "lG", + "children": [ + "lCCA", + "lCCP", + "lG", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPFCCL", + "lPFCORB", + "lPFCPOL", + "lPMCDL", + "lPMCM", + "lS1", + "lS2" + ] + }, + { + "imports": [ + "lPHC" + ], + "name": "lHC", + "children": [ + "lPHC" + ] + }, + { + "imports": [ + "lA1", + "lA2", + "lAMYG", + "lCCA", + "lCCP", + "lCCR", + "lCCS", + "lFEF", + "lHC", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCVL", + "lS1", + "lS2", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ], + "name": "lIA", + "children": [ + "lA1", + "lA2", + "lAMYG", + "lCCA", + "lCCP", + "lCCR", + "lCCS", + "lFEF", + "lHC", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCVL", + "lS1", + "lS2", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ] + }, + { + "imports": [ + "lAMYG", + "lCCA", + "lCCR", + "lCCS", + "lHC", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCVL", + "lS1", + "lS2", + "lTCPOL", + "lTCV", + "lV2" + ], + "name": "lIP", + "children": [ + "lAMYG", + "lCCA", + "lCCR", + "lCCS", + "lHC", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCVL", + "lS1", + "lS2", + "lTCPOL", + "lTCV", + "lV2" + ] + }, + { + "imports": [ + "rM1", + "lCCA", + "lCCP", + "lIA", + "lIP", + "lM1", + "lPCIP", + "lPCM", + "lPCS", + "lPFCORB", + "lPFCPOL", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS1", + "lS2", + "lTCC", + "lV2" + ], + "name": "lM1", + "children": [ + "rM1", + "lCCA", + "lCCP", + "lIA", + "lIP", + "lM1", + "lPCIP", + "lPCM", + "lPCS", + "lPFCORB", + "lPFCPOL", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS1", + "lS2", + "lTCC", + "lV2" + ] + }, + { + "imports": [ + "lA2", + "lAMYG", + "lCCA", + "lCCP", + "lCCR", + "lFEF", + "lG", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCDL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS1", + "lS2", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ], + "name": "lPCI", + "children": [ + "lA2", + "lAMYG", + "lCCA", + "lCCP", + "lCCR", + "lFEF", + "lG", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCDL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS1", + "lS2", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ] + }, + { + "imports": [ + "lA2", + "lAMYG", + "lCCA", + "lCCP", + "lCCR", + "lFEF", + "lG", + "lIA", + "lIP", + "lM1", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS1", + "lS2", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV1", + "lV2" + ], + "name": "lPCIP", + "children": [ + "lA2", + "lAMYG", + "lCCA", + "lCCP", + "lCCR", + "lFEF", + "lG", + "lIA", + "lIP", + "lM1", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS1", + "lS2", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV1", + "lV2" + ] + }, + { + "imports": [ + "rPCM", + "lCCA", + "lCCP", + "lCCR", + "lFEF", + "lIA", + "lIP", + "lM1", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCORB", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lTCC", + "lTCS", + "lTCV", + "lV2" + ], + "name": "lPCM", + "children": [ + "rPCM", + "lCCA", + "lCCP", + "lCCR", + "lFEF", + "lIA", + "lIP", + "lM1", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCORB", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lTCC", + "lTCS", + "lTCV", + "lV2" + ] + }, + { + "imports": [ + "rPCS", + "lAMYG", + "lCCA", + "lCCP", + "lCCR", + "lCCS", + "lFEF", + "lIA", + "lIP", + "lM1", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS1", + "lTCC", + "lTCI", + "lTCS", + "lTCV", + "lV1", + "lV2" + ], + "name": "lPCS", + "children": [ + "rPCS", + "lAMYG", + "lCCA", + "lCCP", + "lCCR", + "lCCS", + "lFEF", + "lIA", + "lIP", + "lM1", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS1", + "lTCC", + "lTCI", + "lTCS", + "lTCV", + "lV1", + "lV2" + ] + }, + { + "imports": [ + "rPFCCL", + "lA2", + "lCCA", + "lCCP", + "lCCR", + "lCCS", + "lFEF", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCDM", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS1", + "lS2", + "lTCC", + "lTCS", + "lV2" + ], + "name": "lPFCCL", + "children": [ + "rPFCCL", + "lA2", + "lCCA", + "lCCP", + "lCCR", + "lCCS", + "lFEF", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCDM", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS1", + "lS2", + "lTCC", + "lTCS", + "lV2" + ] + }, + { + "imports": [ + "rPFCDL", + "lCCA", + "lCCP", + "lCCR", + "lCCS", + "lFEF", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCDM", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS2", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ], + "name": "lPFCDL", + "children": [ + "rPFCDL", + "lCCA", + "lCCP", + "lCCR", + "lCCS", + "lFEF", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCDM", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS2", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ] + }, + { + "imports": [ + "rPFCDM", + "lCCA" + ], + "name": "lPFCDM", + "children": [ + "rPFCDM", + "lCCA" + ] + }, + { + "imports": [ + "rPFCM", + "lA1", + "lA2", + "lAMYG", + "lCCA", + "lCCP", + "lCCR", + "lCCS", + "lHC", + "lIA", + "lIP", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPHC", + "lTCC", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ], + "name": "lPFCM", + "children": [ + "rPFCM", + "lA1", + "lA2", + "lAMYG", + "lCCA", + "lCCP", + "lCCR", + "lCCS", + "lHC", + "lIA", + "lIP", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPHC", + "lTCC", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ] + }, + { + "imports": [ + "lA1", + "lA2", + "lAMYG", + "lCCA", + "lCCP", + "lCCR", + "lCCS", + "lFEF", + "lHC", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS1", + "lS2", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ], + "name": "lPFCORB", + "children": [ + "lA1", + "lA2", + "lAMYG", + "lCCA", + "lCCP", + "lCCR", + "lCCS", + "lFEF", + "lHC", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS1", + "lS2", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ] + }, + { + "imports": [ + "rPFCPOL", + "lA2", + "lCCA", + "lCCR", + "lCCS", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS1", + "lS2", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ], + "name": "lPFCPOL", + "children": [ + "rPFCPOL", + "lA2", + "lCCA", + "lCCR", + "lCCS", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS1", + "lS2", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ] + }, + { + "imports": [ + "lA1", + "lA2", + "lCCA", + "lCCP", + "lCCS", + "lFEF", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS2", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ], + "name": "lPFCVL", + "children": [ + "lA1", + "lA2", + "lCCA", + "lCCP", + "lCCS", + "lFEF", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS2", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ] + }, + { + "imports": [ + "lA1", + "lA2", + "lAMYG", + "lCCA", + "lCCP", + "lCCR", + "lCCS", + "lFEF", + "lHC", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lS2", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ], + "name": "lPHC", + "children": [ + "lA1", + "lA2", + "lAMYG", + "lCCA", + "lCCP", + "lCCR", + "lCCS", + "lFEF", + "lHC", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lS2", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ] + }, + { + "imports": [ + "rPMCDL", + "lA2", + "lCCA", + "lFEF", + "lIA", + "lIP", + "lM1", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCDM", + "lPFCORB", + "lPFCVL", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS1", + "lS2", + "lTCC", + "lTCS", + "lV2" + ], + "name": "lPMCDL", + "children": [ + "rPMCDL", + "lA2", + "lCCA", + "lFEF", + "lIA", + "lIP", + "lM1", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCDM", + "lPFCORB", + "lPFCVL", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS1", + "lS2", + "lTCC", + "lTCS", + "lV2" + ] + }, + { + "imports": [ + "rPMCM", + "lA2", + "lCCA", + "lFEF", + "lIA", + "lIP", + "lM1", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCDM", + "lPFCORB", + "lPFCVL", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS1", + "lS2", + "lTCC", + "lTCS", + "lV2" + ], + "name": "lPMCM", + "children": [ + "rPMCM", + "lA2", + "lCCA", + "lFEF", + "lIA", + "lIP", + "lM1", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCDM", + "lPFCORB", + "lPFCVL", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS1", + "lS2", + "lTCC", + "lTCS", + "lV2" + ] + }, + { + "imports": [ + "lCCA", + "lIA", + "lIP", + "lM1", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCORB", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS1", + "lS2", + "lTCC", + "lV2" + ], + "name": "lPMCVL", + "children": [ + "lCCA", + "lIA", + "lIP", + "lM1", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCORB", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lS1", + "lS2", + "lTCC", + "lV2" + ] + }, + { + "imports": [ + "rS1", + "lG", + "lIA", + "lIP", + "lM1", + "lPCI", + "lPCIP", + "lPCS", + "lPFCCL", + "lPMCDL", + "lPMCM", + "lS1", + "lS2" + ], + "name": "lS1", + "children": [ + "rS1", + "lG", + "lIA", + "lIP", + "lM1", + "lPCI", + "lPCIP", + "lPCS", + "lPFCCL", + "lPMCDL", + "lPMCM", + "lS1", + "lS2" + ] + }, + { + "imports": [ + "lCCA", + "lG", + "lIP", + "lM1", + "lPCI", + "lPCIP", + "lPFCCL", + "lPMCVL", + "lS1", + "lS2" + ], + "name": "lS2", + "children": [ + "lCCA", + "lG", + "lIP", + "lM1", + "lPCI", + "lPCIP", + "lPFCCL", + "lPMCVL", + "lS1", + "lS2" + ] + }, + { + "imports": [ + "lA1", + "lA2", + "lAMYG", + "lCCA", + "lCCP", + "lCCS", + "lFEF", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPHC", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV1", + "lV2" + ], + "name": "lTCC", + "children": [ + "lA1", + "lA2", + "lAMYG", + "lCCA", + "lCCP", + "lCCS", + "lFEF", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPHC", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV1", + "lV2" + ] + }, + { + "imports": [ + "lAMYG", + "lFEF", + "lIP", + "lPCI", + "lPCIP", + "lPCS", + "lPFCORB", + "lPFCVL", + "lPHC", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ], + "name": "lTCI", + "children": [ + "lAMYG", + "lFEF", + "lIP", + "lPCI", + "lPCIP", + "lPCS", + "lPFCORB", + "lPFCVL", + "lPHC", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ] + }, + { + "imports": [ + "lA1", + "lA2", + "lAMYG", + "lCCA", + "lCCR", + "lCCS", + "lIA", + "lIP", + "lPCI", + "lPFCCL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lTCC", + "lTCI", + "lTCS", + "lTCV" + ], + "name": "lTCPOL", + "children": [ + "lA1", + "lA2", + "lAMYG", + "lCCA", + "lCCR", + "lCCS", + "lIA", + "lIP", + "lPCI", + "lPFCCL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lTCC", + "lTCI", + "lTCS", + "lTCV" + ] + }, + { + "imports": [ + "lA1", + "lA2", + "lAMYG", + "lCCP", + "lFEF", + "lIA", + "lPCI", + "lPCIP", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ], + "name": "lTCS", + "children": [ + "lA1", + "lA2", + "lAMYG", + "lCCP", + "lFEF", + "lIA", + "lPCI", + "lPCIP", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ] + }, + { + "imports": [ + "lA1", + "lA2", + "lAMYG", + "lCCA", + "lCCP", + "lCCR", + "lCCS", + "lFEF", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lS2", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ], + "name": "lTCV", + "children": [ + "lA1", + "lA2", + "lAMYG", + "lCCA", + "lCCP", + "lCCR", + "lCCS", + "lFEF", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCM", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lS2", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV2" + ] + }, + { + "imports": [ + "rV1", + "lAMYG", + "lPCI", + "lPCIP", + "lPHC", + "lTCC", + "lTCS", + "lV1", + "lV2" + ], + "name": "lV1", + "children": [ + "rV1", + "lAMYG", + "lPCI", + "lPCIP", + "lPHC", + "lTCC", + "lTCS", + "lV1", + "lV2" + ] + }, + { + "imports": [ + "rV2", + "lAMYG", + "lCCA", + "lCCS", + "lFEF", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV1", + "lV2" + ], + "name": "lV2", + "children": [ + "rV2", + "lAMYG", + "lCCA", + "lCCS", + "lFEF", + "lIA", + "lIP", + "lPCI", + "lPCIP", + "lPCM", + "lPCS", + "lPFCCL", + "lPFCDL", + "lPFCORB", + "lPFCPOL", + "lPFCVL", + "lPHC", + "lPMCDL", + "lPMCM", + "lPMCVL", + "lTCC", + "lTCI", + "lTCPOL", + "lTCS", + "lTCV", + "lV1", + "lV2" + ] + }, + { + "imports": [], + "name": "lCC", + "children": [] + } +] From 37bb049f8b1366e8e99e06aa8ca5cc19e8dd1d23 Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Wed, 23 Aug 2023 16:31:20 +0300 Subject: [PATCH 03/24] WID-223: implement edge bundle viewer - make it visible - lacks performance (wip) --- notebooks/Connectivity.ipynb | 14 +- tvbwidgets/ui/connectivity/Connectivity.css | 6 + tvbwidgets/ui/connectivity/Connectivity.tsx | 258 +- tvbwidgets/ui/connectivity/conn.json | 3650 ----------------- .../ui/connectivity/connectivity_widget.py | 4 +- 5 files changed, 142 insertions(+), 3790 deletions(-) delete mode 100644 tvbwidgets/ui/connectivity/conn.json diff --git a/notebooks/Connectivity.ipynb b/notebooks/Connectivity.ipynb index 918e27d7..cbcdc4df 100644 --- a/notebooks/Connectivity.ipynb +++ b/notebooks/Connectivity.ipynb @@ -18,12 +18,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "22-08-2023 05:58:01 - DEBUG - tvbwidgets - Package is not fully installed\n", - "22-08-2023 05:58:01 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", - "22-08-2023 05:58:01 - INFO - tvbwidgets - Version: 1.5.0\n", - "2023-08-22 17:58:07,660 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", - "22-08-2023 05:58:07 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", - "2023-08-22 17:58:07,848 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n", + "23-08-2023 04:08:30 - DEBUG - tvbwidgets - Package is not fully installed\n", + "23-08-2023 04:08:30 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", + "23-08-2023 04:08:30 - INFO - tvbwidgets - Version: 1.5.0\n", + "2023-08-23 16:08:36,608 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", + "23-08-2023 04:08:36 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", + "2023-08-23 16:08:36,810 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n", "Connectivity (\n", " Number of connections ..... 0\n", " Number of regions ......... 0\n", @@ -41,7 +41,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "a1385b6d305543dc8a088515a4c1e8bf", + "model_id": "45c65c965a6d486aa6df4795e7a7bcba", "version_major": 2, "version_minor": 0 }, diff --git a/tvbwidgets/ui/connectivity/Connectivity.css b/tvbwidgets/ui/connectivity/Connectivity.css index e69de29b..bb65b4ee 100644 --- a/tvbwidgets/ui/connectivity/Connectivity.css +++ b/tvbwidgets/ui/connectivity/Connectivity.css @@ -0,0 +1,6 @@ +.link { + fill: none; + stroke: #999; + stroke-opacity: 0.6; + stroke-width: 1.5px; +} diff --git a/tvbwidgets/ui/connectivity/Connectivity.tsx b/tvbwidgets/ui/connectivity/Connectivity.tsx index 308596b4..83d15af9 100644 --- a/tvbwidgets/ui/connectivity/Connectivity.tsx +++ b/tvbwidgets/ui/connectivity/Connectivity.tsx @@ -9,9 +9,6 @@ import * as d3 from "d3"; */ const HIERARCHY_SEPARATOR = "."; const HIERARCHY_SEPARATOR_REPLACEMENT = "_"; -const colorin = "#00f"; -const colorout = "#f00"; -const colornone = "#ccc"; /** * A function for drawing a hierarchical edge bundle @@ -22,7 +19,6 @@ const colornone = "#ccc"; export function initHierarchicalEdgeBundle(data, testFn) { const l = data.region_labels.length; - // let svgD3 = data.svg.d3; let jsonified_region_labels = []; let hasSpecialCharacters = false; @@ -30,10 +26,8 @@ export function initHierarchicalEdgeBundle(data, testFn) { let json_line = { imports: undefined, name: undefined, - // children: [] }; json_line.imports = []; - // json_line.children = []; let k = 0; //k is a counter for connected regions with the j-th region for (let j = 0; j < l; j++) { let w = 0; @@ -47,53 +41,9 @@ export function initHierarchicalEdgeBundle(data, testFn) { } jsonified_region_labels[i] = json_line; } - console.log('json: ', jsonified_region_labels); return jsonified_region_labels; } -function hierarchy(data, delimiter = HIERARCHY_SEPARATOR) { - console.log('data inside hierarchy: ', data); - let root; - const map = new Map; - let newData = [] - data.forEach(function find(d) { - const {name} = d; - if (map.has(name)) { - return map.get(name); - } - const i = name.lastIndexOf(delimiter); - map.set(name, d); - if (node) { - find({name: name.substring(0, i), children: []}).children.push(d); - d.name = name.substring(i + 1); - } else { - root = d; - } - newData.push(root); - }); - console.log('data after hierarchy: ', data); - console.log('map after hierarchy: ', map); - console.log('newData after hierarchy: ', newData); - return newData; -} - -function bilink(root) { - console.log('before map'); - const map = new Map(root.leaves().map(d => [id(d), d])); - console.log('after map'); - for (const d of root.leaves()) { - d.incoming = []; - const imports = d.data.imports; - d.outgoing = imports ? imports.map(i => [d, map.get(i)]) : []; - } - for (const d of root.leaves()) for (const o of d.outgoing) o[1].incoming.push(o); - return root; -} - -function id(node) { - return `${node.parent ? id(node.parent) + "." : ""}${node.data.name}`; -} - const BUNDLE = { tracts: "tracts", weights: "weights" @@ -103,6 +53,10 @@ export default function Connectivity({connectivity, on_connectivity}) { const ref = React.useRef(); const [bundle, setBundle] = React.useState(BUNDLE.weights); + const colorin = "#00f"; + const colorout = "#f00"; + const colornone = "#ccc"; + const connectivityEdgesData = { region_labels: [""], matrix: [], @@ -113,11 +67,8 @@ export default function Connectivity({connectivity, on_connectivity}) { data_url: "", state: bundle }; - let chart = () => { - }; - React.useEffect(() => { - // const svg = d3.select("#middle-edge-bundle"); + React.useEffect(() => { connectivityEdgesData.region_labels = connectivity.region_labels; connectivityEdgesData.svg.d3 = d3.select("#middle-edge-bundle"); connectivityEdgesData.svg.svg = document.querySelector("#middle-edge-bundle"); @@ -132,88 +83,131 @@ export default function Connectivity({connectivity, on_connectivity}) { console.log(connectivityEdgesData.region_labels); connectivityEdgesData.matrix = bundle === BUNDLE.weights ? weights1D : tracts1D; const dataJson = initHierarchicalEdgeBundle(connectivityEdgesData, d => d !== 0); - // const data = hierarchy(dataJson); - const data = dataJson; - - console.log("data=hierarchy(dataJson):: ", data); - - // connectivityEdgesData.matrix = [2, 0, 1, 0]; - chart = () => { - const width = 954; - const radius = width / 2; - - const tree = d3.cluster() - .size([2 * Math.PI, radius - 100]); - const root = tree(bilink(d3.hierarchy(data, d => d && d.children || []) - .sort((a, b) => d3.ascending(a.height, b.height) || d3.ascending(a.data.name, b.data.name)))); - - const svg = d3.create("svg") - .attr("width", width) - .attr("height", width) - .attr("viewBox", [-width / 2, -width / 2, width, width]) - .attr("style", "max-width: 100%; height: auto; font: 10px sans-serif;"); - // ref.current && ref.current.appendChild(svg.node()); - - const node = svg.append("g") - .selectAll() - .data(root.leaves()) - .join("g") - .attr("transform", d => `rotate(${d.x * 180 / Math.PI - 90}) translate(${d.y},0)`) - .append("text") - .attr("dy", "0.31em") - .attr("x", d => d.x < Math.PI ? 6 : -6) - .attr("text-anchor", d => d.x < Math.PI ? "start" : "end") - .attr("transform", d => d.x >= Math.PI ? "rotate(180)" : null) - .text(d => d.data.name) - .each(function (d) { - d.text = this; - }) - .on("mouseover", overed) - .on("mouseout", outed) - .call(text => text.append("title").text(d => `${id(d)} -${d.outgoing.length} outgoing -${d.incoming.length} incoming`)); - - const line = d3.lineRadial() - .curve(d3.curveBundle.beta(0.85)) - .radius(d => d.y) - .angle(d => d.x); - - const link = svg.append("g") - .attr("stroke", colornone) - .attr("fill", "none") - .selectAll() - .data(root.leaves().flatMap(leaf => leaf.outgoing)) - .join("path") - .style("mix-blend-mode", "multiply") - .attr("d", ([i, o]) => line(i.path(o))) - .each(function (d) { - d.path = this; - }); - - function overed(event, d) { - link.style("mix-blend-mode", null); - d3.select(this).attr("font-weight", "bold"); - d3.selectAll(d.incoming.map(d => d.path)).attr("stroke", colorin).raise(); - d3.selectAll(d.incoming.map(([d]) => d.text)).attr("fill", colorin).attr("font-weight", "bold"); - d3.selectAll(d.outgoing.map(d => d.path)).attr("stroke", colorout).raise(); - d3.selectAll(d.outgoing.map(([, d]) => d.text)).attr("fill", colorout).attr("font-weight", "bold"); - } + const data = {name: 'root', children: dataJson}; + + function id(node) { + return node.data.name; + } + + function hierarchy(data, delimiter = ".") { + let root; + const map = new Map; + data.forEach(function find(data) { + const {name} = data; + if (map.has(name)) return map.get(name); + const i = name.lastIndexOf(delimiter); + map.set(name, data); + if (i >= 0) { + find({name: name.substring(0, i), children: []}).children.push(data); + data.name = name.substring(i + 1); + } else { + root = data; + } + return data; + }); + return root; + } - function outed(event, d) { - link.style("mix-blend-mode", "multiply"); - d3.select(this).attr("font-weight", null); - d3.selectAll(d.incoming.map(d => d.path)).attr("stroke", null); - d3.selectAll(d.incoming.map(([d]) => d.text)).attr("fill", null).attr("font-weight", null); - d3.selectAll(d.outgoing.map(d => d.path)).attr("stroke", null); - d3.selectAll(d.outgoing.map(([, d]) => d.text)).attr("fill", null).attr("font-weight", null); + function bilink(root) { + const map = new Map(root.leaves().map(d => [id(d), d])); + for (const d of root.leaves()) { + d.incoming = []; + d.outgoing = []; + + for (const i of d.data.imports) { + const target = map.get(i); + if (target) { + d.outgoing.push([d, target]); + if (!target.incoming) target.incoming = []; + target.incoming.push([d, target]); + } + } } + return root; + } + + // Visualization code + const width = 954; + const radius = width / 2; + + const tree = d3.cluster() + .size([2 * Math.PI, radius - 100]); + const root = tree(bilink(d3.hierarchy(data) + .sort((a, b) => d3.ascending(a.height, b.height) || d3.ascending(a.data.name, b.data.name)))); + console.log('root: ', root); + const svg = d3.create("svg") + .attr("width", width) + .attr("height", width) + .attr("viewBox", [-width / 2, -width / 2, width, width]) + .attr("style", "max-width: 100%; height: auto; font: 10px sans-serif;"); + + const node = svg.append("g") + .selectAll() + .data(root.leaves()) + .join("g") + .attr("transform", d => `rotate(${d.x * 180 / Math.PI - 90}) translate(${d.y},0)`) + .append("text") + .attr("dy", "0.31em") + .attr("x", d => d.x < Math.PI ? 6 : -6) + .attr("text-anchor", d => d.x < Math.PI ? "start" : "end") + .attr("transform", d => d.x >= Math.PI ? "rotate(180)" : null) + .text(d => d.data.name) + .each(function (d) { + d.text = this; + }) + .on("mouseover", overed) + .on("mouseout", outed) + .call(text => text.append("title").text(d => `${id(d)} + ${d.outgoing.length} outgoing + ${d.incoming.length} incoming`)); + + const line = d3.lineRadial() + .curve(d3.curveBundle.beta(0.85)) + .radius(d => d.y) + .angle(d => d.x); + + const link = svg.append("g") + .attr("stroke", colornone) + .attr("fill", "none") + .selectAll() + .data(root.leaves().flatMap(leaf => leaf.outgoing)) + .join("path") + .style("mix-blend-mode", "multiply") + .attr("d", ([i, o]) => line(i.path(o))) + .each(function (d) { + d.path = this; + }); + + function overed(event, d) { + link.style("mix-blend-mode", null); + d3.select(this).attr("font-weight", "bold"); + + // Highlight incoming lines and text + d3.selectAll(d.incoming.map(d => d.path)).attr("stroke", colorin).raise(); + d3.selectAll(d.incoming.map(([d]) => d.text)).attr("fill", colorin).attr("font-weight", "bold"); + + // Highlight outgoing lines and text + d3.selectAll(d.outgoing.map(d => d.path)).attr("stroke", colorout).raise(); + d3.selectAll(d.outgoing.map(([, d]) => d.text)).attr("fill", colorout).attr("font-weight", "bold"); + } - // return svg.node(); - ref.current && ref.current.appendChild(svg.node()); + function outed(event, d) { + link.style("mix-blend-mode", "multiply"); + d3.select(this).attr("font-weight", null); + + // Reset styles for incoming lines and text + d3.selectAll(d.incoming.map(d => d.path)).attr("stroke", null); + d3.selectAll(d.incoming.map(([d]) => d.text)).attr("fill", null).attr("font-weight", null); + + // Reset styles for outgoing lines and text + d3.selectAll(d.outgoing.map(d => d.path)).attr("stroke", null); + d3.selectAll(d.outgoing.map(([, d]) => d.text)).attr("fill", null).attr("font-weight", null); } - console.log('chart: ', chart()); + // Append the SVG to the visualization container + ref.current?.appendChild(svg.node()); + + return () => svg.remove(); // chart(); }, [connectivity, bundle]); @@ -227,7 +221,7 @@ ${d.incoming.length} incoming`)); -
) } diff --git a/tvbwidgets/ui/connectivity/conn.json b/tvbwidgets/ui/connectivity/conn.json deleted file mode 100644 index 0239246e..00000000 --- a/tvbwidgets/ui/connectivity/conn.json +++ /dev/null @@ -1,3650 +0,0 @@ -[ - { - "imports": [ - "rA1", - "rA2", - "rCCA", - "rCCS", - "rIA", - "rIP", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPHC", - "rTCC", - "rTCS", - "rTCV" - ], - "name": "rA1", - "children": [ - "rA1", - "rA2", - "rCCA", - "rCCS", - "rIA", - "rIP", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPHC", - "rTCC", - "rTCS", - "rTCV" - ] - }, - { - "imports": [ - "rA1", - "rA2", - "rFEF", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rTCC", - "rTCS", - "rTCV" - ], - "name": "rA2", - "children": [ - "rA1", - "rA2", - "rFEF", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rTCC", - "rTCS", - "rTCV" - ] - }, - { - "imports": [ - "rAMYG", - "rPHC", - "rTCC", - "rTCI", - "rTCPOL", - "rTCV", - "lAMYG" - ], - "name": "rAMYG", - "children": [ - "rAMYG", - "rPHC", - "rTCC", - "rTCI", - "rTCPOL", - "rTCV", - "lAMYG" - ] - }, - { - "imports": [ - "rA1", - "rAMYG", - "rCCA", - "rCCP", - "rCCS", - "rFEF", - "rG", - "rHC", - "rIA", - "rIP", - "rM1", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCDM", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS2", - "rTCPOL", - "rTCV", - "rV2", - "lCCA" - ], - "name": "rCCA", - "children": [ - "rA1", - "rAMYG", - "rCCA", - "rCCP", - "rCCS", - "rFEF", - "rG", - "rHC", - "rIA", - "rIP", - "rM1", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCDM", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS2", - "rTCPOL", - "rTCV", - "rV2", - "lCCA" - ] - }, - { - "imports": [ - "rA1", - "rA2", - "rCCA", - "rCCP", - "rCCR", - "rCCS", - "rFEF", - "rIP", - "rM1", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPHC", - "rS1", - "rS2", - "rTCC", - "rTCS", - "rTCV", - "rV2", - "lCCP" - ], - "name": "rCCP", - "children": [ - "rA1", - "rA2", - "rCCA", - "rCCP", - "rCCR", - "rCCS", - "rFEF", - "rIP", - "rM1", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPHC", - "rS1", - "rS2", - "rTCC", - "rTCS", - "rTCV", - "rV2", - "lCCP" - ] - }, - { - "imports": [ - "rCCP", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "lCCR" - ], - "name": "rCCR", - "children": [ - "rCCP", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "lCCR" - ] - }, - { - "imports": [ - "rA1", - "rA2", - "rAMYG", - "rCCA", - "rCCP", - "rCCR", - "rCCS", - "rHC", - "rIA", - "rIP", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rTCC", - "rTCPOL", - "rTCS", - "rTCV", - "rV2", - "lCCS" - ], - "name": "rCCS", - "children": [ - "rA1", - "rA2", - "rAMYG", - "rCCA", - "rCCP", - "rCCR", - "rCCS", - "rHC", - "rIA", - "rIP", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rTCC", - "rTCPOL", - "rTCS", - "rTCV", - "rV2", - "lCCS" - ] - }, - { - "imports": [ - "rA1", - "rA2", - "rCCA", - "rCCP", - "rCCR", - "rFEF", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rS1", - "rTCC", - "rTCPOL", - "rTCS", - "rV2", - "lFEF" - ], - "name": "rFEF", - "children": [ - "rA1", - "rA2", - "rCCA", - "rCCP", - "rCCR", - "rFEF", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rS1", - "rTCC", - "rTCPOL", - "rTCS", - "rV2", - "lFEF" - ] - }, - { - "imports": [ - "rCCA", - "rCCP", - "rG", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPFCCL", - "rPFCORB", - "rPFCPOL", - "rPMCDL", - "rPMCM", - "rS1", - "rS2" - ], - "name": "rG", - "children": [ - "rCCA", - "rCCP", - "rG", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPFCCL", - "rPFCORB", - "rPFCPOL", - "rPMCDL", - "rPMCM", - "rS1", - "rS2" - ] - }, - { - "imports": [ - "rPHC" - ], - "name": "rHC", - "children": [ - "rPHC" - ] - }, - { - "imports": [ - "rA1", - "rA2", - "rAMYG", - "rCCA", - "rCCP", - "rCCR", - "rCCS", - "rFEF", - "rHC", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCVL", - "rS1", - "rS2", - "rTCPOL", - "rTCS", - "rTCV", - "rV2" - ], - "name": "rIA", - "children": [ - "rA1", - "rA2", - "rAMYG", - "rCCA", - "rCCP", - "rCCR", - "rCCS", - "rFEF", - "rHC", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCVL", - "rS1", - "rS2", - "rTCPOL", - "rTCS", - "rTCV", - "rV2" - ] - }, - { - "imports": [ - "rAMYG", - "rCCA", - "rCCR", - "rCCS", - "rHC", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCVL", - "rS1", - "rS2", - "rTCPOL", - "rTCV", - "rV2" - ], - "name": "rIP", - "children": [ - "rAMYG", - "rCCA", - "rCCR", - "rCCS", - "rHC", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCVL", - "rS1", - "rS2", - "rTCPOL", - "rTCV", - "rV2" - ] - }, - { - "imports": [ - "rCCA", - "rCCP", - "rIA", - "rIP", - "rM1", - "rPCIP", - "rPCM", - "rPCS", - "rPFCORB", - "rPFCPOL", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS1", - "rS2", - "rTCC", - "rV2", - "lM1" - ], - "name": "rM1", - "children": [ - "rCCA", - "rCCP", - "rIA", - "rIP", - "rM1", - "rPCIP", - "rPCM", - "rPCS", - "rPFCORB", - "rPFCPOL", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS1", - "rS2", - "rTCC", - "rV2", - "lM1" - ] - }, - { - "imports": [ - "rA2", - "rAMYG", - "rCCA", - "rCCP", - "rCCR", - "rFEF", - "rG", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCDL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS1", - "rS2", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV2" - ], - "name": "rPCI", - "children": [ - "rA2", - "rAMYG", - "rCCA", - "rCCP", - "rCCR", - "rFEF", - "rG", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCDL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS1", - "rS2", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV2" - ] - }, - { - "imports": [ - "rA2", - "rAMYG", - "rCCA", - "rCCP", - "rCCR", - "rFEF", - "rG", - "rIA", - "rIP", - "rM1", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS1", - "rS2", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV1", - "rV2" - ], - "name": "rPCIP", - "children": [ - "rA2", - "rAMYG", - "rCCA", - "rCCP", - "rCCR", - "rFEF", - "rG", - "rIA", - "rIP", - "rM1", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS1", - "rS2", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV1", - "rV2" - ] - }, - { - "imports": [ - "rCCA", - "rCCP", - "rCCR", - "rFEF", - "rIA", - "rIP", - "rM1", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCORB", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rTCC", - "rTCS", - "rTCV", - "rV2", - "lPCM" - ], - "name": "rPCM", - "children": [ - "rCCA", - "rCCP", - "rCCR", - "rFEF", - "rIA", - "rIP", - "rM1", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCORB", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rTCC", - "rTCS", - "rTCV", - "rV2", - "lPCM" - ] - }, - { - "imports": [ - "rAMYG", - "rCCA", - "rCCP", - "rCCR", - "rCCS", - "rFEF", - "rIA", - "rIP", - "rM1", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS1", - "rTCC", - "rTCI", - "rTCS", - "rTCV", - "rV1", - "rV2", - "lPCS" - ], - "name": "rPCS", - "children": [ - "rAMYG", - "rCCA", - "rCCP", - "rCCR", - "rCCS", - "rFEF", - "rIA", - "rIP", - "rM1", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS1", - "rTCC", - "rTCI", - "rTCS", - "rTCV", - "rV1", - "rV2", - "lPCS" - ] - }, - { - "imports": [ - "rA2", - "rCCA", - "rCCP", - "rCCR", - "rCCS", - "rFEF", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCDM", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS1", - "rS2", - "rTCC", - "rTCS", - "rV2", - "lPFCCL" - ], - "name": "rPFCCL", - "children": [ - "rA2", - "rCCA", - "rCCP", - "rCCR", - "rCCS", - "rFEF", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCDM", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS1", - "rS2", - "rTCC", - "rTCS", - "rV2", - "lPFCCL" - ] - }, - { - "imports": [ - "rCCA", - "rCCP", - "rCCR", - "rCCS", - "rFEF", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCDM", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS2", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV2", - "lPFCDL" - ], - "name": "rPFCDL", - "children": [ - "rCCA", - "rCCP", - "rCCR", - "rCCS", - "rFEF", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCDM", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS2", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV2", - "lPFCDL" - ] - }, - { - "imports": [ - "rCCA", - "lPFCDM" - ], - "name": "rPFCDM", - "children": [ - "rCCA", - "lPFCDM" - ] - }, - { - "imports": [ - "rA1", - "rA2", - "rAMYG", - "rCCA", - "rCCP", - "rCCR", - "rCCS", - "rHC", - "rIA", - "rIP", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPHC", - "rTCC", - "rTCPOL", - "rTCS", - "rTCV", - "rV2", - "lPFCM" - ], - "name": "rPFCM", - "children": [ - "rA1", - "rA2", - "rAMYG", - "rCCA", - "rCCP", - "rCCR", - "rCCS", - "rHC", - "rIA", - "rIP", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPHC", - "rTCC", - "rTCPOL", - "rTCS", - "rTCV", - "rV2", - "lPFCM" - ] - }, - { - "imports": [ - "rA1", - "rA2", - "rAMYG", - "rCCA", - "rCCP", - "rCCR", - "rCCS", - "rFEF", - "rHC", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS1", - "rS2", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV2" - ], - "name": "rPFCORB", - "children": [ - "rA1", - "rA2", - "rAMYG", - "rCCA", - "rCCP", - "rCCR", - "rCCS", - "rFEF", - "rHC", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS1", - "rS2", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV2" - ] - }, - { - "imports": [ - "rA2", - "rCCA", - "rCCR", - "rCCS", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS1", - "rS2", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV2", - "lPFCPOL" - ], - "name": "rPFCPOL", - "children": [ - "rA2", - "rCCA", - "rCCR", - "rCCS", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS1", - "rS2", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV2", - "lPFCPOL" - ] - }, - { - "imports": [ - "rA1", - "rA2", - "rCCA", - "rCCP", - "rCCS", - "rFEF", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS2", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV2" - ], - "name": "rPFCVL", - "children": [ - "rA1", - "rA2", - "rCCA", - "rCCP", - "rCCS", - "rFEF", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS2", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV2" - ] - }, - { - "imports": [ - "rA1", - "rA2", - "rAMYG", - "rCCA", - "rCCP", - "rCCR", - "rCCS", - "rFEF", - "rHC", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rS2", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV2" - ], - "name": "rPHC", - "children": [ - "rA1", - "rA2", - "rAMYG", - "rCCA", - "rCCP", - "rCCR", - "rCCS", - "rFEF", - "rHC", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rS2", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV2" - ] - }, - { - "imports": [ - "rA2", - "rCCA", - "rFEF", - "rIA", - "rIP", - "rM1", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCDM", - "rPFCORB", - "rPFCVL", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS1", - "rS2", - "rTCC", - "rTCS", - "rV2", - "lPMCDL" - ], - "name": "rPMCDL", - "children": [ - "rA2", - "rCCA", - "rFEF", - "rIA", - "rIP", - "rM1", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCDM", - "rPFCORB", - "rPFCVL", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS1", - "rS2", - "rTCC", - "rTCS", - "rV2", - "lPMCDL" - ] - }, - { - "imports": [ - "rA2", - "rCCA", - "rFEF", - "rIA", - "rIP", - "rM1", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCDM", - "rPFCORB", - "rPFCVL", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS1", - "rS2", - "rTCC", - "rTCS", - "rV2", - "lPMCM" - ], - "name": "rPMCM", - "children": [ - "rA2", - "rCCA", - "rFEF", - "rIA", - "rIP", - "rM1", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCDM", - "rPFCORB", - "rPFCVL", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS1", - "rS2", - "rTCC", - "rTCS", - "rV2", - "lPMCM" - ] - }, - { - "imports": [ - "rCCA", - "rIA", - "rIP", - "rM1", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCORB", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS1", - "rS2", - "rTCC", - "rV2" - ], - "name": "rPMCVL", - "children": [ - "rCCA", - "rIA", - "rIP", - "rM1", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCORB", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rS1", - "rS2", - "rTCC", - "rV2" - ] - }, - { - "imports": [ - "rG", - "rIA", - "rIP", - "rM1", - "rPCI", - "rPCIP", - "rPCS", - "rPFCCL", - "rPMCDL", - "rPMCM", - "rS1", - "rS2", - "lS1" - ], - "name": "rS1", - "children": [ - "rG", - "rIA", - "rIP", - "rM1", - "rPCI", - "rPCIP", - "rPCS", - "rPFCCL", - "rPMCDL", - "rPMCM", - "rS1", - "rS2", - "lS1" - ] - }, - { - "imports": [ - "rCCA", - "rG", - "rIP", - "rM1", - "rPCI", - "rPCIP", - "rPFCCL", - "rPMCVL", - "rS1", - "rS2" - ], - "name": "rS2", - "children": [ - "rCCA", - "rG", - "rIP", - "rM1", - "rPCI", - "rPCIP", - "rPFCCL", - "rPMCVL", - "rS1", - "rS2" - ] - }, - { - "imports": [ - "rA1", - "rA2", - "rAMYG", - "rCCA", - "rCCP", - "rCCS", - "rFEF", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPHC", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV1", - "rV2" - ], - "name": "rTCC", - "children": [ - "rA1", - "rA2", - "rAMYG", - "rCCA", - "rCCP", - "rCCS", - "rFEF", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPHC", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV1", - "rV2" - ] - }, - { - "imports": [ - "rAMYG", - "rFEF", - "rIP", - "rPCI", - "rPCIP", - "rPCS", - "rPFCORB", - "rPFCVL", - "rPHC", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV2" - ], - "name": "rTCI", - "children": [ - "rAMYG", - "rFEF", - "rIP", - "rPCI", - "rPCIP", - "rPCS", - "rPFCORB", - "rPFCVL", - "rPHC", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV2" - ] - }, - { - "imports": [ - "rA1", - "rA2", - "rAMYG", - "rCCA", - "rCCR", - "rCCS", - "rIA", - "rIP", - "rPCI", - "rPFCCL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rTCC", - "rTCI", - "rTCS", - "rTCV" - ], - "name": "rTCPOL", - "children": [ - "rA1", - "rA2", - "rAMYG", - "rCCA", - "rCCR", - "rCCS", - "rIA", - "rIP", - "rPCI", - "rPFCCL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rTCC", - "rTCI", - "rTCS", - "rTCV" - ] - }, - { - "imports": [ - "rA1", - "rA2", - "rAMYG", - "rCCP", - "rFEF", - "rIA", - "rPCI", - "rPCIP", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV2" - ], - "name": "rTCS", - "children": [ - "rA1", - "rA2", - "rAMYG", - "rCCP", - "rFEF", - "rIA", - "rPCI", - "rPCIP", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV2" - ] - }, - { - "imports": [ - "rA1", - "rA2", - "rAMYG", - "rCCA", - "rCCP", - "rCCR", - "rCCS", - "rFEF", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rS2", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV2" - ], - "name": "rTCV", - "children": [ - "rA1", - "rA2", - "rAMYG", - "rCCA", - "rCCP", - "rCCR", - "rCCS", - "rFEF", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCM", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rS2", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV2" - ] - }, - { - "imports": [ - "rAMYG", - "rPCI", - "rPCIP", - "rPHC", - "rTCC", - "rTCS", - "rV1", - "rV2", - "lV1" - ], - "name": "rV1", - "children": [ - "rAMYG", - "rPCI", - "rPCIP", - "rPHC", - "rTCC", - "rTCS", - "rV1", - "rV2", - "lV1" - ] - }, - { - "imports": [ - "rAMYG", - "rCCA", - "rCCS", - "rFEF", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV1", - "rV2", - "lV2" - ], - "name": "rV2", - "children": [ - "rAMYG", - "rCCA", - "rCCS", - "rFEF", - "rIA", - "rIP", - "rPCI", - "rPCIP", - "rPCM", - "rPCS", - "rPFCCL", - "rPFCDL", - "rPFCORB", - "rPFCPOL", - "rPFCVL", - "rPHC", - "rPMCDL", - "rPMCM", - "rPMCVL", - "rTCC", - "rTCI", - "rTCPOL", - "rTCS", - "rTCV", - "rV1", - "rV2", - "lV2" - ] - }, - { - "imports": [], - "name": "rCC", - "children": [] - }, - { - "imports": [ - "lA1", - "lA2", - "lCCA", - "lCCS", - "lIA", - "lIP", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPHC", - "lTCC", - "lTCS", - "lTCV" - ], - "name": "lA1", - "children": [ - "lA1", - "lA2", - "lCCA", - "lCCS", - "lIA", - "lIP", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPHC", - "lTCC", - "lTCS", - "lTCV" - ] - }, - { - "imports": [ - "lA1", - "lA2", - "lFEF", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lTCC", - "lTCS", - "lTCV" - ], - "name": "lA2", - "children": [ - "lA1", - "lA2", - "lFEF", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lTCC", - "lTCS", - "lTCV" - ] - }, - { - "imports": [ - "rAMYG", - "lAMYG", - "lPHC", - "lTCC", - "lTCI", - "lTCPOL", - "lTCV" - ], - "name": "lAMYG", - "children": [ - "rAMYG", - "lAMYG", - "lPHC", - "lTCC", - "lTCI", - "lTCPOL", - "lTCV" - ] - }, - { - "imports": [ - "rCCA", - "lA1", - "lAMYG", - "lCCA", - "lCCP", - "lCCS", - "lFEF", - "lG", - "lHC", - "lIA", - "lIP", - "lM1", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCDM", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS2", - "lTCPOL", - "lTCV", - "lV2" - ], - "name": "lCCA", - "children": [ - "rCCA", - "lA1", - "lAMYG", - "lCCA", - "lCCP", - "lCCS", - "lFEF", - "lG", - "lHC", - "lIA", - "lIP", - "lM1", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCDM", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS2", - "lTCPOL", - "lTCV", - "lV2" - ] - }, - { - "imports": [ - "rCCP", - "lA1", - "lA2", - "lCCA", - "lCCP", - "lCCR", - "lCCS", - "lFEF", - "lIP", - "lM1", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPHC", - "lS1", - "lS2", - "lTCC", - "lTCS", - "lTCV", - "lV2" - ], - "name": "lCCP", - "children": [ - "rCCP", - "lA1", - "lA2", - "lCCA", - "lCCP", - "lCCR", - "lCCS", - "lFEF", - "lIP", - "lM1", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPHC", - "lS1", - "lS2", - "lTCC", - "lTCS", - "lTCV", - "lV2" - ] - }, - { - "imports": [ - "rCCR", - "lCCP", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL" - ], - "name": "lCCR", - "children": [ - "rCCR", - "lCCP", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL" - ] - }, - { - "imports": [ - "rCCS", - "lA1", - "lA2", - "lAMYG", - "lCCA", - "lCCP", - "lCCR", - "lCCS", - "lHC", - "lIA", - "lIP", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lTCC", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ], - "name": "lCCS", - "children": [ - "rCCS", - "lA1", - "lA2", - "lAMYG", - "lCCA", - "lCCP", - "lCCR", - "lCCS", - "lHC", - "lIA", - "lIP", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lTCC", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ] - }, - { - "imports": [ - "rFEF", - "lA1", - "lA2", - "lCCA", - "lCCP", - "lCCR", - "lFEF", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lS1", - "lTCC", - "lTCPOL", - "lTCS", - "lV2" - ], - "name": "lFEF", - "children": [ - "rFEF", - "lA1", - "lA2", - "lCCA", - "lCCP", - "lCCR", - "lFEF", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lS1", - "lTCC", - "lTCPOL", - "lTCS", - "lV2" - ] - }, - { - "imports": [ - "lCCA", - "lCCP", - "lG", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPFCCL", - "lPFCORB", - "lPFCPOL", - "lPMCDL", - "lPMCM", - "lS1", - "lS2" - ], - "name": "lG", - "children": [ - "lCCA", - "lCCP", - "lG", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPFCCL", - "lPFCORB", - "lPFCPOL", - "lPMCDL", - "lPMCM", - "lS1", - "lS2" - ] - }, - { - "imports": [ - "lPHC" - ], - "name": "lHC", - "children": [ - "lPHC" - ] - }, - { - "imports": [ - "lA1", - "lA2", - "lAMYG", - "lCCA", - "lCCP", - "lCCR", - "lCCS", - "lFEF", - "lHC", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCVL", - "lS1", - "lS2", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ], - "name": "lIA", - "children": [ - "lA1", - "lA2", - "lAMYG", - "lCCA", - "lCCP", - "lCCR", - "lCCS", - "lFEF", - "lHC", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCVL", - "lS1", - "lS2", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ] - }, - { - "imports": [ - "lAMYG", - "lCCA", - "lCCR", - "lCCS", - "lHC", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCVL", - "lS1", - "lS2", - "lTCPOL", - "lTCV", - "lV2" - ], - "name": "lIP", - "children": [ - "lAMYG", - "lCCA", - "lCCR", - "lCCS", - "lHC", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCVL", - "lS1", - "lS2", - "lTCPOL", - "lTCV", - "lV2" - ] - }, - { - "imports": [ - "rM1", - "lCCA", - "lCCP", - "lIA", - "lIP", - "lM1", - "lPCIP", - "lPCM", - "lPCS", - "lPFCORB", - "lPFCPOL", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS1", - "lS2", - "lTCC", - "lV2" - ], - "name": "lM1", - "children": [ - "rM1", - "lCCA", - "lCCP", - "lIA", - "lIP", - "lM1", - "lPCIP", - "lPCM", - "lPCS", - "lPFCORB", - "lPFCPOL", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS1", - "lS2", - "lTCC", - "lV2" - ] - }, - { - "imports": [ - "lA2", - "lAMYG", - "lCCA", - "lCCP", - "lCCR", - "lFEF", - "lG", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCDL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS1", - "lS2", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ], - "name": "lPCI", - "children": [ - "lA2", - "lAMYG", - "lCCA", - "lCCP", - "lCCR", - "lFEF", - "lG", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCDL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS1", - "lS2", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ] - }, - { - "imports": [ - "lA2", - "lAMYG", - "lCCA", - "lCCP", - "lCCR", - "lFEF", - "lG", - "lIA", - "lIP", - "lM1", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS1", - "lS2", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV1", - "lV2" - ], - "name": "lPCIP", - "children": [ - "lA2", - "lAMYG", - "lCCA", - "lCCP", - "lCCR", - "lFEF", - "lG", - "lIA", - "lIP", - "lM1", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS1", - "lS2", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV1", - "lV2" - ] - }, - { - "imports": [ - "rPCM", - "lCCA", - "lCCP", - "lCCR", - "lFEF", - "lIA", - "lIP", - "lM1", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCORB", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lTCC", - "lTCS", - "lTCV", - "lV2" - ], - "name": "lPCM", - "children": [ - "rPCM", - "lCCA", - "lCCP", - "lCCR", - "lFEF", - "lIA", - "lIP", - "lM1", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCORB", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lTCC", - "lTCS", - "lTCV", - "lV2" - ] - }, - { - "imports": [ - "rPCS", - "lAMYG", - "lCCA", - "lCCP", - "lCCR", - "lCCS", - "lFEF", - "lIA", - "lIP", - "lM1", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS1", - "lTCC", - "lTCI", - "lTCS", - "lTCV", - "lV1", - "lV2" - ], - "name": "lPCS", - "children": [ - "rPCS", - "lAMYG", - "lCCA", - "lCCP", - "lCCR", - "lCCS", - "lFEF", - "lIA", - "lIP", - "lM1", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS1", - "lTCC", - "lTCI", - "lTCS", - "lTCV", - "lV1", - "lV2" - ] - }, - { - "imports": [ - "rPFCCL", - "lA2", - "lCCA", - "lCCP", - "lCCR", - "lCCS", - "lFEF", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCDM", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS1", - "lS2", - "lTCC", - "lTCS", - "lV2" - ], - "name": "lPFCCL", - "children": [ - "rPFCCL", - "lA2", - "lCCA", - "lCCP", - "lCCR", - "lCCS", - "lFEF", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCDM", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS1", - "lS2", - "lTCC", - "lTCS", - "lV2" - ] - }, - { - "imports": [ - "rPFCDL", - "lCCA", - "lCCP", - "lCCR", - "lCCS", - "lFEF", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCDM", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS2", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ], - "name": "lPFCDL", - "children": [ - "rPFCDL", - "lCCA", - "lCCP", - "lCCR", - "lCCS", - "lFEF", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCDM", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS2", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ] - }, - { - "imports": [ - "rPFCDM", - "lCCA" - ], - "name": "lPFCDM", - "children": [ - "rPFCDM", - "lCCA" - ] - }, - { - "imports": [ - "rPFCM", - "lA1", - "lA2", - "lAMYG", - "lCCA", - "lCCP", - "lCCR", - "lCCS", - "lHC", - "lIA", - "lIP", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPHC", - "lTCC", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ], - "name": "lPFCM", - "children": [ - "rPFCM", - "lA1", - "lA2", - "lAMYG", - "lCCA", - "lCCP", - "lCCR", - "lCCS", - "lHC", - "lIA", - "lIP", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPHC", - "lTCC", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ] - }, - { - "imports": [ - "lA1", - "lA2", - "lAMYG", - "lCCA", - "lCCP", - "lCCR", - "lCCS", - "lFEF", - "lHC", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS1", - "lS2", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ], - "name": "lPFCORB", - "children": [ - "lA1", - "lA2", - "lAMYG", - "lCCA", - "lCCP", - "lCCR", - "lCCS", - "lFEF", - "lHC", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS1", - "lS2", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ] - }, - { - "imports": [ - "rPFCPOL", - "lA2", - "lCCA", - "lCCR", - "lCCS", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS1", - "lS2", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ], - "name": "lPFCPOL", - "children": [ - "rPFCPOL", - "lA2", - "lCCA", - "lCCR", - "lCCS", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS1", - "lS2", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ] - }, - { - "imports": [ - "lA1", - "lA2", - "lCCA", - "lCCP", - "lCCS", - "lFEF", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS2", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ], - "name": "lPFCVL", - "children": [ - "lA1", - "lA2", - "lCCA", - "lCCP", - "lCCS", - "lFEF", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS2", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ] - }, - { - "imports": [ - "lA1", - "lA2", - "lAMYG", - "lCCA", - "lCCP", - "lCCR", - "lCCS", - "lFEF", - "lHC", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lS2", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ], - "name": "lPHC", - "children": [ - "lA1", - "lA2", - "lAMYG", - "lCCA", - "lCCP", - "lCCR", - "lCCS", - "lFEF", - "lHC", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lS2", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ] - }, - { - "imports": [ - "rPMCDL", - "lA2", - "lCCA", - "lFEF", - "lIA", - "lIP", - "lM1", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCDM", - "lPFCORB", - "lPFCVL", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS1", - "lS2", - "lTCC", - "lTCS", - "lV2" - ], - "name": "lPMCDL", - "children": [ - "rPMCDL", - "lA2", - "lCCA", - "lFEF", - "lIA", - "lIP", - "lM1", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCDM", - "lPFCORB", - "lPFCVL", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS1", - "lS2", - "lTCC", - "lTCS", - "lV2" - ] - }, - { - "imports": [ - "rPMCM", - "lA2", - "lCCA", - "lFEF", - "lIA", - "lIP", - "lM1", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCDM", - "lPFCORB", - "lPFCVL", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS1", - "lS2", - "lTCC", - "lTCS", - "lV2" - ], - "name": "lPMCM", - "children": [ - "rPMCM", - "lA2", - "lCCA", - "lFEF", - "lIA", - "lIP", - "lM1", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCDM", - "lPFCORB", - "lPFCVL", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS1", - "lS2", - "lTCC", - "lTCS", - "lV2" - ] - }, - { - "imports": [ - "lCCA", - "lIA", - "lIP", - "lM1", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCORB", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS1", - "lS2", - "lTCC", - "lV2" - ], - "name": "lPMCVL", - "children": [ - "lCCA", - "lIA", - "lIP", - "lM1", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCORB", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lS1", - "lS2", - "lTCC", - "lV2" - ] - }, - { - "imports": [ - "rS1", - "lG", - "lIA", - "lIP", - "lM1", - "lPCI", - "lPCIP", - "lPCS", - "lPFCCL", - "lPMCDL", - "lPMCM", - "lS1", - "lS2" - ], - "name": "lS1", - "children": [ - "rS1", - "lG", - "lIA", - "lIP", - "lM1", - "lPCI", - "lPCIP", - "lPCS", - "lPFCCL", - "lPMCDL", - "lPMCM", - "lS1", - "lS2" - ] - }, - { - "imports": [ - "lCCA", - "lG", - "lIP", - "lM1", - "lPCI", - "lPCIP", - "lPFCCL", - "lPMCVL", - "lS1", - "lS2" - ], - "name": "lS2", - "children": [ - "lCCA", - "lG", - "lIP", - "lM1", - "lPCI", - "lPCIP", - "lPFCCL", - "lPMCVL", - "lS1", - "lS2" - ] - }, - { - "imports": [ - "lA1", - "lA2", - "lAMYG", - "lCCA", - "lCCP", - "lCCS", - "lFEF", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPHC", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV1", - "lV2" - ], - "name": "lTCC", - "children": [ - "lA1", - "lA2", - "lAMYG", - "lCCA", - "lCCP", - "lCCS", - "lFEF", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPHC", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV1", - "lV2" - ] - }, - { - "imports": [ - "lAMYG", - "lFEF", - "lIP", - "lPCI", - "lPCIP", - "lPCS", - "lPFCORB", - "lPFCVL", - "lPHC", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ], - "name": "lTCI", - "children": [ - "lAMYG", - "lFEF", - "lIP", - "lPCI", - "lPCIP", - "lPCS", - "lPFCORB", - "lPFCVL", - "lPHC", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ] - }, - { - "imports": [ - "lA1", - "lA2", - "lAMYG", - "lCCA", - "lCCR", - "lCCS", - "lIA", - "lIP", - "lPCI", - "lPFCCL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lTCC", - "lTCI", - "lTCS", - "lTCV" - ], - "name": "lTCPOL", - "children": [ - "lA1", - "lA2", - "lAMYG", - "lCCA", - "lCCR", - "lCCS", - "lIA", - "lIP", - "lPCI", - "lPFCCL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lTCC", - "lTCI", - "lTCS", - "lTCV" - ] - }, - { - "imports": [ - "lA1", - "lA2", - "lAMYG", - "lCCP", - "lFEF", - "lIA", - "lPCI", - "lPCIP", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ], - "name": "lTCS", - "children": [ - "lA1", - "lA2", - "lAMYG", - "lCCP", - "lFEF", - "lIA", - "lPCI", - "lPCIP", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ] - }, - { - "imports": [ - "lA1", - "lA2", - "lAMYG", - "lCCA", - "lCCP", - "lCCR", - "lCCS", - "lFEF", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lS2", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ], - "name": "lTCV", - "children": [ - "lA1", - "lA2", - "lAMYG", - "lCCA", - "lCCP", - "lCCR", - "lCCS", - "lFEF", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCM", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lS2", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV2" - ] - }, - { - "imports": [ - "rV1", - "lAMYG", - "lPCI", - "lPCIP", - "lPHC", - "lTCC", - "lTCS", - "lV1", - "lV2" - ], - "name": "lV1", - "children": [ - "rV1", - "lAMYG", - "lPCI", - "lPCIP", - "lPHC", - "lTCC", - "lTCS", - "lV1", - "lV2" - ] - }, - { - "imports": [ - "rV2", - "lAMYG", - "lCCA", - "lCCS", - "lFEF", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV1", - "lV2" - ], - "name": "lV2", - "children": [ - "rV2", - "lAMYG", - "lCCA", - "lCCS", - "lFEF", - "lIA", - "lIP", - "lPCI", - "lPCIP", - "lPCM", - "lPCS", - "lPFCCL", - "lPFCDL", - "lPFCORB", - "lPFCPOL", - "lPFCVL", - "lPHC", - "lPMCDL", - "lPMCM", - "lPMCVL", - "lTCC", - "lTCI", - "lTCPOL", - "lTCS", - "lTCV", - "lV1", - "lV2" - ] - }, - { - "imports": [], - "name": "lCC", - "children": [] - } -] diff --git a/tvbwidgets/ui/connectivity/connectivity_widget.py b/tvbwidgets/ui/connectivity/connectivity_widget.py index dd3a4ab4..d40457d4 100644 --- a/tvbwidgets/ui/connectivity/connectivity_widget.py +++ b/tvbwidgets/ui/connectivity/connectivity_widget.py @@ -9,13 +9,15 @@ import ipyreact import traitlets +from IPython.display import HTML from .connectivity_model import ConnectivityDTO class ConnectivityWidget(ipyreact.ReactWidget): _esm = pathlib.Path(__file__).resolve().parent / 'Connectivity.tsx' - + css_rules = (pathlib.Path(__file__).resolve().parent / 'Connectivity.css').read_text() + HTML("") connectivity = traitlets.Any().tag(sync=True) def __init__(self, connectivity=None, **kwargs): From 746e3a2e487227447bf374359ce8b9bfb41918d0 Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Thu, 24 Aug 2023 11:27:03 +0300 Subject: [PATCH 04/24] WID-223: implement edge bundle viewer - improve code and start work on new widget using ipywidgets (wip) --- notebooks/Connectivity.ipynb | 20 +- tvbwidgets/api.py | 2 +- .../Connectivity.css | 0 .../Connectivity.tsx | 145 ++++++------ .../__init__.py | 0 .../connectivity_model.py | 0 .../connectivity_widget.py | 2 +- tvbwidgets/ui/connectivity_widget/__init__.py | 0 .../connectivity_widget.py | 208 ++++++++++++++++++ 9 files changed, 287 insertions(+), 90 deletions(-) rename tvbwidgets/ui/{connectivity => connectivity_react}/Connectivity.css (100%) rename tvbwidgets/ui/{connectivity => connectivity_react}/Connectivity.tsx (63%) rename tvbwidgets/ui/{connectivity => connectivity_react}/__init__.py (100%) rename tvbwidgets/ui/{connectivity => connectivity_react}/connectivity_model.py (100%) rename tvbwidgets/ui/{connectivity => connectivity_react}/connectivity_widget.py (97%) create mode 100644 tvbwidgets/ui/connectivity_widget/__init__.py create mode 100644 tvbwidgets/ui/connectivity_widget/connectivity_widget.py diff --git a/notebooks/Connectivity.ipynb b/notebooks/Connectivity.ipynb index cbcdc4df..53342a3a 100644 --- a/notebooks/Connectivity.ipynb +++ b/notebooks/Connectivity.ipynb @@ -18,12 +18,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "23-08-2023 04:08:30 - DEBUG - tvbwidgets - Package is not fully installed\n", - "23-08-2023 04:08:30 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", - "23-08-2023 04:08:30 - INFO - tvbwidgets - Version: 1.5.0\n", - "2023-08-23 16:08:36,608 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", - "23-08-2023 04:08:36 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", - "2023-08-23 16:08:36,810 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n", + "24-08-2023 11:07:43 - DEBUG - tvbwidgets - Package is not fully installed\n", + "24-08-2023 11:07:43 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", + "24-08-2023 11:07:43 - INFO - tvbwidgets - Version: 1.5.0\n", + "2023-08-24 11:07:49,077 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", + "24-08-2023 11:07:49 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", + "2023-08-24 11:07:49,252 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n", "Connectivity (\n", " Number of connections ..... 0\n", " Number of regions ......... 0\n", @@ -41,12 +41,12 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "45c65c965a6d486aa6df4795e7a7bcba", + "model_id": "fc29a4e3b227463b80e0086a8537fcb3", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "ConnectivityWidget(connectivity={'areas': [396.44065, 937.50289, 1903.8602, 2099.4259, 1808.146, 1114.739, 191…" + "ConnectivityWidgetReact(connectivity={'areas': [396.44065, 937.50289, 1903.8602, 2099.4259, 1808.146, 1114.739…" ] }, "metadata": {}, @@ -54,13 +54,13 @@ } ], "source": [ - "from tvbwidgets.api import ConnectivityWidget\n", + "from tvbwidgets.api import ConnectivityWidgetReact\n", "from tvb.datatypes.connectivity import Connectivity\n", "\n", "connectivity = Connectivity.from_file() # defaults to connectivy_76.zip\n", "print(connectivity)\n", "\n", - "wid = ConnectivityWidget(connectivity=connectivity)\n", + "wid = ConnectivityWidgetReact(connectivity=connectivity)\n", "wid" ] }, diff --git a/tvbwidgets/api.py b/tvbwidgets/api.py index 965f658a..93227de4 100644 --- a/tvbwidgets/api.py +++ b/tvbwidgets/api.py @@ -5,7 +5,7 @@ # (c) 2022-2023, TVB Widgets Team # -from .ui.connectivity.connectivity_widget import ConnectivityWidget +from .ui.connectivity_react.connectivity_widget import ConnectivityWidgetReact from .ui.phase_plane_widget import PhasePlaneWidget from .ui.storage_widget import StorageWidget from .ui.head_widget import HeadBrowser, HeadWidget, HeadWidgetConfig diff --git a/tvbwidgets/ui/connectivity/Connectivity.css b/tvbwidgets/ui/connectivity_react/Connectivity.css similarity index 100% rename from tvbwidgets/ui/connectivity/Connectivity.css rename to tvbwidgets/ui/connectivity_react/Connectivity.css diff --git a/tvbwidgets/ui/connectivity/Connectivity.tsx b/tvbwidgets/ui/connectivity_react/Connectivity.tsx similarity index 63% rename from tvbwidgets/ui/connectivity/Connectivity.tsx rename to tvbwidgets/ui/connectivity_react/Connectivity.tsx index 83d15af9..60a885ee 100644 --- a/tvbwidgets/ui/connectivity/Connectivity.tsx +++ b/tvbwidgets/ui/connectivity_react/Connectivity.tsx @@ -11,37 +11,37 @@ const HIERARCHY_SEPARATOR = "."; const HIERARCHY_SEPARATOR_REPLACEMENT = "_"; /** - * A function for drawing a hierarchical edge bundle + * A function for preparing the regions hierarchy * - * @param data The data structure that has the region labels and the adjiacence matrix + * @param data The data structure that has the region labels and the adjacency matrix * @param testFn Callable for filtering edges */ export function initHierarchicalEdgeBundle(data, testFn) { const l = data.region_labels.length; - let jsonified_region_labels = []; + let regionLabels = []; let hasSpecialCharacters = false; for (let i = 0; i < l; i++) { - let json_line = { + let region = { imports: undefined, name: undefined, }; - json_line.imports = []; + region.imports = []; let k = 0; //k is a counter for connected regions with the j-th region for (let j = 0; j < l; j++) { let w = 0; w = data.matrix[i * l + j]; hasSpecialCharacters = hasSpecialCharacters || (data.region_labels[i].lastIndexOf(HIERARCHY_SEPARATOR) > 0); - json_line.name = data.region_labels[i].replace(HIERARCHY_SEPARATOR, HIERARCHY_SEPARATOR_REPLACEMENT); + region.name = data.region_labels[i].replace(HIERARCHY_SEPARATOR, HIERARCHY_SEPARATOR_REPLACEMENT); if (testFn(w)) { - json_line.imports[k] = data.region_labels[j].replace(HIERARCHY_SEPARATOR, HIERARCHY_SEPARATOR_REPLACEMENT); + region.imports[k] = data.region_labels[j].replace(HIERARCHY_SEPARATOR, HIERARCHY_SEPARATOR_REPLACEMENT); k++; } } - jsonified_region_labels[i] = json_line; + regionLabels[i] = region; } - return jsonified_region_labels; + return regionLabels; } const BUNDLE = { @@ -57,82 +57,71 @@ export default function Connectivity({connectivity, on_connectivity}) { const colorout = "#f00"; const colornone = "#ccc"; - const connectivityEdgesData = { - region_labels: [""], - matrix: [], - svg: { - d3: null, - svg: null, - }, - data_url: "", - state: bundle - }; - - React.useEffect(() => { - connectivityEdgesData.region_labels = connectivity.region_labels; - connectivityEdgesData.svg.d3 = d3.select("#middle-edge-bundle"); - connectivityEdgesData.svg.svg = document.querySelector("#middle-edge-bundle"); + /** + * Data to visualise shaped as a node hierarchy + */ + const connectivityEdgesData = React.useMemo(() => { let tracts1D = []; let weights1D = []; - for (const subArr of connectivity.tract_lengths) { - tracts1D = tracts1D.concat(subArr); - } - for (const subArr of connectivity.weights) { - weights1D = weights1D.concat(subArr); + if (bundle === BUNDLE.tracts) { + for (const subArr of connectivity.tract_lengths) { + tracts1D = tracts1D.concat(subArr); + } + } else { + for (const subArr of connectivity.weights) { + weights1D = weights1D.concat(subArr); + } } - console.log(connectivityEdgesData.region_labels); - connectivityEdgesData.matrix = bundle === BUNDLE.weights ? weights1D : tracts1D; - const dataJson = initHierarchicalEdgeBundle(connectivityEdgesData, d => d !== 0); - const data = {name: 'root', children: dataJson}; - function id(node) { - return node.data.name; - } + const connData = { + region_labels: connectivity.region_labels, + matrix: bundle === BUNDLE.weights ? weights1D : tracts1D, + state: bundle + }; + const edgeBundle = initHierarchicalEdgeBundle(connData, d => d !== 0); + return {name: 'root', children: edgeBundle}; + }, [connectivity, bundle]); - function hierarchy(data, delimiter = ".") { - let root; - const map = new Map; - data.forEach(function find(data) { - const {name} = data; - if (map.has(name)) return map.get(name); - const i = name.lastIndexOf(delimiter); - map.set(name, data); - if (i >= 0) { - find({name: name.substring(0, i), children: []}).children.push(data); - data.name = name.substring(i + 1); - } else { - root = data; + /** + * Utility function to get the name of a node's data + */ + const id = React.useCallback((node) => node.data.name, []); + + /** + * + */ + const bilink = React.useCallback((root) => { + const map = new Map(root.leaves().map(d => [id(d), d])); + for (const d of root.leaves()) { + d.incoming = []; + d.outgoing = []; + + for (const i of d.data.imports) { + const target = map.get(i); + if (target) { + d.outgoing.push([d, target]); + if (!target.incoming) target.incoming = []; + target.incoming.push([d, target]); } - return data; - }); - return root; - } + } - function bilink(root) { - const map = new Map(root.leaves().map(d => [id(d), d])); - for (const d of root.leaves()) { - d.incoming = []; - d.outgoing = []; - - for (const i of d.data.imports) { - const target = map.get(i); - if (target) { - d.outgoing.push([d, target]); - if (!target.incoming) target.incoming = []; - target.incoming.push([d, target]); - } - } + for (const [, target] of d.incoming) { + if (!target.outgoing) target.outgoing = []; + target.outgoing.push([target, d]); } - return root; } + return root; + }, []) + + React.useEffect(() => { // Visualization code const width = 954; const radius = width / 2; const tree = d3.cluster() .size([2 * Math.PI, radius - 100]); - const root = tree(bilink(d3.hierarchy(data) + const root = tree(bilink(d3.hierarchy(connectivityEdgesData) .sort((a, b) => d3.ascending(a.height, b.height) || d3.ascending(a.data.name, b.data.name)))); console.log('root: ', root); const svg = d3.create("svg") @@ -141,7 +130,7 @@ export default function Connectivity({connectivity, on_connectivity}) { .attr("viewBox", [-width / 2, -width / 2, width, width]) .attr("style", "max-width: 100%; height: auto; font: 10px sans-serif;"); - const node = svg.append("g") + svg.append("g") .selectAll() .data(root.leaves()) .join("g") @@ -155,8 +144,8 @@ export default function Connectivity({connectivity, on_connectivity}) { .each(function (d) { d.text = this; }) - .on("mouseover", overed) - .on("mouseout", outed) + .on("mouseover", mouseOverNode) + .on("mouseout", mouseOutNode) .call(text => text.append("title").text(d => `${id(d)} ${d.outgoing.length} outgoing ${d.incoming.length} incoming`)); @@ -178,29 +167,31 @@ export default function Connectivity({connectivity, on_connectivity}) { d.path = this; }); - function overed(event, d) { + function mouseOverNode(event, d) { link.style("mix-blend-mode", null); d3.select(this).attr("font-weight", "bold"); + console.log('d.incomming: ', d.incoming); // Highlight incoming lines and text d3.selectAll(d.incoming.map(d => d.path)).attr("stroke", colorin).raise(); d3.selectAll(d.incoming.map(([d]) => d.text)).attr("fill", colorin).attr("font-weight", "bold"); + console.log('outgoing: ', d.outgoing); // Highlight outgoing lines and text d3.selectAll(d.outgoing.map(d => d.path)).attr("stroke", colorout).raise(); d3.selectAll(d.outgoing.map(([, d]) => d.text)).attr("fill", colorout).attr("font-weight", "bold"); } - function outed(event, d) { + function mouseOutNode(event, d) { link.style("mix-blend-mode", "multiply"); d3.select(this).attr("font-weight", null); // Reset styles for incoming lines and text - d3.selectAll(d.incoming.map(d => d.path)).attr("stroke", null); + d3.selectAll(d.incoming.map(d => d.path)).attr("stroke", "gray"); d3.selectAll(d.incoming.map(([d]) => d.text)).attr("fill", null).attr("font-weight", null); // Reset styles for outgoing lines and text - d3.selectAll(d.outgoing.map(d => d.path)).attr("stroke", null); + d3.selectAll(d.outgoing.map(d => d.path)).attr("stroke", "gray"); d3.selectAll(d.outgoing.map(([, d]) => d.text)).attr("fill", null).attr("font-weight", null); } @@ -208,8 +199,6 @@ export default function Connectivity({connectivity, on_connectivity}) { ref.current?.appendChild(svg.node()); return () => svg.remove(); - - // chart(); }, [connectivity, bundle]); return (
diff --git a/tvbwidgets/ui/connectivity/__init__.py b/tvbwidgets/ui/connectivity_react/__init__.py similarity index 100% rename from tvbwidgets/ui/connectivity/__init__.py rename to tvbwidgets/ui/connectivity_react/__init__.py diff --git a/tvbwidgets/ui/connectivity/connectivity_model.py b/tvbwidgets/ui/connectivity_react/connectivity_model.py similarity index 100% rename from tvbwidgets/ui/connectivity/connectivity_model.py rename to tvbwidgets/ui/connectivity_react/connectivity_model.py diff --git a/tvbwidgets/ui/connectivity/connectivity_widget.py b/tvbwidgets/ui/connectivity_react/connectivity_widget.py similarity index 97% rename from tvbwidgets/ui/connectivity/connectivity_widget.py rename to tvbwidgets/ui/connectivity_react/connectivity_widget.py index d40457d4..493f37a3 100644 --- a/tvbwidgets/ui/connectivity/connectivity_widget.py +++ b/tvbwidgets/ui/connectivity_react/connectivity_widget.py @@ -14,7 +14,7 @@ from .connectivity_model import ConnectivityDTO -class ConnectivityWidget(ipyreact.ReactWidget): +class ConnectivityWidgetReact(ipyreact.ReactWidget): _esm = pathlib.Path(__file__).resolve().parent / 'Connectivity.tsx' css_rules = (pathlib.Path(__file__).resolve().parent / 'Connectivity.css').read_text() HTML("") diff --git a/tvbwidgets/ui/connectivity_widget/__init__.py b/tvbwidgets/ui/connectivity_widget/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tvbwidgets/ui/connectivity_widget/connectivity_widget.py b/tvbwidgets/ui/connectivity_widget/connectivity_widget.py new file mode 100644 index 00000000..efd60b65 --- /dev/null +++ b/tvbwidgets/ui/connectivity_widget/connectivity_widget.py @@ -0,0 +1,208 @@ +# -*- coding: utf-8 -*- +# +# "TheVirtualBrain - Widgets" package +# +# (c) 2022-2023, TVB Widgets Team +# + +import ipywidgets +import numpy +import pyvista +from pyvista import PolyData +from tvb.basic.neotraits.api import HasTraits +from tvb.datatypes.connectivity import Connectivity +from tvb.datatypes.region_mapping import RegionMapping +from tvb.datatypes.sensors import Sensors +from tvb.datatypes.surfaces import Surface + +from tvbwidgets.ui.base_widget import TVBWidget +from tvbwidgets.ui.widget_with_browser import TVBWidgetWithBrowser + +pyvista.set_jupyter_backend('pythreejs') + + +class HeadWidgetConfig: + + def __init__(self, name='Actor', style='Surface', color='White', light=True, size=1500, cmap=None, scalars=None): + self.name = name + self.style = style + self.color = color + self.light = light + self.size = size + self.cmap = cmap + self.scalars = scalars + self.widget = None + + def add_region_mapping_as_cmap(self, region_mapping): + # type: (RegionMapping) -> None + self.scalars = region_mapping.array_data + self.cmap = 'fire' + + def is_incompatible(self, prev_config): + # type: (HeadWidgetConfig) -> bool + if prev_config is None: + return self.cmap is not None + if (self.cmap is not None and prev_config.cmap is None) or (self.cmap is None and prev_config.cmap is not None): + return True + return False + + +class CustomOutput(ipywidgets.Output): + CONFIG = HeadWidgetConfig() + MAX_ACTORS = 10 + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.plotter = pyvista.Plotter() + self.total_actors = 0 + + @property + def can_draw(self): + return self.total_actors < self.MAX_ACTORS + + def add_mesh(self, mesh, config=CONFIG): + if config.cmap is None or config.scalars is None: + actor = self.plotter.add_mesh(mesh, name=config.name, style=config.style, color=config.color, + lighting=config.light, render=False) + else: + actor = self.plotter.add_mesh(mesh, name=config.name, style=config.style, scalars=config.scalars, + cmap=config.cmap, lighting=config.light, render=False) + self.total_actors += 1 + return actor + + def add_points(self, points, config=CONFIG): + actor = self.plotter.add_points(points, name=config.name, color=config.color, + point_size=config.size, render=False) + self.total_actors += 1 + return actor + + def display_actor(self, actor): + self.plotter.renderer.add_actor(actor, render=False) + + def hide_actor(self, actor): + self.plotter.renderer.remove_actor(actor, render=False) + + def update_plot(self): + with self: + self.clear_output(wait=True) + self.plotter.show() + + +class ConnectivityWidget(ipywidgets.HBox, TVBWidget): + + def __init__(self, connectivity): + # type: (Connectivity) -> None + """ + :param connectivity: Connectivity to view or operate on + """ + self.connectivity = connectivity + self.output_plot = CustomOutput() + self.plot_controls = ipywidgets.Accordion(layout=ipywidgets.Layout(width='380px')) + self.existent_configs = [] + + super().__init__([self.plot_controls, self.output_plot], layout=self.DEFAULT_BORDER) + + self.__draw_connectivity_actor(datatype, config) + + def add_datatype(self, datatype): # type: (HasTraits) -> None + pass + + def __toggle_actor(self, change, actor): + if change.type == 'change': + if change.new is True: + self.output_plot.display_actor(actor) + else: + self.output_plot.hide_actor(actor) + self.output_plot.update_plot() + + def __draw_connectivity_actor(self, connectivity, config): + # type: (Connectivity, HeadWidgetConfig) -> None + if config is None: + config = HeadWidgetConfig(name='Connectivity-' + str(connectivity.number_of_regions), color='Green') + + conn_actor = self.output_plot.add_points(connectivity.centres, config) + controls_vbox = self._prepare_generic_controls(conn_actor, config) + extra_controls = self.__prepare_points_controls(conn_actor, config) + controls_vbox.children += extra_controls + + self.plot_controls.children += controls_vbox, + self.output_plot.update_plot() + + def _prepare_generic_controls(self, actor, config): + toggle_prefix = "Toggle " + title_suffix = " Controls" + + idx = self.output_plot.total_actors - 1 + self.plot_controls.set_title(idx, config.name + title_suffix) + + def toggle_actor(change): + self.__toggle_actor(change, actor) + + toggle_input = ipywidgets.Checkbox(description=toggle_prefix + config.name, value=True) + toggle_input.observe(toggle_actor, names=['value']) + + def on_name_change(change): + value = change['new'] + config.name = value + toggle_input.description = toggle_prefix + config.name + self.plot_controls.set_title(idx, config.name + title_suffix) + + name_input = ipywidgets.Text(value=config.name, description='Name: ', disabled=False, + layout=ipywidgets.Layout(width='250px')) + name_input.observe(on_name_change, names='value') + + def on_color_change(change): + value = change['new'] + rgb = pyvista.Color(value).float_rgb + actor.GetProperty().SetColor(rgb[0], rgb[1], rgb[2]) + self.output_plot.update_plot() + + color_input = ipywidgets.ColorPicker(concise=False, description='Color: ', value=config.color, disabled=False, + layout=ipywidgets.Layout(width='250px')) + color_input.observe(on_color_change, names='value') + + controls_vbox = ipywidgets.VBox([toggle_input, name_input, color_input]) + + return controls_vbox + + def __prepare_points_controls(self, actor, config): + def on_size_change(change): + value = change['new'] + actor.GetProperty().SetPointSize(value) + self.output_plot.update_plot() + + size_input = ipywidgets.IntText(value=config.size, description='Size: ', disabled=False, + layout=ipywidgets.Layout(width='250px')) + size_input.observe(on_size_change, names='value') + + return size_input, + + +class HeadBrowser(ipywidgets.VBox, TVBWidgetWithBrowser): + + def __init__(self): + super().__init__() + surface_button = ipywidgets.Button(description='View surface') + sensors_button = ipywidgets.Button(description='View sensors') + connectivity_button = ipywidgets.Button(description='View connectivity') + self.buttons = ipywidgets.HBox([surface_button, sensors_button, connectivity_button], + layout=ipywidgets.Layout(margin="0px 0px 0px 20px")) + self.head_widget = ConnectivityWidget() + self.children = [self.storage_widget, self.buttons, self.message_label, self.head_widget] + + def add_surface_datatype(_): + self.load_selected_file(Surface) + + def add_sensors_datatype(_): + self.load_selected_file(Sensors, ('.txt', '.txt.bz2')) + + def add_connectivity_datatype(_): + self.load_selected_file(Connectivity) + + surface_button.on_click(add_surface_datatype) + sensors_button.on_click(add_sensors_datatype) + connectivity_button.on_click(add_connectivity_datatype) + + def add_datatype(self, datatype, config=None): + # type: (HasTraits, HeadWidgetConfig) -> None + self.head_widget.add_datatype(datatype, config) From 706fb0f3bdefca3a8257cac93862038902e2ae2e Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Fri, 25 Aug 2023 12:23:56 +0300 Subject: [PATCH 05/24] WID-223: add 2d connectivity matrix viewer --- notebooks/Connectivity.ipynb | 61 ++--- notebooks/HeadWidget.ipynb | 150 +++++++++++-- tvbwidgets/api.py | 1 + .../__init__.py | 0 .../connectivity_ipy/connectivity_widget.py | 96 ++++++++ .../connectivity_widget.py | 208 ------------------ 6 files changed, 267 insertions(+), 249 deletions(-) rename tvbwidgets/ui/{connectivity_widget => connectivity_ipy}/__init__.py (100%) create mode 100644 tvbwidgets/ui/connectivity_ipy/connectivity_widget.py delete mode 100644 tvbwidgets/ui/connectivity_widget/connectivity_widget.py diff --git a/notebooks/Connectivity.ipynb b/notebooks/Connectivity.ipynb index 53342a3a..69056532 100644 --- a/notebooks/Connectivity.ipynb +++ b/notebooks/Connectivity.ipynb @@ -18,35 +18,46 @@ "name": "stdout", "output_type": "stream", "text": [ - "24-08-2023 11:07:43 - DEBUG - tvbwidgets - Package is not fully installed\n", - "24-08-2023 11:07:43 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", - "24-08-2023 11:07:43 - INFO - tvbwidgets - Version: 1.5.0\n", - "2023-08-24 11:07:49,077 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", - "24-08-2023 11:07:49 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", - "2023-08-24 11:07:49,252 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n", - "Connectivity (\n", - " Number of connections ..... 0\n", - " Number of regions ......... 0\n", - " Undirected ................ False\n", - " areas ..................... [min, median, max] = [0, 2580.89, 10338.2] dtype = float64 shape = (76,)\n", - " tract_lengths ............. [min, median, max] = [0, 71.6635, 153.486] dtype = float64 shape = (76, 76)\n", - " tract_lengths (connections) [min, median, max] = [0, 55.8574, 138.454] dtype = float64 shape = (1560,)\n", - " tract_lengths-non-zero .... [min, median, max] = [4.93328, 74.0646, 153.486] dtype = float64 shape = (5402,)\n", - " weights ................... [min, median, max] = [0, 0, 3] dtype = float64 shape = (76, 76)\n", - " weights-non-zero .......... [min, median, max] = [0.00462632, 2, 3] dtype = float64 shape = (1560,)\n", - ")\n", - "init ConnectivityWidget\n" + "25-08-2023 12:20:46 - DEBUG - tvbwidgets - Package is not fully installed\n", + "25-08-2023 12:20:46 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", + "25-08-2023 12:20:46 - INFO - tvbwidgets - Version: 1.5.0\n", + "2023-08-25 12:20:52,653 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", + "25-08-2023 12:20:52 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", + "2023-08-25 12:20:52,857 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" + ] + } + ], + "source": [ + "from tvbwidgets.api import ConnectivityWidgetReact\n", + "from tvb.datatypes.connectivity import Connectivity\n", + "\n", + "connectivity = Connectivity.from_file() # defaults to connectivy_76.zip\n", + "\n", + "# wid = ConnectivityWidgetReact(connectivity=connectivity)\n", + "# wid" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-08-25 12:20:52,875 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "fc29a4e3b227463b80e0086a8537fcb3", + "model_id": "86eda657f9fa4a81a24d9e267faf335b", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "ConnectivityWidgetReact(connectivity={'areas': [396.44065, 937.50289, 1903.8602, 2099.4259, 1808.146, 1114.739…" + "ConnectivityWidget(children=(Dropdown(description='Matrix:', index=1, options=(('Tracts', 'tracts'), ('Weights…" ] }, "metadata": {}, @@ -54,14 +65,14 @@ } ], "source": [ - "from tvbwidgets.api import ConnectivityWidgetReact\n", + "from tvbwidgets.api import ConnectivityWidget\n", "from tvb.datatypes.connectivity import Connectivity\n", "\n", - "connectivity = Connectivity.from_file() # defaults to connectivy_76.zip\n", - "print(connectivity)\n", + "conn = Connectivity.from_file() # defaults to connectivy_76.zip\n", + "conn.configure()\n", "\n", - "wid = ConnectivityWidgetReact(connectivity=connectivity)\n", - "wid" + "wid = ConnectivityWidget(conn)\n", + "display(wid)" ] }, { diff --git a/notebooks/HeadWidget.ipynb b/notebooks/HeadWidget.ipynb index d6d51ffc..aa9e8da7 100644 --- a/notebooks/HeadWidget.ipynb +++ b/notebooks/HeadWidget.ipynb @@ -34,10 +34,22 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "4675abde-4b90-4931-be0a-645ea3a81003", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "25-08-2023 10:55:57 - DEBUG - tvbwidgets - Package is not fully installed\n", + "25-08-2023 10:55:57 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", + "25-08-2023 10:55:57 - INFO - tvbwidgets - Version: 1.5.0\n", + "2023-08-25 10:56:02,673 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", + "25-08-2023 10:56:02 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n" + ] + } + ], "source": [ "from tvbwidgets.api import HeadWidget, HeadWidgetConfig\n", "from tvb.simulator.lab import *\n", @@ -46,10 +58,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "2bfd8e45-cfe1-44f4-b934-823716e27fad", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\david.bacter\\AppData\\Roaming\\Python\\Python310\\site-packages\\tvb\\basic\\readers.py:122: UserWarning: loadtxt: input contained no data: \"\"\n", + " array_result = numpy.loadtxt(file_stream, dtype=dtype, skiprows=skip_rows, usecols=use_cols)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2023-08-25 10:56:03,843 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" + ] + } + ], "source": [ "surface = surfaces.Surface.from_file()\n", "surface.configure()\n", @@ -68,7 +96,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "aa76e23c-bc9e-4bdf-bd83-e68487b0aa28", "metadata": {}, "outputs": [], @@ -78,10 +106,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "fad7a0df-ffe2-4c94-b0f4-a1e828d34b50", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'name': 'Cortex',\n", + " 'style': 'Surface',\n", + " 'color': 'beige',\n", + " 'light': True,\n", + " 'size': 1500,\n", + " 'cmap': None,\n", + " 'scalars': None,\n", + " 'widget': None}" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "config = HeadWidgetConfig(name='Cortex', color='beige')\n", "wid.add_datatype(surface, config)\n", @@ -90,10 +136,25 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "0b6c41e9-8a03-4996-929f-3ebbafadcc49", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "72e426c2465540d4ac9b4dcbea84101f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HeadWidget(children=(Accordion(children=(VBox(children=(Checkbox(value=True, description='Toggle Surface-8614'…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "display(wid)" ] @@ -108,10 +169,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "51e351e9-e1c9-416a-b486-3579fe718c43", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "{'name': 'Cortex',\n", + " 'style': 'Surface',\n", + " 'color': 'White',\n", + " 'light': True,\n", + " 'size': 1500,\n", + " 'cmap': 'fire',\n", + " 'scalars': array([36, 36, 36, ..., 68, 67, 68], dtype=int64),\n", + " 'widget': None}" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "config = HeadWidgetConfig(name='Cortex')\n", "config.add_region_mapping_as_cmap(reg_map)\n", @@ -120,12 +199,27 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "d50f83a3-667f-413f-a8d9-77437e41f9a4", "metadata": { "tags": [] }, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f1e2f33eee654b3eb7949ef130e8ba7f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HeadWidget(children=(Accordion(children=(VBox(children=(Checkbox(value=True, description='Toggle Cortex'), Tex…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "wid = HeadWidget()\n", "wid.add_datatype(surface, config)\n", @@ -154,10 +248,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "30dceb75-9940-4d80-8c3a-f134748411b9", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "25-08-2023 10:56:04 - INFO - tvbwidgets.core.auth - We could not find Collab Auth Token, we will search for env CLB_AUTH variable\n", + "25-08-2023 10:56:04 - INFO - tvbwidgets.core.auth - We found Collab Auth in environment!\n", + "25-08-2023 10:56:04 - ERROR - tvbwidgets.ui.drive_widget - Could not retrieve Repos from EBRAINS Drive!\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1562b480444a4c1eb091d8d60007af6f", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HeadBrowser(children=(StorageWidget(children=(VBox(), DriveWidget(children=(Dropdown(description='Repository',…" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "from tvbwidgets.api import HeadBrowser\n", "from IPython.core.display_functions import display\n", @@ -190,7 +308,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.13" + "version": "3.10.12" } }, "nbformat": 4, diff --git a/tvbwidgets/api.py b/tvbwidgets/api.py index 93227de4..5c0b5237 100644 --- a/tvbwidgets/api.py +++ b/tvbwidgets/api.py @@ -6,6 +6,7 @@ # from .ui.connectivity_react.connectivity_widget import ConnectivityWidgetReact +from .ui.connectivity_ipy.connectivity_widget import ConnectivityWidget from .ui.phase_plane_widget import PhasePlaneWidget from .ui.storage_widget import StorageWidget from .ui.head_widget import HeadBrowser, HeadWidget, HeadWidgetConfig diff --git a/tvbwidgets/ui/connectivity_widget/__init__.py b/tvbwidgets/ui/connectivity_ipy/__init__.py similarity index 100% rename from tvbwidgets/ui/connectivity_widget/__init__.py rename to tvbwidgets/ui/connectivity_ipy/__init__.py diff --git a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py new file mode 100644 index 00000000..4a18d641 --- /dev/null +++ b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py @@ -0,0 +1,96 @@ +# -*- coding: utf-8 -*- +# +# "TheVirtualBrain - Widgets" package +# +# (c) 2022-2023, TVB Widgets Team +# +import dataclasses + +import ipywidgets +import pyvista +import matplotlib +from numpy import ndarray +from tvb.basic.neotraits._attr import NArray +from tvb.basic.neotraits.api import HasTraits +from tvb.datatypes.connectivity import Connectivity +from tvbwidgets.ui.base_widget import TVBWidget + +pyvista.set_jupyter_backend('pythreejs') + + +@dataclasses.dataclass +class ConnectivityConfig: + name: str = 'Connectivity' + style: str = 'Surface' + color: str = 'White' + light: bool = True + size: int = 1500 + cmap: str | None = None + scalars: ndarray | NArray = None + widget: ipywidgets.Widget = None + + +class CustomOutput(ipywidgets.Output): + CONFIG = ConnectivityConfig() + MAX_ACTORS = 10 + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.plotter = matplotlib.pyplot + + +class ConnectivityWidget(ipywidgets.HBox, TVBWidget): + DROPDOWN_DESCRIPTION = 'Matrix:' + + def __init__(self, connectivity): + # type: (Connectivity) -> None + """ + :param connectivity: Connectivity to view or operate on + """ + self.connectivity = connectivity + self.output_plot = CustomOutput() + + super().__init__([self.output_plot], layout=self.DEFAULT_BORDER) + + self.__draw_connectivity() + + def add_datatype(self, datatype): # type: (HasTraits) -> None + pass + + def __show_plot(self, matrix=None): + dropdown = self.__find_dropdown() + if not dropdown and matrix is None: + self.logger.error('Non matrix found for plot!') + return None + dropdown_matrix = self.connectivity.weights if dropdown.value == 'weights' else self.connectivity.tract_lengths + matrix = matrix if matrix is not None else dropdown_matrix + with self.output_plot: + self.output_plot.clear_output(wait=True) + self.output_plot.plotter.matshow(matrix) + self.output_plot.plotter.show() + + def __find_dropdown(self): + # type: () -> ipywidgets.Dropdown | None + for wid in self.children: + try: + if wid.description and wid.description == self.DROPDOWN_DESCRIPTION: + return wid + except AttributeError: + pass + return None + + def __draw_connectivity(self): + # type: () -> None + def on_change(change): + if change['type'] == 'change' and change['name'] == 'value': + matrix = self.connectivity.weights if change['new'] == 'weights' else self.connectivity.tract_lengths + self.__show_plot(matrix) + + dropdown = ipywidgets.Dropdown( + options=[('Tracts', 'tracts'), ('Weights', 'weights')], + value='weights', + description='Matrix:' + ) + dropdown.observe(on_change) + self.children = (dropdown, *self.children) + self.__show_plot() diff --git a/tvbwidgets/ui/connectivity_widget/connectivity_widget.py b/tvbwidgets/ui/connectivity_widget/connectivity_widget.py deleted file mode 100644 index efd60b65..00000000 --- a/tvbwidgets/ui/connectivity_widget/connectivity_widget.py +++ /dev/null @@ -1,208 +0,0 @@ -# -*- coding: utf-8 -*- -# -# "TheVirtualBrain - Widgets" package -# -# (c) 2022-2023, TVB Widgets Team -# - -import ipywidgets -import numpy -import pyvista -from pyvista import PolyData -from tvb.basic.neotraits.api import HasTraits -from tvb.datatypes.connectivity import Connectivity -from tvb.datatypes.region_mapping import RegionMapping -from tvb.datatypes.sensors import Sensors -from tvb.datatypes.surfaces import Surface - -from tvbwidgets.ui.base_widget import TVBWidget -from tvbwidgets.ui.widget_with_browser import TVBWidgetWithBrowser - -pyvista.set_jupyter_backend('pythreejs') - - -class HeadWidgetConfig: - - def __init__(self, name='Actor', style='Surface', color='White', light=True, size=1500, cmap=None, scalars=None): - self.name = name - self.style = style - self.color = color - self.light = light - self.size = size - self.cmap = cmap - self.scalars = scalars - self.widget = None - - def add_region_mapping_as_cmap(self, region_mapping): - # type: (RegionMapping) -> None - self.scalars = region_mapping.array_data - self.cmap = 'fire' - - def is_incompatible(self, prev_config): - # type: (HeadWidgetConfig) -> bool - if prev_config is None: - return self.cmap is not None - if (self.cmap is not None and prev_config.cmap is None) or (self.cmap is None and prev_config.cmap is not None): - return True - return False - - -class CustomOutput(ipywidgets.Output): - CONFIG = HeadWidgetConfig() - MAX_ACTORS = 10 - - def __init__(self, **kwargs): - super().__init__(**kwargs) - self.plotter = pyvista.Plotter() - self.total_actors = 0 - - @property - def can_draw(self): - return self.total_actors < self.MAX_ACTORS - - def add_mesh(self, mesh, config=CONFIG): - if config.cmap is None or config.scalars is None: - actor = self.plotter.add_mesh(mesh, name=config.name, style=config.style, color=config.color, - lighting=config.light, render=False) - else: - actor = self.plotter.add_mesh(mesh, name=config.name, style=config.style, scalars=config.scalars, - cmap=config.cmap, lighting=config.light, render=False) - self.total_actors += 1 - return actor - - def add_points(self, points, config=CONFIG): - actor = self.plotter.add_points(points, name=config.name, color=config.color, - point_size=config.size, render=False) - self.total_actors += 1 - return actor - - def display_actor(self, actor): - self.plotter.renderer.add_actor(actor, render=False) - - def hide_actor(self, actor): - self.plotter.renderer.remove_actor(actor, render=False) - - def update_plot(self): - with self: - self.clear_output(wait=True) - self.plotter.show() - - -class ConnectivityWidget(ipywidgets.HBox, TVBWidget): - - def __init__(self, connectivity): - # type: (Connectivity) -> None - """ - :param connectivity: Connectivity to view or operate on - """ - self.connectivity = connectivity - self.output_plot = CustomOutput() - self.plot_controls = ipywidgets.Accordion(layout=ipywidgets.Layout(width='380px')) - self.existent_configs = [] - - super().__init__([self.plot_controls, self.output_plot], layout=self.DEFAULT_BORDER) - - self.__draw_connectivity_actor(datatype, config) - - def add_datatype(self, datatype): # type: (HasTraits) -> None - pass - - def __toggle_actor(self, change, actor): - if change.type == 'change': - if change.new is True: - self.output_plot.display_actor(actor) - else: - self.output_plot.hide_actor(actor) - self.output_plot.update_plot() - - def __draw_connectivity_actor(self, connectivity, config): - # type: (Connectivity, HeadWidgetConfig) -> None - if config is None: - config = HeadWidgetConfig(name='Connectivity-' + str(connectivity.number_of_regions), color='Green') - - conn_actor = self.output_plot.add_points(connectivity.centres, config) - controls_vbox = self._prepare_generic_controls(conn_actor, config) - extra_controls = self.__prepare_points_controls(conn_actor, config) - controls_vbox.children += extra_controls - - self.plot_controls.children += controls_vbox, - self.output_plot.update_plot() - - def _prepare_generic_controls(self, actor, config): - toggle_prefix = "Toggle " - title_suffix = " Controls" - - idx = self.output_plot.total_actors - 1 - self.plot_controls.set_title(idx, config.name + title_suffix) - - def toggle_actor(change): - self.__toggle_actor(change, actor) - - toggle_input = ipywidgets.Checkbox(description=toggle_prefix + config.name, value=True) - toggle_input.observe(toggle_actor, names=['value']) - - def on_name_change(change): - value = change['new'] - config.name = value - toggle_input.description = toggle_prefix + config.name - self.plot_controls.set_title(idx, config.name + title_suffix) - - name_input = ipywidgets.Text(value=config.name, description='Name: ', disabled=False, - layout=ipywidgets.Layout(width='250px')) - name_input.observe(on_name_change, names='value') - - def on_color_change(change): - value = change['new'] - rgb = pyvista.Color(value).float_rgb - actor.GetProperty().SetColor(rgb[0], rgb[1], rgb[2]) - self.output_plot.update_plot() - - color_input = ipywidgets.ColorPicker(concise=False, description='Color: ', value=config.color, disabled=False, - layout=ipywidgets.Layout(width='250px')) - color_input.observe(on_color_change, names='value') - - controls_vbox = ipywidgets.VBox([toggle_input, name_input, color_input]) - - return controls_vbox - - def __prepare_points_controls(self, actor, config): - def on_size_change(change): - value = change['new'] - actor.GetProperty().SetPointSize(value) - self.output_plot.update_plot() - - size_input = ipywidgets.IntText(value=config.size, description='Size: ', disabled=False, - layout=ipywidgets.Layout(width='250px')) - size_input.observe(on_size_change, names='value') - - return size_input, - - -class HeadBrowser(ipywidgets.VBox, TVBWidgetWithBrowser): - - def __init__(self): - super().__init__() - surface_button = ipywidgets.Button(description='View surface') - sensors_button = ipywidgets.Button(description='View sensors') - connectivity_button = ipywidgets.Button(description='View connectivity') - self.buttons = ipywidgets.HBox([surface_button, sensors_button, connectivity_button], - layout=ipywidgets.Layout(margin="0px 0px 0px 20px")) - self.head_widget = ConnectivityWidget() - self.children = [self.storage_widget, self.buttons, self.message_label, self.head_widget] - - def add_surface_datatype(_): - self.load_selected_file(Surface) - - def add_sensors_datatype(_): - self.load_selected_file(Sensors, ('.txt', '.txt.bz2')) - - def add_connectivity_datatype(_): - self.load_selected_file(Connectivity) - - surface_button.on_click(add_surface_datatype) - sensors_button.on_click(add_sensors_datatype) - connectivity_button.on_click(add_connectivity_datatype) - - def add_datatype(self, datatype, config=None): - # type: (HasTraits, HeadWidgetConfig) -> None - self.head_widget.add_datatype(datatype, config) From bd730168e54cd3346a10c5af320e62a85bfcb250 Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Fri, 25 Aug 2023 15:48:04 +0300 Subject: [PATCH 06/24] WID-223: refactor code --- notebooks/Connectivity.ipynb | 18 +++--- .../connectivity_ipy/connectivity_widget.py | 55 ++++++++++++------- 2 files changed, 45 insertions(+), 28 deletions(-) diff --git a/notebooks/Connectivity.ipynb b/notebooks/Connectivity.ipynb index 69056532..f515bf29 100644 --- a/notebooks/Connectivity.ipynb +++ b/notebooks/Connectivity.ipynb @@ -18,12 +18,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "25-08-2023 12:20:46 - DEBUG - tvbwidgets - Package is not fully installed\n", - "25-08-2023 12:20:46 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", - "25-08-2023 12:20:46 - INFO - tvbwidgets - Version: 1.5.0\n", - "2023-08-25 12:20:52,653 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", - "25-08-2023 12:20:52 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", - "2023-08-25 12:20:52,857 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" + "25-08-2023 02:41:22 - DEBUG - tvbwidgets - Package is not fully installed\n", + "25-08-2023 02:41:22 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", + "25-08-2023 02:41:22 - INFO - tvbwidgets - Version: 1.5.0\n", + "2023-08-25 14:41:28,344 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", + "25-08-2023 02:41:28 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", + "2023-08-25 14:41:28,543 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" ] } ], @@ -46,18 +46,18 @@ "name": "stdout", "output_type": "stream", "text": [ - "2023-08-25 12:20:52,875 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" + "2023-08-25 14:41:28,570 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "86eda657f9fa4a81a24d9e267faf335b", + "model_id": "b1d4cf7c16d244c1aae087b72e8c3218", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "ConnectivityWidget(children=(Dropdown(description='Matrix:', index=1, options=(('Tracts', 'tracts'), ('Weights…" + "ConnectivityWidget(children=(Connectivity2DViewer(children=(Dropdown(description='Matrix:', index=1, options=(…" ] }, "metadata": {}, diff --git a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py index 4a18d641..ca1391e0 100644 --- a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py +++ b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py @@ -17,6 +17,8 @@ pyvista.set_jupyter_backend('pythreejs') +DROPDOWN_KEY = 'dropdown' + @dataclasses.dataclass class ConnectivityConfig: @@ -32,55 +34,62 @@ class ConnectivityConfig: class CustomOutput(ipywidgets.Output): CONFIG = ConnectivityConfig() - MAX_ACTORS = 10 def __init__(self, **kwargs): super().__init__(**kwargs) self.plotter = matplotlib.pyplot -class ConnectivityWidget(ipywidgets.HBox, TVBWidget): +class Connectivity2DViewer(ipywidgets.VBox, TVBWidget): DROPDOWN_DESCRIPTION = 'Matrix:' - def __init__(self, connectivity): - # type: (Connectivity) -> None + def __init__(self, connectivity, **kwargs): + # type: (Connectivity, dict) -> None """ :param connectivity: Connectivity to view or operate on """ self.connectivity = connectivity - self.output_plot = CustomOutput() + self.output = CustomOutput() + self.widgets_map = dict() - super().__init__([self.output_plot], layout=self.DEFAULT_BORDER) + super().__init__([self.output], layout=self.DEFAULT_BORDER, **kwargs) self.__draw_connectivity() + self.__show_plot() def add_datatype(self, datatype): # type: (HasTraits) -> None pass def __show_plot(self, matrix=None): + # type: (ndarray) -> None + """ + Clears the custom output and draws the connectivity matrix + based on the current selection + """ dropdown = self.__find_dropdown() if not dropdown and matrix is None: - self.logger.error('Non matrix found for plot!') + self.logger.error('No matrix found for plot!') return None dropdown_matrix = self.connectivity.weights if dropdown.value == 'weights' else self.connectivity.tract_lengths matrix = matrix if matrix is not None else dropdown_matrix - with self.output_plot: - self.output_plot.clear_output(wait=True) - self.output_plot.plotter.matshow(matrix) - self.output_plot.plotter.show() + with self.output: + self.output.clear_output(wait=True) + self.output.plotter.matshow(matrix) + self.output.plotter.show() def __find_dropdown(self): # type: () -> ipywidgets.Dropdown | None - for wid in self.children: - try: - if wid.description and wid.description == self.DROPDOWN_DESCRIPTION: - return wid - except AttributeError: - pass - return None + try: + return self.widgets_map[DROPDOWN_KEY] + except KeyError: + return None def __draw_connectivity(self): # type: () -> None + """ + Creates the connectivity matrix dropdown as a child of this widget + """ + def on_change(change): if change['type'] == 'change' and change['name'] == 'value': matrix = self.connectivity.weights if change['new'] == 'weights' else self.connectivity.tract_lengths @@ -92,5 +101,13 @@ def on_change(change): description='Matrix:' ) dropdown.observe(on_change) + self.widgets_map[DROPDOWN_KEY] = dropdown self.children = (dropdown, *self.children) - self.__show_plot() + + +class ConnectivityWidget(ipywidgets.Tab): + def __init__(self, connectivity, **kwargs): + super().__init__(**kwargs) + children = [Connectivity2DViewer(connectivity)] + self.set_title(0, 'Connectivity 2D Viewer') + self.children = children From 851444d71f1a91b03d238a91f09a0d6b4cf9e137 Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Mon, 28 Aug 2023 12:48:26 +0300 Subject: [PATCH 07/24] WID-223: improve connectivity widget layout --- notebooks/Connectivity.ipynb | 20 +++++----- .../connectivity_ipy/connectivity_widget.py | 40 +++++++++++++++++-- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/notebooks/Connectivity.ipynb b/notebooks/Connectivity.ipynb index f515bf29..67d5d00e 100644 --- a/notebooks/Connectivity.ipynb +++ b/notebooks/Connectivity.ipynb @@ -18,12 +18,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "25-08-2023 02:41:22 - DEBUG - tvbwidgets - Package is not fully installed\n", - "25-08-2023 02:41:22 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", - "25-08-2023 02:41:22 - INFO - tvbwidgets - Version: 1.5.0\n", - "2023-08-25 14:41:28,344 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", - "25-08-2023 02:41:28 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", - "2023-08-25 14:41:28,543 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" + "28-08-2023 12:46:20 - DEBUG - tvbwidgets - Package is not fully installed\n", + "28-08-2023 12:46:20 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", + "28-08-2023 12:46:20 - INFO - tvbwidgets - Version: 1.5.0\n", + "2023-08-28 12:46:26,629 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", + "28-08-2023 12:46:26 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n" ] } ], @@ -31,7 +30,8 @@ "from tvbwidgets.api import ConnectivityWidgetReact\n", "from tvb.datatypes.connectivity import Connectivity\n", "\n", - "connectivity = Connectivity.from_file() # defaults to connectivy_76.zip\n", + "# connectivity = Connectivity.from_file() # defaults to connectivy_76.zip\n", + "\n", "\n", "# wid = ConnectivityWidgetReact(connectivity=connectivity)\n", "# wid" @@ -46,18 +46,18 @@ "name": "stdout", "output_type": "stream", "text": [ - "2023-08-25 14:41:28,570 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" + "2023-08-28 12:46:26,831 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "b1d4cf7c16d244c1aae087b72e8c3218", + "model_id": "b8aad67a154242199518557006d0e75d", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "ConnectivityWidget(children=(Connectivity2DViewer(children=(Dropdown(description='Matrix:', index=1, options=(…" + "ConnectivityWidget(children=(HTML(value='

Connectivity - 76

'), Tab(children=(ConnectivityViewers(child…" ] }, "metadata": {}, diff --git a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py index ca1391e0..5cb618b0 100644 --- a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py +++ b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py @@ -105,9 +105,43 @@ def on_change(change): self.children = (dropdown, *self.children) -class ConnectivityWidget(ipywidgets.Tab): +class ConnectivityOperations(ipywidgets.VBox): def __init__(self, connectivity, **kwargs): super().__init__(**kwargs) - children = [Connectivity2DViewer(connectivity)] - self.set_title(0, 'Connectivity 2D Viewer') + children = [ + ipywidgets.HTML(value=f'Placeholder text for operations on Connectivity-{connectivity.number_of_regions}')] + self.children = children + + +class ConnectivityViewers(ipywidgets.VBox): + def __init__(self, connectivity, **kwargs): + super().__init__(**kwargs) + self.children = ( + Connectivity2DViewer(connectivity), + ) + + +class ConnectivityWidget(ipywidgets.VBox, TVBWidget): + def add_datatype(self, datatype): + """ + Doesn't allow this opp at this time + """ + pass + + def __init__(self, connectivity, **kwargs): + super().__init__(**kwargs) + + config = ConnectivityConfig(name=f'Connectivity - {str(connectivity.number_of_regions)}') + + tabs = ( + ConnectivityViewers(connectivity), + ConnectivityOperations(connectivity) + ) + tabs_container = ipywidgets.Tab(children=tabs) + tabs_container.set_title(0, 'Viewers') + tabs_container.set_title(1, 'Operations') + children = [ + ipywidgets.HTML(value=f'

{config.name}

'), + tabs_container + ] self.children = children From 1c0025e94613032fc72291186ef30c9432000ecb Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Mon, 28 Aug 2023 12:58:21 +0300 Subject: [PATCH 08/24] WID-223: further improve layout and start 3d viewer work --- notebooks/Connectivity.ipynb | 14 +++++++------- .../ui/connectivity_ipy/connectivity_widget.py | 15 ++++++++++++--- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/notebooks/Connectivity.ipynb b/notebooks/Connectivity.ipynb index 67d5d00e..bcdb9edd 100644 --- a/notebooks/Connectivity.ipynb +++ b/notebooks/Connectivity.ipynb @@ -18,11 +18,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "28-08-2023 12:46:20 - DEBUG - tvbwidgets - Package is not fully installed\n", - "28-08-2023 12:46:20 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", - "28-08-2023 12:46:20 - INFO - tvbwidgets - Version: 1.5.0\n", - "2023-08-28 12:46:26,629 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", - "28-08-2023 12:46:26 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n" + "28-08-2023 12:57:17 - DEBUG - tvbwidgets - Package is not fully installed\n", + "28-08-2023 12:57:17 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", + "28-08-2023 12:57:17 - INFO - tvbwidgets - Version: 1.5.0\n", + "2023-08-28 12:57:23,525 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", + "28-08-2023 12:57:23 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n" ] } ], @@ -46,13 +46,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "2023-08-28 12:46:26,831 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" + "2023-08-28 12:57:23,730 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "b8aad67a154242199518557006d0e75d", + "model_id": "723e31b3519a40dfaee2123dff7c7096", "version_major": 2, "version_minor": 0 }, diff --git a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py index 5cb618b0..33a16acf 100644 --- a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py +++ b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py @@ -105,6 +105,12 @@ def on_change(change): self.children = (dropdown, *self.children) +class Connectivity3DViewer(ipywidgets.HBox): + def __init__(self, connectivity, **kwargs): + super(Connectivity3DViewer, self).__init__(*kwargs) + self.children = [ipywidgets.HTML(value='Placeholder for 3d viewer')] + + class ConnectivityOperations(ipywidgets.VBox): def __init__(self, connectivity, **kwargs): super().__init__(**kwargs) @@ -113,12 +119,15 @@ def __init__(self, connectivity, **kwargs): self.children = children -class ConnectivityViewers(ipywidgets.VBox): +class ConnectivityViewers(ipywidgets.Accordion): def __init__(self, connectivity, **kwargs): super().__init__(**kwargs) - self.children = ( + self.children = [ Connectivity2DViewer(connectivity), - ) + Connectivity3DViewer(connectivity) + ] + self.set_title(0, '2D Connectivity Matrix viewer') + self.set_title(1, '3D Connectivity viewer') class ConnectivityWidget(ipywidgets.VBox, TVBWidget): From 7b8fd7e08ff42fe92e621b7260a9a5e1867998ee Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Tue, 29 Aug 2023 15:23:31 +0300 Subject: [PATCH 09/24] WID-223: further improve layout make sections for viewers and operations visible simultaneously by default and toggleable --- notebooks/Connectivity.ipynb | 29 ++++----- .../connectivity_ipy/connectivity_widget.py | 61 ++++++++++++++----- 2 files changed, 57 insertions(+), 33 deletions(-) diff --git a/notebooks/Connectivity.ipynb b/notebooks/Connectivity.ipynb index bcdb9edd..de2f9567 100644 --- a/notebooks/Connectivity.ipynb +++ b/notebooks/Connectivity.ipynb @@ -13,22 +13,10 @@ "metadata": { "tags": [] }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "28-08-2023 12:57:17 - DEBUG - tvbwidgets - Package is not fully installed\n", - "28-08-2023 12:57:17 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", - "28-08-2023 12:57:17 - INFO - tvbwidgets - Version: 1.5.0\n", - "2023-08-28 12:57:23,525 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", - "28-08-2023 12:57:23 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n" - ] - } - ], + "outputs": [], "source": [ - "from tvbwidgets.api import ConnectivityWidgetReact\n", - "from tvb.datatypes.connectivity import Connectivity\n", + "# from tvbwidgets.api import ConnectivityWidgetReact\n", + "# from tvb.datatypes.connectivity import Connectivity\n", "\n", "# connectivity = Connectivity.from_file() # defaults to connectivy_76.zip\n", "\n", @@ -46,18 +34,23 @@ "name": "stdout", "output_type": "stream", "text": [ - "2023-08-28 12:57:23,730 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" + "29-08-2023 02:49:39 - DEBUG - tvbwidgets - Package is not fully installed\n", + "29-08-2023 02:49:39 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", + "29-08-2023 02:49:39 - INFO - tvbwidgets - Version: 1.5.0\n", + "2023-08-29 14:49:45,596 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", + "29-08-2023 02:49:45 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", + "2023-08-29 14:49:45,789 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "723e31b3519a40dfaee2123dff7c7096", + "model_id": "adc5ca9edfd244aa95d31e693301679e", "version_major": 2, "version_minor": 0 }, "text/plain": [ - "ConnectivityWidget(children=(HTML(value='

Connectivity - 76

'), Tab(children=(ConnectivityViewers(child…" + "ConnectivityWidget(children=(HBox(children=(HTML(value='

Connectivity - 76

'), VBox(children=(Checkbox(…" ] }, "metadata": {}, diff --git a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py index 33a16acf..c28e089c 100644 --- a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py +++ b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py @@ -52,7 +52,7 @@ def __init__(self, connectivity, **kwargs): self.output = CustomOutput() self.widgets_map = dict() - super().__init__([self.output], layout=self.DEFAULT_BORDER, **kwargs) + super().__init__([self.output], **kwargs) self.__draw_connectivity() self.__show_plot() @@ -111,11 +111,19 @@ def __init__(self, connectivity, **kwargs): self.children = [ipywidgets.HTML(value='Placeholder for 3d viewer')] -class ConnectivityOperations(ipywidgets.VBox): +class ConnectivityOperations(ipywidgets.VBox, TVBWidget): + def add_datatype(self, datatype): + """ + Currently not supported + """ + pass + def __init__(self, connectivity, **kwargs): - super().__init__(**kwargs) + super().__init__(layout=self.DEFAULT_BORDER, **kwargs) children = [ - ipywidgets.HTML(value=f'Placeholder text for operations on Connectivity-{connectivity.number_of_regions}')] + ipywidgets.HTML( + value=f'Placeholder text for operations on Connectivity-{connectivity.number_of_regions}' + )] self.children = children @@ -133,24 +141,47 @@ def __init__(self, connectivity, **kwargs): class ConnectivityWidget(ipywidgets.VBox, TVBWidget): def add_datatype(self, datatype): """ - Doesn't allow this opp at this time + Doesn't allow this opp. at this time """ pass def __init__(self, connectivity, **kwargs): - super().__init__(**kwargs) + style = self.DEFAULT_BORDER + super().__init__(**kwargs, layout=style) config = ConnectivityConfig(name=f'Connectivity - {str(connectivity.number_of_regions)}') - tabs = ( - ConnectivityViewers(connectivity), - ConnectivityOperations(connectivity) - ) - tabs_container = ipywidgets.Tab(children=tabs) - tabs_container.set_title(0, 'Viewers') - tabs_container.set_title(1, 'Operations') + self.viewers_tab = ConnectivityViewers(connectivity) + self.operations_tab = ConnectivityOperations(connectivity) + tabs = (self.viewers_tab, self.operations_tab) + + viewers_checkbox = ipywidgets.Checkbox(value=True, description='Viewers') + + def on_change_viewers(c): + self.viewers_tab.layout.display = c['new'] and 'inline-block' or 'none' + + viewers_checkbox.observe(on_change_viewers, 'value') + operations_checkbox = ipywidgets.Checkbox(value=True, description='Operations') + + def on_change_operations(c): + self.operations_tab.layout.display = c['new'] and 'inline-block' or 'none' + + operations_checkbox.observe(on_change_operations, 'value') + + sections_container = ipywidgets.HBox(children=tabs) + children = [ - ipywidgets.HTML(value=f'

{config.name}

'), - tabs_container + ipywidgets.HBox( + children=( + ipywidgets.HTML(value=f'

{config.name}

'), + ipywidgets.VBox(children=( + viewers_checkbox, + operations_checkbox + ) + ) + + ) + ), + sections_container ] self.children = children From c9261da1f09a350a62368d8fc8bd11291f4f2c87 Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Mon, 11 Sep 2023 10:16:14 +0300 Subject: [PATCH 10/24] WID-223: add 3d viewer, show points/edges, resize plot, toggle operations --- notebooks/Connectivity.ipynb | 25 +++- tvbwidgets/ui/connectivity_ipy/config.py | 19 +++ .../connectivity_ipy/connectivity_widget.py | 132 ++++++++++++++---- tvbwidgets/ui/connectivity_ipy/exceptions.py | 10 ++ tvbwidgets/ui/connectivity_ipy/outputs_3d.py | 84 +++++++++++ 5 files changed, 239 insertions(+), 31 deletions(-) create mode 100644 tvbwidgets/ui/connectivity_ipy/config.py create mode 100644 tvbwidgets/ui/connectivity_ipy/exceptions.py create mode 100644 tvbwidgets/ui/connectivity_ipy/outputs_3d.py diff --git a/notebooks/Connectivity.ipynb b/notebooks/Connectivity.ipynb index de2f9567..923d8d06 100644 --- a/notebooks/Connectivity.ipynb +++ b/notebooks/Connectivity.ipynb @@ -34,18 +34,18 @@ "name": "stdout", "output_type": "stream", "text": [ - "29-08-2023 02:49:39 - DEBUG - tvbwidgets - Package is not fully installed\n", - "29-08-2023 02:49:39 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", - "29-08-2023 02:49:39 - INFO - tvbwidgets - Version: 1.5.0\n", - "2023-08-29 14:49:45,596 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", - "29-08-2023 02:49:45 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", - "2023-08-29 14:49:45,789 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" + "11-09-2023 10:13:24 - DEBUG - tvbwidgets - Package is not fully installed\n", + "11-09-2023 10:13:24 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", + "11-09-2023 10:13:24 - INFO - tvbwidgets - Version: 1.5.0\n", + "2023-09-11 10:13:29,835 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", + "11-09-2023 10:13:29 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", + "2023-09-11 10:13:29,943 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "adc5ca9edfd244aa95d31e693301679e", + "model_id": "3303c8f259414948800906cc6eb8ae24", "version_major": 2, "version_minor": 0 }, @@ -60,14 +60,25 @@ "source": [ "from tvbwidgets.api import ConnectivityWidget\n", "from tvb.datatypes.connectivity import Connectivity\n", + "import pyvista as pv\n", + "import numpy as np\n", + "pv.set_jupyter_backend('pythreejs')\n", "\n", "conn = Connectivity.from_file() # defaults to connectivy_76.zip\n", "conn.configure()\n", "\n", "wid = ConnectivityWidget(conn)\n", + "\n", "display(wid)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, diff --git a/tvbwidgets/ui/connectivity_ipy/config.py b/tvbwidgets/ui/connectivity_ipy/config.py new file mode 100644 index 00000000..057a8953 --- /dev/null +++ b/tvbwidgets/ui/connectivity_ipy/config.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# +# "TheVirtualBrain - Widgets" package +# +# (c) 2022-2023, TVB Widgets Team +# +from dataclasses import dataclass +from numpy import ndarray + + +@dataclass +class ConnectivityConfig: + name: str = 'Connectivity' + style: str = 'Points' + points_color: str = 'Green' + edge_color: str = 'White' + light: bool = True + size = [500, 500] # [width, height] + point_size: int = 20 diff --git a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py index c28e089c..723c675f 100644 --- a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py +++ b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py @@ -4,34 +4,22 @@ # # (c) 2022-2023, TVB Widgets Team # -import dataclasses import ipywidgets -import pyvista import matplotlib +import numpy +import pyvista as pv +import numpy as np from numpy import ndarray -from tvb.basic.neotraits._attr import NArray from tvb.basic.neotraits.api import HasTraits from tvb.datatypes.connectivity import Connectivity from tvbwidgets.ui.base_widget import TVBWidget - -pyvista.set_jupyter_backend('pythreejs') +from tvbwidgets.ui.connectivity_ipy.outputs_3d import PyVistaOutput +from tvbwidgets.ui.connectivity_ipy.config import ConnectivityConfig DROPDOWN_KEY = 'dropdown' -@dataclasses.dataclass -class ConnectivityConfig: - name: str = 'Connectivity' - style: str = 'Surface' - color: str = 'White' - light: bool = True - size: int = 1500 - cmap: str | None = None - scalars: ndarray | NArray = None - widget: ipywidgets.Widget = None - - class CustomOutput(ipywidgets.Output): CONFIG = ConnectivityConfig() @@ -105,10 +93,109 @@ def on_change(change): self.children = (dropdown, *self.children) -class Connectivity3DViewer(ipywidgets.HBox): +class Connectivity3DViewer(ipywidgets.VBox): + PYVISTA = 'PyVista' + def __init__(self, connectivity, **kwargs): - super(Connectivity3DViewer, self).__init__(*kwargs) - self.children = [ipywidgets.HTML(value='Placeholder for 3d viewer')] + self.connectivity = connectivity + + self.output = PyVistaOutput() + + super(Connectivity3DViewer, self).__init__([self.output], *kwargs) + + self.init_view_connectivity() + + def init_view_connectivity(self): + points, edges, labels = self.add_actors() + points_toggle, edges_toggle, labels_toggle = self._init_controls() + if not labels_toggle.value: + self.output.hide_actor(labels) + + def on_change_points(change): + if change['new']: + self.output.display_actor(points) + else: + self.output.hide_actor(points) + self.output.update_plot() + + points_toggle.observe(on_change_points, 'value') + + def on_change_edges(change): + if change['new']: + self.output.display_actor(edges) + else: + self.output.hide_actor(edges) + self.output.update_plot() + + edges_toggle.observe(on_change_edges, 'value') + + def on_change_labels(change): + if change['new']: + self.output.display_actor(labels) + else: + self.output.hide_actor(labels) + self.output.update_plot() + + labels_toggle.observe(on_change_labels, 'value') + + window_controls = self.output.get_window_controls() + + self.children = [ + ipywidgets.HBox(children=( + points_toggle, edges_toggle, labels_toggle)), + window_controls, + self.output] + self.output.display_actor(points) + self.output.display_actor(edges) + self.output.update_plot() + + def _init_controls(self): + points_toggle = ipywidgets.ToggleButton(value=True, + description='Points' + ) + edges_toggle = ipywidgets.ToggleButton(value=True, + description='Edges', + ) + + labels_toggle = ipywidgets.ToggleButton(value=False, + description='Labels') + return points_toggle, edges_toggle, labels_toggle + + def add_actors(self): + plotter = self.output.plotter + points = self.connectivity.centres + + mesh_points = pv.PolyData(points) + + labels = self.connectivity.region_labels + labels_actor = plotter.add_point_labels(points, labels) + + points_color = self.output.CONFIG.points_color + points_size = self.output.CONFIG.point_size + edge_color = self.output.CONFIG.edge_color + + points_actor = plotter.add_points(mesh_points, color=points_color, point_size=points_size) + + edges_coords = self._extract_edges() + + edges_actor = plotter.add_lines(edges_coords, color=edge_color, width=1) + plotter.camera_position = 'xy' + + return points_actor, edges_actor, labels_actor + + def _extract_edges(self): + connectivity = self.connectivity + edge_indices = np.nonzero(connectivity.weights) + edges = list(zip(edge_indices[0], edge_indices[1])) + + edges_coords = [] + points = connectivity.centres + + for (i, j) in edges: + edges_coords.append(points[i]) + edges_coords.append(points[j]) + + return numpy.array(edges_coords) class ConnectivityOperations(ipywidgets.VBox, TVBWidget): @@ -177,10 +264,7 @@ def on_change_operations(c): ipywidgets.VBox(children=( viewers_checkbox, operations_checkbox - ) - ) - - ) + ))) ), sections_container ] diff --git a/tvbwidgets/ui/connectivity_ipy/exceptions.py b/tvbwidgets/ui/connectivity_ipy/exceptions.py new file mode 100644 index 00000000..7c7ea50a --- /dev/null +++ b/tvbwidgets/ui/connectivity_ipy/exceptions.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# +# "TheVirtualBrain - Widgets" package +# +# (c) 2022-2023, TVB Widgets Team +# +class UnknownOutputException(Exception): + """ + Exception thrown in case of an unknown output type + """ diff --git a/tvbwidgets/ui/connectivity_ipy/outputs_3d.py b/tvbwidgets/ui/connectivity_ipy/outputs_3d.py new file mode 100644 index 00000000..68e330d3 --- /dev/null +++ b/tvbwidgets/ui/connectivity_ipy/outputs_3d.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- +# +# "TheVirtualBrain - Widgets" package +# +# (c) 2022-2023, TVB Widgets Team +# +import ipywidgets + +from tvbwidgets.ui.connectivity_ipy.config import ConnectivityConfig +from tvbwidgets.ui.connectivity_ipy.exceptions import UnknownOutputException +from enum import Enum +import ipywidgets as widgets +import pyvista + + +class Output3D(Enum): + PYVISTA = 'PyVista' + + def __str__(self): + return str(self.value) + + +class PyVistaOutput(widgets.Output): + CONFIG = ConnectivityConfig() + plotter = pyvista.Plotter() + + def toggle_actor(self, actor, visible): + if visible: + self.display_actor(actor) + else: + self.hide_actor(actor) + self.update_plot() + + def display_actor(self, actor): + self.plotter.renderer.add_actor(actor, render=False) + + def hide_actor(self, actor): + self.plotter.renderer.remove_actor(actor, render=False) + + def update_plot(self): + with self: + self.clear_output(wait=True) + self.plotter.show() + + def get_window_controls(self): + height = ipywidgets.IntSlider( + value=self.CONFIG.size[1], + min=50, + max=1500, + step=1, + orientation='horizontal', + description='Plot height', + continuous_update=False, + ) + width = ipywidgets.IntSlider( + value=self.CONFIG.size[0], + min=50, + max=1500, + step=1, + orientation='horizontal', + description='Plot width', + continuous_update=False, + ) + + self.plotter.window_size = [width.value, height.value] + + def on_change_height(value): + self.plotter.window_size = [width.value, value['new']] + self.update_plot() + + def on_change_width(value): + self.plotter.window_size = [value['new'], height.value] + self.update_plot() + + height.observe(on_change_height, 'value') + width.observe(on_change_width, 'value') + return ipywidgets.HBox(children=(width, height)) + + +def output_3d_factory(output_type): + """Factory function for a custom 3d output""" + if output_type == Output3D.PYVISTA: + return PyVistaOutput() + raise UnknownOutputException(f"No applicable output for {output_type}!") From 4c5a6d12bacdcf95c7bfbd22f569ad5c8edbc5e9 Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Mon, 11 Sep 2023 10:45:01 +0300 Subject: [PATCH 11/24] WID-223: improve 2d viewer visibility --- notebooks/Connectivity.ipynb | 25 +++---------------- .../connectivity_ipy/connectivity_widget.py | 8 +++--- 2 files changed, 9 insertions(+), 24 deletions(-) diff --git a/notebooks/Connectivity.ipynb b/notebooks/Connectivity.ipynb index 923d8d06..3e8379e7 100644 --- a/notebooks/Connectivity.ipynb +++ b/notebooks/Connectivity.ipynb @@ -27,34 +27,17 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "11-09-2023 10:13:24 - DEBUG - tvbwidgets - Package is not fully installed\n", - "11-09-2023 10:13:24 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", - "11-09-2023 10:13:24 - INFO - tvbwidgets - Version: 1.5.0\n", - "2023-09-11 10:13:29,835 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", - "11-09-2023 10:13:29 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", - "2023-09-11 10:13:29,943 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" + "11-09-2023 10:43:09 - DEBUG - tvbwidgets - Package is not fully installed\n", + "11-09-2023 10:43:09 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", + "11-09-2023 10:43:09 - INFO - tvbwidgets - Version: 1.5.0\n" ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "3303c8f259414948800906cc6eb8ae24", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "ConnectivityWidget(children=(HBox(children=(HTML(value='

Connectivity - 76

'), VBox(children=(Checkbox(…" - ] - }, - "metadata": {}, - "output_type": "display_data" } ], "source": [ diff --git a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py index 723c675f..bae1a175 100644 --- a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py +++ b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py @@ -62,7 +62,9 @@ def __show_plot(self, matrix=None): matrix = matrix if matrix is not None else dropdown_matrix with self.output: self.output.clear_output(wait=True) - self.output.plotter.matshow(matrix) + self.output.plotter.figure(figsize=(8, 8)) + heatmap = self.output.plotter.matshow(matrix, fignum=1) + self.output.plotter.colorbar(heatmap) self.output.plotter.show() def __find_dropdown(self): @@ -258,10 +260,10 @@ def on_change_operations(c): sections_container = ipywidgets.HBox(children=tabs) children = [ - ipywidgets.HBox( + ipywidgets.VBox( children=( ipywidgets.HTML(value=f'

{config.name}

'), - ipywidgets.VBox(children=( + ipywidgets.HBox(children=( viewers_checkbox, operations_checkbox ))) From 2eba9ffed0b154d97ac3ca8d225e8aa71df73d30 Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Tue, 12 Sep 2023 12:15:50 +0300 Subject: [PATCH 12/24] WID-223: create global context as singleton and observer to hold shared and reactive state between viewers and operations --- .../connectivity_ipy/connectivity_widget.py | 28 +++---- .../ui/connectivity_ipy/global_context.py | 69 ++++++++++++++++ tvbwidgets/ui/connectivity_ipy/operations.py | 81 +++++++++++++++++++ 3 files changed, 160 insertions(+), 18 deletions(-) create mode 100644 tvbwidgets/ui/connectivity_ipy/global_context.py create mode 100644 tvbwidgets/ui/connectivity_ipy/operations.py diff --git a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py index bae1a175..5a930574 100644 --- a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py +++ b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py @@ -15,7 +15,9 @@ from tvb.datatypes.connectivity import Connectivity from tvbwidgets.ui.base_widget import TVBWidget from tvbwidgets.ui.connectivity_ipy.outputs_3d import PyVistaOutput +from tvbwidgets.ui.connectivity_ipy.operations import ConnectivityOperations from tvbwidgets.ui.connectivity_ipy.config import ConnectivityConfig +from tvbwidgets.ui.connectivity_ipy.global_context import CONTEXT DROPDOWN_KEY = 'dropdown' @@ -83,14 +85,20 @@ def __draw_connectivity(self): def on_change(change): if change['type'] == 'change' and change['name'] == 'value': matrix = self.connectivity.weights if change['new'] == 'weights' else self.connectivity.tract_lengths + CONTEXT.matrix = change['new'] self.__show_plot(matrix) dropdown = ipywidgets.Dropdown( - options=[('Tracts', 'tracts'), ('Weights', 'weights')], - value='weights', + options=CONTEXT.MATRIX_OPTIONS, + value=CONTEXT.matrix, description='Matrix:' ) dropdown.observe(on_change) + + def on_ctx_change(value): + dropdown.value = value + + CONTEXT.observe(on_ctx_change, 'matrix') self.widgets_map[DROPDOWN_KEY] = dropdown self.children = (dropdown, *self.children) @@ -200,22 +208,6 @@ def _extract_edges(self): return numpy.array(edges_coords) -class ConnectivityOperations(ipywidgets.VBox, TVBWidget): - def add_datatype(self, datatype): - """ - Currently not supported - """ - pass - - def __init__(self, connectivity, **kwargs): - super().__init__(layout=self.DEFAULT_BORDER, **kwargs) - children = [ - ipywidgets.HTML( - value=f'Placeholder text for operations on Connectivity-{connectivity.number_of_regions}' - )] - self.children = children - - class ConnectivityViewers(ipywidgets.Accordion): def __init__(self, connectivity, **kwargs): super().__init__(**kwargs) diff --git a/tvbwidgets/ui/connectivity_ipy/global_context.py b/tvbwidgets/ui/connectivity_ipy/global_context.py new file mode 100644 index 00000000..d69ac6a0 --- /dev/null +++ b/tvbwidgets/ui/connectivity_ipy/global_context.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# +# "TheVirtualBrain - Widgets" package +# +# (c) 2022-2023, TVB Widgets Team +# +from typing import Callable + + +class SingletonMeta(type): + _instances = {} + + def __call__(cls, *args, **kwargs): + if cls not in cls._instances: + cls._instances[cls] = super().__call__(*args, **kwargs) + return cls._instances[cls] + + +class GlobalContext(metaclass=SingletonMeta): + MATRIX_OPTIONS = [('Tracts', 'tracts'), ('Weights', 'weights')] + _observed_state = dict() + + def __init__(self): + self._matrix = 'weights' + + @property + def matrix(self): + return self._matrix + + @matrix.setter + def matrix(self, value): + old_value = self._matrix + self._matrix = value + if old_value == value: + return + try: + observers = self._observed_state['matrix'] + for observer in observers: + observer(value) + except KeyError: + pass + + def observe(self, observer_func, value_observed): + # type: (Callable[[any], any], str) -> None + """ + Method to register an observer for the specified value. + When the specified value changes (if the value is set to the same as previous, + observers are not triggered), all registered observers ar called + with the new value passed as param. + """ + try: + observers_list = self._observed_state[value_observed] + observers_list.append(observer_func) + except KeyError: + self._observed_state[value_observed] = [observer_func] + + def remove_observer(self, observer_func, value_observed): + # type: (Callable[[any], any], str) -> None + """ + Unregister a registered observer. + """ + try: + observers_list = self._observed_state[value_observed] + observers_list.remove(observer_func) + except KeyError: + pass + + +CONTEXT = GlobalContext() diff --git a/tvbwidgets/ui/connectivity_ipy/operations.py b/tvbwidgets/ui/connectivity_ipy/operations.py new file mode 100644 index 00000000..b5fb5776 --- /dev/null +++ b/tvbwidgets/ui/connectivity_ipy/operations.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +# +# "TheVirtualBrain - Widgets" package +# +# (c) 2022-2023, TVB Widgets Team +# +import ipywidgets +from tvbwidgets.ui.base_widget import TVBWidget +from tvbwidgets.ui.connectivity_ipy.global_context import CONTEXT + + +class ConnectivityOperations(ipywidgets.VBox, TVBWidget): + def add_datatype(self, datatype): + """ + Currently not supported + """ + pass + + def __init__(self, connectivity, **kwargs): + super().__init__(layout={**self.DEFAULT_BORDER, 'width': '50%'}, **kwargs) + self.connectivity = connectivity + selector = self.__get_node_selector() + children = [ + ipywidgets.HTML( + value=f'

Operations for Connectivity-{connectivity.number_of_regions}

' + ), selector] + self.children = children + self.regions_checkboxes = [] + + def __get_node_selector(self): + left_children = [] + right_children = [] + region_labels = self.connectivity.region_labels + # print('region labels: ', region_labels) + for region in region_labels: + label = str(region) + selector = ipywidgets.Checkbox(value=False, description=label, layout={'width': 'max-content'}, + indent=False) + if label.startswith('l'): + left_children.append(selector) + else: + right_children.append(selector) + + self.regions_checkboxes = [*left_children, *right_children] + + left = ipywidgets.VBox(children=(ipywidgets.HTML('

Left hemisphere

'), + ipywidgets.VBox(children=left_children, + )), + layout={'width': '50%', 'align-items': 'start'} + ) + right = ipywidgets.VBox(children=(ipywidgets.HTML('

Right hemisphere

'), + ipywidgets.VBox(children=right_children, + )), + layout={'width': '50%', 'align-items': 'start'} + ) + matrix_dropdown = ipywidgets.Dropdown( + options=CONTEXT.MATRIX_OPTIONS, + value=CONTEXT.matrix, + description='Matrix:' + ) + + def on_change(value): + CONTEXT.matrix = value['new'] + + matrix_dropdown.observe(on_change, 'value') + + def on_ctx_change(value): + matrix_dropdown.value = value + + CONTEXT.observe(on_ctx_change, 'matrix') + + container = ipywidgets.VBox(children=(matrix_dropdown, + ipywidgets.HBox(children=(left, right)))) + accordion = ipywidgets.Accordion(children=[container], selected_index=None, + layout={'height': '50vh'}) + accordion.set_title(0, 'Regions selector') + return accordion + + @property + def selected_regions(self): + return map(lambda x: x.description, filter(lambda x: x.value, self.regions_checkboxes)) From dc2cdd1258458d482adf06c8f7f1b21938658e51 Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Thu, 14 Sep 2023 09:58:18 +0300 Subject: [PATCH 13/24] WID-223: add connectivity to global context and add operations buttons --- .../ui/connectivity_ipy/global_context.py | 41 ++++++++++++--- tvbwidgets/ui/connectivity_ipy/operations.py | 52 ++++++++++++++++--- 2 files changed, 79 insertions(+), 14 deletions(-) diff --git a/tvbwidgets/ui/connectivity_ipy/global_context.py b/tvbwidgets/ui/connectivity_ipy/global_context.py index d69ac6a0..42c08a26 100644 --- a/tvbwidgets/ui/connectivity_ipy/global_context.py +++ b/tvbwidgets/ui/connectivity_ipy/global_context.py @@ -5,6 +5,7 @@ # (c) 2022-2023, TVB Widgets Team # from typing import Callable +from tvb.datatypes.connectivity import Connectivity class SingletonMeta(type): @@ -22,21 +23,45 @@ class GlobalContext(metaclass=SingletonMeta): def __init__(self): self._matrix = 'weights' + self._connectivity = None + self.connectivities_history = [] # list of connectivities previously used @property def matrix(self): return self._matrix @matrix.setter - def matrix(self, value): - old_value = self._matrix - self._matrix = value - if old_value == value: - return + def matrix(self, next_value): + prev_value = self._matrix + self._matrix = next_value + if prev_value != next_value: + self.__notify_observers('matrix', next_value) + + @property + def connectivity(self): + # type: () -> Connectivity + return self._connectivity + + @connectivity.setter + def connectivity(self, next_value): + # type: (Connectivity) -> None + previous = self._connectivity + self._connectivity = next_value + if previous != next_value: + self.__notify_observers('connectivity', next_value) + if not any([conn.gid == next_value.gid for conn in self.connectivities_history]): + self.connectivities_history.append(next_value) + + def __notify_observers(self, observed_attribute, next_value): + # type: (str, any) -> None + """ + Calls all the observer functions of the provided observed attribute + passing as argument the next value for the attribute + """ try: - observers = self._observed_state['matrix'] - for observer in observers: - observer(value) + observers = self._observed_state[observed_attribute] + for obs in observers: + obs(next_value) except KeyError: pass diff --git a/tvbwidgets/ui/connectivity_ipy/operations.py b/tvbwidgets/ui/connectivity_ipy/operations.py index b5fb5776..e215859a 100644 --- a/tvbwidgets/ui/connectivity_ipy/operations.py +++ b/tvbwidgets/ui/connectivity_ipy/operations.py @@ -17,21 +17,22 @@ def add_datatype(self, datatype): pass def __init__(self, connectivity, **kwargs): - super().__init__(layout={**self.DEFAULT_BORDER, 'width': '50%'}, **kwargs) + super().__init__(layout={**self.DEFAULT_BORDER, 'width': '50%', 'justify-content': 'start'}, **kwargs) self.connectivity = connectivity + self.regions_checkboxes = [] selector = self.__get_node_selector() + buttons = self.__get_operations_buttons() children = [ ipywidgets.HTML( value=f'

Operations for Connectivity-{connectivity.number_of_regions}

' - ), selector] + ), selector, buttons] self.children = children - self.regions_checkboxes = [] def __get_node_selector(self): left_children = [] right_children = [] region_labels = self.connectivity.region_labels - # print('region labels: ', region_labels) + for region in region_labels: label = str(region) selector = ipywidgets.Checkbox(value=False, description=label, layout={'width': 'max-content'}, @@ -72,10 +73,49 @@ def on_ctx_change(value): container = ipywidgets.VBox(children=(matrix_dropdown, ipywidgets.HBox(children=(left, right)))) accordion = ipywidgets.Accordion(children=[container], selected_index=None, - layout={'height': '50vh'}) + layout={'max-height': '50vh'}) accordion.set_title(0, 'Regions selector') return accordion @property def selected_regions(self): - return map(lambda x: x.description, filter(lambda x: x.value, self.regions_checkboxes)) + print(self.regions_checkboxes) + return list(map(lambda x: x.description, filter(lambda x: x.value, self.regions_checkboxes))) + + def __get_operations_buttons(self): + cut_selected_tooltip = """ + Create a new connectivity removing the selected nodes. + Check the selected nodes in the above dropdown to see what it is included + """ + cut_edges_tooltip = """ + Create a new connectivity cutting the edges of selected nodes. + Check the selected nodes in the above dropdown to see what it is included + """ + cut_selected = ipywidgets.Button(description='Cut selected regions', + disabled=False, + button_style='success', + tooltip=cut_selected_tooltip, + icon='scissors') + + cut_edges_of_selected = ipywidgets.Button(description='Cut edges of selected', + disabled=False, + button_style='warning', + tooltip=cut_edges_tooltip, + icon='scissors') + + cut_selected.on_click(lambda *args: self.__cut_selected_nodes()) + cut_edges_of_selected.on_click(lambda *args: self.__cut_selected_edges()) + + return ipywidgets.HBox(children=[cut_selected, cut_edges_of_selected]) + + def __cut_selected_nodes(self): + print('cutting selected: ', self.selected_regions) + + def __cut_selected_edges(self): + print('cutting edges: ', self.selected_regions) + + def __cut_incoming_edges(self): + pass + + def _cut_outgoing_edges(self): + pass From e8166a41f4c53de818d88d77d3e68d5b6e2a0f27 Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Thu, 14 Sep 2023 10:09:00 +0300 Subject: [PATCH 14/24] WID-223: shift to usage of connectivity set on global context --- .../connectivity_ipy/connectivity_widget.py | 29 +++++++++---------- tvbwidgets/ui/connectivity_ipy/operations.py | 7 ++--- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py index 5a930574..cf75f18e 100644 --- a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py +++ b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py @@ -33,12 +33,11 @@ def __init__(self, **kwargs): class Connectivity2DViewer(ipywidgets.VBox, TVBWidget): DROPDOWN_DESCRIPTION = 'Matrix:' - def __init__(self, connectivity, **kwargs): + def __init__(self, **kwargs): # type: (Connectivity, dict) -> None """ :param connectivity: Connectivity to view or operate on """ - self.connectivity = connectivity self.output = CustomOutput() self.widgets_map = dict() @@ -60,7 +59,7 @@ def __show_plot(self, matrix=None): if not dropdown and matrix is None: self.logger.error('No matrix found for plot!') return None - dropdown_matrix = self.connectivity.weights if dropdown.value == 'weights' else self.connectivity.tract_lengths + dropdown_matrix = CONTEXT.connectivity.weights if dropdown.value == 'weights' else CONTEXT.connectivity.tract_lengths matrix = matrix if matrix is not None else dropdown_matrix with self.output: self.output.clear_output(wait=True) @@ -84,7 +83,8 @@ def __draw_connectivity(self): def on_change(change): if change['type'] == 'change' and change['name'] == 'value': - matrix = self.connectivity.weights if change['new'] == 'weights' else self.connectivity.tract_lengths + matrix = CONTEXT.connectivity.weights if change[ + 'new'] == 'weights' else CONTEXT.connectivity.tract_lengths CONTEXT.matrix = change['new'] self.__show_plot(matrix) @@ -106,9 +106,7 @@ def on_ctx_change(value): class Connectivity3DViewer(ipywidgets.VBox): PYVISTA = 'PyVista' - def __init__(self, connectivity, **kwargs): - self.connectivity = connectivity - + def __init__(self, **kwargs): self.output = PyVistaOutput() super(Connectivity3DViewer, self).__init__([self.output], *kwargs) @@ -173,11 +171,11 @@ def _init_controls(self): def add_actors(self): plotter = self.output.plotter - points = self.connectivity.centres + points = CONTEXT.connectivity.centres mesh_points = pv.PolyData(points) - labels = self.connectivity.region_labels + labels = CONTEXT.connectivity.region_labels labels_actor = plotter.add_point_labels(points, labels) points_color = self.output.CONFIG.points_color @@ -194,7 +192,7 @@ def add_actors(self): return points_actor, edges_actor, labels_actor def _extract_edges(self): - connectivity = self.connectivity + connectivity = CONTEXT.connectivity edge_indices = np.nonzero(connectivity.weights) edges = list(zip(edge_indices[0], edge_indices[1])) @@ -209,11 +207,11 @@ def _extract_edges(self): class ConnectivityViewers(ipywidgets.Accordion): - def __init__(self, connectivity, **kwargs): + def __init__(self, **kwargs): super().__init__(**kwargs) self.children = [ - Connectivity2DViewer(connectivity), - Connectivity3DViewer(connectivity) + Connectivity2DViewer(), + Connectivity3DViewer() ] self.set_title(0, '2D Connectivity Matrix viewer') self.set_title(1, '3D Connectivity viewer') @@ -231,9 +229,10 @@ def __init__(self, connectivity, **kwargs): super().__init__(**kwargs, layout=style) config = ConnectivityConfig(name=f'Connectivity - {str(connectivity.number_of_regions)}') + CONTEXT.connectivity = connectivity - self.viewers_tab = ConnectivityViewers(connectivity) - self.operations_tab = ConnectivityOperations(connectivity) + self.viewers_tab = ConnectivityViewers() + self.operations_tab = ConnectivityOperations() tabs = (self.viewers_tab, self.operations_tab) viewers_checkbox = ipywidgets.Checkbox(value=True, description='Viewers') diff --git a/tvbwidgets/ui/connectivity_ipy/operations.py b/tvbwidgets/ui/connectivity_ipy/operations.py index e215859a..e999baf4 100644 --- a/tvbwidgets/ui/connectivity_ipy/operations.py +++ b/tvbwidgets/ui/connectivity_ipy/operations.py @@ -16,22 +16,21 @@ def add_datatype(self, datatype): """ pass - def __init__(self, connectivity, **kwargs): + def __init__(self, **kwargs): super().__init__(layout={**self.DEFAULT_BORDER, 'width': '50%', 'justify-content': 'start'}, **kwargs) - self.connectivity = connectivity self.regions_checkboxes = [] selector = self.__get_node_selector() buttons = self.__get_operations_buttons() children = [ ipywidgets.HTML( - value=f'

Operations for Connectivity-{connectivity.number_of_regions}

' + value=f'

Operations for Connectivity-{CONTEXT.connectivity.number_of_regions}

' ), selector, buttons] self.children = children def __get_node_selector(self): left_children = [] right_children = [] - region_labels = self.connectivity.region_labels + region_labels = CONTEXT.connectivity.region_labels for region in region_labels: label = str(region) From c048efaca4f544aec56c719605053d9372e1cb4d Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Thu, 14 Sep 2023 11:09:25 +0300 Subject: [PATCH 15/24] WID-223: add cut of unselected (regions/edges) --- tvbwidgets/ui/connectivity_ipy/operations.py | 112 ++++++++++++++++++- 1 file changed, 107 insertions(+), 5 deletions(-) diff --git a/tvbwidgets/ui/connectivity_ipy/operations.py b/tvbwidgets/ui/connectivity_ipy/operations.py index e999baf4..f9f441cb 100644 --- a/tvbwidgets/ui/connectivity_ipy/operations.py +++ b/tvbwidgets/ui/connectivity_ipy/operations.py @@ -5,6 +5,9 @@ # (c) 2022-2023, TVB Widgets Team # import ipywidgets +import numpy +from tvb.datatypes.connectivity import Connectivity + from tvbwidgets.ui.base_widget import TVBWidget from tvbwidgets.ui.connectivity_ipy.global_context import CONTEXT @@ -108,13 +111,112 @@ def __get_operations_buttons(self): return ipywidgets.HBox(children=[cut_selected, cut_edges_of_selected]) def __cut_selected_nodes(self): - print('cutting selected: ', self.selected_regions) + """ + Create a new connectivity using only the selected nodes + """ + matrix = CONTEXT.matrix + new_weights = CONTEXT.connectivity.weights + new_tracts = CONTEXT.connectivity.tract_lengths if matrix == 'tracts' else None + regions = CONTEXT.connectivity.region_labels + selected_regions = [numpy.where(regions == label)[0][0] for label in self.selected_regions] + new_conn = self._cut_connectivity(CONTEXT.connectivity, new_weights, selected_regions, new_tracts) + CONTEXT.connectivity = new_conn def __cut_selected_edges(self): print('cutting edges: ', self.selected_regions) + matrix = CONTEXT.matrix + new_weights = CONTEXT.connectivity.weights + new_tracts = CONTEXT.connectivity.tract_lengths if matrix == 'tracts' else None + regions = CONTEXT.connectivity.region_labels + selected_regions = [numpy.where(regions == label)[0][0] for label in self.selected_regions] + new_conn = self._branch_connectivity(CONTEXT.connectivity, new_weights, selected_regions, new_tracts) + CONTEXT.connectivity = new_conn + + def _reorder_arrays(self, original_conn, new_weights, interest_areas, new_tracts=None): + """ + Returns ordered versions of the parameters according to the hemisphere permutation. + """ + permutation = original_conn.hemisphere_order_indices + inverse_permutation = numpy.argsort(permutation) # trick to invert a permutation represented as an array + interest_areas = inverse_permutation[interest_areas] + # see :meth"`ordered_weights` for why [p:][:p] + new_weights = new_weights[inverse_permutation, :][:, inverse_permutation] - def __cut_incoming_edges(self): - pass + if new_tracts is not None: + new_tracts = new_tracts[inverse_permutation, :][:, inverse_permutation] - def _cut_outgoing_edges(self): - pass + return new_weights, interest_areas, new_tracts + + def _branch_connectivity(self, original_conn, new_weights, interest_areas, + new_tracts=None): + # type: (Connectivity, numpy.array, numpy.array, numpy.array) -> Connectivity + """ + Generate new Connectivity based on a previous one, by changing weights (e.g. simulate lesion). + The returned connectivity has the same number of nodes. The edges of unselected nodes will have weight 0. + :param original_conn: Original Connectivity, to copy from + :param new_weights: weights matrix for the new connectivity + :param interest_areas: ndarray of the selected node id's + :param new_tracts: tracts matrix for the new connectivity + """ + print('herre') + new_weights, interest_areas, new_tracts = self._reorder_arrays(original_conn, new_weights, + interest_areas, new_tracts) + if new_tracts is None: + new_tracts = original_conn.tract_lengths + + for i in range(len(original_conn.weights)): + for j in range(len(original_conn.weights)): + if i not in interest_areas or j not in interest_areas: + new_weights[i][j] = 0 + + final_conn = Connectivity() + final_conn.parent_connectivity = original_conn.gid.hex + final_conn.saved_selection = interest_areas.tolist() + final_conn.weights = new_weights + final_conn.centres = original_conn.centres + final_conn.region_labels = original_conn.region_labels + final_conn.orientations = original_conn.orientations + final_conn.cortical = original_conn.cortical + final_conn.hemispheres = original_conn.hemispheres + final_conn.areas = original_conn.areas + final_conn.tract_lengths = new_tracts + final_conn.configure() + return final_conn + + def _cut_connectivity(self, original_conn, new_weights, interest_areas, new_tracts=None): + # type: (Connectivity, numpy.array, numpy.array, numpy.array) -> Connectivity + """ + Generate new Connectivity object based on current one, by removing nodes (e.g. simulate lesion). + Only the selected nodes will get used in the result. The order of the indices in interest_areas matters. + If indices are not sorted then the nodes will be permuted accordingly. + + :param original_conn: Original Connectivity(HasTraits), to cut nodes from + :param new_weights: weights matrix for the new connectivity + :param interest_areas: ndarray with the selected node id's. + :param new_tracts: tracts matrix for the new connectivity + """ + new_weights, interest_areas, new_tracts = self._reorder_arrays(original_conn, new_weights, + interest_areas, new_tracts) + if new_tracts is None: + new_tracts = original_conn.tract_lengths[interest_areas, :][:, interest_areas] + else: + new_tracts = new_tracts[interest_areas, :][:, interest_areas] + new_weights = new_weights[interest_areas, :][:, interest_areas] + + final_conn = Connectivity() + final_conn.parent_connectivity = None + final_conn.weights = new_weights + final_conn.centres = original_conn.centres[interest_areas, :] + final_conn.region_labels = original_conn.region_labels[interest_areas] + if original_conn.orientations is not None and len(original_conn.orientations): + final_conn.orientations = original_conn.orientations[interest_areas, :] + if original_conn.cortical is not None and len(original_conn.cortical): + final_conn.cortical = original_conn.cortical[interest_areas] + if original_conn.hemispheres is not None and len(original_conn.hemispheres): + final_conn.hemispheres = original_conn.hemispheres[interest_areas] + if original_conn.areas is not None and len(original_conn.areas): + final_conn.areas = original_conn.areas[interest_areas] + final_conn.tract_lengths = new_tracts + final_conn.saved_selection = [] + final_conn.configure() + return final_conn From f9e5f7baffd91e99ab8ac10c4e75ab4b35b6ab99 Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Thu, 14 Sep 2023 11:51:50 +0300 Subject: [PATCH 16/24] WID-223: add cut selected/unselected edges, synchronize viewers with result --- .../connectivity_ipy/connectivity_widget.py | 4 +- .../ui/connectivity_ipy/global_context.py | 28 +++++----- tvbwidgets/ui/connectivity_ipy/operations.py | 55 +++++++++++-------- 3 files changed, 50 insertions(+), 37 deletions(-) diff --git a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py index cf75f18e..31756dd6 100644 --- a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py +++ b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py @@ -45,6 +45,7 @@ def __init__(self, **kwargs): self.__draw_connectivity() self.__show_plot() + CONTEXT.observe(lambda *args: self.__show_plot(), 'connectivity') def add_datatype(self, datatype): # type: (HasTraits) -> None pass @@ -104,7 +105,6 @@ def on_ctx_change(value): class Connectivity3DViewer(ipywidgets.VBox): - PYVISTA = 'PyVista' def __init__(self, **kwargs): self.output = PyVistaOutput() @@ -112,8 +112,10 @@ def __init__(self, **kwargs): super(Connectivity3DViewer, self).__init__([self.output], *kwargs) self.init_view_connectivity() + CONTEXT.observe(lambda *args: self.init_view_connectivity(), 'connectivity') def init_view_connectivity(self): + self.output.plotter.clear() points, edges, labels = self.add_actors() points_toggle, edges_toggle, labels_toggle = self._init_controls() if not labels_toggle.value: diff --git a/tvbwidgets/ui/connectivity_ipy/global_context.py b/tvbwidgets/ui/connectivity_ipy/global_context.py index 42c08a26..74767e67 100644 --- a/tvbwidgets/ui/connectivity_ipy/global_context.py +++ b/tvbwidgets/ui/connectivity_ipy/global_context.py @@ -19,34 +19,34 @@ def __call__(cls, *args, **kwargs): class GlobalContext(metaclass=SingletonMeta): MATRIX_OPTIONS = [('Tracts', 'tracts'), ('Weights', 'weights')] - _observed_state = dict() def __init__(self): - self._matrix = 'weights' - self._connectivity = None + self.__matrix = 'weights' + self.__connectivity = None + self.__observed_attributes = dict() self.connectivities_history = [] # list of connectivities previously used @property def matrix(self): - return self._matrix + return self.__matrix @matrix.setter def matrix(self, next_value): - prev_value = self._matrix - self._matrix = next_value + prev_value = self.__matrix + self.__matrix = next_value if prev_value != next_value: self.__notify_observers('matrix', next_value) @property def connectivity(self): # type: () -> Connectivity - return self._connectivity + return self.__connectivity @connectivity.setter def connectivity(self, next_value): # type: (Connectivity) -> None - previous = self._connectivity - self._connectivity = next_value + previous = self.__connectivity + self.__connectivity = next_value if previous != next_value: self.__notify_observers('connectivity', next_value) if not any([conn.gid == next_value.gid for conn in self.connectivities_history]): @@ -59,13 +59,13 @@ def __notify_observers(self, observed_attribute, next_value): passing as argument the next value for the attribute """ try: - observers = self._observed_state[observed_attribute] + observers = self.__observed_attributes[observed_attribute] for obs in observers: obs(next_value) except KeyError: pass - def observe(self, observer_func, value_observed): + def observe(self, observer_func, attribute_observed): # type: (Callable[[any], any], str) -> None """ Method to register an observer for the specified value. @@ -74,10 +74,10 @@ def observe(self, observer_func, value_observed): with the new value passed as param. """ try: - observers_list = self._observed_state[value_observed] + observers_list = self.__observed_attributes[attribute_observed] observers_list.append(observer_func) except KeyError: - self._observed_state[value_observed] = [observer_func] + self.__observed_attributes[attribute_observed] = [observer_func] def remove_observer(self, observer_func, value_observed): # type: (Callable[[any], any], str) -> None @@ -85,7 +85,7 @@ def remove_observer(self, observer_func, value_observed): Unregister a registered observer. """ try: - observers_list = self._observed_state[value_observed] + observers_list = self.__observed_attributes[value_observed] observers_list.remove(observer_func) except KeyError: pass diff --git a/tvbwidgets/ui/connectivity_ipy/operations.py b/tvbwidgets/ui/connectivity_ipy/operations.py index f9f441cb..acd4f580 100644 --- a/tvbwidgets/ui/connectivity_ipy/operations.py +++ b/tvbwidgets/ui/connectivity_ipy/operations.py @@ -81,7 +81,6 @@ def on_ctx_change(value): @property def selected_regions(self): - print(self.regions_checkboxes) return list(map(lambda x: x.description, filter(lambda x: x.value, self.regions_checkboxes))) def __get_operations_buttons(self): @@ -93,22 +92,29 @@ def __get_operations_buttons(self): Create a new connectivity cutting the edges of selected nodes. Check the selected nodes in the above dropdown to see what it is included """ - cut_selected = ipywidgets.Button(description='Cut selected regions', - disabled=False, - button_style='success', - tooltip=cut_selected_tooltip, - icon='scissors') - - cut_edges_of_selected = ipywidgets.Button(description='Cut edges of selected', - disabled=False, - button_style='warning', - tooltip=cut_edges_tooltip, - icon='scissors') - - cut_selected.on_click(lambda *args: self.__cut_selected_nodes()) - cut_edges_of_selected.on_click(lambda *args: self.__cut_selected_edges()) - - return ipywidgets.HBox(children=[cut_selected, cut_edges_of_selected]) + cut_unselected_nodes = ipywidgets.Button(description='Cut selected regions', + disabled=False, + button_style='success', + tooltip=cut_selected_tooltip, + icon='scissors') + + cut_unselected_edges = ipywidgets.Button(description='Cut unselected edges', + disabled=False, + button_style='warning', + tooltip=cut_edges_tooltip, + icon='scissors') + + cut_selected_edges = ipywidgets.Button(description='Cut selected edges', + disabled=False, + button_style='warning', + tooltip=cut_edges_tooltip, + icon='scissors') + + cut_unselected_nodes.on_click(lambda *args: self.__cut_selected_nodes()) + cut_unselected_edges.on_click(lambda *args: self.__cut_edges()) + cut_selected_edges.on_click(lambda *args: self.__cut_edges(selected=True)) + + return ipywidgets.HBox(children=[cut_unselected_nodes, cut_unselected_edges, cut_selected_edges]) def __cut_selected_nodes(self): """ @@ -120,16 +126,18 @@ def __cut_selected_nodes(self): regions = CONTEXT.connectivity.region_labels selected_regions = [numpy.where(regions == label)[0][0] for label in self.selected_regions] new_conn = self._cut_connectivity(CONTEXT.connectivity, new_weights, selected_regions, new_tracts) + print('centres of new conn: ', new_conn.centres) CONTEXT.connectivity = new_conn - def __cut_selected_edges(self): + def __cut_edges(self, selected=False): print('cutting edges: ', self.selected_regions) matrix = CONTEXT.matrix new_weights = CONTEXT.connectivity.weights new_tracts = CONTEXT.connectivity.tract_lengths if matrix == 'tracts' else None regions = CONTEXT.connectivity.region_labels selected_regions = [numpy.where(regions == label)[0][0] for label in self.selected_regions] - new_conn = self._branch_connectivity(CONTEXT.connectivity, new_weights, selected_regions, new_tracts) + new_conn = self._cut_connectivity_edges(CONTEXT.connectivity, new_weights, selected_regions, new_tracts, + selected) CONTEXT.connectivity = new_conn def _reorder_arrays(self, original_conn, new_weights, interest_areas, new_tracts=None): @@ -147,8 +155,8 @@ def _reorder_arrays(self, original_conn, new_weights, interest_areas, new_tracts return new_weights, interest_areas, new_tracts - def _branch_connectivity(self, original_conn, new_weights, interest_areas, - new_tracts=None): + def _cut_connectivity_edges(self, original_conn, new_weights, interest_areas, + new_tracts=None, selected=False): # type: (Connectivity, numpy.array, numpy.array, numpy.array) -> Connectivity """ Generate new Connectivity based on a previous one, by changing weights (e.g. simulate lesion). @@ -157,8 +165,8 @@ def _branch_connectivity(self, original_conn, new_weights, interest_areas, :param new_weights: weights matrix for the new connectivity :param interest_areas: ndarray of the selected node id's :param new_tracts: tracts matrix for the new connectivity + :param selected: if true cuts out edges of selected areas else unselected edges """ - print('herre') new_weights, interest_areas, new_tracts = self._reorder_arrays(original_conn, new_weights, interest_areas, new_tracts) if new_tracts is None: @@ -167,6 +175,9 @@ def _branch_connectivity(self, original_conn, new_weights, interest_areas, for i in range(len(original_conn.weights)): for j in range(len(original_conn.weights)): if i not in interest_areas or j not in interest_areas: + if not selected: + new_weights[i][j] = 0 + elif i in interest_areas or j in interest_areas and selected: new_weights[i][j] = 0 final_conn = Connectivity() From ab46fa168ad6cc748bd0aac63b639fcd5b8a2d76 Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Thu, 14 Sep 2023 14:06:36 +0300 Subject: [PATCH 17/24] WID-223: add history connectivities --- tvbwidgets/ui/connectivity_ipy/operations.py | 42 ++++++++++++++++---- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/tvbwidgets/ui/connectivity_ipy/operations.py b/tvbwidgets/ui/connectivity_ipy/operations.py index acd4f580..b6180d2b 100644 --- a/tvbwidgets/ui/connectivity_ipy/operations.py +++ b/tvbwidgets/ui/connectivity_ipy/operations.py @@ -10,6 +10,9 @@ from tvbwidgets.ui.base_widget import TVBWidget from tvbwidgets.ui.connectivity_ipy.global_context import CONTEXT +from tvb.basic.logger.builder import get_logger + +LOGGER = get_logger(__name__) class ConnectivityOperations(ipywidgets.VBox, TVBWidget): @@ -24,12 +27,26 @@ def __init__(self, **kwargs): self.regions_checkboxes = [] selector = self.__get_node_selector() buttons = self.__get_operations_buttons() + history_dropdown = self.get_history_dropdown() children = [ ipywidgets.HTML( value=f'

Operations for Connectivity-{CONTEXT.connectivity.number_of_regions}

' - ), selector, buttons] + ), + history_dropdown, + selector, + buttons] + + def update_history_ui(*args): + children[1] = self.get_history_dropdown() + self.children = children + + CONTEXT.observe(update_history_ui, 'connectivity') self.children = children + @property + def selected_regions(self): + return list(map(lambda x: x.description, filter(lambda x: x.value, self.regions_checkboxes))) + def __get_node_selector(self): left_children = [] right_children = [] @@ -79,10 +96,6 @@ def on_ctx_change(value): accordion.set_title(0, 'Regions selector') return accordion - @property - def selected_regions(self): - return list(map(lambda x: x.description, filter(lambda x: x.value, self.regions_checkboxes))) - def __get_operations_buttons(self): cut_selected_tooltip = """ Create a new connectivity removing the selected nodes. @@ -126,11 +139,9 @@ def __cut_selected_nodes(self): regions = CONTEXT.connectivity.region_labels selected_regions = [numpy.where(regions == label)[0][0] for label in self.selected_regions] new_conn = self._cut_connectivity(CONTEXT.connectivity, new_weights, selected_regions, new_tracts) - print('centres of new conn: ', new_conn.centres) CONTEXT.connectivity = new_conn def __cut_edges(self, selected=False): - print('cutting edges: ', self.selected_regions) matrix = CONTEXT.matrix new_weights = CONTEXT.connectivity.weights new_tracts = CONTEXT.connectivity.tract_lengths if matrix == 'tracts' else None @@ -155,6 +166,15 @@ def _reorder_arrays(self, original_conn, new_weights, interest_areas, new_tracts return new_weights, interest_areas, new_tracts + def get_history_dropdown(self): + values = [(conn.gid.hex, conn) for conn in CONTEXT.connectivities_history] + + dropdown = ipywidgets.Dropdown(options=values, + description='View history', + disabled=False) + dropdown.observe(lambda x: print(x['new']), 'value') + return dropdown + def _cut_connectivity_edges(self, original_conn, new_weights, interest_areas, new_tracts=None, selected=False): # type: (Connectivity, numpy.array, numpy.array, numpy.array) -> Connectivity @@ -167,6 +187,10 @@ def _cut_connectivity_edges(self, original_conn, new_weights, interest_areas, :param new_tracts: tracts matrix for the new connectivity :param selected: if true cuts out edges of selected areas else unselected edges """ + if not len(interest_areas): + LOGGER.error('No intrest areas selected!') + return CONTEXT.connectivity + new_weights, interest_areas, new_tracts = self._reorder_arrays(original_conn, new_weights, interest_areas, new_tracts) if new_tracts is None: @@ -206,6 +230,10 @@ def _cut_connectivity(self, original_conn, new_weights, interest_areas, new_trac :param interest_areas: ndarray with the selected node id's. :param new_tracts: tracts matrix for the new connectivity """ + if not len(interest_areas): + LOGGER.error('No interest areas selected!') + return CONTEXT.connectivity + new_weights, interest_areas, new_tracts = self._reorder_arrays(original_conn, new_weights, interest_areas, new_tracts) if new_tracts is None: From bbbc7a93e9ef3c261eef7d71921b355afbd55080 Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Thu, 14 Sep 2023 15:40:58 +0300 Subject: [PATCH 18/24] WID-223: sync ui with data and some refactors --- .../connectivity_ipy/connectivity_widget.py | 21 ++++- .../ui/connectivity_ipy/global_context.py | 17 +++- tvbwidgets/ui/connectivity_ipy/operations.py | 82 ++++++++----------- 3 files changed, 66 insertions(+), 54 deletions(-) diff --git a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py index 31756dd6..b7ee63ee 100644 --- a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py +++ b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py @@ -17,7 +17,7 @@ from tvbwidgets.ui.connectivity_ipy.outputs_3d import PyVistaOutput from tvbwidgets.ui.connectivity_ipy.operations import ConnectivityOperations from tvbwidgets.ui.connectivity_ipy.config import ConnectivityConfig -from tvbwidgets.ui.connectivity_ipy.global_context import CONTEXT +from tvbwidgets.ui.connectivity_ipy.global_context import CONTEXT, ObservableAttrs DROPDOWN_KEY = 'dropdown' @@ -45,7 +45,7 @@ def __init__(self, **kwargs): self.__draw_connectivity() self.__show_plot() - CONTEXT.observe(lambda *args: self.__show_plot(), 'connectivity') + CONTEXT.observe(lambda *args: self.__show_plot(), ObservableAttrs.CONNECTIVITY) def add_datatype(self, datatype): # type: (HasTraits) -> None pass @@ -99,7 +99,7 @@ def on_change(change): def on_ctx_change(value): dropdown.value = value - CONTEXT.observe(on_ctx_change, 'matrix') + CONTEXT.observe(on_ctx_change, ObservableAttrs.MATRIX) self.widgets_map[DROPDOWN_KEY] = dropdown self.children = (dropdown, *self.children) @@ -112,7 +112,7 @@ def __init__(self, **kwargs): super(Connectivity3DViewer, self).__init__([self.output], *kwargs) self.init_view_connectivity() - CONTEXT.observe(lambda *args: self.init_view_connectivity(), 'connectivity') + CONTEXT.observe(lambda *args: self.init_view_connectivity(), ObservableAttrs.CONNECTIVITY) def init_view_connectivity(self): self.output.plotter.clear() @@ -226,6 +226,19 @@ def add_datatype(self, datatype): """ pass + def get_connectivity(self, gid=None): + # type: (str|None) -> Connectivity + """ + Get a connectivity with the gid provided from the context history. + if gid=None return the current connectivity set on CONTEXT + """ + if gid is None: + return CONTEXT.connectivity + conn = list(filter(lambda c: c.gid.hex == gid, CONTEXT.connectivities_history)) + if not len(conn): + return None + return conn[0] + def __init__(self, connectivity, **kwargs): style = self.DEFAULT_BORDER super().__init__(**kwargs, layout=style) diff --git a/tvbwidgets/ui/connectivity_ipy/global_context.py b/tvbwidgets/ui/connectivity_ipy/global_context.py index 74767e67..7d4a0baf 100644 --- a/tvbwidgets/ui/connectivity_ipy/global_context.py +++ b/tvbwidgets/ui/connectivity_ipy/global_context.py @@ -4,10 +4,19 @@ # # (c) 2022-2023, TVB Widgets Team # +import enum from typing import Callable from tvb.datatypes.connectivity import Connectivity +class ObservableAttrs(str, enum.Enum): + """ + Enum representing observable attributes of the GlobalContext singleton + """ + MATRIX = 'matrix' + CONNECTIVITY = 'connectivity' + + class SingletonMeta(type): _instances = {} @@ -35,7 +44,7 @@ def matrix(self, next_value): prev_value = self.__matrix self.__matrix = next_value if prev_value != next_value: - self.__notify_observers('matrix', next_value) + self.__notify_observers(ObservableAttrs.MATRIX, next_value) @property def connectivity(self): @@ -47,10 +56,12 @@ def connectivity(self, next_value): # type: (Connectivity) -> None previous = self.__connectivity self.__connectivity = next_value - if previous != next_value: - self.__notify_observers('connectivity', next_value) + if not len(self.connectivities_history): + self.connectivities_history = [self.__connectivity] + if previous and previous.gid.hex != next_value.gid.hex: if not any([conn.gid == next_value.gid for conn in self.connectivities_history]): self.connectivities_history.append(next_value) + self.__notify_observers(ObservableAttrs.CONNECTIVITY, next_value) def __notify_observers(self, observed_attribute, next_value): # type: (str, any) -> None diff --git a/tvbwidgets/ui/connectivity_ipy/operations.py b/tvbwidgets/ui/connectivity_ipy/operations.py index b6180d2b..988242a3 100644 --- a/tvbwidgets/ui/connectivity_ipy/operations.py +++ b/tvbwidgets/ui/connectivity_ipy/operations.py @@ -39,8 +39,15 @@ def __init__(self, **kwargs): def update_history_ui(*args): children[1] = self.get_history_dropdown() self.children = children + self.send_state(self.keys) # trigger ui update + + def update_selector_ui(*args): + children[2] = self.__get_node_selector() + self.children = children + self.send_state(self.keys) # trigger ui update CONTEXT.observe(update_history_ui, 'connectivity') + CONTEXT.observe(update_selector_ui, 'connectivity') self.children = children @property @@ -73,24 +80,8 @@ def __get_node_selector(self): )), layout={'width': '50%', 'align-items': 'start'} ) - matrix_dropdown = ipywidgets.Dropdown( - options=CONTEXT.MATRIX_OPTIONS, - value=CONTEXT.matrix, - description='Matrix:' - ) - - def on_change(value): - CONTEXT.matrix = value['new'] - - matrix_dropdown.observe(on_change, 'value') - - def on_ctx_change(value): - matrix_dropdown.value = value - CONTEXT.observe(on_ctx_change, 'matrix') - - container = ipywidgets.VBox(children=(matrix_dropdown, - ipywidgets.HBox(children=(left, right)))) + container = ipywidgets.HBox(children=(left, right)) accordion = ipywidgets.Accordion(children=[container], selected_index=None, layout={'max-height': '50vh'}) accordion.set_title(0, 'Regions selector') @@ -133,22 +124,15 @@ def __cut_selected_nodes(self): """ Create a new connectivity using only the selected nodes """ - matrix = CONTEXT.matrix - new_weights = CONTEXT.connectivity.weights - new_tracts = CONTEXT.connectivity.tract_lengths if matrix == 'tracts' else None regions = CONTEXT.connectivity.region_labels selected_regions = [numpy.where(regions == label)[0][0] for label in self.selected_regions] - new_conn = self._cut_connectivity(CONTEXT.connectivity, new_weights, selected_regions, new_tracts) + new_conn = self._cut_connectivity(selected_regions) CONTEXT.connectivity = new_conn def __cut_edges(self, selected=False): - matrix = CONTEXT.matrix - new_weights = CONTEXT.connectivity.weights - new_tracts = CONTEXT.connectivity.tract_lengths if matrix == 'tracts' else None regions = CONTEXT.connectivity.region_labels selected_regions = [numpy.where(regions == label)[0][0] for label in self.selected_regions] - new_conn = self._cut_connectivity_edges(CONTEXT.connectivity, new_weights, selected_regions, new_tracts, - selected) + new_conn = self._cut_connectivity_edges(selected_regions, selected) CONTEXT.connectivity = new_conn def _reorder_arrays(self, original_conn, new_weights, interest_areas, new_tracts=None): @@ -168,33 +152,38 @@ def _reorder_arrays(self, original_conn, new_weights, interest_areas, new_tracts def get_history_dropdown(self): values = [(conn.gid.hex, conn) for conn in CONTEXT.connectivities_history] + default = len(values) and values[-1][1] or None dropdown = ipywidgets.Dropdown(options=values, description='View history', - disabled=False) - dropdown.observe(lambda x: print(x['new']), 'value') + disabled=False, + value=default) + + def on_connectivity_change(change): + CONTEXT.connectivity = change['new'] + + dropdown.observe(on_connectivity_change, 'value') return dropdown - def _cut_connectivity_edges(self, original_conn, new_weights, interest_areas, - new_tracts=None, selected=False): - # type: (Connectivity, numpy.array, numpy.array, numpy.array) -> Connectivity + def _cut_connectivity_edges(self, interest_areas, selected=False): + # type: (numpy.array, bool) -> Connectivity """ Generate new Connectivity based on a previous one, by changing weights (e.g. simulate lesion). The returned connectivity has the same number of nodes. The edges of unselected nodes will have weight 0. - :param original_conn: Original Connectivity, to copy from - :param new_weights: weights matrix for the new connectivity :param interest_areas: ndarray of the selected node id's - :param new_tracts: tracts matrix for the new connectivity :param selected: if true cuts out edges of selected areas else unselected edges """ + + original_conn = CONTEXT.connectivity + new_weights = CONTEXT.connectivity.weights + new_tracts = CONTEXT.connectivity.tract_lengths + if not len(interest_areas): - LOGGER.error('No intrest areas selected!') + LOGGER.error('No interest areas selected!') return CONTEXT.connectivity new_weights, interest_areas, new_tracts = self._reorder_arrays(original_conn, new_weights, interest_areas, new_tracts) - if new_tracts is None: - new_tracts = original_conn.tract_lengths for i in range(len(original_conn.weights)): for j in range(len(original_conn.weights)): @@ -218,28 +207,27 @@ def _cut_connectivity_edges(self, original_conn, new_weights, interest_areas, final_conn.configure() return final_conn - def _cut_connectivity(self, original_conn, new_weights, interest_areas, new_tracts=None): - # type: (Connectivity, numpy.array, numpy.array, numpy.array) -> Connectivity + def _cut_connectivity(self, interest_areas, selected=False): + # type: (numpy.array, bool) -> Connectivity """ Generate new Connectivity object based on current one, by removing nodes (e.g. simulate lesion). Only the selected nodes will get used in the result. The order of the indices in interest_areas matters. If indices are not sorted then the nodes will be permuted accordingly. - - :param original_conn: Original Connectivity(HasTraits), to cut nodes from - :param new_weights: weights matrix for the new connectivity :param interest_areas: ndarray with the selected node id's. - :param new_tracts: tracts matrix for the new connectivity """ + + original_conn = CONTEXT.connectivity + new_weights = CONTEXT.connectivity.weights + new_tracts = CONTEXT.connectivity.tract_lengths + if not len(interest_areas): LOGGER.error('No interest areas selected!') return CONTEXT.connectivity new_weights, interest_areas, new_tracts = self._reorder_arrays(original_conn, new_weights, interest_areas, new_tracts) - if new_tracts is None: - new_tracts = original_conn.tract_lengths[interest_areas, :][:, interest_areas] - else: - new_tracts = new_tracts[interest_areas, :][:, interest_areas] + + new_tracts = new_tracts[interest_areas, :][:, interest_areas] new_weights = new_weights[interest_areas, :][:, interest_areas] final_conn = Connectivity() From 7266e6612032bd46e0178485c56584fe04fcf34a Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Thu, 14 Sep 2023 16:13:21 +0300 Subject: [PATCH 19/24] WID-223: operations refactors --- tvbwidgets/ui/connectivity_ipy/operations.py | 33 +++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/tvbwidgets/ui/connectivity_ipy/operations.py b/tvbwidgets/ui/connectivity_ipy/operations.py index 988242a3..3bce1ed7 100644 --- a/tvbwidgets/ui/connectivity_ipy/operations.py +++ b/tvbwidgets/ui/connectivity_ipy/operations.py @@ -131,7 +131,7 @@ def __cut_selected_nodes(self): def __cut_edges(self, selected=False): regions = CONTEXT.connectivity.region_labels - selected_regions = [numpy.where(regions == label)[0][0] for label in self.selected_regions] + selected_regions = numpy.array([numpy.where(regions == label)[0][0] for label in self.selected_regions]) new_conn = self._cut_connectivity_edges(selected_regions, selected) CONTEXT.connectivity = new_conn @@ -142,7 +142,7 @@ def _reorder_arrays(self, original_conn, new_weights, interest_areas, new_tracts permutation = original_conn.hemisphere_order_indices inverse_permutation = numpy.argsort(permutation) # trick to invert a permutation represented as an array interest_areas = inverse_permutation[interest_areas] - # see :meth"`ordered_weights` for why [p:][:p] + # see :meth:`ordered_weights` for why [p:][:p] new_weights = new_weights[inverse_permutation, :][:, inverse_permutation] if new_tracts is not None: @@ -169,21 +169,23 @@ def _cut_connectivity_edges(self, interest_areas, selected=False): # type: (numpy.array, bool) -> Connectivity """ Generate new Connectivity based on a previous one, by changing weights (e.g. simulate lesion). - The returned connectivity has the same number of nodes. The edges of unselected nodes will have weight 0. - :param interest_areas: ndarray of the selected node id's + The returned connectivity has the same number of nodes. The edges of unselected nodes will have weight 0 if + selected=False. + + :param interest_areas: ndarray of the selected node indexes :param selected: if true cuts out edges of selected areas else unselected edges """ original_conn = CONTEXT.connectivity - new_weights = CONTEXT.connectivity.weights - new_tracts = CONTEXT.connectivity.tract_lengths if not len(interest_areas): LOGGER.error('No interest areas selected!') return CONTEXT.connectivity - new_weights, interest_areas, new_tracts = self._reorder_arrays(original_conn, new_weights, - interest_areas, new_tracts) + new_weights, interest_areas, new_tracts = self._reorder_arrays(original_conn, + original_conn.weights, + interest_areas, + original_conn.tract_lengths) for i in range(len(original_conn.weights)): for j in range(len(original_conn.weights)): @@ -207,25 +209,26 @@ def _cut_connectivity_edges(self, interest_areas, selected=False): final_conn.configure() return final_conn - def _cut_connectivity(self, interest_areas, selected=False): + def _cut_connectivity(self, interest_areas, selected=True): # type: (numpy.array, bool) -> Connectivity """ Generate new Connectivity object based on current one, by removing nodes (e.g. simulate lesion). - Only the selected nodes will get used in the result. The order of the indices in interest_areas matters. + Only the selected nodes will get used in the result if selected=True. The order of the indices in interest_areas matters. If indices are not sorted then the nodes will be permuted accordingly. - :param interest_areas: ndarray with the selected node id's. + :param interest_areas: ndarray with the selected node indexes. + :param selected: should use for the new connectivity the selected nodes (if false, uses the unselected nodes) """ original_conn = CONTEXT.connectivity - new_weights = CONTEXT.connectivity.weights - new_tracts = CONTEXT.connectivity.tract_lengths if not len(interest_areas): LOGGER.error('No interest areas selected!') return CONTEXT.connectivity - new_weights, interest_areas, new_tracts = self._reorder_arrays(original_conn, new_weights, - interest_areas, new_tracts) + new_weights, interest_areas, new_tracts = self._reorder_arrays(original_conn, + original_conn.weights, + interest_areas, + original_conn.tract_lengths) new_tracts = new_tracts[interest_areas, :][:, interest_areas] new_weights = new_weights[interest_areas, :][:, interest_areas] From 1b67e380934e5413ad7058301bca8c5817e9e272 Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Thu, 14 Sep 2023 16:31:47 +0300 Subject: [PATCH 20/24] WID-223: fix bug related to cutting unselected tracts and remove label due to poor performance --- notebooks/Connectivity.ipynb | 82 +++++++++++++++++-- .../connectivity_ipy/connectivity_widget.py | 19 +---- tvbwidgets/ui/connectivity_ipy/operations.py | 2 +- 3 files changed, 78 insertions(+), 25 deletions(-) diff --git a/notebooks/Connectivity.ipynb b/notebooks/Connectivity.ipynb index 3e8379e7..08d33483 100644 --- a/notebooks/Connectivity.ipynb +++ b/notebooks/Connectivity.ipynb @@ -27,17 +27,51 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "11-09-2023 10:43:09 - DEBUG - tvbwidgets - Package is not fully installed\n", - "11-09-2023 10:43:09 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", - "11-09-2023 10:43:09 - INFO - tvbwidgets - Version: 1.5.0\n" + "14-09-2023 04:28:58 - DEBUG - tvbwidgets - Package is not fully installed\n", + "14-09-2023 04:28:58 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", + "14-09-2023 04:28:58 - INFO - tvbwidgets - Version: 1.5.0\n", + "2023-09-14 16:29:04,296 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", + "14-09-2023 04:29:04 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", + "2023-09-14 16:29:04,405 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n", + "connectivity.weights: [[2. 2. 0. ... 0. 0. 0.]\n", + " [3. 2. 0. ... 0. 0. 0.]\n", + " [0. 0. 2. ... 0. 0. 0.]\n", + " ...\n", + " [0. 0. 0. ... 2. 2. 0.]\n", + " [0. 0. 0. ... 3. 2. 0.]\n", + " [0. 0. 0. ... 0. 0. 0.]]\n", + "edge_indices: (array([ 0, 0, 0, ..., 74, 74, 74], dtype=int64), array([ 0, 1, 3, ..., 72, 73, 74], dtype=int64))\n", + "edges: [(0, 0), (0, 1), (0, 3), (0, 6), (0, 10), (0, 11), (0, 18), (0, 20), (0, 21), (0, 24), (0, 30), (0, 33), (0, 34), (1, 0), (1, 1), (1, 7), (1, 13), (1, 14), (1, 15), (1, 16), (1, 17), (1, 21), (1, 22), (1, 23), (1, 24), (1, 25), (1, 30), (1, 33), (1, 34), (2, 2), (2, 24), (2, 30), (2, 31), (2, 32), (2, 34), (2, 40), (3, 0), (3, 2), (3, 3), (3, 4), (3, 6), (3, 7), (3, 8), (3, 9), (3, 10), (3, 11), (3, 12), (3, 14), (3, 15), (3, 16), (3, 17), (3, 18), (3, 19), (3, 20), (3, 21), (3, 22), (3, 23), (3, 24), (3, 25), (3, 26), (3, 27), (3, 29), (3, 32), (3, 34), (3, 36), (3, 41), (4, 0), (4, 1), (4, 3), (4, 4), (4, 5), (4, 6), (4, 7), (4, 11), (4, 12), (4, 14), (4, 15), (4, 16), (4, 17), (4, 20), (4, 21), (4, 22), (4, 24), (4, 28), (4, 29), (4, 30), (4, 33), (4, 34), (4, 36), (4, 42), (5, 4), (5, 13), (5, 14), (5, 15), (5, 16), (5, 17), (5, 18), (5, 43), (6, 0), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6), (6, 9), (6, 10), (6, 11), (6, 16), (6, 17), (6, 18), (6, 20), (6, 21), (6, 22), (6, 23), (6, 24), (6, 30), (6, 32), (6, 33), (6, 34), (6, 36), (6, 44), (7, 0), (7, 1), (7, 3), (7, 4), (7, 5), (7, 7), (7, 10), (7, 11), (7, 13), (7, 14), (7, 15), (7, 16), (7, 17), (7, 20), (7, 21), (7, 22), (7, 23), (7, 24), (7, 25), (7, 26), (7, 28), (7, 30), (7, 32), (7, 33), (7, 36), (7, 45), (8, 3), (8, 4), (8, 8), (8, 10), (8, 11), (8, 13), (8, 14), (8, 17), (8, 21), (8, 22), (8, 25), (8, 26), (8, 28), (8, 29), (9, 24), (10, 0), (10, 1), (10, 2), (10, 3), (10, 4), (10, 5), (10, 6), (10, 7), (10, 9), (10, 10), (10, 11), (10, 13), (10, 14), (10, 15), (10, 16), (10, 17), (10, 18), (10, 20), (10, 21), (10, 22), (10, 23), (10, 24), (10, 25), (10, 27), (10, 28), (10, 29), (10, 32), (10, 33), (10, 34), (10, 36), (11, 2), (11, 3), (11, 5), (11, 6), (11, 9), (11, 10), (11, 11), (11, 13), (11, 14), (11, 15), (11, 16), (11, 17), (11, 18), (11, 20), (11, 21), (11, 23), (11, 24), (11, 25), (11, 27), (11, 28), (11, 29), (11, 32), (11, 34), (11, 36), (12, 3), (12, 4), (12, 10), (12, 11), (12, 12), (12, 14), (12, 15), (12, 16), (12, 21), (12, 22), (12, 25), (12, 26), (12, 27), (12, 28), (12, 29), (12, 30), (12, 36), (12, 50), (13, 1), (13, 2), (13, 3), (13, 4), (13, 5), (13, 7), (13, 8), (13, 10), (13, 11), (13, 13), (13, 14), (13, 15), (13, 16), (13, 18), (13, 23), (13, 24), (13, 25), (13, 26), (13, 27), (13, 28), (13, 29), (13, 30), (13, 31), (13, 32), (13, 33), (13, 34), (13, 36), (14, 1), (14, 2), (14, 3), (14, 4), (14, 5), (14, 7), (14, 8), (14, 10), (14, 11), (14, 12), (14, 13), (14, 14), (14, 15), (14, 16), (14, 17), (14, 18), (14, 23), (14, 24), (14, 25), (14, 26), (14, 27), (14, 28), (14, 29), (14, 30), (14, 31), (14, 32), (14, 33), (14, 34), (14, 35), (14, 36), (15, 3), (15, 4), (15, 5), (15, 7), (15, 10), (15, 11), (15, 12), (15, 13), (15, 14), (15, 15), (15, 16), (15, 17), (15, 18), (15, 21), (15, 23), (15, 24), (15, 25), (15, 26), (15, 30), (15, 33), (15, 34), (15, 36), (15, 53), (16, 2), (16, 3), (16, 4), (16, 5), (16, 6), (16, 7), (16, 10), (16, 11), (16, 12), (16, 13), (16, 14), (16, 15), (16, 16), (16, 17), (16, 18), (16, 21), (16, 22), (16, 23), (16, 24), (16, 25), (16, 26), (16, 27), (16, 28), (16, 30), (16, 31), (16, 33), (16, 34), (16, 35), (16, 36), (16, 54), (17, 1), (17, 3), (17, 4), (17, 5), (17, 6), (17, 7), (17, 10), (17, 11), (17, 13), (17, 14), (17, 15), (17, 16), (17, 17), (17, 18), (17, 19), (17, 20), (17, 21), (17, 22), (17, 23), (17, 24), (17, 25), (17, 26), (17, 27), (17, 28), (17, 29), (17, 30), (17, 33), (17, 36), (17, 55), (18, 3), (18, 4), (18, 5), (18, 6), (18, 7), (18, 10), (18, 11), (18, 13), (18, 14), (18, 16), (18, 17), (18, 18), (18, 19), (18, 20), (18, 21), (18, 22), (18, 23), (18, 24), (18, 25), (18, 26), (18, 27), (18, 29), (18, 30), (18, 31), (18, 32), (18, 33), (18, 34), (18, 36), (18, 56), (19, 3), (19, 57), (20, 0), (20, 1), (20, 2), (20, 3), (20, 4), (20, 5), (20, 6), (20, 9), (20, 10), (20, 11), (20, 16), (20, 17), (20, 18), (20, 20), (20, 21), (20, 22), (20, 24), (20, 30), (20, 32), (20, 33), (20, 34), (20, 36), (20, 58), (21, 0), (21, 1), (21, 2), (21, 3), (21, 4), (21, 5), (21, 6), (21, 7), (21, 9), (21, 10), (21, 11), (21, 13), (21, 14), (21, 16), (21, 17), (21, 18), (21, 20), (21, 21), (21, 22), (21, 23), (21, 24), (21, 25), (21, 26), (21, 27), (21, 28), (21, 29), (21, 30), (21, 31), (21, 32), (21, 33), (21, 34), (21, 36), (22, 1), (22, 3), (22, 5), (22, 6), (22, 10), (22, 11), (22, 13), (22, 14), (22, 16), (22, 17), (22, 18), (22, 20), (22, 21), (22, 22), (22, 23), (22, 24), (22, 25), (22, 26), (22, 27), (22, 28), (22, 29), (22, 30), (22, 31), (22, 32), (22, 33), (22, 34), (22, 36), (22, 60), (23, 0), (23, 1), (23, 3), (23, 4), (23, 6), (23, 7), (23, 10), (23, 11), (23, 13), (23, 14), (23, 15), (23, 16), (23, 17), (23, 18), (23, 20), (23, 21), (23, 22), (23, 23), (23, 24), (23, 25), (23, 26), (23, 27), (23, 29), (23, 30), (23, 31), (23, 32), (23, 33), (23, 34), (23, 36), (24, 0), (24, 1), (24, 2), (24, 3), (24, 4), (24, 5), (24, 6), (24, 7), (24, 9), (24, 10), (24, 11), (24, 13), (24, 14), (24, 16), (24, 17), (24, 18), (24, 20), (24, 21), (24, 22), (24, 23), (24, 24), (24, 29), (24, 30), (24, 31), (24, 32), (24, 33), (24, 34), (24, 36), (25, 1), (25, 3), (25, 7), (25, 10), (25, 11), (25, 12), (25, 13), (25, 14), (25, 15), (25, 16), (25, 17), (25, 18), (25, 19), (25, 21), (25, 23), (25, 25), (25, 26), (25, 27), (25, 28), (25, 29), (25, 30), (25, 33), (25, 36), (25, 63), (26, 1), (26, 3), (26, 7), (26, 10), (26, 11), (26, 12), (26, 13), (26, 14), (26, 15), (26, 16), (26, 17), (26, 18), (26, 19), (26, 21), (26, 23), (26, 25), (26, 26), (26, 27), (26, 28), (26, 29), (26, 30), (26, 33), (26, 36), (26, 64), (27, 3), (27, 10), (27, 11), (27, 12), (27, 13), (27, 14), (27, 15), (27, 16), (27, 17), (27, 18), (27, 21), (27, 24), (27, 25), (27, 26), (27, 27), (27, 28), (27, 29), (27, 30), (27, 36), (28, 8), (28, 10), (28, 11), (28, 12), (28, 13), (28, 14), (28, 16), (28, 17), (28, 25), (28, 26), (28, 28), (28, 29), (28, 66), (29, 3), (29, 8), (29, 11), (29, 12), (29, 13), (29, 14), (29, 17), (29, 27), (29, 28), (29, 29), (30, 0), (30, 1), (30, 2), (30, 3), (30, 4), (30, 6), (30, 7), (30, 10), (30, 11), (30, 13), (30, 14), (30, 15), (30, 16), (30, 17), (30, 18), (30, 20), (30, 21), (30, 22), (30, 24), (30, 30), (30, 31), (30, 32), (30, 33), (30, 34), (30, 35), (30, 36), (31, 2), (31, 7), (31, 11), (31, 13), (31, 14), (31, 16), (31, 21), (31, 23), (31, 24), (31, 30), (31, 31), (31, 32), (31, 33), (31, 34), (31, 36), (32, 0), (32, 1), (32, 2), (32, 3), (32, 5), (32, 6), (32, 10), (32, 11), (32, 13), (32, 17), (32, 20), (32, 21), (32, 22), (32, 23), (32, 24), (32, 30), (32, 31), (32, 33), (32, 34), (33, 0), (33, 1), (33, 2), (33, 4), (33, 7), (33, 10), (33, 13), (33, 14), (33, 16), (33, 17), (33, 18), (33, 21), (33, 22), (33, 23), (33, 24), (33, 25), (33, 30), (33, 31), (33, 32), (33, 33), (33, 34), (33, 36), (34, 0), (34, 1), (34, 2), (34, 3), (34, 4), (34, 5), (34, 6), (34, 7), (34, 10), (34, 11), (34, 13), (34, 14), (34, 16), (34, 17), (34, 18), (34, 20), (34, 21), (34, 22), (34, 23), (34, 24), (34, 29), (34, 30), (34, 31), (34, 32), (34, 33), (34, 34), (34, 36), (35, 2), (35, 13), (35, 14), (35, 24), (35, 30), (35, 33), (35, 35), (35, 36), (35, 73), (36, 2), (36, 3), (36, 6), (36, 7), (36, 10), (36, 11), (36, 13), (36, 14), (36, 15), (36, 16), (36, 17), (36, 18), (36, 21), (36, 22), (36, 23), (36, 24), (36, 25), (36, 26), (36, 27), (36, 30), (36, 31), (36, 32), (36, 33), (36, 34), (36, 35), (36, 36), (36, 74), (38, 38), (38, 39), (38, 41), (38, 44), (38, 48), (38, 49), (38, 56), (38, 58), (38, 59), (38, 62), (38, 68), (38, 71), (38, 72), (39, 38), (39, 39), (39, 45), (39, 51), (39, 52), (39, 53), (39, 54), (39, 55), (39, 59), (39, 60), (39, 61), (39, 62), (39, 63), (39, 68), (39, 71), (39, 72), (40, 2), (40, 40), (40, 62), (40, 68), (40, 69), (40, 70), (40, 72), (41, 3), (41, 38), (41, 40), (41, 41), (41, 42), (41, 44), (41, 45), (41, 46), (41, 47), (41, 48), (41, 49), (41, 50), (41, 52), (41, 53), (41, 54), (41, 55), (41, 56), (41, 57), (41, 58), (41, 59), (41, 60), (41, 61), (41, 62), (41, 63), (41, 64), (41, 65), (41, 67), (41, 70), (41, 72), (41, 74), (42, 4), (42, 38), (42, 39), (42, 41), (42, 42), (42, 43), (42, 44), (42, 45), (42, 49), (42, 50), (42, 52), (42, 53), (42, 54), (42, 55), (42, 58), (42, 59), (42, 60), (42, 62), (42, 66), (42, 67), (42, 68), (42, 71), (42, 72), (42, 74), (43, 5), (43, 42), (43, 51), (43, 52), (43, 53), (43, 54), (43, 55), (43, 56), (44, 6), (44, 38), (44, 39), (44, 40), (44, 41), (44, 42), (44, 43), (44, 44), (44, 47), (44, 48), (44, 49), (44, 54), (44, 55), (44, 56), (44, 58), (44, 59), (44, 60), (44, 61), (44, 62), (44, 68), (44, 70), (44, 71), (44, 72), (44, 74), (45, 7), (45, 38), (45, 39), (45, 41), (45, 42), (45, 43), (45, 45), (45, 48), (45, 49), (45, 51), (45, 52), (45, 53), (45, 54), (45, 55), (45, 58), (45, 59), (45, 60), (45, 61), (45, 62), (45, 63), (45, 64), (45, 66), (45, 68), (45, 70), (45, 71), (45, 74), (46, 41), (46, 42), (46, 46), (46, 48), (46, 49), (46, 51), (46, 52), (46, 55), (46, 59), (46, 60), (46, 63), (46, 64), (46, 66), (46, 67), (47, 62), (48, 38), (48, 39), (48, 40), (48, 41), (48, 42), (48, 43), (48, 44), (48, 45), (48, 47), (48, 48), (48, 49), (48, 51), (48, 52), (48, 53), (48, 54), (48, 55), (48, 56), (48, 58), (48, 59), (48, 60), (48, 61), (48, 62), (48, 63), (48, 65), (48, 66), (48, 67), (48, 70), (48, 71), (48, 72), (48, 74), (49, 40), (49, 41), (49, 43), (49, 44), (49, 47), (49, 48), (49, 49), (49, 51), (49, 52), (49, 53), (49, 54), (49, 55), (49, 56), (49, 58), (49, 59), (49, 61), (49, 62), (49, 63), (49, 65), (49, 66), (49, 67), (49, 70), (49, 72), (49, 74), (50, 12), (50, 41), (50, 42), (50, 48), (50, 49), (50, 50), (50, 52), (50, 53), (50, 54), (50, 59), (50, 60), (50, 63), (50, 64), (50, 65), (50, 66), (50, 67), (50, 68), (50, 74), (51, 39), (51, 40), (51, 41), (51, 42), (51, 43), (51, 45), (51, 46), (51, 48), (51, 49), (51, 51), (51, 52), (51, 53), (51, 54), (51, 56), (51, 61), (51, 62), (51, 63), (51, 64), (51, 65), (51, 66), (51, 67), (51, 68), (51, 69), (51, 70), (51, 71), (51, 72), (51, 74), (52, 39), (52, 40), (52, 41), (52, 42), (52, 43), (52, 45), (52, 46), (52, 48), (52, 49), (52, 50), (52, 51), (52, 52), (52, 53), (52, 54), (52, 55), (52, 56), (52, 61), (52, 62), (52, 63), (52, 64), (52, 65), (52, 66), (52, 67), (52, 68), (52, 69), (52, 70), (52, 71), (52, 72), (52, 73), (52, 74), (53, 15), (53, 41), (53, 42), (53, 43), (53, 45), (53, 48), (53, 49), (53, 50), (53, 51), (53, 52), (53, 53), (53, 54), (53, 55), (53, 56), (53, 59), (53, 61), (53, 62), (53, 63), (53, 64), (53, 68), (53, 71), (53, 72), (53, 74), (54, 16), (54, 40), (54, 41), (54, 42), (54, 43), (54, 44), (54, 45), (54, 48), (54, 49), (54, 50), (54, 51), (54, 52), (54, 53), (54, 54), (54, 55), (54, 56), (54, 59), (54, 60), (54, 61), (54, 62), (54, 63), (54, 64), (54, 65), (54, 66), (54, 68), (54, 69), (54, 71), (54, 72), (54, 73), (54, 74), (55, 17), (55, 39), (55, 41), (55, 42), (55, 43), (55, 44), (55, 45), (55, 48), (55, 49), (55, 51), (55, 52), (55, 53), (55, 54), (55, 55), (55, 56), (55, 57), (55, 58), (55, 59), (55, 60), (55, 61), (55, 62), (55, 63), (55, 64), (55, 65), (55, 66), (55, 67), (55, 68), (55, 71), (55, 74), (56, 18), (56, 41), (56, 42), (56, 43), (56, 44), (56, 45), (56, 48), (56, 49), (56, 51), (56, 52), (56, 54), (56, 55), (56, 56), (56, 57), (56, 58), (56, 59), (56, 60), (56, 61), (56, 62), (56, 63), (56, 64), (56, 65), (56, 67), (56, 68), (56, 69), (56, 70), (56, 71), (56, 72), (56, 74), (57, 19), (57, 41), (58, 20), (58, 38), (58, 39), (58, 40), (58, 41), (58, 42), (58, 43), (58, 44), (58, 47), (58, 48), (58, 49), (58, 54), (58, 55), (58, 56), (58, 58), (58, 59), (58, 60), (58, 62), (58, 68), (58, 70), (58, 71), (58, 72), (58, 74), (59, 38), (59, 39), (59, 40), (59, 41), (59, 42), (59, 43), (59, 44), (59, 45), (59, 47), (59, 48), (59, 49), (59, 51), (59, 52), (59, 54), (59, 55), (59, 56), (59, 58), (59, 59), (59, 60), (59, 61), (59, 62), (59, 63), (59, 64), (59, 65), (59, 66), (59, 67), (59, 68), (59, 69), (59, 70), (59, 71), (59, 72), (59, 74), (60, 22), (60, 39), (60, 41), (60, 43), (60, 44), (60, 48), (60, 49), (60, 51), (60, 52), (60, 54), (60, 55), (60, 56), (60, 58), (60, 59), (60, 60), (60, 61), (60, 62), (60, 63), (60, 64), (60, 65), (60, 66), (60, 67), (60, 68), (60, 69), (60, 70), (60, 71), (60, 72), (60, 74), (61, 38), (61, 39), (61, 41), (61, 42), (61, 44), (61, 45), (61, 48), (61, 49), (61, 51), (61, 52), (61, 53), (61, 54), (61, 55), (61, 56), (61, 58), (61, 59), (61, 60), (61, 61), (61, 62), (61, 63), (61, 64), (61, 65), (61, 67), (61, 68), (61, 69), (61, 70), (61, 71), (61, 72), (61, 74), (62, 38), (62, 39), (62, 40), (62, 41), (62, 42), (62, 43), (62, 44), (62, 45), (62, 47), (62, 48), (62, 49), (62, 51), (62, 52), (62, 54), (62, 55), (62, 56), (62, 58), (62, 59), (62, 60), (62, 61), (62, 62), (62, 67), (62, 68), (62, 69), (62, 70), (62, 71), (62, 72), (62, 74), (63, 25), (63, 39), (63, 41), (63, 45), (63, 48), (63, 49), (63, 50), (63, 51), (63, 52), (63, 53), (63, 54), (63, 55), (63, 56), (63, 57), (63, 59), (63, 61), (63, 63), (63, 64), (63, 65), (63, 66), (63, 67), (63, 68), (63, 71), (63, 74), (64, 26), (64, 39), (64, 41), (64, 45), (64, 48), (64, 49), (64, 50), (64, 51), (64, 52), (64, 53), (64, 54), (64, 55), (64, 56), (64, 57), (64, 59), (64, 61), (64, 63), (64, 64), (64, 65), (64, 66), (64, 67), (64, 68), (64, 71), (64, 74), (65, 41), (65, 48), (65, 49), (65, 50), (65, 51), (65, 52), (65, 53), (65, 54), (65, 55), (65, 56), (65, 59), (65, 62), (65, 63), (65, 64), (65, 65), (65, 66), (65, 67), (65, 68), (65, 74), (66, 28), (66, 46), (66, 48), (66, 49), (66, 50), (66, 51), (66, 52), (66, 54), (66, 55), (66, 63), (66, 64), (66, 66), (66, 67), (67, 41), (67, 46), (67, 49), (67, 50), (67, 51), (67, 52), (67, 55), (67, 65), (67, 66), (67, 67), (68, 38), (68, 39), (68, 40), (68, 41), (68, 42), (68, 44), (68, 45), (68, 48), (68, 49), (68, 51), (68, 52), (68, 53), (68, 54), (68, 55), (68, 56), (68, 58), (68, 59), (68, 60), (68, 62), (68, 68), (68, 69), (68, 70), (68, 71), (68, 72), (68, 73), (68, 74), (69, 40), (69, 45), (69, 49), (69, 51), (69, 52), (69, 54), (69, 59), (69, 61), (69, 62), (69, 68), (69, 69), (69, 70), (69, 71), (69, 72), (69, 74), (70, 38), (70, 39), (70, 40), (70, 41), (70, 43), (70, 44), (70, 48), (70, 49), (70, 51), (70, 55), (70, 58), (70, 59), (70, 60), (70, 61), (70, 62), (70, 68), (70, 69), (70, 71), (70, 72), (71, 38), (71, 39), (71, 40), (71, 42), (71, 45), (71, 48), (71, 51), (71, 52), (71, 54), (71, 55), (71, 56), (71, 59), (71, 60), (71, 61), (71, 62), (71, 63), (71, 68), (71, 69), (71, 70), (71, 71), (71, 72), (71, 74), (72, 38), (72, 39), (72, 40), (72, 41), (72, 42), (72, 43), (72, 44), (72, 45), (72, 48), (72, 49), (72, 51), (72, 52), (72, 54), (72, 55), (72, 56), (72, 58), (72, 59), (72, 60), (72, 61), (72, 62), (72, 67), (72, 68), (72, 69), (72, 70), (72, 71), (72, 72), (72, 74), (73, 35), (73, 40), (73, 51), (73, 52), (73, 62), (73, 68), (73, 71), (73, 73), (73, 74), (74, 36), (74, 40), (74, 41), (74, 44), (74, 45), (74, 48), (74, 49), (74, 51), (74, 52), (74, 53), (74, 54), (74, 55), (74, 56), (74, 59), (74, 60), (74, 61), (74, 62), (74, 63), (74, 64), (74, 65), (74, 68), (74, 69), (74, 70), (74, 71), (74, 72), (74, 73), (74, 74)]\n", + "edges coords: [array([ -9.885591, -47.084818, -3.13936 ]), array([ -9.885591, -47.084818, -3.13936 ]), array([ -9.885591, -47.084818, -3.13936 ]), array([ -2.605247, -55.324507, -7.065423]), array([ -9.885591, -47.084818, -3.13936 ]), array([48.734149, -2.004701, 8.019123]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 30.150795, -4.286333, -31.136279]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 23.242996, -42.031295, -22.110624]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 9.822772, -44.114976, -18.760442]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 59.995574, -14.366518, 26.025739]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 59.286775, -2.547348, -21.924281]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 47.987255, -16.887697, -39.699154]), array([ -9.885591, -47.084818, -3.13936 ]), array([-14.49484 , -20.328269, -27.617052]), array([ -9.885591, -47.084818, -3.13936 ]), array([ -8.613724, -59.8286 , -27.915417]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 9.897209, -53.324915, -23.790822]), array([ -9.885591, -47.084818, -3.13936 ]), array([-31.897851, -30.247588, -33.028094]), array([ -2.605247, -55.324507, -7.065423]), array([ -9.885591, -47.084818, -3.13936 ]), array([ -2.605247, -55.324507, -7.065423]), array([ -2.605247, -55.324507, -7.065423]), array([ -2.605247, -55.324507, -7.065423]), array([ 30.400644, -33.753689, 34.832572]), array([ -2.605247, -55.324507, -7.065423]), array([-22.152851, -56.734891, 16.852029]), array([ -2.605247, -55.324507, -7.065423]), array([-51.151034, -35.899675, 25.679908]), array([ -2.605247, -55.324507, -7.065423]), array([-43.927847, -8.226723, 27.584594]), array([ -2.605247, -55.324507, -7.065423]), array([-30.092058, -33.534852, 43.097159]), array([ -2.605247, -55.324507, -7.065423]), array([ 54.048553, -37.427609, 12.535183]), array([ -2.605247, -55.324507, -7.065423]), array([ 47.987255, -16.887697, -39.699154]), array([ -2.605247, -55.324507, -7.065423]), array([ 79.213202, -15.623481, -15.95848 ]), array([ -2.605247, -55.324507, -7.065423]), array([ 53.338325, -45.334367, -18.998421]), array([ -2.605247, -55.324507, -7.065423]), array([-14.49484 , -20.328269, -27.617052]), array([ -2.605247, -55.324507, -7.065423]), array([ 23.765633, -21.600569, 45.97906 ]), array([ -2.605247, -55.324507, -7.065423]), array([ -8.613724, -59.8286 , -27.915417]), array([ -2.605247, -55.324507, -7.065423]), array([ 9.897209, -53.324915, -23.790822]), array([ -2.605247, -55.324507, -7.065423]), array([-31.897851, -30.247588, -33.028094]), array([ 6.489431, -11.670519, -30.851544]), array([ 6.489431, -11.670519, -30.851544]), array([ 6.489431, -11.670519, -30.851544]), array([-14.49484 , -20.328269, -27.617052]), array([ 6.489431, -11.670519, -30.851544]), array([ -8.613724, -59.8286 , -27.915417]), array([ 6.489431, -11.670519, -30.851544]), array([-23.429795, -51.025923, -39.842084]), array([ 6.489431, -11.670519, -30.851544]), array([ 18.541141, -24.947459, -60.138766]), array([ 6.489431, -11.670519, -30.851544]), array([-31.897851, -30.247588, -33.028094]), array([ 6.489431, -11.670519, -30.851544]), array([ 7.671771, 16.535084, -32.110169]), array([48.734149, -2.004701, 8.019123]), array([ -9.885591, -47.084818, -3.13936 ]), array([48.734149, -2.004701, 8.019123]), array([ 6.489431, -11.670519, -30.851544]), array([48.734149, -2.004701, 8.019123]), array([48.734149, -2.004701, 8.019123]), array([48.734149, -2.004701, 8.019123]), array([-12.1714 , -6.494719, 25.361539]), array([48.734149, -2.004701, 8.019123]), array([ 30.150795, -4.286333, -31.136279]), array([48.734149, -2.004701, 8.019123]), array([ 30.400644, -33.753689, 34.832572]), array([48.734149, -2.004701, 8.019123]), array([ 36.159029, -35.084312, -18.938829]), array([48.734149, -2.004701, 8.019123]), array([-12.502286, -24.875165, -20.872351]), array([48.734149, -2.004701, 8.019123]), array([ 23.242996, -42.031295, -22.110624]), array([48.734149, -2.004701, 8.019123]), array([ 9.822772, -44.114976, -18.760442]), array([48.734149, -2.004701, 8.019123]), array([ 8.003023, -32.833685, 38.712349]), array([48.734149, -2.004701, 8.019123]), array([-51.151034, -35.899675, 25.679908]), array([48.734149, -2.004701, 8.019123]), array([-43.927847, -8.226723, 27.584594]), array([48.734149, -2.004701, 8.019123]), array([-30.092058, -33.534852, 43.097159]), array([48.734149, -2.004701, 8.019123]), array([ 54.048553, -37.427609, 12.535183]), array([48.734149, -2.004701, 8.019123]), array([ 59.995574, -14.366518, 26.025739]), array([48.734149, -2.004701, 8.019123]), array([59.612735, -2.407101, -0.844581]), array([48.734149, -2.004701, 8.019123]), array([ 59.286775, -2.547348, -21.924281]), array([48.734149, -2.004701, 8.019123]), array([ 47.987255, -16.887697, -39.699154]), array([48.734149, -2.004701, 8.019123]), array([ 79.213202, -15.623481, -15.95848 ]), array([48.734149, -2.004701, 8.019123]), array([ 53.338325, -45.334367, -18.998421]), array([48.734149, -2.004701, 8.019123]), array([-14.49484 , -20.328269, -27.617052]), array([48.734149, -2.004701, 8.019123]), array([ 23.765633, -21.600569, 45.97906 ]), array([48.734149, -2.004701, 8.019123]), array([18.273358, -4.266078, 38.071488]), array([48.734149, -2.004701, 8.019123]), array([ 31.270899, -53.183604, -3.211336]), array([48.734149, -2.004701, 8.019123]), array([ 6.093876, -48.998009, -7.897234]), array([48.734149, -2.004701, 8.019123]), array([ 18.541141, -24.947459, -60.138766]), array([48.734149, -2.004701, 8.019123]), array([-31.897851, -30.247588, -33.028094]), array([48.734149, -2.004701, 8.019123]), array([-68.477071, -22.67342 , -1.619763]), array([48.734149, -2.004701, 8.019123]), array([39.281208, 4.486598, 10.191669]), array([-12.1714 , -6.494719, 25.361539]), array([ -9.885591, -47.084818, -3.13936 ]), array([-12.1714 , -6.494719, 25.361539]), array([ -2.605247, -55.324507, -7.065423]), array([-12.1714 , -6.494719, 25.361539]), array([48.734149, -2.004701, 8.019123]), array([-12.1714 , -6.494719, 25.361539]), array([-12.1714 , -6.494719, 25.361539]), array([-12.1714 , -6.494719, 25.361539]), array([-38.1525 , -13.054752, -5.607666]), array([-12.1714 , -6.494719, 25.361539]), array([ 30.150795, -4.286333, -31.136279]), array([-12.1714 , -6.494719, 25.361539]), array([ 30.400644, -33.753689, 34.832572]), array([-12.1714 , -6.494719, 25.361539]), array([ 9.822772, -44.114976, -18.760442]), array([-12.1714 , -6.494719, 25.361539]), array([ 8.003023, -32.833685, 38.712349]), array([-12.1714 , -6.494719, 25.361539]), array([-51.151034, -35.899675, 25.679908]), array([-12.1714 , -6.494719, 25.361539]), array([-43.927847, -8.226723, 27.584594]), array([-12.1714 , -6.494719, 25.361539]), array([-30.092058, -33.534852, 43.097159]), array([-12.1714 , -6.494719, 25.361539]), array([ 54.048553, -37.427609, 12.535183]), array([-12.1714 , -6.494719, 25.361539]), array([ 59.286775, -2.547348, -21.924281]), array([-12.1714 , -6.494719, 25.361539]), array([ 47.987255, -16.887697, -39.699154]), array([-12.1714 , -6.494719, 25.361539]), array([ 79.213202, -15.623481, -15.95848 ]), array([-12.1714 , -6.494719, 25.361539]), array([-14.49484 , -20.328269, -27.617052]), array([-12.1714 , -6.494719, 25.361539]), array([ -6.551567, -40.92204 , 34.412733]), array([-12.1714 , -6.494719, 25.361539]), array([ 6.093876, -48.998009, -7.897234]), array([-12.1714 , -6.494719, 25.361539]), array([ -8.613724, -59.8286 , -27.915417]), array([-12.1714 , -6.494719, 25.361539]), array([ 9.897209, -53.324915, -23.790822]), array([-12.1714 , -6.494719, 25.361539]), array([-31.897851, -30.247588, -33.028094]), array([-12.1714 , -6.494719, 25.361539]), array([-68.477071, -22.67342 , -1.619763]), array([-12.1714 , -6.494719, 25.361539]), array([-11.349411, 1.901778, 21.476145]), array([-38.1525 , -13.054752, -5.607666]), array([-12.1714 , -6.494719, 25.361539]), array([-38.1525 , -13.054752, -5.607666]), array([-22.152851, -56.734891, 16.852029]), array([-38.1525 , -13.054752, -5.607666]), array([-51.151034, -35.899675, 25.679908]), array([-38.1525 , -13.054752, -5.607666]), array([-43.927847, -8.226723, 27.584594]), array([-38.1525 , -13.054752, -5.607666]), array([-30.092058, -33.534852, 43.097159]), array([-38.1525 , -13.054752, -5.607666]), array([ 54.048553, -37.427609, 12.535183]), array([-38.1525 , -13.054752, -5.607666]), array([ 59.995574, -14.366518, 26.025739]), array([-38.1525 , -13.054752, -5.607666]), array([-33.137736, 10.478931, -5.472519]), array([ 30.150795, -4.286333, -31.136279]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 30.150795, -4.286333, -31.136279]), array([ -2.605247, -55.324507, -7.065423]), array([ 30.150795, -4.286333, -31.136279]), array([ 6.489431, -11.670519, -30.851544]), array([ 30.150795, -4.286333, -31.136279]), array([48.734149, -2.004701, 8.019123]), array([ 30.150795, -4.286333, -31.136279]), array([-12.1714 , -6.494719, 25.361539]), array([ 30.150795, -4.286333, -31.136279]), array([-38.1525 , -13.054752, -5.607666]), array([ 30.150795, -4.286333, -31.136279]), array([ 30.150795, -4.286333, -31.136279]), array([ 30.150795, -4.286333, -31.136279]), array([-12.502286, -24.875165, -20.872351]), array([ 30.150795, -4.286333, -31.136279]), array([ 23.242996, -42.031295, -22.110624]), array([ 30.150795, -4.286333, -31.136279]), array([ 9.822772, -44.114976, -18.760442]), array([ 30.150795, -4.286333, -31.136279]), array([-30.092058, -33.534852, 43.097159]), array([ 30.150795, -4.286333, -31.136279]), array([ 54.048553, -37.427609, 12.535183]), array([ 30.150795, -4.286333, -31.136279]), array([ 59.995574, -14.366518, 26.025739]), array([ 30.150795, -4.286333, -31.136279]), array([ 59.286775, -2.547348, -21.924281]), array([ 30.150795, -4.286333, -31.136279]), array([ 47.987255, -16.887697, -39.699154]), array([ 30.150795, -4.286333, -31.136279]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 30.150795, -4.286333, -31.136279]), array([ 53.338325, -45.334367, -18.998421]), array([ 30.150795, -4.286333, -31.136279]), array([-14.49484 , -20.328269, -27.617052]), array([ 30.150795, -4.286333, -31.136279]), array([ -8.613724, -59.8286 , -27.915417]), array([ 30.150795, -4.286333, -31.136279]), array([ 18.541141, -24.947459, -60.138766]), array([ 30.150795, -4.286333, -31.136279]), array([ 9.897209, -53.324915, -23.790822]), array([ 30.150795, -4.286333, -31.136279]), array([-31.897851, -30.247588, -33.028094]), array([ 30.150795, -4.286333, -31.136279]), array([-68.477071, -22.67342 , -1.619763]), array([ 30.150795, -4.286333, -31.136279]), array([ 28.220495, 8.508825, -31.633256]), array([ 30.400644, -33.753689, 34.832572]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 30.400644, -33.753689, 34.832572]), array([ -2.605247, -55.324507, -7.065423]), array([ 30.400644, -33.753689, 34.832572]), array([48.734149, -2.004701, 8.019123]), array([ 30.400644, -33.753689, 34.832572]), array([-12.1714 , -6.494719, 25.361539]), array([ 30.400644, -33.753689, 34.832572]), array([-38.1525 , -13.054752, -5.607666]), array([ 30.400644, -33.753689, 34.832572]), array([ 30.400644, -33.753689, 34.832572]), array([ 30.400644, -33.753689, 34.832572]), array([ 23.242996, -42.031295, -22.110624]), array([ 30.400644, -33.753689, 34.832572]), array([ 9.822772, -44.114976, -18.760442]), array([ 30.400644, -33.753689, 34.832572]), array([-22.152851, -56.734891, 16.852029]), array([ 30.400644, -33.753689, 34.832572]), array([-51.151034, -35.899675, 25.679908]), array([ 30.400644, -33.753689, 34.832572]), array([-43.927847, -8.226723, 27.584594]), array([ 30.400644, -33.753689, 34.832572]), array([-30.092058, -33.534852, 43.097159]), array([ 30.400644, -33.753689, 34.832572]), array([ 54.048553, -37.427609, 12.535183]), array([ 30.400644, -33.753689, 34.832572]), array([ 59.286775, -2.547348, -21.924281]), array([ 30.400644, -33.753689, 34.832572]), array([ 47.987255, -16.887697, -39.699154]), array([ 30.400644, -33.753689, 34.832572]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 30.400644, -33.753689, 34.832572]), array([ 53.338325, -45.334367, -18.998421]), array([ 30.400644, -33.753689, 34.832572]), array([-14.49484 , -20.328269, -27.617052]), array([ 30.400644, -33.753689, 34.832572]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 30.400644, -33.753689, 34.832572]), array([18.273358, -4.266078, 38.071488]), array([ 30.400644, -33.753689, 34.832572]), array([ -6.551567, -40.92204 , 34.412733]), array([ 30.400644, -33.753689, 34.832572]), array([ -8.613724, -59.8286 , -27.915417]), array([ 30.400644, -33.753689, 34.832572]), array([ 18.541141, -24.947459, -60.138766]), array([ 30.400644, -33.753689, 34.832572]), array([ 9.897209, -53.324915, -23.790822]), array([ 30.400644, -33.753689, 34.832572]), array([-68.477071, -22.67342 , -1.619763]), array([ 30.400644, -33.753689, 34.832572]), array([25.33148 , 38.587971, 32.110488]), array([ 36.159029, -35.084312, -18.938829]), array([48.734149, -2.004701, 8.019123]), array([ 36.159029, -35.084312, -18.938829]), array([-12.1714 , -6.494719, 25.361539]), array([ 36.159029, -35.084312, -18.938829]), array([ 36.159029, -35.084312, -18.938829]), array([ 36.159029, -35.084312, -18.938829]), array([ 23.242996, -42.031295, -22.110624]), array([ 36.159029, -35.084312, -18.938829]), array([ 9.822772, -44.114976, -18.760442]), array([ 36.159029, -35.084312, -18.938829]), array([-22.152851, -56.734891, 16.852029]), array([ 36.159029, -35.084312, -18.938829]), array([-51.151034, -35.899675, 25.679908]), array([ 36.159029, -35.084312, -18.938829]), array([ 54.048553, -37.427609, 12.535183]), array([ 36.159029, -35.084312, -18.938829]), array([ 47.987255, -16.887697, -39.699154]), array([ 36.159029, -35.084312, -18.938829]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 36.159029, -35.084312, -18.938829]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 36.159029, -35.084312, -18.938829]), array([18.273358, -4.266078, 38.071488]), array([ 36.159029, -35.084312, -18.938829]), array([ -6.551567, -40.92204 , 34.412733]), array([ 36.159029, -35.084312, -18.938829]), array([ 6.093876, -48.998009, -7.897234]), array([-12.502286, -24.875165, -20.872351]), array([-14.49484 , -20.328269, -27.617052]), array([ 23.242996, -42.031295, -22.110624]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 23.242996, -42.031295, -22.110624]), array([ -2.605247, -55.324507, -7.065423]), array([ 23.242996, -42.031295, -22.110624]), array([ 6.489431, -11.670519, -30.851544]), array([ 23.242996, -42.031295, -22.110624]), array([48.734149, -2.004701, 8.019123]), array([ 23.242996, -42.031295, -22.110624]), array([-12.1714 , -6.494719, 25.361539]), array([ 23.242996, -42.031295, -22.110624]), array([-38.1525 , -13.054752, -5.607666]), array([ 23.242996, -42.031295, -22.110624]), array([ 30.150795, -4.286333, -31.136279]), array([ 23.242996, -42.031295, -22.110624]), array([ 30.400644, -33.753689, 34.832572]), array([ 23.242996, -42.031295, -22.110624]), array([-12.502286, -24.875165, -20.872351]), array([ 23.242996, -42.031295, -22.110624]), array([ 23.242996, -42.031295, -22.110624]), array([ 23.242996, -42.031295, -22.110624]), array([ 9.822772, -44.114976, -18.760442]), array([ 23.242996, -42.031295, -22.110624]), array([-22.152851, -56.734891, 16.852029]), array([ 23.242996, -42.031295, -22.110624]), array([-51.151034, -35.899675, 25.679908]), array([ 23.242996, -42.031295, -22.110624]), array([-43.927847, -8.226723, 27.584594]), array([ 23.242996, -42.031295, -22.110624]), array([-30.092058, -33.534852, 43.097159]), array([ 23.242996, -42.031295, -22.110624]), array([ 54.048553, -37.427609, 12.535183]), array([ 23.242996, -42.031295, -22.110624]), array([ 59.995574, -14.366518, 26.025739]), array([ 23.242996, -42.031295, -22.110624]), array([ 59.286775, -2.547348, -21.924281]), array([ 23.242996, -42.031295, -22.110624]), array([ 47.987255, -16.887697, -39.699154]), array([ 23.242996, -42.031295, -22.110624]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 23.242996, -42.031295, -22.110624]), array([ 53.338325, -45.334367, -18.998421]), array([ 23.242996, -42.031295, -22.110624]), array([-14.49484 , -20.328269, -27.617052]), array([ 23.242996, -42.031295, -22.110624]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 23.242996, -42.031295, -22.110624]), array([ 31.270899, -53.183604, -3.211336]), array([ 23.242996, -42.031295, -22.110624]), array([ -6.551567, -40.92204 , 34.412733]), array([ 23.242996, -42.031295, -22.110624]), array([ 6.093876, -48.998009, -7.897234]), array([ 23.242996, -42.031295, -22.110624]), array([ 18.541141, -24.947459, -60.138766]), array([ 23.242996, -42.031295, -22.110624]), array([ 9.897209, -53.324915, -23.790822]), array([ 23.242996, -42.031295, -22.110624]), array([-31.897851, -30.247588, -33.028094]), array([ 23.242996, -42.031295, -22.110624]), array([-68.477071, -22.67342 , -1.619763]), array([ 9.822772, -44.114976, -18.760442]), array([ 6.489431, -11.670519, -30.851544]), array([ 9.822772, -44.114976, -18.760442]), array([48.734149, -2.004701, 8.019123]), array([ 9.822772, -44.114976, -18.760442]), array([-38.1525 , -13.054752, -5.607666]), array([ 9.822772, -44.114976, -18.760442]), array([ 30.150795, -4.286333, -31.136279]), array([ 9.822772, -44.114976, -18.760442]), array([-12.502286, -24.875165, -20.872351]), array([ 9.822772, -44.114976, -18.760442]), array([ 23.242996, -42.031295, -22.110624]), array([ 9.822772, -44.114976, -18.760442]), array([ 9.822772, -44.114976, -18.760442]), array([ 9.822772, -44.114976, -18.760442]), array([-22.152851, -56.734891, 16.852029]), array([ 9.822772, -44.114976, -18.760442]), array([-51.151034, -35.899675, 25.679908]), array([ 9.822772, -44.114976, -18.760442]), array([-43.927847, -8.226723, 27.584594]), array([ 9.822772, -44.114976, -18.760442]), array([-30.092058, -33.534852, 43.097159]), array([ 9.822772, -44.114976, -18.760442]), array([ 54.048553, -37.427609, 12.535183]), array([ 9.822772, -44.114976, -18.760442]), array([ 59.995574, -14.366518, 26.025739]), array([ 9.822772, -44.114976, -18.760442]), array([ 59.286775, -2.547348, -21.924281]), array([ 9.822772, -44.114976, -18.760442]), array([ 47.987255, -16.887697, -39.699154]), array([ 9.822772, -44.114976, -18.760442]), array([ 53.338325, -45.334367, -18.998421]), array([ 9.822772, -44.114976, -18.760442]), array([-14.49484 , -20.328269, -27.617052]), array([ 9.822772, -44.114976, -18.760442]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 9.822772, -44.114976, -18.760442]), array([ 31.270899, -53.183604, -3.211336]), array([ 9.822772, -44.114976, -18.760442]), array([ -6.551567, -40.92204 , 34.412733]), array([ 9.822772, -44.114976, -18.760442]), array([ 6.093876, -48.998009, -7.897234]), array([ 9.822772, -44.114976, -18.760442]), array([ 18.541141, -24.947459, -60.138766]), array([ 9.822772, -44.114976, -18.760442]), array([-31.897851, -30.247588, -33.028094]), array([ 9.822772, -44.114976, -18.760442]), array([-68.477071, -22.67342 , -1.619763]), array([ 8.003023, -32.833685, 38.712349]), array([48.734149, -2.004701, 8.019123]), array([ 8.003023, -32.833685, 38.712349]), array([-12.1714 , -6.494719, 25.361539]), array([ 8.003023, -32.833685, 38.712349]), array([ 23.242996, -42.031295, -22.110624]), array([ 8.003023, -32.833685, 38.712349]), array([ 9.822772, -44.114976, -18.760442]), array([ 8.003023, -32.833685, 38.712349]), array([ 8.003023, -32.833685, 38.712349]), array([ 8.003023, -32.833685, 38.712349]), array([-51.151034, -35.899675, 25.679908]), array([ 8.003023, -32.833685, 38.712349]), array([-43.927847, -8.226723, 27.584594]), array([ 8.003023, -32.833685, 38.712349]), array([-30.092058, -33.534852, 43.097159]), array([ 8.003023, -32.833685, 38.712349]), array([ 47.987255, -16.887697, -39.699154]), array([ 8.003023, -32.833685, 38.712349]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 8.003023, -32.833685, 38.712349]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 8.003023, -32.833685, 38.712349]), array([18.273358, -4.266078, 38.071488]), array([ 8.003023, -32.833685, 38.712349]), array([ 31.270899, -53.183604, -3.211336]), array([ 8.003023, -32.833685, 38.712349]), array([ -6.551567, -40.92204 , 34.412733]), array([ 8.003023, -32.833685, 38.712349]), array([ 6.093876, -48.998009, -7.897234]), array([ 8.003023, -32.833685, 38.712349]), array([ -8.613724, -59.8286 , -27.915417]), array([ 8.003023, -32.833685, 38.712349]), array([-68.477071, -22.67342 , -1.619763]), array([ 8.003023, -32.833685, 38.712349]), array([ 6.077868, 34.161497, 35.327252]), array([-22.152851, -56.734891, 16.852029]), array([ -2.605247, -55.324507, -7.065423]), array([-22.152851, -56.734891, 16.852029]), array([ 6.489431, -11.670519, -30.851544]), array([-22.152851, -56.734891, 16.852029]), array([48.734149, -2.004701, 8.019123]), array([-22.152851, -56.734891, 16.852029]), array([-12.1714 , -6.494719, 25.361539]), array([-22.152851, -56.734891, 16.852029]), array([-38.1525 , -13.054752, -5.607666]), array([-22.152851, -56.734891, 16.852029]), array([ 30.400644, -33.753689, 34.832572]), array([-22.152851, -56.734891, 16.852029]), array([ 36.159029, -35.084312, -18.938829]), array([-22.152851, -56.734891, 16.852029]), array([ 23.242996, -42.031295, -22.110624]), array([-22.152851, -56.734891, 16.852029]), array([ 9.822772, -44.114976, -18.760442]), array([-22.152851, -56.734891, 16.852029]), array([-22.152851, -56.734891, 16.852029]), array([-22.152851, -56.734891, 16.852029]), array([-51.151034, -35.899675, 25.679908]), array([-22.152851, -56.734891, 16.852029]), array([-43.927847, -8.226723, 27.584594]), array([-22.152851, -56.734891, 16.852029]), array([-30.092058, -33.534852, 43.097159]), array([-22.152851, -56.734891, 16.852029]), array([ 59.995574, -14.366518, 26.025739]), array([-22.152851, -56.734891, 16.852029]), array([ 53.338325, -45.334367, -18.998421]), array([-22.152851, -56.734891, 16.852029]), array([-14.49484 , -20.328269, -27.617052]), array([-22.152851, -56.734891, 16.852029]), array([ 23.765633, -21.600569, 45.97906 ]), array([-22.152851, -56.734891, 16.852029]), array([18.273358, -4.266078, 38.071488]), array([-22.152851, -56.734891, 16.852029]), array([ 31.270899, -53.183604, -3.211336]), array([-22.152851, -56.734891, 16.852029]), array([ -6.551567, -40.92204 , 34.412733]), array([-22.152851, -56.734891, 16.852029]), array([ 6.093876, -48.998009, -7.897234]), array([-22.152851, -56.734891, 16.852029]), array([ -8.613724, -59.8286 , -27.915417]), array([-22.152851, -56.734891, 16.852029]), array([-23.429795, -51.025923, -39.842084]), array([-22.152851, -56.734891, 16.852029]), array([ 18.541141, -24.947459, -60.138766]), array([-22.152851, -56.734891, 16.852029]), array([ 9.897209, -53.324915, -23.790822]), array([-22.152851, -56.734891, 16.852029]), array([-31.897851, -30.247588, -33.028094]), array([-22.152851, -56.734891, 16.852029]), array([-68.477071, -22.67342 , -1.619763]), array([-51.151034, -35.899675, 25.679908]), array([ -2.605247, -55.324507, -7.065423]), array([-51.151034, -35.899675, 25.679908]), array([ 6.489431, -11.670519, -30.851544]), array([-51.151034, -35.899675, 25.679908]), array([48.734149, -2.004701, 8.019123]), array([-51.151034, -35.899675, 25.679908]), array([-12.1714 , -6.494719, 25.361539]), array([-51.151034, -35.899675, 25.679908]), array([-38.1525 , -13.054752, -5.607666]), array([-51.151034, -35.899675, 25.679908]), array([ 30.400644, -33.753689, 34.832572]), array([-51.151034, -35.899675, 25.679908]), array([ 36.159029, -35.084312, -18.938829]), array([-51.151034, -35.899675, 25.679908]), array([ 23.242996, -42.031295, -22.110624]), array([-51.151034, -35.899675, 25.679908]), array([ 9.822772, -44.114976, -18.760442]), array([-51.151034, -35.899675, 25.679908]), array([ 8.003023, -32.833685, 38.712349]), array([-51.151034, -35.899675, 25.679908]), array([-22.152851, -56.734891, 16.852029]), array([-51.151034, -35.899675, 25.679908]), array([-51.151034, -35.899675, 25.679908]), array([-51.151034, -35.899675, 25.679908]), array([-43.927847, -8.226723, 27.584594]), array([-51.151034, -35.899675, 25.679908]), array([-30.092058, -33.534852, 43.097159]), array([-51.151034, -35.899675, 25.679908]), array([ 54.048553, -37.427609, 12.535183]), array([-51.151034, -35.899675, 25.679908]), array([ 59.995574, -14.366518, 26.025739]), array([-51.151034, -35.899675, 25.679908]), array([ 53.338325, -45.334367, -18.998421]), array([-51.151034, -35.899675, 25.679908]), array([-14.49484 , -20.328269, -27.617052]), array([-51.151034, -35.899675, 25.679908]), array([ 23.765633, -21.600569, 45.97906 ]), array([-51.151034, -35.899675, 25.679908]), array([18.273358, -4.266078, 38.071488]), array([-51.151034, -35.899675, 25.679908]), array([ 31.270899, -53.183604, -3.211336]), array([-51.151034, -35.899675, 25.679908]), array([ -6.551567, -40.92204 , 34.412733]), array([-51.151034, -35.899675, 25.679908]), array([ 6.093876, -48.998009, -7.897234]), array([-51.151034, -35.899675, 25.679908]), array([ -8.613724, -59.8286 , -27.915417]), array([-51.151034, -35.899675, 25.679908]), array([-23.429795, -51.025923, -39.842084]), array([-51.151034, -35.899675, 25.679908]), array([ 18.541141, -24.947459, -60.138766]), array([-51.151034, -35.899675, 25.679908]), array([ 9.897209, -53.324915, -23.790822]), array([-51.151034, -35.899675, 25.679908]), array([-31.897851, -30.247588, -33.028094]), array([-51.151034, -35.899675, 25.679908]), array([-70.449382, -12.870265, -11.423195]), array([-51.151034, -35.899675, 25.679908]), array([-68.477071, -22.67342 , -1.619763]), array([-43.927847, -8.226723, 27.584594]), array([48.734149, -2.004701, 8.019123]), array([-43.927847, -8.226723, 27.584594]), array([-12.1714 , -6.494719, 25.361539]), array([-43.927847, -8.226723, 27.584594]), array([-38.1525 , -13.054752, -5.607666]), array([-43.927847, -8.226723, 27.584594]), array([ 30.400644, -33.753689, 34.832572]), array([-43.927847, -8.226723, 27.584594]), array([ 23.242996, -42.031295, -22.110624]), array([-43.927847, -8.226723, 27.584594]), array([ 9.822772, -44.114976, -18.760442]), array([-43.927847, -8.226723, 27.584594]), array([ 8.003023, -32.833685, 38.712349]), array([-43.927847, -8.226723, 27.584594]), array([-22.152851, -56.734891, 16.852029]), array([-43.927847, -8.226723, 27.584594]), array([-51.151034, -35.899675, 25.679908]), array([-43.927847, -8.226723, 27.584594]), array([-43.927847, -8.226723, 27.584594]), array([-43.927847, -8.226723, 27.584594]), array([-30.092058, -33.534852, 43.097159]), array([-43.927847, -8.226723, 27.584594]), array([ 54.048553, -37.427609, 12.535183]), array([-43.927847, -8.226723, 27.584594]), array([ 59.995574, -14.366518, 26.025739]), array([-43.927847, -8.226723, 27.584594]), array([ 47.987255, -16.887697, -39.699154]), array([-43.927847, -8.226723, 27.584594]), array([ 53.338325, -45.334367, -18.998421]), array([-43.927847, -8.226723, 27.584594]), array([-14.49484 , -20.328269, -27.617052]), array([-43.927847, -8.226723, 27.584594]), array([ 23.765633, -21.600569, 45.97906 ]), array([-43.927847, -8.226723, 27.584594]), array([18.273358, -4.266078, 38.071488]), array([-43.927847, -8.226723, 27.584594]), array([ -8.613724, -59.8286 , -27.915417]), array([-43.927847, -8.226723, 27.584594]), array([ 9.897209, -53.324915, -23.790822]), array([-43.927847, -8.226723, 27.584594]), array([-31.897851, -30.247588, -33.028094]), array([-43.927847, -8.226723, 27.584594]), array([-68.477071, -22.67342 , -1.619763]), array([-43.927847, -8.226723, 27.584594]), array([-41.261623, 3.156065, 31.680186]), array([-30.092058, -33.534852, 43.097159]), array([ 6.489431, -11.670519, -30.851544]), array([-30.092058, -33.534852, 43.097159]), array([48.734149, -2.004701, 8.019123]), array([-30.092058, -33.534852, 43.097159]), array([-12.1714 , -6.494719, 25.361539]), array([-30.092058, -33.534852, 43.097159]), array([-38.1525 , -13.054752, -5.607666]), array([-30.092058, -33.534852, 43.097159]), array([ 30.150795, -4.286333, -31.136279]), array([-30.092058, -33.534852, 43.097159]), array([ 30.400644, -33.753689, 34.832572]), array([-30.092058, -33.534852, 43.097159]), array([ 23.242996, -42.031295, -22.110624]), array([-30.092058, -33.534852, 43.097159]), array([ 9.822772, -44.114976, -18.760442]), array([-30.092058, -33.534852, 43.097159]), array([ 8.003023, -32.833685, 38.712349]), array([-30.092058, -33.534852, 43.097159]), array([-22.152851, -56.734891, 16.852029]), array([-30.092058, -33.534852, 43.097159]), array([-51.151034, -35.899675, 25.679908]), array([-30.092058, -33.534852, 43.097159]), array([-43.927847, -8.226723, 27.584594]), array([-30.092058, -33.534852, 43.097159]), array([-30.092058, -33.534852, 43.097159]), array([-30.092058, -33.534852, 43.097159]), array([ 54.048553, -37.427609, 12.535183]), array([-30.092058, -33.534852, 43.097159]), array([ 59.995574, -14.366518, 26.025739]), array([-30.092058, -33.534852, 43.097159]), array([ 47.987255, -16.887697, -39.699154]), array([-30.092058, -33.534852, 43.097159]), array([ 79.213202, -15.623481, -15.95848 ]), array([-30.092058, -33.534852, 43.097159]), array([ 53.338325, -45.334367, -18.998421]), array([-30.092058, -33.534852, 43.097159]), array([-14.49484 , -20.328269, -27.617052]), array([-30.092058, -33.534852, 43.097159]), array([ 23.765633, -21.600569, 45.97906 ]), array([-30.092058, -33.534852, 43.097159]), array([18.273358, -4.266078, 38.071488]), array([-30.092058, -33.534852, 43.097159]), array([ 31.270899, -53.183604, -3.211336]), array([-30.092058, -33.534852, 43.097159]), array([ -6.551567, -40.92204 , 34.412733]), array([-30.092058, -33.534852, 43.097159]), array([ -8.613724, -59.8286 , -27.915417]), array([-30.092058, -33.534852, 43.097159]), array([-23.429795, -51.025923, -39.842084]), array([-30.092058, -33.534852, 43.097159]), array([ 9.897209, -53.324915, -23.790822]), array([-30.092058, -33.534852, 43.097159]), array([-31.897851, -30.247588, -33.028094]), array([-30.092058, -33.534852, 43.097159]), array([-70.449382, -12.870265, -11.423195]), array([-30.092058, -33.534852, 43.097159]), array([-68.477071, -22.67342 , -1.619763]), array([-30.092058, -33.534852, 43.097159]), array([-33.257143, 25.624607, 48.06079 ]), array([ 54.048553, -37.427609, 12.535183]), array([ -2.605247, -55.324507, -7.065423]), array([ 54.048553, -37.427609, 12.535183]), array([48.734149, -2.004701, 8.019123]), array([ 54.048553, -37.427609, 12.535183]), array([-12.1714 , -6.494719, 25.361539]), array([ 54.048553, -37.427609, 12.535183]), array([-38.1525 , -13.054752, -5.607666]), array([ 54.048553, -37.427609, 12.535183]), array([ 30.150795, -4.286333, -31.136279]), array([ 54.048553, -37.427609, 12.535183]), array([ 30.400644, -33.753689, 34.832572]), array([ 54.048553, -37.427609, 12.535183]), array([ 23.242996, -42.031295, -22.110624]), array([ 54.048553, -37.427609, 12.535183]), array([ 9.822772, -44.114976, -18.760442]), array([ 54.048553, -37.427609, 12.535183]), array([-22.152851, -56.734891, 16.852029]), array([ 54.048553, -37.427609, 12.535183]), array([-51.151034, -35.899675, 25.679908]), array([ 54.048553, -37.427609, 12.535183]), array([-43.927847, -8.226723, 27.584594]), array([ 54.048553, -37.427609, 12.535183]), array([-30.092058, -33.534852, 43.097159]), array([ 54.048553, -37.427609, 12.535183]), array([ 54.048553, -37.427609, 12.535183]), array([ 54.048553, -37.427609, 12.535183]), array([ 59.995574, -14.366518, 26.025739]), array([ 54.048553, -37.427609, 12.535183]), array([59.612735, -2.407101, -0.844581]), array([ 54.048553, -37.427609, 12.535183]), array([ 59.286775, -2.547348, -21.924281]), array([ 54.048553, -37.427609, 12.535183]), array([ 47.987255, -16.887697, -39.699154]), array([ 54.048553, -37.427609, 12.535183]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 54.048553, -37.427609, 12.535183]), array([ 53.338325, -45.334367, -18.998421]), array([ 54.048553, -37.427609, 12.535183]), array([-14.49484 , -20.328269, -27.617052]), array([ 54.048553, -37.427609, 12.535183]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 54.048553, -37.427609, 12.535183]), array([18.273358, -4.266078, 38.071488]), array([ 54.048553, -37.427609, 12.535183]), array([ 31.270899, -53.183604, -3.211336]), array([ 54.048553, -37.427609, 12.535183]), array([ -6.551567, -40.92204 , 34.412733]), array([ 54.048553, -37.427609, 12.535183]), array([ 6.093876, -48.998009, -7.897234]), array([ 54.048553, -37.427609, 12.535183]), array([ -8.613724, -59.8286 , -27.915417]), array([ 54.048553, -37.427609, 12.535183]), array([ 9.897209, -53.324915, -23.790822]), array([ 54.048553, -37.427609, 12.535183]), array([-68.477071, -22.67342 , -1.619763]), array([ 54.048553, -37.427609, 12.535183]), array([55.048683, 36.907935, 12.70272 ]), array([ 59.995574, -14.366518, 26.025739]), array([48.734149, -2.004701, 8.019123]), array([ 59.995574, -14.366518, 26.025739]), array([-12.1714 , -6.494719, 25.361539]), array([ 59.995574, -14.366518, 26.025739]), array([-38.1525 , -13.054752, -5.607666]), array([ 59.995574, -14.366518, 26.025739]), array([ 30.150795, -4.286333, -31.136279]), array([ 59.995574, -14.366518, 26.025739]), array([ 30.400644, -33.753689, 34.832572]), array([ 59.995574, -14.366518, 26.025739]), array([ 23.242996, -42.031295, -22.110624]), array([ 59.995574, -14.366518, 26.025739]), array([ 9.822772, -44.114976, -18.760442]), array([ 59.995574, -14.366518, 26.025739]), array([-22.152851, -56.734891, 16.852029]), array([ 59.995574, -14.366518, 26.025739]), array([-51.151034, -35.899675, 25.679908]), array([ 59.995574, -14.366518, 26.025739]), array([-30.092058, -33.534852, 43.097159]), array([ 59.995574, -14.366518, 26.025739]), array([ 54.048553, -37.427609, 12.535183]), array([ 59.995574, -14.366518, 26.025739]), array([ 59.995574, -14.366518, 26.025739]), array([ 59.995574, -14.366518, 26.025739]), array([59.612735, -2.407101, -0.844581]), array([ 59.995574, -14.366518, 26.025739]), array([ 59.286775, -2.547348, -21.924281]), array([ 59.995574, -14.366518, 26.025739]), array([ 47.987255, -16.887697, -39.699154]), array([ 59.995574, -14.366518, 26.025739]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 59.995574, -14.366518, 26.025739]), array([ 53.338325, -45.334367, -18.998421]), array([ 59.995574, -14.366518, 26.025739]), array([-14.49484 , -20.328269, -27.617052]), array([ 59.995574, -14.366518, 26.025739]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 59.995574, -14.366518, 26.025739]), array([18.273358, -4.266078, 38.071488]), array([ 59.995574, -14.366518, 26.025739]), array([ 31.270899, -53.183604, -3.211336]), array([ 59.995574, -14.366518, 26.025739]), array([ 6.093876, -48.998009, -7.897234]), array([ 59.995574, -14.366518, 26.025739]), array([ -8.613724, -59.8286 , -27.915417]), array([ 59.995574, -14.366518, 26.025739]), array([-23.429795, -51.025923, -39.842084]), array([ 59.995574, -14.366518, 26.025739]), array([ 18.541141, -24.947459, -60.138766]), array([ 59.995574, -14.366518, 26.025739]), array([ 9.897209, -53.324915, -23.790822]), array([ 59.995574, -14.366518, 26.025739]), array([-31.897851, -30.247588, -33.028094]), array([ 59.995574, -14.366518, 26.025739]), array([-68.477071, -22.67342 , -1.619763]), array([ 59.995574, -14.366518, 26.025739]), array([55.995996, 19.842407, 26.675811]), array([59.612735, -2.407101, -0.844581]), array([48.734149, -2.004701, 8.019123]), array([59.612735, -2.407101, -0.844581]), array([54.133613, 5.459295, 8.870544]), array([ 59.286775, -2.547348, -21.924281]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 59.286775, -2.547348, -21.924281]), array([ -2.605247, -55.324507, -7.065423]), array([ 59.286775, -2.547348, -21.924281]), array([ 6.489431, -11.670519, -30.851544]), array([ 59.286775, -2.547348, -21.924281]), array([48.734149, -2.004701, 8.019123]), array([ 59.286775, -2.547348, -21.924281]), array([-12.1714 , -6.494719, 25.361539]), array([ 59.286775, -2.547348, -21.924281]), array([-38.1525 , -13.054752, -5.607666]), array([ 59.286775, -2.547348, -21.924281]), array([ 30.150795, -4.286333, -31.136279]), array([ 59.286775, -2.547348, -21.924281]), array([-12.502286, -24.875165, -20.872351]), array([ 59.286775, -2.547348, -21.924281]), array([ 23.242996, -42.031295, -22.110624]), array([ 59.286775, -2.547348, -21.924281]), array([ 9.822772, -44.114976, -18.760442]), array([ 59.286775, -2.547348, -21.924281]), array([-30.092058, -33.534852, 43.097159]), array([ 59.286775, -2.547348, -21.924281]), array([ 54.048553, -37.427609, 12.535183]), array([ 59.286775, -2.547348, -21.924281]), array([ 59.995574, -14.366518, 26.025739]), array([ 59.286775, -2.547348, -21.924281]), array([ 59.286775, -2.547348, -21.924281]), array([ 59.286775, -2.547348, -21.924281]), array([ 47.987255, -16.887697, -39.699154]), array([ 59.286775, -2.547348, -21.924281]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 59.286775, -2.547348, -21.924281]), array([-14.49484 , -20.328269, -27.617052]), array([ 59.286775, -2.547348, -21.924281]), array([ -8.613724, -59.8286 , -27.915417]), array([ 59.286775, -2.547348, -21.924281]), array([ 18.541141, -24.947459, -60.138766]), array([ 59.286775, -2.547348, -21.924281]), array([ 9.897209, -53.324915, -23.790822]), array([ 59.286775, -2.547348, -21.924281]), array([-31.897851, -30.247588, -33.028094]), array([ 59.286775, -2.547348, -21.924281]), array([-68.477071, -22.67342 , -1.619763]), array([ 59.286775, -2.547348, -21.924281]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 47.987255, -16.887697, -39.699154]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 47.987255, -16.887697, -39.699154]), array([ -2.605247, -55.324507, -7.065423]), array([ 47.987255, -16.887697, -39.699154]), array([ 6.489431, -11.670519, -30.851544]), array([ 47.987255, -16.887697, -39.699154]), array([48.734149, -2.004701, 8.019123]), array([ 47.987255, -16.887697, -39.699154]), array([-12.1714 , -6.494719, 25.361539]), array([ 47.987255, -16.887697, -39.699154]), array([-38.1525 , -13.054752, -5.607666]), array([ 47.987255, -16.887697, -39.699154]), array([ 30.150795, -4.286333, -31.136279]), array([ 47.987255, -16.887697, -39.699154]), array([ 30.400644, -33.753689, 34.832572]), array([ 47.987255, -16.887697, -39.699154]), array([-12.502286, -24.875165, -20.872351]), array([ 47.987255, -16.887697, -39.699154]), array([ 23.242996, -42.031295, -22.110624]), array([ 47.987255, -16.887697, -39.699154]), array([ 9.822772, -44.114976, -18.760442]), array([ 47.987255, -16.887697, -39.699154]), array([-22.152851, -56.734891, 16.852029]), array([ 47.987255, -16.887697, -39.699154]), array([-51.151034, -35.899675, 25.679908]), array([ 47.987255, -16.887697, -39.699154]), array([-30.092058, -33.534852, 43.097159]), array([ 47.987255, -16.887697, -39.699154]), array([ 54.048553, -37.427609, 12.535183]), array([ 47.987255, -16.887697, -39.699154]), array([ 59.995574, -14.366518, 26.025739]), array([ 47.987255, -16.887697, -39.699154]), array([ 59.286775, -2.547348, -21.924281]), array([ 47.987255, -16.887697, -39.699154]), array([ 47.987255, -16.887697, -39.699154]), array([ 47.987255, -16.887697, -39.699154]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 47.987255, -16.887697, -39.699154]), array([ 53.338325, -45.334367, -18.998421]), array([ 47.987255, -16.887697, -39.699154]), array([-14.49484 , -20.328269, -27.617052]), array([ 47.987255, -16.887697, -39.699154]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 47.987255, -16.887697, -39.699154]), array([18.273358, -4.266078, 38.071488]), array([ 47.987255, -16.887697, -39.699154]), array([ 31.270899, -53.183604, -3.211336]), array([ 47.987255, -16.887697, -39.699154]), array([ -6.551567, -40.92204 , 34.412733]), array([ 47.987255, -16.887697, -39.699154]), array([ 6.093876, -48.998009, -7.897234]), array([ 47.987255, -16.887697, -39.699154]), array([ -8.613724, -59.8286 , -27.915417]), array([ 47.987255, -16.887697, -39.699154]), array([-23.429795, -51.025923, -39.842084]), array([ 47.987255, -16.887697, -39.699154]), array([ 18.541141, -24.947459, -60.138766]), array([ 47.987255, -16.887697, -39.699154]), array([ 9.897209, -53.324915, -23.790822]), array([ 47.987255, -16.887697, -39.699154]), array([-31.897851, -30.247588, -33.028094]), array([ 47.987255, -16.887697, -39.699154]), array([-68.477071, -22.67342 , -1.619763]), array([ 79.213202, -15.623481, -15.95848 ]), array([ -2.605247, -55.324507, -7.065423]), array([ 79.213202, -15.623481, -15.95848 ]), array([48.734149, -2.004701, 8.019123]), array([ 79.213202, -15.623481, -15.95848 ]), array([-38.1525 , -13.054752, -5.607666]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 30.150795, -4.286333, -31.136279]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 23.242996, -42.031295, -22.110624]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 9.822772, -44.114976, -18.760442]), array([ 79.213202, -15.623481, -15.95848 ]), array([-22.152851, -56.734891, 16.852029]), array([ 79.213202, -15.623481, -15.95848 ]), array([-51.151034, -35.899675, 25.679908]), array([ 79.213202, -15.623481, -15.95848 ]), array([-30.092058, -33.534852, 43.097159]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 54.048553, -37.427609, 12.535183]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 59.995574, -14.366518, 26.025739]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 59.286775, -2.547348, -21.924281]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 47.987255, -16.887697, -39.699154]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 53.338325, -45.334367, -18.998421]), array([ 79.213202, -15.623481, -15.95848 ]), array([-14.49484 , -20.328269, -27.617052]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 79.213202, -15.623481, -15.95848 ]), array([18.273358, -4.266078, 38.071488]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 31.270899, -53.183604, -3.211336]), array([ 79.213202, -15.623481, -15.95848 ]), array([ -6.551567, -40.92204 , 34.412733]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 6.093876, -48.998009, -7.897234]), array([ 79.213202, -15.623481, -15.95848 ]), array([ -8.613724, -59.8286 , -27.915417]), array([ 79.213202, -15.623481, -15.95848 ]), array([-23.429795, -51.025923, -39.842084]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 18.541141, -24.947459, -60.138766]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 9.897209, -53.324915, -23.790822]), array([ 79.213202, -15.623481, -15.95848 ]), array([-31.897851, -30.247588, -33.028094]), array([ 79.213202, -15.623481, -15.95848 ]), array([-68.477071, -22.67342 , -1.619763]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 77.946877, 20.707769, -18.710748]), array([ 53.338325, -45.334367, -18.998421]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 53.338325, -45.334367, -18.998421]), array([ -2.605247, -55.324507, -7.065423]), array([ 53.338325, -45.334367, -18.998421]), array([48.734149, -2.004701, 8.019123]), array([ 53.338325, -45.334367, -18.998421]), array([-12.1714 , -6.494719, 25.361539]), array([ 53.338325, -45.334367, -18.998421]), array([ 30.150795, -4.286333, -31.136279]), array([ 53.338325, -45.334367, -18.998421]), array([ 30.400644, -33.753689, 34.832572]), array([ 53.338325, -45.334367, -18.998421]), array([ 23.242996, -42.031295, -22.110624]), array([ 53.338325, -45.334367, -18.998421]), array([ 9.822772, -44.114976, -18.760442]), array([ 53.338325, -45.334367, -18.998421]), array([-22.152851, -56.734891, 16.852029]), array([ 53.338325, -45.334367, -18.998421]), array([-51.151034, -35.899675, 25.679908]), array([ 53.338325, -45.334367, -18.998421]), array([-43.927847, -8.226723, 27.584594]), array([ 53.338325, -45.334367, -18.998421]), array([-30.092058, -33.534852, 43.097159]), array([ 53.338325, -45.334367, -18.998421]), array([ 54.048553, -37.427609, 12.535183]), array([ 53.338325, -45.334367, -18.998421]), array([ 59.995574, -14.366518, 26.025739]), array([ 53.338325, -45.334367, -18.998421]), array([ 59.286775, -2.547348, -21.924281]), array([ 53.338325, -45.334367, -18.998421]), array([ 47.987255, -16.887697, -39.699154]), array([ 53.338325, -45.334367, -18.998421]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 53.338325, -45.334367, -18.998421]), array([ 53.338325, -45.334367, -18.998421]), array([ 53.338325, -45.334367, -18.998421]), array([-14.49484 , -20.328269, -27.617052]), array([ 53.338325, -45.334367, -18.998421]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 53.338325, -45.334367, -18.998421]), array([18.273358, -4.266078, 38.071488]), array([ 53.338325, -45.334367, -18.998421]), array([ 31.270899, -53.183604, -3.211336]), array([ 53.338325, -45.334367, -18.998421]), array([ 6.093876, -48.998009, -7.897234]), array([ 53.338325, -45.334367, -18.998421]), array([ -8.613724, -59.8286 , -27.915417]), array([ 53.338325, -45.334367, -18.998421]), array([-23.429795, -51.025923, -39.842084]), array([ 53.338325, -45.334367, -18.998421]), array([ 18.541141, -24.947459, -60.138766]), array([ 53.338325, -45.334367, -18.998421]), array([ 9.897209, -53.324915, -23.790822]), array([ 53.338325, -45.334367, -18.998421]), array([-31.897851, -30.247588, -33.028094]), array([ 53.338325, -45.334367, -18.998421]), array([-68.477071, -22.67342 , -1.619763]), array([-14.49484 , -20.328269, -27.617052]), array([ -9.885591, -47.084818, -3.13936 ]), array([-14.49484 , -20.328269, -27.617052]), array([ -2.605247, -55.324507, -7.065423]), array([-14.49484 , -20.328269, -27.617052]), array([ 6.489431, -11.670519, -30.851544]), array([-14.49484 , -20.328269, -27.617052]), array([48.734149, -2.004701, 8.019123]), array([-14.49484 , -20.328269, -27.617052]), array([-12.1714 , -6.494719, 25.361539]), array([-14.49484 , -20.328269, -27.617052]), array([-38.1525 , -13.054752, -5.607666]), array([-14.49484 , -20.328269, -27.617052]), array([ 30.150795, -4.286333, -31.136279]), array([-14.49484 , -20.328269, -27.617052]), array([ 30.400644, -33.753689, 34.832572]), array([-14.49484 , -20.328269, -27.617052]), array([-12.502286, -24.875165, -20.872351]), array([-14.49484 , -20.328269, -27.617052]), array([ 23.242996, -42.031295, -22.110624]), array([-14.49484 , -20.328269, -27.617052]), array([ 9.822772, -44.114976, -18.760442]), array([-14.49484 , -20.328269, -27.617052]), array([-22.152851, -56.734891, 16.852029]), array([-14.49484 , -20.328269, -27.617052]), array([-51.151034, -35.899675, 25.679908]), array([-14.49484 , -20.328269, -27.617052]), array([-30.092058, -33.534852, 43.097159]), array([-14.49484 , -20.328269, -27.617052]), array([ 54.048553, -37.427609, 12.535183]), array([-14.49484 , -20.328269, -27.617052]), array([ 59.995574, -14.366518, 26.025739]), array([-14.49484 , -20.328269, -27.617052]), array([ 59.286775, -2.547348, -21.924281]), array([-14.49484 , -20.328269, -27.617052]), array([ 47.987255, -16.887697, -39.699154]), array([-14.49484 , -20.328269, -27.617052]), array([ 79.213202, -15.623481, -15.95848 ]), array([-14.49484 , -20.328269, -27.617052]), array([ 53.338325, -45.334367, -18.998421]), array([-14.49484 , -20.328269, -27.617052]), array([-14.49484 , -20.328269, -27.617052]), array([-14.49484 , -20.328269, -27.617052]), array([ 6.093876, -48.998009, -7.897234]), array([-14.49484 , -20.328269, -27.617052]), array([ -8.613724, -59.8286 , -27.915417]), array([-14.49484 , -20.328269, -27.617052]), array([-23.429795, -51.025923, -39.842084]), array([-14.49484 , -20.328269, -27.617052]), array([ 18.541141, -24.947459, -60.138766]), array([-14.49484 , -20.328269, -27.617052]), array([ 9.897209, -53.324915, -23.790822]), array([-14.49484 , -20.328269, -27.617052]), array([-31.897851, -30.247588, -33.028094]), array([-14.49484 , -20.328269, -27.617052]), array([-68.477071, -22.67342 , -1.619763]), array([ 23.765633, -21.600569, 45.97906 ]), array([ -2.605247, -55.324507, -7.065423]), array([ 23.765633, -21.600569, 45.97906 ]), array([48.734149, -2.004701, 8.019123]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 30.400644, -33.753689, 34.832572]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 23.242996, -42.031295, -22.110624]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 9.822772, -44.114976, -18.760442]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 8.003023, -32.833685, 38.712349]), array([ 23.765633, -21.600569, 45.97906 ]), array([-22.152851, -56.734891, 16.852029]), array([ 23.765633, -21.600569, 45.97906 ]), array([-51.151034, -35.899675, 25.679908]), array([ 23.765633, -21.600569, 45.97906 ]), array([-43.927847, -8.226723, 27.584594]), array([ 23.765633, -21.600569, 45.97906 ]), array([-30.092058, -33.534852, 43.097159]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 54.048553, -37.427609, 12.535183]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 59.995574, -14.366518, 26.025739]), array([ 23.765633, -21.600569, 45.97906 ]), array([59.612735, -2.407101, -0.844581]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 47.987255, -16.887697, -39.699154]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 53.338325, -45.334367, -18.998421]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 23.765633, -21.600569, 45.97906 ]), array([18.273358, -4.266078, 38.071488]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 31.270899, -53.183604, -3.211336]), array([ 23.765633, -21.600569, 45.97906 ]), array([ -6.551567, -40.92204 , 34.412733]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 6.093876, -48.998009, -7.897234]), array([ 23.765633, -21.600569, 45.97906 ]), array([ -8.613724, -59.8286 , -27.915417]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 9.897209, -53.324915, -23.790822]), array([ 23.765633, -21.600569, 45.97906 ]), array([-68.477071, -22.67342 , -1.619763]), array([ 23.765633, -21.600569, 45.97906 ]), array([21.399859, 21.199044, 48.314342]), array([18.273358, -4.266078, 38.071488]), array([ -2.605247, -55.324507, -7.065423]), array([18.273358, -4.266078, 38.071488]), array([48.734149, -2.004701, 8.019123]), array([18.273358, -4.266078, 38.071488]), array([ 30.400644, -33.753689, 34.832572]), array([18.273358, -4.266078, 38.071488]), array([ 23.242996, -42.031295, -22.110624]), array([18.273358, -4.266078, 38.071488]), array([ 9.822772, -44.114976, -18.760442]), array([18.273358, -4.266078, 38.071488]), array([ 8.003023, -32.833685, 38.712349]), array([18.273358, -4.266078, 38.071488]), array([-22.152851, -56.734891, 16.852029]), array([18.273358, -4.266078, 38.071488]), array([-51.151034, -35.899675, 25.679908]), array([18.273358, -4.266078, 38.071488]), array([-43.927847, -8.226723, 27.584594]), array([18.273358, -4.266078, 38.071488]), array([-30.092058, -33.534852, 43.097159]), array([18.273358, -4.266078, 38.071488]), array([ 54.048553, -37.427609, 12.535183]), array([18.273358, -4.266078, 38.071488]), array([ 59.995574, -14.366518, 26.025739]), array([18.273358, -4.266078, 38.071488]), array([59.612735, -2.407101, -0.844581]), array([18.273358, -4.266078, 38.071488]), array([ 47.987255, -16.887697, -39.699154]), array([18.273358, -4.266078, 38.071488]), array([ 53.338325, -45.334367, -18.998421]), array([18.273358, -4.266078, 38.071488]), array([ 23.765633, -21.600569, 45.97906 ]), array([18.273358, -4.266078, 38.071488]), array([18.273358, -4.266078, 38.071488]), array([18.273358, -4.266078, 38.071488]), array([ 31.270899, -53.183604, -3.211336]), array([18.273358, -4.266078, 38.071488]), array([ -6.551567, -40.92204 , 34.412733]), array([18.273358, -4.266078, 38.071488]), array([ 6.093876, -48.998009, -7.897234]), array([18.273358, -4.266078, 38.071488]), array([ -8.613724, -59.8286 , -27.915417]), array([18.273358, -4.266078, 38.071488]), array([ 9.897209, -53.324915, -23.790822]), array([18.273358, -4.266078, 38.071488]), array([-68.477071, -22.67342 , -1.619763]), array([18.273358, -4.266078, 38.071488]), array([16.534061, 2.192421, 40.922159]), array([ 31.270899, -53.183604, -3.211336]), array([48.734149, -2.004701, 8.019123]), array([ 31.270899, -53.183604, -3.211336]), array([ 23.242996, -42.031295, -22.110624]), array([ 31.270899, -53.183604, -3.211336]), array([ 9.822772, -44.114976, -18.760442]), array([ 31.270899, -53.183604, -3.211336]), array([ 8.003023, -32.833685, 38.712349]), array([ 31.270899, -53.183604, -3.211336]), array([-22.152851, -56.734891, 16.852029]), array([ 31.270899, -53.183604, -3.211336]), array([-51.151034, -35.899675, 25.679908]), array([ 31.270899, -53.183604, -3.211336]), array([-43.927847, -8.226723, 27.584594]), array([ 31.270899, -53.183604, -3.211336]), array([-30.092058, -33.534852, 43.097159]), array([ 31.270899, -53.183604, -3.211336]), array([ 54.048553, -37.427609, 12.535183]), array([ 31.270899, -53.183604, -3.211336]), array([ 59.995574, -14.366518, 26.025739]), array([ 31.270899, -53.183604, -3.211336]), array([ 47.987255, -16.887697, -39.699154]), array([ 31.270899, -53.183604, -3.211336]), array([-14.49484 , -20.328269, -27.617052]), array([ 31.270899, -53.183604, -3.211336]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 31.270899, -53.183604, -3.211336]), array([18.273358, -4.266078, 38.071488]), array([ 31.270899, -53.183604, -3.211336]), array([ 31.270899, -53.183604, -3.211336]), array([ 31.270899, -53.183604, -3.211336]), array([ -6.551567, -40.92204 , 34.412733]), array([ 31.270899, -53.183604, -3.211336]), array([ 6.093876, -48.998009, -7.897234]), array([ 31.270899, -53.183604, -3.211336]), array([ -8.613724, -59.8286 , -27.915417]), array([ 31.270899, -53.183604, -3.211336]), array([-68.477071, -22.67342 , -1.619763]), array([ -6.551567, -40.92204 , 34.412733]), array([ 36.159029, -35.084312, -18.938829]), array([ -6.551567, -40.92204 , 34.412733]), array([ 23.242996, -42.031295, -22.110624]), array([ -6.551567, -40.92204 , 34.412733]), array([ 9.822772, -44.114976, -18.760442]), array([ -6.551567, -40.92204 , 34.412733]), array([ 8.003023, -32.833685, 38.712349]), array([ -6.551567, -40.92204 , 34.412733]), array([-22.152851, -56.734891, 16.852029]), array([ -6.551567, -40.92204 , 34.412733]), array([-51.151034, -35.899675, 25.679908]), array([ -6.551567, -40.92204 , 34.412733]), array([-30.092058, -33.534852, 43.097159]), array([ -6.551567, -40.92204 , 34.412733]), array([ 54.048553, -37.427609, 12.535183]), array([ -6.551567, -40.92204 , 34.412733]), array([ 23.765633, -21.600569, 45.97906 ]), array([ -6.551567, -40.92204 , 34.412733]), array([18.273358, -4.266078, 38.071488]), array([ -6.551567, -40.92204 , 34.412733]), array([ -6.551567, -40.92204 , 34.412733]), array([ -6.551567, -40.92204 , 34.412733]), array([ 6.093876, -48.998009, -7.897234]), array([ -6.551567, -40.92204 , 34.412733]), array([-10.91018 , 34.40576 , 39.609319]), array([ 6.093876, -48.998009, -7.897234]), array([48.734149, -2.004701, 8.019123]), array([ 6.093876, -48.998009, -7.897234]), array([ 36.159029, -35.084312, -18.938829]), array([ 6.093876, -48.998009, -7.897234]), array([ 9.822772, -44.114976, -18.760442]), array([ 6.093876, -48.998009, -7.897234]), array([ 8.003023, -32.833685, 38.712349]), array([ 6.093876, -48.998009, -7.897234]), array([-22.152851, -56.734891, 16.852029]), array([ 6.093876, -48.998009, -7.897234]), array([-51.151034, -35.899675, 25.679908]), array([ 6.093876, -48.998009, -7.897234]), array([ 54.048553, -37.427609, 12.535183]), array([ 6.093876, -48.998009, -7.897234]), array([ 31.270899, -53.183604, -3.211336]), array([ 6.093876, -48.998009, -7.897234]), array([ -6.551567, -40.92204 , 34.412733]), array([ 6.093876, -48.998009, -7.897234]), array([ 6.093876, -48.998009, -7.897234]), array([ -8.613724, -59.8286 , -27.915417]), array([ -9.885591, -47.084818, -3.13936 ]), array([ -8.613724, -59.8286 , -27.915417]), array([ -2.605247, -55.324507, -7.065423]), array([ -8.613724, -59.8286 , -27.915417]), array([ 6.489431, -11.670519, -30.851544]), array([ -8.613724, -59.8286 , -27.915417]), array([48.734149, -2.004701, 8.019123]), array([ -8.613724, -59.8286 , -27.915417]), array([-12.1714 , -6.494719, 25.361539]), array([ -8.613724, -59.8286 , -27.915417]), array([ 30.150795, -4.286333, -31.136279]), array([ -8.613724, -59.8286 , -27.915417]), array([ 30.400644, -33.753689, 34.832572]), array([ -8.613724, -59.8286 , -27.915417]), array([ 23.242996, -42.031295, -22.110624]), array([ -8.613724, -59.8286 , -27.915417]), array([ 9.822772, -44.114976, -18.760442]), array([ -8.613724, -59.8286 , -27.915417]), array([-22.152851, -56.734891, 16.852029]), array([ -8.613724, -59.8286 , -27.915417]), array([-51.151034, -35.899675, 25.679908]), array([ -8.613724, -59.8286 , -27.915417]), array([-43.927847, -8.226723, 27.584594]), array([ -8.613724, -59.8286 , -27.915417]), array([-30.092058, -33.534852, 43.097159]), array([ -8.613724, -59.8286 , -27.915417]), array([ 54.048553, -37.427609, 12.535183]), array([ -8.613724, -59.8286 , -27.915417]), array([ 59.995574, -14.366518, 26.025739]), array([ -8.613724, -59.8286 , -27.915417]), array([ 59.286775, -2.547348, -21.924281]), array([ -8.613724, -59.8286 , -27.915417]), array([ 47.987255, -16.887697, -39.699154]), array([ -8.613724, -59.8286 , -27.915417]), array([ 79.213202, -15.623481, -15.95848 ]), array([ -8.613724, -59.8286 , -27.915417]), array([-14.49484 , -20.328269, -27.617052]), array([ -8.613724, -59.8286 , -27.915417]), array([ -8.613724, -59.8286 , -27.915417]), array([ -8.613724, -59.8286 , -27.915417]), array([-23.429795, -51.025923, -39.842084]), array([ -8.613724, -59.8286 , -27.915417]), array([ 18.541141, -24.947459, -60.138766]), array([ -8.613724, -59.8286 , -27.915417]), array([ 9.897209, -53.324915, -23.790822]), array([ -8.613724, -59.8286 , -27.915417]), array([-31.897851, -30.247588, -33.028094]), array([ -8.613724, -59.8286 , -27.915417]), array([-70.449382, -12.870265, -11.423195]), array([ -8.613724, -59.8286 , -27.915417]), array([-68.477071, -22.67342 , -1.619763]), array([-23.429795, -51.025923, -39.842084]), array([ 6.489431, -11.670519, -30.851544]), array([-23.429795, -51.025923, -39.842084]), array([ 30.400644, -33.753689, 34.832572]), array([-23.429795, -51.025923, -39.842084]), array([ 9.822772, -44.114976, -18.760442]), array([-23.429795, -51.025923, -39.842084]), array([-22.152851, -56.734891, 16.852029]), array([-23.429795, -51.025923, -39.842084]), array([-51.151034, -35.899675, 25.679908]), array([-23.429795, -51.025923, -39.842084]), array([-30.092058, -33.534852, 43.097159]), array([-23.429795, -51.025923, -39.842084]), array([ 47.987255, -16.887697, -39.699154]), array([-23.429795, -51.025923, -39.842084]), array([ 53.338325, -45.334367, -18.998421]), array([-23.429795, -51.025923, -39.842084]), array([-14.49484 , -20.328269, -27.617052]), array([-23.429795, -51.025923, -39.842084]), array([ -8.613724, -59.8286 , -27.915417]), array([-23.429795, -51.025923, -39.842084]), array([-23.429795, -51.025923, -39.842084]), array([-23.429795, -51.025923, -39.842084]), array([ 18.541141, -24.947459, -60.138766]), array([-23.429795, -51.025923, -39.842084]), array([ 9.897209, -53.324915, -23.790822]), array([-23.429795, -51.025923, -39.842084]), array([-31.897851, -30.247588, -33.028094]), array([-23.429795, -51.025923, -39.842084]), array([-68.477071, -22.67342 , -1.619763]), array([ 18.541141, -24.947459, -60.138766]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 18.541141, -24.947459, -60.138766]), array([ -2.605247, -55.324507, -7.065423]), array([ 18.541141, -24.947459, -60.138766]), array([ 6.489431, -11.670519, -30.851544]), array([ 18.541141, -24.947459, -60.138766]), array([48.734149, -2.004701, 8.019123]), array([ 18.541141, -24.947459, -60.138766]), array([-38.1525 , -13.054752, -5.607666]), array([ 18.541141, -24.947459, -60.138766]), array([ 30.150795, -4.286333, -31.136279]), array([ 18.541141, -24.947459, -60.138766]), array([ 23.242996, -42.031295, -22.110624]), array([ 18.541141, -24.947459, -60.138766]), array([ 9.822772, -44.114976, -18.760442]), array([ 18.541141, -24.947459, -60.138766]), array([-22.152851, -56.734891, 16.852029]), array([ 18.541141, -24.947459, -60.138766]), array([ 54.048553, -37.427609, 12.535183]), array([ 18.541141, -24.947459, -60.138766]), array([ 59.286775, -2.547348, -21.924281]), array([ 18.541141, -24.947459, -60.138766]), array([ 47.987255, -16.887697, -39.699154]), array([ 18.541141, -24.947459, -60.138766]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 18.541141, -24.947459, -60.138766]), array([ 53.338325, -45.334367, -18.998421]), array([ 18.541141, -24.947459, -60.138766]), array([-14.49484 , -20.328269, -27.617052]), array([ 18.541141, -24.947459, -60.138766]), array([ -8.613724, -59.8286 , -27.915417]), array([ 18.541141, -24.947459, -60.138766]), array([-23.429795, -51.025923, -39.842084]), array([ 18.541141, -24.947459, -60.138766]), array([ 9.897209, -53.324915, -23.790822]), array([ 18.541141, -24.947459, -60.138766]), array([-31.897851, -30.247588, -33.028094]), array([ 9.897209, -53.324915, -23.790822]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 9.897209, -53.324915, -23.790822]), array([ -2.605247, -55.324507, -7.065423]), array([ 9.897209, -53.324915, -23.790822]), array([ 6.489431, -11.670519, -30.851544]), array([ 9.897209, -53.324915, -23.790822]), array([-12.1714 , -6.494719, 25.361539]), array([ 9.897209, -53.324915, -23.790822]), array([ 30.400644, -33.753689, 34.832572]), array([ 9.897209, -53.324915, -23.790822]), array([ 23.242996, -42.031295, -22.110624]), array([ 9.897209, -53.324915, -23.790822]), array([-22.152851, -56.734891, 16.852029]), array([ 9.897209, -53.324915, -23.790822]), array([-51.151034, -35.899675, 25.679908]), array([ 9.897209, -53.324915, -23.790822]), array([-30.092058, -33.534852, 43.097159]), array([ 9.897209, -53.324915, -23.790822]), array([ 54.048553, -37.427609, 12.535183]), array([ 9.897209, -53.324915, -23.790822]), array([ 59.995574, -14.366518, 26.025739]), array([ 9.897209, -53.324915, -23.790822]), array([ 47.987255, -16.887697, -39.699154]), array([ 9.897209, -53.324915, -23.790822]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 9.897209, -53.324915, -23.790822]), array([ 53.338325, -45.334367, -18.998421]), array([ 9.897209, -53.324915, -23.790822]), array([-14.49484 , -20.328269, -27.617052]), array([ 9.897209, -53.324915, -23.790822]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 9.897209, -53.324915, -23.790822]), array([ -8.613724, -59.8286 , -27.915417]), array([ 9.897209, -53.324915, -23.790822]), array([-23.429795, -51.025923, -39.842084]), array([ 9.897209, -53.324915, -23.790822]), array([ 18.541141, -24.947459, -60.138766]), array([ 9.897209, -53.324915, -23.790822]), array([ 9.897209, -53.324915, -23.790822]), array([ 9.897209, -53.324915, -23.790822]), array([-31.897851, -30.247588, -33.028094]), array([ 9.897209, -53.324915, -23.790822]), array([-68.477071, -22.67342 , -1.619763]), array([-31.897851, -30.247588, -33.028094]), array([ -9.885591, -47.084818, -3.13936 ]), array([-31.897851, -30.247588, -33.028094]), array([ -2.605247, -55.324507, -7.065423]), array([-31.897851, -30.247588, -33.028094]), array([ 6.489431, -11.670519, -30.851544]), array([-31.897851, -30.247588, -33.028094]), array([48.734149, -2.004701, 8.019123]), array([-31.897851, -30.247588, -33.028094]), array([-12.1714 , -6.494719, 25.361539]), array([-31.897851, -30.247588, -33.028094]), array([-38.1525 , -13.054752, -5.607666]), array([-31.897851, -30.247588, -33.028094]), array([ 30.150795, -4.286333, -31.136279]), array([-31.897851, -30.247588, -33.028094]), array([ 30.400644, -33.753689, 34.832572]), array([-31.897851, -30.247588, -33.028094]), array([ 23.242996, -42.031295, -22.110624]), array([-31.897851, -30.247588, -33.028094]), array([ 9.822772, -44.114976, -18.760442]), array([-31.897851, -30.247588, -33.028094]), array([-22.152851, -56.734891, 16.852029]), array([-31.897851, -30.247588, -33.028094]), array([-51.151034, -35.899675, 25.679908]), array([-31.897851, -30.247588, -33.028094]), array([-30.092058, -33.534852, 43.097159]), array([-31.897851, -30.247588, -33.028094]), array([ 54.048553, -37.427609, 12.535183]), array([-31.897851, -30.247588, -33.028094]), array([ 59.995574, -14.366518, 26.025739]), array([-31.897851, -30.247588, -33.028094]), array([ 59.286775, -2.547348, -21.924281]), array([-31.897851, -30.247588, -33.028094]), array([ 47.987255, -16.887697, -39.699154]), array([-31.897851, -30.247588, -33.028094]), array([ 79.213202, -15.623481, -15.95848 ]), array([-31.897851, -30.247588, -33.028094]), array([ 53.338325, -45.334367, -18.998421]), array([-31.897851, -30.247588, -33.028094]), array([-14.49484 , -20.328269, -27.617052]), array([-31.897851, -30.247588, -33.028094]), array([ 6.093876, -48.998009, -7.897234]), array([-31.897851, -30.247588, -33.028094]), array([ -8.613724, -59.8286 , -27.915417]), array([-31.897851, -30.247588, -33.028094]), array([-23.429795, -51.025923, -39.842084]), array([-31.897851, -30.247588, -33.028094]), array([ 18.541141, -24.947459, -60.138766]), array([-31.897851, -30.247588, -33.028094]), array([ 9.897209, -53.324915, -23.790822]), array([-31.897851, -30.247588, -33.028094]), array([-31.897851, -30.247588, -33.028094]), array([-31.897851, -30.247588, -33.028094]), array([-68.477071, -22.67342 , -1.619763]), array([-70.449382, -12.870265, -11.423195]), array([ 6.489431, -11.670519, -30.851544]), array([-70.449382, -12.870265, -11.423195]), array([-22.152851, -56.734891, 16.852029]), array([-70.449382, -12.870265, -11.423195]), array([-51.151034, -35.899675, 25.679908]), array([-70.449382, -12.870265, -11.423195]), array([-14.49484 , -20.328269, -27.617052]), array([-70.449382, -12.870265, -11.423195]), array([ -8.613724, -59.8286 , -27.915417]), array([-70.449382, -12.870265, -11.423195]), array([ 9.897209, -53.324915, -23.790822]), array([-70.449382, -12.870265, -11.423195]), array([-70.449382, -12.870265, -11.423195]), array([-70.449382, -12.870265, -11.423195]), array([-68.477071, -22.67342 , -1.619763]), array([-70.449382, -12.870265, -11.423195]), array([-60.66705 , 12.165386, -6.554734]), array([-68.477071, -22.67342 , -1.619763]), array([ 6.489431, -11.670519, -30.851544]), array([-68.477071, -22.67342 , -1.619763]), array([48.734149, -2.004701, 8.019123]), array([-68.477071, -22.67342 , -1.619763]), array([ 30.150795, -4.286333, -31.136279]), array([-68.477071, -22.67342 , -1.619763]), array([ 30.400644, -33.753689, 34.832572]), array([-68.477071, -22.67342 , -1.619763]), array([ 23.242996, -42.031295, -22.110624]), array([-68.477071, -22.67342 , -1.619763]), array([ 9.822772, -44.114976, -18.760442]), array([-68.477071, -22.67342 , -1.619763]), array([-22.152851, -56.734891, 16.852029]), array([-68.477071, -22.67342 , -1.619763]), array([-51.151034, -35.899675, 25.679908]), array([-68.477071, -22.67342 , -1.619763]), array([-43.927847, -8.226723, 27.584594]), array([-68.477071, -22.67342 , -1.619763]), array([-30.092058, -33.534852, 43.097159]), array([-68.477071, -22.67342 , -1.619763]), array([ 54.048553, -37.427609, 12.535183]), array([-68.477071, -22.67342 , -1.619763]), array([ 59.995574, -14.366518, 26.025739]), array([-68.477071, -22.67342 , -1.619763]), array([ 47.987255, -16.887697, -39.699154]), array([-68.477071, -22.67342 , -1.619763]), array([ 79.213202, -15.623481, -15.95848 ]), array([-68.477071, -22.67342 , -1.619763]), array([ 53.338325, -45.334367, -18.998421]), array([-68.477071, -22.67342 , -1.619763]), array([-14.49484 , -20.328269, -27.617052]), array([-68.477071, -22.67342 , -1.619763]), array([ 23.765633, -21.600569, 45.97906 ]), array([-68.477071, -22.67342 , -1.619763]), array([18.273358, -4.266078, 38.071488]), array([-68.477071, -22.67342 , -1.619763]), array([ 31.270899, -53.183604, -3.211336]), array([-68.477071, -22.67342 , -1.619763]), array([ -8.613724, -59.8286 , -27.915417]), array([-68.477071, -22.67342 , -1.619763]), array([-23.429795, -51.025923, -39.842084]), array([-68.477071, -22.67342 , -1.619763]), array([ 18.541141, -24.947459, -60.138766]), array([-68.477071, -22.67342 , -1.619763]), array([ 9.897209, -53.324915, -23.790822]), array([-68.477071, -22.67342 , -1.619763]), array([-31.897851, -30.247588, -33.028094]), array([-68.477071, -22.67342 , -1.619763]), array([-70.449382, -12.870265, -11.423195]), array([-68.477071, -22.67342 , -1.619763]), array([-68.477071, -22.67342 , -1.619763]), array([-68.477071, -22.67342 , -1.619763]), array([-66.770666, 19.431384, -4.138797]), array([-9.810758, 42.258358, -0.196899]), array([-9.810758, 42.258358, -0.196899]), array([-9.810758, 42.258358, -0.196899]), array([-7.680012, 58.825146, -1.913986]), array([-9.810758, 42.258358, -0.196899]), array([39.281208, 4.486598, 10.191669]), array([-9.810758, 42.258358, -0.196899]), array([ 28.220495, 8.508825, -31.633256]), array([-9.810758, 42.258358, -0.196899]), array([ 30.412158, 39.619089, -25.426555]), array([-9.810758, 42.258358, -0.196899]), array([ 9.534895, 45.586715, -15.697951]), array([-9.810758, 42.258358, -0.196899]), array([55.995996, 19.842407, 26.675811]), array([-9.810758, 42.258358, -0.196899]), array([ 54.173949, 6.505508, -16.27533 ]), array([-9.810758, 42.258358, -0.196899]), array([ 49.265878, 17.275875, -40.963937]), array([-9.810758, 42.258358, -0.196899]), array([ -8.0653 , 19.20328 , -31.944175]), array([-9.810758, 42.258358, -0.196899]), array([-14.078617, 60.366031, -27.023514]), array([-9.810758, 42.258358, -0.196899]), array([ -0.096289, 57.879062, -18.031089]), array([-9.810758, 42.258358, -0.196899]), array([-22.27433 , 30.547326, -39.308739]), array([-7.680012, 58.825146, -1.913986]), array([-9.810758, 42.258358, -0.196899]), array([-7.680012, 58.825146, -1.913986]), array([-7.680012, 58.825146, -1.913986]), array([-7.680012, 58.825146, -1.913986]), array([25.33148 , 38.587971, 32.110488]), array([-7.680012, 58.825146, -1.913986]), array([-23.959151, 52.704826, 22.570164]), array([-7.680012, 58.825146, -1.913986]), array([-51.903028, 33.658259, 25.071224]), array([-7.680012, 58.825146, -1.913986]), array([-41.261623, 3.156065, 31.680186]), array([-7.680012, 58.825146, -1.913986]), array([-33.257143, 25.624607, 48.06079 ]), array([-7.680012, 58.825146, -1.913986]), array([55.048683, 36.907935, 12.70272 ]), array([-7.680012, 58.825146, -1.913986]), array([ 49.265878, 17.275875, -40.963937]), array([-7.680012, 58.825146, -1.913986]), array([ 77.946877, 20.707769, -18.710748]), array([-7.680012, 58.825146, -1.913986]), array([ 52.237054, 48.425978, -14.636575]), array([-7.680012, 58.825146, -1.913986]), array([ -8.0653 , 19.20328 , -31.944175]), array([-7.680012, 58.825146, -1.913986]), array([21.399859, 21.199044, 48.314342]), array([-7.680012, 58.825146, -1.913986]), array([-14.078617, 60.366031, -27.023514]), array([-7.680012, 58.825146, -1.913986]), array([ -0.096289, 57.879062, -18.031089]), array([-7.680012, 58.825146, -1.913986]), array([-22.27433 , 30.547326, -39.308739]), array([ 7.671771, 16.535084, -32.110169]), array([ 6.489431, -11.670519, -30.851544]), array([ 7.671771, 16.535084, -32.110169]), array([ 7.671771, 16.535084, -32.110169]), array([ 7.671771, 16.535084, -32.110169]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 7.671771, 16.535084, -32.110169]), array([-14.078617, 60.366031, -27.023514]), array([ 7.671771, 16.535084, -32.110169]), array([-21.635537, 52.591846, -40.625765]), array([ 7.671771, 16.535084, -32.110169]), array([ 28.610946, 33.291033, -57.766536]), array([ 7.671771, 16.535084, -32.110169]), array([-22.27433 , 30.547326, -39.308739]), array([39.281208, 4.486598, 10.191669]), array([48.734149, -2.004701, 8.019123]), array([39.281208, 4.486598, 10.191669]), array([-9.810758, 42.258358, -0.196899]), array([39.281208, 4.486598, 10.191669]), array([ 7.671771, 16.535084, -32.110169]), array([39.281208, 4.486598, 10.191669]), array([39.281208, 4.486598, 10.191669]), array([39.281208, 4.486598, 10.191669]), array([-11.349411, 1.901778, 21.476145]), array([39.281208, 4.486598, 10.191669]), array([ 28.220495, 8.508825, -31.633256]), array([39.281208, 4.486598, 10.191669]), array([25.33148 , 38.587971, 32.110488]), array([39.281208, 4.486598, 10.191669]), array([ 37.054464, 40.364252, -30.482399]), array([39.281208, 4.486598, 10.191669]), array([-10.680653, 11.558159, -17.518622]), array([39.281208, 4.486598, 10.191669]), array([ 30.412158, 39.619089, -25.426555]), array([39.281208, 4.486598, 10.191669]), array([ 9.534895, 45.586715, -15.697951]), array([39.281208, 4.486598, 10.191669]), array([ 6.077868, 34.161497, 35.327252]), array([39.281208, 4.486598, 10.191669]), array([-51.903028, 33.658259, 25.071224]), array([39.281208, 4.486598, 10.191669]), array([-41.261623, 3.156065, 31.680186]), array([39.281208, 4.486598, 10.191669]), array([-33.257143, 25.624607, 48.06079 ]), array([39.281208, 4.486598, 10.191669]), array([55.048683, 36.907935, 12.70272 ]), array([39.281208, 4.486598, 10.191669]), array([55.995996, 19.842407, 26.675811]), array([39.281208, 4.486598, 10.191669]), array([54.133613, 5.459295, 8.870544]), array([39.281208, 4.486598, 10.191669]), array([ 54.173949, 6.505508, -16.27533 ]), array([39.281208, 4.486598, 10.191669]), array([ 49.265878, 17.275875, -40.963937]), array([39.281208, 4.486598, 10.191669]), array([ 77.946877, 20.707769, -18.710748]), array([39.281208, 4.486598, 10.191669]), array([ 52.237054, 48.425978, -14.636575]), array([39.281208, 4.486598, 10.191669]), array([ -8.0653 , 19.20328 , -31.944175]), array([39.281208, 4.486598, 10.191669]), array([21.399859, 21.199044, 48.314342]), array([39.281208, 4.486598, 10.191669]), array([16.534061, 2.192421, 40.922159]), array([39.281208, 4.486598, 10.191669]), array([28.761381, 51.960267, -2.848827]), array([39.281208, 4.486598, 10.191669]), array([ 4.454994, 51.654279, -5.310949]), array([39.281208, 4.486598, 10.191669]), array([ 28.610946, 33.291033, -57.766536]), array([39.281208, 4.486598, 10.191669]), array([-22.27433 , 30.547326, -39.308739]), array([39.281208, 4.486598, 10.191669]), array([-66.770666, 19.431384, -4.138797]), array([-11.349411, 1.901778, 21.476145]), array([-12.1714 , -6.494719, 25.361539]), array([-11.349411, 1.901778, 21.476145]), array([-9.810758, 42.258358, -0.196899]), array([-11.349411, 1.901778, 21.476145]), array([-7.680012, 58.825146, -1.913986]), array([-11.349411, 1.901778, 21.476145]), array([39.281208, 4.486598, 10.191669]), array([-11.349411, 1.901778, 21.476145]), array([-11.349411, 1.901778, 21.476145]), array([-11.349411, 1.901778, 21.476145]), array([-33.137736, 10.478931, -5.472519]), array([-11.349411, 1.901778, 21.476145]), array([ 28.220495, 8.508825, -31.633256]), array([-11.349411, 1.901778, 21.476145]), array([25.33148 , 38.587971, 32.110488]), array([-11.349411, 1.901778, 21.476145]), array([ 9.534895, 45.586715, -15.697951]), array([-11.349411, 1.901778, 21.476145]), array([ 6.077868, 34.161497, 35.327252]), array([-11.349411, 1.901778, 21.476145]), array([-51.903028, 33.658259, 25.071224]), array([-11.349411, 1.901778, 21.476145]), array([-41.261623, 3.156065, 31.680186]), array([-11.349411, 1.901778, 21.476145]), array([-33.257143, 25.624607, 48.06079 ]), array([-11.349411, 1.901778, 21.476145]), array([55.048683, 36.907935, 12.70272 ]), array([-11.349411, 1.901778, 21.476145]), array([ 54.173949, 6.505508, -16.27533 ]), array([-11.349411, 1.901778, 21.476145]), array([ 49.265878, 17.275875, -40.963937]), array([-11.349411, 1.901778, 21.476145]), array([ 77.946877, 20.707769, -18.710748]), array([-11.349411, 1.901778, 21.476145]), array([ -8.0653 , 19.20328 , -31.944175]), array([-11.349411, 1.901778, 21.476145]), array([-10.91018 , 34.40576 , 39.609319]), array([-11.349411, 1.901778, 21.476145]), array([ 4.454994, 51.654279, -5.310949]), array([-11.349411, 1.901778, 21.476145]), array([-14.078617, 60.366031, -27.023514]), array([-11.349411, 1.901778, 21.476145]), array([ -0.096289, 57.879062, -18.031089]), array([-11.349411, 1.901778, 21.476145]), array([-22.27433 , 30.547326, -39.308739]), array([-11.349411, 1.901778, 21.476145]), array([-66.770666, 19.431384, -4.138797]), array([-33.137736, 10.478931, -5.472519]), array([-38.1525 , -13.054752, -5.607666]), array([-33.137736, 10.478931, -5.472519]), array([-11.349411, 1.901778, 21.476145]), array([-33.137736, 10.478931, -5.472519]), array([-23.959151, 52.704826, 22.570164]), array([-33.137736, 10.478931, -5.472519]), array([-51.903028, 33.658259, 25.071224]), array([-33.137736, 10.478931, -5.472519]), array([-41.261623, 3.156065, 31.680186]), array([-33.137736, 10.478931, -5.472519]), array([-33.257143, 25.624607, 48.06079 ]), array([-33.137736, 10.478931, -5.472519]), array([55.048683, 36.907935, 12.70272 ]), array([-33.137736, 10.478931, -5.472519]), array([55.995996, 19.842407, 26.675811]), array([ 28.220495, 8.508825, -31.633256]), array([ 30.150795, -4.286333, -31.136279]), array([ 28.220495, 8.508825, -31.633256]), array([-9.810758, 42.258358, -0.196899]), array([ 28.220495, 8.508825, -31.633256]), array([-7.680012, 58.825146, -1.913986]), array([ 28.220495, 8.508825, -31.633256]), array([ 7.671771, 16.535084, -32.110169]), array([ 28.220495, 8.508825, -31.633256]), array([39.281208, 4.486598, 10.191669]), array([ 28.220495, 8.508825, -31.633256]), array([-11.349411, 1.901778, 21.476145]), array([ 28.220495, 8.508825, -31.633256]), array([-33.137736, 10.478931, -5.472519]), array([ 28.220495, 8.508825, -31.633256]), array([ 28.220495, 8.508825, -31.633256]), array([ 28.220495, 8.508825, -31.633256]), array([-10.680653, 11.558159, -17.518622]), array([ 28.220495, 8.508825, -31.633256]), array([ 30.412158, 39.619089, -25.426555]), array([ 28.220495, 8.508825, -31.633256]), array([ 9.534895, 45.586715, -15.697951]), array([ 28.220495, 8.508825, -31.633256]), array([-33.257143, 25.624607, 48.06079 ]), array([ 28.220495, 8.508825, -31.633256]), array([55.048683, 36.907935, 12.70272 ]), array([ 28.220495, 8.508825, -31.633256]), array([55.995996, 19.842407, 26.675811]), array([ 28.220495, 8.508825, -31.633256]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 28.220495, 8.508825, -31.633256]), array([ 49.265878, 17.275875, -40.963937]), array([ 28.220495, 8.508825, -31.633256]), array([ 77.946877, 20.707769, -18.710748]), array([ 28.220495, 8.508825, -31.633256]), array([ 52.237054, 48.425978, -14.636575]), array([ 28.220495, 8.508825, -31.633256]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 28.220495, 8.508825, -31.633256]), array([-14.078617, 60.366031, -27.023514]), array([ 28.220495, 8.508825, -31.633256]), array([ 28.610946, 33.291033, -57.766536]), array([ 28.220495, 8.508825, -31.633256]), array([ -0.096289, 57.879062, -18.031089]), array([ 28.220495, 8.508825, -31.633256]), array([-22.27433 , 30.547326, -39.308739]), array([ 28.220495, 8.508825, -31.633256]), array([-66.770666, 19.431384, -4.138797]), array([25.33148 , 38.587971, 32.110488]), array([ 30.400644, -33.753689, 34.832572]), array([25.33148 , 38.587971, 32.110488]), array([-9.810758, 42.258358, -0.196899]), array([25.33148 , 38.587971, 32.110488]), array([-7.680012, 58.825146, -1.913986]), array([25.33148 , 38.587971, 32.110488]), array([39.281208, 4.486598, 10.191669]), array([25.33148 , 38.587971, 32.110488]), array([-11.349411, 1.901778, 21.476145]), array([25.33148 , 38.587971, 32.110488]), array([-33.137736, 10.478931, -5.472519]), array([25.33148 , 38.587971, 32.110488]), array([25.33148 , 38.587971, 32.110488]), array([25.33148 , 38.587971, 32.110488]), array([ 30.412158, 39.619089, -25.426555]), array([25.33148 , 38.587971, 32.110488]), array([ 9.534895, 45.586715, -15.697951]), array([25.33148 , 38.587971, 32.110488]), array([-23.959151, 52.704826, 22.570164]), array([25.33148 , 38.587971, 32.110488]), array([-51.903028, 33.658259, 25.071224]), array([25.33148 , 38.587971, 32.110488]), array([-41.261623, 3.156065, 31.680186]), array([25.33148 , 38.587971, 32.110488]), array([-33.257143, 25.624607, 48.06079 ]), array([25.33148 , 38.587971, 32.110488]), array([55.048683, 36.907935, 12.70272 ]), array([25.33148 , 38.587971, 32.110488]), array([ 54.173949, 6.505508, -16.27533 ]), array([25.33148 , 38.587971, 32.110488]), array([ 49.265878, 17.275875, -40.963937]), array([25.33148 , 38.587971, 32.110488]), array([ 77.946877, 20.707769, -18.710748]), array([25.33148 , 38.587971, 32.110488]), array([ 52.237054, 48.425978, -14.636575]), array([25.33148 , 38.587971, 32.110488]), array([ -8.0653 , 19.20328 , -31.944175]), array([25.33148 , 38.587971, 32.110488]), array([21.399859, 21.199044, 48.314342]), array([25.33148 , 38.587971, 32.110488]), array([16.534061, 2.192421, 40.922159]), array([25.33148 , 38.587971, 32.110488]), array([-10.91018 , 34.40576 , 39.609319]), array([25.33148 , 38.587971, 32.110488]), array([-14.078617, 60.366031, -27.023514]), array([25.33148 , 38.587971, 32.110488]), array([ 28.610946, 33.291033, -57.766536]), array([25.33148 , 38.587971, 32.110488]), array([ -0.096289, 57.879062, -18.031089]), array([25.33148 , 38.587971, 32.110488]), array([-66.770666, 19.431384, -4.138797]), array([ 37.054464, 40.364252, -30.482399]), array([39.281208, 4.486598, 10.191669]), array([ 37.054464, 40.364252, -30.482399]), array([-11.349411, 1.901778, 21.476145]), array([ 37.054464, 40.364252, -30.482399]), array([ 37.054464, 40.364252, -30.482399]), array([ 37.054464, 40.364252, -30.482399]), array([ 30.412158, 39.619089, -25.426555]), array([ 37.054464, 40.364252, -30.482399]), array([ 9.534895, 45.586715, -15.697951]), array([ 37.054464, 40.364252, -30.482399]), array([-23.959151, 52.704826, 22.570164]), array([ 37.054464, 40.364252, -30.482399]), array([-51.903028, 33.658259, 25.071224]), array([ 37.054464, 40.364252, -30.482399]), array([55.048683, 36.907935, 12.70272 ]), array([ 37.054464, 40.364252, -30.482399]), array([ 49.265878, 17.275875, -40.963937]), array([ 37.054464, 40.364252, -30.482399]), array([ 77.946877, 20.707769, -18.710748]), array([ 37.054464, 40.364252, -30.482399]), array([21.399859, 21.199044, 48.314342]), array([ 37.054464, 40.364252, -30.482399]), array([16.534061, 2.192421, 40.922159]), array([ 37.054464, 40.364252, -30.482399]), array([-10.91018 , 34.40576 , 39.609319]), array([ 37.054464, 40.364252, -30.482399]), array([ 4.454994, 51.654279, -5.310949]), array([-10.680653, 11.558159, -17.518622]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 30.412158, 39.619089, -25.426555]), array([-9.810758, 42.258358, -0.196899]), array([ 30.412158, 39.619089, -25.426555]), array([-7.680012, 58.825146, -1.913986]), array([ 30.412158, 39.619089, -25.426555]), array([ 7.671771, 16.535084, -32.110169]), array([ 30.412158, 39.619089, -25.426555]), array([39.281208, 4.486598, 10.191669]), array([ 30.412158, 39.619089, -25.426555]), array([-11.349411, 1.901778, 21.476145]), array([ 30.412158, 39.619089, -25.426555]), array([-33.137736, 10.478931, -5.472519]), array([ 30.412158, 39.619089, -25.426555]), array([ 28.220495, 8.508825, -31.633256]), array([ 30.412158, 39.619089, -25.426555]), array([25.33148 , 38.587971, 32.110488]), array([ 30.412158, 39.619089, -25.426555]), array([-10.680653, 11.558159, -17.518622]), array([ 30.412158, 39.619089, -25.426555]), array([ 30.412158, 39.619089, -25.426555]), array([ 30.412158, 39.619089, -25.426555]), array([ 9.534895, 45.586715, -15.697951]), array([ 30.412158, 39.619089, -25.426555]), array([-23.959151, 52.704826, 22.570164]), array([ 30.412158, 39.619089, -25.426555]), array([-51.903028, 33.658259, 25.071224]), array([ 30.412158, 39.619089, -25.426555]), array([-41.261623, 3.156065, 31.680186]), array([ 30.412158, 39.619089, -25.426555]), array([-33.257143, 25.624607, 48.06079 ]), array([ 30.412158, 39.619089, -25.426555]), array([55.048683, 36.907935, 12.70272 ]), array([ 30.412158, 39.619089, -25.426555]), array([55.995996, 19.842407, 26.675811]), array([ 30.412158, 39.619089, -25.426555]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 30.412158, 39.619089, -25.426555]), array([ 49.265878, 17.275875, -40.963937]), array([ 30.412158, 39.619089, -25.426555]), array([ 77.946877, 20.707769, -18.710748]), array([ 30.412158, 39.619089, -25.426555]), array([ 52.237054, 48.425978, -14.636575]), array([ 30.412158, 39.619089, -25.426555]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 30.412158, 39.619089, -25.426555]), array([21.399859, 21.199044, 48.314342]), array([ 30.412158, 39.619089, -25.426555]), array([28.761381, 51.960267, -2.848827]), array([ 30.412158, 39.619089, -25.426555]), array([-10.91018 , 34.40576 , 39.609319]), array([ 30.412158, 39.619089, -25.426555]), array([ 4.454994, 51.654279, -5.310949]), array([ 30.412158, 39.619089, -25.426555]), array([ 28.610946, 33.291033, -57.766536]), array([ 30.412158, 39.619089, -25.426555]), array([ -0.096289, 57.879062, -18.031089]), array([ 30.412158, 39.619089, -25.426555]), array([-22.27433 , 30.547326, -39.308739]), array([ 30.412158, 39.619089, -25.426555]), array([-66.770666, 19.431384, -4.138797]), array([ 9.534895, 45.586715, -15.697951]), array([ 7.671771, 16.535084, -32.110169]), array([ 9.534895, 45.586715, -15.697951]), array([39.281208, 4.486598, 10.191669]), array([ 9.534895, 45.586715, -15.697951]), array([-33.137736, 10.478931, -5.472519]), array([ 9.534895, 45.586715, -15.697951]), array([ 28.220495, 8.508825, -31.633256]), array([ 9.534895, 45.586715, -15.697951]), array([-10.680653, 11.558159, -17.518622]), array([ 9.534895, 45.586715, -15.697951]), array([ 30.412158, 39.619089, -25.426555]), array([ 9.534895, 45.586715, -15.697951]), array([ 9.534895, 45.586715, -15.697951]), array([ 9.534895, 45.586715, -15.697951]), array([-23.959151, 52.704826, 22.570164]), array([ 9.534895, 45.586715, -15.697951]), array([-51.903028, 33.658259, 25.071224]), array([ 9.534895, 45.586715, -15.697951]), array([-41.261623, 3.156065, 31.680186]), array([ 9.534895, 45.586715, -15.697951]), array([-33.257143, 25.624607, 48.06079 ]), array([ 9.534895, 45.586715, -15.697951]), array([55.048683, 36.907935, 12.70272 ]), array([ 9.534895, 45.586715, -15.697951]), array([55.995996, 19.842407, 26.675811]), array([ 9.534895, 45.586715, -15.697951]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 9.534895, 45.586715, -15.697951]), array([ 49.265878, 17.275875, -40.963937]), array([ 9.534895, 45.586715, -15.697951]), array([ 52.237054, 48.425978, -14.636575]), array([ 9.534895, 45.586715, -15.697951]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 9.534895, 45.586715, -15.697951]), array([21.399859, 21.199044, 48.314342]), array([ 9.534895, 45.586715, -15.697951]), array([28.761381, 51.960267, -2.848827]), array([ 9.534895, 45.586715, -15.697951]), array([-10.91018 , 34.40576 , 39.609319]), array([ 9.534895, 45.586715, -15.697951]), array([ 4.454994, 51.654279, -5.310949]), array([ 9.534895, 45.586715, -15.697951]), array([ 28.610946, 33.291033, -57.766536]), array([ 9.534895, 45.586715, -15.697951]), array([-22.27433 , 30.547326, -39.308739]), array([ 9.534895, 45.586715, -15.697951]), array([-66.770666, 19.431384, -4.138797]), array([ 6.077868, 34.161497, 35.327252]), array([ 8.003023, -32.833685, 38.712349]), array([ 6.077868, 34.161497, 35.327252]), array([39.281208, 4.486598, 10.191669]), array([ 6.077868, 34.161497, 35.327252]), array([-11.349411, 1.901778, 21.476145]), array([ 6.077868, 34.161497, 35.327252]), array([ 30.412158, 39.619089, -25.426555]), array([ 6.077868, 34.161497, 35.327252]), array([ 9.534895, 45.586715, -15.697951]), array([ 6.077868, 34.161497, 35.327252]), array([ 6.077868, 34.161497, 35.327252]), array([ 6.077868, 34.161497, 35.327252]), array([-51.903028, 33.658259, 25.071224]), array([ 6.077868, 34.161497, 35.327252]), array([-41.261623, 3.156065, 31.680186]), array([ 6.077868, 34.161497, 35.327252]), array([-33.257143, 25.624607, 48.06079 ]), array([ 6.077868, 34.161497, 35.327252]), array([ 49.265878, 17.275875, -40.963937]), array([ 6.077868, 34.161497, 35.327252]), array([ 77.946877, 20.707769, -18.710748]), array([ 6.077868, 34.161497, 35.327252]), array([21.399859, 21.199044, 48.314342]), array([ 6.077868, 34.161497, 35.327252]), array([16.534061, 2.192421, 40.922159]), array([ 6.077868, 34.161497, 35.327252]), array([28.761381, 51.960267, -2.848827]), array([ 6.077868, 34.161497, 35.327252]), array([-10.91018 , 34.40576 , 39.609319]), array([ 6.077868, 34.161497, 35.327252]), array([ 4.454994, 51.654279, -5.310949]), array([ 6.077868, 34.161497, 35.327252]), array([-14.078617, 60.366031, -27.023514]), array([ 6.077868, 34.161497, 35.327252]), array([-66.770666, 19.431384, -4.138797]), array([-23.959151, 52.704826, 22.570164]), array([-7.680012, 58.825146, -1.913986]), array([-23.959151, 52.704826, 22.570164]), array([ 7.671771, 16.535084, -32.110169]), array([-23.959151, 52.704826, 22.570164]), array([39.281208, 4.486598, 10.191669]), array([-23.959151, 52.704826, 22.570164]), array([-11.349411, 1.901778, 21.476145]), array([-23.959151, 52.704826, 22.570164]), array([-33.137736, 10.478931, -5.472519]), array([-23.959151, 52.704826, 22.570164]), array([25.33148 , 38.587971, 32.110488]), array([-23.959151, 52.704826, 22.570164]), array([ 37.054464, 40.364252, -30.482399]), array([-23.959151, 52.704826, 22.570164]), array([ 30.412158, 39.619089, -25.426555]), array([-23.959151, 52.704826, 22.570164]), array([ 9.534895, 45.586715, -15.697951]), array([-23.959151, 52.704826, 22.570164]), array([-23.959151, 52.704826, 22.570164]), array([-23.959151, 52.704826, 22.570164]), array([-51.903028, 33.658259, 25.071224]), array([-23.959151, 52.704826, 22.570164]), array([-41.261623, 3.156065, 31.680186]), array([-23.959151, 52.704826, 22.570164]), array([-33.257143, 25.624607, 48.06079 ]), array([-23.959151, 52.704826, 22.570164]), array([55.995996, 19.842407, 26.675811]), array([-23.959151, 52.704826, 22.570164]), array([ 52.237054, 48.425978, -14.636575]), array([-23.959151, 52.704826, 22.570164]), array([ -8.0653 , 19.20328 , -31.944175]), array([-23.959151, 52.704826, 22.570164]), array([21.399859, 21.199044, 48.314342]), array([-23.959151, 52.704826, 22.570164]), array([16.534061, 2.192421, 40.922159]), array([-23.959151, 52.704826, 22.570164]), array([28.761381, 51.960267, -2.848827]), array([-23.959151, 52.704826, 22.570164]), array([-10.91018 , 34.40576 , 39.609319]), array([-23.959151, 52.704826, 22.570164]), array([ 4.454994, 51.654279, -5.310949]), array([-23.959151, 52.704826, 22.570164]), array([-14.078617, 60.366031, -27.023514]), array([-23.959151, 52.704826, 22.570164]), array([-21.635537, 52.591846, -40.625765]), array([-23.959151, 52.704826, 22.570164]), array([ 28.610946, 33.291033, -57.766536]), array([-23.959151, 52.704826, 22.570164]), array([ -0.096289, 57.879062, -18.031089]), array([-23.959151, 52.704826, 22.570164]), array([-22.27433 , 30.547326, -39.308739]), array([-23.959151, 52.704826, 22.570164]), array([-66.770666, 19.431384, -4.138797]), array([-51.903028, 33.658259, 25.071224]), array([-7.680012, 58.825146, -1.913986]), array([-51.903028, 33.658259, 25.071224]), array([ 7.671771, 16.535084, -32.110169]), array([-51.903028, 33.658259, 25.071224]), array([39.281208, 4.486598, 10.191669]), array([-51.903028, 33.658259, 25.071224]), array([-11.349411, 1.901778, 21.476145]), array([-51.903028, 33.658259, 25.071224]), array([-33.137736, 10.478931, -5.472519]), array([-51.903028, 33.658259, 25.071224]), array([25.33148 , 38.587971, 32.110488]), array([-51.903028, 33.658259, 25.071224]), array([ 37.054464, 40.364252, -30.482399]), array([-51.903028, 33.658259, 25.071224]), array([ 30.412158, 39.619089, -25.426555]), array([-51.903028, 33.658259, 25.071224]), array([ 9.534895, 45.586715, -15.697951]), array([-51.903028, 33.658259, 25.071224]), array([ 6.077868, 34.161497, 35.327252]), array([-51.903028, 33.658259, 25.071224]), array([-23.959151, 52.704826, 22.570164]), array([-51.903028, 33.658259, 25.071224]), array([-51.903028, 33.658259, 25.071224]), array([-51.903028, 33.658259, 25.071224]), array([-41.261623, 3.156065, 31.680186]), array([-51.903028, 33.658259, 25.071224]), array([-33.257143, 25.624607, 48.06079 ]), array([-51.903028, 33.658259, 25.071224]), array([55.048683, 36.907935, 12.70272 ]), array([-51.903028, 33.658259, 25.071224]), array([55.995996, 19.842407, 26.675811]), array([-51.903028, 33.658259, 25.071224]), array([ 52.237054, 48.425978, -14.636575]), array([-51.903028, 33.658259, 25.071224]), array([ -8.0653 , 19.20328 , -31.944175]), array([-51.903028, 33.658259, 25.071224]), array([21.399859, 21.199044, 48.314342]), array([-51.903028, 33.658259, 25.071224]), array([16.534061, 2.192421, 40.922159]), array([-51.903028, 33.658259, 25.071224]), array([28.761381, 51.960267, -2.848827]), array([-51.903028, 33.658259, 25.071224]), array([-10.91018 , 34.40576 , 39.609319]), array([-51.903028, 33.658259, 25.071224]), array([ 4.454994, 51.654279, -5.310949]), array([-51.903028, 33.658259, 25.071224]), array([-14.078617, 60.366031, -27.023514]), array([-51.903028, 33.658259, 25.071224]), array([-21.635537, 52.591846, -40.625765]), array([-51.903028, 33.658259, 25.071224]), array([ 28.610946, 33.291033, -57.766536]), array([-51.903028, 33.658259, 25.071224]), array([ -0.096289, 57.879062, -18.031089]), array([-51.903028, 33.658259, 25.071224]), array([-22.27433 , 30.547326, -39.308739]), array([-51.903028, 33.658259, 25.071224]), array([-60.66705 , 12.165386, -6.554734]), array([-51.903028, 33.658259, 25.071224]), array([-66.770666, 19.431384, -4.138797]), array([-41.261623, 3.156065, 31.680186]), array([-43.927847, -8.226723, 27.584594]), array([-41.261623, 3.156065, 31.680186]), array([39.281208, 4.486598, 10.191669]), array([-41.261623, 3.156065, 31.680186]), array([-11.349411, 1.901778, 21.476145]), array([-41.261623, 3.156065, 31.680186]), array([-33.137736, 10.478931, -5.472519]), array([-41.261623, 3.156065, 31.680186]), array([25.33148 , 38.587971, 32.110488]), array([-41.261623, 3.156065, 31.680186]), array([ 30.412158, 39.619089, -25.426555]), array([-41.261623, 3.156065, 31.680186]), array([ 9.534895, 45.586715, -15.697951]), array([-41.261623, 3.156065, 31.680186]), array([ 6.077868, 34.161497, 35.327252]), array([-41.261623, 3.156065, 31.680186]), array([-23.959151, 52.704826, 22.570164]), array([-41.261623, 3.156065, 31.680186]), array([-51.903028, 33.658259, 25.071224]), array([-41.261623, 3.156065, 31.680186]), array([-41.261623, 3.156065, 31.680186]), array([-41.261623, 3.156065, 31.680186]), array([-33.257143, 25.624607, 48.06079 ]), array([-41.261623, 3.156065, 31.680186]), array([55.048683, 36.907935, 12.70272 ]), array([-41.261623, 3.156065, 31.680186]), array([55.995996, 19.842407, 26.675811]), array([-41.261623, 3.156065, 31.680186]), array([ 49.265878, 17.275875, -40.963937]), array([-41.261623, 3.156065, 31.680186]), array([ 52.237054, 48.425978, -14.636575]), array([-41.261623, 3.156065, 31.680186]), array([ -8.0653 , 19.20328 , -31.944175]), array([-41.261623, 3.156065, 31.680186]), array([21.399859, 21.199044, 48.314342]), array([-41.261623, 3.156065, 31.680186]), array([16.534061, 2.192421, 40.922159]), array([-41.261623, 3.156065, 31.680186]), array([-14.078617, 60.366031, -27.023514]), array([-41.261623, 3.156065, 31.680186]), array([ -0.096289, 57.879062, -18.031089]), array([-41.261623, 3.156065, 31.680186]), array([-22.27433 , 30.547326, -39.308739]), array([-41.261623, 3.156065, 31.680186]), array([-66.770666, 19.431384, -4.138797]), array([-33.257143, 25.624607, 48.06079 ]), array([-30.092058, -33.534852, 43.097159]), array([-33.257143, 25.624607, 48.06079 ]), array([ 7.671771, 16.535084, -32.110169]), array([-33.257143, 25.624607, 48.06079 ]), array([39.281208, 4.486598, 10.191669]), array([-33.257143, 25.624607, 48.06079 ]), array([-11.349411, 1.901778, 21.476145]), array([-33.257143, 25.624607, 48.06079 ]), array([-33.137736, 10.478931, -5.472519]), array([-33.257143, 25.624607, 48.06079 ]), array([ 28.220495, 8.508825, -31.633256]), array([-33.257143, 25.624607, 48.06079 ]), array([25.33148 , 38.587971, 32.110488]), array([-33.257143, 25.624607, 48.06079 ]), array([ 30.412158, 39.619089, -25.426555]), array([-33.257143, 25.624607, 48.06079 ]), array([ 9.534895, 45.586715, -15.697951]), array([-33.257143, 25.624607, 48.06079 ]), array([ 6.077868, 34.161497, 35.327252]), array([-33.257143, 25.624607, 48.06079 ]), array([-23.959151, 52.704826, 22.570164]), array([-33.257143, 25.624607, 48.06079 ]), array([-51.903028, 33.658259, 25.071224]), array([-33.257143, 25.624607, 48.06079 ]), array([-41.261623, 3.156065, 31.680186]), array([-33.257143, 25.624607, 48.06079 ]), array([-33.257143, 25.624607, 48.06079 ]), array([-33.257143, 25.624607, 48.06079 ]), array([55.048683, 36.907935, 12.70272 ]), array([-33.257143, 25.624607, 48.06079 ]), array([55.995996, 19.842407, 26.675811]), array([-33.257143, 25.624607, 48.06079 ]), array([ 49.265878, 17.275875, -40.963937]), array([-33.257143, 25.624607, 48.06079 ]), array([ 77.946877, 20.707769, -18.710748]), array([-33.257143, 25.624607, 48.06079 ]), array([ 52.237054, 48.425978, -14.636575]), array([-33.257143, 25.624607, 48.06079 ]), array([ -8.0653 , 19.20328 , -31.944175]), array([-33.257143, 25.624607, 48.06079 ]), array([21.399859, 21.199044, 48.314342]), array([-33.257143, 25.624607, 48.06079 ]), array([16.534061, 2.192421, 40.922159]), array([-33.257143, 25.624607, 48.06079 ]), array([28.761381, 51.960267, -2.848827]), array([-33.257143, 25.624607, 48.06079 ]), array([-10.91018 , 34.40576 , 39.609319]), array([-33.257143, 25.624607, 48.06079 ]), array([-14.078617, 60.366031, -27.023514]), array([-33.257143, 25.624607, 48.06079 ]), array([-21.635537, 52.591846, -40.625765]), array([-33.257143, 25.624607, 48.06079 ]), array([ -0.096289, 57.879062, -18.031089]), array([-33.257143, 25.624607, 48.06079 ]), array([-22.27433 , 30.547326, -39.308739]), array([-33.257143, 25.624607, 48.06079 ]), array([-60.66705 , 12.165386, -6.554734]), array([-33.257143, 25.624607, 48.06079 ]), array([-66.770666, 19.431384, -4.138797]), array([55.048683, 36.907935, 12.70272 ]), array([ 54.048553, -37.427609, 12.535183]), array([55.048683, 36.907935, 12.70272 ]), array([-7.680012, 58.825146, -1.913986]), array([55.048683, 36.907935, 12.70272 ]), array([39.281208, 4.486598, 10.191669]), array([55.048683, 36.907935, 12.70272 ]), array([-11.349411, 1.901778, 21.476145]), array([55.048683, 36.907935, 12.70272 ]), array([-33.137736, 10.478931, -5.472519]), array([55.048683, 36.907935, 12.70272 ]), array([ 28.220495, 8.508825, -31.633256]), array([55.048683, 36.907935, 12.70272 ]), array([25.33148 , 38.587971, 32.110488]), array([55.048683, 36.907935, 12.70272 ]), array([ 30.412158, 39.619089, -25.426555]), array([55.048683, 36.907935, 12.70272 ]), array([ 9.534895, 45.586715, -15.697951]), array([55.048683, 36.907935, 12.70272 ]), array([-23.959151, 52.704826, 22.570164]), array([55.048683, 36.907935, 12.70272 ]), array([-51.903028, 33.658259, 25.071224]), array([55.048683, 36.907935, 12.70272 ]), array([-41.261623, 3.156065, 31.680186]), array([55.048683, 36.907935, 12.70272 ]), array([-33.257143, 25.624607, 48.06079 ]), array([55.048683, 36.907935, 12.70272 ]), array([55.048683, 36.907935, 12.70272 ]), array([55.048683, 36.907935, 12.70272 ]), array([55.995996, 19.842407, 26.675811]), array([55.048683, 36.907935, 12.70272 ]), array([54.133613, 5.459295, 8.870544]), array([55.048683, 36.907935, 12.70272 ]), array([ 54.173949, 6.505508, -16.27533 ]), array([55.048683, 36.907935, 12.70272 ]), array([ 49.265878, 17.275875, -40.963937]), array([55.048683, 36.907935, 12.70272 ]), array([ 77.946877, 20.707769, -18.710748]), array([55.048683, 36.907935, 12.70272 ]), array([ 52.237054, 48.425978, -14.636575]), array([55.048683, 36.907935, 12.70272 ]), array([ -8.0653 , 19.20328 , -31.944175]), array([55.048683, 36.907935, 12.70272 ]), array([21.399859, 21.199044, 48.314342]), array([55.048683, 36.907935, 12.70272 ]), array([16.534061, 2.192421, 40.922159]), array([55.048683, 36.907935, 12.70272 ]), array([28.761381, 51.960267, -2.848827]), array([55.048683, 36.907935, 12.70272 ]), array([-10.91018 , 34.40576 , 39.609319]), array([55.048683, 36.907935, 12.70272 ]), array([ 4.454994, 51.654279, -5.310949]), array([55.048683, 36.907935, 12.70272 ]), array([-14.078617, 60.366031, -27.023514]), array([55.048683, 36.907935, 12.70272 ]), array([ -0.096289, 57.879062, -18.031089]), array([55.048683, 36.907935, 12.70272 ]), array([-66.770666, 19.431384, -4.138797]), array([55.995996, 19.842407, 26.675811]), array([ 59.995574, -14.366518, 26.025739]), array([55.995996, 19.842407, 26.675811]), array([39.281208, 4.486598, 10.191669]), array([55.995996, 19.842407, 26.675811]), array([-11.349411, 1.901778, 21.476145]), array([55.995996, 19.842407, 26.675811]), array([-33.137736, 10.478931, -5.472519]), array([55.995996, 19.842407, 26.675811]), array([ 28.220495, 8.508825, -31.633256]), array([55.995996, 19.842407, 26.675811]), array([25.33148 , 38.587971, 32.110488]), array([55.995996, 19.842407, 26.675811]), array([ 30.412158, 39.619089, -25.426555]), array([55.995996, 19.842407, 26.675811]), array([ 9.534895, 45.586715, -15.697951]), array([55.995996, 19.842407, 26.675811]), array([-23.959151, 52.704826, 22.570164]), array([55.995996, 19.842407, 26.675811]), array([-51.903028, 33.658259, 25.071224]), array([55.995996, 19.842407, 26.675811]), array([-33.257143, 25.624607, 48.06079 ]), array([55.995996, 19.842407, 26.675811]), array([55.048683, 36.907935, 12.70272 ]), array([55.995996, 19.842407, 26.675811]), array([55.995996, 19.842407, 26.675811]), array([55.995996, 19.842407, 26.675811]), array([54.133613, 5.459295, 8.870544]), array([55.995996, 19.842407, 26.675811]), array([ 54.173949, 6.505508, -16.27533 ]), array([55.995996, 19.842407, 26.675811]), array([ 49.265878, 17.275875, -40.963937]), array([55.995996, 19.842407, 26.675811]), array([ 77.946877, 20.707769, -18.710748]), array([55.995996, 19.842407, 26.675811]), array([ 52.237054, 48.425978, -14.636575]), array([55.995996, 19.842407, 26.675811]), array([ -8.0653 , 19.20328 , -31.944175]), array([55.995996, 19.842407, 26.675811]), array([21.399859, 21.199044, 48.314342]), array([55.995996, 19.842407, 26.675811]), array([16.534061, 2.192421, 40.922159]), array([55.995996, 19.842407, 26.675811]), array([28.761381, 51.960267, -2.848827]), array([55.995996, 19.842407, 26.675811]), array([ 4.454994, 51.654279, -5.310949]), array([55.995996, 19.842407, 26.675811]), array([-14.078617, 60.366031, -27.023514]), array([55.995996, 19.842407, 26.675811]), array([-21.635537, 52.591846, -40.625765]), array([55.995996, 19.842407, 26.675811]), array([ 28.610946, 33.291033, -57.766536]), array([55.995996, 19.842407, 26.675811]), array([ -0.096289, 57.879062, -18.031089]), array([55.995996, 19.842407, 26.675811]), array([-22.27433 , 30.547326, -39.308739]), array([55.995996, 19.842407, 26.675811]), array([-66.770666, 19.431384, -4.138797]), array([54.133613, 5.459295, 8.870544]), array([59.612735, -2.407101, -0.844581]), array([54.133613, 5.459295, 8.870544]), array([39.281208, 4.486598, 10.191669]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 59.286775, -2.547348, -21.924281]), array([ 54.173949, 6.505508, -16.27533 ]), array([-9.810758, 42.258358, -0.196899]), array([ 54.173949, 6.505508, -16.27533 ]), array([-7.680012, 58.825146, -1.913986]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 7.671771, 16.535084, -32.110169]), array([ 54.173949, 6.505508, -16.27533 ]), array([39.281208, 4.486598, 10.191669]), array([ 54.173949, 6.505508, -16.27533 ]), array([-11.349411, 1.901778, 21.476145]), array([ 54.173949, 6.505508, -16.27533 ]), array([-33.137736, 10.478931, -5.472519]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 28.220495, 8.508825, -31.633256]), array([ 54.173949, 6.505508, -16.27533 ]), array([-10.680653, 11.558159, -17.518622]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 30.412158, 39.619089, -25.426555]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 9.534895, 45.586715, -15.697951]), array([ 54.173949, 6.505508, -16.27533 ]), array([-33.257143, 25.624607, 48.06079 ]), array([ 54.173949, 6.505508, -16.27533 ]), array([55.048683, 36.907935, 12.70272 ]), array([ 54.173949, 6.505508, -16.27533 ]), array([55.995996, 19.842407, 26.675811]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 49.265878, 17.275875, -40.963937]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 77.946877, 20.707769, -18.710748]), array([ 54.173949, 6.505508, -16.27533 ]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 54.173949, 6.505508, -16.27533 ]), array([-14.078617, 60.366031, -27.023514]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 28.610946, 33.291033, -57.766536]), array([ 54.173949, 6.505508, -16.27533 ]), array([ -0.096289, 57.879062, -18.031089]), array([ 54.173949, 6.505508, -16.27533 ]), array([-22.27433 , 30.547326, -39.308739]), array([ 54.173949, 6.505508, -16.27533 ]), array([-66.770666, 19.431384, -4.138797]), array([ 49.265878, 17.275875, -40.963937]), array([-9.810758, 42.258358, -0.196899]), array([ 49.265878, 17.275875, -40.963937]), array([-7.680012, 58.825146, -1.913986]), array([ 49.265878, 17.275875, -40.963937]), array([ 7.671771, 16.535084, -32.110169]), array([ 49.265878, 17.275875, -40.963937]), array([39.281208, 4.486598, 10.191669]), array([ 49.265878, 17.275875, -40.963937]), array([-11.349411, 1.901778, 21.476145]), array([ 49.265878, 17.275875, -40.963937]), array([-33.137736, 10.478931, -5.472519]), array([ 49.265878, 17.275875, -40.963937]), array([ 28.220495, 8.508825, -31.633256]), array([ 49.265878, 17.275875, -40.963937]), array([25.33148 , 38.587971, 32.110488]), array([ 49.265878, 17.275875, -40.963937]), array([-10.680653, 11.558159, -17.518622]), array([ 49.265878, 17.275875, -40.963937]), array([ 30.412158, 39.619089, -25.426555]), array([ 49.265878, 17.275875, -40.963937]), array([ 9.534895, 45.586715, -15.697951]), array([ 49.265878, 17.275875, -40.963937]), array([-23.959151, 52.704826, 22.570164]), array([ 49.265878, 17.275875, -40.963937]), array([-51.903028, 33.658259, 25.071224]), array([ 49.265878, 17.275875, -40.963937]), array([-33.257143, 25.624607, 48.06079 ]), array([ 49.265878, 17.275875, -40.963937]), array([55.048683, 36.907935, 12.70272 ]), array([ 49.265878, 17.275875, -40.963937]), array([55.995996, 19.842407, 26.675811]), array([ 49.265878, 17.275875, -40.963937]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 49.265878, 17.275875, -40.963937]), array([ 49.265878, 17.275875, -40.963937]), array([ 49.265878, 17.275875, -40.963937]), array([ 77.946877, 20.707769, -18.710748]), array([ 49.265878, 17.275875, -40.963937]), array([ 52.237054, 48.425978, -14.636575]), array([ 49.265878, 17.275875, -40.963937]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 49.265878, 17.275875, -40.963937]), array([21.399859, 21.199044, 48.314342]), array([ 49.265878, 17.275875, -40.963937]), array([16.534061, 2.192421, 40.922159]), array([ 49.265878, 17.275875, -40.963937]), array([28.761381, 51.960267, -2.848827]), array([ 49.265878, 17.275875, -40.963937]), array([-10.91018 , 34.40576 , 39.609319]), array([ 49.265878, 17.275875, -40.963937]), array([ 4.454994, 51.654279, -5.310949]), array([ 49.265878, 17.275875, -40.963937]), array([-14.078617, 60.366031, -27.023514]), array([ 49.265878, 17.275875, -40.963937]), array([-21.635537, 52.591846, -40.625765]), array([ 49.265878, 17.275875, -40.963937]), array([ 28.610946, 33.291033, -57.766536]), array([ 49.265878, 17.275875, -40.963937]), array([ -0.096289, 57.879062, -18.031089]), array([ 49.265878, 17.275875, -40.963937]), array([-22.27433 , 30.547326, -39.308739]), array([ 49.265878, 17.275875, -40.963937]), array([-66.770666, 19.431384, -4.138797]), array([ 77.946877, 20.707769, -18.710748]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 77.946877, 20.707769, -18.710748]), array([-7.680012, 58.825146, -1.913986]), array([ 77.946877, 20.707769, -18.710748]), array([39.281208, 4.486598, 10.191669]), array([ 77.946877, 20.707769, -18.710748]), array([-33.137736, 10.478931, -5.472519]), array([ 77.946877, 20.707769, -18.710748]), array([ 28.220495, 8.508825, -31.633256]), array([ 77.946877, 20.707769, -18.710748]), array([ 30.412158, 39.619089, -25.426555]), array([ 77.946877, 20.707769, -18.710748]), array([ 9.534895, 45.586715, -15.697951]), array([ 77.946877, 20.707769, -18.710748]), array([-23.959151, 52.704826, 22.570164]), array([ 77.946877, 20.707769, -18.710748]), array([-51.903028, 33.658259, 25.071224]), array([ 77.946877, 20.707769, -18.710748]), array([-33.257143, 25.624607, 48.06079 ]), array([ 77.946877, 20.707769, -18.710748]), array([55.048683, 36.907935, 12.70272 ]), array([ 77.946877, 20.707769, -18.710748]), array([55.995996, 19.842407, 26.675811]), array([ 77.946877, 20.707769, -18.710748]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 77.946877, 20.707769, -18.710748]), array([ 49.265878, 17.275875, -40.963937]), array([ 77.946877, 20.707769, -18.710748]), array([ 77.946877, 20.707769, -18.710748]), array([ 77.946877, 20.707769, -18.710748]), array([ 52.237054, 48.425978, -14.636575]), array([ 77.946877, 20.707769, -18.710748]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 77.946877, 20.707769, -18.710748]), array([21.399859, 21.199044, 48.314342]), array([ 77.946877, 20.707769, -18.710748]), array([16.534061, 2.192421, 40.922159]), array([ 77.946877, 20.707769, -18.710748]), array([28.761381, 51.960267, -2.848827]), array([ 77.946877, 20.707769, -18.710748]), array([-10.91018 , 34.40576 , 39.609319]), array([ 77.946877, 20.707769, -18.710748]), array([ 4.454994, 51.654279, -5.310949]), array([ 77.946877, 20.707769, -18.710748]), array([-14.078617, 60.366031, -27.023514]), array([ 77.946877, 20.707769, -18.710748]), array([-21.635537, 52.591846, -40.625765]), array([ 77.946877, 20.707769, -18.710748]), array([ 28.610946, 33.291033, -57.766536]), array([ 77.946877, 20.707769, -18.710748]), array([ -0.096289, 57.879062, -18.031089]), array([ 77.946877, 20.707769, -18.710748]), array([-22.27433 , 30.547326, -39.308739]), array([ 77.946877, 20.707769, -18.710748]), array([-66.770666, 19.431384, -4.138797]), array([ 52.237054, 48.425978, -14.636575]), array([-9.810758, 42.258358, -0.196899]), array([ 52.237054, 48.425978, -14.636575]), array([-7.680012, 58.825146, -1.913986]), array([ 52.237054, 48.425978, -14.636575]), array([39.281208, 4.486598, 10.191669]), array([ 52.237054, 48.425978, -14.636575]), array([-11.349411, 1.901778, 21.476145]), array([ 52.237054, 48.425978, -14.636575]), array([ 28.220495, 8.508825, -31.633256]), array([ 52.237054, 48.425978, -14.636575]), array([25.33148 , 38.587971, 32.110488]), array([ 52.237054, 48.425978, -14.636575]), array([ 30.412158, 39.619089, -25.426555]), array([ 52.237054, 48.425978, -14.636575]), array([ 9.534895, 45.586715, -15.697951]), array([ 52.237054, 48.425978, -14.636575]), array([-23.959151, 52.704826, 22.570164]), array([ 52.237054, 48.425978, -14.636575]), array([-51.903028, 33.658259, 25.071224]), array([ 52.237054, 48.425978, -14.636575]), array([-41.261623, 3.156065, 31.680186]), array([ 52.237054, 48.425978, -14.636575]), array([-33.257143, 25.624607, 48.06079 ]), array([ 52.237054, 48.425978, -14.636575]), array([55.048683, 36.907935, 12.70272 ]), array([ 52.237054, 48.425978, -14.636575]), array([55.995996, 19.842407, 26.675811]), array([ 52.237054, 48.425978, -14.636575]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 52.237054, 48.425978, -14.636575]), array([ 49.265878, 17.275875, -40.963937]), array([ 52.237054, 48.425978, -14.636575]), array([ 77.946877, 20.707769, -18.710748]), array([ 52.237054, 48.425978, -14.636575]), array([ 52.237054, 48.425978, -14.636575]), array([ 52.237054, 48.425978, -14.636575]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 52.237054, 48.425978, -14.636575]), array([21.399859, 21.199044, 48.314342]), array([ 52.237054, 48.425978, -14.636575]), array([16.534061, 2.192421, 40.922159]), array([ 52.237054, 48.425978, -14.636575]), array([28.761381, 51.960267, -2.848827]), array([ 52.237054, 48.425978, -14.636575]), array([ 4.454994, 51.654279, -5.310949]), array([ 52.237054, 48.425978, -14.636575]), array([-14.078617, 60.366031, -27.023514]), array([ 52.237054, 48.425978, -14.636575]), array([-21.635537, 52.591846, -40.625765]), array([ 52.237054, 48.425978, -14.636575]), array([ 28.610946, 33.291033, -57.766536]), array([ 52.237054, 48.425978, -14.636575]), array([ -0.096289, 57.879062, -18.031089]), array([ 52.237054, 48.425978, -14.636575]), array([-22.27433 , 30.547326, -39.308739]), array([ 52.237054, 48.425978, -14.636575]), array([-66.770666, 19.431384, -4.138797]), array([ -8.0653 , 19.20328 , -31.944175]), array([-9.810758, 42.258358, -0.196899]), array([ -8.0653 , 19.20328 , -31.944175]), array([-7.680012, 58.825146, -1.913986]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 7.671771, 16.535084, -32.110169]), array([ -8.0653 , 19.20328 , -31.944175]), array([39.281208, 4.486598, 10.191669]), array([ -8.0653 , 19.20328 , -31.944175]), array([-11.349411, 1.901778, 21.476145]), array([ -8.0653 , 19.20328 , -31.944175]), array([-33.137736, 10.478931, -5.472519]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 28.220495, 8.508825, -31.633256]), array([ -8.0653 , 19.20328 , -31.944175]), array([25.33148 , 38.587971, 32.110488]), array([ -8.0653 , 19.20328 , -31.944175]), array([-10.680653, 11.558159, -17.518622]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 30.412158, 39.619089, -25.426555]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 9.534895, 45.586715, -15.697951]), array([ -8.0653 , 19.20328 , -31.944175]), array([-23.959151, 52.704826, 22.570164]), array([ -8.0653 , 19.20328 , -31.944175]), array([-51.903028, 33.658259, 25.071224]), array([ -8.0653 , 19.20328 , -31.944175]), array([-33.257143, 25.624607, 48.06079 ]), array([ -8.0653 , 19.20328 , -31.944175]), array([55.048683, 36.907935, 12.70272 ]), array([ -8.0653 , 19.20328 , -31.944175]), array([55.995996, 19.842407, 26.675811]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 54.173949, 6.505508, -16.27533 ]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 49.265878, 17.275875, -40.963937]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 77.946877, 20.707769, -18.710748]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 52.237054, 48.425978, -14.636575]), array([ -8.0653 , 19.20328 , -31.944175]), array([ -8.0653 , 19.20328 , -31.944175]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 4.454994, 51.654279, -5.310949]), array([ -8.0653 , 19.20328 , -31.944175]), array([-14.078617, 60.366031, -27.023514]), array([ -8.0653 , 19.20328 , -31.944175]), array([-21.635537, 52.591846, -40.625765]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 28.610946, 33.291033, -57.766536]), array([ -8.0653 , 19.20328 , -31.944175]), array([ -0.096289, 57.879062, -18.031089]), array([ -8.0653 , 19.20328 , -31.944175]), array([-22.27433 , 30.547326, -39.308739]), array([ -8.0653 , 19.20328 , -31.944175]), array([-66.770666, 19.431384, -4.138797]), array([21.399859, 21.199044, 48.314342]), array([ 23.765633, -21.600569, 45.97906 ]), array([21.399859, 21.199044, 48.314342]), array([-7.680012, 58.825146, -1.913986]), array([21.399859, 21.199044, 48.314342]), array([39.281208, 4.486598, 10.191669]), array([21.399859, 21.199044, 48.314342]), array([25.33148 , 38.587971, 32.110488]), array([21.399859, 21.199044, 48.314342]), array([ 30.412158, 39.619089, -25.426555]), array([21.399859, 21.199044, 48.314342]), array([ 9.534895, 45.586715, -15.697951]), array([21.399859, 21.199044, 48.314342]), array([ 6.077868, 34.161497, 35.327252]), array([21.399859, 21.199044, 48.314342]), array([-23.959151, 52.704826, 22.570164]), array([21.399859, 21.199044, 48.314342]), array([-51.903028, 33.658259, 25.071224]), array([21.399859, 21.199044, 48.314342]), array([-41.261623, 3.156065, 31.680186]), array([21.399859, 21.199044, 48.314342]), array([-33.257143, 25.624607, 48.06079 ]), array([21.399859, 21.199044, 48.314342]), array([55.048683, 36.907935, 12.70272 ]), array([21.399859, 21.199044, 48.314342]), array([55.995996, 19.842407, 26.675811]), array([21.399859, 21.199044, 48.314342]), array([54.133613, 5.459295, 8.870544]), array([21.399859, 21.199044, 48.314342]), array([ 49.265878, 17.275875, -40.963937]), array([21.399859, 21.199044, 48.314342]), array([ 52.237054, 48.425978, -14.636575]), array([21.399859, 21.199044, 48.314342]), array([21.399859, 21.199044, 48.314342]), array([21.399859, 21.199044, 48.314342]), array([16.534061, 2.192421, 40.922159]), array([21.399859, 21.199044, 48.314342]), array([28.761381, 51.960267, -2.848827]), array([21.399859, 21.199044, 48.314342]), array([-10.91018 , 34.40576 , 39.609319]), array([21.399859, 21.199044, 48.314342]), array([ 4.454994, 51.654279, -5.310949]), array([21.399859, 21.199044, 48.314342]), array([-14.078617, 60.366031, -27.023514]), array([21.399859, 21.199044, 48.314342]), array([ -0.096289, 57.879062, -18.031089]), array([21.399859, 21.199044, 48.314342]), array([-66.770666, 19.431384, -4.138797]), array([16.534061, 2.192421, 40.922159]), array([18.273358, -4.266078, 38.071488]), array([16.534061, 2.192421, 40.922159]), array([-7.680012, 58.825146, -1.913986]), array([16.534061, 2.192421, 40.922159]), array([39.281208, 4.486598, 10.191669]), array([16.534061, 2.192421, 40.922159]), array([25.33148 , 38.587971, 32.110488]), array([16.534061, 2.192421, 40.922159]), array([ 30.412158, 39.619089, -25.426555]), array([16.534061, 2.192421, 40.922159]), array([ 9.534895, 45.586715, -15.697951]), array([16.534061, 2.192421, 40.922159]), array([ 6.077868, 34.161497, 35.327252]), array([16.534061, 2.192421, 40.922159]), array([-23.959151, 52.704826, 22.570164]), array([16.534061, 2.192421, 40.922159]), array([-51.903028, 33.658259, 25.071224]), array([16.534061, 2.192421, 40.922159]), array([-41.261623, 3.156065, 31.680186]), array([16.534061, 2.192421, 40.922159]), array([-33.257143, 25.624607, 48.06079 ]), array([16.534061, 2.192421, 40.922159]), array([55.048683, 36.907935, 12.70272 ]), array([16.534061, 2.192421, 40.922159]), array([55.995996, 19.842407, 26.675811]), array([16.534061, 2.192421, 40.922159]), array([54.133613, 5.459295, 8.870544]), array([16.534061, 2.192421, 40.922159]), array([ 49.265878, 17.275875, -40.963937]), array([16.534061, 2.192421, 40.922159]), array([ 52.237054, 48.425978, -14.636575]), array([16.534061, 2.192421, 40.922159]), array([21.399859, 21.199044, 48.314342]), array([16.534061, 2.192421, 40.922159]), array([16.534061, 2.192421, 40.922159]), array([16.534061, 2.192421, 40.922159]), array([28.761381, 51.960267, -2.848827]), array([16.534061, 2.192421, 40.922159]), array([-10.91018 , 34.40576 , 39.609319]), array([16.534061, 2.192421, 40.922159]), array([ 4.454994, 51.654279, -5.310949]), array([16.534061, 2.192421, 40.922159]), array([-14.078617, 60.366031, -27.023514]), array([16.534061, 2.192421, 40.922159]), array([ -0.096289, 57.879062, -18.031089]), array([16.534061, 2.192421, 40.922159]), array([-66.770666, 19.431384, -4.138797]), array([28.761381, 51.960267, -2.848827]), array([39.281208, 4.486598, 10.191669]), array([28.761381, 51.960267, -2.848827]), array([ 30.412158, 39.619089, -25.426555]), array([28.761381, 51.960267, -2.848827]), array([ 9.534895, 45.586715, -15.697951]), array([28.761381, 51.960267, -2.848827]), array([ 6.077868, 34.161497, 35.327252]), array([28.761381, 51.960267, -2.848827]), array([-23.959151, 52.704826, 22.570164]), array([28.761381, 51.960267, -2.848827]), array([-51.903028, 33.658259, 25.071224]), array([28.761381, 51.960267, -2.848827]), array([-41.261623, 3.156065, 31.680186]), array([28.761381, 51.960267, -2.848827]), array([-33.257143, 25.624607, 48.06079 ]), array([28.761381, 51.960267, -2.848827]), array([55.048683, 36.907935, 12.70272 ]), array([28.761381, 51.960267, -2.848827]), array([55.995996, 19.842407, 26.675811]), array([28.761381, 51.960267, -2.848827]), array([ 49.265878, 17.275875, -40.963937]), array([28.761381, 51.960267, -2.848827]), array([ -8.0653 , 19.20328 , -31.944175]), array([28.761381, 51.960267, -2.848827]), array([21.399859, 21.199044, 48.314342]), array([28.761381, 51.960267, -2.848827]), array([16.534061, 2.192421, 40.922159]), array([28.761381, 51.960267, -2.848827]), array([28.761381, 51.960267, -2.848827]), array([28.761381, 51.960267, -2.848827]), array([-10.91018 , 34.40576 , 39.609319]), array([28.761381, 51.960267, -2.848827]), array([ 4.454994, 51.654279, -5.310949]), array([28.761381, 51.960267, -2.848827]), array([-14.078617, 60.366031, -27.023514]), array([28.761381, 51.960267, -2.848827]), array([-66.770666, 19.431384, -4.138797]), array([-10.91018 , 34.40576 , 39.609319]), array([ -6.551567, -40.92204 , 34.412733]), array([-10.91018 , 34.40576 , 39.609319]), array([ 37.054464, 40.364252, -30.482399]), array([-10.91018 , 34.40576 , 39.609319]), array([ 30.412158, 39.619089, -25.426555]), array([-10.91018 , 34.40576 , 39.609319]), array([ 9.534895, 45.586715, -15.697951]), array([-10.91018 , 34.40576 , 39.609319]), array([ 6.077868, 34.161497, 35.327252]), array([-10.91018 , 34.40576 , 39.609319]), array([-23.959151, 52.704826, 22.570164]), array([-10.91018 , 34.40576 , 39.609319]), array([-51.903028, 33.658259, 25.071224]), array([-10.91018 , 34.40576 , 39.609319]), array([-33.257143, 25.624607, 48.06079 ]), array([-10.91018 , 34.40576 , 39.609319]), array([55.048683, 36.907935, 12.70272 ]), array([-10.91018 , 34.40576 , 39.609319]), array([21.399859, 21.199044, 48.314342]), array([-10.91018 , 34.40576 , 39.609319]), array([16.534061, 2.192421, 40.922159]), array([-10.91018 , 34.40576 , 39.609319]), array([-10.91018 , 34.40576 , 39.609319]), array([-10.91018 , 34.40576 , 39.609319]), array([ 4.454994, 51.654279, -5.310949]), array([ 4.454994, 51.654279, -5.310949]), array([39.281208, 4.486598, 10.191669]), array([ 4.454994, 51.654279, -5.310949]), array([ 37.054464, 40.364252, -30.482399]), array([ 4.454994, 51.654279, -5.310949]), array([ 9.534895, 45.586715, -15.697951]), array([ 4.454994, 51.654279, -5.310949]), array([ 6.077868, 34.161497, 35.327252]), array([ 4.454994, 51.654279, -5.310949]), array([-23.959151, 52.704826, 22.570164]), array([ 4.454994, 51.654279, -5.310949]), array([-51.903028, 33.658259, 25.071224]), array([ 4.454994, 51.654279, -5.310949]), array([55.048683, 36.907935, 12.70272 ]), array([ 4.454994, 51.654279, -5.310949]), array([28.761381, 51.960267, -2.848827]), array([ 4.454994, 51.654279, -5.310949]), array([-10.91018 , 34.40576 , 39.609319]), array([ 4.454994, 51.654279, -5.310949]), array([ 4.454994, 51.654279, -5.310949]), array([-14.078617, 60.366031, -27.023514]), array([-9.810758, 42.258358, -0.196899]), array([-14.078617, 60.366031, -27.023514]), array([-7.680012, 58.825146, -1.913986]), array([-14.078617, 60.366031, -27.023514]), array([ 7.671771, 16.535084, -32.110169]), array([-14.078617, 60.366031, -27.023514]), array([39.281208, 4.486598, 10.191669]), array([-14.078617, 60.366031, -27.023514]), array([-11.349411, 1.901778, 21.476145]), array([-14.078617, 60.366031, -27.023514]), array([ 28.220495, 8.508825, -31.633256]), array([-14.078617, 60.366031, -27.023514]), array([25.33148 , 38.587971, 32.110488]), array([-14.078617, 60.366031, -27.023514]), array([ 30.412158, 39.619089, -25.426555]), array([-14.078617, 60.366031, -27.023514]), array([ 9.534895, 45.586715, -15.697951]), array([-14.078617, 60.366031, -27.023514]), array([-23.959151, 52.704826, 22.570164]), array([-14.078617, 60.366031, -27.023514]), array([-51.903028, 33.658259, 25.071224]), array([-14.078617, 60.366031, -27.023514]), array([-41.261623, 3.156065, 31.680186]), array([-14.078617, 60.366031, -27.023514]), array([-33.257143, 25.624607, 48.06079 ]), array([-14.078617, 60.366031, -27.023514]), array([55.048683, 36.907935, 12.70272 ]), array([-14.078617, 60.366031, -27.023514]), array([55.995996, 19.842407, 26.675811]), array([-14.078617, 60.366031, -27.023514]), array([ 54.173949, 6.505508, -16.27533 ]), array([-14.078617, 60.366031, -27.023514]), array([ 49.265878, 17.275875, -40.963937]), array([-14.078617, 60.366031, -27.023514]), array([ 77.946877, 20.707769, -18.710748]), array([-14.078617, 60.366031, -27.023514]), array([ -8.0653 , 19.20328 , -31.944175]), array([-14.078617, 60.366031, -27.023514]), array([-14.078617, 60.366031, -27.023514]), array([-14.078617, 60.366031, -27.023514]), array([-21.635537, 52.591846, -40.625765]), array([-14.078617, 60.366031, -27.023514]), array([ 28.610946, 33.291033, -57.766536]), array([-14.078617, 60.366031, -27.023514]), array([ -0.096289, 57.879062, -18.031089]), array([-14.078617, 60.366031, -27.023514]), array([-22.27433 , 30.547326, -39.308739]), array([-14.078617, 60.366031, -27.023514]), array([-60.66705 , 12.165386, -6.554734]), array([-14.078617, 60.366031, -27.023514]), array([-66.770666, 19.431384, -4.138797]), array([-21.635537, 52.591846, -40.625765]), array([ 7.671771, 16.535084, -32.110169]), array([-21.635537, 52.591846, -40.625765]), array([25.33148 , 38.587971, 32.110488]), array([-21.635537, 52.591846, -40.625765]), array([ 9.534895, 45.586715, -15.697951]), array([-21.635537, 52.591846, -40.625765]), array([-23.959151, 52.704826, 22.570164]), array([-21.635537, 52.591846, -40.625765]), array([-51.903028, 33.658259, 25.071224]), array([-21.635537, 52.591846, -40.625765]), array([-33.257143, 25.624607, 48.06079 ]), array([-21.635537, 52.591846, -40.625765]), array([ 49.265878, 17.275875, -40.963937]), array([-21.635537, 52.591846, -40.625765]), array([ 52.237054, 48.425978, -14.636575]), array([-21.635537, 52.591846, -40.625765]), array([ -8.0653 , 19.20328 , -31.944175]), array([-21.635537, 52.591846, -40.625765]), array([-14.078617, 60.366031, -27.023514]), array([-21.635537, 52.591846, -40.625765]), array([-21.635537, 52.591846, -40.625765]), array([-21.635537, 52.591846, -40.625765]), array([ 28.610946, 33.291033, -57.766536]), array([-21.635537, 52.591846, -40.625765]), array([ -0.096289, 57.879062, -18.031089]), array([-21.635537, 52.591846, -40.625765]), array([-22.27433 , 30.547326, -39.308739]), array([-21.635537, 52.591846, -40.625765]), array([-66.770666, 19.431384, -4.138797]), array([ 28.610946, 33.291033, -57.766536]), array([-9.810758, 42.258358, -0.196899]), array([ 28.610946, 33.291033, -57.766536]), array([-7.680012, 58.825146, -1.913986]), array([ 28.610946, 33.291033, -57.766536]), array([ 7.671771, 16.535084, -32.110169]), array([ 28.610946, 33.291033, -57.766536]), array([39.281208, 4.486598, 10.191669]), array([ 28.610946, 33.291033, -57.766536]), array([-33.137736, 10.478931, -5.472519]), array([ 28.610946, 33.291033, -57.766536]), array([ 28.220495, 8.508825, -31.633256]), array([ 28.610946, 33.291033, -57.766536]), array([ 30.412158, 39.619089, -25.426555]), array([ 28.610946, 33.291033, -57.766536]), array([ 9.534895, 45.586715, -15.697951]), array([ 28.610946, 33.291033, -57.766536]), array([-23.959151, 52.704826, 22.570164]), array([ 28.610946, 33.291033, -57.766536]), array([55.048683, 36.907935, 12.70272 ]), array([ 28.610946, 33.291033, -57.766536]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 28.610946, 33.291033, -57.766536]), array([ 49.265878, 17.275875, -40.963937]), array([ 28.610946, 33.291033, -57.766536]), array([ 77.946877, 20.707769, -18.710748]), array([ 28.610946, 33.291033, -57.766536]), array([ 52.237054, 48.425978, -14.636575]), array([ 28.610946, 33.291033, -57.766536]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 28.610946, 33.291033, -57.766536]), array([-14.078617, 60.366031, -27.023514]), array([ 28.610946, 33.291033, -57.766536]), array([-21.635537, 52.591846, -40.625765]), array([ 28.610946, 33.291033, -57.766536]), array([ -0.096289, 57.879062, -18.031089]), array([ 28.610946, 33.291033, -57.766536]), array([-22.27433 , 30.547326, -39.308739]), array([ -0.096289, 57.879062, -18.031089]), array([-9.810758, 42.258358, -0.196899]), array([ -0.096289, 57.879062, -18.031089]), array([-7.680012, 58.825146, -1.913986]), array([ -0.096289, 57.879062, -18.031089]), array([ 7.671771, 16.535084, -32.110169]), array([ -0.096289, 57.879062, -18.031089]), array([-11.349411, 1.901778, 21.476145]), array([ -0.096289, 57.879062, -18.031089]), array([25.33148 , 38.587971, 32.110488]), array([ -0.096289, 57.879062, -18.031089]), array([ 30.412158, 39.619089, -25.426555]), array([ -0.096289, 57.879062, -18.031089]), array([-23.959151, 52.704826, 22.570164]), array([ -0.096289, 57.879062, -18.031089]), array([-51.903028, 33.658259, 25.071224]), array([ -0.096289, 57.879062, -18.031089]), array([-33.257143, 25.624607, 48.06079 ]), array([ -0.096289, 57.879062, -18.031089]), array([55.048683, 36.907935, 12.70272 ]), array([ -0.096289, 57.879062, -18.031089]), array([55.995996, 19.842407, 26.675811]), array([ -0.096289, 57.879062, -18.031089]), array([ 49.265878, 17.275875, -40.963937]), array([ -0.096289, 57.879062, -18.031089]), array([ 77.946877, 20.707769, -18.710748]), array([ -0.096289, 57.879062, -18.031089]), array([ 52.237054, 48.425978, -14.636575]), array([ -0.096289, 57.879062, -18.031089]), array([ -8.0653 , 19.20328 , -31.944175]), array([ -0.096289, 57.879062, -18.031089]), array([21.399859, 21.199044, 48.314342]), array([ -0.096289, 57.879062, -18.031089]), array([-14.078617, 60.366031, -27.023514]), array([ -0.096289, 57.879062, -18.031089]), array([-21.635537, 52.591846, -40.625765]), array([ -0.096289, 57.879062, -18.031089]), array([ 28.610946, 33.291033, -57.766536]), array([ -0.096289, 57.879062, -18.031089]), array([ -0.096289, 57.879062, -18.031089]), array([ -0.096289, 57.879062, -18.031089]), array([-22.27433 , 30.547326, -39.308739]), array([ -0.096289, 57.879062, -18.031089]), array([-66.770666, 19.431384, -4.138797]), array([-22.27433 , 30.547326, -39.308739]), array([-9.810758, 42.258358, -0.196899]), array([-22.27433 , 30.547326, -39.308739]), array([-7.680012, 58.825146, -1.913986]), array([-22.27433 , 30.547326, -39.308739]), array([ 7.671771, 16.535084, -32.110169]), array([-22.27433 , 30.547326, -39.308739]), array([39.281208, 4.486598, 10.191669]), array([-22.27433 , 30.547326, -39.308739]), array([-11.349411, 1.901778, 21.476145]), array([-22.27433 , 30.547326, -39.308739]), array([-33.137736, 10.478931, -5.472519]), array([-22.27433 , 30.547326, -39.308739]), array([ 28.220495, 8.508825, -31.633256]), array([-22.27433 , 30.547326, -39.308739]), array([25.33148 , 38.587971, 32.110488]), array([-22.27433 , 30.547326, -39.308739]), array([ 30.412158, 39.619089, -25.426555]), array([-22.27433 , 30.547326, -39.308739]), array([ 9.534895, 45.586715, -15.697951]), array([-22.27433 , 30.547326, -39.308739]), array([-23.959151, 52.704826, 22.570164]), array([-22.27433 , 30.547326, -39.308739]), array([-51.903028, 33.658259, 25.071224]), array([-22.27433 , 30.547326, -39.308739]), array([-33.257143, 25.624607, 48.06079 ]), array([-22.27433 , 30.547326, -39.308739]), array([55.048683, 36.907935, 12.70272 ]), array([-22.27433 , 30.547326, -39.308739]), array([55.995996, 19.842407, 26.675811]), array([-22.27433 , 30.547326, -39.308739]), array([ 54.173949, 6.505508, -16.27533 ]), array([-22.27433 , 30.547326, -39.308739]), array([ 49.265878, 17.275875, -40.963937]), array([-22.27433 , 30.547326, -39.308739]), array([ 77.946877, 20.707769, -18.710748]), array([-22.27433 , 30.547326, -39.308739]), array([ 52.237054, 48.425978, -14.636575]), array([-22.27433 , 30.547326, -39.308739]), array([ -8.0653 , 19.20328 , -31.944175]), array([-22.27433 , 30.547326, -39.308739]), array([ 4.454994, 51.654279, -5.310949]), array([-22.27433 , 30.547326, -39.308739]), array([-14.078617, 60.366031, -27.023514]), array([-22.27433 , 30.547326, -39.308739]), array([-21.635537, 52.591846, -40.625765]), array([-22.27433 , 30.547326, -39.308739]), array([ 28.610946, 33.291033, -57.766536]), array([-22.27433 , 30.547326, -39.308739]), array([ -0.096289, 57.879062, -18.031089]), array([-22.27433 , 30.547326, -39.308739]), array([-22.27433 , 30.547326, -39.308739]), array([-22.27433 , 30.547326, -39.308739]), array([-66.770666, 19.431384, -4.138797]), array([-60.66705 , 12.165386, -6.554734]), array([-70.449382, -12.870265, -11.423195]), array([-60.66705 , 12.165386, -6.554734]), array([ 7.671771, 16.535084, -32.110169]), array([-60.66705 , 12.165386, -6.554734]), array([-23.959151, 52.704826, 22.570164]), array([-60.66705 , 12.165386, -6.554734]), array([-51.903028, 33.658259, 25.071224]), array([-60.66705 , 12.165386, -6.554734]), array([ -8.0653 , 19.20328 , -31.944175]), array([-60.66705 , 12.165386, -6.554734]), array([-14.078617, 60.366031, -27.023514]), array([-60.66705 , 12.165386, -6.554734]), array([ -0.096289, 57.879062, -18.031089]), array([-60.66705 , 12.165386, -6.554734]), array([-60.66705 , 12.165386, -6.554734]), array([-60.66705 , 12.165386, -6.554734]), array([-66.770666, 19.431384, -4.138797]), array([-66.770666, 19.431384, -4.138797]), array([-68.477071, -22.67342 , -1.619763]), array([-66.770666, 19.431384, -4.138797]), array([ 7.671771, 16.535084, -32.110169]), array([-66.770666, 19.431384, -4.138797]), array([39.281208, 4.486598, 10.191669]), array([-66.770666, 19.431384, -4.138797]), array([ 28.220495, 8.508825, -31.633256]), array([-66.770666, 19.431384, -4.138797]), array([25.33148 , 38.587971, 32.110488]), array([-66.770666, 19.431384, -4.138797]), array([ 30.412158, 39.619089, -25.426555]), array([-66.770666, 19.431384, -4.138797]), array([ 9.534895, 45.586715, -15.697951]), array([-66.770666, 19.431384, -4.138797]), array([-23.959151, 52.704826, 22.570164]), array([-66.770666, 19.431384, -4.138797]), array([-51.903028, 33.658259, 25.071224]), array([-66.770666, 19.431384, -4.138797]), array([-41.261623, 3.156065, 31.680186]), array([-66.770666, 19.431384, -4.138797]), array([-33.257143, 25.624607, 48.06079 ]), array([-66.770666, 19.431384, -4.138797]), array([55.048683, 36.907935, 12.70272 ]), array([-66.770666, 19.431384, -4.138797]), array([55.995996, 19.842407, 26.675811]), array([-66.770666, 19.431384, -4.138797]), array([ 49.265878, 17.275875, -40.963937]), array([-66.770666, 19.431384, -4.138797]), array([ 77.946877, 20.707769, -18.710748]), array([-66.770666, 19.431384, -4.138797]), array([ 52.237054, 48.425978, -14.636575]), array([-66.770666, 19.431384, -4.138797]), array([ -8.0653 , 19.20328 , -31.944175]), array([-66.770666, 19.431384, -4.138797]), array([21.399859, 21.199044, 48.314342]), array([-66.770666, 19.431384, -4.138797]), array([16.534061, 2.192421, 40.922159]), array([-66.770666, 19.431384, -4.138797]), array([28.761381, 51.960267, -2.848827]), array([-66.770666, 19.431384, -4.138797]), array([-14.078617, 60.366031, -27.023514]), array([-66.770666, 19.431384, -4.138797]), array([-21.635537, 52.591846, -40.625765]), array([-66.770666, 19.431384, -4.138797]), array([ 28.610946, 33.291033, -57.766536]), array([-66.770666, 19.431384, -4.138797]), array([ -0.096289, 57.879062, -18.031089]), array([-66.770666, 19.431384, -4.138797]), array([-22.27433 , 30.547326, -39.308739]), array([-66.770666, 19.431384, -4.138797]), array([-60.66705 , 12.165386, -6.554734]), array([-66.770666, 19.431384, -4.138797]), array([-66.770666, 19.431384, -4.138797])]\n", + "edges_coords [[ -9.885591 -47.084818 -3.13936 ]\n", + " [ -9.885591 -47.084818 -3.13936 ]\n", + " [ -9.885591 -47.084818 -3.13936 ]\n", + " ...\n", + " [-60.66705 12.165386 -6.554734]\n", + " [-66.770666 19.431384 -4.138797]\n", + " [-66.770666 19.431384 -4.138797]]\n" ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ee27297579f643a68153bcf018bffb97", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "ConnectivityWidget(children=(VBox(children=(HTML(value='

Connectivity - 76

'), HBox(children=(Checkbox(…" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -57,10 +91,44 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "metadata": {}, - "outputs": [], - "source": [] + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "

Connectivity

\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
value
Number of connections
1560
Number of regions
76
Undirected
False
areas
 [min, median, max] = [0, 2580.89, 10338.2] dtype = float64 shape = (76,)
tract_lengths
 [min, median, max] = [0, 71.6635, 153.486] dtype = float64 shape = (76, 76)
tract_lengths (connections)
 [min, median, max] = [0, 55.8574, 138.454] dtype = float64 shape = (1560,)
tract_lengths-non-zero
 [min, median, max] = [4.93328, 74.0646, 153.486] dtype = float64 shape = (5402,)
weights
 [min, median, max] = [0, 0, 3] dtype = float64 shape = (76, 76)
weights-non-zero
 [min, median, max] = [0.00462632, 2, 3] dtype = float64 shape = (1560,)
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# replace None in the method below with the gid of the connectivity you wish to export\n", + "# if no gid is provided it will export the connectivity currently viewed\n", + "\n", + "new_connectivity = wid.get_connectivity(gid=None) \n", + "new_connectivity" + ] }, { "cell_type": "code", diff --git a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py index b7ee63ee..cc319875 100644 --- a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py +++ b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py @@ -116,10 +116,8 @@ def __init__(self, **kwargs): def init_view_connectivity(self): self.output.plotter.clear() - points, edges, labels = self.add_actors() + points, edges = self.add_actors() points_toggle, edges_toggle, labels_toggle = self._init_controls() - if not labels_toggle.value: - self.output.hide_actor(labels) def on_change_points(change): if change['new']: @@ -139,15 +137,6 @@ def on_change_edges(change): edges_toggle.observe(on_change_edges, 'value') - def on_change_labels(change): - if change['new']: - self.output.display_actor(labels) - else: - self.output.hide_actor(labels) - self.output.update_plot() - - labels_toggle.observe(on_change_labels, 'value') - window_controls = self.output.get_window_controls() self.children = [ @@ -177,9 +166,6 @@ def add_actors(self): mesh_points = pv.PolyData(points) - labels = CONTEXT.connectivity.region_labels - labels_actor = plotter.add_point_labels(points, labels) - points_color = self.output.CONFIG.points_color points_size = self.output.CONFIG.point_size edge_color = self.output.CONFIG.edge_color @@ -187,11 +173,10 @@ def add_actors(self): points_actor = plotter.add_points(mesh_points, color=points_color, point_size=points_size) edges_coords = self._extract_edges() - edges_actor = plotter.add_lines(edges_coords, color=edge_color, width=1) plotter.camera_position = 'xy' - return points_actor, edges_actor, labels_actor + return points_actor, edges_actor def _extract_edges(self): connectivity = CONTEXT.connectivity diff --git a/tvbwidgets/ui/connectivity_ipy/operations.py b/tvbwidgets/ui/connectivity_ipy/operations.py index 3bce1ed7..7bab013d 100644 --- a/tvbwidgets/ui/connectivity_ipy/operations.py +++ b/tvbwidgets/ui/connectivity_ipy/operations.py @@ -192,7 +192,7 @@ def _cut_connectivity_edges(self, interest_areas, selected=False): if i not in interest_areas or j not in interest_areas: if not selected: new_weights[i][j] = 0 - elif i in interest_areas or j in interest_areas and selected: + elif selected: new_weights[i][j] = 0 final_conn = Connectivity() From 2264df74c89ee921dc22e330c94ada7bad276b24 Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Thu, 14 Sep 2023 18:13:55 +0300 Subject: [PATCH 21/24] WID-223: cut selcted/unselected nodes, refactor encapsulation --- notebooks/Connectivity.ipynb | 33 ++------ .../connectivity_ipy/connectivity_widget.py | 21 ++--- tvbwidgets/ui/connectivity_ipy/operations.py | 79 +++++++++++++------ 3 files changed, 74 insertions(+), 59 deletions(-) diff --git a/notebooks/Connectivity.ipynb b/notebooks/Connectivity.ipynb index 08d33483..d57d1fe0 100644 --- a/notebooks/Connectivity.ipynb +++ b/notebooks/Connectivity.ipynb @@ -34,35 +34,18 @@ "name": "stdout", "output_type": "stream", "text": [ - "14-09-2023 04:28:58 - DEBUG - tvbwidgets - Package is not fully installed\n", - "14-09-2023 04:28:58 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", - "14-09-2023 04:28:58 - INFO - tvbwidgets - Version: 1.5.0\n", - "2023-09-14 16:29:04,296 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", - "14-09-2023 04:29:04 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", - "2023-09-14 16:29:04,405 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n", - "connectivity.weights: [[2. 2. 0. ... 0. 0. 0.]\n", - " [3. 2. 0. ... 0. 0. 0.]\n", - " [0. 0. 2. ... 0. 0. 0.]\n", - " ...\n", - " [0. 0. 0. ... 2. 2. 0.]\n", - " [0. 0. 0. ... 3. 2. 0.]\n", - " [0. 0. 0. ... 0. 0. 0.]]\n", - "edge_indices: (array([ 0, 0, 0, ..., 74, 74, 74], dtype=int64), array([ 0, 1, 3, ..., 72, 73, 74], dtype=int64))\n", - "edges: [(0, 0), (0, 1), (0, 3), (0, 6), (0, 10), (0, 11), (0, 18), (0, 20), (0, 21), (0, 24), (0, 30), (0, 33), (0, 34), (1, 0), (1, 1), (1, 7), (1, 13), (1, 14), (1, 15), (1, 16), (1, 17), (1, 21), (1, 22), (1, 23), (1, 24), (1, 25), (1, 30), (1, 33), (1, 34), (2, 2), (2, 24), (2, 30), (2, 31), (2, 32), (2, 34), (2, 40), (3, 0), (3, 2), (3, 3), (3, 4), (3, 6), (3, 7), (3, 8), (3, 9), (3, 10), (3, 11), (3, 12), (3, 14), (3, 15), (3, 16), (3, 17), (3, 18), (3, 19), (3, 20), (3, 21), (3, 22), (3, 23), (3, 24), (3, 25), (3, 26), (3, 27), (3, 29), (3, 32), (3, 34), (3, 36), (3, 41), (4, 0), (4, 1), (4, 3), (4, 4), (4, 5), (4, 6), (4, 7), (4, 11), (4, 12), (4, 14), (4, 15), (4, 16), (4, 17), (4, 20), (4, 21), (4, 22), (4, 24), (4, 28), (4, 29), (4, 30), (4, 33), (4, 34), (4, 36), (4, 42), (5, 4), (5, 13), (5, 14), (5, 15), (5, 16), (5, 17), (5, 18), (5, 43), (6, 0), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6), (6, 9), (6, 10), (6, 11), (6, 16), (6, 17), (6, 18), (6, 20), (6, 21), (6, 22), (6, 23), (6, 24), (6, 30), (6, 32), (6, 33), (6, 34), (6, 36), (6, 44), (7, 0), (7, 1), (7, 3), (7, 4), (7, 5), (7, 7), (7, 10), (7, 11), (7, 13), (7, 14), (7, 15), (7, 16), (7, 17), (7, 20), (7, 21), (7, 22), (7, 23), (7, 24), (7, 25), (7, 26), (7, 28), (7, 30), (7, 32), (7, 33), (7, 36), (7, 45), (8, 3), (8, 4), (8, 8), (8, 10), (8, 11), (8, 13), (8, 14), (8, 17), (8, 21), (8, 22), (8, 25), (8, 26), (8, 28), (8, 29), (9, 24), (10, 0), (10, 1), (10, 2), (10, 3), (10, 4), (10, 5), (10, 6), (10, 7), (10, 9), (10, 10), (10, 11), (10, 13), (10, 14), (10, 15), (10, 16), (10, 17), (10, 18), (10, 20), (10, 21), (10, 22), (10, 23), (10, 24), (10, 25), (10, 27), (10, 28), (10, 29), (10, 32), (10, 33), (10, 34), (10, 36), (11, 2), (11, 3), (11, 5), (11, 6), (11, 9), (11, 10), (11, 11), (11, 13), (11, 14), (11, 15), (11, 16), (11, 17), (11, 18), (11, 20), (11, 21), (11, 23), (11, 24), (11, 25), (11, 27), (11, 28), (11, 29), (11, 32), (11, 34), (11, 36), (12, 3), (12, 4), (12, 10), (12, 11), (12, 12), (12, 14), (12, 15), (12, 16), (12, 21), (12, 22), (12, 25), (12, 26), (12, 27), (12, 28), (12, 29), (12, 30), (12, 36), (12, 50), (13, 1), (13, 2), (13, 3), (13, 4), (13, 5), (13, 7), (13, 8), (13, 10), (13, 11), (13, 13), (13, 14), (13, 15), (13, 16), (13, 18), (13, 23), (13, 24), (13, 25), (13, 26), (13, 27), (13, 28), (13, 29), (13, 30), (13, 31), (13, 32), (13, 33), (13, 34), (13, 36), (14, 1), (14, 2), (14, 3), (14, 4), (14, 5), (14, 7), (14, 8), (14, 10), (14, 11), (14, 12), (14, 13), (14, 14), (14, 15), (14, 16), (14, 17), (14, 18), (14, 23), (14, 24), (14, 25), (14, 26), (14, 27), (14, 28), (14, 29), (14, 30), (14, 31), (14, 32), (14, 33), (14, 34), (14, 35), (14, 36), (15, 3), (15, 4), (15, 5), (15, 7), (15, 10), (15, 11), (15, 12), (15, 13), (15, 14), (15, 15), (15, 16), (15, 17), (15, 18), (15, 21), (15, 23), (15, 24), (15, 25), (15, 26), (15, 30), (15, 33), (15, 34), (15, 36), (15, 53), (16, 2), (16, 3), (16, 4), (16, 5), (16, 6), (16, 7), (16, 10), (16, 11), (16, 12), (16, 13), (16, 14), (16, 15), (16, 16), (16, 17), (16, 18), (16, 21), (16, 22), (16, 23), (16, 24), (16, 25), (16, 26), (16, 27), (16, 28), (16, 30), (16, 31), (16, 33), (16, 34), (16, 35), (16, 36), (16, 54), (17, 1), (17, 3), (17, 4), (17, 5), (17, 6), (17, 7), (17, 10), (17, 11), (17, 13), (17, 14), (17, 15), (17, 16), (17, 17), (17, 18), (17, 19), (17, 20), (17, 21), (17, 22), (17, 23), (17, 24), (17, 25), (17, 26), (17, 27), (17, 28), (17, 29), (17, 30), (17, 33), (17, 36), (17, 55), (18, 3), (18, 4), (18, 5), (18, 6), (18, 7), (18, 10), (18, 11), (18, 13), (18, 14), (18, 16), (18, 17), (18, 18), (18, 19), (18, 20), (18, 21), (18, 22), (18, 23), (18, 24), (18, 25), (18, 26), (18, 27), (18, 29), (18, 30), (18, 31), (18, 32), (18, 33), (18, 34), (18, 36), (18, 56), (19, 3), (19, 57), (20, 0), (20, 1), (20, 2), (20, 3), (20, 4), (20, 5), (20, 6), (20, 9), (20, 10), (20, 11), (20, 16), (20, 17), (20, 18), (20, 20), (20, 21), (20, 22), (20, 24), (20, 30), (20, 32), (20, 33), (20, 34), (20, 36), (20, 58), (21, 0), (21, 1), (21, 2), (21, 3), (21, 4), (21, 5), (21, 6), (21, 7), (21, 9), (21, 10), (21, 11), (21, 13), (21, 14), (21, 16), (21, 17), (21, 18), (21, 20), (21, 21), (21, 22), (21, 23), (21, 24), (21, 25), (21, 26), (21, 27), (21, 28), (21, 29), (21, 30), (21, 31), (21, 32), (21, 33), (21, 34), (21, 36), (22, 1), (22, 3), (22, 5), (22, 6), (22, 10), (22, 11), (22, 13), (22, 14), (22, 16), (22, 17), (22, 18), (22, 20), (22, 21), (22, 22), (22, 23), (22, 24), (22, 25), (22, 26), (22, 27), (22, 28), (22, 29), (22, 30), (22, 31), (22, 32), (22, 33), (22, 34), (22, 36), (22, 60), (23, 0), (23, 1), (23, 3), (23, 4), (23, 6), (23, 7), (23, 10), (23, 11), (23, 13), (23, 14), (23, 15), (23, 16), (23, 17), (23, 18), (23, 20), (23, 21), (23, 22), (23, 23), (23, 24), (23, 25), (23, 26), (23, 27), (23, 29), (23, 30), (23, 31), (23, 32), (23, 33), (23, 34), (23, 36), (24, 0), (24, 1), (24, 2), (24, 3), (24, 4), (24, 5), (24, 6), (24, 7), (24, 9), (24, 10), (24, 11), (24, 13), (24, 14), (24, 16), (24, 17), (24, 18), (24, 20), (24, 21), (24, 22), (24, 23), (24, 24), (24, 29), (24, 30), (24, 31), (24, 32), (24, 33), (24, 34), (24, 36), (25, 1), (25, 3), (25, 7), (25, 10), (25, 11), (25, 12), (25, 13), (25, 14), (25, 15), (25, 16), (25, 17), (25, 18), (25, 19), (25, 21), (25, 23), (25, 25), (25, 26), (25, 27), (25, 28), (25, 29), (25, 30), (25, 33), (25, 36), (25, 63), (26, 1), (26, 3), (26, 7), (26, 10), (26, 11), (26, 12), (26, 13), (26, 14), (26, 15), (26, 16), (26, 17), (26, 18), (26, 19), (26, 21), (26, 23), (26, 25), (26, 26), (26, 27), (26, 28), (26, 29), (26, 30), (26, 33), (26, 36), (26, 64), (27, 3), (27, 10), (27, 11), (27, 12), (27, 13), (27, 14), (27, 15), (27, 16), (27, 17), (27, 18), (27, 21), (27, 24), (27, 25), (27, 26), (27, 27), (27, 28), (27, 29), (27, 30), (27, 36), (28, 8), (28, 10), (28, 11), (28, 12), (28, 13), (28, 14), (28, 16), (28, 17), (28, 25), (28, 26), (28, 28), (28, 29), (28, 66), (29, 3), (29, 8), (29, 11), (29, 12), (29, 13), (29, 14), (29, 17), (29, 27), (29, 28), (29, 29), (30, 0), (30, 1), (30, 2), (30, 3), (30, 4), (30, 6), (30, 7), (30, 10), (30, 11), (30, 13), (30, 14), (30, 15), (30, 16), (30, 17), (30, 18), (30, 20), (30, 21), (30, 22), (30, 24), (30, 30), (30, 31), (30, 32), (30, 33), (30, 34), (30, 35), (30, 36), (31, 2), (31, 7), (31, 11), (31, 13), (31, 14), (31, 16), (31, 21), (31, 23), (31, 24), (31, 30), (31, 31), (31, 32), (31, 33), (31, 34), (31, 36), (32, 0), (32, 1), (32, 2), (32, 3), (32, 5), (32, 6), (32, 10), (32, 11), (32, 13), (32, 17), (32, 20), (32, 21), (32, 22), (32, 23), (32, 24), (32, 30), (32, 31), (32, 33), (32, 34), (33, 0), (33, 1), (33, 2), (33, 4), (33, 7), (33, 10), (33, 13), (33, 14), (33, 16), (33, 17), (33, 18), (33, 21), (33, 22), (33, 23), (33, 24), (33, 25), (33, 30), (33, 31), (33, 32), (33, 33), (33, 34), (33, 36), (34, 0), (34, 1), (34, 2), (34, 3), (34, 4), (34, 5), (34, 6), (34, 7), (34, 10), (34, 11), (34, 13), (34, 14), (34, 16), (34, 17), (34, 18), (34, 20), (34, 21), (34, 22), (34, 23), (34, 24), (34, 29), (34, 30), (34, 31), (34, 32), (34, 33), (34, 34), (34, 36), (35, 2), (35, 13), (35, 14), (35, 24), (35, 30), (35, 33), (35, 35), (35, 36), (35, 73), (36, 2), (36, 3), (36, 6), (36, 7), (36, 10), (36, 11), (36, 13), (36, 14), (36, 15), (36, 16), (36, 17), (36, 18), (36, 21), (36, 22), (36, 23), (36, 24), (36, 25), (36, 26), (36, 27), (36, 30), (36, 31), (36, 32), (36, 33), (36, 34), (36, 35), (36, 36), (36, 74), (38, 38), (38, 39), (38, 41), (38, 44), (38, 48), (38, 49), (38, 56), (38, 58), (38, 59), (38, 62), (38, 68), (38, 71), (38, 72), (39, 38), (39, 39), (39, 45), (39, 51), (39, 52), (39, 53), (39, 54), (39, 55), (39, 59), (39, 60), (39, 61), (39, 62), (39, 63), (39, 68), (39, 71), (39, 72), (40, 2), (40, 40), (40, 62), (40, 68), (40, 69), (40, 70), (40, 72), (41, 3), (41, 38), (41, 40), (41, 41), (41, 42), (41, 44), (41, 45), (41, 46), (41, 47), (41, 48), (41, 49), (41, 50), (41, 52), (41, 53), (41, 54), (41, 55), (41, 56), (41, 57), (41, 58), (41, 59), (41, 60), (41, 61), (41, 62), (41, 63), (41, 64), (41, 65), (41, 67), (41, 70), (41, 72), (41, 74), (42, 4), (42, 38), (42, 39), (42, 41), (42, 42), (42, 43), (42, 44), (42, 45), (42, 49), (42, 50), (42, 52), (42, 53), (42, 54), (42, 55), (42, 58), (42, 59), (42, 60), (42, 62), (42, 66), (42, 67), (42, 68), (42, 71), (42, 72), (42, 74), (43, 5), (43, 42), (43, 51), (43, 52), (43, 53), (43, 54), (43, 55), (43, 56), (44, 6), (44, 38), (44, 39), (44, 40), (44, 41), (44, 42), (44, 43), (44, 44), (44, 47), (44, 48), (44, 49), (44, 54), (44, 55), (44, 56), (44, 58), (44, 59), (44, 60), (44, 61), (44, 62), (44, 68), (44, 70), (44, 71), (44, 72), (44, 74), (45, 7), (45, 38), (45, 39), (45, 41), (45, 42), (45, 43), (45, 45), (45, 48), (45, 49), (45, 51), (45, 52), (45, 53), (45, 54), (45, 55), (45, 58), (45, 59), (45, 60), (45, 61), (45, 62), (45, 63), (45, 64), (45, 66), (45, 68), (45, 70), (45, 71), (45, 74), (46, 41), (46, 42), (46, 46), (46, 48), (46, 49), (46, 51), (46, 52), (46, 55), (46, 59), (46, 60), (46, 63), (46, 64), (46, 66), (46, 67), (47, 62), (48, 38), (48, 39), (48, 40), (48, 41), (48, 42), (48, 43), (48, 44), (48, 45), (48, 47), (48, 48), (48, 49), (48, 51), (48, 52), (48, 53), (48, 54), (48, 55), (48, 56), (48, 58), (48, 59), (48, 60), (48, 61), (48, 62), (48, 63), (48, 65), (48, 66), (48, 67), (48, 70), (48, 71), (48, 72), (48, 74), (49, 40), (49, 41), (49, 43), (49, 44), (49, 47), (49, 48), (49, 49), (49, 51), (49, 52), (49, 53), (49, 54), (49, 55), (49, 56), (49, 58), (49, 59), (49, 61), (49, 62), (49, 63), (49, 65), (49, 66), (49, 67), (49, 70), (49, 72), (49, 74), (50, 12), (50, 41), (50, 42), (50, 48), (50, 49), (50, 50), (50, 52), (50, 53), (50, 54), (50, 59), (50, 60), (50, 63), (50, 64), (50, 65), (50, 66), (50, 67), (50, 68), (50, 74), (51, 39), (51, 40), (51, 41), (51, 42), (51, 43), (51, 45), (51, 46), (51, 48), (51, 49), (51, 51), (51, 52), (51, 53), (51, 54), (51, 56), (51, 61), (51, 62), (51, 63), (51, 64), (51, 65), (51, 66), (51, 67), (51, 68), (51, 69), (51, 70), (51, 71), (51, 72), (51, 74), (52, 39), (52, 40), (52, 41), (52, 42), (52, 43), (52, 45), (52, 46), (52, 48), (52, 49), (52, 50), (52, 51), (52, 52), (52, 53), (52, 54), (52, 55), (52, 56), (52, 61), (52, 62), (52, 63), (52, 64), (52, 65), (52, 66), (52, 67), (52, 68), (52, 69), (52, 70), (52, 71), (52, 72), (52, 73), (52, 74), (53, 15), (53, 41), (53, 42), (53, 43), (53, 45), (53, 48), (53, 49), (53, 50), (53, 51), (53, 52), (53, 53), (53, 54), (53, 55), (53, 56), (53, 59), (53, 61), (53, 62), (53, 63), (53, 64), (53, 68), (53, 71), (53, 72), (53, 74), (54, 16), (54, 40), (54, 41), (54, 42), (54, 43), (54, 44), (54, 45), (54, 48), (54, 49), (54, 50), (54, 51), (54, 52), (54, 53), (54, 54), (54, 55), (54, 56), (54, 59), (54, 60), (54, 61), (54, 62), (54, 63), (54, 64), (54, 65), (54, 66), (54, 68), (54, 69), (54, 71), (54, 72), (54, 73), (54, 74), (55, 17), (55, 39), (55, 41), (55, 42), (55, 43), (55, 44), (55, 45), (55, 48), (55, 49), (55, 51), (55, 52), (55, 53), (55, 54), (55, 55), (55, 56), (55, 57), (55, 58), (55, 59), (55, 60), (55, 61), (55, 62), (55, 63), (55, 64), (55, 65), (55, 66), (55, 67), (55, 68), (55, 71), (55, 74), (56, 18), (56, 41), (56, 42), (56, 43), (56, 44), (56, 45), (56, 48), (56, 49), (56, 51), (56, 52), (56, 54), (56, 55), (56, 56), (56, 57), (56, 58), (56, 59), (56, 60), (56, 61), (56, 62), (56, 63), (56, 64), (56, 65), (56, 67), (56, 68), (56, 69), (56, 70), (56, 71), (56, 72), (56, 74), (57, 19), (57, 41), (58, 20), (58, 38), (58, 39), (58, 40), (58, 41), (58, 42), (58, 43), (58, 44), (58, 47), (58, 48), (58, 49), (58, 54), (58, 55), (58, 56), (58, 58), (58, 59), (58, 60), (58, 62), (58, 68), (58, 70), (58, 71), (58, 72), (58, 74), (59, 38), (59, 39), (59, 40), (59, 41), (59, 42), (59, 43), (59, 44), (59, 45), (59, 47), (59, 48), (59, 49), (59, 51), (59, 52), (59, 54), (59, 55), (59, 56), (59, 58), (59, 59), (59, 60), (59, 61), (59, 62), (59, 63), (59, 64), (59, 65), (59, 66), (59, 67), (59, 68), (59, 69), (59, 70), (59, 71), (59, 72), (59, 74), (60, 22), (60, 39), (60, 41), (60, 43), (60, 44), (60, 48), (60, 49), (60, 51), (60, 52), (60, 54), (60, 55), (60, 56), (60, 58), (60, 59), (60, 60), (60, 61), (60, 62), (60, 63), (60, 64), (60, 65), (60, 66), (60, 67), (60, 68), (60, 69), (60, 70), (60, 71), (60, 72), (60, 74), (61, 38), (61, 39), (61, 41), (61, 42), (61, 44), (61, 45), (61, 48), (61, 49), (61, 51), (61, 52), (61, 53), (61, 54), (61, 55), (61, 56), (61, 58), (61, 59), (61, 60), (61, 61), (61, 62), (61, 63), (61, 64), (61, 65), (61, 67), (61, 68), (61, 69), (61, 70), (61, 71), (61, 72), (61, 74), (62, 38), (62, 39), (62, 40), (62, 41), (62, 42), (62, 43), (62, 44), (62, 45), (62, 47), (62, 48), (62, 49), (62, 51), (62, 52), (62, 54), (62, 55), (62, 56), (62, 58), (62, 59), (62, 60), (62, 61), (62, 62), (62, 67), (62, 68), (62, 69), (62, 70), (62, 71), (62, 72), (62, 74), (63, 25), (63, 39), (63, 41), (63, 45), (63, 48), (63, 49), (63, 50), (63, 51), (63, 52), (63, 53), (63, 54), (63, 55), (63, 56), (63, 57), (63, 59), (63, 61), (63, 63), (63, 64), (63, 65), (63, 66), (63, 67), (63, 68), (63, 71), (63, 74), (64, 26), (64, 39), (64, 41), (64, 45), (64, 48), (64, 49), (64, 50), (64, 51), (64, 52), (64, 53), (64, 54), (64, 55), (64, 56), (64, 57), (64, 59), (64, 61), (64, 63), (64, 64), (64, 65), (64, 66), (64, 67), (64, 68), (64, 71), (64, 74), (65, 41), (65, 48), (65, 49), (65, 50), (65, 51), (65, 52), (65, 53), (65, 54), (65, 55), (65, 56), (65, 59), (65, 62), (65, 63), (65, 64), (65, 65), (65, 66), (65, 67), (65, 68), (65, 74), (66, 28), (66, 46), (66, 48), (66, 49), (66, 50), (66, 51), (66, 52), (66, 54), (66, 55), (66, 63), (66, 64), (66, 66), (66, 67), (67, 41), (67, 46), (67, 49), (67, 50), (67, 51), (67, 52), (67, 55), (67, 65), (67, 66), (67, 67), (68, 38), (68, 39), (68, 40), (68, 41), (68, 42), (68, 44), (68, 45), (68, 48), (68, 49), (68, 51), (68, 52), (68, 53), (68, 54), (68, 55), (68, 56), (68, 58), (68, 59), (68, 60), (68, 62), (68, 68), (68, 69), (68, 70), (68, 71), (68, 72), (68, 73), (68, 74), (69, 40), (69, 45), (69, 49), (69, 51), (69, 52), (69, 54), (69, 59), (69, 61), (69, 62), (69, 68), (69, 69), (69, 70), (69, 71), (69, 72), (69, 74), (70, 38), (70, 39), (70, 40), (70, 41), (70, 43), (70, 44), (70, 48), (70, 49), (70, 51), (70, 55), (70, 58), (70, 59), (70, 60), (70, 61), (70, 62), (70, 68), (70, 69), (70, 71), (70, 72), (71, 38), (71, 39), (71, 40), (71, 42), (71, 45), (71, 48), (71, 51), (71, 52), (71, 54), (71, 55), (71, 56), (71, 59), (71, 60), (71, 61), (71, 62), (71, 63), (71, 68), (71, 69), (71, 70), (71, 71), (71, 72), (71, 74), (72, 38), (72, 39), (72, 40), (72, 41), (72, 42), (72, 43), (72, 44), (72, 45), (72, 48), (72, 49), (72, 51), (72, 52), (72, 54), (72, 55), (72, 56), (72, 58), (72, 59), (72, 60), (72, 61), (72, 62), (72, 67), (72, 68), (72, 69), (72, 70), (72, 71), (72, 72), (72, 74), (73, 35), (73, 40), (73, 51), (73, 52), (73, 62), (73, 68), (73, 71), (73, 73), (73, 74), (74, 36), (74, 40), (74, 41), (74, 44), (74, 45), (74, 48), (74, 49), (74, 51), (74, 52), (74, 53), (74, 54), (74, 55), (74, 56), (74, 59), (74, 60), (74, 61), (74, 62), (74, 63), (74, 64), (74, 65), (74, 68), (74, 69), (74, 70), (74, 71), (74, 72), (74, 73), (74, 74)]\n", - "edges coords: [array([ -9.885591, -47.084818, -3.13936 ]), array([ -9.885591, -47.084818, -3.13936 ]), array([ -9.885591, -47.084818, -3.13936 ]), array([ -2.605247, -55.324507, -7.065423]), array([ -9.885591, -47.084818, -3.13936 ]), array([48.734149, -2.004701, 8.019123]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 30.150795, -4.286333, -31.136279]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 23.242996, -42.031295, -22.110624]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 9.822772, -44.114976, -18.760442]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 59.995574, -14.366518, 26.025739]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 59.286775, -2.547348, -21.924281]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 47.987255, -16.887697, -39.699154]), array([ -9.885591, -47.084818, -3.13936 ]), array([-14.49484 , -20.328269, -27.617052]), array([ -9.885591, -47.084818, -3.13936 ]), array([ -8.613724, -59.8286 , -27.915417]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 9.897209, -53.324915, -23.790822]), array([ -9.885591, -47.084818, -3.13936 ]), array([-31.897851, -30.247588, -33.028094]), array([ -2.605247, -55.324507, -7.065423]), array([ -9.885591, -47.084818, -3.13936 ]), array([ -2.605247, -55.324507, -7.065423]), array([ -2.605247, -55.324507, -7.065423]), array([ -2.605247, -55.324507, -7.065423]), array([ 30.400644, -33.753689, 34.832572]), array([ -2.605247, -55.324507, -7.065423]), array([-22.152851, -56.734891, 16.852029]), array([ -2.605247, -55.324507, -7.065423]), array([-51.151034, -35.899675, 25.679908]), array([ -2.605247, -55.324507, -7.065423]), array([-43.927847, -8.226723, 27.584594]), array([ -2.605247, -55.324507, -7.065423]), array([-30.092058, -33.534852, 43.097159]), array([ -2.605247, -55.324507, -7.065423]), array([ 54.048553, -37.427609, 12.535183]), array([ -2.605247, -55.324507, -7.065423]), array([ 47.987255, -16.887697, -39.699154]), array([ -2.605247, -55.324507, -7.065423]), array([ 79.213202, -15.623481, -15.95848 ]), array([ -2.605247, -55.324507, -7.065423]), array([ 53.338325, -45.334367, -18.998421]), array([ -2.605247, -55.324507, -7.065423]), array([-14.49484 , -20.328269, -27.617052]), array([ -2.605247, -55.324507, -7.065423]), array([ 23.765633, -21.600569, 45.97906 ]), array([ -2.605247, -55.324507, -7.065423]), array([ -8.613724, -59.8286 , -27.915417]), array([ -2.605247, -55.324507, -7.065423]), array([ 9.897209, -53.324915, -23.790822]), array([ -2.605247, -55.324507, -7.065423]), array([-31.897851, -30.247588, -33.028094]), array([ 6.489431, -11.670519, -30.851544]), array([ 6.489431, -11.670519, -30.851544]), array([ 6.489431, -11.670519, -30.851544]), array([-14.49484 , -20.328269, -27.617052]), array([ 6.489431, -11.670519, -30.851544]), array([ -8.613724, -59.8286 , -27.915417]), array([ 6.489431, -11.670519, -30.851544]), array([-23.429795, -51.025923, -39.842084]), array([ 6.489431, -11.670519, -30.851544]), array([ 18.541141, -24.947459, -60.138766]), array([ 6.489431, -11.670519, -30.851544]), array([-31.897851, -30.247588, -33.028094]), array([ 6.489431, -11.670519, -30.851544]), array([ 7.671771, 16.535084, -32.110169]), array([48.734149, -2.004701, 8.019123]), array([ -9.885591, -47.084818, -3.13936 ]), array([48.734149, -2.004701, 8.019123]), array([ 6.489431, -11.670519, -30.851544]), array([48.734149, -2.004701, 8.019123]), array([48.734149, -2.004701, 8.019123]), array([48.734149, -2.004701, 8.019123]), array([-12.1714 , -6.494719, 25.361539]), array([48.734149, -2.004701, 8.019123]), array([ 30.150795, -4.286333, -31.136279]), array([48.734149, -2.004701, 8.019123]), array([ 30.400644, -33.753689, 34.832572]), array([48.734149, -2.004701, 8.019123]), array([ 36.159029, -35.084312, -18.938829]), array([48.734149, -2.004701, 8.019123]), array([-12.502286, -24.875165, -20.872351]), array([48.734149, -2.004701, 8.019123]), array([ 23.242996, -42.031295, -22.110624]), array([48.734149, -2.004701, 8.019123]), array([ 9.822772, -44.114976, -18.760442]), array([48.734149, -2.004701, 8.019123]), array([ 8.003023, -32.833685, 38.712349]), array([48.734149, -2.004701, 8.019123]), array([-51.151034, -35.899675, 25.679908]), array([48.734149, -2.004701, 8.019123]), array([-43.927847, -8.226723, 27.584594]), array([48.734149, -2.004701, 8.019123]), array([-30.092058, -33.534852, 43.097159]), array([48.734149, -2.004701, 8.019123]), array([ 54.048553, -37.427609, 12.535183]), array([48.734149, -2.004701, 8.019123]), array([ 59.995574, -14.366518, 26.025739]), array([48.734149, -2.004701, 8.019123]), array([59.612735, -2.407101, -0.844581]), array([48.734149, -2.004701, 8.019123]), array([ 59.286775, -2.547348, -21.924281]), array([48.734149, -2.004701, 8.019123]), array([ 47.987255, -16.887697, -39.699154]), array([48.734149, -2.004701, 8.019123]), array([ 79.213202, -15.623481, -15.95848 ]), array([48.734149, -2.004701, 8.019123]), array([ 53.338325, -45.334367, -18.998421]), array([48.734149, -2.004701, 8.019123]), array([-14.49484 , -20.328269, -27.617052]), array([48.734149, -2.004701, 8.019123]), array([ 23.765633, -21.600569, 45.97906 ]), array([48.734149, -2.004701, 8.019123]), array([18.273358, -4.266078, 38.071488]), array([48.734149, -2.004701, 8.019123]), array([ 31.270899, -53.183604, -3.211336]), array([48.734149, -2.004701, 8.019123]), array([ 6.093876, -48.998009, -7.897234]), array([48.734149, -2.004701, 8.019123]), array([ 18.541141, -24.947459, -60.138766]), array([48.734149, -2.004701, 8.019123]), array([-31.897851, -30.247588, -33.028094]), array([48.734149, -2.004701, 8.019123]), array([-68.477071, -22.67342 , -1.619763]), array([48.734149, -2.004701, 8.019123]), array([39.281208, 4.486598, 10.191669]), array([-12.1714 , -6.494719, 25.361539]), array([ -9.885591, -47.084818, -3.13936 ]), array([-12.1714 , -6.494719, 25.361539]), array([ -2.605247, -55.324507, -7.065423]), array([-12.1714 , -6.494719, 25.361539]), array([48.734149, -2.004701, 8.019123]), array([-12.1714 , -6.494719, 25.361539]), array([-12.1714 , -6.494719, 25.361539]), array([-12.1714 , -6.494719, 25.361539]), array([-38.1525 , -13.054752, -5.607666]), array([-12.1714 , -6.494719, 25.361539]), array([ 30.150795, -4.286333, -31.136279]), array([-12.1714 , -6.494719, 25.361539]), array([ 30.400644, -33.753689, 34.832572]), array([-12.1714 , -6.494719, 25.361539]), array([ 9.822772, -44.114976, -18.760442]), array([-12.1714 , -6.494719, 25.361539]), array([ 8.003023, -32.833685, 38.712349]), array([-12.1714 , -6.494719, 25.361539]), array([-51.151034, -35.899675, 25.679908]), array([-12.1714 , -6.494719, 25.361539]), array([-43.927847, -8.226723, 27.584594]), array([-12.1714 , -6.494719, 25.361539]), array([-30.092058, -33.534852, 43.097159]), array([-12.1714 , -6.494719, 25.361539]), array([ 54.048553, -37.427609, 12.535183]), array([-12.1714 , -6.494719, 25.361539]), array([ 59.286775, -2.547348, -21.924281]), array([-12.1714 , -6.494719, 25.361539]), array([ 47.987255, -16.887697, -39.699154]), array([-12.1714 , -6.494719, 25.361539]), array([ 79.213202, -15.623481, -15.95848 ]), array([-12.1714 , -6.494719, 25.361539]), array([-14.49484 , -20.328269, -27.617052]), array([-12.1714 , -6.494719, 25.361539]), array([ -6.551567, -40.92204 , 34.412733]), array([-12.1714 , -6.494719, 25.361539]), array([ 6.093876, -48.998009, -7.897234]), array([-12.1714 , -6.494719, 25.361539]), array([ -8.613724, -59.8286 , -27.915417]), array([-12.1714 , -6.494719, 25.361539]), array([ 9.897209, -53.324915, -23.790822]), array([-12.1714 , -6.494719, 25.361539]), array([-31.897851, -30.247588, -33.028094]), array([-12.1714 , -6.494719, 25.361539]), array([-68.477071, -22.67342 , -1.619763]), array([-12.1714 , -6.494719, 25.361539]), array([-11.349411, 1.901778, 21.476145]), array([-38.1525 , -13.054752, -5.607666]), array([-12.1714 , -6.494719, 25.361539]), array([-38.1525 , -13.054752, -5.607666]), array([-22.152851, -56.734891, 16.852029]), array([-38.1525 , -13.054752, -5.607666]), array([-51.151034, -35.899675, 25.679908]), array([-38.1525 , -13.054752, -5.607666]), array([-43.927847, -8.226723, 27.584594]), array([-38.1525 , -13.054752, -5.607666]), array([-30.092058, -33.534852, 43.097159]), array([-38.1525 , -13.054752, -5.607666]), array([ 54.048553, -37.427609, 12.535183]), array([-38.1525 , -13.054752, -5.607666]), array([ 59.995574, -14.366518, 26.025739]), array([-38.1525 , -13.054752, -5.607666]), array([-33.137736, 10.478931, -5.472519]), array([ 30.150795, -4.286333, -31.136279]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 30.150795, -4.286333, -31.136279]), array([ -2.605247, -55.324507, -7.065423]), array([ 30.150795, -4.286333, -31.136279]), array([ 6.489431, -11.670519, -30.851544]), array([ 30.150795, -4.286333, -31.136279]), array([48.734149, -2.004701, 8.019123]), array([ 30.150795, -4.286333, -31.136279]), array([-12.1714 , -6.494719, 25.361539]), array([ 30.150795, -4.286333, -31.136279]), array([-38.1525 , -13.054752, -5.607666]), array([ 30.150795, -4.286333, -31.136279]), array([ 30.150795, -4.286333, -31.136279]), array([ 30.150795, -4.286333, -31.136279]), array([-12.502286, -24.875165, -20.872351]), array([ 30.150795, -4.286333, -31.136279]), array([ 23.242996, -42.031295, -22.110624]), array([ 30.150795, -4.286333, -31.136279]), array([ 9.822772, -44.114976, -18.760442]), array([ 30.150795, -4.286333, -31.136279]), array([-30.092058, -33.534852, 43.097159]), array([ 30.150795, -4.286333, -31.136279]), array([ 54.048553, -37.427609, 12.535183]), array([ 30.150795, -4.286333, -31.136279]), array([ 59.995574, -14.366518, 26.025739]), array([ 30.150795, -4.286333, -31.136279]), array([ 59.286775, -2.547348, -21.924281]), array([ 30.150795, -4.286333, -31.136279]), array([ 47.987255, -16.887697, -39.699154]), array([ 30.150795, -4.286333, -31.136279]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 30.150795, -4.286333, -31.136279]), array([ 53.338325, -45.334367, -18.998421]), array([ 30.150795, -4.286333, -31.136279]), array([-14.49484 , -20.328269, -27.617052]), array([ 30.150795, -4.286333, -31.136279]), array([ -8.613724, -59.8286 , -27.915417]), array([ 30.150795, -4.286333, -31.136279]), array([ 18.541141, -24.947459, -60.138766]), array([ 30.150795, -4.286333, -31.136279]), array([ 9.897209, -53.324915, -23.790822]), array([ 30.150795, -4.286333, -31.136279]), array([-31.897851, -30.247588, -33.028094]), array([ 30.150795, -4.286333, -31.136279]), array([-68.477071, -22.67342 , -1.619763]), array([ 30.150795, -4.286333, -31.136279]), array([ 28.220495, 8.508825, -31.633256]), array([ 30.400644, -33.753689, 34.832572]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 30.400644, -33.753689, 34.832572]), array([ -2.605247, -55.324507, -7.065423]), array([ 30.400644, -33.753689, 34.832572]), array([48.734149, -2.004701, 8.019123]), array([ 30.400644, -33.753689, 34.832572]), array([-12.1714 , -6.494719, 25.361539]), array([ 30.400644, -33.753689, 34.832572]), array([-38.1525 , -13.054752, -5.607666]), array([ 30.400644, -33.753689, 34.832572]), array([ 30.400644, -33.753689, 34.832572]), array([ 30.400644, -33.753689, 34.832572]), array([ 23.242996, -42.031295, -22.110624]), array([ 30.400644, -33.753689, 34.832572]), array([ 9.822772, -44.114976, -18.760442]), array([ 30.400644, -33.753689, 34.832572]), array([-22.152851, -56.734891, 16.852029]), array([ 30.400644, -33.753689, 34.832572]), array([-51.151034, -35.899675, 25.679908]), array([ 30.400644, -33.753689, 34.832572]), array([-43.927847, -8.226723, 27.584594]), array([ 30.400644, -33.753689, 34.832572]), array([-30.092058, -33.534852, 43.097159]), array([ 30.400644, -33.753689, 34.832572]), array([ 54.048553, -37.427609, 12.535183]), array([ 30.400644, -33.753689, 34.832572]), array([ 59.286775, -2.547348, -21.924281]), array([ 30.400644, -33.753689, 34.832572]), array([ 47.987255, -16.887697, -39.699154]), array([ 30.400644, -33.753689, 34.832572]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 30.400644, -33.753689, 34.832572]), array([ 53.338325, -45.334367, -18.998421]), array([ 30.400644, -33.753689, 34.832572]), array([-14.49484 , -20.328269, -27.617052]), array([ 30.400644, -33.753689, 34.832572]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 30.400644, -33.753689, 34.832572]), array([18.273358, -4.266078, 38.071488]), array([ 30.400644, -33.753689, 34.832572]), array([ -6.551567, -40.92204 , 34.412733]), array([ 30.400644, -33.753689, 34.832572]), array([ -8.613724, -59.8286 , -27.915417]), array([ 30.400644, -33.753689, 34.832572]), array([ 18.541141, -24.947459, -60.138766]), array([ 30.400644, -33.753689, 34.832572]), array([ 9.897209, -53.324915, -23.790822]), array([ 30.400644, -33.753689, 34.832572]), array([-68.477071, -22.67342 , -1.619763]), array([ 30.400644, -33.753689, 34.832572]), array([25.33148 , 38.587971, 32.110488]), array([ 36.159029, -35.084312, -18.938829]), array([48.734149, -2.004701, 8.019123]), array([ 36.159029, -35.084312, -18.938829]), array([-12.1714 , -6.494719, 25.361539]), array([ 36.159029, -35.084312, -18.938829]), array([ 36.159029, -35.084312, -18.938829]), array([ 36.159029, -35.084312, -18.938829]), array([ 23.242996, -42.031295, -22.110624]), array([ 36.159029, -35.084312, -18.938829]), array([ 9.822772, -44.114976, -18.760442]), array([ 36.159029, -35.084312, -18.938829]), array([-22.152851, -56.734891, 16.852029]), array([ 36.159029, -35.084312, -18.938829]), array([-51.151034, -35.899675, 25.679908]), array([ 36.159029, -35.084312, -18.938829]), array([ 54.048553, -37.427609, 12.535183]), array([ 36.159029, -35.084312, -18.938829]), array([ 47.987255, -16.887697, -39.699154]), array([ 36.159029, -35.084312, -18.938829]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 36.159029, -35.084312, -18.938829]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 36.159029, -35.084312, -18.938829]), array([18.273358, -4.266078, 38.071488]), array([ 36.159029, -35.084312, -18.938829]), array([ -6.551567, -40.92204 , 34.412733]), array([ 36.159029, -35.084312, -18.938829]), array([ 6.093876, -48.998009, -7.897234]), array([-12.502286, -24.875165, -20.872351]), array([-14.49484 , -20.328269, -27.617052]), array([ 23.242996, -42.031295, -22.110624]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 23.242996, -42.031295, -22.110624]), array([ -2.605247, -55.324507, -7.065423]), array([ 23.242996, -42.031295, -22.110624]), array([ 6.489431, -11.670519, -30.851544]), array([ 23.242996, -42.031295, -22.110624]), array([48.734149, -2.004701, 8.019123]), array([ 23.242996, -42.031295, -22.110624]), array([-12.1714 , -6.494719, 25.361539]), array([ 23.242996, -42.031295, -22.110624]), array([-38.1525 , -13.054752, -5.607666]), array([ 23.242996, -42.031295, -22.110624]), array([ 30.150795, -4.286333, -31.136279]), array([ 23.242996, -42.031295, -22.110624]), array([ 30.400644, -33.753689, 34.832572]), array([ 23.242996, -42.031295, -22.110624]), array([-12.502286, -24.875165, -20.872351]), array([ 23.242996, -42.031295, -22.110624]), array([ 23.242996, -42.031295, -22.110624]), array([ 23.242996, -42.031295, -22.110624]), array([ 9.822772, -44.114976, -18.760442]), array([ 23.242996, -42.031295, -22.110624]), array([-22.152851, -56.734891, 16.852029]), array([ 23.242996, -42.031295, -22.110624]), array([-51.151034, -35.899675, 25.679908]), array([ 23.242996, -42.031295, -22.110624]), array([-43.927847, -8.226723, 27.584594]), array([ 23.242996, -42.031295, -22.110624]), array([-30.092058, -33.534852, 43.097159]), array([ 23.242996, -42.031295, -22.110624]), array([ 54.048553, -37.427609, 12.535183]), array([ 23.242996, -42.031295, -22.110624]), array([ 59.995574, -14.366518, 26.025739]), array([ 23.242996, -42.031295, -22.110624]), array([ 59.286775, -2.547348, -21.924281]), array([ 23.242996, -42.031295, -22.110624]), array([ 47.987255, -16.887697, -39.699154]), array([ 23.242996, -42.031295, -22.110624]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 23.242996, -42.031295, -22.110624]), array([ 53.338325, -45.334367, -18.998421]), array([ 23.242996, -42.031295, -22.110624]), array([-14.49484 , -20.328269, -27.617052]), array([ 23.242996, -42.031295, -22.110624]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 23.242996, -42.031295, -22.110624]), array([ 31.270899, -53.183604, -3.211336]), array([ 23.242996, -42.031295, -22.110624]), array([ -6.551567, -40.92204 , 34.412733]), array([ 23.242996, -42.031295, -22.110624]), array([ 6.093876, -48.998009, -7.897234]), array([ 23.242996, -42.031295, -22.110624]), array([ 18.541141, -24.947459, -60.138766]), array([ 23.242996, -42.031295, -22.110624]), array([ 9.897209, -53.324915, -23.790822]), array([ 23.242996, -42.031295, -22.110624]), array([-31.897851, -30.247588, -33.028094]), array([ 23.242996, -42.031295, -22.110624]), array([-68.477071, -22.67342 , -1.619763]), array([ 9.822772, -44.114976, -18.760442]), array([ 6.489431, -11.670519, -30.851544]), array([ 9.822772, -44.114976, -18.760442]), array([48.734149, -2.004701, 8.019123]), array([ 9.822772, -44.114976, -18.760442]), array([-38.1525 , -13.054752, -5.607666]), array([ 9.822772, -44.114976, -18.760442]), array([ 30.150795, -4.286333, -31.136279]), array([ 9.822772, -44.114976, -18.760442]), array([-12.502286, -24.875165, -20.872351]), array([ 9.822772, -44.114976, -18.760442]), array([ 23.242996, -42.031295, -22.110624]), array([ 9.822772, -44.114976, -18.760442]), array([ 9.822772, -44.114976, -18.760442]), array([ 9.822772, -44.114976, -18.760442]), array([-22.152851, -56.734891, 16.852029]), array([ 9.822772, -44.114976, -18.760442]), array([-51.151034, -35.899675, 25.679908]), array([ 9.822772, -44.114976, -18.760442]), array([-43.927847, -8.226723, 27.584594]), array([ 9.822772, -44.114976, -18.760442]), array([-30.092058, -33.534852, 43.097159]), array([ 9.822772, -44.114976, -18.760442]), array([ 54.048553, -37.427609, 12.535183]), array([ 9.822772, -44.114976, -18.760442]), array([ 59.995574, -14.366518, 26.025739]), array([ 9.822772, -44.114976, -18.760442]), array([ 59.286775, -2.547348, -21.924281]), array([ 9.822772, -44.114976, -18.760442]), array([ 47.987255, -16.887697, -39.699154]), array([ 9.822772, -44.114976, -18.760442]), array([ 53.338325, -45.334367, -18.998421]), array([ 9.822772, -44.114976, -18.760442]), array([-14.49484 , -20.328269, -27.617052]), array([ 9.822772, -44.114976, -18.760442]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 9.822772, -44.114976, -18.760442]), array([ 31.270899, -53.183604, -3.211336]), array([ 9.822772, -44.114976, -18.760442]), array([ -6.551567, -40.92204 , 34.412733]), array([ 9.822772, -44.114976, -18.760442]), array([ 6.093876, -48.998009, -7.897234]), array([ 9.822772, -44.114976, -18.760442]), array([ 18.541141, -24.947459, -60.138766]), array([ 9.822772, -44.114976, -18.760442]), array([-31.897851, -30.247588, -33.028094]), array([ 9.822772, -44.114976, -18.760442]), array([-68.477071, -22.67342 , -1.619763]), array([ 8.003023, -32.833685, 38.712349]), array([48.734149, -2.004701, 8.019123]), array([ 8.003023, -32.833685, 38.712349]), array([-12.1714 , -6.494719, 25.361539]), array([ 8.003023, -32.833685, 38.712349]), array([ 23.242996, -42.031295, -22.110624]), array([ 8.003023, -32.833685, 38.712349]), array([ 9.822772, -44.114976, -18.760442]), array([ 8.003023, -32.833685, 38.712349]), array([ 8.003023, -32.833685, 38.712349]), array([ 8.003023, -32.833685, 38.712349]), array([-51.151034, -35.899675, 25.679908]), array([ 8.003023, -32.833685, 38.712349]), array([-43.927847, -8.226723, 27.584594]), array([ 8.003023, -32.833685, 38.712349]), array([-30.092058, -33.534852, 43.097159]), array([ 8.003023, -32.833685, 38.712349]), array([ 47.987255, -16.887697, -39.699154]), array([ 8.003023, -32.833685, 38.712349]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 8.003023, -32.833685, 38.712349]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 8.003023, -32.833685, 38.712349]), array([18.273358, -4.266078, 38.071488]), array([ 8.003023, -32.833685, 38.712349]), array([ 31.270899, -53.183604, -3.211336]), array([ 8.003023, -32.833685, 38.712349]), array([ -6.551567, -40.92204 , 34.412733]), array([ 8.003023, -32.833685, 38.712349]), array([ 6.093876, -48.998009, -7.897234]), array([ 8.003023, -32.833685, 38.712349]), array([ -8.613724, -59.8286 , -27.915417]), array([ 8.003023, -32.833685, 38.712349]), array([-68.477071, -22.67342 , -1.619763]), array([ 8.003023, -32.833685, 38.712349]), array([ 6.077868, 34.161497, 35.327252]), array([-22.152851, -56.734891, 16.852029]), array([ -2.605247, -55.324507, -7.065423]), array([-22.152851, -56.734891, 16.852029]), array([ 6.489431, -11.670519, -30.851544]), array([-22.152851, -56.734891, 16.852029]), array([48.734149, -2.004701, 8.019123]), array([-22.152851, -56.734891, 16.852029]), array([-12.1714 , -6.494719, 25.361539]), array([-22.152851, -56.734891, 16.852029]), array([-38.1525 , -13.054752, -5.607666]), array([-22.152851, -56.734891, 16.852029]), array([ 30.400644, -33.753689, 34.832572]), array([-22.152851, -56.734891, 16.852029]), array([ 36.159029, -35.084312, -18.938829]), array([-22.152851, -56.734891, 16.852029]), array([ 23.242996, -42.031295, -22.110624]), array([-22.152851, -56.734891, 16.852029]), array([ 9.822772, -44.114976, -18.760442]), array([-22.152851, -56.734891, 16.852029]), array([-22.152851, -56.734891, 16.852029]), array([-22.152851, -56.734891, 16.852029]), array([-51.151034, -35.899675, 25.679908]), array([-22.152851, -56.734891, 16.852029]), array([-43.927847, -8.226723, 27.584594]), array([-22.152851, -56.734891, 16.852029]), array([-30.092058, -33.534852, 43.097159]), array([-22.152851, -56.734891, 16.852029]), array([ 59.995574, -14.366518, 26.025739]), array([-22.152851, -56.734891, 16.852029]), array([ 53.338325, -45.334367, -18.998421]), array([-22.152851, -56.734891, 16.852029]), array([-14.49484 , -20.328269, -27.617052]), array([-22.152851, -56.734891, 16.852029]), array([ 23.765633, -21.600569, 45.97906 ]), array([-22.152851, -56.734891, 16.852029]), array([18.273358, -4.266078, 38.071488]), array([-22.152851, -56.734891, 16.852029]), array([ 31.270899, -53.183604, -3.211336]), array([-22.152851, -56.734891, 16.852029]), array([ -6.551567, -40.92204 , 34.412733]), array([-22.152851, -56.734891, 16.852029]), array([ 6.093876, -48.998009, -7.897234]), array([-22.152851, -56.734891, 16.852029]), array([ -8.613724, -59.8286 , -27.915417]), array([-22.152851, -56.734891, 16.852029]), array([-23.429795, -51.025923, -39.842084]), array([-22.152851, -56.734891, 16.852029]), array([ 18.541141, -24.947459, -60.138766]), array([-22.152851, -56.734891, 16.852029]), array([ 9.897209, -53.324915, -23.790822]), array([-22.152851, -56.734891, 16.852029]), array([-31.897851, -30.247588, -33.028094]), array([-22.152851, -56.734891, 16.852029]), array([-68.477071, -22.67342 , -1.619763]), array([-51.151034, -35.899675, 25.679908]), array([ -2.605247, -55.324507, -7.065423]), array([-51.151034, -35.899675, 25.679908]), array([ 6.489431, -11.670519, -30.851544]), array([-51.151034, -35.899675, 25.679908]), array([48.734149, -2.004701, 8.019123]), array([-51.151034, -35.899675, 25.679908]), array([-12.1714 , -6.494719, 25.361539]), array([-51.151034, -35.899675, 25.679908]), array([-38.1525 , -13.054752, -5.607666]), array([-51.151034, -35.899675, 25.679908]), array([ 30.400644, -33.753689, 34.832572]), array([-51.151034, -35.899675, 25.679908]), array([ 36.159029, -35.084312, -18.938829]), array([-51.151034, -35.899675, 25.679908]), array([ 23.242996, -42.031295, -22.110624]), array([-51.151034, -35.899675, 25.679908]), array([ 9.822772, -44.114976, -18.760442]), array([-51.151034, -35.899675, 25.679908]), array([ 8.003023, -32.833685, 38.712349]), array([-51.151034, -35.899675, 25.679908]), array([-22.152851, -56.734891, 16.852029]), array([-51.151034, -35.899675, 25.679908]), array([-51.151034, -35.899675, 25.679908]), array([-51.151034, -35.899675, 25.679908]), array([-43.927847, -8.226723, 27.584594]), array([-51.151034, -35.899675, 25.679908]), array([-30.092058, -33.534852, 43.097159]), array([-51.151034, -35.899675, 25.679908]), array([ 54.048553, -37.427609, 12.535183]), array([-51.151034, -35.899675, 25.679908]), array([ 59.995574, -14.366518, 26.025739]), array([-51.151034, -35.899675, 25.679908]), array([ 53.338325, -45.334367, -18.998421]), array([-51.151034, -35.899675, 25.679908]), array([-14.49484 , -20.328269, -27.617052]), array([-51.151034, -35.899675, 25.679908]), array([ 23.765633, -21.600569, 45.97906 ]), array([-51.151034, -35.899675, 25.679908]), array([18.273358, -4.266078, 38.071488]), array([-51.151034, -35.899675, 25.679908]), array([ 31.270899, -53.183604, -3.211336]), array([-51.151034, -35.899675, 25.679908]), array([ -6.551567, -40.92204 , 34.412733]), array([-51.151034, -35.899675, 25.679908]), array([ 6.093876, -48.998009, -7.897234]), array([-51.151034, -35.899675, 25.679908]), array([ -8.613724, -59.8286 , -27.915417]), array([-51.151034, -35.899675, 25.679908]), array([-23.429795, -51.025923, -39.842084]), array([-51.151034, -35.899675, 25.679908]), array([ 18.541141, -24.947459, -60.138766]), array([-51.151034, -35.899675, 25.679908]), array([ 9.897209, -53.324915, -23.790822]), array([-51.151034, -35.899675, 25.679908]), array([-31.897851, -30.247588, -33.028094]), array([-51.151034, -35.899675, 25.679908]), array([-70.449382, -12.870265, -11.423195]), array([-51.151034, -35.899675, 25.679908]), array([-68.477071, -22.67342 , -1.619763]), array([-43.927847, -8.226723, 27.584594]), array([48.734149, -2.004701, 8.019123]), array([-43.927847, -8.226723, 27.584594]), array([-12.1714 , -6.494719, 25.361539]), array([-43.927847, -8.226723, 27.584594]), array([-38.1525 , -13.054752, -5.607666]), array([-43.927847, -8.226723, 27.584594]), array([ 30.400644, -33.753689, 34.832572]), array([-43.927847, -8.226723, 27.584594]), array([ 23.242996, -42.031295, -22.110624]), array([-43.927847, -8.226723, 27.584594]), array([ 9.822772, -44.114976, -18.760442]), array([-43.927847, -8.226723, 27.584594]), array([ 8.003023, -32.833685, 38.712349]), array([-43.927847, -8.226723, 27.584594]), array([-22.152851, -56.734891, 16.852029]), array([-43.927847, -8.226723, 27.584594]), array([-51.151034, -35.899675, 25.679908]), array([-43.927847, -8.226723, 27.584594]), array([-43.927847, -8.226723, 27.584594]), array([-43.927847, -8.226723, 27.584594]), array([-30.092058, -33.534852, 43.097159]), array([-43.927847, -8.226723, 27.584594]), array([ 54.048553, -37.427609, 12.535183]), array([-43.927847, -8.226723, 27.584594]), array([ 59.995574, -14.366518, 26.025739]), array([-43.927847, -8.226723, 27.584594]), array([ 47.987255, -16.887697, -39.699154]), array([-43.927847, -8.226723, 27.584594]), array([ 53.338325, -45.334367, -18.998421]), array([-43.927847, -8.226723, 27.584594]), array([-14.49484 , -20.328269, -27.617052]), array([-43.927847, -8.226723, 27.584594]), array([ 23.765633, -21.600569, 45.97906 ]), array([-43.927847, -8.226723, 27.584594]), array([18.273358, -4.266078, 38.071488]), array([-43.927847, -8.226723, 27.584594]), array([ -8.613724, -59.8286 , -27.915417]), array([-43.927847, -8.226723, 27.584594]), array([ 9.897209, -53.324915, -23.790822]), array([-43.927847, -8.226723, 27.584594]), array([-31.897851, -30.247588, -33.028094]), array([-43.927847, -8.226723, 27.584594]), array([-68.477071, -22.67342 , -1.619763]), array([-43.927847, -8.226723, 27.584594]), array([-41.261623, 3.156065, 31.680186]), array([-30.092058, -33.534852, 43.097159]), array([ 6.489431, -11.670519, -30.851544]), array([-30.092058, -33.534852, 43.097159]), array([48.734149, -2.004701, 8.019123]), array([-30.092058, -33.534852, 43.097159]), array([-12.1714 , -6.494719, 25.361539]), array([-30.092058, -33.534852, 43.097159]), array([-38.1525 , -13.054752, -5.607666]), array([-30.092058, -33.534852, 43.097159]), array([ 30.150795, -4.286333, -31.136279]), array([-30.092058, -33.534852, 43.097159]), array([ 30.400644, -33.753689, 34.832572]), array([-30.092058, -33.534852, 43.097159]), array([ 23.242996, -42.031295, -22.110624]), array([-30.092058, -33.534852, 43.097159]), array([ 9.822772, -44.114976, -18.760442]), array([-30.092058, -33.534852, 43.097159]), array([ 8.003023, -32.833685, 38.712349]), array([-30.092058, -33.534852, 43.097159]), array([-22.152851, -56.734891, 16.852029]), array([-30.092058, -33.534852, 43.097159]), array([-51.151034, -35.899675, 25.679908]), array([-30.092058, -33.534852, 43.097159]), array([-43.927847, -8.226723, 27.584594]), array([-30.092058, -33.534852, 43.097159]), array([-30.092058, -33.534852, 43.097159]), array([-30.092058, -33.534852, 43.097159]), array([ 54.048553, -37.427609, 12.535183]), array([-30.092058, -33.534852, 43.097159]), array([ 59.995574, -14.366518, 26.025739]), array([-30.092058, -33.534852, 43.097159]), array([ 47.987255, -16.887697, -39.699154]), array([-30.092058, -33.534852, 43.097159]), array([ 79.213202, -15.623481, -15.95848 ]), array([-30.092058, -33.534852, 43.097159]), array([ 53.338325, -45.334367, -18.998421]), array([-30.092058, -33.534852, 43.097159]), array([-14.49484 , -20.328269, -27.617052]), array([-30.092058, -33.534852, 43.097159]), array([ 23.765633, -21.600569, 45.97906 ]), array([-30.092058, -33.534852, 43.097159]), array([18.273358, -4.266078, 38.071488]), array([-30.092058, -33.534852, 43.097159]), array([ 31.270899, -53.183604, -3.211336]), array([-30.092058, -33.534852, 43.097159]), array([ -6.551567, -40.92204 , 34.412733]), array([-30.092058, -33.534852, 43.097159]), array([ -8.613724, -59.8286 , -27.915417]), array([-30.092058, -33.534852, 43.097159]), array([-23.429795, -51.025923, -39.842084]), array([-30.092058, -33.534852, 43.097159]), array([ 9.897209, -53.324915, -23.790822]), array([-30.092058, -33.534852, 43.097159]), array([-31.897851, -30.247588, -33.028094]), array([-30.092058, -33.534852, 43.097159]), array([-70.449382, -12.870265, -11.423195]), array([-30.092058, -33.534852, 43.097159]), array([-68.477071, -22.67342 , -1.619763]), array([-30.092058, -33.534852, 43.097159]), array([-33.257143, 25.624607, 48.06079 ]), array([ 54.048553, -37.427609, 12.535183]), array([ -2.605247, -55.324507, -7.065423]), array([ 54.048553, -37.427609, 12.535183]), array([48.734149, -2.004701, 8.019123]), array([ 54.048553, -37.427609, 12.535183]), array([-12.1714 , -6.494719, 25.361539]), array([ 54.048553, -37.427609, 12.535183]), array([-38.1525 , -13.054752, -5.607666]), array([ 54.048553, -37.427609, 12.535183]), array([ 30.150795, -4.286333, -31.136279]), array([ 54.048553, -37.427609, 12.535183]), array([ 30.400644, -33.753689, 34.832572]), array([ 54.048553, -37.427609, 12.535183]), array([ 23.242996, -42.031295, -22.110624]), array([ 54.048553, -37.427609, 12.535183]), array([ 9.822772, -44.114976, -18.760442]), array([ 54.048553, -37.427609, 12.535183]), array([-22.152851, -56.734891, 16.852029]), array([ 54.048553, -37.427609, 12.535183]), array([-51.151034, -35.899675, 25.679908]), array([ 54.048553, -37.427609, 12.535183]), array([-43.927847, -8.226723, 27.584594]), array([ 54.048553, -37.427609, 12.535183]), array([-30.092058, -33.534852, 43.097159]), array([ 54.048553, -37.427609, 12.535183]), array([ 54.048553, -37.427609, 12.535183]), array([ 54.048553, -37.427609, 12.535183]), array([ 59.995574, -14.366518, 26.025739]), array([ 54.048553, -37.427609, 12.535183]), array([59.612735, -2.407101, -0.844581]), array([ 54.048553, -37.427609, 12.535183]), array([ 59.286775, -2.547348, -21.924281]), array([ 54.048553, -37.427609, 12.535183]), array([ 47.987255, -16.887697, -39.699154]), array([ 54.048553, -37.427609, 12.535183]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 54.048553, -37.427609, 12.535183]), array([ 53.338325, -45.334367, -18.998421]), array([ 54.048553, -37.427609, 12.535183]), array([-14.49484 , -20.328269, -27.617052]), array([ 54.048553, -37.427609, 12.535183]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 54.048553, -37.427609, 12.535183]), array([18.273358, -4.266078, 38.071488]), array([ 54.048553, -37.427609, 12.535183]), array([ 31.270899, -53.183604, -3.211336]), array([ 54.048553, -37.427609, 12.535183]), array([ -6.551567, -40.92204 , 34.412733]), array([ 54.048553, -37.427609, 12.535183]), array([ 6.093876, -48.998009, -7.897234]), array([ 54.048553, -37.427609, 12.535183]), array([ -8.613724, -59.8286 , -27.915417]), array([ 54.048553, -37.427609, 12.535183]), array([ 9.897209, -53.324915, -23.790822]), array([ 54.048553, -37.427609, 12.535183]), array([-68.477071, -22.67342 , -1.619763]), array([ 54.048553, -37.427609, 12.535183]), array([55.048683, 36.907935, 12.70272 ]), array([ 59.995574, -14.366518, 26.025739]), array([48.734149, -2.004701, 8.019123]), array([ 59.995574, -14.366518, 26.025739]), array([-12.1714 , -6.494719, 25.361539]), array([ 59.995574, -14.366518, 26.025739]), array([-38.1525 , -13.054752, -5.607666]), array([ 59.995574, -14.366518, 26.025739]), array([ 30.150795, -4.286333, -31.136279]), array([ 59.995574, -14.366518, 26.025739]), array([ 30.400644, -33.753689, 34.832572]), array([ 59.995574, -14.366518, 26.025739]), array([ 23.242996, -42.031295, -22.110624]), array([ 59.995574, -14.366518, 26.025739]), array([ 9.822772, -44.114976, -18.760442]), array([ 59.995574, -14.366518, 26.025739]), array([-22.152851, -56.734891, 16.852029]), array([ 59.995574, -14.366518, 26.025739]), array([-51.151034, -35.899675, 25.679908]), array([ 59.995574, -14.366518, 26.025739]), array([-30.092058, -33.534852, 43.097159]), array([ 59.995574, -14.366518, 26.025739]), array([ 54.048553, -37.427609, 12.535183]), array([ 59.995574, -14.366518, 26.025739]), array([ 59.995574, -14.366518, 26.025739]), array([ 59.995574, -14.366518, 26.025739]), array([59.612735, -2.407101, -0.844581]), array([ 59.995574, -14.366518, 26.025739]), array([ 59.286775, -2.547348, -21.924281]), array([ 59.995574, -14.366518, 26.025739]), array([ 47.987255, -16.887697, -39.699154]), array([ 59.995574, -14.366518, 26.025739]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 59.995574, -14.366518, 26.025739]), array([ 53.338325, -45.334367, -18.998421]), array([ 59.995574, -14.366518, 26.025739]), array([-14.49484 , -20.328269, -27.617052]), array([ 59.995574, -14.366518, 26.025739]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 59.995574, -14.366518, 26.025739]), array([18.273358, -4.266078, 38.071488]), array([ 59.995574, -14.366518, 26.025739]), array([ 31.270899, -53.183604, -3.211336]), array([ 59.995574, -14.366518, 26.025739]), array([ 6.093876, -48.998009, -7.897234]), array([ 59.995574, -14.366518, 26.025739]), array([ -8.613724, -59.8286 , -27.915417]), array([ 59.995574, -14.366518, 26.025739]), array([-23.429795, -51.025923, -39.842084]), array([ 59.995574, -14.366518, 26.025739]), array([ 18.541141, -24.947459, -60.138766]), array([ 59.995574, -14.366518, 26.025739]), array([ 9.897209, -53.324915, -23.790822]), array([ 59.995574, -14.366518, 26.025739]), array([-31.897851, -30.247588, -33.028094]), array([ 59.995574, -14.366518, 26.025739]), array([-68.477071, -22.67342 , -1.619763]), array([ 59.995574, -14.366518, 26.025739]), array([55.995996, 19.842407, 26.675811]), array([59.612735, -2.407101, -0.844581]), array([48.734149, -2.004701, 8.019123]), array([59.612735, -2.407101, -0.844581]), array([54.133613, 5.459295, 8.870544]), array([ 59.286775, -2.547348, -21.924281]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 59.286775, -2.547348, -21.924281]), array([ -2.605247, -55.324507, -7.065423]), array([ 59.286775, -2.547348, -21.924281]), array([ 6.489431, -11.670519, -30.851544]), array([ 59.286775, -2.547348, -21.924281]), array([48.734149, -2.004701, 8.019123]), array([ 59.286775, -2.547348, -21.924281]), array([-12.1714 , -6.494719, 25.361539]), array([ 59.286775, -2.547348, -21.924281]), array([-38.1525 , -13.054752, -5.607666]), array([ 59.286775, -2.547348, -21.924281]), array([ 30.150795, -4.286333, -31.136279]), array([ 59.286775, -2.547348, -21.924281]), array([-12.502286, -24.875165, -20.872351]), array([ 59.286775, -2.547348, -21.924281]), array([ 23.242996, -42.031295, -22.110624]), array([ 59.286775, -2.547348, -21.924281]), array([ 9.822772, -44.114976, -18.760442]), array([ 59.286775, -2.547348, -21.924281]), array([-30.092058, -33.534852, 43.097159]), array([ 59.286775, -2.547348, -21.924281]), array([ 54.048553, -37.427609, 12.535183]), array([ 59.286775, -2.547348, -21.924281]), array([ 59.995574, -14.366518, 26.025739]), array([ 59.286775, -2.547348, -21.924281]), array([ 59.286775, -2.547348, -21.924281]), array([ 59.286775, -2.547348, -21.924281]), array([ 47.987255, -16.887697, -39.699154]), array([ 59.286775, -2.547348, -21.924281]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 59.286775, -2.547348, -21.924281]), array([-14.49484 , -20.328269, -27.617052]), array([ 59.286775, -2.547348, -21.924281]), array([ -8.613724, -59.8286 , -27.915417]), array([ 59.286775, -2.547348, -21.924281]), array([ 18.541141, -24.947459, -60.138766]), array([ 59.286775, -2.547348, -21.924281]), array([ 9.897209, -53.324915, -23.790822]), array([ 59.286775, -2.547348, -21.924281]), array([-31.897851, -30.247588, -33.028094]), array([ 59.286775, -2.547348, -21.924281]), array([-68.477071, -22.67342 , -1.619763]), array([ 59.286775, -2.547348, -21.924281]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 47.987255, -16.887697, -39.699154]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 47.987255, -16.887697, -39.699154]), array([ -2.605247, -55.324507, -7.065423]), array([ 47.987255, -16.887697, -39.699154]), array([ 6.489431, -11.670519, -30.851544]), array([ 47.987255, -16.887697, -39.699154]), array([48.734149, -2.004701, 8.019123]), array([ 47.987255, -16.887697, -39.699154]), array([-12.1714 , -6.494719, 25.361539]), array([ 47.987255, -16.887697, -39.699154]), array([-38.1525 , -13.054752, -5.607666]), array([ 47.987255, -16.887697, -39.699154]), array([ 30.150795, -4.286333, -31.136279]), array([ 47.987255, -16.887697, -39.699154]), array([ 30.400644, -33.753689, 34.832572]), array([ 47.987255, -16.887697, -39.699154]), array([-12.502286, -24.875165, -20.872351]), array([ 47.987255, -16.887697, -39.699154]), array([ 23.242996, -42.031295, -22.110624]), array([ 47.987255, -16.887697, -39.699154]), array([ 9.822772, -44.114976, -18.760442]), array([ 47.987255, -16.887697, -39.699154]), array([-22.152851, -56.734891, 16.852029]), array([ 47.987255, -16.887697, -39.699154]), array([-51.151034, -35.899675, 25.679908]), array([ 47.987255, -16.887697, -39.699154]), array([-30.092058, -33.534852, 43.097159]), array([ 47.987255, -16.887697, -39.699154]), array([ 54.048553, -37.427609, 12.535183]), array([ 47.987255, -16.887697, -39.699154]), array([ 59.995574, -14.366518, 26.025739]), array([ 47.987255, -16.887697, -39.699154]), array([ 59.286775, -2.547348, -21.924281]), array([ 47.987255, -16.887697, -39.699154]), array([ 47.987255, -16.887697, -39.699154]), array([ 47.987255, -16.887697, -39.699154]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 47.987255, -16.887697, -39.699154]), array([ 53.338325, -45.334367, -18.998421]), array([ 47.987255, -16.887697, -39.699154]), array([-14.49484 , -20.328269, -27.617052]), array([ 47.987255, -16.887697, -39.699154]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 47.987255, -16.887697, -39.699154]), array([18.273358, -4.266078, 38.071488]), array([ 47.987255, -16.887697, -39.699154]), array([ 31.270899, -53.183604, -3.211336]), array([ 47.987255, -16.887697, -39.699154]), array([ -6.551567, -40.92204 , 34.412733]), array([ 47.987255, -16.887697, -39.699154]), array([ 6.093876, -48.998009, -7.897234]), array([ 47.987255, -16.887697, -39.699154]), array([ -8.613724, -59.8286 , -27.915417]), array([ 47.987255, -16.887697, -39.699154]), array([-23.429795, -51.025923, -39.842084]), array([ 47.987255, -16.887697, -39.699154]), array([ 18.541141, -24.947459, -60.138766]), array([ 47.987255, -16.887697, -39.699154]), array([ 9.897209, -53.324915, -23.790822]), array([ 47.987255, -16.887697, -39.699154]), array([-31.897851, -30.247588, -33.028094]), array([ 47.987255, -16.887697, -39.699154]), array([-68.477071, -22.67342 , -1.619763]), array([ 79.213202, -15.623481, -15.95848 ]), array([ -2.605247, -55.324507, -7.065423]), array([ 79.213202, -15.623481, -15.95848 ]), array([48.734149, -2.004701, 8.019123]), array([ 79.213202, -15.623481, -15.95848 ]), array([-38.1525 , -13.054752, -5.607666]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 30.150795, -4.286333, -31.136279]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 23.242996, -42.031295, -22.110624]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 9.822772, -44.114976, -18.760442]), array([ 79.213202, -15.623481, -15.95848 ]), array([-22.152851, -56.734891, 16.852029]), array([ 79.213202, -15.623481, -15.95848 ]), array([-51.151034, -35.899675, 25.679908]), array([ 79.213202, -15.623481, -15.95848 ]), array([-30.092058, -33.534852, 43.097159]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 54.048553, -37.427609, 12.535183]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 59.995574, -14.366518, 26.025739]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 59.286775, -2.547348, -21.924281]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 47.987255, -16.887697, -39.699154]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 53.338325, -45.334367, -18.998421]), array([ 79.213202, -15.623481, -15.95848 ]), array([-14.49484 , -20.328269, -27.617052]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 79.213202, -15.623481, -15.95848 ]), array([18.273358, -4.266078, 38.071488]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 31.270899, -53.183604, -3.211336]), array([ 79.213202, -15.623481, -15.95848 ]), array([ -6.551567, -40.92204 , 34.412733]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 6.093876, -48.998009, -7.897234]), array([ 79.213202, -15.623481, -15.95848 ]), array([ -8.613724, -59.8286 , -27.915417]), array([ 79.213202, -15.623481, -15.95848 ]), array([-23.429795, -51.025923, -39.842084]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 18.541141, -24.947459, -60.138766]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 9.897209, -53.324915, -23.790822]), array([ 79.213202, -15.623481, -15.95848 ]), array([-31.897851, -30.247588, -33.028094]), array([ 79.213202, -15.623481, -15.95848 ]), array([-68.477071, -22.67342 , -1.619763]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 77.946877, 20.707769, -18.710748]), array([ 53.338325, -45.334367, -18.998421]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 53.338325, -45.334367, -18.998421]), array([ -2.605247, -55.324507, -7.065423]), array([ 53.338325, -45.334367, -18.998421]), array([48.734149, -2.004701, 8.019123]), array([ 53.338325, -45.334367, -18.998421]), array([-12.1714 , -6.494719, 25.361539]), array([ 53.338325, -45.334367, -18.998421]), array([ 30.150795, -4.286333, -31.136279]), array([ 53.338325, -45.334367, -18.998421]), array([ 30.400644, -33.753689, 34.832572]), array([ 53.338325, -45.334367, -18.998421]), array([ 23.242996, -42.031295, -22.110624]), array([ 53.338325, -45.334367, -18.998421]), array([ 9.822772, -44.114976, -18.760442]), array([ 53.338325, -45.334367, -18.998421]), array([-22.152851, -56.734891, 16.852029]), array([ 53.338325, -45.334367, -18.998421]), array([-51.151034, -35.899675, 25.679908]), array([ 53.338325, -45.334367, -18.998421]), array([-43.927847, -8.226723, 27.584594]), array([ 53.338325, -45.334367, -18.998421]), array([-30.092058, -33.534852, 43.097159]), array([ 53.338325, -45.334367, -18.998421]), array([ 54.048553, -37.427609, 12.535183]), array([ 53.338325, -45.334367, -18.998421]), array([ 59.995574, -14.366518, 26.025739]), array([ 53.338325, -45.334367, -18.998421]), array([ 59.286775, -2.547348, -21.924281]), array([ 53.338325, -45.334367, -18.998421]), array([ 47.987255, -16.887697, -39.699154]), array([ 53.338325, -45.334367, -18.998421]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 53.338325, -45.334367, -18.998421]), array([ 53.338325, -45.334367, -18.998421]), array([ 53.338325, -45.334367, -18.998421]), array([-14.49484 , -20.328269, -27.617052]), array([ 53.338325, -45.334367, -18.998421]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 53.338325, -45.334367, -18.998421]), array([18.273358, -4.266078, 38.071488]), array([ 53.338325, -45.334367, -18.998421]), array([ 31.270899, -53.183604, -3.211336]), array([ 53.338325, -45.334367, -18.998421]), array([ 6.093876, -48.998009, -7.897234]), array([ 53.338325, -45.334367, -18.998421]), array([ -8.613724, -59.8286 , -27.915417]), array([ 53.338325, -45.334367, -18.998421]), array([-23.429795, -51.025923, -39.842084]), array([ 53.338325, -45.334367, -18.998421]), array([ 18.541141, -24.947459, -60.138766]), array([ 53.338325, -45.334367, -18.998421]), array([ 9.897209, -53.324915, -23.790822]), array([ 53.338325, -45.334367, -18.998421]), array([-31.897851, -30.247588, -33.028094]), array([ 53.338325, -45.334367, -18.998421]), array([-68.477071, -22.67342 , -1.619763]), array([-14.49484 , -20.328269, -27.617052]), array([ -9.885591, -47.084818, -3.13936 ]), array([-14.49484 , -20.328269, -27.617052]), array([ -2.605247, -55.324507, -7.065423]), array([-14.49484 , -20.328269, -27.617052]), array([ 6.489431, -11.670519, -30.851544]), array([-14.49484 , -20.328269, -27.617052]), array([48.734149, -2.004701, 8.019123]), array([-14.49484 , -20.328269, -27.617052]), array([-12.1714 , -6.494719, 25.361539]), array([-14.49484 , -20.328269, -27.617052]), array([-38.1525 , -13.054752, -5.607666]), array([-14.49484 , -20.328269, -27.617052]), array([ 30.150795, -4.286333, -31.136279]), array([-14.49484 , -20.328269, -27.617052]), array([ 30.400644, -33.753689, 34.832572]), array([-14.49484 , -20.328269, -27.617052]), array([-12.502286, -24.875165, -20.872351]), array([-14.49484 , -20.328269, -27.617052]), array([ 23.242996, -42.031295, -22.110624]), array([-14.49484 , -20.328269, -27.617052]), array([ 9.822772, -44.114976, -18.760442]), array([-14.49484 , -20.328269, -27.617052]), array([-22.152851, -56.734891, 16.852029]), array([-14.49484 , -20.328269, -27.617052]), array([-51.151034, -35.899675, 25.679908]), array([-14.49484 , -20.328269, -27.617052]), array([-30.092058, -33.534852, 43.097159]), array([-14.49484 , -20.328269, -27.617052]), array([ 54.048553, -37.427609, 12.535183]), array([-14.49484 , -20.328269, -27.617052]), array([ 59.995574, -14.366518, 26.025739]), array([-14.49484 , -20.328269, -27.617052]), array([ 59.286775, -2.547348, -21.924281]), array([-14.49484 , -20.328269, -27.617052]), array([ 47.987255, -16.887697, -39.699154]), array([-14.49484 , -20.328269, -27.617052]), array([ 79.213202, -15.623481, -15.95848 ]), array([-14.49484 , -20.328269, -27.617052]), array([ 53.338325, -45.334367, -18.998421]), array([-14.49484 , -20.328269, -27.617052]), array([-14.49484 , -20.328269, -27.617052]), array([-14.49484 , -20.328269, -27.617052]), array([ 6.093876, -48.998009, -7.897234]), array([-14.49484 , -20.328269, -27.617052]), array([ -8.613724, -59.8286 , -27.915417]), array([-14.49484 , -20.328269, -27.617052]), array([-23.429795, -51.025923, -39.842084]), array([-14.49484 , -20.328269, -27.617052]), array([ 18.541141, -24.947459, -60.138766]), array([-14.49484 , -20.328269, -27.617052]), array([ 9.897209, -53.324915, -23.790822]), array([-14.49484 , -20.328269, -27.617052]), array([-31.897851, -30.247588, -33.028094]), array([-14.49484 , -20.328269, -27.617052]), array([-68.477071, -22.67342 , -1.619763]), array([ 23.765633, -21.600569, 45.97906 ]), array([ -2.605247, -55.324507, -7.065423]), array([ 23.765633, -21.600569, 45.97906 ]), array([48.734149, -2.004701, 8.019123]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 30.400644, -33.753689, 34.832572]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 23.242996, -42.031295, -22.110624]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 9.822772, -44.114976, -18.760442]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 8.003023, -32.833685, 38.712349]), array([ 23.765633, -21.600569, 45.97906 ]), array([-22.152851, -56.734891, 16.852029]), array([ 23.765633, -21.600569, 45.97906 ]), array([-51.151034, -35.899675, 25.679908]), array([ 23.765633, -21.600569, 45.97906 ]), array([-43.927847, -8.226723, 27.584594]), array([ 23.765633, -21.600569, 45.97906 ]), array([-30.092058, -33.534852, 43.097159]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 54.048553, -37.427609, 12.535183]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 59.995574, -14.366518, 26.025739]), array([ 23.765633, -21.600569, 45.97906 ]), array([59.612735, -2.407101, -0.844581]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 47.987255, -16.887697, -39.699154]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 53.338325, -45.334367, -18.998421]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 23.765633, -21.600569, 45.97906 ]), array([18.273358, -4.266078, 38.071488]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 31.270899, -53.183604, -3.211336]), array([ 23.765633, -21.600569, 45.97906 ]), array([ -6.551567, -40.92204 , 34.412733]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 6.093876, -48.998009, -7.897234]), array([ 23.765633, -21.600569, 45.97906 ]), array([ -8.613724, -59.8286 , -27.915417]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 9.897209, -53.324915, -23.790822]), array([ 23.765633, -21.600569, 45.97906 ]), array([-68.477071, -22.67342 , -1.619763]), array([ 23.765633, -21.600569, 45.97906 ]), array([21.399859, 21.199044, 48.314342]), array([18.273358, -4.266078, 38.071488]), array([ -2.605247, -55.324507, -7.065423]), array([18.273358, -4.266078, 38.071488]), array([48.734149, -2.004701, 8.019123]), array([18.273358, -4.266078, 38.071488]), array([ 30.400644, -33.753689, 34.832572]), array([18.273358, -4.266078, 38.071488]), array([ 23.242996, -42.031295, -22.110624]), array([18.273358, -4.266078, 38.071488]), array([ 9.822772, -44.114976, -18.760442]), array([18.273358, -4.266078, 38.071488]), array([ 8.003023, -32.833685, 38.712349]), array([18.273358, -4.266078, 38.071488]), array([-22.152851, -56.734891, 16.852029]), array([18.273358, -4.266078, 38.071488]), array([-51.151034, -35.899675, 25.679908]), array([18.273358, -4.266078, 38.071488]), array([-43.927847, -8.226723, 27.584594]), array([18.273358, -4.266078, 38.071488]), array([-30.092058, -33.534852, 43.097159]), array([18.273358, -4.266078, 38.071488]), array([ 54.048553, -37.427609, 12.535183]), array([18.273358, -4.266078, 38.071488]), array([ 59.995574, -14.366518, 26.025739]), array([18.273358, -4.266078, 38.071488]), array([59.612735, -2.407101, -0.844581]), array([18.273358, -4.266078, 38.071488]), array([ 47.987255, -16.887697, -39.699154]), array([18.273358, -4.266078, 38.071488]), array([ 53.338325, -45.334367, -18.998421]), array([18.273358, -4.266078, 38.071488]), array([ 23.765633, -21.600569, 45.97906 ]), array([18.273358, -4.266078, 38.071488]), array([18.273358, -4.266078, 38.071488]), array([18.273358, -4.266078, 38.071488]), array([ 31.270899, -53.183604, -3.211336]), array([18.273358, -4.266078, 38.071488]), array([ -6.551567, -40.92204 , 34.412733]), array([18.273358, -4.266078, 38.071488]), array([ 6.093876, -48.998009, -7.897234]), array([18.273358, -4.266078, 38.071488]), array([ -8.613724, -59.8286 , -27.915417]), array([18.273358, -4.266078, 38.071488]), array([ 9.897209, -53.324915, -23.790822]), array([18.273358, -4.266078, 38.071488]), array([-68.477071, -22.67342 , -1.619763]), array([18.273358, -4.266078, 38.071488]), array([16.534061, 2.192421, 40.922159]), array([ 31.270899, -53.183604, -3.211336]), array([48.734149, -2.004701, 8.019123]), array([ 31.270899, -53.183604, -3.211336]), array([ 23.242996, -42.031295, -22.110624]), array([ 31.270899, -53.183604, -3.211336]), array([ 9.822772, -44.114976, -18.760442]), array([ 31.270899, -53.183604, -3.211336]), array([ 8.003023, -32.833685, 38.712349]), array([ 31.270899, -53.183604, -3.211336]), array([-22.152851, -56.734891, 16.852029]), array([ 31.270899, -53.183604, -3.211336]), array([-51.151034, -35.899675, 25.679908]), array([ 31.270899, -53.183604, -3.211336]), array([-43.927847, -8.226723, 27.584594]), array([ 31.270899, -53.183604, -3.211336]), array([-30.092058, -33.534852, 43.097159]), array([ 31.270899, -53.183604, -3.211336]), array([ 54.048553, -37.427609, 12.535183]), array([ 31.270899, -53.183604, -3.211336]), array([ 59.995574, -14.366518, 26.025739]), array([ 31.270899, -53.183604, -3.211336]), array([ 47.987255, -16.887697, -39.699154]), array([ 31.270899, -53.183604, -3.211336]), array([-14.49484 , -20.328269, -27.617052]), array([ 31.270899, -53.183604, -3.211336]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 31.270899, -53.183604, -3.211336]), array([18.273358, -4.266078, 38.071488]), array([ 31.270899, -53.183604, -3.211336]), array([ 31.270899, -53.183604, -3.211336]), array([ 31.270899, -53.183604, -3.211336]), array([ -6.551567, -40.92204 , 34.412733]), array([ 31.270899, -53.183604, -3.211336]), array([ 6.093876, -48.998009, -7.897234]), array([ 31.270899, -53.183604, -3.211336]), array([ -8.613724, -59.8286 , -27.915417]), array([ 31.270899, -53.183604, -3.211336]), array([-68.477071, -22.67342 , -1.619763]), array([ -6.551567, -40.92204 , 34.412733]), array([ 36.159029, -35.084312, -18.938829]), array([ -6.551567, -40.92204 , 34.412733]), array([ 23.242996, -42.031295, -22.110624]), array([ -6.551567, -40.92204 , 34.412733]), array([ 9.822772, -44.114976, -18.760442]), array([ -6.551567, -40.92204 , 34.412733]), array([ 8.003023, -32.833685, 38.712349]), array([ -6.551567, -40.92204 , 34.412733]), array([-22.152851, -56.734891, 16.852029]), array([ -6.551567, -40.92204 , 34.412733]), array([-51.151034, -35.899675, 25.679908]), array([ -6.551567, -40.92204 , 34.412733]), array([-30.092058, -33.534852, 43.097159]), array([ -6.551567, -40.92204 , 34.412733]), array([ 54.048553, -37.427609, 12.535183]), array([ -6.551567, -40.92204 , 34.412733]), array([ 23.765633, -21.600569, 45.97906 ]), array([ -6.551567, -40.92204 , 34.412733]), array([18.273358, -4.266078, 38.071488]), array([ -6.551567, -40.92204 , 34.412733]), array([ -6.551567, -40.92204 , 34.412733]), array([ -6.551567, -40.92204 , 34.412733]), array([ 6.093876, -48.998009, -7.897234]), array([ -6.551567, -40.92204 , 34.412733]), array([-10.91018 , 34.40576 , 39.609319]), array([ 6.093876, -48.998009, -7.897234]), array([48.734149, -2.004701, 8.019123]), array([ 6.093876, -48.998009, -7.897234]), array([ 36.159029, -35.084312, -18.938829]), array([ 6.093876, -48.998009, -7.897234]), array([ 9.822772, -44.114976, -18.760442]), array([ 6.093876, -48.998009, -7.897234]), array([ 8.003023, -32.833685, 38.712349]), array([ 6.093876, -48.998009, -7.897234]), array([-22.152851, -56.734891, 16.852029]), array([ 6.093876, -48.998009, -7.897234]), array([-51.151034, -35.899675, 25.679908]), array([ 6.093876, -48.998009, -7.897234]), array([ 54.048553, -37.427609, 12.535183]), array([ 6.093876, -48.998009, -7.897234]), array([ 31.270899, -53.183604, -3.211336]), array([ 6.093876, -48.998009, -7.897234]), array([ -6.551567, -40.92204 , 34.412733]), array([ 6.093876, -48.998009, -7.897234]), array([ 6.093876, -48.998009, -7.897234]), array([ -8.613724, -59.8286 , -27.915417]), array([ -9.885591, -47.084818, -3.13936 ]), array([ -8.613724, -59.8286 , -27.915417]), array([ -2.605247, -55.324507, -7.065423]), array([ -8.613724, -59.8286 , -27.915417]), array([ 6.489431, -11.670519, -30.851544]), array([ -8.613724, -59.8286 , -27.915417]), array([48.734149, -2.004701, 8.019123]), array([ -8.613724, -59.8286 , -27.915417]), array([-12.1714 , -6.494719, 25.361539]), array([ -8.613724, -59.8286 , -27.915417]), array([ 30.150795, -4.286333, -31.136279]), array([ -8.613724, -59.8286 , -27.915417]), array([ 30.400644, -33.753689, 34.832572]), array([ -8.613724, -59.8286 , -27.915417]), array([ 23.242996, -42.031295, -22.110624]), array([ -8.613724, -59.8286 , -27.915417]), array([ 9.822772, -44.114976, -18.760442]), array([ -8.613724, -59.8286 , -27.915417]), array([-22.152851, -56.734891, 16.852029]), array([ -8.613724, -59.8286 , -27.915417]), array([-51.151034, -35.899675, 25.679908]), array([ -8.613724, -59.8286 , -27.915417]), array([-43.927847, -8.226723, 27.584594]), array([ -8.613724, -59.8286 , -27.915417]), array([-30.092058, -33.534852, 43.097159]), array([ -8.613724, -59.8286 , -27.915417]), array([ 54.048553, -37.427609, 12.535183]), array([ -8.613724, -59.8286 , -27.915417]), array([ 59.995574, -14.366518, 26.025739]), array([ -8.613724, -59.8286 , -27.915417]), array([ 59.286775, -2.547348, -21.924281]), array([ -8.613724, -59.8286 , -27.915417]), array([ 47.987255, -16.887697, -39.699154]), array([ -8.613724, -59.8286 , -27.915417]), array([ 79.213202, -15.623481, -15.95848 ]), array([ -8.613724, -59.8286 , -27.915417]), array([-14.49484 , -20.328269, -27.617052]), array([ -8.613724, -59.8286 , -27.915417]), array([ -8.613724, -59.8286 , -27.915417]), array([ -8.613724, -59.8286 , -27.915417]), array([-23.429795, -51.025923, -39.842084]), array([ -8.613724, -59.8286 , -27.915417]), array([ 18.541141, -24.947459, -60.138766]), array([ -8.613724, -59.8286 , -27.915417]), array([ 9.897209, -53.324915, -23.790822]), array([ -8.613724, -59.8286 , -27.915417]), array([-31.897851, -30.247588, -33.028094]), array([ -8.613724, -59.8286 , -27.915417]), array([-70.449382, -12.870265, -11.423195]), array([ -8.613724, -59.8286 , -27.915417]), array([-68.477071, -22.67342 , -1.619763]), array([-23.429795, -51.025923, -39.842084]), array([ 6.489431, -11.670519, -30.851544]), array([-23.429795, -51.025923, -39.842084]), array([ 30.400644, -33.753689, 34.832572]), array([-23.429795, -51.025923, -39.842084]), array([ 9.822772, -44.114976, -18.760442]), array([-23.429795, -51.025923, -39.842084]), array([-22.152851, -56.734891, 16.852029]), array([-23.429795, -51.025923, -39.842084]), array([-51.151034, -35.899675, 25.679908]), array([-23.429795, -51.025923, -39.842084]), array([-30.092058, -33.534852, 43.097159]), array([-23.429795, -51.025923, -39.842084]), array([ 47.987255, -16.887697, -39.699154]), array([-23.429795, -51.025923, -39.842084]), array([ 53.338325, -45.334367, -18.998421]), array([-23.429795, -51.025923, -39.842084]), array([-14.49484 , -20.328269, -27.617052]), array([-23.429795, -51.025923, -39.842084]), array([ -8.613724, -59.8286 , -27.915417]), array([-23.429795, -51.025923, -39.842084]), array([-23.429795, -51.025923, -39.842084]), array([-23.429795, -51.025923, -39.842084]), array([ 18.541141, -24.947459, -60.138766]), array([-23.429795, -51.025923, -39.842084]), array([ 9.897209, -53.324915, -23.790822]), array([-23.429795, -51.025923, -39.842084]), array([-31.897851, -30.247588, -33.028094]), array([-23.429795, -51.025923, -39.842084]), array([-68.477071, -22.67342 , -1.619763]), array([ 18.541141, -24.947459, -60.138766]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 18.541141, -24.947459, -60.138766]), array([ -2.605247, -55.324507, -7.065423]), array([ 18.541141, -24.947459, -60.138766]), array([ 6.489431, -11.670519, -30.851544]), array([ 18.541141, -24.947459, -60.138766]), array([48.734149, -2.004701, 8.019123]), array([ 18.541141, -24.947459, -60.138766]), array([-38.1525 , -13.054752, -5.607666]), array([ 18.541141, -24.947459, -60.138766]), array([ 30.150795, -4.286333, -31.136279]), array([ 18.541141, -24.947459, -60.138766]), array([ 23.242996, -42.031295, -22.110624]), array([ 18.541141, -24.947459, -60.138766]), array([ 9.822772, -44.114976, -18.760442]), array([ 18.541141, -24.947459, -60.138766]), array([-22.152851, -56.734891, 16.852029]), array([ 18.541141, -24.947459, -60.138766]), array([ 54.048553, -37.427609, 12.535183]), array([ 18.541141, -24.947459, -60.138766]), array([ 59.286775, -2.547348, -21.924281]), array([ 18.541141, -24.947459, -60.138766]), array([ 47.987255, -16.887697, -39.699154]), array([ 18.541141, -24.947459, -60.138766]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 18.541141, -24.947459, -60.138766]), array([ 53.338325, -45.334367, -18.998421]), array([ 18.541141, -24.947459, -60.138766]), array([-14.49484 , -20.328269, -27.617052]), array([ 18.541141, -24.947459, -60.138766]), array([ -8.613724, -59.8286 , -27.915417]), array([ 18.541141, -24.947459, -60.138766]), array([-23.429795, -51.025923, -39.842084]), array([ 18.541141, -24.947459, -60.138766]), array([ 9.897209, -53.324915, -23.790822]), array([ 18.541141, -24.947459, -60.138766]), array([-31.897851, -30.247588, -33.028094]), array([ 9.897209, -53.324915, -23.790822]), array([ -9.885591, -47.084818, -3.13936 ]), array([ 9.897209, -53.324915, -23.790822]), array([ -2.605247, -55.324507, -7.065423]), array([ 9.897209, -53.324915, -23.790822]), array([ 6.489431, -11.670519, -30.851544]), array([ 9.897209, -53.324915, -23.790822]), array([-12.1714 , -6.494719, 25.361539]), array([ 9.897209, -53.324915, -23.790822]), array([ 30.400644, -33.753689, 34.832572]), array([ 9.897209, -53.324915, -23.790822]), array([ 23.242996, -42.031295, -22.110624]), array([ 9.897209, -53.324915, -23.790822]), array([-22.152851, -56.734891, 16.852029]), array([ 9.897209, -53.324915, -23.790822]), array([-51.151034, -35.899675, 25.679908]), array([ 9.897209, -53.324915, -23.790822]), array([-30.092058, -33.534852, 43.097159]), array([ 9.897209, -53.324915, -23.790822]), array([ 54.048553, -37.427609, 12.535183]), array([ 9.897209, -53.324915, -23.790822]), array([ 59.995574, -14.366518, 26.025739]), array([ 9.897209, -53.324915, -23.790822]), array([ 47.987255, -16.887697, -39.699154]), array([ 9.897209, -53.324915, -23.790822]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 9.897209, -53.324915, -23.790822]), array([ 53.338325, -45.334367, -18.998421]), array([ 9.897209, -53.324915, -23.790822]), array([-14.49484 , -20.328269, -27.617052]), array([ 9.897209, -53.324915, -23.790822]), array([ 23.765633, -21.600569, 45.97906 ]), array([ 9.897209, -53.324915, -23.790822]), array([ -8.613724, -59.8286 , -27.915417]), array([ 9.897209, -53.324915, -23.790822]), array([-23.429795, -51.025923, -39.842084]), array([ 9.897209, -53.324915, -23.790822]), array([ 18.541141, -24.947459, -60.138766]), array([ 9.897209, -53.324915, -23.790822]), array([ 9.897209, -53.324915, -23.790822]), array([ 9.897209, -53.324915, -23.790822]), array([-31.897851, -30.247588, -33.028094]), array([ 9.897209, -53.324915, -23.790822]), array([-68.477071, -22.67342 , -1.619763]), array([-31.897851, -30.247588, -33.028094]), array([ -9.885591, -47.084818, -3.13936 ]), array([-31.897851, -30.247588, -33.028094]), array([ -2.605247, -55.324507, -7.065423]), array([-31.897851, -30.247588, -33.028094]), array([ 6.489431, -11.670519, -30.851544]), array([-31.897851, -30.247588, -33.028094]), array([48.734149, -2.004701, 8.019123]), array([-31.897851, -30.247588, -33.028094]), array([-12.1714 , -6.494719, 25.361539]), array([-31.897851, -30.247588, -33.028094]), array([-38.1525 , -13.054752, -5.607666]), array([-31.897851, -30.247588, -33.028094]), array([ 30.150795, -4.286333, -31.136279]), array([-31.897851, -30.247588, -33.028094]), array([ 30.400644, -33.753689, 34.832572]), array([-31.897851, -30.247588, -33.028094]), array([ 23.242996, -42.031295, -22.110624]), array([-31.897851, -30.247588, -33.028094]), array([ 9.822772, -44.114976, -18.760442]), array([-31.897851, -30.247588, -33.028094]), array([-22.152851, -56.734891, 16.852029]), array([-31.897851, -30.247588, -33.028094]), array([-51.151034, -35.899675, 25.679908]), array([-31.897851, -30.247588, -33.028094]), array([-30.092058, -33.534852, 43.097159]), array([-31.897851, -30.247588, -33.028094]), array([ 54.048553, -37.427609, 12.535183]), array([-31.897851, -30.247588, -33.028094]), array([ 59.995574, -14.366518, 26.025739]), array([-31.897851, -30.247588, -33.028094]), array([ 59.286775, -2.547348, -21.924281]), array([-31.897851, -30.247588, -33.028094]), array([ 47.987255, -16.887697, -39.699154]), array([-31.897851, -30.247588, -33.028094]), array([ 79.213202, -15.623481, -15.95848 ]), array([-31.897851, -30.247588, -33.028094]), array([ 53.338325, -45.334367, -18.998421]), array([-31.897851, -30.247588, -33.028094]), array([-14.49484 , -20.328269, -27.617052]), array([-31.897851, -30.247588, -33.028094]), array([ 6.093876, -48.998009, -7.897234]), array([-31.897851, -30.247588, -33.028094]), array([ -8.613724, -59.8286 , -27.915417]), array([-31.897851, -30.247588, -33.028094]), array([-23.429795, -51.025923, -39.842084]), array([-31.897851, -30.247588, -33.028094]), array([ 18.541141, -24.947459, -60.138766]), array([-31.897851, -30.247588, -33.028094]), array([ 9.897209, -53.324915, -23.790822]), array([-31.897851, -30.247588, -33.028094]), array([-31.897851, -30.247588, -33.028094]), array([-31.897851, -30.247588, -33.028094]), array([-68.477071, -22.67342 , -1.619763]), array([-70.449382, -12.870265, -11.423195]), array([ 6.489431, -11.670519, -30.851544]), array([-70.449382, -12.870265, -11.423195]), array([-22.152851, -56.734891, 16.852029]), array([-70.449382, -12.870265, -11.423195]), array([-51.151034, -35.899675, 25.679908]), array([-70.449382, -12.870265, -11.423195]), array([-14.49484 , -20.328269, -27.617052]), array([-70.449382, -12.870265, -11.423195]), array([ -8.613724, -59.8286 , -27.915417]), array([-70.449382, -12.870265, -11.423195]), array([ 9.897209, -53.324915, -23.790822]), array([-70.449382, -12.870265, -11.423195]), array([-70.449382, -12.870265, -11.423195]), array([-70.449382, -12.870265, -11.423195]), array([-68.477071, -22.67342 , -1.619763]), array([-70.449382, -12.870265, -11.423195]), array([-60.66705 , 12.165386, -6.554734]), array([-68.477071, -22.67342 , -1.619763]), array([ 6.489431, -11.670519, -30.851544]), array([-68.477071, -22.67342 , -1.619763]), array([48.734149, -2.004701, 8.019123]), array([-68.477071, -22.67342 , -1.619763]), array([ 30.150795, -4.286333, -31.136279]), array([-68.477071, -22.67342 , -1.619763]), array([ 30.400644, -33.753689, 34.832572]), array([-68.477071, -22.67342 , -1.619763]), array([ 23.242996, -42.031295, -22.110624]), array([-68.477071, -22.67342 , -1.619763]), array([ 9.822772, -44.114976, -18.760442]), array([-68.477071, -22.67342 , -1.619763]), array([-22.152851, -56.734891, 16.852029]), array([-68.477071, -22.67342 , -1.619763]), array([-51.151034, -35.899675, 25.679908]), array([-68.477071, -22.67342 , -1.619763]), array([-43.927847, -8.226723, 27.584594]), array([-68.477071, -22.67342 , -1.619763]), array([-30.092058, -33.534852, 43.097159]), array([-68.477071, -22.67342 , -1.619763]), array([ 54.048553, -37.427609, 12.535183]), array([-68.477071, -22.67342 , -1.619763]), array([ 59.995574, -14.366518, 26.025739]), array([-68.477071, -22.67342 , -1.619763]), array([ 47.987255, -16.887697, -39.699154]), array([-68.477071, -22.67342 , -1.619763]), array([ 79.213202, -15.623481, -15.95848 ]), array([-68.477071, -22.67342 , -1.619763]), array([ 53.338325, -45.334367, -18.998421]), array([-68.477071, -22.67342 , -1.619763]), array([-14.49484 , -20.328269, -27.617052]), array([-68.477071, -22.67342 , -1.619763]), array([ 23.765633, -21.600569, 45.97906 ]), array([-68.477071, -22.67342 , -1.619763]), array([18.273358, -4.266078, 38.071488]), array([-68.477071, -22.67342 , -1.619763]), array([ 31.270899, -53.183604, -3.211336]), array([-68.477071, -22.67342 , -1.619763]), array([ -8.613724, -59.8286 , -27.915417]), array([-68.477071, -22.67342 , -1.619763]), array([-23.429795, -51.025923, -39.842084]), array([-68.477071, -22.67342 , -1.619763]), array([ 18.541141, -24.947459, -60.138766]), array([-68.477071, -22.67342 , -1.619763]), array([ 9.897209, -53.324915, -23.790822]), array([-68.477071, -22.67342 , -1.619763]), array([-31.897851, -30.247588, -33.028094]), array([-68.477071, -22.67342 , -1.619763]), array([-70.449382, -12.870265, -11.423195]), array([-68.477071, -22.67342 , -1.619763]), array([-68.477071, -22.67342 , -1.619763]), array([-68.477071, -22.67342 , -1.619763]), array([-66.770666, 19.431384, -4.138797]), array([-9.810758, 42.258358, -0.196899]), array([-9.810758, 42.258358, -0.196899]), array([-9.810758, 42.258358, -0.196899]), array([-7.680012, 58.825146, -1.913986]), array([-9.810758, 42.258358, -0.196899]), array([39.281208, 4.486598, 10.191669]), array([-9.810758, 42.258358, -0.196899]), array([ 28.220495, 8.508825, -31.633256]), array([-9.810758, 42.258358, -0.196899]), array([ 30.412158, 39.619089, -25.426555]), array([-9.810758, 42.258358, -0.196899]), array([ 9.534895, 45.586715, -15.697951]), array([-9.810758, 42.258358, -0.196899]), array([55.995996, 19.842407, 26.675811]), array([-9.810758, 42.258358, -0.196899]), array([ 54.173949, 6.505508, -16.27533 ]), array([-9.810758, 42.258358, -0.196899]), array([ 49.265878, 17.275875, -40.963937]), array([-9.810758, 42.258358, -0.196899]), array([ -8.0653 , 19.20328 , -31.944175]), array([-9.810758, 42.258358, -0.196899]), array([-14.078617, 60.366031, -27.023514]), array([-9.810758, 42.258358, -0.196899]), array([ -0.096289, 57.879062, -18.031089]), array([-9.810758, 42.258358, -0.196899]), array([-22.27433 , 30.547326, -39.308739]), array([-7.680012, 58.825146, -1.913986]), array([-9.810758, 42.258358, -0.196899]), array([-7.680012, 58.825146, -1.913986]), array([-7.680012, 58.825146, -1.913986]), array([-7.680012, 58.825146, -1.913986]), array([25.33148 , 38.587971, 32.110488]), array([-7.680012, 58.825146, -1.913986]), array([-23.959151, 52.704826, 22.570164]), array([-7.680012, 58.825146, -1.913986]), array([-51.903028, 33.658259, 25.071224]), array([-7.680012, 58.825146, -1.913986]), array([-41.261623, 3.156065, 31.680186]), array([-7.680012, 58.825146, -1.913986]), array([-33.257143, 25.624607, 48.06079 ]), array([-7.680012, 58.825146, -1.913986]), array([55.048683, 36.907935, 12.70272 ]), array([-7.680012, 58.825146, -1.913986]), array([ 49.265878, 17.275875, -40.963937]), array([-7.680012, 58.825146, -1.913986]), array([ 77.946877, 20.707769, -18.710748]), array([-7.680012, 58.825146, -1.913986]), array([ 52.237054, 48.425978, -14.636575]), array([-7.680012, 58.825146, -1.913986]), array([ -8.0653 , 19.20328 , -31.944175]), array([-7.680012, 58.825146, -1.913986]), array([21.399859, 21.199044, 48.314342]), array([-7.680012, 58.825146, -1.913986]), array([-14.078617, 60.366031, -27.023514]), array([-7.680012, 58.825146, -1.913986]), array([ -0.096289, 57.879062, -18.031089]), array([-7.680012, 58.825146, -1.913986]), array([-22.27433 , 30.547326, -39.308739]), array([ 7.671771, 16.535084, -32.110169]), array([ 6.489431, -11.670519, -30.851544]), array([ 7.671771, 16.535084, -32.110169]), array([ 7.671771, 16.535084, -32.110169]), array([ 7.671771, 16.535084, -32.110169]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 7.671771, 16.535084, -32.110169]), array([-14.078617, 60.366031, -27.023514]), array([ 7.671771, 16.535084, -32.110169]), array([-21.635537, 52.591846, -40.625765]), array([ 7.671771, 16.535084, -32.110169]), array([ 28.610946, 33.291033, -57.766536]), array([ 7.671771, 16.535084, -32.110169]), array([-22.27433 , 30.547326, -39.308739]), array([39.281208, 4.486598, 10.191669]), array([48.734149, -2.004701, 8.019123]), array([39.281208, 4.486598, 10.191669]), array([-9.810758, 42.258358, -0.196899]), array([39.281208, 4.486598, 10.191669]), array([ 7.671771, 16.535084, -32.110169]), array([39.281208, 4.486598, 10.191669]), array([39.281208, 4.486598, 10.191669]), array([39.281208, 4.486598, 10.191669]), array([-11.349411, 1.901778, 21.476145]), array([39.281208, 4.486598, 10.191669]), array([ 28.220495, 8.508825, -31.633256]), array([39.281208, 4.486598, 10.191669]), array([25.33148 , 38.587971, 32.110488]), array([39.281208, 4.486598, 10.191669]), array([ 37.054464, 40.364252, -30.482399]), array([39.281208, 4.486598, 10.191669]), array([-10.680653, 11.558159, -17.518622]), array([39.281208, 4.486598, 10.191669]), array([ 30.412158, 39.619089, -25.426555]), array([39.281208, 4.486598, 10.191669]), array([ 9.534895, 45.586715, -15.697951]), array([39.281208, 4.486598, 10.191669]), array([ 6.077868, 34.161497, 35.327252]), array([39.281208, 4.486598, 10.191669]), array([-51.903028, 33.658259, 25.071224]), array([39.281208, 4.486598, 10.191669]), array([-41.261623, 3.156065, 31.680186]), array([39.281208, 4.486598, 10.191669]), array([-33.257143, 25.624607, 48.06079 ]), array([39.281208, 4.486598, 10.191669]), array([55.048683, 36.907935, 12.70272 ]), array([39.281208, 4.486598, 10.191669]), array([55.995996, 19.842407, 26.675811]), array([39.281208, 4.486598, 10.191669]), array([54.133613, 5.459295, 8.870544]), array([39.281208, 4.486598, 10.191669]), array([ 54.173949, 6.505508, -16.27533 ]), array([39.281208, 4.486598, 10.191669]), array([ 49.265878, 17.275875, -40.963937]), array([39.281208, 4.486598, 10.191669]), array([ 77.946877, 20.707769, -18.710748]), array([39.281208, 4.486598, 10.191669]), array([ 52.237054, 48.425978, -14.636575]), array([39.281208, 4.486598, 10.191669]), array([ -8.0653 , 19.20328 , -31.944175]), array([39.281208, 4.486598, 10.191669]), array([21.399859, 21.199044, 48.314342]), array([39.281208, 4.486598, 10.191669]), array([16.534061, 2.192421, 40.922159]), array([39.281208, 4.486598, 10.191669]), array([28.761381, 51.960267, -2.848827]), array([39.281208, 4.486598, 10.191669]), array([ 4.454994, 51.654279, -5.310949]), array([39.281208, 4.486598, 10.191669]), array([ 28.610946, 33.291033, -57.766536]), array([39.281208, 4.486598, 10.191669]), array([-22.27433 , 30.547326, -39.308739]), array([39.281208, 4.486598, 10.191669]), array([-66.770666, 19.431384, -4.138797]), array([-11.349411, 1.901778, 21.476145]), array([-12.1714 , -6.494719, 25.361539]), array([-11.349411, 1.901778, 21.476145]), array([-9.810758, 42.258358, -0.196899]), array([-11.349411, 1.901778, 21.476145]), array([-7.680012, 58.825146, -1.913986]), array([-11.349411, 1.901778, 21.476145]), array([39.281208, 4.486598, 10.191669]), array([-11.349411, 1.901778, 21.476145]), array([-11.349411, 1.901778, 21.476145]), array([-11.349411, 1.901778, 21.476145]), array([-33.137736, 10.478931, -5.472519]), array([-11.349411, 1.901778, 21.476145]), array([ 28.220495, 8.508825, -31.633256]), array([-11.349411, 1.901778, 21.476145]), array([25.33148 , 38.587971, 32.110488]), array([-11.349411, 1.901778, 21.476145]), array([ 9.534895, 45.586715, -15.697951]), array([-11.349411, 1.901778, 21.476145]), array([ 6.077868, 34.161497, 35.327252]), array([-11.349411, 1.901778, 21.476145]), array([-51.903028, 33.658259, 25.071224]), array([-11.349411, 1.901778, 21.476145]), array([-41.261623, 3.156065, 31.680186]), array([-11.349411, 1.901778, 21.476145]), array([-33.257143, 25.624607, 48.06079 ]), array([-11.349411, 1.901778, 21.476145]), array([55.048683, 36.907935, 12.70272 ]), array([-11.349411, 1.901778, 21.476145]), array([ 54.173949, 6.505508, -16.27533 ]), array([-11.349411, 1.901778, 21.476145]), array([ 49.265878, 17.275875, -40.963937]), array([-11.349411, 1.901778, 21.476145]), array([ 77.946877, 20.707769, -18.710748]), array([-11.349411, 1.901778, 21.476145]), array([ -8.0653 , 19.20328 , -31.944175]), array([-11.349411, 1.901778, 21.476145]), array([-10.91018 , 34.40576 , 39.609319]), array([-11.349411, 1.901778, 21.476145]), array([ 4.454994, 51.654279, -5.310949]), array([-11.349411, 1.901778, 21.476145]), array([-14.078617, 60.366031, -27.023514]), array([-11.349411, 1.901778, 21.476145]), array([ -0.096289, 57.879062, -18.031089]), array([-11.349411, 1.901778, 21.476145]), array([-22.27433 , 30.547326, -39.308739]), array([-11.349411, 1.901778, 21.476145]), array([-66.770666, 19.431384, -4.138797]), array([-33.137736, 10.478931, -5.472519]), array([-38.1525 , -13.054752, -5.607666]), array([-33.137736, 10.478931, -5.472519]), array([-11.349411, 1.901778, 21.476145]), array([-33.137736, 10.478931, -5.472519]), array([-23.959151, 52.704826, 22.570164]), array([-33.137736, 10.478931, -5.472519]), array([-51.903028, 33.658259, 25.071224]), array([-33.137736, 10.478931, -5.472519]), array([-41.261623, 3.156065, 31.680186]), array([-33.137736, 10.478931, -5.472519]), array([-33.257143, 25.624607, 48.06079 ]), array([-33.137736, 10.478931, -5.472519]), array([55.048683, 36.907935, 12.70272 ]), array([-33.137736, 10.478931, -5.472519]), array([55.995996, 19.842407, 26.675811]), array([ 28.220495, 8.508825, -31.633256]), array([ 30.150795, -4.286333, -31.136279]), array([ 28.220495, 8.508825, -31.633256]), array([-9.810758, 42.258358, -0.196899]), array([ 28.220495, 8.508825, -31.633256]), array([-7.680012, 58.825146, -1.913986]), array([ 28.220495, 8.508825, -31.633256]), array([ 7.671771, 16.535084, -32.110169]), array([ 28.220495, 8.508825, -31.633256]), array([39.281208, 4.486598, 10.191669]), array([ 28.220495, 8.508825, -31.633256]), array([-11.349411, 1.901778, 21.476145]), array([ 28.220495, 8.508825, -31.633256]), array([-33.137736, 10.478931, -5.472519]), array([ 28.220495, 8.508825, -31.633256]), array([ 28.220495, 8.508825, -31.633256]), array([ 28.220495, 8.508825, -31.633256]), array([-10.680653, 11.558159, -17.518622]), array([ 28.220495, 8.508825, -31.633256]), array([ 30.412158, 39.619089, -25.426555]), array([ 28.220495, 8.508825, -31.633256]), array([ 9.534895, 45.586715, -15.697951]), array([ 28.220495, 8.508825, -31.633256]), array([-33.257143, 25.624607, 48.06079 ]), array([ 28.220495, 8.508825, -31.633256]), array([55.048683, 36.907935, 12.70272 ]), array([ 28.220495, 8.508825, -31.633256]), array([55.995996, 19.842407, 26.675811]), array([ 28.220495, 8.508825, -31.633256]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 28.220495, 8.508825, -31.633256]), array([ 49.265878, 17.275875, -40.963937]), array([ 28.220495, 8.508825, -31.633256]), array([ 77.946877, 20.707769, -18.710748]), array([ 28.220495, 8.508825, -31.633256]), array([ 52.237054, 48.425978, -14.636575]), array([ 28.220495, 8.508825, -31.633256]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 28.220495, 8.508825, -31.633256]), array([-14.078617, 60.366031, -27.023514]), array([ 28.220495, 8.508825, -31.633256]), array([ 28.610946, 33.291033, -57.766536]), array([ 28.220495, 8.508825, -31.633256]), array([ -0.096289, 57.879062, -18.031089]), array([ 28.220495, 8.508825, -31.633256]), array([-22.27433 , 30.547326, -39.308739]), array([ 28.220495, 8.508825, -31.633256]), array([-66.770666, 19.431384, -4.138797]), array([25.33148 , 38.587971, 32.110488]), array([ 30.400644, -33.753689, 34.832572]), array([25.33148 , 38.587971, 32.110488]), array([-9.810758, 42.258358, -0.196899]), array([25.33148 , 38.587971, 32.110488]), array([-7.680012, 58.825146, -1.913986]), array([25.33148 , 38.587971, 32.110488]), array([39.281208, 4.486598, 10.191669]), array([25.33148 , 38.587971, 32.110488]), array([-11.349411, 1.901778, 21.476145]), array([25.33148 , 38.587971, 32.110488]), array([-33.137736, 10.478931, -5.472519]), array([25.33148 , 38.587971, 32.110488]), array([25.33148 , 38.587971, 32.110488]), array([25.33148 , 38.587971, 32.110488]), array([ 30.412158, 39.619089, -25.426555]), array([25.33148 , 38.587971, 32.110488]), array([ 9.534895, 45.586715, -15.697951]), array([25.33148 , 38.587971, 32.110488]), array([-23.959151, 52.704826, 22.570164]), array([25.33148 , 38.587971, 32.110488]), array([-51.903028, 33.658259, 25.071224]), array([25.33148 , 38.587971, 32.110488]), array([-41.261623, 3.156065, 31.680186]), array([25.33148 , 38.587971, 32.110488]), array([-33.257143, 25.624607, 48.06079 ]), array([25.33148 , 38.587971, 32.110488]), array([55.048683, 36.907935, 12.70272 ]), array([25.33148 , 38.587971, 32.110488]), array([ 54.173949, 6.505508, -16.27533 ]), array([25.33148 , 38.587971, 32.110488]), array([ 49.265878, 17.275875, -40.963937]), array([25.33148 , 38.587971, 32.110488]), array([ 77.946877, 20.707769, -18.710748]), array([25.33148 , 38.587971, 32.110488]), array([ 52.237054, 48.425978, -14.636575]), array([25.33148 , 38.587971, 32.110488]), array([ -8.0653 , 19.20328 , -31.944175]), array([25.33148 , 38.587971, 32.110488]), array([21.399859, 21.199044, 48.314342]), array([25.33148 , 38.587971, 32.110488]), array([16.534061, 2.192421, 40.922159]), array([25.33148 , 38.587971, 32.110488]), array([-10.91018 , 34.40576 , 39.609319]), array([25.33148 , 38.587971, 32.110488]), array([-14.078617, 60.366031, -27.023514]), array([25.33148 , 38.587971, 32.110488]), array([ 28.610946, 33.291033, -57.766536]), array([25.33148 , 38.587971, 32.110488]), array([ -0.096289, 57.879062, -18.031089]), array([25.33148 , 38.587971, 32.110488]), array([-66.770666, 19.431384, -4.138797]), array([ 37.054464, 40.364252, -30.482399]), array([39.281208, 4.486598, 10.191669]), array([ 37.054464, 40.364252, -30.482399]), array([-11.349411, 1.901778, 21.476145]), array([ 37.054464, 40.364252, -30.482399]), array([ 37.054464, 40.364252, -30.482399]), array([ 37.054464, 40.364252, -30.482399]), array([ 30.412158, 39.619089, -25.426555]), array([ 37.054464, 40.364252, -30.482399]), array([ 9.534895, 45.586715, -15.697951]), array([ 37.054464, 40.364252, -30.482399]), array([-23.959151, 52.704826, 22.570164]), array([ 37.054464, 40.364252, -30.482399]), array([-51.903028, 33.658259, 25.071224]), array([ 37.054464, 40.364252, -30.482399]), array([55.048683, 36.907935, 12.70272 ]), array([ 37.054464, 40.364252, -30.482399]), array([ 49.265878, 17.275875, -40.963937]), array([ 37.054464, 40.364252, -30.482399]), array([ 77.946877, 20.707769, -18.710748]), array([ 37.054464, 40.364252, -30.482399]), array([21.399859, 21.199044, 48.314342]), array([ 37.054464, 40.364252, -30.482399]), array([16.534061, 2.192421, 40.922159]), array([ 37.054464, 40.364252, -30.482399]), array([-10.91018 , 34.40576 , 39.609319]), array([ 37.054464, 40.364252, -30.482399]), array([ 4.454994, 51.654279, -5.310949]), array([-10.680653, 11.558159, -17.518622]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 30.412158, 39.619089, -25.426555]), array([-9.810758, 42.258358, -0.196899]), array([ 30.412158, 39.619089, -25.426555]), array([-7.680012, 58.825146, -1.913986]), array([ 30.412158, 39.619089, -25.426555]), array([ 7.671771, 16.535084, -32.110169]), array([ 30.412158, 39.619089, -25.426555]), array([39.281208, 4.486598, 10.191669]), array([ 30.412158, 39.619089, -25.426555]), array([-11.349411, 1.901778, 21.476145]), array([ 30.412158, 39.619089, -25.426555]), array([-33.137736, 10.478931, -5.472519]), array([ 30.412158, 39.619089, -25.426555]), array([ 28.220495, 8.508825, -31.633256]), array([ 30.412158, 39.619089, -25.426555]), array([25.33148 , 38.587971, 32.110488]), array([ 30.412158, 39.619089, -25.426555]), array([-10.680653, 11.558159, -17.518622]), array([ 30.412158, 39.619089, -25.426555]), array([ 30.412158, 39.619089, -25.426555]), array([ 30.412158, 39.619089, -25.426555]), array([ 9.534895, 45.586715, -15.697951]), array([ 30.412158, 39.619089, -25.426555]), array([-23.959151, 52.704826, 22.570164]), array([ 30.412158, 39.619089, -25.426555]), array([-51.903028, 33.658259, 25.071224]), array([ 30.412158, 39.619089, -25.426555]), array([-41.261623, 3.156065, 31.680186]), array([ 30.412158, 39.619089, -25.426555]), array([-33.257143, 25.624607, 48.06079 ]), array([ 30.412158, 39.619089, -25.426555]), array([55.048683, 36.907935, 12.70272 ]), array([ 30.412158, 39.619089, -25.426555]), array([55.995996, 19.842407, 26.675811]), array([ 30.412158, 39.619089, -25.426555]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 30.412158, 39.619089, -25.426555]), array([ 49.265878, 17.275875, -40.963937]), array([ 30.412158, 39.619089, -25.426555]), array([ 77.946877, 20.707769, -18.710748]), array([ 30.412158, 39.619089, -25.426555]), array([ 52.237054, 48.425978, -14.636575]), array([ 30.412158, 39.619089, -25.426555]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 30.412158, 39.619089, -25.426555]), array([21.399859, 21.199044, 48.314342]), array([ 30.412158, 39.619089, -25.426555]), array([28.761381, 51.960267, -2.848827]), array([ 30.412158, 39.619089, -25.426555]), array([-10.91018 , 34.40576 , 39.609319]), array([ 30.412158, 39.619089, -25.426555]), array([ 4.454994, 51.654279, -5.310949]), array([ 30.412158, 39.619089, -25.426555]), array([ 28.610946, 33.291033, -57.766536]), array([ 30.412158, 39.619089, -25.426555]), array([ -0.096289, 57.879062, -18.031089]), array([ 30.412158, 39.619089, -25.426555]), array([-22.27433 , 30.547326, -39.308739]), array([ 30.412158, 39.619089, -25.426555]), array([-66.770666, 19.431384, -4.138797]), array([ 9.534895, 45.586715, -15.697951]), array([ 7.671771, 16.535084, -32.110169]), array([ 9.534895, 45.586715, -15.697951]), array([39.281208, 4.486598, 10.191669]), array([ 9.534895, 45.586715, -15.697951]), array([-33.137736, 10.478931, -5.472519]), array([ 9.534895, 45.586715, -15.697951]), array([ 28.220495, 8.508825, -31.633256]), array([ 9.534895, 45.586715, -15.697951]), array([-10.680653, 11.558159, -17.518622]), array([ 9.534895, 45.586715, -15.697951]), array([ 30.412158, 39.619089, -25.426555]), array([ 9.534895, 45.586715, -15.697951]), array([ 9.534895, 45.586715, -15.697951]), array([ 9.534895, 45.586715, -15.697951]), array([-23.959151, 52.704826, 22.570164]), array([ 9.534895, 45.586715, -15.697951]), array([-51.903028, 33.658259, 25.071224]), array([ 9.534895, 45.586715, -15.697951]), array([-41.261623, 3.156065, 31.680186]), array([ 9.534895, 45.586715, -15.697951]), array([-33.257143, 25.624607, 48.06079 ]), array([ 9.534895, 45.586715, -15.697951]), array([55.048683, 36.907935, 12.70272 ]), array([ 9.534895, 45.586715, -15.697951]), array([55.995996, 19.842407, 26.675811]), array([ 9.534895, 45.586715, -15.697951]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 9.534895, 45.586715, -15.697951]), array([ 49.265878, 17.275875, -40.963937]), array([ 9.534895, 45.586715, -15.697951]), array([ 52.237054, 48.425978, -14.636575]), array([ 9.534895, 45.586715, -15.697951]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 9.534895, 45.586715, -15.697951]), array([21.399859, 21.199044, 48.314342]), array([ 9.534895, 45.586715, -15.697951]), array([28.761381, 51.960267, -2.848827]), array([ 9.534895, 45.586715, -15.697951]), array([-10.91018 , 34.40576 , 39.609319]), array([ 9.534895, 45.586715, -15.697951]), array([ 4.454994, 51.654279, -5.310949]), array([ 9.534895, 45.586715, -15.697951]), array([ 28.610946, 33.291033, -57.766536]), array([ 9.534895, 45.586715, -15.697951]), array([-22.27433 , 30.547326, -39.308739]), array([ 9.534895, 45.586715, -15.697951]), array([-66.770666, 19.431384, -4.138797]), array([ 6.077868, 34.161497, 35.327252]), array([ 8.003023, -32.833685, 38.712349]), array([ 6.077868, 34.161497, 35.327252]), array([39.281208, 4.486598, 10.191669]), array([ 6.077868, 34.161497, 35.327252]), array([-11.349411, 1.901778, 21.476145]), array([ 6.077868, 34.161497, 35.327252]), array([ 30.412158, 39.619089, -25.426555]), array([ 6.077868, 34.161497, 35.327252]), array([ 9.534895, 45.586715, -15.697951]), array([ 6.077868, 34.161497, 35.327252]), array([ 6.077868, 34.161497, 35.327252]), array([ 6.077868, 34.161497, 35.327252]), array([-51.903028, 33.658259, 25.071224]), array([ 6.077868, 34.161497, 35.327252]), array([-41.261623, 3.156065, 31.680186]), array([ 6.077868, 34.161497, 35.327252]), array([-33.257143, 25.624607, 48.06079 ]), array([ 6.077868, 34.161497, 35.327252]), array([ 49.265878, 17.275875, -40.963937]), array([ 6.077868, 34.161497, 35.327252]), array([ 77.946877, 20.707769, -18.710748]), array([ 6.077868, 34.161497, 35.327252]), array([21.399859, 21.199044, 48.314342]), array([ 6.077868, 34.161497, 35.327252]), array([16.534061, 2.192421, 40.922159]), array([ 6.077868, 34.161497, 35.327252]), array([28.761381, 51.960267, -2.848827]), array([ 6.077868, 34.161497, 35.327252]), array([-10.91018 , 34.40576 , 39.609319]), array([ 6.077868, 34.161497, 35.327252]), array([ 4.454994, 51.654279, -5.310949]), array([ 6.077868, 34.161497, 35.327252]), array([-14.078617, 60.366031, -27.023514]), array([ 6.077868, 34.161497, 35.327252]), array([-66.770666, 19.431384, -4.138797]), array([-23.959151, 52.704826, 22.570164]), array([-7.680012, 58.825146, -1.913986]), array([-23.959151, 52.704826, 22.570164]), array([ 7.671771, 16.535084, -32.110169]), array([-23.959151, 52.704826, 22.570164]), array([39.281208, 4.486598, 10.191669]), array([-23.959151, 52.704826, 22.570164]), array([-11.349411, 1.901778, 21.476145]), array([-23.959151, 52.704826, 22.570164]), array([-33.137736, 10.478931, -5.472519]), array([-23.959151, 52.704826, 22.570164]), array([25.33148 , 38.587971, 32.110488]), array([-23.959151, 52.704826, 22.570164]), array([ 37.054464, 40.364252, -30.482399]), array([-23.959151, 52.704826, 22.570164]), array([ 30.412158, 39.619089, -25.426555]), array([-23.959151, 52.704826, 22.570164]), array([ 9.534895, 45.586715, -15.697951]), array([-23.959151, 52.704826, 22.570164]), array([-23.959151, 52.704826, 22.570164]), array([-23.959151, 52.704826, 22.570164]), array([-51.903028, 33.658259, 25.071224]), array([-23.959151, 52.704826, 22.570164]), array([-41.261623, 3.156065, 31.680186]), array([-23.959151, 52.704826, 22.570164]), array([-33.257143, 25.624607, 48.06079 ]), array([-23.959151, 52.704826, 22.570164]), array([55.995996, 19.842407, 26.675811]), array([-23.959151, 52.704826, 22.570164]), array([ 52.237054, 48.425978, -14.636575]), array([-23.959151, 52.704826, 22.570164]), array([ -8.0653 , 19.20328 , -31.944175]), array([-23.959151, 52.704826, 22.570164]), array([21.399859, 21.199044, 48.314342]), array([-23.959151, 52.704826, 22.570164]), array([16.534061, 2.192421, 40.922159]), array([-23.959151, 52.704826, 22.570164]), array([28.761381, 51.960267, -2.848827]), array([-23.959151, 52.704826, 22.570164]), array([-10.91018 , 34.40576 , 39.609319]), array([-23.959151, 52.704826, 22.570164]), array([ 4.454994, 51.654279, -5.310949]), array([-23.959151, 52.704826, 22.570164]), array([-14.078617, 60.366031, -27.023514]), array([-23.959151, 52.704826, 22.570164]), array([-21.635537, 52.591846, -40.625765]), array([-23.959151, 52.704826, 22.570164]), array([ 28.610946, 33.291033, -57.766536]), array([-23.959151, 52.704826, 22.570164]), array([ -0.096289, 57.879062, -18.031089]), array([-23.959151, 52.704826, 22.570164]), array([-22.27433 , 30.547326, -39.308739]), array([-23.959151, 52.704826, 22.570164]), array([-66.770666, 19.431384, -4.138797]), array([-51.903028, 33.658259, 25.071224]), array([-7.680012, 58.825146, -1.913986]), array([-51.903028, 33.658259, 25.071224]), array([ 7.671771, 16.535084, -32.110169]), array([-51.903028, 33.658259, 25.071224]), array([39.281208, 4.486598, 10.191669]), array([-51.903028, 33.658259, 25.071224]), array([-11.349411, 1.901778, 21.476145]), array([-51.903028, 33.658259, 25.071224]), array([-33.137736, 10.478931, -5.472519]), array([-51.903028, 33.658259, 25.071224]), array([25.33148 , 38.587971, 32.110488]), array([-51.903028, 33.658259, 25.071224]), array([ 37.054464, 40.364252, -30.482399]), array([-51.903028, 33.658259, 25.071224]), array([ 30.412158, 39.619089, -25.426555]), array([-51.903028, 33.658259, 25.071224]), array([ 9.534895, 45.586715, -15.697951]), array([-51.903028, 33.658259, 25.071224]), array([ 6.077868, 34.161497, 35.327252]), array([-51.903028, 33.658259, 25.071224]), array([-23.959151, 52.704826, 22.570164]), array([-51.903028, 33.658259, 25.071224]), array([-51.903028, 33.658259, 25.071224]), array([-51.903028, 33.658259, 25.071224]), array([-41.261623, 3.156065, 31.680186]), array([-51.903028, 33.658259, 25.071224]), array([-33.257143, 25.624607, 48.06079 ]), array([-51.903028, 33.658259, 25.071224]), array([55.048683, 36.907935, 12.70272 ]), array([-51.903028, 33.658259, 25.071224]), array([55.995996, 19.842407, 26.675811]), array([-51.903028, 33.658259, 25.071224]), array([ 52.237054, 48.425978, -14.636575]), array([-51.903028, 33.658259, 25.071224]), array([ -8.0653 , 19.20328 , -31.944175]), array([-51.903028, 33.658259, 25.071224]), array([21.399859, 21.199044, 48.314342]), array([-51.903028, 33.658259, 25.071224]), array([16.534061, 2.192421, 40.922159]), array([-51.903028, 33.658259, 25.071224]), array([28.761381, 51.960267, -2.848827]), array([-51.903028, 33.658259, 25.071224]), array([-10.91018 , 34.40576 , 39.609319]), array([-51.903028, 33.658259, 25.071224]), array([ 4.454994, 51.654279, -5.310949]), array([-51.903028, 33.658259, 25.071224]), array([-14.078617, 60.366031, -27.023514]), array([-51.903028, 33.658259, 25.071224]), array([-21.635537, 52.591846, -40.625765]), array([-51.903028, 33.658259, 25.071224]), array([ 28.610946, 33.291033, -57.766536]), array([-51.903028, 33.658259, 25.071224]), array([ -0.096289, 57.879062, -18.031089]), array([-51.903028, 33.658259, 25.071224]), array([-22.27433 , 30.547326, -39.308739]), array([-51.903028, 33.658259, 25.071224]), array([-60.66705 , 12.165386, -6.554734]), array([-51.903028, 33.658259, 25.071224]), array([-66.770666, 19.431384, -4.138797]), array([-41.261623, 3.156065, 31.680186]), array([-43.927847, -8.226723, 27.584594]), array([-41.261623, 3.156065, 31.680186]), array([39.281208, 4.486598, 10.191669]), array([-41.261623, 3.156065, 31.680186]), array([-11.349411, 1.901778, 21.476145]), array([-41.261623, 3.156065, 31.680186]), array([-33.137736, 10.478931, -5.472519]), array([-41.261623, 3.156065, 31.680186]), array([25.33148 , 38.587971, 32.110488]), array([-41.261623, 3.156065, 31.680186]), array([ 30.412158, 39.619089, -25.426555]), array([-41.261623, 3.156065, 31.680186]), array([ 9.534895, 45.586715, -15.697951]), array([-41.261623, 3.156065, 31.680186]), array([ 6.077868, 34.161497, 35.327252]), array([-41.261623, 3.156065, 31.680186]), array([-23.959151, 52.704826, 22.570164]), array([-41.261623, 3.156065, 31.680186]), array([-51.903028, 33.658259, 25.071224]), array([-41.261623, 3.156065, 31.680186]), array([-41.261623, 3.156065, 31.680186]), array([-41.261623, 3.156065, 31.680186]), array([-33.257143, 25.624607, 48.06079 ]), array([-41.261623, 3.156065, 31.680186]), array([55.048683, 36.907935, 12.70272 ]), array([-41.261623, 3.156065, 31.680186]), array([55.995996, 19.842407, 26.675811]), array([-41.261623, 3.156065, 31.680186]), array([ 49.265878, 17.275875, -40.963937]), array([-41.261623, 3.156065, 31.680186]), array([ 52.237054, 48.425978, -14.636575]), array([-41.261623, 3.156065, 31.680186]), array([ -8.0653 , 19.20328 , -31.944175]), array([-41.261623, 3.156065, 31.680186]), array([21.399859, 21.199044, 48.314342]), array([-41.261623, 3.156065, 31.680186]), array([16.534061, 2.192421, 40.922159]), array([-41.261623, 3.156065, 31.680186]), array([-14.078617, 60.366031, -27.023514]), array([-41.261623, 3.156065, 31.680186]), array([ -0.096289, 57.879062, -18.031089]), array([-41.261623, 3.156065, 31.680186]), array([-22.27433 , 30.547326, -39.308739]), array([-41.261623, 3.156065, 31.680186]), array([-66.770666, 19.431384, -4.138797]), array([-33.257143, 25.624607, 48.06079 ]), array([-30.092058, -33.534852, 43.097159]), array([-33.257143, 25.624607, 48.06079 ]), array([ 7.671771, 16.535084, -32.110169]), array([-33.257143, 25.624607, 48.06079 ]), array([39.281208, 4.486598, 10.191669]), array([-33.257143, 25.624607, 48.06079 ]), array([-11.349411, 1.901778, 21.476145]), array([-33.257143, 25.624607, 48.06079 ]), array([-33.137736, 10.478931, -5.472519]), array([-33.257143, 25.624607, 48.06079 ]), array([ 28.220495, 8.508825, -31.633256]), array([-33.257143, 25.624607, 48.06079 ]), array([25.33148 , 38.587971, 32.110488]), array([-33.257143, 25.624607, 48.06079 ]), array([ 30.412158, 39.619089, -25.426555]), array([-33.257143, 25.624607, 48.06079 ]), array([ 9.534895, 45.586715, -15.697951]), array([-33.257143, 25.624607, 48.06079 ]), array([ 6.077868, 34.161497, 35.327252]), array([-33.257143, 25.624607, 48.06079 ]), array([-23.959151, 52.704826, 22.570164]), array([-33.257143, 25.624607, 48.06079 ]), array([-51.903028, 33.658259, 25.071224]), array([-33.257143, 25.624607, 48.06079 ]), array([-41.261623, 3.156065, 31.680186]), array([-33.257143, 25.624607, 48.06079 ]), array([-33.257143, 25.624607, 48.06079 ]), array([-33.257143, 25.624607, 48.06079 ]), array([55.048683, 36.907935, 12.70272 ]), array([-33.257143, 25.624607, 48.06079 ]), array([55.995996, 19.842407, 26.675811]), array([-33.257143, 25.624607, 48.06079 ]), array([ 49.265878, 17.275875, -40.963937]), array([-33.257143, 25.624607, 48.06079 ]), array([ 77.946877, 20.707769, -18.710748]), array([-33.257143, 25.624607, 48.06079 ]), array([ 52.237054, 48.425978, -14.636575]), array([-33.257143, 25.624607, 48.06079 ]), array([ -8.0653 , 19.20328 , -31.944175]), array([-33.257143, 25.624607, 48.06079 ]), array([21.399859, 21.199044, 48.314342]), array([-33.257143, 25.624607, 48.06079 ]), array([16.534061, 2.192421, 40.922159]), array([-33.257143, 25.624607, 48.06079 ]), array([28.761381, 51.960267, -2.848827]), array([-33.257143, 25.624607, 48.06079 ]), array([-10.91018 , 34.40576 , 39.609319]), array([-33.257143, 25.624607, 48.06079 ]), array([-14.078617, 60.366031, -27.023514]), array([-33.257143, 25.624607, 48.06079 ]), array([-21.635537, 52.591846, -40.625765]), array([-33.257143, 25.624607, 48.06079 ]), array([ -0.096289, 57.879062, -18.031089]), array([-33.257143, 25.624607, 48.06079 ]), array([-22.27433 , 30.547326, -39.308739]), array([-33.257143, 25.624607, 48.06079 ]), array([-60.66705 , 12.165386, -6.554734]), array([-33.257143, 25.624607, 48.06079 ]), array([-66.770666, 19.431384, -4.138797]), array([55.048683, 36.907935, 12.70272 ]), array([ 54.048553, -37.427609, 12.535183]), array([55.048683, 36.907935, 12.70272 ]), array([-7.680012, 58.825146, -1.913986]), array([55.048683, 36.907935, 12.70272 ]), array([39.281208, 4.486598, 10.191669]), array([55.048683, 36.907935, 12.70272 ]), array([-11.349411, 1.901778, 21.476145]), array([55.048683, 36.907935, 12.70272 ]), array([-33.137736, 10.478931, -5.472519]), array([55.048683, 36.907935, 12.70272 ]), array([ 28.220495, 8.508825, -31.633256]), array([55.048683, 36.907935, 12.70272 ]), array([25.33148 , 38.587971, 32.110488]), array([55.048683, 36.907935, 12.70272 ]), array([ 30.412158, 39.619089, -25.426555]), array([55.048683, 36.907935, 12.70272 ]), array([ 9.534895, 45.586715, -15.697951]), array([55.048683, 36.907935, 12.70272 ]), array([-23.959151, 52.704826, 22.570164]), array([55.048683, 36.907935, 12.70272 ]), array([-51.903028, 33.658259, 25.071224]), array([55.048683, 36.907935, 12.70272 ]), array([-41.261623, 3.156065, 31.680186]), array([55.048683, 36.907935, 12.70272 ]), array([-33.257143, 25.624607, 48.06079 ]), array([55.048683, 36.907935, 12.70272 ]), array([55.048683, 36.907935, 12.70272 ]), array([55.048683, 36.907935, 12.70272 ]), array([55.995996, 19.842407, 26.675811]), array([55.048683, 36.907935, 12.70272 ]), array([54.133613, 5.459295, 8.870544]), array([55.048683, 36.907935, 12.70272 ]), array([ 54.173949, 6.505508, -16.27533 ]), array([55.048683, 36.907935, 12.70272 ]), array([ 49.265878, 17.275875, -40.963937]), array([55.048683, 36.907935, 12.70272 ]), array([ 77.946877, 20.707769, -18.710748]), array([55.048683, 36.907935, 12.70272 ]), array([ 52.237054, 48.425978, -14.636575]), array([55.048683, 36.907935, 12.70272 ]), array([ -8.0653 , 19.20328 , -31.944175]), array([55.048683, 36.907935, 12.70272 ]), array([21.399859, 21.199044, 48.314342]), array([55.048683, 36.907935, 12.70272 ]), array([16.534061, 2.192421, 40.922159]), array([55.048683, 36.907935, 12.70272 ]), array([28.761381, 51.960267, -2.848827]), array([55.048683, 36.907935, 12.70272 ]), array([-10.91018 , 34.40576 , 39.609319]), array([55.048683, 36.907935, 12.70272 ]), array([ 4.454994, 51.654279, -5.310949]), array([55.048683, 36.907935, 12.70272 ]), array([-14.078617, 60.366031, -27.023514]), array([55.048683, 36.907935, 12.70272 ]), array([ -0.096289, 57.879062, -18.031089]), array([55.048683, 36.907935, 12.70272 ]), array([-66.770666, 19.431384, -4.138797]), array([55.995996, 19.842407, 26.675811]), array([ 59.995574, -14.366518, 26.025739]), array([55.995996, 19.842407, 26.675811]), array([39.281208, 4.486598, 10.191669]), array([55.995996, 19.842407, 26.675811]), array([-11.349411, 1.901778, 21.476145]), array([55.995996, 19.842407, 26.675811]), array([-33.137736, 10.478931, -5.472519]), array([55.995996, 19.842407, 26.675811]), array([ 28.220495, 8.508825, -31.633256]), array([55.995996, 19.842407, 26.675811]), array([25.33148 , 38.587971, 32.110488]), array([55.995996, 19.842407, 26.675811]), array([ 30.412158, 39.619089, -25.426555]), array([55.995996, 19.842407, 26.675811]), array([ 9.534895, 45.586715, -15.697951]), array([55.995996, 19.842407, 26.675811]), array([-23.959151, 52.704826, 22.570164]), array([55.995996, 19.842407, 26.675811]), array([-51.903028, 33.658259, 25.071224]), array([55.995996, 19.842407, 26.675811]), array([-33.257143, 25.624607, 48.06079 ]), array([55.995996, 19.842407, 26.675811]), array([55.048683, 36.907935, 12.70272 ]), array([55.995996, 19.842407, 26.675811]), array([55.995996, 19.842407, 26.675811]), array([55.995996, 19.842407, 26.675811]), array([54.133613, 5.459295, 8.870544]), array([55.995996, 19.842407, 26.675811]), array([ 54.173949, 6.505508, -16.27533 ]), array([55.995996, 19.842407, 26.675811]), array([ 49.265878, 17.275875, -40.963937]), array([55.995996, 19.842407, 26.675811]), array([ 77.946877, 20.707769, -18.710748]), array([55.995996, 19.842407, 26.675811]), array([ 52.237054, 48.425978, -14.636575]), array([55.995996, 19.842407, 26.675811]), array([ -8.0653 , 19.20328 , -31.944175]), array([55.995996, 19.842407, 26.675811]), array([21.399859, 21.199044, 48.314342]), array([55.995996, 19.842407, 26.675811]), array([16.534061, 2.192421, 40.922159]), array([55.995996, 19.842407, 26.675811]), array([28.761381, 51.960267, -2.848827]), array([55.995996, 19.842407, 26.675811]), array([ 4.454994, 51.654279, -5.310949]), array([55.995996, 19.842407, 26.675811]), array([-14.078617, 60.366031, -27.023514]), array([55.995996, 19.842407, 26.675811]), array([-21.635537, 52.591846, -40.625765]), array([55.995996, 19.842407, 26.675811]), array([ 28.610946, 33.291033, -57.766536]), array([55.995996, 19.842407, 26.675811]), array([ -0.096289, 57.879062, -18.031089]), array([55.995996, 19.842407, 26.675811]), array([-22.27433 , 30.547326, -39.308739]), array([55.995996, 19.842407, 26.675811]), array([-66.770666, 19.431384, -4.138797]), array([54.133613, 5.459295, 8.870544]), array([59.612735, -2.407101, -0.844581]), array([54.133613, 5.459295, 8.870544]), array([39.281208, 4.486598, 10.191669]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 59.286775, -2.547348, -21.924281]), array([ 54.173949, 6.505508, -16.27533 ]), array([-9.810758, 42.258358, -0.196899]), array([ 54.173949, 6.505508, -16.27533 ]), array([-7.680012, 58.825146, -1.913986]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 7.671771, 16.535084, -32.110169]), array([ 54.173949, 6.505508, -16.27533 ]), array([39.281208, 4.486598, 10.191669]), array([ 54.173949, 6.505508, -16.27533 ]), array([-11.349411, 1.901778, 21.476145]), array([ 54.173949, 6.505508, -16.27533 ]), array([-33.137736, 10.478931, -5.472519]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 28.220495, 8.508825, -31.633256]), array([ 54.173949, 6.505508, -16.27533 ]), array([-10.680653, 11.558159, -17.518622]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 30.412158, 39.619089, -25.426555]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 9.534895, 45.586715, -15.697951]), array([ 54.173949, 6.505508, -16.27533 ]), array([-33.257143, 25.624607, 48.06079 ]), array([ 54.173949, 6.505508, -16.27533 ]), array([55.048683, 36.907935, 12.70272 ]), array([ 54.173949, 6.505508, -16.27533 ]), array([55.995996, 19.842407, 26.675811]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 49.265878, 17.275875, -40.963937]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 77.946877, 20.707769, -18.710748]), array([ 54.173949, 6.505508, -16.27533 ]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 54.173949, 6.505508, -16.27533 ]), array([-14.078617, 60.366031, -27.023514]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 28.610946, 33.291033, -57.766536]), array([ 54.173949, 6.505508, -16.27533 ]), array([ -0.096289, 57.879062, -18.031089]), array([ 54.173949, 6.505508, -16.27533 ]), array([-22.27433 , 30.547326, -39.308739]), array([ 54.173949, 6.505508, -16.27533 ]), array([-66.770666, 19.431384, -4.138797]), array([ 49.265878, 17.275875, -40.963937]), array([-9.810758, 42.258358, -0.196899]), array([ 49.265878, 17.275875, -40.963937]), array([-7.680012, 58.825146, -1.913986]), array([ 49.265878, 17.275875, -40.963937]), array([ 7.671771, 16.535084, -32.110169]), array([ 49.265878, 17.275875, -40.963937]), array([39.281208, 4.486598, 10.191669]), array([ 49.265878, 17.275875, -40.963937]), array([-11.349411, 1.901778, 21.476145]), array([ 49.265878, 17.275875, -40.963937]), array([-33.137736, 10.478931, -5.472519]), array([ 49.265878, 17.275875, -40.963937]), array([ 28.220495, 8.508825, -31.633256]), array([ 49.265878, 17.275875, -40.963937]), array([25.33148 , 38.587971, 32.110488]), array([ 49.265878, 17.275875, -40.963937]), array([-10.680653, 11.558159, -17.518622]), array([ 49.265878, 17.275875, -40.963937]), array([ 30.412158, 39.619089, -25.426555]), array([ 49.265878, 17.275875, -40.963937]), array([ 9.534895, 45.586715, -15.697951]), array([ 49.265878, 17.275875, -40.963937]), array([-23.959151, 52.704826, 22.570164]), array([ 49.265878, 17.275875, -40.963937]), array([-51.903028, 33.658259, 25.071224]), array([ 49.265878, 17.275875, -40.963937]), array([-33.257143, 25.624607, 48.06079 ]), array([ 49.265878, 17.275875, -40.963937]), array([55.048683, 36.907935, 12.70272 ]), array([ 49.265878, 17.275875, -40.963937]), array([55.995996, 19.842407, 26.675811]), array([ 49.265878, 17.275875, -40.963937]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 49.265878, 17.275875, -40.963937]), array([ 49.265878, 17.275875, -40.963937]), array([ 49.265878, 17.275875, -40.963937]), array([ 77.946877, 20.707769, -18.710748]), array([ 49.265878, 17.275875, -40.963937]), array([ 52.237054, 48.425978, -14.636575]), array([ 49.265878, 17.275875, -40.963937]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 49.265878, 17.275875, -40.963937]), array([21.399859, 21.199044, 48.314342]), array([ 49.265878, 17.275875, -40.963937]), array([16.534061, 2.192421, 40.922159]), array([ 49.265878, 17.275875, -40.963937]), array([28.761381, 51.960267, -2.848827]), array([ 49.265878, 17.275875, -40.963937]), array([-10.91018 , 34.40576 , 39.609319]), array([ 49.265878, 17.275875, -40.963937]), array([ 4.454994, 51.654279, -5.310949]), array([ 49.265878, 17.275875, -40.963937]), array([-14.078617, 60.366031, -27.023514]), array([ 49.265878, 17.275875, -40.963937]), array([-21.635537, 52.591846, -40.625765]), array([ 49.265878, 17.275875, -40.963937]), array([ 28.610946, 33.291033, -57.766536]), array([ 49.265878, 17.275875, -40.963937]), array([ -0.096289, 57.879062, -18.031089]), array([ 49.265878, 17.275875, -40.963937]), array([-22.27433 , 30.547326, -39.308739]), array([ 49.265878, 17.275875, -40.963937]), array([-66.770666, 19.431384, -4.138797]), array([ 77.946877, 20.707769, -18.710748]), array([ 79.213202, -15.623481, -15.95848 ]), array([ 77.946877, 20.707769, -18.710748]), array([-7.680012, 58.825146, -1.913986]), array([ 77.946877, 20.707769, -18.710748]), array([39.281208, 4.486598, 10.191669]), array([ 77.946877, 20.707769, -18.710748]), array([-33.137736, 10.478931, -5.472519]), array([ 77.946877, 20.707769, -18.710748]), array([ 28.220495, 8.508825, -31.633256]), array([ 77.946877, 20.707769, -18.710748]), array([ 30.412158, 39.619089, -25.426555]), array([ 77.946877, 20.707769, -18.710748]), array([ 9.534895, 45.586715, -15.697951]), array([ 77.946877, 20.707769, -18.710748]), array([-23.959151, 52.704826, 22.570164]), array([ 77.946877, 20.707769, -18.710748]), array([-51.903028, 33.658259, 25.071224]), array([ 77.946877, 20.707769, -18.710748]), array([-33.257143, 25.624607, 48.06079 ]), array([ 77.946877, 20.707769, -18.710748]), array([55.048683, 36.907935, 12.70272 ]), array([ 77.946877, 20.707769, -18.710748]), array([55.995996, 19.842407, 26.675811]), array([ 77.946877, 20.707769, -18.710748]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 77.946877, 20.707769, -18.710748]), array([ 49.265878, 17.275875, -40.963937]), array([ 77.946877, 20.707769, -18.710748]), array([ 77.946877, 20.707769, -18.710748]), array([ 77.946877, 20.707769, -18.710748]), array([ 52.237054, 48.425978, -14.636575]), array([ 77.946877, 20.707769, -18.710748]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 77.946877, 20.707769, -18.710748]), array([21.399859, 21.199044, 48.314342]), array([ 77.946877, 20.707769, -18.710748]), array([16.534061, 2.192421, 40.922159]), array([ 77.946877, 20.707769, -18.710748]), array([28.761381, 51.960267, -2.848827]), array([ 77.946877, 20.707769, -18.710748]), array([-10.91018 , 34.40576 , 39.609319]), array([ 77.946877, 20.707769, -18.710748]), array([ 4.454994, 51.654279, -5.310949]), array([ 77.946877, 20.707769, -18.710748]), array([-14.078617, 60.366031, -27.023514]), array([ 77.946877, 20.707769, -18.710748]), array([-21.635537, 52.591846, -40.625765]), array([ 77.946877, 20.707769, -18.710748]), array([ 28.610946, 33.291033, -57.766536]), array([ 77.946877, 20.707769, -18.710748]), array([ -0.096289, 57.879062, -18.031089]), array([ 77.946877, 20.707769, -18.710748]), array([-22.27433 , 30.547326, -39.308739]), array([ 77.946877, 20.707769, -18.710748]), array([-66.770666, 19.431384, -4.138797]), array([ 52.237054, 48.425978, -14.636575]), array([-9.810758, 42.258358, -0.196899]), array([ 52.237054, 48.425978, -14.636575]), array([-7.680012, 58.825146, -1.913986]), array([ 52.237054, 48.425978, -14.636575]), array([39.281208, 4.486598, 10.191669]), array([ 52.237054, 48.425978, -14.636575]), array([-11.349411, 1.901778, 21.476145]), array([ 52.237054, 48.425978, -14.636575]), array([ 28.220495, 8.508825, -31.633256]), array([ 52.237054, 48.425978, -14.636575]), array([25.33148 , 38.587971, 32.110488]), array([ 52.237054, 48.425978, -14.636575]), array([ 30.412158, 39.619089, -25.426555]), array([ 52.237054, 48.425978, -14.636575]), array([ 9.534895, 45.586715, -15.697951]), array([ 52.237054, 48.425978, -14.636575]), array([-23.959151, 52.704826, 22.570164]), array([ 52.237054, 48.425978, -14.636575]), array([-51.903028, 33.658259, 25.071224]), array([ 52.237054, 48.425978, -14.636575]), array([-41.261623, 3.156065, 31.680186]), array([ 52.237054, 48.425978, -14.636575]), array([-33.257143, 25.624607, 48.06079 ]), array([ 52.237054, 48.425978, -14.636575]), array([55.048683, 36.907935, 12.70272 ]), array([ 52.237054, 48.425978, -14.636575]), array([55.995996, 19.842407, 26.675811]), array([ 52.237054, 48.425978, -14.636575]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 52.237054, 48.425978, -14.636575]), array([ 49.265878, 17.275875, -40.963937]), array([ 52.237054, 48.425978, -14.636575]), array([ 77.946877, 20.707769, -18.710748]), array([ 52.237054, 48.425978, -14.636575]), array([ 52.237054, 48.425978, -14.636575]), array([ 52.237054, 48.425978, -14.636575]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 52.237054, 48.425978, -14.636575]), array([21.399859, 21.199044, 48.314342]), array([ 52.237054, 48.425978, -14.636575]), array([16.534061, 2.192421, 40.922159]), array([ 52.237054, 48.425978, -14.636575]), array([28.761381, 51.960267, -2.848827]), array([ 52.237054, 48.425978, -14.636575]), array([ 4.454994, 51.654279, -5.310949]), array([ 52.237054, 48.425978, -14.636575]), array([-14.078617, 60.366031, -27.023514]), array([ 52.237054, 48.425978, -14.636575]), array([-21.635537, 52.591846, -40.625765]), array([ 52.237054, 48.425978, -14.636575]), array([ 28.610946, 33.291033, -57.766536]), array([ 52.237054, 48.425978, -14.636575]), array([ -0.096289, 57.879062, -18.031089]), array([ 52.237054, 48.425978, -14.636575]), array([-22.27433 , 30.547326, -39.308739]), array([ 52.237054, 48.425978, -14.636575]), array([-66.770666, 19.431384, -4.138797]), array([ -8.0653 , 19.20328 , -31.944175]), array([-9.810758, 42.258358, -0.196899]), array([ -8.0653 , 19.20328 , -31.944175]), array([-7.680012, 58.825146, -1.913986]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 7.671771, 16.535084, -32.110169]), array([ -8.0653 , 19.20328 , -31.944175]), array([39.281208, 4.486598, 10.191669]), array([ -8.0653 , 19.20328 , -31.944175]), array([-11.349411, 1.901778, 21.476145]), array([ -8.0653 , 19.20328 , -31.944175]), array([-33.137736, 10.478931, -5.472519]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 28.220495, 8.508825, -31.633256]), array([ -8.0653 , 19.20328 , -31.944175]), array([25.33148 , 38.587971, 32.110488]), array([ -8.0653 , 19.20328 , -31.944175]), array([-10.680653, 11.558159, -17.518622]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 30.412158, 39.619089, -25.426555]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 9.534895, 45.586715, -15.697951]), array([ -8.0653 , 19.20328 , -31.944175]), array([-23.959151, 52.704826, 22.570164]), array([ -8.0653 , 19.20328 , -31.944175]), array([-51.903028, 33.658259, 25.071224]), array([ -8.0653 , 19.20328 , -31.944175]), array([-33.257143, 25.624607, 48.06079 ]), array([ -8.0653 , 19.20328 , -31.944175]), array([55.048683, 36.907935, 12.70272 ]), array([ -8.0653 , 19.20328 , -31.944175]), array([55.995996, 19.842407, 26.675811]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 54.173949, 6.505508, -16.27533 ]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 49.265878, 17.275875, -40.963937]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 77.946877, 20.707769, -18.710748]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 52.237054, 48.425978, -14.636575]), array([ -8.0653 , 19.20328 , -31.944175]), array([ -8.0653 , 19.20328 , -31.944175]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 4.454994, 51.654279, -5.310949]), array([ -8.0653 , 19.20328 , -31.944175]), array([-14.078617, 60.366031, -27.023514]), array([ -8.0653 , 19.20328 , -31.944175]), array([-21.635537, 52.591846, -40.625765]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 28.610946, 33.291033, -57.766536]), array([ -8.0653 , 19.20328 , -31.944175]), array([ -0.096289, 57.879062, -18.031089]), array([ -8.0653 , 19.20328 , -31.944175]), array([-22.27433 , 30.547326, -39.308739]), array([ -8.0653 , 19.20328 , -31.944175]), array([-66.770666, 19.431384, -4.138797]), array([21.399859, 21.199044, 48.314342]), array([ 23.765633, -21.600569, 45.97906 ]), array([21.399859, 21.199044, 48.314342]), array([-7.680012, 58.825146, -1.913986]), array([21.399859, 21.199044, 48.314342]), array([39.281208, 4.486598, 10.191669]), array([21.399859, 21.199044, 48.314342]), array([25.33148 , 38.587971, 32.110488]), array([21.399859, 21.199044, 48.314342]), array([ 30.412158, 39.619089, -25.426555]), array([21.399859, 21.199044, 48.314342]), array([ 9.534895, 45.586715, -15.697951]), array([21.399859, 21.199044, 48.314342]), array([ 6.077868, 34.161497, 35.327252]), array([21.399859, 21.199044, 48.314342]), array([-23.959151, 52.704826, 22.570164]), array([21.399859, 21.199044, 48.314342]), array([-51.903028, 33.658259, 25.071224]), array([21.399859, 21.199044, 48.314342]), array([-41.261623, 3.156065, 31.680186]), array([21.399859, 21.199044, 48.314342]), array([-33.257143, 25.624607, 48.06079 ]), array([21.399859, 21.199044, 48.314342]), array([55.048683, 36.907935, 12.70272 ]), array([21.399859, 21.199044, 48.314342]), array([55.995996, 19.842407, 26.675811]), array([21.399859, 21.199044, 48.314342]), array([54.133613, 5.459295, 8.870544]), array([21.399859, 21.199044, 48.314342]), array([ 49.265878, 17.275875, -40.963937]), array([21.399859, 21.199044, 48.314342]), array([ 52.237054, 48.425978, -14.636575]), array([21.399859, 21.199044, 48.314342]), array([21.399859, 21.199044, 48.314342]), array([21.399859, 21.199044, 48.314342]), array([16.534061, 2.192421, 40.922159]), array([21.399859, 21.199044, 48.314342]), array([28.761381, 51.960267, -2.848827]), array([21.399859, 21.199044, 48.314342]), array([-10.91018 , 34.40576 , 39.609319]), array([21.399859, 21.199044, 48.314342]), array([ 4.454994, 51.654279, -5.310949]), array([21.399859, 21.199044, 48.314342]), array([-14.078617, 60.366031, -27.023514]), array([21.399859, 21.199044, 48.314342]), array([ -0.096289, 57.879062, -18.031089]), array([21.399859, 21.199044, 48.314342]), array([-66.770666, 19.431384, -4.138797]), array([16.534061, 2.192421, 40.922159]), array([18.273358, -4.266078, 38.071488]), array([16.534061, 2.192421, 40.922159]), array([-7.680012, 58.825146, -1.913986]), array([16.534061, 2.192421, 40.922159]), array([39.281208, 4.486598, 10.191669]), array([16.534061, 2.192421, 40.922159]), array([25.33148 , 38.587971, 32.110488]), array([16.534061, 2.192421, 40.922159]), array([ 30.412158, 39.619089, -25.426555]), array([16.534061, 2.192421, 40.922159]), array([ 9.534895, 45.586715, -15.697951]), array([16.534061, 2.192421, 40.922159]), array([ 6.077868, 34.161497, 35.327252]), array([16.534061, 2.192421, 40.922159]), array([-23.959151, 52.704826, 22.570164]), array([16.534061, 2.192421, 40.922159]), array([-51.903028, 33.658259, 25.071224]), array([16.534061, 2.192421, 40.922159]), array([-41.261623, 3.156065, 31.680186]), array([16.534061, 2.192421, 40.922159]), array([-33.257143, 25.624607, 48.06079 ]), array([16.534061, 2.192421, 40.922159]), array([55.048683, 36.907935, 12.70272 ]), array([16.534061, 2.192421, 40.922159]), array([55.995996, 19.842407, 26.675811]), array([16.534061, 2.192421, 40.922159]), array([54.133613, 5.459295, 8.870544]), array([16.534061, 2.192421, 40.922159]), array([ 49.265878, 17.275875, -40.963937]), array([16.534061, 2.192421, 40.922159]), array([ 52.237054, 48.425978, -14.636575]), array([16.534061, 2.192421, 40.922159]), array([21.399859, 21.199044, 48.314342]), array([16.534061, 2.192421, 40.922159]), array([16.534061, 2.192421, 40.922159]), array([16.534061, 2.192421, 40.922159]), array([28.761381, 51.960267, -2.848827]), array([16.534061, 2.192421, 40.922159]), array([-10.91018 , 34.40576 , 39.609319]), array([16.534061, 2.192421, 40.922159]), array([ 4.454994, 51.654279, -5.310949]), array([16.534061, 2.192421, 40.922159]), array([-14.078617, 60.366031, -27.023514]), array([16.534061, 2.192421, 40.922159]), array([ -0.096289, 57.879062, -18.031089]), array([16.534061, 2.192421, 40.922159]), array([-66.770666, 19.431384, -4.138797]), array([28.761381, 51.960267, -2.848827]), array([39.281208, 4.486598, 10.191669]), array([28.761381, 51.960267, -2.848827]), array([ 30.412158, 39.619089, -25.426555]), array([28.761381, 51.960267, -2.848827]), array([ 9.534895, 45.586715, -15.697951]), array([28.761381, 51.960267, -2.848827]), array([ 6.077868, 34.161497, 35.327252]), array([28.761381, 51.960267, -2.848827]), array([-23.959151, 52.704826, 22.570164]), array([28.761381, 51.960267, -2.848827]), array([-51.903028, 33.658259, 25.071224]), array([28.761381, 51.960267, -2.848827]), array([-41.261623, 3.156065, 31.680186]), array([28.761381, 51.960267, -2.848827]), array([-33.257143, 25.624607, 48.06079 ]), array([28.761381, 51.960267, -2.848827]), array([55.048683, 36.907935, 12.70272 ]), array([28.761381, 51.960267, -2.848827]), array([55.995996, 19.842407, 26.675811]), array([28.761381, 51.960267, -2.848827]), array([ 49.265878, 17.275875, -40.963937]), array([28.761381, 51.960267, -2.848827]), array([ -8.0653 , 19.20328 , -31.944175]), array([28.761381, 51.960267, -2.848827]), array([21.399859, 21.199044, 48.314342]), array([28.761381, 51.960267, -2.848827]), array([16.534061, 2.192421, 40.922159]), array([28.761381, 51.960267, -2.848827]), array([28.761381, 51.960267, -2.848827]), array([28.761381, 51.960267, -2.848827]), array([-10.91018 , 34.40576 , 39.609319]), array([28.761381, 51.960267, -2.848827]), array([ 4.454994, 51.654279, -5.310949]), array([28.761381, 51.960267, -2.848827]), array([-14.078617, 60.366031, -27.023514]), array([28.761381, 51.960267, -2.848827]), array([-66.770666, 19.431384, -4.138797]), array([-10.91018 , 34.40576 , 39.609319]), array([ -6.551567, -40.92204 , 34.412733]), array([-10.91018 , 34.40576 , 39.609319]), array([ 37.054464, 40.364252, -30.482399]), array([-10.91018 , 34.40576 , 39.609319]), array([ 30.412158, 39.619089, -25.426555]), array([-10.91018 , 34.40576 , 39.609319]), array([ 9.534895, 45.586715, -15.697951]), array([-10.91018 , 34.40576 , 39.609319]), array([ 6.077868, 34.161497, 35.327252]), array([-10.91018 , 34.40576 , 39.609319]), array([-23.959151, 52.704826, 22.570164]), array([-10.91018 , 34.40576 , 39.609319]), array([-51.903028, 33.658259, 25.071224]), array([-10.91018 , 34.40576 , 39.609319]), array([-33.257143, 25.624607, 48.06079 ]), array([-10.91018 , 34.40576 , 39.609319]), array([55.048683, 36.907935, 12.70272 ]), array([-10.91018 , 34.40576 , 39.609319]), array([21.399859, 21.199044, 48.314342]), array([-10.91018 , 34.40576 , 39.609319]), array([16.534061, 2.192421, 40.922159]), array([-10.91018 , 34.40576 , 39.609319]), array([-10.91018 , 34.40576 , 39.609319]), array([-10.91018 , 34.40576 , 39.609319]), array([ 4.454994, 51.654279, -5.310949]), array([ 4.454994, 51.654279, -5.310949]), array([39.281208, 4.486598, 10.191669]), array([ 4.454994, 51.654279, -5.310949]), array([ 37.054464, 40.364252, -30.482399]), array([ 4.454994, 51.654279, -5.310949]), array([ 9.534895, 45.586715, -15.697951]), array([ 4.454994, 51.654279, -5.310949]), array([ 6.077868, 34.161497, 35.327252]), array([ 4.454994, 51.654279, -5.310949]), array([-23.959151, 52.704826, 22.570164]), array([ 4.454994, 51.654279, -5.310949]), array([-51.903028, 33.658259, 25.071224]), array([ 4.454994, 51.654279, -5.310949]), array([55.048683, 36.907935, 12.70272 ]), array([ 4.454994, 51.654279, -5.310949]), array([28.761381, 51.960267, -2.848827]), array([ 4.454994, 51.654279, -5.310949]), array([-10.91018 , 34.40576 , 39.609319]), array([ 4.454994, 51.654279, -5.310949]), array([ 4.454994, 51.654279, -5.310949]), array([-14.078617, 60.366031, -27.023514]), array([-9.810758, 42.258358, -0.196899]), array([-14.078617, 60.366031, -27.023514]), array([-7.680012, 58.825146, -1.913986]), array([-14.078617, 60.366031, -27.023514]), array([ 7.671771, 16.535084, -32.110169]), array([-14.078617, 60.366031, -27.023514]), array([39.281208, 4.486598, 10.191669]), array([-14.078617, 60.366031, -27.023514]), array([-11.349411, 1.901778, 21.476145]), array([-14.078617, 60.366031, -27.023514]), array([ 28.220495, 8.508825, -31.633256]), array([-14.078617, 60.366031, -27.023514]), array([25.33148 , 38.587971, 32.110488]), array([-14.078617, 60.366031, -27.023514]), array([ 30.412158, 39.619089, -25.426555]), array([-14.078617, 60.366031, -27.023514]), array([ 9.534895, 45.586715, -15.697951]), array([-14.078617, 60.366031, -27.023514]), array([-23.959151, 52.704826, 22.570164]), array([-14.078617, 60.366031, -27.023514]), array([-51.903028, 33.658259, 25.071224]), array([-14.078617, 60.366031, -27.023514]), array([-41.261623, 3.156065, 31.680186]), array([-14.078617, 60.366031, -27.023514]), array([-33.257143, 25.624607, 48.06079 ]), array([-14.078617, 60.366031, -27.023514]), array([55.048683, 36.907935, 12.70272 ]), array([-14.078617, 60.366031, -27.023514]), array([55.995996, 19.842407, 26.675811]), array([-14.078617, 60.366031, -27.023514]), array([ 54.173949, 6.505508, -16.27533 ]), array([-14.078617, 60.366031, -27.023514]), array([ 49.265878, 17.275875, -40.963937]), array([-14.078617, 60.366031, -27.023514]), array([ 77.946877, 20.707769, -18.710748]), array([-14.078617, 60.366031, -27.023514]), array([ -8.0653 , 19.20328 , -31.944175]), array([-14.078617, 60.366031, -27.023514]), array([-14.078617, 60.366031, -27.023514]), array([-14.078617, 60.366031, -27.023514]), array([-21.635537, 52.591846, -40.625765]), array([-14.078617, 60.366031, -27.023514]), array([ 28.610946, 33.291033, -57.766536]), array([-14.078617, 60.366031, -27.023514]), array([ -0.096289, 57.879062, -18.031089]), array([-14.078617, 60.366031, -27.023514]), array([-22.27433 , 30.547326, -39.308739]), array([-14.078617, 60.366031, -27.023514]), array([-60.66705 , 12.165386, -6.554734]), array([-14.078617, 60.366031, -27.023514]), array([-66.770666, 19.431384, -4.138797]), array([-21.635537, 52.591846, -40.625765]), array([ 7.671771, 16.535084, -32.110169]), array([-21.635537, 52.591846, -40.625765]), array([25.33148 , 38.587971, 32.110488]), array([-21.635537, 52.591846, -40.625765]), array([ 9.534895, 45.586715, -15.697951]), array([-21.635537, 52.591846, -40.625765]), array([-23.959151, 52.704826, 22.570164]), array([-21.635537, 52.591846, -40.625765]), array([-51.903028, 33.658259, 25.071224]), array([-21.635537, 52.591846, -40.625765]), array([-33.257143, 25.624607, 48.06079 ]), array([-21.635537, 52.591846, -40.625765]), array([ 49.265878, 17.275875, -40.963937]), array([-21.635537, 52.591846, -40.625765]), array([ 52.237054, 48.425978, -14.636575]), array([-21.635537, 52.591846, -40.625765]), array([ -8.0653 , 19.20328 , -31.944175]), array([-21.635537, 52.591846, -40.625765]), array([-14.078617, 60.366031, -27.023514]), array([-21.635537, 52.591846, -40.625765]), array([-21.635537, 52.591846, -40.625765]), array([-21.635537, 52.591846, -40.625765]), array([ 28.610946, 33.291033, -57.766536]), array([-21.635537, 52.591846, -40.625765]), array([ -0.096289, 57.879062, -18.031089]), array([-21.635537, 52.591846, -40.625765]), array([-22.27433 , 30.547326, -39.308739]), array([-21.635537, 52.591846, -40.625765]), array([-66.770666, 19.431384, -4.138797]), array([ 28.610946, 33.291033, -57.766536]), array([-9.810758, 42.258358, -0.196899]), array([ 28.610946, 33.291033, -57.766536]), array([-7.680012, 58.825146, -1.913986]), array([ 28.610946, 33.291033, -57.766536]), array([ 7.671771, 16.535084, -32.110169]), array([ 28.610946, 33.291033, -57.766536]), array([39.281208, 4.486598, 10.191669]), array([ 28.610946, 33.291033, -57.766536]), array([-33.137736, 10.478931, -5.472519]), array([ 28.610946, 33.291033, -57.766536]), array([ 28.220495, 8.508825, -31.633256]), array([ 28.610946, 33.291033, -57.766536]), array([ 30.412158, 39.619089, -25.426555]), array([ 28.610946, 33.291033, -57.766536]), array([ 9.534895, 45.586715, -15.697951]), array([ 28.610946, 33.291033, -57.766536]), array([-23.959151, 52.704826, 22.570164]), array([ 28.610946, 33.291033, -57.766536]), array([55.048683, 36.907935, 12.70272 ]), array([ 28.610946, 33.291033, -57.766536]), array([ 54.173949, 6.505508, -16.27533 ]), array([ 28.610946, 33.291033, -57.766536]), array([ 49.265878, 17.275875, -40.963937]), array([ 28.610946, 33.291033, -57.766536]), array([ 77.946877, 20.707769, -18.710748]), array([ 28.610946, 33.291033, -57.766536]), array([ 52.237054, 48.425978, -14.636575]), array([ 28.610946, 33.291033, -57.766536]), array([ -8.0653 , 19.20328 , -31.944175]), array([ 28.610946, 33.291033, -57.766536]), array([-14.078617, 60.366031, -27.023514]), array([ 28.610946, 33.291033, -57.766536]), array([-21.635537, 52.591846, -40.625765]), array([ 28.610946, 33.291033, -57.766536]), array([ -0.096289, 57.879062, -18.031089]), array([ 28.610946, 33.291033, -57.766536]), array([-22.27433 , 30.547326, -39.308739]), array([ -0.096289, 57.879062, -18.031089]), array([-9.810758, 42.258358, -0.196899]), array([ -0.096289, 57.879062, -18.031089]), array([-7.680012, 58.825146, -1.913986]), array([ -0.096289, 57.879062, -18.031089]), array([ 7.671771, 16.535084, -32.110169]), array([ -0.096289, 57.879062, -18.031089]), array([-11.349411, 1.901778, 21.476145]), array([ -0.096289, 57.879062, -18.031089]), array([25.33148 , 38.587971, 32.110488]), array([ -0.096289, 57.879062, -18.031089]), array([ 30.412158, 39.619089, -25.426555]), array([ -0.096289, 57.879062, -18.031089]), array([-23.959151, 52.704826, 22.570164]), array([ -0.096289, 57.879062, -18.031089]), array([-51.903028, 33.658259, 25.071224]), array([ -0.096289, 57.879062, -18.031089]), array([-33.257143, 25.624607, 48.06079 ]), array([ -0.096289, 57.879062, -18.031089]), array([55.048683, 36.907935, 12.70272 ]), array([ -0.096289, 57.879062, -18.031089]), array([55.995996, 19.842407, 26.675811]), array([ -0.096289, 57.879062, -18.031089]), array([ 49.265878, 17.275875, -40.963937]), array([ -0.096289, 57.879062, -18.031089]), array([ 77.946877, 20.707769, -18.710748]), array([ -0.096289, 57.879062, -18.031089]), array([ 52.237054, 48.425978, -14.636575]), array([ -0.096289, 57.879062, -18.031089]), array([ -8.0653 , 19.20328 , -31.944175]), array([ -0.096289, 57.879062, -18.031089]), array([21.399859, 21.199044, 48.314342]), array([ -0.096289, 57.879062, -18.031089]), array([-14.078617, 60.366031, -27.023514]), array([ -0.096289, 57.879062, -18.031089]), array([-21.635537, 52.591846, -40.625765]), array([ -0.096289, 57.879062, -18.031089]), array([ 28.610946, 33.291033, -57.766536]), array([ -0.096289, 57.879062, -18.031089]), array([ -0.096289, 57.879062, -18.031089]), array([ -0.096289, 57.879062, -18.031089]), array([-22.27433 , 30.547326, -39.308739]), array([ -0.096289, 57.879062, -18.031089]), array([-66.770666, 19.431384, -4.138797]), array([-22.27433 , 30.547326, -39.308739]), array([-9.810758, 42.258358, -0.196899]), array([-22.27433 , 30.547326, -39.308739]), array([-7.680012, 58.825146, -1.913986]), array([-22.27433 , 30.547326, -39.308739]), array([ 7.671771, 16.535084, -32.110169]), array([-22.27433 , 30.547326, -39.308739]), array([39.281208, 4.486598, 10.191669]), array([-22.27433 , 30.547326, -39.308739]), array([-11.349411, 1.901778, 21.476145]), array([-22.27433 , 30.547326, -39.308739]), array([-33.137736, 10.478931, -5.472519]), array([-22.27433 , 30.547326, -39.308739]), array([ 28.220495, 8.508825, -31.633256]), array([-22.27433 , 30.547326, -39.308739]), array([25.33148 , 38.587971, 32.110488]), array([-22.27433 , 30.547326, -39.308739]), array([ 30.412158, 39.619089, -25.426555]), array([-22.27433 , 30.547326, -39.308739]), array([ 9.534895, 45.586715, -15.697951]), array([-22.27433 , 30.547326, -39.308739]), array([-23.959151, 52.704826, 22.570164]), array([-22.27433 , 30.547326, -39.308739]), array([-51.903028, 33.658259, 25.071224]), array([-22.27433 , 30.547326, -39.308739]), array([-33.257143, 25.624607, 48.06079 ]), array([-22.27433 , 30.547326, -39.308739]), array([55.048683, 36.907935, 12.70272 ]), array([-22.27433 , 30.547326, -39.308739]), array([55.995996, 19.842407, 26.675811]), array([-22.27433 , 30.547326, -39.308739]), array([ 54.173949, 6.505508, -16.27533 ]), array([-22.27433 , 30.547326, -39.308739]), array([ 49.265878, 17.275875, -40.963937]), array([-22.27433 , 30.547326, -39.308739]), array([ 77.946877, 20.707769, -18.710748]), array([-22.27433 , 30.547326, -39.308739]), array([ 52.237054, 48.425978, -14.636575]), array([-22.27433 , 30.547326, -39.308739]), array([ -8.0653 , 19.20328 , -31.944175]), array([-22.27433 , 30.547326, -39.308739]), array([ 4.454994, 51.654279, -5.310949]), array([-22.27433 , 30.547326, -39.308739]), array([-14.078617, 60.366031, -27.023514]), array([-22.27433 , 30.547326, -39.308739]), array([-21.635537, 52.591846, -40.625765]), array([-22.27433 , 30.547326, -39.308739]), array([ 28.610946, 33.291033, -57.766536]), array([-22.27433 , 30.547326, -39.308739]), array([ -0.096289, 57.879062, -18.031089]), array([-22.27433 , 30.547326, -39.308739]), array([-22.27433 , 30.547326, -39.308739]), array([-22.27433 , 30.547326, -39.308739]), array([-66.770666, 19.431384, -4.138797]), array([-60.66705 , 12.165386, -6.554734]), array([-70.449382, -12.870265, -11.423195]), array([-60.66705 , 12.165386, -6.554734]), array([ 7.671771, 16.535084, -32.110169]), array([-60.66705 , 12.165386, -6.554734]), array([-23.959151, 52.704826, 22.570164]), array([-60.66705 , 12.165386, -6.554734]), array([-51.903028, 33.658259, 25.071224]), array([-60.66705 , 12.165386, -6.554734]), array([ -8.0653 , 19.20328 , -31.944175]), array([-60.66705 , 12.165386, -6.554734]), array([-14.078617, 60.366031, -27.023514]), array([-60.66705 , 12.165386, -6.554734]), array([ -0.096289, 57.879062, -18.031089]), array([-60.66705 , 12.165386, -6.554734]), array([-60.66705 , 12.165386, -6.554734]), array([-60.66705 , 12.165386, -6.554734]), array([-66.770666, 19.431384, -4.138797]), array([-66.770666, 19.431384, -4.138797]), array([-68.477071, -22.67342 , -1.619763]), array([-66.770666, 19.431384, -4.138797]), array([ 7.671771, 16.535084, -32.110169]), array([-66.770666, 19.431384, -4.138797]), array([39.281208, 4.486598, 10.191669]), array([-66.770666, 19.431384, -4.138797]), array([ 28.220495, 8.508825, -31.633256]), array([-66.770666, 19.431384, -4.138797]), array([25.33148 , 38.587971, 32.110488]), array([-66.770666, 19.431384, -4.138797]), array([ 30.412158, 39.619089, -25.426555]), array([-66.770666, 19.431384, -4.138797]), array([ 9.534895, 45.586715, -15.697951]), array([-66.770666, 19.431384, -4.138797]), array([-23.959151, 52.704826, 22.570164]), array([-66.770666, 19.431384, -4.138797]), array([-51.903028, 33.658259, 25.071224]), array([-66.770666, 19.431384, -4.138797]), array([-41.261623, 3.156065, 31.680186]), array([-66.770666, 19.431384, -4.138797]), array([-33.257143, 25.624607, 48.06079 ]), array([-66.770666, 19.431384, -4.138797]), array([55.048683, 36.907935, 12.70272 ]), array([-66.770666, 19.431384, -4.138797]), array([55.995996, 19.842407, 26.675811]), array([-66.770666, 19.431384, -4.138797]), array([ 49.265878, 17.275875, -40.963937]), array([-66.770666, 19.431384, -4.138797]), array([ 77.946877, 20.707769, -18.710748]), array([-66.770666, 19.431384, -4.138797]), array([ 52.237054, 48.425978, -14.636575]), array([-66.770666, 19.431384, -4.138797]), array([ -8.0653 , 19.20328 , -31.944175]), array([-66.770666, 19.431384, -4.138797]), array([21.399859, 21.199044, 48.314342]), array([-66.770666, 19.431384, -4.138797]), array([16.534061, 2.192421, 40.922159]), array([-66.770666, 19.431384, -4.138797]), array([28.761381, 51.960267, -2.848827]), array([-66.770666, 19.431384, -4.138797]), array([-14.078617, 60.366031, -27.023514]), array([-66.770666, 19.431384, -4.138797]), array([-21.635537, 52.591846, -40.625765]), array([-66.770666, 19.431384, -4.138797]), array([ 28.610946, 33.291033, -57.766536]), array([-66.770666, 19.431384, -4.138797]), array([ -0.096289, 57.879062, -18.031089]), array([-66.770666, 19.431384, -4.138797]), array([-22.27433 , 30.547326, -39.308739]), array([-66.770666, 19.431384, -4.138797]), array([-60.66705 , 12.165386, -6.554734]), array([-66.770666, 19.431384, -4.138797]), array([-66.770666, 19.431384, -4.138797])]\n", - "edges_coords [[ -9.885591 -47.084818 -3.13936 ]\n", - " [ -9.885591 -47.084818 -3.13936 ]\n", - " [ -9.885591 -47.084818 -3.13936 ]\n", - " ...\n", - " [-60.66705 12.165386 -6.554734]\n", - " [-66.770666 19.431384 -4.138797]\n", - " [-66.770666 19.431384 -4.138797]]\n" + "14-09-2023 05:51:45 - DEBUG - tvbwidgets - Package is not fully installed\n", + "14-09-2023 05:51:45 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", + "14-09-2023 05:51:45 - INFO - tvbwidgets - Version: 1.5.0\n", + "2023-09-14 17:51:51,244 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", + "14-09-2023 05:51:51 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", + "2023-09-14 17:51:51,372 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "ee27297579f643a68153bcf018bffb97", + "model_id": "73fcd28782784df6ad44c5a9daa27f7a", "version_major": 2, "version_minor": 0 }, @@ -114,7 +97,7 @@ "" ], "text/plain": [ - "" + "" ] }, "execution_count": 3, diff --git a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py index cc319875..0735a34e 100644 --- a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py +++ b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py @@ -48,6 +48,9 @@ def __init__(self, **kwargs): CONTEXT.observe(lambda *args: self.__show_plot(), ObservableAttrs.CONNECTIVITY) def add_datatype(self, datatype): # type: (HasTraits) -> None + """ + not supported + """ pass def __show_plot(self, matrix=None): @@ -111,13 +114,13 @@ def __init__(self, **kwargs): super(Connectivity3DViewer, self).__init__([self.output], *kwargs) - self.init_view_connectivity() - CONTEXT.observe(lambda *args: self.init_view_connectivity(), ObservableAttrs.CONNECTIVITY) + self.__init_view_connectivity() + CONTEXT.observe(lambda *args: self.__init_view_connectivity(), ObservableAttrs.CONNECTIVITY) - def init_view_connectivity(self): + def __init_view_connectivity(self): self.output.plotter.clear() - points, edges = self.add_actors() - points_toggle, edges_toggle, labels_toggle = self._init_controls() + points, edges = self.__add_actors() + points_toggle, edges_toggle, labels_toggle = self.__init_controls() def on_change_points(change): if change['new']: @@ -148,7 +151,7 @@ def on_change_edges(change): self.output.display_actor(edges) self.output.update_plot() - def _init_controls(self): + def __init_controls(self): points_toggle = ipywidgets.ToggleButton(value=True, description='Points' ) @@ -160,7 +163,7 @@ def _init_controls(self): description='Labels') return points_toggle, edges_toggle, labels_toggle - def add_actors(self): + def __add_actors(self): plotter = self.output.plotter points = CONTEXT.connectivity.centres @@ -172,13 +175,13 @@ def add_actors(self): points_actor = plotter.add_points(mesh_points, color=points_color, point_size=points_size) - edges_coords = self._extract_edges() + edges_coords = self.__extract_edges() edges_actor = plotter.add_lines(edges_coords, color=edge_color, width=1) plotter.camera_position = 'xy' return points_actor, edges_actor - def _extract_edges(self): + def __extract_edges(self): connectivity = CONTEXT.connectivity edge_indices = np.nonzero(connectivity.weights) edges = list(zip(edge_indices[0], edge_indices[1])) diff --git a/tvbwidgets/ui/connectivity_ipy/operations.py b/tvbwidgets/ui/connectivity_ipy/operations.py index 7bab013d..6c646824 100644 --- a/tvbwidgets/ui/connectivity_ipy/operations.py +++ b/tvbwidgets/ui/connectivity_ipy/operations.py @@ -27,7 +27,7 @@ def __init__(self, **kwargs): self.regions_checkboxes = [] selector = self.__get_node_selector() buttons = self.__get_operations_buttons() - history_dropdown = self.get_history_dropdown() + history_dropdown = self.__get_history_dropdown() children = [ ipywidgets.HTML( value=f'

Operations for Connectivity-{CONTEXT.connectivity.number_of_regions}

' @@ -37,7 +37,7 @@ def __init__(self, **kwargs): buttons] def update_history_ui(*args): - children[1] = self.get_history_dropdown() + children[1] = self.__get_history_dropdown() self.children = children self.send_state(self.keys) # trigger ui update @@ -96,46 +96,71 @@ def __get_operations_buttons(self): Create a new connectivity cutting the edges of selected nodes. Check the selected nodes in the above dropdown to see what it is included """ - cut_unselected_nodes = ipywidgets.Button(description='Cut selected regions', + button_layout = { + 'max-width': '200px', + 'width': '90%' + } + cut_unselected_nodes = ipywidgets.Button(description='Cut unselected regions', disabled=False, - button_style='success', + button_style='danger', tooltip=cut_selected_tooltip, - icon='scissors') + icon='scissors', + layout=button_layout) + + cut_selected_nodes = ipywidgets.Button(description='Cut selected regions', + disabled=False, + button_style='danger', + tooltip=cut_selected_tooltip, + icon='scissors', + layout=button_layout) cut_unselected_edges = ipywidgets.Button(description='Cut unselected edges', disabled=False, button_style='warning', tooltip=cut_edges_tooltip, - icon='scissors') + icon='scissors', + layout=button_layout) cut_selected_edges = ipywidgets.Button(description='Cut selected edges', disabled=False, button_style='warning', tooltip=cut_edges_tooltip, - icon='scissors') + icon='scissors', + layout=button_layout) - cut_unselected_nodes.on_click(lambda *args: self.__cut_selected_nodes()) + cut_unselected_nodes.on_click(lambda *args: self.__cut_nodes()) + cut_selected_nodes.on_click(lambda *args: self.__cut_nodes(selected=False)) cut_unselected_edges.on_click(lambda *args: self.__cut_edges()) cut_selected_edges.on_click(lambda *args: self.__cut_edges(selected=True)) - return ipywidgets.HBox(children=[cut_unselected_nodes, cut_unselected_edges, cut_selected_edges]) + node_operations = ipywidgets.VBox(children=(ipywidgets.Label('Node operations'), + cut_unselected_nodes, + cut_selected_nodes), + layout={'width': '50%'}) + edge_operations = ipywidgets.VBox(children=(ipywidgets.Label('Edge operations'), + cut_unselected_edges, + cut_selected_edges), + layout={'width': '50%'}) + + return ipywidgets.HBox(children=[node_operations, + edge_operations]) - def __cut_selected_nodes(self): + def __cut_nodes(self, selected=True): """ Create a new connectivity using only the selected nodes """ regions = CONTEXT.connectivity.region_labels selected_regions = [numpy.where(regions == label)[0][0] for label in self.selected_regions] - new_conn = self._cut_connectivity(selected_regions) + new_conn = self.__cut_connectivity_nodes(selected_regions, selected) CONTEXT.connectivity = new_conn def __cut_edges(self, selected=False): regions = CONTEXT.connectivity.region_labels selected_regions = numpy.array([numpy.where(regions == label)[0][0] for label in self.selected_regions]) - new_conn = self._cut_connectivity_edges(selected_regions, selected) + new_conn = self.__cut_connectivity_edges(selected_regions, selected) CONTEXT.connectivity = new_conn - def _reorder_arrays(self, original_conn, new_weights, interest_areas, new_tracts=None): + def __reorder_arrays(self, original_conn, new_weights, interest_areas, new_tracts=None): """ Returns ordered versions of the parameters according to the hemisphere permutation. """ @@ -150,7 +175,7 @@ def _reorder_arrays(self, original_conn, new_weights, interest_areas, new_tracts return new_weights, interest_areas, new_tracts - def get_history_dropdown(self): + def __get_history_dropdown(self): values = [(conn.gid.hex, conn) for conn in CONTEXT.connectivities_history] default = len(values) and values[-1][1] or None @@ -165,7 +190,7 @@ def on_connectivity_change(change): dropdown.observe(on_connectivity_change, 'value') return dropdown - def _cut_connectivity_edges(self, interest_areas, selected=False): + def __cut_connectivity_edges(self, interest_areas, selected=False): # type: (numpy.array, bool) -> Connectivity """ Generate new Connectivity based on a previous one, by changing weights (e.g. simulate lesion). @@ -182,10 +207,10 @@ def _cut_connectivity_edges(self, interest_areas, selected=False): LOGGER.error('No interest areas selected!') return CONTEXT.connectivity - new_weights, interest_areas, new_tracts = self._reorder_arrays(original_conn, - original_conn.weights, - interest_areas, - original_conn.tract_lengths) + new_weights, interest_areas, new_tracts = self.__reorder_arrays(original_conn, + original_conn.weights, + interest_areas, + original_conn.tract_lengths) for i in range(len(original_conn.weights)): for j in range(len(original_conn.weights)): @@ -209,26 +234,30 @@ def _cut_connectivity_edges(self, interest_areas, selected=False): final_conn.configure() return final_conn - def _cut_connectivity(self, interest_areas, selected=True): + def __cut_connectivity_nodes(self, interest_regions, selected=True): # type: (numpy.array, bool) -> Connectivity """ Generate new Connectivity object based on current one, by removing nodes (e.g. simulate lesion). Only the selected nodes will get used in the result if selected=True. The order of the indices in interest_areas matters. If indices are not sorted then the nodes will be permuted accordingly. - :param interest_areas: ndarray with the selected node indexes. + :param interest_regions: ndarray with the selected node indexes. :param selected: should use for the new connectivity the selected nodes (if false, uses the unselected nodes) """ original_conn = CONTEXT.connectivity + interest_areas = interest_regions + if not selected: + # make interest areas be those un selected + interest_areas = numpy.setdiff1d(numpy.array(list(range(original_conn.number_of_regions))), interest_areas) if not len(interest_areas): LOGGER.error('No interest areas selected!') return CONTEXT.connectivity - new_weights, interest_areas, new_tracts = self._reorder_arrays(original_conn, - original_conn.weights, - interest_areas, - original_conn.tract_lengths) + new_weights, interest_areas, new_tracts = self.__reorder_arrays(original_conn, + original_conn.weights, + interest_areas, + original_conn.tract_lengths) new_tracts = new_tracts[interest_areas, :][:, interest_areas] new_weights = new_weights[interest_areas, :][:, interest_areas] From 748cb6d9e997db14390b089523bed73d6fc6819c Mon Sep 17 00:00:00 2001 From: liadomide Date: Mon, 18 Sep 2023 23:00:08 +0300 Subject: [PATCH 22/24] WID-223 Prepare next version number 1.6.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 28652a3e..527351cf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tvb-widgets", - "version": "1.5.0", + "version": "1.6.0", "description": "GUI widgets for EBRAINS showcases", "homepage": "https://github.com/the-virtual-brain/tvb-widgets", "license": "GPL-3.0-or-later", From a3aa5533f08195a98bc27653005d5e8fe81d6c58 Mon Sep 17 00:00:00 2001 From: liadomide Date: Mon, 18 Sep 2023 23:05:51 +0300 Subject: [PATCH 23/24] WID-223 Cleanup cell outputs --- notebooks/HeadWidget.ipynb | 150 ++++--------------------------------- 1 file changed, 16 insertions(+), 134 deletions(-) diff --git a/notebooks/HeadWidget.ipynb b/notebooks/HeadWidget.ipynb index aa9e8da7..69e9ba61 100644 --- a/notebooks/HeadWidget.ipynb +++ b/notebooks/HeadWidget.ipynb @@ -34,22 +34,10 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "4675abde-4b90-4931-be0a-645ea3a81003", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "25-08-2023 10:55:57 - DEBUG - tvbwidgets - Package is not fully installed\n", - "25-08-2023 10:55:57 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", - "25-08-2023 10:55:57 - INFO - tvbwidgets - Version: 1.5.0\n", - "2023-08-25 10:56:02,673 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", - "25-08-2023 10:56:02 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n" - ] - } - ], + "outputs": [], "source": [ "from tvbwidgets.api import HeadWidget, HeadWidgetConfig\n", "from tvb.simulator.lab import *\n", @@ -58,26 +46,10 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "2bfd8e45-cfe1-44f4-b934-823716e27fad", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\david.bacter\\AppData\\Roaming\\Python\\Python310\\site-packages\\tvb\\basic\\readers.py:122: UserWarning: loadtxt: input contained no data: \"\"\n", - " array_result = numpy.loadtxt(file_stream, dtype=dtype, skiprows=skip_rows, usecols=use_cols)\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2023-08-25 10:56:03,843 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" - ] - } - ], + "outputs": [], "source": [ "surface = surfaces.Surface.from_file()\n", "surface.configure()\n", @@ -96,7 +68,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "aa76e23c-bc9e-4bdf-bd83-e68487b0aa28", "metadata": {}, "outputs": [], @@ -106,28 +78,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "fad7a0df-ffe2-4c94-b0f4-a1e828d34b50", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'name': 'Cortex',\n", - " 'style': 'Surface',\n", - " 'color': 'beige',\n", - " 'light': True,\n", - " 'size': 1500,\n", - " 'cmap': None,\n", - " 'scalars': None,\n", - " 'widget': None}" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "config = HeadWidgetConfig(name='Cortex', color='beige')\n", "wid.add_datatype(surface, config)\n", @@ -136,25 +90,10 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "0b6c41e9-8a03-4996-929f-3ebbafadcc49", "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "72e426c2465540d4ac9b4dcbea84101f", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "HeadWidget(children=(Accordion(children=(VBox(children=(Checkbox(value=True, description='Toggle Surface-8614'…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "display(wid)" ] @@ -169,28 +108,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "51e351e9-e1c9-416a-b486-3579fe718c43", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'name': 'Cortex',\n", - " 'style': 'Surface',\n", - " 'color': 'White',\n", - " 'light': True,\n", - " 'size': 1500,\n", - " 'cmap': 'fire',\n", - " 'scalars': array([36, 36, 36, ..., 68, 67, 68], dtype=int64),\n", - " 'widget': None}" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "config = HeadWidgetConfig(name='Cortex')\n", "config.add_region_mapping_as_cmap(reg_map)\n", @@ -199,27 +120,12 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "d50f83a3-667f-413f-a8d9-77437e41f9a4", "metadata": { "tags": [] }, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "f1e2f33eee654b3eb7949ef130e8ba7f", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "HeadWidget(children=(Accordion(children=(VBox(children=(Checkbox(value=True, description='Toggle Cortex'), Tex…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "wid = HeadWidget()\n", "wid.add_datatype(surface, config)\n", @@ -248,34 +154,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "30dceb75-9940-4d80-8c3a-f134748411b9", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "25-08-2023 10:56:04 - INFO - tvbwidgets.core.auth - We could not find Collab Auth Token, we will search for env CLB_AUTH variable\n", - "25-08-2023 10:56:04 - INFO - tvbwidgets.core.auth - We found Collab Auth in environment!\n", - "25-08-2023 10:56:04 - ERROR - tvbwidgets.ui.drive_widget - Could not retrieve Repos from EBRAINS Drive!\n" - ] - }, - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "1562b480444a4c1eb091d8d60007af6f", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "HeadBrowser(children=(StorageWidget(children=(VBox(), DriveWidget(children=(Dropdown(description='Repository',…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "from tvbwidgets.api import HeadBrowser\n", "from IPython.core.display_functions import display\n", @@ -308,7 +190,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.8.16" } }, "nbformat": 4, From eeb6f5665b8d2e00e4c33697c9190545356880c8 Mon Sep 17 00:00:00 2001 From: davidbacter01 Date: Tue, 19 Sep 2023 11:01:07 +0300 Subject: [PATCH 24/24] WID-223: make default visible tabs (operations/viewers) configurable, remove ConnectivityReact from api as it is not usable --- notebooks/Connectivity.ipynb | 27 +++++++------------ tvbwidgets/api.py | 1 - .../connectivity_ipy/connectivity_widget.py | 22 ++++++++++++--- 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/notebooks/Connectivity.ipynb b/notebooks/Connectivity.ipynb index d57d1fe0..186d710e 100644 --- a/notebooks/Connectivity.ipynb +++ b/notebooks/Connectivity.ipynb @@ -15,7 +15,7 @@ }, "outputs": [], "source": [ - "# from tvbwidgets.api import ConnectivityWidgetReact\n", + "# from tvbwidgets.ui.connectivity_react.connectivity_widget import ConnectivityWidgetReact\n", "# from tvb.datatypes.connectivity import Connectivity\n", "\n", "# connectivity = Connectivity.from_file() # defaults to connectivy_76.zip\n", @@ -34,18 +34,18 @@ "name": "stdout", "output_type": "stream", "text": [ - "14-09-2023 05:51:45 - DEBUG - tvbwidgets - Package is not fully installed\n", - "14-09-2023 05:51:45 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", - "14-09-2023 05:51:45 - INFO - tvbwidgets - Version: 1.5.0\n", - "2023-09-14 17:51:51,244 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", - "14-09-2023 05:51:51 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", - "2023-09-14 17:51:51,372 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" + "19-09-2023 10:57:09 - DEBUG - tvbwidgets - Package is not fully installed\n", + "19-09-2023 10:57:09 - DEBUG - tvbwidgets - Version read from the internal package.json file\n", + "19-09-2023 10:57:09 - INFO - tvbwidgets - Version: 1.5.0\n", + "2023-09-19 10:57:15,882 - INFO - tvb.storage.h5.encryption.data_encryption_handler - Cannot import syncrypto library.\n", + "19-09-2023 10:57:15 - INFO - tvbwidgets.core.pse.parameters - ImportError: Dask dependency is not included, so this functionality won't be available\n", + "2023-09-19 10:57:16,010 - WARNING - tvb.basic.readers - File 'hemispheres' not found in ZIP.\n" ] }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "73fcd28782784df6ad44c5a9daa27f7a", + "model_id": "b3a81813058645ecbe8abedd7dd6d17f", "version_major": 2, "version_minor": 0 }, @@ -67,7 +67,7 @@ "conn = Connectivity.from_file() # defaults to connectivy_76.zip\n", "conn.configure()\n", "\n", - "wid = ConnectivityWidget(conn)\n", + "wid = ConnectivityWidget(conn, default_active_tab='viewers') # default_active_tab can be any value between 'viewers'|'operations'|'both'\n", "\n", "display(wid)" ] @@ -97,7 +97,7 @@ "" ], "text/plain": [ - "" + "" ] }, "execution_count": 3, @@ -112,13 +112,6 @@ "new_connectivity = wid.get_connectivity(gid=None) \n", "new_connectivity" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/tvbwidgets/api.py b/tvbwidgets/api.py index 5c0b5237..77b82aaa 100644 --- a/tvbwidgets/api.py +++ b/tvbwidgets/api.py @@ -5,7 +5,6 @@ # (c) 2022-2023, TVB Widgets Team # -from .ui.connectivity_react.connectivity_widget import ConnectivityWidgetReact from .ui.connectivity_ipy.connectivity_widget import ConnectivityWidget from .ui.phase_plane_widget import PhasePlaneWidget from .ui.storage_widget import StorageWidget diff --git a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py index 0735a34e..55b836fc 100644 --- a/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py +++ b/tvbwidgets/ui/connectivity_ipy/connectivity_widget.py @@ -208,6 +208,14 @@ def __init__(self, **kwargs): class ConnectivityWidget(ipywidgets.VBox, TVBWidget): + """ + Widget to display a connectivity: + consists of two tabs, one for connectivity visualizers (2d/3d), + one for connectivity operations + :param connectivity: Connectivity to visualize or do operations on + :param default_active_tab: which tabs are viewable by default ('viewers'|'operations'|'both') + """ + def add_datatype(self, datatype): """ Doesn't allow this opp. at this time @@ -227,24 +235,32 @@ def get_connectivity(self, gid=None): return None return conn[0] - def __init__(self, connectivity, **kwargs): + def __init__(self, connectivity, default_active_tab='both', **kwargs): + style = self.DEFAULT_BORDER super().__init__(**kwargs, layout=style) config = ConnectivityConfig(name=f'Connectivity - {str(connectivity.number_of_regions)}') CONTEXT.connectivity = connectivity + viewers_visible = default_active_tab in ['both', 'viewers'] + operations_visible = default_active_tab in ['both', 'operations'] + self.viewers_tab = ConnectivityViewers() + self.viewers_tab.layout.display = viewers_visible and 'inline-block' or 'none' self.operations_tab = ConnectivityOperations() + self.operations_tab.layout.display = operations_visible and 'inline-block' or 'none' tabs = (self.viewers_tab, self.operations_tab) - viewers_checkbox = ipywidgets.Checkbox(value=True, description='Viewers') + viewers_checkbox = ipywidgets.Checkbox(value=viewers_visible or default_active_tab == 'viewers', + description='Viewers') def on_change_viewers(c): self.viewers_tab.layout.display = c['new'] and 'inline-block' or 'none' viewers_checkbox.observe(on_change_viewers, 'value') - operations_checkbox = ipywidgets.Checkbox(value=True, description='Operations') + operations_checkbox = ipywidgets.Checkbox( + value=operations_visible, description='Operations') def on_change_operations(c): self.operations_tab.layout.display = c['new'] and 'inline-block' or 'none'