Source code for dendrotweaks.biophys.io.factories
# SPDX-FileCopyrightText: 2025 Poirazi Lab <dendrotweaks@dendrites.gr>
# SPDX-License-Identifier: MPL-2.0
import os
import sys
from typing import List, Tuple
from dendrotweaks.biophys.io.converter import MODFileConverter
from dendrotweaks.biophys.io.code_generators import NMODLCodeGenerator
from dendrotweaks.biophys.mechanisms import Mechanism, IonChannel, StandardIonChannel
[docs]
def create_channel(path_to_mod_file: str,
path_to_python_file: str,
path_to_python_template: str,
verbose: bool = False) -> IonChannel:
"""
Creates an ion channel from a .mod file.
Parameters
----------
path_to_mod_file : str
The full path to the .mod file containing the channel mechanism.
path_to_python_file : str
The path to the output Python file to be generated.
path_to_python_template : str
The path to the jinja2 template file for the Python file.
verbose : bool, optional
Whether to print verbose output.
Returns
-------
IonChannel
The instantiated ion channel.
"""
# Convert mod to python
converter = MODFileConverter()
converter.convert(path_to_mod_file,
path_to_python_file,
path_to_python_template,
verbose=verbose)
# Import and instantiate the channel
class_name = os.path.basename(path_to_python_file).replace('.py', '')
module_name = class_name
package_path = os.path.dirname(path_to_python_file)
if package_path not in sys.path:
sys.path.append(package_path)
# Dynamic import
from importlib import import_module
module = import_module(module_name)
ChannelClass = getattr(module, class_name)
return ChannelClass()
[docs]
def standardize_channel(channel: IonChannel,
path_to_mod_template: str = None,
path_to_standard_mod_file: str = None) -> StandardIonChannel:
"""
Standardize a channel and optionally generate a MOD file.
Parameters
----------
channel : IonChannel
The channel to standardize.
path_to_mod_template : str, optional
The path to the jinja2 template file for the standard MOD file.
path_to_standard_mod_file : str, optional
The path to save the standardized MOD file.
Returns
-------
StandardIonChannel
A standardized version of the input channel.
Note
----
Temperature-dependence is taken into account by performing
a fit to the data at the temperature specified in the parameters
of the original channel model (the `temp` parameter). If no
temperature is specified, the default temperature of 23 degrees
Celsius is used.
"""
standard_channel = StandardIonChannel(name=f"std{channel.name}",
state_powers=channel._state_powers,
ion=channel.ion)
if 'q10' in channel.params:
standard_channel.params['q10'] = channel.params['q10']
if 'temp' in channel.params:
standard_channel.params['temp'] = channel.params['temp']
fit_temperature = channel.params.get('temp')
standard_channel.set_tadj(fit_temperature)
# Fit the standard channel to the data
data = channel.get_data(temperature=fit_temperature)
standard_channel.fit(data)
# Optionally generate a MOD file
generator = NMODLCodeGenerator()
content = generator.generate(standard_channel, path_to_mod_template)
generator.write_file(path_to_standard_mod_file)
return standard_channel
[docs]
def create_standard_channel(path_to_mod_file: str,
path_to_python_file: str,
path_to_python_template: str,
path_to_mod_template: str,
path_to_standard_mod_file: str,
verbose: bool = False) -> StandardIonChannel:
"""
Creates a standardized channel and fits it to the data of the unstandardized channel.
Parameters
----------
path_to_mod_file : str
The path to the original MOD file for an unstandardized channel.
path_to_python_file : str
The path to the output Python file to be generated.
path_to_python_template : str
The path to the jinja2 template file for the Python file.
path_to_mod_template : str
The path to the jinja2 template file for the standard MOD file.
path_to_standard_mod_file : str
The path to the output standardized MOD file.
verbose : bool, optional
Whether to print verbose output.
Returns
-------
StandardIonChannel
The standardized ion channel.
"""
# First create the regular channel
channel = create_channel(path_to_mod_file,
path_to_python_file,
path_to_python_template,
verbose=verbose)
# Then standardize it
return standardize_channel(channel, path_to_mod_template, path_to_standard_mod_file)