Source code for tvb.adapters.analyzers.bct_centrality_adapters

# -*- coding: utf-8 -*-
#
#
# TheVirtualBrain-Framework Package. This package holds all Data Management, and
# Web-UI helpful to run brain-simulations. To use it, you also need to download
# TheVirtualBrain-Scientific Package (for simulators). See content of the
# documentation-folder for more details. See also http://www.thevirtualbrain.org
#
# (c) 2012-2023, Baycrest Centre for Geriatric Care ("Baycrest") and others
#
# This program is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software Foundation,
# either version 3 of the License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.  See the GNU General Public License for more details.
# You should have received a copy of the GNU General Public License along with this
# program.  If not, see <http://www.gnu.org/licenses/>.
#
#
#   CITATION:
# When using The Virtual Brain for scientific publications, please cite it as explained here:
# https://www.thevirtualbrain.org/tvb/zwei/neuroscience-publications
#
#

import bct
import numpy
from tvb.adapters.analyzers.bct_adapters import BaseBCT, BaseUndirected, LABEL_CONNECTIVITY_BINARY
from tvb.core.entities.model.model_operation import AlgorithmTransientGroup

BCT_GROUP_CENTRALITY = AlgorithmTransientGroup("Centrality Algorithms", "Brain Connectivity Toolbox", "bctcentrality")


