From 3bb428a2ec449e36f3e0ed64ceb549abc6040e34 Mon Sep 17 00:00:00 2001 From: Levan Bokeria Date: Thu, 17 Apr 2025 10:59:28 +0100 Subject: [PATCH 1/3] adding back models under development --- src/ModularCirc/Models/KPat5MixedModel.py | 136 ++++++++++++++++++ .../Models/KPat5MixedModel_parameters.py | 108 ++++++++++++++ .../Models/KorakianitisMaynardModel.py | 114 +++++++++++++++ .../KorakianitisMaynardModel_parameters.py | 88 ++++++++++++ .../Models/KorakianitisMixedMaynardModel.py | 113 +++++++++++++++ ...orakianitisMixedMaynardModel_parameters.py | 88 ++++++++++++ src/ModularCirc/Models/KorakianitisModel.py | 104 ++++++++++++++ .../Models/KorakianitisModel_parameters.py | 98 +++++++++++++ .../Models/MixedHeartMaynard4eWindkessel.py | 132 +++++++++++++++++ ...ixedHeartMaynard4eWindkessel_parameters.py | 132 +++++++++++++++++ 10 files changed, 1113 insertions(+) create mode 100644 src/ModularCirc/Models/KPat5MixedModel.py create mode 100644 src/ModularCirc/Models/KPat5MixedModel_parameters.py create mode 100644 src/ModularCirc/Models/KorakianitisMaynardModel.py create mode 100644 src/ModularCirc/Models/KorakianitisMaynardModel_parameters.py create mode 100644 src/ModularCirc/Models/KorakianitisMixedMaynardModel.py create mode 100644 src/ModularCirc/Models/KorakianitisMixedMaynardModel_parameters.py create mode 100644 src/ModularCirc/Models/KorakianitisModel.py create mode 100644 src/ModularCirc/Models/KorakianitisModel_parameters.py create mode 100644 src/ModularCirc/Models/MixedHeartMaynard4eWindkessel.py create mode 100644 src/ModularCirc/Models/MixedHeartMaynard4eWindkessel_parameters.py diff --git a/src/ModularCirc/Models/KPat5MixedModel.py b/src/ModularCirc/Models/KPat5MixedModel.py new file mode 100644 index 0000000..feb9644 --- /dev/null +++ b/src/ModularCirc/Models/KPat5MixedModel.py @@ -0,0 +1,136 @@ +from .OdeModel import OdeModel +from .KorakianitisModel_parameters import KorakianitisModel_parameters as k2006 +from .ParametersObject import ParametersObject as po +from ..Components import Rlc_component, Valve_simple_bernoulli, HC_mixed_elastance + +FULL_NAMES =[ + 'LeftA', + 'MiValve', + 'LeftV', + 'AoV', + 'SysAoSin', + 'SysArt', + 'SysVen', + 'RightA', + 'TriValve', + 'RightV', + 'PulV', + 'PulArtSin', + 'PulArt0', + 'PulArt1', + 'PulArt2', + 'PulArt3', + 'PulArt4', + 'PulVen', +] + +class KPat5MixedModel(OdeModel): + def __init__(self, time_setup_dict, parobj:po=k2006, suppress_printing:bool=False) -> None: + super().__init__(time_setup_dict) + self.name = 'KorakianitisModel' + + if not suppress_printing: print(parobj) + + # The components... + for key, name in zip(parobj.components.keys(), FULL_NAMES): + if key in parobj._vessels: + class_ = Rlc_component + elif key in parobj._valves: + class_ = Valve_simple_bernoulli + elif key in parobj._chambers: + class_ = HC_mixed_elastance + else: + raise Exception(f'Component name {key} not in the model list.') + self.components[key] = class_(name=name, + time_object=self.time_object, + **parobj[key].to_dict()) + if key not in parobj._valves: + self.set_v_sv(key) + # else: + # self.set_phi_sv(key) + self.components[key].setup() + + self.connect_modules(self.components['lv'], + self.components['ao'], + plabel='p_lv', + qlabel='q_ao') + self.connect_modules(self.components['ao'], + self.components['sas'], + plabel='p_sas', + qlabel='q_ao') + self.connect_modules(self.components['sas'], + self.components['sat'], + plabel='p_sat', + qlabel='q_sas') + self.connect_modules(self.components['sat'], + self.components['svn'], + plabel='p_svn', + qlabel='q_sat') + self.connect_modules(self.components['svn'], + self.components['ra'], + plabel='p_ra', + qlabel='q_svn') + self.connect_modules(self.components['ra'], + self.components['ti'], + plabel='p_ra', + qlabel='q_ti') + self.connect_modules(self.components['ti'], + self.components['rv'], + plabel='p_rv', + qlabel='q_ti') + self.connect_modules(self.components['rv'], + self.components['po'], + plabel='p_rv', + qlabel='q_po') + self.connect_modules(self.components['po'], + self.components['pas'], + plabel='p_pas', + qlabel='q_po') + ############################################ + self.connect_modules(self.components['pas'], + self.components['pat0'], + plabel='p_pat0', + qlabel='q_pas') + self.connect_modules(self.components['pat0'], + self.components['pat1'], + plabel='p_pat1', + qlabel='q_pat0') + self.connect_modules(self.components['pat1'], + self.components['pat2'], + plabel='p_pat2', + qlabel='q_pat1') + self.connect_modules(self.components['pat2'], + self.components['pat3'], + plabel='p_pat3', + qlabel='q_pat2') + self.connect_modules(self.components['pat3'], + self.components['pat4'], + plabel='p_pat4', + qlabel='q_pat3') + ############################################ + self.connect_modules(self.components['pat4'], + self.components['pvn'], + plabel='p_pvn', + qlabel='q_pat4') + ############################################ + self.connect_modules(self.components['pvn'], + self.components['la'], + plabel='p_la', + qlabel='q_pvn') + self.connect_modules(self.components['la'], + self.components['mi'], + plabel='p_la', + qlabel='q_mi') + self.connect_modules(self.components['mi'], + self.components['lv'], + plabel='p_lv', + qlabel='q_mi') + + for component in self.components.values(): + component.setup() + + # def set_phi_sv(self, comp_key:str) -> None: + # phi_key = 'phi_' + comp_key + # self._state_variable_dict[phi_key] = self.components[comp_key]._PHI + # self._state_variable_dict[phi_key].set_name(phi_key) + # self.all_sv_data[phi_key] = self.components[comp_key].PHI diff --git a/src/ModularCirc/Models/KPat5MixedModel_parameters.py b/src/ModularCirc/Models/KPat5MixedModel_parameters.py new file mode 100644 index 0000000..4a47578 --- /dev/null +++ b/src/ModularCirc/Models/KPat5MixedModel_parameters.py @@ -0,0 +1,108 @@ +from ..HelperRoutines import activation_function_2, activation_function_3 +from .ParametersObject import ParametersObject +import pandas as pd + + +KKPat10_COMPONENTS = [ + 'la', # left atrium + 'mi', # mitral valve + 'lv', # left ventricle + 'ao', # aortic valve + 'sas', # systemic aortic sinus + 'sat', # systemic artery + 'svn', # systemic vein + 'ra', # right atrium + 'ti', # tricuspid vale + 'rv', # right ventricle + 'po', # pulmonary valve + 'pas', # pulmonary artery sinus + ############################### + 'pat0', # pulmonary artery + 'pat1', # pulmonary artery + 'pat2', # pulmonary artery + 'pat3', # pulmonary artery + 'pat4', # pulmonary artery + ############################### + 'pvn' # pulmonary vein + ] +VESSELS = ['sas', 'sat', 'svn', 'pas', 'pat0', 'pat1', 'pat2', 'pat3', 'pat4', 'pvn'] +VESSELS_PAR = ['r', 'c', 'l', 'v_ref', 'v', 'p'] + +VALVES = ['mi', 'ao', 'ti', 'po'] +VALVES_PAR = ['CQ', 'RRA'] + +CHAMBERS = ['la', 'lv', 'ra', 'rv'] +CHAMBERS_PAR = ['E_pas', 'E_act', 'v_ref', 'k_pas', 'af', 'v', 'p', 'tr', 'td', 'delay', 'tpww', 'tpwb'] + + +class KPat5MixedModel_parameters(ParametersObject): + """ + Intro + ----- + Model Parameters based on Korakianitis and Shi (2006) + """ + def __init__(self, name='Korakianitis 2006') -> None: + super().__init__(name=name) + self.components = {key : None for key in KKPat10_COMPONENTS} + for type_, type_var in [[VESSELS, VESSELS_PAR], [VALVES, VALVES_PAR], [CHAMBERS, CHAMBERS_PAR]]: + for key in type_: + self[key] = pd.Series(index=type_var, dtype=object) + + self._vessels = VESSELS + self._valves = VALVES + self._chambers= CHAMBERS + + self.set_chamber_comp('lv', E_pas= 0.1, k_pas=0.01, E_act= 2.5, v_ref=50.0, tr = 0.30, td = 0.450, v=100.) + self.set_chamber_comp('la', E_pas= 0.15, k_pas=0.01, E_act= 0.25, v_ref=10.0, tpwb = 0.0, tpww = 0.09, delay=0.08, v=0.0) + self.set_chamber_comp('rv', E_pas= 0.1, k_pas=0.01, E_act= 1.15, v_ref=50., tr=0.30, td=0.45, v=100.) + self.set_chamber_comp('ra', E_pas= 0.15, k_pas=0.01, E_act= 0.25, v_ref=10., tpwb=0.0, tpww=0.09, delay=0.08, v=0.0) + + + self.set_activation_function('lv', af=activation_function_2) + self.set_activation_function('rv', af=activation_function_2) + + self.set_activation_function('la', af=activation_function_3) + self.set_activation_function('ra', af=activation_function_3) + + + # systemic circulation + self.set_rlc_comp('sas', r=0.003, c=0.08, l=0.000062, v=0.0, v_ref=0.0) + self.set_rlc_comp('sat', r=(0.05 + 0.5 + 0.52), c=1.6 , l=0.0017 , v=550.0, v_ref=0.0) + self.set_rlc_comp('svn', r=0.075, c=20.5, v=0.0, v_ref=0.0) + + # pulmonary circulation + self.set_rlc_comp('pas', r=0.002 , c=0.18, l=0.000052, v=0.0, v_ref=0.0) + ############################################################################################# + self.set_rlc_comp('pat0', r=(0.01/5.), c=(3.8/5.) , l=(0.0017/5.) , v=0.0, v_ref=0.0) + self.set_rlc_comp('pat1', r=(0.01/5.), c=(3.8/5.) , l=(0.0017/5.) , v=0.0, v_ref=0.0) + self.set_rlc_comp('pat2', r=(0.01/5.), c=(3.8/5.) , l=(0.0017/5.) , v=0.0, v_ref=0.0) + self.set_rlc_comp('pat3', r=(0.01/5.), c=(3.8/5. ), l=(0.0017/5. ) , v=0.0, v_ref=0.0) + self.set_rlc_comp('pat4', r=(0.01/5.+0.05+0.25), c=(3.8/5.) , l=(0.0017/5.), v=0.0, v_ref=0.0) + ############################################################################################# + self.set_rlc_comp('pvn', r=0.006 , c=20.5 , v=0.0, v_ref=0.0) + + # valves + self.set_valve_comp('ao', CQ=350., RRA=0.0) + self.set_valve_comp('mi', CQ=400., RRA=0.0) + self.set_valve_comp('po', CQ=350., RRA=0.0) + self.set_valve_comp('ti', CQ=400., RRA=0.0) + + def set_chamber_comp(self, key, **kwargs): + self._set_comp(key=key, set=CHAMBERS, **kwargs) + + def set_activation_function(self, key, af): + self._set_comp(key, set=CHAMBERS, af=af) + + def set_rlc_comp(self, key, **kwargs): + self._set_comp(key=key, set=VESSELS, **kwargs) + + def set_valve_comp(self, key, **kwargs): + self._set_comp(key=key, set=VALVES, **kwargs) + + def set(self, key, **kwargs): + if key in CHAMBERS: + self._set_comp(key=key, set=CHAMBERS, **kwargs) + if key in VESSELS: + self._set_comp(key=key, set=VESSELS, **kwargs) + if key in VALVES: + self._set_comp(key=key, set=VALVES, **kwargs) diff --git a/src/ModularCirc/Models/KorakianitisMaynardModel.py b/src/ModularCirc/Models/KorakianitisMaynardModel.py new file mode 100644 index 0000000..b923493 --- /dev/null +++ b/src/ModularCirc/Models/KorakianitisMaynardModel.py @@ -0,0 +1,114 @@ +from .OdeModel import OdeModel +from .KorakianitisModel_parameters import KorakianitisModel_parameters as k2006 +from .ParametersObject import ParametersObject as po +from ..Components import Rlc_component, Valve_maynard, HC_constant_elastance + +FULL_NAMES =[ + 'LeftA', + 'MiValve', + 'LeftV', + 'AoV', + 'SysAoSin', + 'SysArt', + 'SysVen', + 'RightA', + 'TriValve', + 'RightV', + 'PulV', + 'PulArtSin', + 'PulArt', + 'PulVen', +] + +class KorakianitisMaynardModel(OdeModel): + def __init__(self, time_setup_dict, parobj:po=k2006) -> None: + super().__init__(time_setup_dict) + self.name = 'KorakianitisModel' + + print(parobj) + + # The components... + for key, name in zip(parobj.components.keys(), FULL_NAMES): + if key in parobj._vessels: + class_ = Rlc_component + elif key in parobj._valves: + class_ = Valve_maynard + elif key in parobj._chambers: + class_ = HC_constant_elastance + else: + raise Exception(f'Component name {key} not in the model list.') + self.components[key] = class_(name=name, + time_object=self.time_object, + **parobj[key].to_dict()) + if key not in parobj._valves: + self.set_v_sv(key) + else: + self.set_phi_sv(key) + self.components[key].setup() + + self.connect_modules(self.components['lv'], + self.components['ao'], + plabel='p_lv', + qlabel='q_ao') + self.connect_modules(self.components['ao'], + self.components['sas'], + plabel='p_sas', + qlabel='q_ao') + self.connect_modules(self.components['sas'], + self.components['sat'], + plabel='p_sat', + qlabel='q_sas') + self.connect_modules(self.components['sat'], + self.components['svn'], + plabel='p_svn', + qlabel='q_sat') + self.connect_modules(self.components['svn'], + self.components['ra'], + plabel='p_ra', + qlabel='q_svn') + self.connect_modules(self.components['ra'], + self.components['ti'], + plabel='p_ra', + qlabel='q_ti') + self.connect_modules(self.components['ti'], + self.components['rv'], + plabel='p_rv', + qlabel='q_ti') + self.connect_modules(self.components['rv'], + self.components['po'], + plabel='p_rv', + qlabel='q_po') + self.connect_modules(self.components['po'], + self.components['pas'], + plabel='p_pas', + qlabel='q_po') + self.connect_modules(self.components['pas'], + self.components['pat'], + plabel='p_pat', + qlabel='q_pas') + self.connect_modules(self.components['pat'], + self.components['pvn'], + plabel='p_pvn', + qlabel='q_pat') + self.connect_modules(self.components['pvn'], + self.components['la'], + plabel='p_la', + qlabel='q_pvn') + self.connect_modules(self.components['la'], + self.components['mi'], + plabel='p_la', + qlabel='q_mi') + self.connect_modules(self.components['mi'], + self.components['lv'], + plabel='p_lv', + qlabel='q_mi') + + for component in self.components.values(): + component.setup() + + def set_phi_sv(self, comp_key:str) -> None: + phi_key = 'phi_' + comp_key + self._state_variable_dict[phi_key] = self.components[comp_key]._PHI + self._state_variable_dict[phi_key].set_name(phi_key) + self.all_sv_data[phi_key] = self.components[comp_key].PHI + self.components[comp_key]._PHI._u = self.all_sv_data[phi_key] diff --git a/src/ModularCirc/Models/KorakianitisMaynardModel_parameters.py b/src/ModularCirc/Models/KorakianitisMaynardModel_parameters.py new file mode 100644 index 0000000..6c9a840 --- /dev/null +++ b/src/ModularCirc/Models/KorakianitisMaynardModel_parameters.py @@ -0,0 +1,88 @@ +from ..HelperRoutines import activation_function_2, activation_function_3 +from .ParametersObject import ParametersObject +import pandas as pd + + +KORAKIANITIS_2006_COMPONENTS = [ + 'la', # left atrium + 'mi', # mitral valve + 'lv', # left ventricle + 'ao', # aortic valve + 'sas', # systemic aortic sinus + 'sat', # systemic artery + 'svn', # systemic vein + 'ra', # right atrium + 'ti', # tricuspid vale + 'rv', # right ventricle + 'po', # pulmonary valve + 'pas', # pulmonary artery sinus + 'pat', # pulmonary artery + 'pvn' # pulmonary vein + ] +VESSELS = ['sas', 'sat', 'svn', 'pas', 'pat', 'pvn'] +VESSELS_PAR = ['r', 'c', 'l', 'v_ref', 'v', 'p'] + +VALVES = ['mi', 'ao', 'ti', 'po'] +VALVES_PAR = ['CQ', 'RRA', 'Ko', 'Kc', 'R', 'L'] + +CHAMBERS = ['la', 'lv', 'ra', 'rv'] +CHAMBERS_PAR = ['E_pas', 'E_act', 'v_ref', 'k_pas', 'af', 'v', 'p', 'tr', 'td', 'delay', 'tpww', 'tpwb'] + + +class KorakianitisMaynardModel_parameters(ParametersObject): + """ + Intro + ----- + Model Parameters based on Korakianitis and Shi (2006) with Maynard (2012) valves + """ + def __init__(self, name='Korakianitis 2006') -> None: + super().__init__(name=name) + self.components = {key : None for key in KORAKIANITIS_2006_COMPONENTS} + for type_, type_var in [[VESSELS, VESSELS_PAR], [VALVES, VALVES_PAR], [CHAMBERS, CHAMBERS_PAR]]: + for key in type_: + self[key] = pd.Series(index=type_var, dtype=object) + + self._vessels = VESSELS + self._valves = VALVES + self._chambers= CHAMBERS + + self.set_chamber_comp('lv', E_pas= 0.1, E_act= 2.5, v_ref=5.0, k_pas=0.1, tr = 0.30, td = 0.450, v=500.) + self.set_chamber_comp('la', E_pas= 0.15, E_act= 0.25, v_ref=4.0, k_pas=0.1, tpwb = 0.0, tpww = 0.09, delay=0.08, v=0.0) + self.set_chamber_comp('rv', E_pas= 0.1, E_act= 1.15, v_ref=10., k_pas=0.1, tr=0.30, td=0.45, v=400.) + self.set_chamber_comp('ra', E_pas= 0.15, E_act= 0.25, v_ref=4., k_pas=0.1, tpwb=0.0, tpww=0.09, delay=0.08, v=0.0) + + self.set_activation_function('lv', af=activation_function_2) + self.set_activation_function('rv', af=activation_function_2) + + self.set_activation_function('la', af=activation_function_3) + self.set_activation_function('ra', af=activation_function_3) + + + # systemic circulation + self.set_rlc_comp('sas', r=0.003, c=0.08, l=0.000062, v=0.0, v_ref=0.0) + self.set_rlc_comp('sat', r=(0.05 + 0.5 + 0.52), c=1.6 , l=0.0017 , v=0.0, v_ref=0.0) + self.set_rlc_comp('svn', r=0.075, c=20.5, v=0.0, v_ref=0.0) + + # pulmonary circulation + self.set_rlc_comp('pas', r=0.002 , c=0.18, l=0.000052, v=0.0, v_ref=0.0) + self.set_rlc_comp('pat', r=(0.01+0.05+0.25), c=3.8 , l=0.0017 , v=0.0, v_ref=0.0) + self.set_rlc_comp('pvn', r=0.006 , c=20.5 , v=0.0, v_ref=0.0) + + # valves + dyn = 1333.22 + self.set_valve_comp('ao', CQ=350., RRA=0.0, Ko = 0.012/dyn, Kc = 0.012/dyn, L=0.0, R=0.0) + self.set_valve_comp('mi', CQ=400., RRA=0.0, Ko = 0.03/dyn, Kc = 0.04/dyn, L=0.0, R=0.0 ) + self.set_valve_comp('po', CQ=350., RRA=0.0, Ko = 0.02/dyn, Kc = 0.02/dyn, L=0.0, R=0.0 ) + self.set_valve_comp('ti', CQ=400., RRA=0.0, Ko = 0.03/dyn, Kc = 0.04/dyn, L=0.0, R=0.0 ) + + def set_chamber_comp(self, key, **kwargs): + self._set_comp(key=key, set=CHAMBERS, **kwargs) + + def set_activation_function(self, key, af): + self._set_comp(key, set=CHAMBERS, af=af) + + def set_rlc_comp(self, key, **kwargs): + self._set_comp(key=key, set=VESSELS, **kwargs) + + def set_valve_comp(self, key, **kwargs): + self._set_comp(key=key, set=VALVES, **kwargs) diff --git a/src/ModularCirc/Models/KorakianitisMixedMaynardModel.py b/src/ModularCirc/Models/KorakianitisMixedMaynardModel.py new file mode 100644 index 0000000..2e23339 --- /dev/null +++ b/src/ModularCirc/Models/KorakianitisMixedMaynardModel.py @@ -0,0 +1,113 @@ +from .OdeModel import OdeModel +from .KorakianitisModel_parameters import KorakianitisModel_parameters as k2006 +from .ParametersObject import ParametersObject as po +from ..Components import Rlc_component, Valve_maynard, HC_mixed_elastance + +FULL_NAMES =[ + 'LeftA', + 'MiValve', + 'LeftV', + 'AoV', + 'SysAoSin', + 'SysArt', + 'SysVen', + 'RightA', + 'TriValve', + 'RightV', + 'PulV', + 'PulArtSin', + 'PulArt', + 'PulVen', +] + +class KorakianitisMixedMaynardModel(OdeModel): + def __init__(self, time_setup_dict, parobj:po=k2006) -> None: + super().__init__(time_setup_dict) + self.name = 'KorakianitisModel' + + print(parobj) + + # The components... + for key, name in zip(parobj.components.keys(), FULL_NAMES): + if key in parobj._vessels: + class_ = Rlc_component + elif key in parobj._valves: + class_ = Valve_maynard + elif key in parobj._chambers: + class_ = HC_mixed_elastance + else: + raise Exception(f'Component name {key} not in the model list.') + self.components[key] = class_(name=name, + time_object=self.time_object, + **parobj[key].to_dict()) + if key not in parobj._valves: + self.set_v_sv(key) + else: + self.set_phi_sv(key) + self.components[key].setup() + + self.connect_modules(self.components['lv'], + self.components['ao'], + plabel='p_lv', + qlabel='q_ao') + self.connect_modules(self.components['ao'], + self.components['sas'], + plabel='p_sas', + qlabel='q_ao') + self.connect_modules(self.components['sas'], + self.components['sat'], + plabel='p_sat', + qlabel='q_sas') + self.connect_modules(self.components['sat'], + self.components['svn'], + plabel='p_svn', + qlabel='q_sat') + self.connect_modules(self.components['svn'], + self.components['ra'], + plabel='p_ra', + qlabel='q_svn') + self.connect_modules(self.components['ra'], + self.components['ti'], + plabel='p_ra', + qlabel='q_ti') + self.connect_modules(self.components['ti'], + self.components['rv'], + plabel='p_rv', + qlabel='q_ti') + self.connect_modules(self.components['rv'], + self.components['po'], + plabel='p_rv', + qlabel='q_po') + self.connect_modules(self.components['po'], + self.components['pas'], + plabel='p_pas', + qlabel='q_po') + self.connect_modules(self.components['pas'], + self.components['pat'], + plabel='p_pat', + qlabel='q_pas') + self.connect_modules(self.components['pat'], + self.components['pvn'], + plabel='p_pvn', + qlabel='q_pat') + self.connect_modules(self.components['pvn'], + self.components['la'], + plabel='p_la', + qlabel='q_pvn') + self.connect_modules(self.components['la'], + self.components['mi'], + plabel='p_la', + qlabel='q_mi') + self.connect_modules(self.components['mi'], + self.components['lv'], + plabel='p_lv', + qlabel='q_mi') + + for component in self.components.values(): + component.setup() + + def set_phi_sv(self, comp_key:str) -> None: + phi_key = 'phi_' + comp_key + self._state_variable_dict[phi_key] = self.components[comp_key]._PHI + self._state_variable_dict[phi_key].set_name(phi_key) + self.all_sv_data[phi_key] = self.components[comp_key].PHI diff --git a/src/ModularCirc/Models/KorakianitisMixedMaynardModel_parameters.py b/src/ModularCirc/Models/KorakianitisMixedMaynardModel_parameters.py new file mode 100644 index 0000000..1dd6299 --- /dev/null +++ b/src/ModularCirc/Models/KorakianitisMixedMaynardModel_parameters.py @@ -0,0 +1,88 @@ +from ..HelperRoutines import activation_function_2, activation_function_3 +from .ParametersObject import ParametersObject +import pandas as pd + + +KORAKIANITIS_2006_COMPONENTS = [ + 'la', # left atrium + 'mi', # mitral valve + 'lv', # left ventricle + 'ao', # aortic valve + 'sas', # systemic aortic sinus + 'sat', # systemic artery + 'svn', # systemic vein + 'ra', # right atrium + 'ti', # tricuspid vale + 'rv', # right ventricle + 'po', # pulmonary valve + 'pas', # pulmonary artery sinus + 'pat', # pulmonary artery + 'pvn' # pulmonary vein + ] +VESSELS = ['sas', 'sat', 'svn', 'pas', 'pat', 'pvn'] +VESSELS_PAR = ['r', 'c', 'l', 'v_ref', 'v', 'p'] + +VALVES = ['mi', 'ao', 'ti', 'po'] +VALVES_PAR = ['CQ', 'RRA', 'Ko', 'Kc', 'R', 'L'] + +CHAMBERS = ['la', 'lv', 'ra', 'rv'] +CHAMBERS_PAR = ['E_pas', 'E_act', 'v_ref', 'k_pas', 'af', 'v', 'p', 'tr', 'td', 'delay', 'tpww', 'tpwb'] + + +class KorakianitisMixedMaynardModel_parameters(ParametersObject): + """ + Intro + ----- + Model Parameters based on Korakianitis and Shi (2006) with Maynard (2012) valves + """ + def __init__(self, name='Korakianitis 2006') -> None: + super().__init__(name=name) + self.components = {key : None for key in KORAKIANITIS_2006_COMPONENTS} + for type_, type_var in [[VESSELS, VESSELS_PAR], [VALVES, VALVES_PAR], [CHAMBERS, CHAMBERS_PAR]]: + for key in type_: + self[key] = pd.Series(index=type_var, dtype=object) + + self._vessels = VESSELS + self._valves = VALVES + self._chambers= CHAMBERS + + self.set_chamber_comp('lv', E_pas= 0.1, E_act= 2.5, v_ref=5.0, k_pas=0.1, tr = 0.30, td = 0.450, v=50.) + self.set_chamber_comp('la', E_pas= 0.15, E_act= 0.25, v_ref=4.0, k_pas=0.1, tpwb = 0.0, tpww = 0.09, delay=0.08, v=0.0) + self.set_chamber_comp('rv', E_pas= 0.1, E_act= 1.15, v_ref=10., k_pas=0.1, tr=0.30, td=0.45, v=100.) + self.set_chamber_comp('ra', E_pas= 0.15, E_act= 0.25, v_ref=4., k_pas=0.1, tpwb=0.0, tpww=0.09, delay=0.08, v=0.0) + + self.set_activation_function('lv', af=activation_function_2) + self.set_activation_function('rv', af=activation_function_2) + + self.set_activation_function('la', af=activation_function_3) + self.set_activation_function('ra', af=activation_function_3) + + + # systemic circulation + self.set_rlc_comp('sas', r=0.003, c=0.08, l=0.000062, v=450.0, v_ref=0.0) + self.set_rlc_comp('sat', r=(0.05 + 0.5 + 0.52), c=1.6 , l=0.0017 , v=0.0, v_ref=0.0) + self.set_rlc_comp('svn', r=0.075, c=20.5, v=0.0, v_ref=0.0) + + # pulmonary circulation + self.set_rlc_comp('pas', r=0.002 , c=0.18, l=0.000052, v=200.0, v_ref=0.0) + self.set_rlc_comp('pat', r=(0.01+0.05+0.25), c=3.8 , l=0.0017 , v=0.0, v_ref=0.0) + self.set_rlc_comp('pvn', r=0.006 , c=20.5 , v=0.0, v_ref=0.0) + + # valves + dyn = 1333.22 + self.set_valve_comp('ao', CQ=350., RRA=0.0, Ko = 0.012/dyn, Kc = 0.012/dyn, L=0.0, R=0.0) + self.set_valve_comp('mi', CQ=400., RRA=0.0, Ko = 0.03/dyn, Kc = 0.04/dyn, L=0.0, R=0.0 ) + self.set_valve_comp('po', CQ=350., RRA=0.0, Ko = 0.02/dyn, Kc = 0.02/dyn, L=0.0, R=0.0 ) + self.set_valve_comp('ti', CQ=400., RRA=0.0, Ko = 0.03/dyn, Kc = 0.04/dyn, L=0.0, R=0.0 ) + + def set_chamber_comp(self, key, **kwargs): + self._set_comp(key=key, set=CHAMBERS, **kwargs) + + def set_activation_function(self, key, af): + self._set_comp(key, set=CHAMBERS, af=af) + + def set_rlc_comp(self, key, **kwargs): + self._set_comp(key=key, set=VESSELS, **kwargs) + + def set_valve_comp(self, key, **kwargs): + self._set_comp(key=key, set=VALVES, **kwargs) diff --git a/src/ModularCirc/Models/KorakianitisModel.py b/src/ModularCirc/Models/KorakianitisModel.py new file mode 100644 index 0000000..91db341 --- /dev/null +++ b/src/ModularCirc/Models/KorakianitisModel.py @@ -0,0 +1,104 @@ +from .OdeModel import OdeModel +from .KorakianitisModel_parameters import KorakianitisModel_parameters as k2006 +from .ParametersObject import ParametersObject as po +from ..Components import Rlc_component, Valve_simple_bernoulli, HC_constant_elastance + +FULL_NAMES =[ + 'LeftA', + 'MiValve', + 'LeftV', + 'AoV', + 'SysAoSin', + 'SysArt', + 'SysVen', + 'RightA', + 'TriValve', + 'RightV', + 'PulV', + 'PulArtSin', + 'PulArt', + 'PulVen', +] + +class KorakianitisModel(OdeModel): + def __init__(self, time_setup_dict, parobj:po=k2006, suppress_printing:bool=False) -> None: + super().__init__(time_setup_dict) + self.name = 'KorakianitisModel' + + if not suppress_printing: print(parobj) + + # The components... + for key, name in zip(parobj.components.keys(), FULL_NAMES): + if key in parobj._vessels: + class_ = Rlc_component + elif key in parobj._valves: + class_ = Valve_simple_bernoulli + elif key in parobj._chambers: + class_ = HC_constant_elastance + else: + raise Exception(f'Component name {key} not in the model list.') + self.components[key] = class_(name=name, + time_object=self.time_object, + **parobj[key].to_dict()) + if key not in parobj._valves: self.set_v_sv(key) + self.components[key].setup() + + self.connect_modules(self.components['lv'], + self.components['ao'], + plabel='p_lv', + qlabel='q_ao') + self.connect_modules(self.components['ao'], + self.components['sas'], + plabel='p_sas', + qlabel='q_ao') + self.connect_modules(self.components['sas'], + self.components['sat'], + plabel='p_sat', + qlabel='q_sas') + self.connect_modules(self.components['sat'], + self.components['svn'], + plabel='p_svn', + qlabel='q_sat') + self.connect_modules(self.components['svn'], + self.components['ra'], + plabel='p_ra', + qlabel='q_svn') + self.connect_modules(self.components['ra'], + self.components['ti'], + plabel='p_ra', + qlabel='q_ti') + self.connect_modules(self.components['ti'], + self.components['rv'], + plabel='p_rv', + qlabel='q_ti') + self.connect_modules(self.components['rv'], + self.components['po'], + plabel='p_rv', + qlabel='q_po') + self.connect_modules(self.components['po'], + self.components['pas'], + plabel='p_pas', + qlabel='q_po') + self.connect_modules(self.components['pas'], + self.components['pat'], + plabel='p_pat', + qlabel='q_pas') + self.connect_modules(self.components['pat'], + self.components['pvn'], + plabel='p_pvn', + qlabel='q_pat') + self.connect_modules(self.components['pvn'], + self.components['la'], + plabel='p_la', + qlabel='q_pvn') + self.connect_modules(self.components['la'], + self.components['mi'], + plabel='p_la', + qlabel='q_mi') + self.connect_modules(self.components['mi'], + self.components['lv'], + plabel='p_lv', + qlabel='q_mi') + + for component in self.components.values(): + component.setup() diff --git a/src/ModularCirc/Models/KorakianitisModel_parameters.py b/src/ModularCirc/Models/KorakianitisModel_parameters.py new file mode 100644 index 0000000..d40013a --- /dev/null +++ b/src/ModularCirc/Models/KorakianitisModel_parameters.py @@ -0,0 +1,98 @@ +from ..HelperRoutines import activation_function_2, activation_function_3 +from .ParametersObject import ParametersObject +import pandas as pd + + +KORAKIANITIS_2006_COMPONENTS = [ + 'la', # left atrium + 'mi', # mitral valve + 'lv', # left ventricle + 'ao', # aortic valve + 'sas', # systemic aortic sinus + 'sat', # systemic artery + 'svn', # systemic vein + 'ra', # right atrium + 'ti', # tricuspid vale + 'rv', # right ventricle + 'po', # pulmonary valve + 'pas', # pulmonary artery sinus + 'pat', # pulmonary artery + 'pvn' # pulmonary vein + ] +VESSELS = ['sas', 'sat', 'svn', 'pas', 'pat', 'pvn'] +VESSELS_PAR = ['r', 'c', 'l', 'v_ref', 'v', 'p'] + +VALVES = ['mi', 'ao', 'ti', 'po'] +VALVES_PAR = ['CQ', 'RRA'] + +CHAMBERS = ['la', 'lv', 'ra', 'rv'] +CHAMBERS_PAR = ['E_pas', 'E_act', 'v_ref', 'af', 'v', 'p', 'tr', 'td', 'delay', 'tpww', 'tpwb'] + +# TIMINGS = [] + +class KorakianitisModel_parameters(ParametersObject): + """ + Intro + ----- + Model Parameters based on Korakianitis and Shi (2006) + """ + def __init__(self, name='Korakianitis 2006') -> None: + super().__init__(name=name) + self.components = {key : None for key in KORAKIANITIS_2006_COMPONENTS} + for type_, type_var in [[VESSELS, VESSELS_PAR], [VALVES, VALVES_PAR], [CHAMBERS, CHAMBERS_PAR]]: + for key in type_: + self[key] = pd.Series(index=type_var, dtype=object) + + # self.timings = {key : pd.Series(index=TIMINGS) for key in CHAMBERS} + + self._vessels = VESSELS + self._valves = VALVES + self._chambers= CHAMBERS + + self.set_chamber_comp('lv', E_pas= 0.1, E_act= 2.5, v_ref=5.0, tr = 0.30, td = 0.450, v=500.) + self.set_chamber_comp('la', E_pas= 0.15, E_act= 0.25, v_ref=4.0, tpwb = 0.0, tpww = 0.09, delay=0.08, v=0.0) + self.set_chamber_comp('rv', E_pas= 0.1, E_act= 1.15, v_ref=10., tr=0.30, td=0.45, v=400.) + self.set_chamber_comp('ra', E_pas= 0.15, E_act= 0.25, v_ref=4., tpwb=0.0, tpww=0.09, delay=0.08, v=0.0) + + self.set_activation_function('lv', af=activation_function_2) + self.set_activation_function('rv', af=activation_function_2) + + self.set_activation_function('la', af=activation_function_3) + self.set_activation_function('ra', af=activation_function_3) + + + # systemic circulation + self.set_rlc_comp('sas', r=0.003, c=0.08, l=0.000062, v=0.0, v_ref=0.0) + self.set_rlc_comp('sat', r=(0.05 + 0.5 + 0.52), c=1.6 , l=0.0017 , v=0.0, v_ref=0.0) + self.set_rlc_comp('svn', r=0.075, c=20.5, v=0.0, v_ref=0.0) + + # pulmonary circulation + self.set_rlc_comp('pas', r=0.002 , c=0.18, l=0.000052, v=0.0, v_ref=0.0) + self.set_rlc_comp('pat', r=(0.01+0.05+0.25), c=3.8 , l=0.0017 , v=0.0, v_ref=0.0) + self.set_rlc_comp('pvn', r=0.006 , c=20.5 , v=0.0, v_ref=0.0) + + # valves + self.set_valve_comp('ao', CQ=350., RRA=0.0) + self.set_valve_comp('mi', CQ=400., RRA=0.0) + self.set_valve_comp('po', CQ=350., RRA=0.0) + self.set_valve_comp('ti', CQ=400., RRA=0.0) + + def set_chamber_comp(self, key, **kwargs): + self._set_comp(key=key, set=CHAMBERS, **kwargs) + + def set_activation_function(self, key, af): + self._set_comp(key, set=CHAMBERS, af=af) + + def set_rlc_comp(self, key, **kwargs): + self._set_comp(key=key, set=VESSELS, **kwargs) + + def set_valve_comp(self, key, **kwargs): + self._set_comp(key=key, set=VALVES, **kwargs) + + def set(self, key, **kwargs): + if key in CHAMBERS: + self._set_comp(key=key, set=CHAMBERS, **kwargs) + if key in VESSELS: + self._set_comp(key=key, set=VESSELS, **kwargs) + if key in VALVES: + self._set_comp(key=key, set=VALVES, **kwargs) diff --git a/src/ModularCirc/Models/MixedHeartMaynard4eWindkessel.py b/src/ModularCirc/Models/MixedHeartMaynard4eWindkessel.py new file mode 100644 index 0000000..d1fdbf3 --- /dev/null +++ b/src/ModularCirc/Models/MixedHeartMaynard4eWindkessel.py @@ -0,0 +1,132 @@ +from .OdeModel import OdeModel +from .MixedHeartMaynard4eWindkessel_parameters import MixedHeartMaynard4eWindkessel_parameters as MHM4W_parobj +from .ParametersObject import ParametersObject as po +from ..Components import Rlc_component, Valve_maynard, \ + HC_mixed_elastance, R_component, Valve_non_ideal, \ + HC_constant_elastance, Valve_simple_bernoulli + +FULL_NAMES =[ + 'LeftA', + 'MiValve', + 'LeftV', + 'AoV', + 'SysArtImp', + 'SysArt', + 'SysCap', + 'SysVen', + 'RightA', + 'TriValve', + 'RightV', + 'PulV', + 'PulArtImp', + 'PulArt', + 'PulCap', + 'PulVen', +] + +class MixedHeartMaynard4eWindkessel(OdeModel): + def __init__(self, time_setup_dict, parobj:po=MHM4W_parobj) -> None: + super().__init__(time_setup_dict) + self.name = 'MixedHeartMaynard4eWindkessel' + + print(parobj) + + # The components... + for key, name in zip(parobj.components.keys(), FULL_NAMES): + if key in parobj._vessels: + class_ = Rlc_component + elif key in parobj._imp or key in parobj._cap: + class_ = R_component + elif key in parobj._valves: + class_ = Valve_simple_bernoulli # Valve_non_ideal # Valve_maynard # Valve_simple_bernoulli + elif key in parobj._chambers: + class_ = HC_constant_elastance # HC_mixed_elastance HC_constant_elastance + else: + raise Exception(f'Component name {key} not in the model list.') + self.components[key] = class_(name=name, + time_object=self.time_object, + **parobj[key].to_dict()) + + if key not in parobj._valves + parobj._cap + parobj._imp: + self.set_v_sv(key) + # else: + # self.set_phi_sv(key) + self.components[key].setup() + + self.connect_modules(self.components['lv'], + self.components['ao'], + plabel='p_lv', + qlabel='q_ao', + ) + self.connect_modules(self.components['ao'], + self.components['sai'], + plabel='p_sa', + qlabel='q_ao') + self.connect_modules(self.components['sai'], + self.components['sa'], + plabel='pi_sa', + qlabel='q_ao', + qvariable=self.components['ao']._Q_o) + self.connect_modules(self.components['sa'], + self.components['sc'], + plabel='p_sc', + qlabel='q_sa') + self.connect_modules(self.components['sc'], + self.components['sv'], + plabel='p_sv', + qlabel='q_sa', + qvariable=self.components['sa']._Q_o) + self.connect_modules(self.components['sv'], + self.components['ra'], + plabel='p_ra', + qlabel='q_sv') + self.connect_modules(self.components['ra'], + self.components['ti'], + plabel='p_ra', + qlabel='q_ti') + self.connect_modules(self.components['ti'], + self.components['rv'], + plabel='p_rv', + qlabel='q_ti') + self.connect_modules(self.components['rv'], + self.components['po'], + plabel='p_rv', + qlabel='q_po') + self.connect_modules(self.components['po'], + self.components['pai'], + plabel='p_pa', + qlabel='q_po') + self.connect_modules(self.components['pai'], + self.components['pa'], + plabel='pi_pa', + qlabel='q_po', + qvariable=self.components['po']._Q_o) + self.connect_modules(self.components['pa'], + self.components['pc'], + plabel='p_pc', + qlabel='q_pa') + self.connect_modules(self.components['pc'], + self.components['pv'], + plabel='p_pv', + qlabel='q_pa', + qvariable=self.components['pa']._Q_o) + self.connect_modules(self.components['pv'], + self.components['la'], + plabel='p_la', + qlabel='q_pv') + self.connect_modules(self.components['la'], + self.components['mi'], + plabel='p_la', + qlabel='q_mi') + self.connect_modules(self.components['mi'], + self.components['lv'], + plabel='p_lv', + qlabel='q_mi') + for component in self.components.values(): + component.setup() + + def set_phi_sv(self, comp_key:str) -> None: + phi_key = 'phi_' + comp_key + self._state_variable_dict[phi_key] = self.components[comp_key]._PHI + self._state_variable_dict[phi_key].set_name(phi_key) + self.all_sv_data[phi_key] = self.components[comp_key].PHI diff --git a/src/ModularCirc/Models/MixedHeartMaynard4eWindkessel_parameters.py b/src/ModularCirc/Models/MixedHeartMaynard4eWindkessel_parameters.py new file mode 100644 index 0000000..6a5c0e5 --- /dev/null +++ b/src/ModularCirc/Models/MixedHeartMaynard4eWindkessel_parameters.py @@ -0,0 +1,132 @@ +from ..HelperRoutines import activation_function_2, activation_function_3, relu_max, softplus +from .ParametersObject import ParametersObject +import pandas as pd + + +MHM4WK_COMPONENTS = [ + 'la', # left atrium + 'mi', # mitral valve + 'lv', # left ventricle + 'ao', # aortic valve + 'sai', # systemic aortic impedance + 'sa', # systemic artery + 'sc', # systemic capilary bed + 'sv', # systemic vein + 'ra', # right atrium + 'ti', # tricuspid vale + 'rv', # right ventricle + 'po', # pulmonary valve + 'pai', # pulmonary artery impedance + 'pa', # pulmonary artery + 'pc', # pulmonary capilary + 'pv', # pulmonary vein + ] +VESSELS = ['sa', 'sv', 'pa', 'pv'] +VESSELS_PAR = ['r', 'c', 'l', 'v_ref', 'v', 'p'] + +VALVES = ['mi', 'ao', 'ti', 'po'] +# VALVES_PAR = ['CQ', 'RRA', 'Ko', 'Kc', 'R', 'L'] +# VALVES_PAR = ['r', 'max_func'] +VALVES_PAR = ['CQ', 'RRA'] + + +CHAMBERS = ['la', 'lv', 'ra', 'rv'] +CHAMBERS_PAR = ['E_pas', 'E_act', 'v_ref', 'k_pas', 'af', 'v', 'p', 'tr', 'td', 'delay', 'tpww', 'tpwb'] + +IMPEDANCES = ['sai', 'pai'] +IMPEDANCES_PAR = ['r'] + +CAPILARIES = ['sc', 'pc'] +CAPILARIES_PAR = ['r'] + +OBJ_PAR_PAIRS = [[VESSELS, VESSELS_PAR], + [VALVES, VALVES_PAR], + [CHAMBERS, CHAMBERS_PAR], + [IMPEDANCES, IMPEDANCES_PAR], + [CAPILARIES, CAPILARIES_PAR]] + +class MixedHeartMaynard4eWindkessel_parameters(ParametersObject): + """ + Intro + ----- + Model Parameters for MixedHeartMaynard4eWindkessel models + """ + def __init__(self, name='MixedHeartMaynard4eWindkessel_parameters') -> None: + super().__init__(name=name) + self.components = {key : None for key in MHM4WK_COMPONENTS} + for type_, type_var in OBJ_PAR_PAIRS: + for key in type_: + self[key] = pd.Series(index=type_var, dtype=object) + + self._vessels = VESSELS + self._valves = VALVES + self._chambers= CHAMBERS + self._imp = IMPEDANCES + self._cap = CAPILARIES + + self.set_chamber_comp('lv', E_pas= 0.1, E_act= 2.5, k_pas=0.03, v_ref=5.0, tr = 0.30, td = 0.450, v=50.) + self.set_chamber_comp('la', E_pas= 0.15, E_act= 0.25, k_pas=0.03, v_ref=4.0, tpwb = 0.0, tpww = 0.09, delay=0.08, v=0.0) + self.set_chamber_comp('rv', E_pas= 0.1, E_act= 1.15, k_pas=0.03, v_ref=10., tr =0.30, td=0.45, v=50.) + self.set_chamber_comp('ra', E_pas= 0.15, E_act= 0.25, k_pas=0.03, v_ref=4., tpwb=0.0, tpww=0.09, delay=0.08, v=0.0) + + self.set_activation_function('lv', af=activation_function_2) + self.set_activation_function('rv', af=activation_function_2) + + self.set_activation_function('la', af=activation_function_3) + self.set_activation_function('ra', af=activation_function_3) + + + # systemic circulation + self.set_rlc_comp('sa', r=0.05, c=1.6 , l=0.0017 , v=450.0, v_ref=0.0) + self.set_rlc_comp('sv', r=0.075, c=20.5, v=0.0, v_ref=0.0) + + # set impedances + self.set_resistance('sai', r = 0.003) + self.set_resistance('pai', r = 0.002) + + # pulmonary circulation + self.set_rlc_comp('pa', r=0.01, c=3.8 , l=0.0017 , v=250.0, v_ref=0.0) + self.set_rlc_comp('pv', r=0.006, c=20.5 , v=0.0, v_ref=0.0) + + # set capilary resistances + self.set_resistance('sc', r = 0.5 + 0.52) + self.set_resistance('pc', r = 0.05 + 0.25) + + # valves + ##################################################### + # self.set_valve_comp('ao', r=0.01, max_func=relu_max) + # self.set_valve_comp('mi', r=0.01, max_func=relu_max) + # self.set_valve_comp('po', r=0.01, max_func=relu_max) + # self.set_valve_comp('ti', r=0.01, max_func=relu_max) + ##################################################### + # self.set_valve_comp('ao', r=0.01, max_func=softplus) + # self.set_valve_comp('mi', r=0.01, max_func=softplus) + # self.set_valve_comp('po', r=0.01, max_func=softplus) + # self.set_valve_comp('ti', r=0.01, max_func=softplus) + ##################################################### + # self.set_valve_comp('ao', CQ=350., RRA=0.0, Ko = 26., Kc = 2e3, L=0.0, R=0.0) + # self.set_valve_comp('mi', CQ=400., RRA=0.0, Ko = 40., Kc = 2e3, L=0.0, R=0.0 ) + # self.set_valve_comp('po', CQ=350., RRA=0.0, Ko = 40., Kc = 18e3,L=0.0, R=0.0 ) + # self.set_valve_comp('ti', CQ=400., RRA=0.0, Ko = 40., Kc = 2e3, L=0.0, R=0.0 ) + ##################################################### + self.set_valve_comp('ao', CQ=350., RRA=0.0) + self.set_valve_comp('mi', CQ=400., RRA=0.0) + self.set_valve_comp('po', CQ=350., RRA=0.0) + self.set_valve_comp('ti', CQ=400., RRA=0.0) + ##################################################### + + + def set_chamber_comp(self, key, **kwargs): + self._set_comp(key=key, set=CHAMBERS, **kwargs) + + def set_activation_function(self, key, af): + self._set_comp(key, set=CHAMBERS, af=af) + + def set_rlc_comp(self, key, **kwargs): + self._set_comp(key=key, set=VESSELS, **kwargs) + + def set_valve_comp(self, key, **kwargs): + self._set_comp(key=key, set=VALVES, **kwargs) + + def set_resistance(self, key, **kwargs): + self._set_comp(key=key, set=IMPEDANCES + CAPILARIES, **kwargs) From 8ac70dff347c09c20d61b392f68edbbc98613ad5 Mon Sep 17 00:00:00 2001 From: Levan Bokeria Date: Mon, 19 May 2025 14:15:31 +0100 Subject: [PATCH 2/3] changing to axis=1 --- src/ModularCirc/_BatchRunner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ModularCirc/_BatchRunner.py b/src/ModularCirc/_BatchRunner.py index 03935f3..26ca0f7 100644 --- a/src/ModularCirc/_BatchRunner.py +++ b/src/ModularCirc/_BatchRunner.py @@ -98,7 +98,7 @@ def setup_model(self, model:OdeModel, po:ParametersObject, time_setup:dict): def run_batch(self, n_jobs=1, **kwargs): if n_jobs == 1: - success = self._samples.apply(lambda row : self._run_case(row, **kwargs), axis=0) + success = self._samples.apply(lambda row : self._run_case(row, **kwargs), axis=1) else: success = joblib.Parallel(n_jobs=n_jobs)( joblib.delayed(self._run_case)(row, **kwargs) From 72d3665e70eb9e7a2dcc40df2891c8318c1d3710 Mon Sep 17 00:00:00 2001 From: Levan Bokeria Date: Mon, 19 May 2025 15:01:56 +0100 Subject: [PATCH 3/3] deleting untested models --- src/ModularCirc/Models/KPat5MixedModel.py | 136 ------------------ .../Models/KPat5MixedModel_parameters.py | 108 -------------- .../Models/KorakianitisMaynardModel.py | 114 --------------- .../KorakianitisMaynardModel_parameters.py | 88 ------------ .../Models/KorakianitisMixedMaynardModel.py | 113 --------------- ...orakianitisMixedMaynardModel_parameters.py | 88 ------------ src/ModularCirc/Models/KorakianitisModel.py | 104 -------------- .../Models/KorakianitisModel_parameters.py | 98 ------------- .../Models/MixedHeartMaynard4eWindkessel.py | 132 ----------------- ...ixedHeartMaynard4eWindkessel_parameters.py | 132 ----------------- 10 files changed, 1113 deletions(-) delete mode 100644 src/ModularCirc/Models/KPat5MixedModel.py delete mode 100644 src/ModularCirc/Models/KPat5MixedModel_parameters.py delete mode 100644 src/ModularCirc/Models/KorakianitisMaynardModel.py delete mode 100644 src/ModularCirc/Models/KorakianitisMaynardModel_parameters.py delete mode 100644 src/ModularCirc/Models/KorakianitisMixedMaynardModel.py delete mode 100644 src/ModularCirc/Models/KorakianitisMixedMaynardModel_parameters.py delete mode 100644 src/ModularCirc/Models/KorakianitisModel.py delete mode 100644 src/ModularCirc/Models/KorakianitisModel_parameters.py delete mode 100644 src/ModularCirc/Models/MixedHeartMaynard4eWindkessel.py delete mode 100644 src/ModularCirc/Models/MixedHeartMaynard4eWindkessel_parameters.py diff --git a/src/ModularCirc/Models/KPat5MixedModel.py b/src/ModularCirc/Models/KPat5MixedModel.py deleted file mode 100644 index feb9644..0000000 --- a/src/ModularCirc/Models/KPat5MixedModel.py +++ /dev/null @@ -1,136 +0,0 @@ -from .OdeModel import OdeModel -from .KorakianitisModel_parameters import KorakianitisModel_parameters as k2006 -from .ParametersObject import ParametersObject as po -from ..Components import Rlc_component, Valve_simple_bernoulli, HC_mixed_elastance - -FULL_NAMES =[ - 'LeftA', - 'MiValve', - 'LeftV', - 'AoV', - 'SysAoSin', - 'SysArt', - 'SysVen', - 'RightA', - 'TriValve', - 'RightV', - 'PulV', - 'PulArtSin', - 'PulArt0', - 'PulArt1', - 'PulArt2', - 'PulArt3', - 'PulArt4', - 'PulVen', -] - -class KPat5MixedModel(OdeModel): - def __init__(self, time_setup_dict, parobj:po=k2006, suppress_printing:bool=False) -> None: - super().__init__(time_setup_dict) - self.name = 'KorakianitisModel' - - if not suppress_printing: print(parobj) - - # The components... - for key, name in zip(parobj.components.keys(), FULL_NAMES): - if key in parobj._vessels: - class_ = Rlc_component - elif key in parobj._valves: - class_ = Valve_simple_bernoulli - elif key in parobj._chambers: - class_ = HC_mixed_elastance - else: - raise Exception(f'Component name {key} not in the model list.') - self.components[key] = class_(name=name, - time_object=self.time_object, - **parobj[key].to_dict()) - if key not in parobj._valves: - self.set_v_sv(key) - # else: - # self.set_phi_sv(key) - self.components[key].setup() - - self.connect_modules(self.components['lv'], - self.components['ao'], - plabel='p_lv', - qlabel='q_ao') - self.connect_modules(self.components['ao'], - self.components['sas'], - plabel='p_sas', - qlabel='q_ao') - self.connect_modules(self.components['sas'], - self.components['sat'], - plabel='p_sat', - qlabel='q_sas') - self.connect_modules(self.components['sat'], - self.components['svn'], - plabel='p_svn', - qlabel='q_sat') - self.connect_modules(self.components['svn'], - self.components['ra'], - plabel='p_ra', - qlabel='q_svn') - self.connect_modules(self.components['ra'], - self.components['ti'], - plabel='p_ra', - qlabel='q_ti') - self.connect_modules(self.components['ti'], - self.components['rv'], - plabel='p_rv', - qlabel='q_ti') - self.connect_modules(self.components['rv'], - self.components['po'], - plabel='p_rv', - qlabel='q_po') - self.connect_modules(self.components['po'], - self.components['pas'], - plabel='p_pas', - qlabel='q_po') - ############################################ - self.connect_modules(self.components['pas'], - self.components['pat0'], - plabel='p_pat0', - qlabel='q_pas') - self.connect_modules(self.components['pat0'], - self.components['pat1'], - plabel='p_pat1', - qlabel='q_pat0') - self.connect_modules(self.components['pat1'], - self.components['pat2'], - plabel='p_pat2', - qlabel='q_pat1') - self.connect_modules(self.components['pat2'], - self.components['pat3'], - plabel='p_pat3', - qlabel='q_pat2') - self.connect_modules(self.components['pat3'], - self.components['pat4'], - plabel='p_pat4', - qlabel='q_pat3') - ############################################ - self.connect_modules(self.components['pat4'], - self.components['pvn'], - plabel='p_pvn', - qlabel='q_pat4') - ############################################ - self.connect_modules(self.components['pvn'], - self.components['la'], - plabel='p_la', - qlabel='q_pvn') - self.connect_modules(self.components['la'], - self.components['mi'], - plabel='p_la', - qlabel='q_mi') - self.connect_modules(self.components['mi'], - self.components['lv'], - plabel='p_lv', - qlabel='q_mi') - - for component in self.components.values(): - component.setup() - - # def set_phi_sv(self, comp_key:str) -> None: - # phi_key = 'phi_' + comp_key - # self._state_variable_dict[phi_key] = self.components[comp_key]._PHI - # self._state_variable_dict[phi_key].set_name(phi_key) - # self.all_sv_data[phi_key] = self.components[comp_key].PHI diff --git a/src/ModularCirc/Models/KPat5MixedModel_parameters.py b/src/ModularCirc/Models/KPat5MixedModel_parameters.py deleted file mode 100644 index 4a47578..0000000 --- a/src/ModularCirc/Models/KPat5MixedModel_parameters.py +++ /dev/null @@ -1,108 +0,0 @@ -from ..HelperRoutines import activation_function_2, activation_function_3 -from .ParametersObject import ParametersObject -import pandas as pd - - -KKPat10_COMPONENTS = [ - 'la', # left atrium - 'mi', # mitral valve - 'lv', # left ventricle - 'ao', # aortic valve - 'sas', # systemic aortic sinus - 'sat', # systemic artery - 'svn', # systemic vein - 'ra', # right atrium - 'ti', # tricuspid vale - 'rv', # right ventricle - 'po', # pulmonary valve - 'pas', # pulmonary artery sinus - ############################### - 'pat0', # pulmonary artery - 'pat1', # pulmonary artery - 'pat2', # pulmonary artery - 'pat3', # pulmonary artery - 'pat4', # pulmonary artery - ############################### - 'pvn' # pulmonary vein - ] -VESSELS = ['sas', 'sat', 'svn', 'pas', 'pat0', 'pat1', 'pat2', 'pat3', 'pat4', 'pvn'] -VESSELS_PAR = ['r', 'c', 'l', 'v_ref', 'v', 'p'] - -VALVES = ['mi', 'ao', 'ti', 'po'] -VALVES_PAR = ['CQ', 'RRA'] - -CHAMBERS = ['la', 'lv', 'ra', 'rv'] -CHAMBERS_PAR = ['E_pas', 'E_act', 'v_ref', 'k_pas', 'af', 'v', 'p', 'tr', 'td', 'delay', 'tpww', 'tpwb'] - - -class KPat5MixedModel_parameters(ParametersObject): - """ - Intro - ----- - Model Parameters based on Korakianitis and Shi (2006) - """ - def __init__(self, name='Korakianitis 2006') -> None: - super().__init__(name=name) - self.components = {key : None for key in KKPat10_COMPONENTS} - for type_, type_var in [[VESSELS, VESSELS_PAR], [VALVES, VALVES_PAR], [CHAMBERS, CHAMBERS_PAR]]: - for key in type_: - self[key] = pd.Series(index=type_var, dtype=object) - - self._vessels = VESSELS - self._valves = VALVES - self._chambers= CHAMBERS - - self.set_chamber_comp('lv', E_pas= 0.1, k_pas=0.01, E_act= 2.5, v_ref=50.0, tr = 0.30, td = 0.450, v=100.) - self.set_chamber_comp('la', E_pas= 0.15, k_pas=0.01, E_act= 0.25, v_ref=10.0, tpwb = 0.0, tpww = 0.09, delay=0.08, v=0.0) - self.set_chamber_comp('rv', E_pas= 0.1, k_pas=0.01, E_act= 1.15, v_ref=50., tr=0.30, td=0.45, v=100.) - self.set_chamber_comp('ra', E_pas= 0.15, k_pas=0.01, E_act= 0.25, v_ref=10., tpwb=0.0, tpww=0.09, delay=0.08, v=0.0) - - - self.set_activation_function('lv', af=activation_function_2) - self.set_activation_function('rv', af=activation_function_2) - - self.set_activation_function('la', af=activation_function_3) - self.set_activation_function('ra', af=activation_function_3) - - - # systemic circulation - self.set_rlc_comp('sas', r=0.003, c=0.08, l=0.000062, v=0.0, v_ref=0.0) - self.set_rlc_comp('sat', r=(0.05 + 0.5 + 0.52), c=1.6 , l=0.0017 , v=550.0, v_ref=0.0) - self.set_rlc_comp('svn', r=0.075, c=20.5, v=0.0, v_ref=0.0) - - # pulmonary circulation - self.set_rlc_comp('pas', r=0.002 , c=0.18, l=0.000052, v=0.0, v_ref=0.0) - ############################################################################################# - self.set_rlc_comp('pat0', r=(0.01/5.), c=(3.8/5.) , l=(0.0017/5.) , v=0.0, v_ref=0.0) - self.set_rlc_comp('pat1', r=(0.01/5.), c=(3.8/5.) , l=(0.0017/5.) , v=0.0, v_ref=0.0) - self.set_rlc_comp('pat2', r=(0.01/5.), c=(3.8/5.) , l=(0.0017/5.) , v=0.0, v_ref=0.0) - self.set_rlc_comp('pat3', r=(0.01/5.), c=(3.8/5. ), l=(0.0017/5. ) , v=0.0, v_ref=0.0) - self.set_rlc_comp('pat4', r=(0.01/5.+0.05+0.25), c=(3.8/5.) , l=(0.0017/5.), v=0.0, v_ref=0.0) - ############################################################################################# - self.set_rlc_comp('pvn', r=0.006 , c=20.5 , v=0.0, v_ref=0.0) - - # valves - self.set_valve_comp('ao', CQ=350., RRA=0.0) - self.set_valve_comp('mi', CQ=400., RRA=0.0) - self.set_valve_comp('po', CQ=350., RRA=0.0) - self.set_valve_comp('ti', CQ=400., RRA=0.0) - - def set_chamber_comp(self, key, **kwargs): - self._set_comp(key=key, set=CHAMBERS, **kwargs) - - def set_activation_function(self, key, af): - self._set_comp(key, set=CHAMBERS, af=af) - - def set_rlc_comp(self, key, **kwargs): - self._set_comp(key=key, set=VESSELS, **kwargs) - - def set_valve_comp(self, key, **kwargs): - self._set_comp(key=key, set=VALVES, **kwargs) - - def set(self, key, **kwargs): - if key in CHAMBERS: - self._set_comp(key=key, set=CHAMBERS, **kwargs) - if key in VESSELS: - self._set_comp(key=key, set=VESSELS, **kwargs) - if key in VALVES: - self._set_comp(key=key, set=VALVES, **kwargs) diff --git a/src/ModularCirc/Models/KorakianitisMaynardModel.py b/src/ModularCirc/Models/KorakianitisMaynardModel.py deleted file mode 100644 index b923493..0000000 --- a/src/ModularCirc/Models/KorakianitisMaynardModel.py +++ /dev/null @@ -1,114 +0,0 @@ -from .OdeModel import OdeModel -from .KorakianitisModel_parameters import KorakianitisModel_parameters as k2006 -from .ParametersObject import ParametersObject as po -from ..Components import Rlc_component, Valve_maynard, HC_constant_elastance - -FULL_NAMES =[ - 'LeftA', - 'MiValve', - 'LeftV', - 'AoV', - 'SysAoSin', - 'SysArt', - 'SysVen', - 'RightA', - 'TriValve', - 'RightV', - 'PulV', - 'PulArtSin', - 'PulArt', - 'PulVen', -] - -class KorakianitisMaynardModel(OdeModel): - def __init__(self, time_setup_dict, parobj:po=k2006) -> None: - super().__init__(time_setup_dict) - self.name = 'KorakianitisModel' - - print(parobj) - - # The components... - for key, name in zip(parobj.components.keys(), FULL_NAMES): - if key in parobj._vessels: - class_ = Rlc_component - elif key in parobj._valves: - class_ = Valve_maynard - elif key in parobj._chambers: - class_ = HC_constant_elastance - else: - raise Exception(f'Component name {key} not in the model list.') - self.components[key] = class_(name=name, - time_object=self.time_object, - **parobj[key].to_dict()) - if key not in parobj._valves: - self.set_v_sv(key) - else: - self.set_phi_sv(key) - self.components[key].setup() - - self.connect_modules(self.components['lv'], - self.components['ao'], - plabel='p_lv', - qlabel='q_ao') - self.connect_modules(self.components['ao'], - self.components['sas'], - plabel='p_sas', - qlabel='q_ao') - self.connect_modules(self.components['sas'], - self.components['sat'], - plabel='p_sat', - qlabel='q_sas') - self.connect_modules(self.components['sat'], - self.components['svn'], - plabel='p_svn', - qlabel='q_sat') - self.connect_modules(self.components['svn'], - self.components['ra'], - plabel='p_ra', - qlabel='q_svn') - self.connect_modules(self.components['ra'], - self.components['ti'], - plabel='p_ra', - qlabel='q_ti') - self.connect_modules(self.components['ti'], - self.components['rv'], - plabel='p_rv', - qlabel='q_ti') - self.connect_modules(self.components['rv'], - self.components['po'], - plabel='p_rv', - qlabel='q_po') - self.connect_modules(self.components['po'], - self.components['pas'], - plabel='p_pas', - qlabel='q_po') - self.connect_modules(self.components['pas'], - self.components['pat'], - plabel='p_pat', - qlabel='q_pas') - self.connect_modules(self.components['pat'], - self.components['pvn'], - plabel='p_pvn', - qlabel='q_pat') - self.connect_modules(self.components['pvn'], - self.components['la'], - plabel='p_la', - qlabel='q_pvn') - self.connect_modules(self.components['la'], - self.components['mi'], - plabel='p_la', - qlabel='q_mi') - self.connect_modules(self.components['mi'], - self.components['lv'], - plabel='p_lv', - qlabel='q_mi') - - for component in self.components.values(): - component.setup() - - def set_phi_sv(self, comp_key:str) -> None: - phi_key = 'phi_' + comp_key - self._state_variable_dict[phi_key] = self.components[comp_key]._PHI - self._state_variable_dict[phi_key].set_name(phi_key) - self.all_sv_data[phi_key] = self.components[comp_key].PHI - self.components[comp_key]._PHI._u = self.all_sv_data[phi_key] diff --git a/src/ModularCirc/Models/KorakianitisMaynardModel_parameters.py b/src/ModularCirc/Models/KorakianitisMaynardModel_parameters.py deleted file mode 100644 index 6c9a840..0000000 --- a/src/ModularCirc/Models/KorakianitisMaynardModel_parameters.py +++ /dev/null @@ -1,88 +0,0 @@ -from ..HelperRoutines import activation_function_2, activation_function_3 -from .ParametersObject import ParametersObject -import pandas as pd - - -KORAKIANITIS_2006_COMPONENTS = [ - 'la', # left atrium - 'mi', # mitral valve - 'lv', # left ventricle - 'ao', # aortic valve - 'sas', # systemic aortic sinus - 'sat', # systemic artery - 'svn', # systemic vein - 'ra', # right atrium - 'ti', # tricuspid vale - 'rv', # right ventricle - 'po', # pulmonary valve - 'pas', # pulmonary artery sinus - 'pat', # pulmonary artery - 'pvn' # pulmonary vein - ] -VESSELS = ['sas', 'sat', 'svn', 'pas', 'pat', 'pvn'] -VESSELS_PAR = ['r', 'c', 'l', 'v_ref', 'v', 'p'] - -VALVES = ['mi', 'ao', 'ti', 'po'] -VALVES_PAR = ['CQ', 'RRA', 'Ko', 'Kc', 'R', 'L'] - -CHAMBERS = ['la', 'lv', 'ra', 'rv'] -CHAMBERS_PAR = ['E_pas', 'E_act', 'v_ref', 'k_pas', 'af', 'v', 'p', 'tr', 'td', 'delay', 'tpww', 'tpwb'] - - -class KorakianitisMaynardModel_parameters(ParametersObject): - """ - Intro - ----- - Model Parameters based on Korakianitis and Shi (2006) with Maynard (2012) valves - """ - def __init__(self, name='Korakianitis 2006') -> None: - super().__init__(name=name) - self.components = {key : None for key in KORAKIANITIS_2006_COMPONENTS} - for type_, type_var in [[VESSELS, VESSELS_PAR], [VALVES, VALVES_PAR], [CHAMBERS, CHAMBERS_PAR]]: - for key in type_: - self[key] = pd.Series(index=type_var, dtype=object) - - self._vessels = VESSELS - self._valves = VALVES - self._chambers= CHAMBERS - - self.set_chamber_comp('lv', E_pas= 0.1, E_act= 2.5, v_ref=5.0, k_pas=0.1, tr = 0.30, td = 0.450, v=500.) - self.set_chamber_comp('la', E_pas= 0.15, E_act= 0.25, v_ref=4.0, k_pas=0.1, tpwb = 0.0, tpww = 0.09, delay=0.08, v=0.0) - self.set_chamber_comp('rv', E_pas= 0.1, E_act= 1.15, v_ref=10., k_pas=0.1, tr=0.30, td=0.45, v=400.) - self.set_chamber_comp('ra', E_pas= 0.15, E_act= 0.25, v_ref=4., k_pas=0.1, tpwb=0.0, tpww=0.09, delay=0.08, v=0.0) - - self.set_activation_function('lv', af=activation_function_2) - self.set_activation_function('rv', af=activation_function_2) - - self.set_activation_function('la', af=activation_function_3) - self.set_activation_function('ra', af=activation_function_3) - - - # systemic circulation - self.set_rlc_comp('sas', r=0.003, c=0.08, l=0.000062, v=0.0, v_ref=0.0) - self.set_rlc_comp('sat', r=(0.05 + 0.5 + 0.52), c=1.6 , l=0.0017 , v=0.0, v_ref=0.0) - self.set_rlc_comp('svn', r=0.075, c=20.5, v=0.0, v_ref=0.0) - - # pulmonary circulation - self.set_rlc_comp('pas', r=0.002 , c=0.18, l=0.000052, v=0.0, v_ref=0.0) - self.set_rlc_comp('pat', r=(0.01+0.05+0.25), c=3.8 , l=0.0017 , v=0.0, v_ref=0.0) - self.set_rlc_comp('pvn', r=0.006 , c=20.5 , v=0.0, v_ref=0.0) - - # valves - dyn = 1333.22 - self.set_valve_comp('ao', CQ=350., RRA=0.0, Ko = 0.012/dyn, Kc = 0.012/dyn, L=0.0, R=0.0) - self.set_valve_comp('mi', CQ=400., RRA=0.0, Ko = 0.03/dyn, Kc = 0.04/dyn, L=0.0, R=0.0 ) - self.set_valve_comp('po', CQ=350., RRA=0.0, Ko = 0.02/dyn, Kc = 0.02/dyn, L=0.0, R=0.0 ) - self.set_valve_comp('ti', CQ=400., RRA=0.0, Ko = 0.03/dyn, Kc = 0.04/dyn, L=0.0, R=0.0 ) - - def set_chamber_comp(self, key, **kwargs): - self._set_comp(key=key, set=CHAMBERS, **kwargs) - - def set_activation_function(self, key, af): - self._set_comp(key, set=CHAMBERS, af=af) - - def set_rlc_comp(self, key, **kwargs): - self._set_comp(key=key, set=VESSELS, **kwargs) - - def set_valve_comp(self, key, **kwargs): - self._set_comp(key=key, set=VALVES, **kwargs) diff --git a/src/ModularCirc/Models/KorakianitisMixedMaynardModel.py b/src/ModularCirc/Models/KorakianitisMixedMaynardModel.py deleted file mode 100644 index 2e23339..0000000 --- a/src/ModularCirc/Models/KorakianitisMixedMaynardModel.py +++ /dev/null @@ -1,113 +0,0 @@ -from .OdeModel import OdeModel -from .KorakianitisModel_parameters import KorakianitisModel_parameters as k2006 -from .ParametersObject import ParametersObject as po -from ..Components import Rlc_component, Valve_maynard, HC_mixed_elastance - -FULL_NAMES =[ - 'LeftA', - 'MiValve', - 'LeftV', - 'AoV', - 'SysAoSin', - 'SysArt', - 'SysVen', - 'RightA', - 'TriValve', - 'RightV', - 'PulV', - 'PulArtSin', - 'PulArt', - 'PulVen', -] - -class KorakianitisMixedMaynardModel(OdeModel): - def __init__(self, time_setup_dict, parobj:po=k2006) -> None: - super().__init__(time_setup_dict) - self.name = 'KorakianitisModel' - - print(parobj) - - # The components... - for key, name in zip(parobj.components.keys(), FULL_NAMES): - if key in parobj._vessels: - class_ = Rlc_component - elif key in parobj._valves: - class_ = Valve_maynard - elif key in parobj._chambers: - class_ = HC_mixed_elastance - else: - raise Exception(f'Component name {key} not in the model list.') - self.components[key] = class_(name=name, - time_object=self.time_object, - **parobj[key].to_dict()) - if key not in parobj._valves: - self.set_v_sv(key) - else: - self.set_phi_sv(key) - self.components[key].setup() - - self.connect_modules(self.components['lv'], - self.components['ao'], - plabel='p_lv', - qlabel='q_ao') - self.connect_modules(self.components['ao'], - self.components['sas'], - plabel='p_sas', - qlabel='q_ao') - self.connect_modules(self.components['sas'], - self.components['sat'], - plabel='p_sat', - qlabel='q_sas') - self.connect_modules(self.components['sat'], - self.components['svn'], - plabel='p_svn', - qlabel='q_sat') - self.connect_modules(self.components['svn'], - self.components['ra'], - plabel='p_ra', - qlabel='q_svn') - self.connect_modules(self.components['ra'], - self.components['ti'], - plabel='p_ra', - qlabel='q_ti') - self.connect_modules(self.components['ti'], - self.components['rv'], - plabel='p_rv', - qlabel='q_ti') - self.connect_modules(self.components['rv'], - self.components['po'], - plabel='p_rv', - qlabel='q_po') - self.connect_modules(self.components['po'], - self.components['pas'], - plabel='p_pas', - qlabel='q_po') - self.connect_modules(self.components['pas'], - self.components['pat'], - plabel='p_pat', - qlabel='q_pas') - self.connect_modules(self.components['pat'], - self.components['pvn'], - plabel='p_pvn', - qlabel='q_pat') - self.connect_modules(self.components['pvn'], - self.components['la'], - plabel='p_la', - qlabel='q_pvn') - self.connect_modules(self.components['la'], - self.components['mi'], - plabel='p_la', - qlabel='q_mi') - self.connect_modules(self.components['mi'], - self.components['lv'], - plabel='p_lv', - qlabel='q_mi') - - for component in self.components.values(): - component.setup() - - def set_phi_sv(self, comp_key:str) -> None: - phi_key = 'phi_' + comp_key - self._state_variable_dict[phi_key] = self.components[comp_key]._PHI - self._state_variable_dict[phi_key].set_name(phi_key) - self.all_sv_data[phi_key] = self.components[comp_key].PHI diff --git a/src/ModularCirc/Models/KorakianitisMixedMaynardModel_parameters.py b/src/ModularCirc/Models/KorakianitisMixedMaynardModel_parameters.py deleted file mode 100644 index 1dd6299..0000000 --- a/src/ModularCirc/Models/KorakianitisMixedMaynardModel_parameters.py +++ /dev/null @@ -1,88 +0,0 @@ -from ..HelperRoutines import activation_function_2, activation_function_3 -from .ParametersObject import ParametersObject -import pandas as pd - - -KORAKIANITIS_2006_COMPONENTS = [ - 'la', # left atrium - 'mi', # mitral valve - 'lv', # left ventricle - 'ao', # aortic valve - 'sas', # systemic aortic sinus - 'sat', # systemic artery - 'svn', # systemic vein - 'ra', # right atrium - 'ti', # tricuspid vale - 'rv', # right ventricle - 'po', # pulmonary valve - 'pas', # pulmonary artery sinus - 'pat', # pulmonary artery - 'pvn' # pulmonary vein - ] -VESSELS = ['sas', 'sat', 'svn', 'pas', 'pat', 'pvn'] -VESSELS_PAR = ['r', 'c', 'l', 'v_ref', 'v', 'p'] - -VALVES = ['mi', 'ao', 'ti', 'po'] -VALVES_PAR = ['CQ', 'RRA', 'Ko', 'Kc', 'R', 'L'] - -CHAMBERS = ['la', 'lv', 'ra', 'rv'] -CHAMBERS_PAR = ['E_pas', 'E_act', 'v_ref', 'k_pas', 'af', 'v', 'p', 'tr', 'td', 'delay', 'tpww', 'tpwb'] - - -class KorakianitisMixedMaynardModel_parameters(ParametersObject): - """ - Intro - ----- - Model Parameters based on Korakianitis and Shi (2006) with Maynard (2012) valves - """ - def __init__(self, name='Korakianitis 2006') -> None: - super().__init__(name=name) - self.components = {key : None for key in KORAKIANITIS_2006_COMPONENTS} - for type_, type_var in [[VESSELS, VESSELS_PAR], [VALVES, VALVES_PAR], [CHAMBERS, CHAMBERS_PAR]]: - for key in type_: - self[key] = pd.Series(index=type_var, dtype=object) - - self._vessels = VESSELS - self._valves = VALVES - self._chambers= CHAMBERS - - self.set_chamber_comp('lv', E_pas= 0.1, E_act= 2.5, v_ref=5.0, k_pas=0.1, tr = 0.30, td = 0.450, v=50.) - self.set_chamber_comp('la', E_pas= 0.15, E_act= 0.25, v_ref=4.0, k_pas=0.1, tpwb = 0.0, tpww = 0.09, delay=0.08, v=0.0) - self.set_chamber_comp('rv', E_pas= 0.1, E_act= 1.15, v_ref=10., k_pas=0.1, tr=0.30, td=0.45, v=100.) - self.set_chamber_comp('ra', E_pas= 0.15, E_act= 0.25, v_ref=4., k_pas=0.1, tpwb=0.0, tpww=0.09, delay=0.08, v=0.0) - - self.set_activation_function('lv', af=activation_function_2) - self.set_activation_function('rv', af=activation_function_2) - - self.set_activation_function('la', af=activation_function_3) - self.set_activation_function('ra', af=activation_function_3) - - - # systemic circulation - self.set_rlc_comp('sas', r=0.003, c=0.08, l=0.000062, v=450.0, v_ref=0.0) - self.set_rlc_comp('sat', r=(0.05 + 0.5 + 0.52), c=1.6 , l=0.0017 , v=0.0, v_ref=0.0) - self.set_rlc_comp('svn', r=0.075, c=20.5, v=0.0, v_ref=0.0) - - # pulmonary circulation - self.set_rlc_comp('pas', r=0.002 , c=0.18, l=0.000052, v=200.0, v_ref=0.0) - self.set_rlc_comp('pat', r=(0.01+0.05+0.25), c=3.8 , l=0.0017 , v=0.0, v_ref=0.0) - self.set_rlc_comp('pvn', r=0.006 , c=20.5 , v=0.0, v_ref=0.0) - - # valves - dyn = 1333.22 - self.set_valve_comp('ao', CQ=350., RRA=0.0, Ko = 0.012/dyn, Kc = 0.012/dyn, L=0.0, R=0.0) - self.set_valve_comp('mi', CQ=400., RRA=0.0, Ko = 0.03/dyn, Kc = 0.04/dyn, L=0.0, R=0.0 ) - self.set_valve_comp('po', CQ=350., RRA=0.0, Ko = 0.02/dyn, Kc = 0.02/dyn, L=0.0, R=0.0 ) - self.set_valve_comp('ti', CQ=400., RRA=0.0, Ko = 0.03/dyn, Kc = 0.04/dyn, L=0.0, R=0.0 ) - - def set_chamber_comp(self, key, **kwargs): - self._set_comp(key=key, set=CHAMBERS, **kwargs) - - def set_activation_function(self, key, af): - self._set_comp(key, set=CHAMBERS, af=af) - - def set_rlc_comp(self, key, **kwargs): - self._set_comp(key=key, set=VESSELS, **kwargs) - - def set_valve_comp(self, key, **kwargs): - self._set_comp(key=key, set=VALVES, **kwargs) diff --git a/src/ModularCirc/Models/KorakianitisModel.py b/src/ModularCirc/Models/KorakianitisModel.py deleted file mode 100644 index 91db341..0000000 --- a/src/ModularCirc/Models/KorakianitisModel.py +++ /dev/null @@ -1,104 +0,0 @@ -from .OdeModel import OdeModel -from .KorakianitisModel_parameters import KorakianitisModel_parameters as k2006 -from .ParametersObject import ParametersObject as po -from ..Components import Rlc_component, Valve_simple_bernoulli, HC_constant_elastance - -FULL_NAMES =[ - 'LeftA', - 'MiValve', - 'LeftV', - 'AoV', - 'SysAoSin', - 'SysArt', - 'SysVen', - 'RightA', - 'TriValve', - 'RightV', - 'PulV', - 'PulArtSin', - 'PulArt', - 'PulVen', -] - -class KorakianitisModel(OdeModel): - def __init__(self, time_setup_dict, parobj:po=k2006, suppress_printing:bool=False) -> None: - super().__init__(time_setup_dict) - self.name = 'KorakianitisModel' - - if not suppress_printing: print(parobj) - - # The components... - for key, name in zip(parobj.components.keys(), FULL_NAMES): - if key in parobj._vessels: - class_ = Rlc_component - elif key in parobj._valves: - class_ = Valve_simple_bernoulli - elif key in parobj._chambers: - class_ = HC_constant_elastance - else: - raise Exception(f'Component name {key} not in the model list.') - self.components[key] = class_(name=name, - time_object=self.time_object, - **parobj[key].to_dict()) - if key not in parobj._valves: self.set_v_sv(key) - self.components[key].setup() - - self.connect_modules(self.components['lv'], - self.components['ao'], - plabel='p_lv', - qlabel='q_ao') - self.connect_modules(self.components['ao'], - self.components['sas'], - plabel='p_sas', - qlabel='q_ao') - self.connect_modules(self.components['sas'], - self.components['sat'], - plabel='p_sat', - qlabel='q_sas') - self.connect_modules(self.components['sat'], - self.components['svn'], - plabel='p_svn', - qlabel='q_sat') - self.connect_modules(self.components['svn'], - self.components['ra'], - plabel='p_ra', - qlabel='q_svn') - self.connect_modules(self.components['ra'], - self.components['ti'], - plabel='p_ra', - qlabel='q_ti') - self.connect_modules(self.components['ti'], - self.components['rv'], - plabel='p_rv', - qlabel='q_ti') - self.connect_modules(self.components['rv'], - self.components['po'], - plabel='p_rv', - qlabel='q_po') - self.connect_modules(self.components['po'], - self.components['pas'], - plabel='p_pas', - qlabel='q_po') - self.connect_modules(self.components['pas'], - self.components['pat'], - plabel='p_pat', - qlabel='q_pas') - self.connect_modules(self.components['pat'], - self.components['pvn'], - plabel='p_pvn', - qlabel='q_pat') - self.connect_modules(self.components['pvn'], - self.components['la'], - plabel='p_la', - qlabel='q_pvn') - self.connect_modules(self.components['la'], - self.components['mi'], - plabel='p_la', - qlabel='q_mi') - self.connect_modules(self.components['mi'], - self.components['lv'], - plabel='p_lv', - qlabel='q_mi') - - for component in self.components.values(): - component.setup() diff --git a/src/ModularCirc/Models/KorakianitisModel_parameters.py b/src/ModularCirc/Models/KorakianitisModel_parameters.py deleted file mode 100644 index d40013a..0000000 --- a/src/ModularCirc/Models/KorakianitisModel_parameters.py +++ /dev/null @@ -1,98 +0,0 @@ -from ..HelperRoutines import activation_function_2, activation_function_3 -from .ParametersObject import ParametersObject -import pandas as pd - - -KORAKIANITIS_2006_COMPONENTS = [ - 'la', # left atrium - 'mi', # mitral valve - 'lv', # left ventricle - 'ao', # aortic valve - 'sas', # systemic aortic sinus - 'sat', # systemic artery - 'svn', # systemic vein - 'ra', # right atrium - 'ti', # tricuspid vale - 'rv', # right ventricle - 'po', # pulmonary valve - 'pas', # pulmonary artery sinus - 'pat', # pulmonary artery - 'pvn' # pulmonary vein - ] -VESSELS = ['sas', 'sat', 'svn', 'pas', 'pat', 'pvn'] -VESSELS_PAR = ['r', 'c', 'l', 'v_ref', 'v', 'p'] - -VALVES = ['mi', 'ao', 'ti', 'po'] -VALVES_PAR = ['CQ', 'RRA'] - -CHAMBERS = ['la', 'lv', 'ra', 'rv'] -CHAMBERS_PAR = ['E_pas', 'E_act', 'v_ref', 'af', 'v', 'p', 'tr', 'td', 'delay', 'tpww', 'tpwb'] - -# TIMINGS = [] - -class KorakianitisModel_parameters(ParametersObject): - """ - Intro - ----- - Model Parameters based on Korakianitis and Shi (2006) - """ - def __init__(self, name='Korakianitis 2006') -> None: - super().__init__(name=name) - self.components = {key : None for key in KORAKIANITIS_2006_COMPONENTS} - for type_, type_var in [[VESSELS, VESSELS_PAR], [VALVES, VALVES_PAR], [CHAMBERS, CHAMBERS_PAR]]: - for key in type_: - self[key] = pd.Series(index=type_var, dtype=object) - - # self.timings = {key : pd.Series(index=TIMINGS) for key in CHAMBERS} - - self._vessels = VESSELS - self._valves = VALVES - self._chambers= CHAMBERS - - self.set_chamber_comp('lv', E_pas= 0.1, E_act= 2.5, v_ref=5.0, tr = 0.30, td = 0.450, v=500.) - self.set_chamber_comp('la', E_pas= 0.15, E_act= 0.25, v_ref=4.0, tpwb = 0.0, tpww = 0.09, delay=0.08, v=0.0) - self.set_chamber_comp('rv', E_pas= 0.1, E_act= 1.15, v_ref=10., tr=0.30, td=0.45, v=400.) - self.set_chamber_comp('ra', E_pas= 0.15, E_act= 0.25, v_ref=4., tpwb=0.0, tpww=0.09, delay=0.08, v=0.0) - - self.set_activation_function('lv', af=activation_function_2) - self.set_activation_function('rv', af=activation_function_2) - - self.set_activation_function('la', af=activation_function_3) - self.set_activation_function('ra', af=activation_function_3) - - - # systemic circulation - self.set_rlc_comp('sas', r=0.003, c=0.08, l=0.000062, v=0.0, v_ref=0.0) - self.set_rlc_comp('sat', r=(0.05 + 0.5 + 0.52), c=1.6 , l=0.0017 , v=0.0, v_ref=0.0) - self.set_rlc_comp('svn', r=0.075, c=20.5, v=0.0, v_ref=0.0) - - # pulmonary circulation - self.set_rlc_comp('pas', r=0.002 , c=0.18, l=0.000052, v=0.0, v_ref=0.0) - self.set_rlc_comp('pat', r=(0.01+0.05+0.25), c=3.8 , l=0.0017 , v=0.0, v_ref=0.0) - self.set_rlc_comp('pvn', r=0.006 , c=20.5 , v=0.0, v_ref=0.0) - - # valves - self.set_valve_comp('ao', CQ=350., RRA=0.0) - self.set_valve_comp('mi', CQ=400., RRA=0.0) - self.set_valve_comp('po', CQ=350., RRA=0.0) - self.set_valve_comp('ti', CQ=400., RRA=0.0) - - def set_chamber_comp(self, key, **kwargs): - self._set_comp(key=key, set=CHAMBERS, **kwargs) - - def set_activation_function(self, key, af): - self._set_comp(key, set=CHAMBERS, af=af) - - def set_rlc_comp(self, key, **kwargs): - self._set_comp(key=key, set=VESSELS, **kwargs) - - def set_valve_comp(self, key, **kwargs): - self._set_comp(key=key, set=VALVES, **kwargs) - - def set(self, key, **kwargs): - if key in CHAMBERS: - self._set_comp(key=key, set=CHAMBERS, **kwargs) - if key in VESSELS: - self._set_comp(key=key, set=VESSELS, **kwargs) - if key in VALVES: - self._set_comp(key=key, set=VALVES, **kwargs) diff --git a/src/ModularCirc/Models/MixedHeartMaynard4eWindkessel.py b/src/ModularCirc/Models/MixedHeartMaynard4eWindkessel.py deleted file mode 100644 index d1fdbf3..0000000 --- a/src/ModularCirc/Models/MixedHeartMaynard4eWindkessel.py +++ /dev/null @@ -1,132 +0,0 @@ -from .OdeModel import OdeModel -from .MixedHeartMaynard4eWindkessel_parameters import MixedHeartMaynard4eWindkessel_parameters as MHM4W_parobj -from .ParametersObject import ParametersObject as po -from ..Components import Rlc_component, Valve_maynard, \ - HC_mixed_elastance, R_component, Valve_non_ideal, \ - HC_constant_elastance, Valve_simple_bernoulli - -FULL_NAMES =[ - 'LeftA', - 'MiValve', - 'LeftV', - 'AoV', - 'SysArtImp', - 'SysArt', - 'SysCap', - 'SysVen', - 'RightA', - 'TriValve', - 'RightV', - 'PulV', - 'PulArtImp', - 'PulArt', - 'PulCap', - 'PulVen', -] - -class MixedHeartMaynard4eWindkessel(OdeModel): - def __init__(self, time_setup_dict, parobj:po=MHM4W_parobj) -> None: - super().__init__(time_setup_dict) - self.name = 'MixedHeartMaynard4eWindkessel' - - print(parobj) - - # The components... - for key, name in zip(parobj.components.keys(), FULL_NAMES): - if key in parobj._vessels: - class_ = Rlc_component - elif key in parobj._imp or key in parobj._cap: - class_ = R_component - elif key in parobj._valves: - class_ = Valve_simple_bernoulli # Valve_non_ideal # Valve_maynard # Valve_simple_bernoulli - elif key in parobj._chambers: - class_ = HC_constant_elastance # HC_mixed_elastance HC_constant_elastance - else: - raise Exception(f'Component name {key} not in the model list.') - self.components[key] = class_(name=name, - time_object=self.time_object, - **parobj[key].to_dict()) - - if key not in parobj._valves + parobj._cap + parobj._imp: - self.set_v_sv(key) - # else: - # self.set_phi_sv(key) - self.components[key].setup() - - self.connect_modules(self.components['lv'], - self.components['ao'], - plabel='p_lv', - qlabel='q_ao', - ) - self.connect_modules(self.components['ao'], - self.components['sai'], - plabel='p_sa', - qlabel='q_ao') - self.connect_modules(self.components['sai'], - self.components['sa'], - plabel='pi_sa', - qlabel='q_ao', - qvariable=self.components['ao']._Q_o) - self.connect_modules(self.components['sa'], - self.components['sc'], - plabel='p_sc', - qlabel='q_sa') - self.connect_modules(self.components['sc'], - self.components['sv'], - plabel='p_sv', - qlabel='q_sa', - qvariable=self.components['sa']._Q_o) - self.connect_modules(self.components['sv'], - self.components['ra'], - plabel='p_ra', - qlabel='q_sv') - self.connect_modules(self.components['ra'], - self.components['ti'], - plabel='p_ra', - qlabel='q_ti') - self.connect_modules(self.components['ti'], - self.components['rv'], - plabel='p_rv', - qlabel='q_ti') - self.connect_modules(self.components['rv'], - self.components['po'], - plabel='p_rv', - qlabel='q_po') - self.connect_modules(self.components['po'], - self.components['pai'], - plabel='p_pa', - qlabel='q_po') - self.connect_modules(self.components['pai'], - self.components['pa'], - plabel='pi_pa', - qlabel='q_po', - qvariable=self.components['po']._Q_o) - self.connect_modules(self.components['pa'], - self.components['pc'], - plabel='p_pc', - qlabel='q_pa') - self.connect_modules(self.components['pc'], - self.components['pv'], - plabel='p_pv', - qlabel='q_pa', - qvariable=self.components['pa']._Q_o) - self.connect_modules(self.components['pv'], - self.components['la'], - plabel='p_la', - qlabel='q_pv') - self.connect_modules(self.components['la'], - self.components['mi'], - plabel='p_la', - qlabel='q_mi') - self.connect_modules(self.components['mi'], - self.components['lv'], - plabel='p_lv', - qlabel='q_mi') - for component in self.components.values(): - component.setup() - - def set_phi_sv(self, comp_key:str) -> None: - phi_key = 'phi_' + comp_key - self._state_variable_dict[phi_key] = self.components[comp_key]._PHI - self._state_variable_dict[phi_key].set_name(phi_key) - self.all_sv_data[phi_key] = self.components[comp_key].PHI diff --git a/src/ModularCirc/Models/MixedHeartMaynard4eWindkessel_parameters.py b/src/ModularCirc/Models/MixedHeartMaynard4eWindkessel_parameters.py deleted file mode 100644 index 6a5c0e5..0000000 --- a/src/ModularCirc/Models/MixedHeartMaynard4eWindkessel_parameters.py +++ /dev/null @@ -1,132 +0,0 @@ -from ..HelperRoutines import activation_function_2, activation_function_3, relu_max, softplus -from .ParametersObject import ParametersObject -import pandas as pd - - -MHM4WK_COMPONENTS = [ - 'la', # left atrium - 'mi', # mitral valve - 'lv', # left ventricle - 'ao', # aortic valve - 'sai', # systemic aortic impedance - 'sa', # systemic artery - 'sc', # systemic capilary bed - 'sv', # systemic vein - 'ra', # right atrium - 'ti', # tricuspid vale - 'rv', # right ventricle - 'po', # pulmonary valve - 'pai', # pulmonary artery impedance - 'pa', # pulmonary artery - 'pc', # pulmonary capilary - 'pv', # pulmonary vein - ] -VESSELS = ['sa', 'sv', 'pa', 'pv'] -VESSELS_PAR = ['r', 'c', 'l', 'v_ref', 'v', 'p'] - -VALVES = ['mi', 'ao', 'ti', 'po'] -# VALVES_PAR = ['CQ', 'RRA', 'Ko', 'Kc', 'R', 'L'] -# VALVES_PAR = ['r', 'max_func'] -VALVES_PAR = ['CQ', 'RRA'] - - -CHAMBERS = ['la', 'lv', 'ra', 'rv'] -CHAMBERS_PAR = ['E_pas', 'E_act', 'v_ref', 'k_pas', 'af', 'v', 'p', 'tr', 'td', 'delay', 'tpww', 'tpwb'] - -IMPEDANCES = ['sai', 'pai'] -IMPEDANCES_PAR = ['r'] - -CAPILARIES = ['sc', 'pc'] -CAPILARIES_PAR = ['r'] - -OBJ_PAR_PAIRS = [[VESSELS, VESSELS_PAR], - [VALVES, VALVES_PAR], - [CHAMBERS, CHAMBERS_PAR], - [IMPEDANCES, IMPEDANCES_PAR], - [CAPILARIES, CAPILARIES_PAR]] - -class MixedHeartMaynard4eWindkessel_parameters(ParametersObject): - """ - Intro - ----- - Model Parameters for MixedHeartMaynard4eWindkessel models - """ - def __init__(self, name='MixedHeartMaynard4eWindkessel_parameters') -> None: - super().__init__(name=name) - self.components = {key : None for key in MHM4WK_COMPONENTS} - for type_, type_var in OBJ_PAR_PAIRS: - for key in type_: - self[key] = pd.Series(index=type_var, dtype=object) - - self._vessels = VESSELS - self._valves = VALVES - self._chambers= CHAMBERS - self._imp = IMPEDANCES - self._cap = CAPILARIES - - self.set_chamber_comp('lv', E_pas= 0.1, E_act= 2.5, k_pas=0.03, v_ref=5.0, tr = 0.30, td = 0.450, v=50.) - self.set_chamber_comp('la', E_pas= 0.15, E_act= 0.25, k_pas=0.03, v_ref=4.0, tpwb = 0.0, tpww = 0.09, delay=0.08, v=0.0) - self.set_chamber_comp('rv', E_pas= 0.1, E_act= 1.15, k_pas=0.03, v_ref=10., tr =0.30, td=0.45, v=50.) - self.set_chamber_comp('ra', E_pas= 0.15, E_act= 0.25, k_pas=0.03, v_ref=4., tpwb=0.0, tpww=0.09, delay=0.08, v=0.0) - - self.set_activation_function('lv', af=activation_function_2) - self.set_activation_function('rv', af=activation_function_2) - - self.set_activation_function('la', af=activation_function_3) - self.set_activation_function('ra', af=activation_function_3) - - - # systemic circulation - self.set_rlc_comp('sa', r=0.05, c=1.6 , l=0.0017 , v=450.0, v_ref=0.0) - self.set_rlc_comp('sv', r=0.075, c=20.5, v=0.0, v_ref=0.0) - - # set impedances - self.set_resistance('sai', r = 0.003) - self.set_resistance('pai', r = 0.002) - - # pulmonary circulation - self.set_rlc_comp('pa', r=0.01, c=3.8 , l=0.0017 , v=250.0, v_ref=0.0) - self.set_rlc_comp('pv', r=0.006, c=20.5 , v=0.0, v_ref=0.0) - - # set capilary resistances - self.set_resistance('sc', r = 0.5 + 0.52) - self.set_resistance('pc', r = 0.05 + 0.25) - - # valves - ##################################################### - # self.set_valve_comp('ao', r=0.01, max_func=relu_max) - # self.set_valve_comp('mi', r=0.01, max_func=relu_max) - # self.set_valve_comp('po', r=0.01, max_func=relu_max) - # self.set_valve_comp('ti', r=0.01, max_func=relu_max) - ##################################################### - # self.set_valve_comp('ao', r=0.01, max_func=softplus) - # self.set_valve_comp('mi', r=0.01, max_func=softplus) - # self.set_valve_comp('po', r=0.01, max_func=softplus) - # self.set_valve_comp('ti', r=0.01, max_func=softplus) - ##################################################### - # self.set_valve_comp('ao', CQ=350., RRA=0.0, Ko = 26., Kc = 2e3, L=0.0, R=0.0) - # self.set_valve_comp('mi', CQ=400., RRA=0.0, Ko = 40., Kc = 2e3, L=0.0, R=0.0 ) - # self.set_valve_comp('po', CQ=350., RRA=0.0, Ko = 40., Kc = 18e3,L=0.0, R=0.0 ) - # self.set_valve_comp('ti', CQ=400., RRA=0.0, Ko = 40., Kc = 2e3, L=0.0, R=0.0 ) - ##################################################### - self.set_valve_comp('ao', CQ=350., RRA=0.0) - self.set_valve_comp('mi', CQ=400., RRA=0.0) - self.set_valve_comp('po', CQ=350., RRA=0.0) - self.set_valve_comp('ti', CQ=400., RRA=0.0) - ##################################################### - - - def set_chamber_comp(self, key, **kwargs): - self._set_comp(key=key, set=CHAMBERS, **kwargs) - - def set_activation_function(self, key, af): - self._set_comp(key, set=CHAMBERS, af=af) - - def set_rlc_comp(self, key, **kwargs): - self._set_comp(key=key, set=VESSELS, **kwargs) - - def set_valve_comp(self, key, **kwargs): - self._set_comp(key=key, set=VALVES, **kwargs) - - def set_resistance(self, key, **kwargs): - self._set_comp(key=key, set=IMPEDANCES + CAPILARIES, **kwargs)