Source code for bluecellulab.importer
# Copyright 2023-2024 Blue Brain Project / EPFL
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Main importer of bluecellulab."""
import importlib_resources as resources
import logging
import os
from types import ModuleType
import neuron
from bluecellulab.exceptions import BluecellulabError
from bluecellulab.utils import CaptureOutput, run_once
logger = logging.getLogger(__name__)
[docs]
def import_mod_lib(neuron: ModuleType) -> str:
"""Import mod files."""
res = ""
if 'BLUECELLULAB_MOD_LIBRARY_PATH' in os.environ:
# Check if the current directory contains 'x86_64'.
if os.path.isdir('x86_64'):
raise BluecellulabError("BLUECELLULAB_MOD_LIBRARY_PATH is set"
" and current directory contains the x86_64 folder."
" Please remove one of them.")
mod_lib_path = os.environ["BLUECELLULAB_MOD_LIBRARY_PATH"]
if mod_lib_path.endswith(".so"):
neuron.h.nrn_load_dll(mod_lib_path)
else:
neuron.load_mechanisms(mod_lib_path)
res = mod_lib_path
elif os.path.isdir('x86_64'):
# NEURON 8.* automatically load these mechamisms
res = os.path.abspath('x86_64')
else:
res = "No mechanisms are loaded."
return res
[docs]
def import_hoc(neuron: ModuleType) -> None:
"""Import hoc dependencies."""
neuron.h.load_file("stdrun.hoc") # nrn
hoc_files = [
"Cell.hoc", # ND
"TDistFunc.hoc", # ND, test dependency
"TStim.hoc", # ND
"MorphIO.hoc", # H5 morphology support (loaded after Cell.hoc)
]
for hoc_file in hoc_files:
hoc_file_path = str(resources.files("bluecellulab") / f"hoc/{hoc_file}")
with CaptureOutput() as stdoud:
neuron.h.load_file(hoc_file_path)
logger.debug(f"Loaded {hoc_file}. stdout from the hoc: {stdoud}")
@run_once
def _load_mod_files() -> None:
"""Import hoc and mod files."""
logger.debug("Loading the mod files.")
mod_lib_paths = import_mod_lib(neuron)
print_header(neuron, mod_lib_paths)
def load_mod_files(func):
def wrapper(*args, **kwargs):
_load_mod_files()
return func(*args, **kwargs)
return wrapper