Source code for tvb.config.init.introspector_registry
# -*- 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-2024, 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 inspect
from importlib import import_module
import tvb.adapters.uploaders
import tvb.adapters.visualizers
import tvb.adapters.datatypes.db
from tvb.adapters.analyzers import ALL_ANALYZERS
from tvb.adapters.creators import ALL_CREATORS
from tvb.adapters.simulator import ALL_SIMULATORS
from tvb.adapters.uploaders import ALL_UPLOADERS
from tvb.adapters.visualizers import ALL_VISUALIZERS
from tvb.adapters.datatypes.db import ALL_DATATYPES
from tvb.config.algorithm_categories import *
from tvb.basic.logger.builder import get_logger
from tvb.core.adapters.abcadapter import ABCAdapter
from tvb.core.entities.model.model_datatype import DataType
from tvb.adapters.analyzers.metrics_group_timeseries import TimeseriesMetricsAdapter
from tvb.adapters.simulator.simulator_adapter import SimulatorAdapter
from tvb.adapters.visualizers.connectivity import ConnectivityViewer
from tvb.adapters.visualizers.pse_discrete import DiscretePSEAdapter
from tvb.adapters.visualizers.pse_isocline import IsoclinePSEAdapter
LOGGER = get_logger(__name__)
[docs]
def import_adapters(adapters_top_module, all_adapter_files):
"""
@:param adapters_top_module: top module under which the ABCAdapter instances are searched for
@:param all_adapter_files: list of strings representing python submodules. We will import these,
relative to 'adapters_top_module' and introspect ass concrete subclasses of ABCAdapter defined inside
@:returns: list of ABCAdapter subclasses
"""
result = []
for adapters_file in all_adapter_files:
try:
adapters_module = import_module("." + adapters_file, adapters_top_module.__name__)
for ad_class in dir(adapters_module):
ad_class = adapters_module.__dict__[ad_class]
if inspect.isclass(ad_class) and ad_class.__module__ == adapters_module.__name__ and not \
inspect.isabstract(ad_class) and issubclass(ad_class, ABCAdapter):
if ad_class.can_be_active():
result.append(ad_class)
else:
LOGGER.warning("Skipped Adapter(probably because MATLAB not found):" + str(ad_class))
except Exception:
LOGGER.exception("Could not introspect Adapters file:" + adapters_file)
return result
[docs]
def import_dt_index(dt_top_module, all_dt_files):
"""
@:param dt_top_module: top module under which the DataType instances are searched for
@:param all_dt_files: list of strings representing python submodules. We will import these,
relative to 'dt_top_module' and introspect ass concrete subclasses of DataType defined inside
@:returns: list of Dt Index subclasses
"""
result = []
for adapters_file in all_dt_files:
try:
adapters_module = import_module("." + adapters_file, dt_top_module.__name__)
for ad_class in dir(adapters_module):
ad_class = adapters_module.__dict__[ad_class]
if inspect.isclass(ad_class) and not inspect.isabstract(ad_class) and issubclass(ad_class, DataType):
result.append(ad_class)
except ImportError:
LOGGER.exception("Could not introspect Adapters file:" + adapters_file)
return result
[docs]
class IntrospectionRegistry(object):
"""
This registry gathers classes that have a role in generating DB tables and rows.
It is used at introspection time, for the following operations:
- fill-in all rows in the ALGORITHM_CATEGORIES table
- fill-in all rows in the ALGORITHMS table
- generate DB tables for all datatype indexes
- keep an evidence of the datatype index removers
All classes that subclass AlgorithmCategoryConfig, ABCAdapter, ABCRemover, HasTraitsIndex should be imported here
and added to the proper dictionary/list.
e.g. Each new class of type HasTraitsIndex should be imported here and added to the DATATYPES list.
"""
ADAPTERS = {
AnalyzeAlgorithmCategoryConfig: import_adapters(tvb.adapters.analyzers, ALL_ANALYZERS),
SimulateAlgorithmCategoryConfig: import_adapters(tvb.adapters.simulator, ALL_SIMULATORS),
UploadAlgorithmCategoryConfig: import_adapters(tvb.adapters.uploaders, ALL_UPLOADERS),
ViewAlgorithmCategoryConfig: import_adapters(tvb.adapters.visualizers, ALL_VISUALIZERS),
CreateAlgorithmCategoryConfig: import_adapters(tvb.adapters.creators, ALL_CREATORS),
}
DATATYPES = import_dt_index(tvb.adapters.datatypes.db, ALL_DATATYPES)
SIMULATOR_MODULE = SimulatorAdapter.__module__
SIMULATOR_CLASS = SimulatorAdapter.__name__
CONNECTIVITY_MODULE = ConnectivityViewer.__module__
CONNECTIVITY_CLASS = ConnectivityViewer.__name__
ALLEN_CREATOR_MODULE = "tvb.adapters.creators.allen_creator"
ALLEN_CREATOR_CLASS = "AllenConnectomeBuilder"
SIIBRA_CREATOR_MODULE = "tvb.adapters.creators.siibra_creator"
SIIBRA_CREATOR_CLASS = "SiibraCreator"
MEASURE_METRICS_MODULE = TimeseriesMetricsAdapter.__module__
MEASURE_METRICS_CLASS = TimeseriesMetricsAdapter.__name__
DISCRETE_PSE_ADAPTER_MODULE = DiscretePSEAdapter.__module__
DISCRETE_PSE_ADAPTER_CLASS = DiscretePSEAdapter.__name__
ISOCLINE_PSE_ADAPTER_MODULE = IsoclinePSEAdapter.__module__
ISOCLINE_PSE_ADAPTER_CLASS = IsoclinePSEAdapter.__name__