[docs] class CentralityNodeBinary(BaseBCT): """ """ _ui_group = BCT_GROUP_CENTRALITY _ui_name = "Node Betweenness Centrality Binary: " + LABEL_CONNECTIVITY_BINARY _ui_description = bct.betweenness_bin.__doc__
[docs] def launch(self, view_model): connectivity = self.get_connectivity(view_model) result = bct.betweenness_bin(connectivity.binarized_weights) measure_index = self.build_connectivity_measure(result, connectivity, "Node Betweenness Centrality Binary", "Nodes") return [measure_index]
[docs] class CentralityNodeWeighted(BaseBCT): """ """ _ui_group = BCT_GROUP_CENTRALITY _ui_name = "Node Betweenness Centrality Weighted: Weighted (directed/undirected) connection matrix" _ui_description = bct.betweenness_wei.__doc__
[docs] def launch(self, view_model): connectivity = self.get_connectivity(view_model) result = bct.betweenness_wei(connectivity.weights) measure_index = self.build_connectivity_measure(result, connectivity, "Node Betweenness Centrality Weighted", "Nodes") return [measure_index]
# class CentralityEdgeBinary(CentralityNodeBinary): # """ # COMMENT OUT BECAUSE in v0.5.2: # could not broadcast input array from shape (16,) into shape (15,) # """ # _ui_name = "Edge Betweenness Centrality Binary" # _ui_description = bct.edge_betweenness_bin.__doc__ # # def launch(self, view_model): # connectivity = self.get_connectivity(view_model) # result = bct.edge_betweenness_bin(connectivity.binarized_weights) # measure_index1 = self.build_connectivity_measure(result[0], connectivity, "Edge Betweenness Centrality Matrix") # measure_index2 = self.build_connectivity_measure(result[1], connectivity, "Node Betweenness Centrality Vector") # return [measure_index1, measure_index2] # class CentralityEdgeWeighted(CentralityNodeWeighted): # """ # COMMENT OUT BECAUSE in v0.5.2: # could not broadcast input array from shape (16,) into shape (15,) # """ # _ui_name = "Edge Betweenness Centrality Weighted" # _ui_description = bct.edge_betweenness_wei.__doc__ # # def launch(self, view_model): # connectivity = self.get_connectivity(view_model) # result = bct.edge_betweenness_wei(connectivity.weights) # measure_index1 = self.build_connectivity_measure(result[0], connectivity, "Edge Betweeness Centrality Matrix") # measure_index2 = self.build_connectivity_measure(result[1], connectivity, "Node Betweenness Centrality Vector") # return [measure_index1, measure_index2]
[docs] class CentralityEigenVector(BaseUndirected): """ """ _ui_group = BCT_GROUP_CENTRALITY _ui_name = "EigenVector Centrality" _ui_description = bct.eigenvector_centrality_und.__doc__
[docs] def launch(self, view_model): connectivity = self.get_connectivity(view_model) result = bct.eigenvector_centrality_und(connectivity.weights) measure_index = self.build_connectivity_measure(result, connectivity, "Eigen vector centrality") return [measure_index]
[docs] class CentralityKCoreness(BaseUndirected): """ """ _ui_group = BCT_GROUP_CENTRALITY _ui_name = "K-coreness centrality BU: " + LABEL_CONNECTIVITY_BINARY _ui_description = bct.kcoreness_centrality_bu.__doc__
[docs] def launch(self, view_model): connectivity = self.get_connectivity(view_model) result = bct.kcoreness_centrality_bu(connectivity.binarized_weights) measure_index1 = self.build_connectivity_measure(result[0], connectivity, "Node coreness BU") measure_index2 = self.build_connectivity_measure(result[1], connectivity, "Size of k-core") return [measure_index1, measure_index2]
[docs] class CentralityKCorenessBD(CentralityNodeBinary): """ """ _ui_name = "K-coreness centrality BD" _ui_description = bct.kcoreness_centrality_bd.__doc__
[docs] def launch(self, view_model): connectivity = self.get_connectivity(view_model) result = bct.kcoreness_centrality_bd(connectivity.binarized_weights) measure_index1 = self.build_connectivity_measure(result[0], connectivity, "Node coreness BD") measure_index2 = self.build_connectivity_measure(result[1], connectivity, "Size of k-core") return [measure_index1, measure_index2]
[docs] class CentralityShortcuts(CentralityNodeBinary): """ """ _ui_name = "Centrality Shortcuts: Binary directed connection matrix" _ui_description = bct.erange.__doc__
[docs] def launch(self, view_model): connectivity = self.get_connectivity(view_model) result = bct.erange(connectivity.binarized_weights) measure_index1 = self.build_connectivity_measure(result[0], connectivity, "Range for each edge") value1 = self.build_int_value_wrapper(result[1], "Average range for entire graph") measure_index2 = self.build_connectivity_measure(result[2], connectivity, "Shortcut edges") value2 = self.build_float_value_wrapper(result[3], "Fraction of shortcuts in the graph") return [measure_index1, value1, measure_index2, value2]
[docs] class FlowCoefficients(CentralityNodeBinary): """ """ _ui_name = "Node-wise flow coefficients" _ui_description = bct.flow_coef_bd.__doc__
[docs] def launch(self, view_model): connectivity = self.get_connectivity(view_model) result = bct.flow_coef_bd(connectivity.binarized_weights) measure_index1 = self.build_connectivity_measure(result[0], connectivity, "Flow coefficient for each node") value1 = self.build_float_value_wrapper(result[1], "Average flow coefficient over the network") measure_index2 = self.build_connectivity_measure(result[2], connectivity, "Number of paths that flow across the central node") return [measure_index1, value1, measure_index2]
[docs] class ParticipationCoefficient(BaseBCT): """ """ _ui_group = BCT_GROUP_CENTRALITY _ui_name = "Participation Coefficient" _ui_description = bct.participation_coef.__doc__
[docs] def launch(self, view_model): connectivity = self.get_connectivity(view_model) ci, _ = bct.modularity_dir(connectivity.weights) try: result = bct.participation_coef(connectivity.weights, ci) except FloatingPointError as ex: self.log.exception(ex) self.add_operation_additional_info("FloatingPointError got during computation, defaulted to 0s!") result = numpy.zeros(connectivity.number_of_regions) measure_index = self.build_connectivity_measure(result, connectivity, "Participation Coefficient") return [measure_index]
[docs] class ParticipationCoefficientSign(ParticipationCoefficient): """ """ _ui_name = "Participation Coefficient Sign" _ui_description = bct.participation_coef_sign.__doc__
[docs] def launch(self, view_model): connectivity = self.get_connectivity(view_model) ci, _ = bct.modularity_dir(connectivity.weights) ppos, pneg = bct.participation_coef_sign(connectivity.weights, ci) measure_index1 = self.build_connectivity_measure(ppos, connectivity, "Participation Coefficient from positive weights") measure_index2 = self.build_connectivity_measure(pneg, connectivity, "Participation Coefficient from negative weights") return [measure_index1, measure_index2]
[docs] class SubgraphCentrality(CentralityNodeBinary): """ """ _ui_name = "Subgraph centrality of a network: Adjacency matrix (binary)" _ui_description = bct.subgraph_centrality.__doc__
[docs] def launch(self, view_model): connectivity = self.get_connectivity(view_model) result = bct.subgraph_centrality(connectivity.binarized_weights) measure_index = self.build_connectivity_measure(result, connectivity, "Subgraph Centrality") return [measure_index]