From 8afa9bfcdece9d04bdcbf08a505405a157122c38 Mon Sep 17 00:00:00 2001 From: katduecker Date: Wed, 12 Jun 2024 16:26:22 -0400 Subject: [PATCH 01/21] record calcium concentration in L5pyr --- hnn_core/cell.py | 27 +++++++++++++++++++++++++-- hnn_core/cell_response.py | 18 +++++++++++++++++- hnn_core/dipole.py | 9 ++++++++- hnn_core/network_builder.py | 21 ++++++++++++++++++--- hnn_core/parallel_backends.py | 1 + hnn_core/params_default.py | 1 + hnn_core/tests/conftest.py | 5 ++++- hnn_core/tests/test_cell_response.py | 2 +- hnn_core/tests/test_dipole.py | 20 +++++++++++++++----- hnn_core/tests/test_extracellular.py | 4 ++-- 10 files changed, 92 insertions(+), 16 deletions(-) diff --git a/hnn_core/cell.py b/hnn_core/cell.py index 110034b82..373007e34 100644 --- a/hnn_core/cell.py +++ b/hnn_core/cell.py @@ -348,6 +348,11 @@ class Cell: by synapse type (keys can be soma_gabaa, soma_gabab etc.). Must be enabled by running simulate_dipole(net, record_isec=True) or simulate_dipole(net, record_isoma=True) + ca : dict + Contains recording of section speicifc calcium concentration. + Must be enabled by running simulate_dipole(...) with record_ca + set to 'all' to record form all sections, or 'soma' to record from + the soma only. tonic_biases : list of h.IClamp The current clamps inserted at each section of the cell for tonic biasing inputs. @@ -391,6 +396,7 @@ def __init__(self, name, pos, sections, synapses, sect_loc, cell_tree, self.dipole_pp = list() self.vsec = dict() self.isec = dict() + self.ca = dict() # insert iclamp self.list_IClamp = list() self._gid = None @@ -468,6 +474,7 @@ def to_dict(self): cell_data['dipole_pp'] = self.dipole_pp cell_data['vsec'] = self.vsec cell_data['isec'] = self.isec + cell_data['ca'] = self.ca cell_data['tonic_biases'] = self.tonic_biases return cell_data @@ -743,7 +750,7 @@ def create_tonic_bias(self, amplitude, t0, tstop, loc=0.5): stim.amp = amplitude self.tonic_biases.append(stim) - def record(self, record_vsec=False, record_isec=False): + def record(self, record_vsec=False, record_isec=False, record_ca=False): """ Record current and voltage from all sections Parameters @@ -754,6 +761,9 @@ def record(self, record_vsec=False, record_isec=False): record_isec : 'all' | 'soma' | False Option to record voltages from all sections ('all'), or just the soma ('soma'). Default: False. + record_ca : 'all' | 'soma' | False + Option to record calcium concentration from all sections ('all'), + or just the soma ('soma'). Default: False. """ section_names = list(self.sections.keys()) @@ -783,9 +793,22 @@ def record(self, record_vsec=False, record_isec=False): for syn_name in self.isec[sec_name]: self.isec[sec_name][syn_name] = h.Vector() - self.isec[sec_name][syn_name].record( self._nrn_synapses[syn_name]._ref_i) + + # calcium concentration + if record_ca == 'soma': + self.ca = dict.fromkeys(['soma']) + elif record_ca == 'all': + self.ca = dict.fromkeys(section_names) + + if record_ca: + for sec_name in self.ca: + if 'ca' in self.sections[sec_name].mechs: + self.ca[sec_name] = h.Vector() + self.ca[sec_name].record( + self._nrn_sections[sec_name](0.5)._ref_cai) # there may be an issue here with referencing mod file + def syn_create(self, secloc, e, tau1, tau2): """Create an h.Exp2Syn synapse. diff --git a/hnn_core/cell_response.py b/hnn_core/cell_response.py index c0a301e8a..54301e4c3 100644 --- a/hnn_core/cell_response.py +++ b/hnn_core/cell_response.py @@ -56,6 +56,10 @@ class CellResponse(object): isec : list (n_trials,) of dict, shape Each element of the outer list is a trial. Dictionary indexed by gids containing currents for cell sections. + ca : list (n_trials,) of dict, shape + Each element of the outer list is a trial. + Dictionary indexed by gids containing calcium concentration + for cell sections. times : array-like, shape (n_times,) Array of time points for samples in continuous data. This includes vsoma and isoma. @@ -115,6 +119,7 @@ def __init__(self, spike_times=None, spike_gids=None, spike_types=None, self._spike_types = spike_types self._vsec = list() self._isec = list() + self._ca = list() if times is not None: if not isinstance(times, (list, np.ndarray)): raise TypeError("'times' is an np.ndarray of simulation times") @@ -138,7 +143,8 @@ def __eq__(self, other): self._spike_gids == other._spike_gids and self._spike_types == other._spike_types and self.vsec == other.vsec and - self.isec == other.isec) + self.isec == other.isec and + self.ca == other.ca) def __getitem__(self, gid_item): """Returns a CellResponse object with a copied subset filtered by gid. @@ -227,6 +233,10 @@ def vsec(self): @property def isec(self): return self._isec + + @property + def ca(self): + return self._ca @property def times(self): @@ -427,6 +437,12 @@ def to_dict(self): # Turn `int` gid keys into string values for hdf5 format trial = dict((str(key), val) for key, val in trial.items()) cell_response_data['isec'].append(trial) + ca_data = self.ca + cell_response_data['ca'] = list() + for trial in ca_data: + # Turn `int` gid keys into string values for hdf5 format + trial = dict((str(key), val) for key, val in trial.items()) + cell_response_data['ca'].append(trial) cell_response_data['times'] = self.times return cell_response_data diff --git a/hnn_core/dipole.py b/hnn_core/dipole.py index c3b553094..1cbd268dd 100644 --- a/hnn_core/dipole.py +++ b/hnn_core/dipole.py @@ -16,7 +16,7 @@ def simulate_dipole(net, tstop, dt=0.025, n_trials=None, record_vsec=False, - record_isec=False, postproc=False): + record_isec=False, record_ca=False, postproc=False): """Simulate a dipole given the experiment parameters. Parameters @@ -37,6 +37,9 @@ def simulate_dipole(net, tstop, dt=0.025, n_trials=None, record_vsec=False, record_isec : 'all' | 'soma' | False Option to record voltages from all sections ('all'), or just the soma ('soma'). Default: False. + record_ca : 'all' | 'soma' | False + Option to record calcium concentration from all sections ('all'), + or just the soma ('soma'). Default: False. postproc : bool If True, smoothing (``dipole_smooth_win``) and scaling (``dipole_scalefctr``) values are read from the parameter file, and @@ -96,6 +99,10 @@ def simulate_dipole(net, tstop, dt=0.025, n_trials=None, record_vsec=False, net._params['record_isec'] = record_isec + _check_option('record_ca', record_ca, ['all', 'soma', False]) + + net._params['record_ca'] = record_ca + if postproc: warnings.warn('The postproc-argument is deprecated and will be removed' ' in a future release of hnn-core. Please define ' diff --git a/hnn_core/network_builder.py b/hnn_core/network_builder.py index 354e4b6e9..48a3c2da6 100644 --- a/hnn_core/network_builder.py +++ b/hnn_core/network_builder.py @@ -99,6 +99,13 @@ def simulation_time(): for sec_name, isec in isec_dict.items(): isec_py[gid][sec_name] = { key: isec.to_python() for key, isec in isec.items()} + + ca_py = dict() + for gid, ca_dict in neuron_net._ca.items(): + ca_py[gid] = dict() + for sec_name, ca in ca_dict.items(): + if ca is not None: + ca_py[gid][sec_name] = ca.to_python() dpl_data = np.c_[ neuron_net._nrn_dipoles['L2_pyramidal'].as_numpy() + @@ -119,6 +126,7 @@ def simulation_time(): 'gid_ranges': net.gid_ranges, 'vsec': vsec_py, 'isec': isec_py, + 'ca': ca_py, 'rec_data': rec_arr_py, 'rec_times': rec_times_py, 'times': times.to_python()} @@ -291,6 +299,7 @@ def __init__(self, net, trial_idx=0): self._vsec = dict() self._isec = dict() + self._ca = dict() self._nrn_rec_arrays = dict() self._nrn_rec_callbacks = list() @@ -327,9 +336,11 @@ def _build(self): record_vsec = self.net._params['record_vsec'] record_isec = self.net._params['record_isec'] + record_ca = self.net._params['record_ca'] self._create_cells_and_drives(threshold=self.net._params['threshold'], record_vsec=record_vsec, - record_isec=record_isec) + record_isec=record_isec, + record_ca=record_ca) self.state_init() @@ -399,7 +410,7 @@ def _gid_assign(self, rank=None, n_hosts=None): self._gid_list.sort() def _create_cells_and_drives(self, threshold, record_vsec=False, - record_isec=False): + record_isec=False, record_ca=False): """Parallel create cells AND external drives NB: _Cell.__init__ calls h.Section -> non-picklable! @@ -434,7 +445,7 @@ def _create_cells_and_drives(self, threshold, record_vsec=False, src_type in self.net.external_biases['tonic']): cell.create_tonic_bias(**self.net.external_biases ['tonic'][src_type]) - cell.record(record_vsec, record_isec) + cell.record(record_vsec, record_isec, record_ca) # this call could belong in init of a _Cell (with threshold)? nrn_netcon = cell.setup_source_netcon(threshold) @@ -564,6 +575,7 @@ def aggregate_data(self, n_samples): self._vsec[cell.gid] = cell.vsec self._isec[cell.gid] = cell.isec + self._ca[cell.gid] = cell.ca # reduce across threads for nrn_dpl in self._nrn_dipoles.values(): @@ -574,6 +586,7 @@ def aggregate_data(self, n_samples): # aggregate the currents and voltages independently on each proc vsec_list = _PC.py_gather(self._vsec, 0) isec_list = _PC.py_gather(self._isec, 0) + ca_list = _PC.py_gather(self._ca, 0) # combine spiking data from each proc spike_times_list = _PC.py_gather(self._spike_times, 0) @@ -589,6 +602,8 @@ def aggregate_data(self, n_samples): self._vsec.update(vsec) for isec in isec_list: self._isec.update(isec) + for ca in ca_list: + self._ca.update(ca) _PC.barrier() # get all nodes to this place before continuing diff --git a/hnn_core/parallel_backends.py b/hnn_core/parallel_backends.py index b8438430a..078deb9fb 100644 --- a/hnn_core/parallel_backends.py +++ b/hnn_core/parallel_backends.py @@ -53,6 +53,7 @@ def _gather_trial_data(sim_data, net, n_trials, postproc): net.cell_response.update_types(net.gid_ranges) net.cell_response._vsec.append(sim_data[idx]['vsec']) net.cell_response._isec.append(sim_data[idx]['isec']) + net.cell_response._ca.append(sim_data[idx]['ca']) # extracellular array for arr_name, arr in net.rec_arrays.items(): diff --git a/hnn_core/params_default.py b/hnn_core/params_default.py index 502f92f4c..465149ba2 100644 --- a/hnn_core/params_default.py +++ b/hnn_core/params_default.py @@ -149,6 +149,7 @@ def get_params_default(nprox=2, ndist=1): 'record_isoma': 0, # whether to record somatic currents 'record_vsec': 0, # whether to record voltages 'record_isec': 0, # whether to record currents + 'record_ca': 0, # whether to record calcium concentration # numerics # N_trials of 1 means that seed is set by rank diff --git a/hnn_core/tests/conftest.py b/hnn_core/tests/conftest.py index 6288439fc..e63094e53 100644 --- a/hnn_core/tests/conftest.py +++ b/hnn_core/tests/conftest.py @@ -75,7 +75,7 @@ def pytest_runtest_setup(item): def run_hnn_core_fixture(): def _run_hnn_core_fixture(backend=None, n_procs=None, n_jobs=1, reduced=False, record_vsec=False, - record_isec=False, postproc=False, + record_isec=False, record_ca=False, postproc=False, electrode_array=None): hnn_core_root = op.dirname(hnn_core.__file__) @@ -106,15 +106,18 @@ def _run_hnn_core_fixture(backend=None, n_procs=None, n_jobs=1, with MPIBackend(n_procs=n_procs, mpi_cmd='mpiexec'): dpls = simulate_dipole(net, record_vsec=record_vsec, record_isec=record_isec, + record_ca=record_ca, postproc=postproc, tstop=tstop) elif backend == 'joblib': with JoblibBackend(n_jobs=n_jobs): dpls = simulate_dipole(net, record_vsec=record_vsec, record_isec=record_isec, + record_ca=record_ca, postproc=postproc, tstop=tstop) else: dpls = simulate_dipole(net, record_vsec=record_vsec, record_isec=record_isec, + record_ca=record_ca, postproc=postproc, tstop=tstop) # check that the network object is picklable after the simulation diff --git a/hnn_core/tests/test_cell_response.py b/hnn_core/tests/test_cell_response.py index 06730dccd..7ab4ede2b 100644 --- a/hnn_core/tests/test_cell_response.py +++ b/hnn_core/tests/test_cell_response.py @@ -47,7 +47,7 @@ def test_cell_response(tmp_path): # reset clears all recorded variables, but leaves simulation time intact assert len(cell_response.times) == len(sim_times) sim_attributes = ['_spike_times', '_spike_gids', '_spike_types', - '_vsec', '_isec'] + '_vsec', '_isec', '_ca'] net_attributes = ['_times', '_cell_type_names'] # `Network.__init__` # creates these check that we always know which response attributes are # simulated see #291 for discussion; objective is to keep cell_response diff --git a/hnn_core/tests/test_dipole.py b/hnn_core/tests/test_dipole.py index a753608e5..39ac74cb1 100644 --- a/hnn_core/tests/test_dipole.py +++ b/hnn_core/tests/test_dipole.py @@ -151,13 +151,13 @@ def test_dipole(tmp_path, run_hnn_core_fixture): # XXX all below to be deprecated in 0.3 dpls_raw, net = run_hnn_core_fixture(backend='joblib', n_jobs=1, reduced=True, record_isec='soma', - record_vsec='soma') + record_vsec='soma', record_ca='soma') # test deprecation of postproc with pytest.warns(DeprecationWarning, match='The postproc-argument is deprecated'): dpls, _ = run_hnn_core_fixture(backend='joblib', n_jobs=1, reduced=True, record_isec='soma', - record_vsec='soma', postproc=True) + record_vsec='soma', record_ca='soma', postproc=True) with pytest.raises(AssertionError): assert_allclose(dpls[0].data['agg'], dpls_raw[0].data['agg']) @@ -186,6 +186,9 @@ def test_dipole_simulation(): with pytest.raises(ValueError, match="Invalid value for the"): simulate_dipole(net, tstop=25., n_trials=1, record_vsec=False, record_isec='abc') + with pytest.raises(ValueError, match="Invalid value for the"): + simulate_dipole(net, tstop=25., n_trials=1, record_vsec=False, + record_isec=False, record_ca='abc') # test Network.copy() returns 'bare' network after simulating dpl = simulate_dipole(net, tstop=25., n_trials=1)[0] @@ -214,31 +217,38 @@ def test_cell_response_backends(run_hnn_core_fixture): trial_idx, n_trials, gid = 0, 2, 7 _, joblib_net = run_hnn_core_fixture(backend='joblib', n_jobs=1, reduced=True, record_vsec='all', - record_isec='soma') + record_isec='soma', record_ca='soma') _, mpi_net = run_hnn_core_fixture(backend='mpi', n_procs=2, reduced=True, - record_vsec='all', record_isec='soma') + record_vsec='all', record_isec='soma', record_ca='soma') n_times = len(joblib_net.cell_response.times) assert len(joblib_net.cell_response.vsec) == n_trials assert len(joblib_net.cell_response.isec) == n_trials + assert len(joblib_net.cell_response.ca) == n_trials assert len(joblib_net.cell_response.vsec[trial_idx][gid]) == 8 # num sec assert len(joblib_net.cell_response.isec[trial_idx][gid]) == 1 + assert len(joblib_net.cell_response.ca[trial_idx][gid]) == 1 assert len(joblib_net.cell_response.vsec[ trial_idx][gid]['apical_1']) == n_times assert len(joblib_net.cell_response.isec[ trial_idx][gid]['soma']['soma_gabaa']) == n_times + assert len(joblib_net.cell_response.ca[ + trial_idx][gid]['soma']) == n_times assert len(mpi_net.cell_response.vsec) == n_trials assert len(mpi_net.cell_response.isec) == n_trials assert len(mpi_net.cell_response.vsec[trial_idx][gid]) == 8 # num sec assert len(mpi_net.cell_response.isec[trial_idx][gid]) == 1 + assert len(mpi_net.cell_response.ca[trial_idx][gid]) == 1 assert len(mpi_net.cell_response.vsec[ trial_idx][gid]['apical_1']) == n_times assert len(mpi_net.cell_response.isec[ trial_idx][gid]['soma']['soma_gabaa']) == n_times + assert len(mpi_net.cell_response.ca[ + trial_idx][gid]['apical_1']) == n_times assert mpi_net.cell_response.vsec == joblib_net.cell_response.vsec assert mpi_net.cell_response.isec == joblib_net.cell_response.isec - + assert mpi_net.cell_response.ca == joblib_net.cell_response.ca # Test if spike time falls within depolarization window above v_thresh v_thresh = 0.0 times = np.array(joblib_net.cell_response.times) diff --git a/hnn_core/tests/test_extracellular.py b/hnn_core/tests/test_extracellular.py index 6414644c6..d40cf9eba 100644 --- a/hnn_core/tests/test_extracellular.py +++ b/hnn_core/tests/test_extracellular.py @@ -177,10 +177,10 @@ def test_extracellular_backends(run_hnn_core_fixture): (2, 2, 1000)]} _, joblib_net = run_hnn_core_fixture( backend='joblib', n_jobs=1, reduced=True, record_isec='soma', - record_vsec='soma', electrode_array=electrode_array) + record_vsec='soma', record_ca='soma', electrode_array=electrode_array) _, mpi_net = run_hnn_core_fixture( backend='mpi', n_procs=2, reduced=True, record_isec='soma', - record_vsec='soma', electrode_array=electrode_array) + record_vsec='soma', record_ca='soma', electrode_array=electrode_array) assert (len(electrode_array['arr1']) == len(joblib_net.rec_arrays['arr1'].positions) == From 0f43427dde113ec9ff657a7d375d926518bd3745 Mon Sep 17 00:00:00 2001 From: katduecker Date: Wed, 12 Jun 2024 16:49:11 -0400 Subject: [PATCH 02/21] fixed unit tests calcium L5 --- hnn_core/tests/test_dipole.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/hnn_core/tests/test_dipole.py b/hnn_core/tests/test_dipole.py index 39ac74cb1..fc7a6b872 100644 --- a/hnn_core/tests/test_dipole.py +++ b/hnn_core/tests/test_dipole.py @@ -227,28 +227,32 @@ def test_cell_response_backends(run_hnn_core_fixture): assert len(joblib_net.cell_response.ca) == n_trials assert len(joblib_net.cell_response.vsec[trial_idx][gid]) == 8 # num sec assert len(joblib_net.cell_response.isec[trial_idx][gid]) == 1 - assert len(joblib_net.cell_response.ca[trial_idx][gid]) == 1 assert len(joblib_net.cell_response.vsec[ trial_idx][gid]['apical_1']) == n_times assert len(joblib_net.cell_response.isec[ trial_idx][gid]['soma']['soma_gabaa']) == n_times - assert len(joblib_net.cell_response.ca[ - trial_idx][gid]['soma']) == n_times - assert len(mpi_net.cell_response.vsec) == n_trials assert len(mpi_net.cell_response.isec) == n_trials assert len(mpi_net.cell_response.vsec[trial_idx][gid]) == 8 # num sec - assert len(mpi_net.cell_response.isec[trial_idx][gid]) == 1 - assert len(mpi_net.cell_response.ca[trial_idx][gid]) == 1 + assert len(mpi_net.cell_response.isec[trial_idx][gid]) == 1 assert len(mpi_net.cell_response.vsec[ trial_idx][gid]['apical_1']) == n_times assert len(mpi_net.cell_response.isec[ trial_idx][gid]['soma']['soma_gabaa']) == n_times - assert len(mpi_net.cell_response.ca[ - trial_idx][gid]['apical_1']) == n_times assert mpi_net.cell_response.vsec == joblib_net.cell_response.vsec assert mpi_net.cell_response.isec == joblib_net.cell_response.isec assert mpi_net.cell_response.ca == joblib_net.cell_response.ca + + # test if calcium concentration is stored correctly (only L5 pyramidal) + gid = joblib_net.gid_ranges['L5_pyramidal'][0] + assert len(joblib_net.cell_response.ca[trial_idx][gid]) == 1 + assert len(joblib_net.cell_response.ca[ + trial_idx][gid]['soma']) == n_times + gid = mpi_net.gid_ranges['L5_pyramidal'][0] + assert len(mpi_net.cell_response.ca[trial_idx][gid]) == 1 + assert len(mpi_net.cell_response.ca[ + trial_idx][gid]['soma']) == n_times + # Test if spike time falls within depolarization window above v_thresh v_thresh = 0.0 times = np.array(joblib_net.cell_response.times) From 0d73976ec9465e048b1a40cb5d20253b6ba33b5b Mon Sep 17 00:00:00 2001 From: katduecker Date: Thu, 13 Jun 2024 08:40:09 -0400 Subject: [PATCH 03/21] fix pep8 --- hnn_core/cell.py | 2 +- hnn_core/tests/test_dipole.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hnn_core/cell.py b/hnn_core/cell.py index 373007e34..3885ef036 100644 --- a/hnn_core/cell.py +++ b/hnn_core/cell.py @@ -807,7 +807,7 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): if 'ca' in self.sections[sec_name].mechs: self.ca[sec_name] = h.Vector() self.ca[sec_name].record( - self._nrn_sections[sec_name](0.5)._ref_cai) # there may be an issue here with referencing mod file + self._nrn_sections[sec_name](0.5)._ref_cai) def syn_create(self, secloc, e, tau1, tau2): diff --git a/hnn_core/tests/test_dipole.py b/hnn_core/tests/test_dipole.py index fc7a6b872..699a3e8c7 100644 --- a/hnn_core/tests/test_dipole.py +++ b/hnn_core/tests/test_dipole.py @@ -234,7 +234,7 @@ def test_cell_response_backends(run_hnn_core_fixture): assert len(mpi_net.cell_response.vsec) == n_trials assert len(mpi_net.cell_response.isec) == n_trials assert len(mpi_net.cell_response.vsec[trial_idx][gid]) == 8 # num sec - assert len(mpi_net.cell_response.isec[trial_idx][gid]) == 1 + assert len(mpi_net.cell_response.isec[trial_idx][gid]) == 1 assert len(mpi_net.cell_response.vsec[ trial_idx][gid]['apical_1']) == n_times assert len(mpi_net.cell_response.isec[ From 8c6b1da4f8669094d4a5154797621a23d5b24a4a Mon Sep 17 00:00:00 2001 From: katduecker Date: Tue, 25 Jun 2024 12:22:03 -0400 Subject: [PATCH 04/21] update parameters --- hnn_core/cell.py | 4 ++-- hnn_core/dipole.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hnn_core/cell.py b/hnn_core/cell.py index 3885ef036..d1176269c 100644 --- a/hnn_core/cell.py +++ b/hnn_core/cell.py @@ -350,7 +350,7 @@ class Cell: or simulate_dipole(net, record_isoma=True) ca : dict Contains recording of section speicifc calcium concentration. - Must be enabled by running simulate_dipole(...) with record_ca + Must be enabled by running simulate_dipole(net, record_ca) with record_ca set to 'all' to record form all sections, or 'soma' to record from the soma only. tonic_biases : list of h.IClamp @@ -804,7 +804,7 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): if record_ca: for sec_name in self.ca: - if 'ca' in self.sections[sec_name].mechs: + if hasattr(self._nrn_sections[sec_name](0.5), '_ref_cai'): self.ca[sec_name] = h.Vector() self.ca[sec_name].record( self._nrn_sections[sec_name](0.5)._ref_cai) diff --git a/hnn_core/dipole.py b/hnn_core/dipole.py index 1cbd268dd..c9ba55b0f 100644 --- a/hnn_core/dipole.py +++ b/hnn_core/dipole.py @@ -35,7 +35,7 @@ def simulate_dipole(net, tstop, dt=0.025, n_trials=None, record_vsec=False, Option to record voltages from all sections ('all'), or just the soma ('soma'). Default: False. record_isec : 'all' | 'soma' | False - Option to record voltages from all sections ('all'), or just + Option to record synaptic currents from all sections ('all'), or just the soma ('soma'). Default: False. record_ca : 'all' | 'soma' | False Option to record calcium concentration from all sections ('all'), From 6a0400a2aace902e337668a0629ef36856991e0d Mon Sep 17 00:00:00 2001 From: katduecker Date: Tue, 25 Jun 2024 12:26:56 -0400 Subject: [PATCH 05/21] update whats_new --- doc/whats_new.rst | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/doc/whats_new.rst b/doc/whats_new.rst index efe2486c5..25addee7d 100644 --- a/doc/whats_new.rst +++ b/doc/whats_new.rst @@ -200,7 +200,7 @@ API :meth:`~hnn_core.extracellular.ExtracellularArray.plot_lfp`, by `Steven Brandt`_ and `Ryan Thorpe`_ in :gh:`517`. -- Recorded voltages/currents from the soma, as well all sections, are enabled by +- Recorded voltages/currents from the soma, as well as all sections, are enabled by setting either `record_vsec` or `record_isec` to `'all'` or `'soma'` in :func:`~hnn_core.simulate_dipole`. Recordings are now accessed through :class:`~hnn_core.CellResponse.vsec` and :class:`~hnn_core.CellResponse.isec`, @@ -210,6 +210,11 @@ API :class:`~hnn_core.Network` objects, by `Nick Tolley`_ and `Ryan Thorpe`_ in :gh:`619`. +- Recorded calcium conncetration from the soma, as well as all sections, are enabled + by setting `record_ca` to `soma` or `all` in :func:`~hnn_core.simulate_dipole`. + Recordings are accessed through :class:`~hnn_core.CellResponse.ca`, + by `Katharina Duecker`_ in :gh:`792` + People who contributed to this release (in alphabetical order): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 16cda2a1788b4359132125b089d701b5b7456c0e Mon Sep 17 00:00:00 2001 From: katduecker Date: Tue, 25 Jun 2024 12:29:09 -0400 Subject: [PATCH 06/21] flake8 fix --- hnn_core/cell.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/hnn_core/cell.py b/hnn_core/cell.py index d1176269c..bc3aaa8c1 100644 --- a/hnn_core/cell.py +++ b/hnn_core/cell.py @@ -349,10 +349,8 @@ class Cell: Must be enabled by running simulate_dipole(net, record_isec=True) or simulate_dipole(net, record_isoma=True) ca : dict - Contains recording of section speicifc calcium concentration. - Must be enabled by running simulate_dipole(net, record_ca) with record_ca - set to 'all' to record form all sections, or 'soma' to record from - the soma only. + Contains recording of section speicifc calcium concentration. + Must be enabled by running simulate_dipole(net, record_ca=True). tonic_biases : list of h.IClamp The current clamps inserted at each section of the cell for tonic biasing inputs. From b6cda6c970bb833efee6f64cef60f4168188e76c Mon Sep 17 00:00:00 2001 From: katduecker Date: Tue, 25 Jun 2024 12:32:28 -0400 Subject: [PATCH 07/21] flake8 fix --- hnn_core/cell.py | 9 ++++----- hnn_core/cell_response.py | 2 +- hnn_core/dipole.py | 2 +- hnn_core/network_builder.py | 4 ++-- hnn_core/tests/conftest.py | 4 ++-- hnn_core/tests/test_dipole.py | 6 ++++-- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/hnn_core/cell.py b/hnn_core/cell.py index bc3aaa8c1..6179b793b 100644 --- a/hnn_core/cell.py +++ b/hnn_core/cell.py @@ -760,7 +760,7 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): Option to record voltages from all sections ('all'), or just the soma ('soma'). Default: False. record_ca : 'all' | 'soma' | False - Option to record calcium concentration from all sections ('all'), + Option to record calcium concentration from all sections ('all'), or just the soma ('soma'). Default: False. """ @@ -793,21 +793,20 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): self.isec[sec_name][syn_name] = h.Vector() self.isec[sec_name][syn_name].record( self._nrn_synapses[syn_name]._ref_i) - + # calcium concentration if record_ca == 'soma': self.ca = dict.fromkeys(['soma']) elif record_ca == 'all': self.ca = dict.fromkeys(section_names) - if record_ca: + if record_ca: for sec_name in self.ca: if hasattr(self._nrn_sections[sec_name](0.5), '_ref_cai'): self.ca[sec_name] = h.Vector() self.ca[sec_name].record( self._nrn_sections[sec_name](0.5)._ref_cai) - - + def syn_create(self, secloc, e, tau1, tau2): """Create an h.Exp2Syn synapse. diff --git a/hnn_core/cell_response.py b/hnn_core/cell_response.py index 54301e4c3..75530b4fe 100644 --- a/hnn_core/cell_response.py +++ b/hnn_core/cell_response.py @@ -233,7 +233,7 @@ def vsec(self): @property def isec(self): return self._isec - + @property def ca(self): return self._ca diff --git a/hnn_core/dipole.py b/hnn_core/dipole.py index c9ba55b0f..789a91800 100644 --- a/hnn_core/dipole.py +++ b/hnn_core/dipole.py @@ -38,7 +38,7 @@ def simulate_dipole(net, tstop, dt=0.025, n_trials=None, record_vsec=False, Option to record synaptic currents from all sections ('all'), or just the soma ('soma'). Default: False. record_ca : 'all' | 'soma' | False - Option to record calcium concentration from all sections ('all'), + Option to record calcium concentration from all sections ('all'), or just the soma ('soma'). Default: False. postproc : bool If True, smoothing (``dipole_smooth_win``) and scaling diff --git a/hnn_core/network_builder.py b/hnn_core/network_builder.py index 48a3c2da6..98f7ba1b8 100644 --- a/hnn_core/network_builder.py +++ b/hnn_core/network_builder.py @@ -99,13 +99,13 @@ def simulation_time(): for sec_name, isec in isec_dict.items(): isec_py[gid][sec_name] = { key: isec.to_python() for key, isec in isec.items()} - + ca_py = dict() for gid, ca_dict in neuron_net._ca.items(): ca_py[gid] = dict() for sec_name, ca in ca_dict.items(): if ca is not None: - ca_py[gid][sec_name] = ca.to_python() + ca_py[gid][sec_name] = ca.to_python() dpl_data = np.c_[ neuron_net._nrn_dipoles['L2_pyramidal'].as_numpy() + diff --git a/hnn_core/tests/conftest.py b/hnn_core/tests/conftest.py index e63094e53..275fc4885 100644 --- a/hnn_core/tests/conftest.py +++ b/hnn_core/tests/conftest.py @@ -75,8 +75,8 @@ def pytest_runtest_setup(item): def run_hnn_core_fixture(): def _run_hnn_core_fixture(backend=None, n_procs=None, n_jobs=1, reduced=False, record_vsec=False, - record_isec=False, record_ca=False, postproc=False, - electrode_array=None): + record_isec=False, record_ca=False, + postproc=False, electrode_array=None): hnn_core_root = op.dirname(hnn_core.__file__) # default params diff --git a/hnn_core/tests/test_dipole.py b/hnn_core/tests/test_dipole.py index 699a3e8c7..c94d8b1ec 100644 --- a/hnn_core/tests/test_dipole.py +++ b/hnn_core/tests/test_dipole.py @@ -157,7 +157,8 @@ def test_dipole(tmp_path, run_hnn_core_fixture): match='The postproc-argument is deprecated'): dpls, _ = run_hnn_core_fixture(backend='joblib', n_jobs=1, reduced=True, record_isec='soma', - record_vsec='soma', record_ca='soma', postproc=True) + record_vsec='soma', record_ca='soma', + postproc=True) with pytest.raises(AssertionError): assert_allclose(dpls[0].data['agg'], dpls_raw[0].data['agg']) @@ -219,7 +220,8 @@ def test_cell_response_backends(run_hnn_core_fixture): reduced=True, record_vsec='all', record_isec='soma', record_ca='soma') _, mpi_net = run_hnn_core_fixture(backend='mpi', n_procs=2, reduced=True, - record_vsec='all', record_isec='soma', record_ca='soma') + record_vsec='all', record_isec='soma', + record_ca='soma') n_times = len(joblib_net.cell_response.times) assert len(joblib_net.cell_response.vsec) == n_trials From de1cd95570b54906277048cac93dae0a2628c7bf Mon Sep 17 00:00:00 2001 From: katduecker Date: Tue, 25 Jun 2024 12:59:18 -0400 Subject: [PATCH 08/21] flake8 fix --- hnn_core/cell.py | 4 ++-- hnn_core/tests/conftest.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hnn_core/cell.py b/hnn_core/cell.py index 6179b793b..7e533f087 100644 --- a/hnn_core/cell.py +++ b/hnn_core/cell.py @@ -800,13 +800,13 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): elif record_ca == 'all': self.ca = dict.fromkeys(section_names) - if record_ca: + if record_ca: for sec_name in self.ca: if hasattr(self._nrn_sections[sec_name](0.5), '_ref_cai'): self.ca[sec_name] = h.Vector() self.ca[sec_name].record( self._nrn_sections[sec_name](0.5)._ref_cai) - + def syn_create(self, secloc, e, tau1, tau2): """Create an h.Exp2Syn synapse. diff --git a/hnn_core/tests/conftest.py b/hnn_core/tests/conftest.py index 275fc4885..c2560c341 100644 --- a/hnn_core/tests/conftest.py +++ b/hnn_core/tests/conftest.py @@ -75,7 +75,7 @@ def pytest_runtest_setup(item): def run_hnn_core_fixture(): def _run_hnn_core_fixture(backend=None, n_procs=None, n_jobs=1, reduced=False, record_vsec=False, - record_isec=False, record_ca=False, + record_isec=False, record_ca=False, postproc=False, electrode_array=None): hnn_core_root = op.dirname(hnn_core.__file__) From 14032967578a00dd1c74b9ff977028e899415737 Mon Sep 17 00:00:00 2001 From: katduecker Date: Fri, 28 Jun 2024 15:37:57 -0400 Subject: [PATCH 09/21] rebase --- hnn_core/cell.py | 18 ++++++++++++++++++ hnn_core/cell_response.py | 4 ++++ hnn_core/network_builder.py | 7 +++++++ hnn_core/tests/conftest.py | 1 + hnn_core/tests/test_dipole.py | 7 +++++++ 5 files changed, 37 insertions(+) diff --git a/hnn_core/cell.py b/hnn_core/cell.py index 7e533f087..8efddd600 100644 --- a/hnn_core/cell.py +++ b/hnn_core/cell.py @@ -760,7 +760,11 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): Option to record voltages from all sections ('all'), or just the soma ('soma'). Default: False. record_ca : 'all' | 'soma' | False +<<<<<<< HEAD Option to record calcium concentration from all sections ('all'), +======= + Option to record calcium concentration from all sections ('all'), +>>>>>>> d3105f90 (record calcium concentration in L5pyr) or just the soma ('soma'). Default: False. """ @@ -793,6 +797,20 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): self.isec[sec_name][syn_name] = h.Vector() self.isec[sec_name][syn_name].record( self._nrn_synapses[syn_name]._ref_i) + + # calcium concentration + if record_ca == 'soma': + self.ca = dict.fromkeys(['soma']) + elif record_ca == 'all': + self.ca = dict.fromkeys(section_names) + + if record_ca: + for sec_name in self.ca: + if 'ca' in self.sections[sec_name].mechs: + self.ca[sec_name] = h.Vector() + self.ca[sec_name].record( + self._nrn_sections[sec_name](0.5)._ref_cai) # there may be an issue here with referencing mod file + # calcium concentration if record_ca == 'soma': diff --git a/hnn_core/cell_response.py b/hnn_core/cell_response.py index 75530b4fe..9ce0b1b80 100644 --- a/hnn_core/cell_response.py +++ b/hnn_core/cell_response.py @@ -233,6 +233,10 @@ def vsec(self): @property def isec(self): return self._isec + + @property + def ca(self): + return self._ca @property def ca(self): diff --git a/hnn_core/network_builder.py b/hnn_core/network_builder.py index 98f7ba1b8..722ff905f 100644 --- a/hnn_core/network_builder.py +++ b/hnn_core/network_builder.py @@ -99,6 +99,13 @@ def simulation_time(): for sec_name, isec in isec_dict.items(): isec_py[gid][sec_name] = { key: isec.to_python() for key, isec in isec.items()} + + ca_py = dict() + for gid, ca_dict in neuron_net._ca.items(): + ca_py[gid] = dict() + for sec_name, ca in ca_dict.items(): + if ca is not None: + ca_py[gid][sec_name] = ca.to_python() ca_py = dict() for gid, ca_dict in neuron_net._ca.items(): diff --git a/hnn_core/tests/conftest.py b/hnn_core/tests/conftest.py index c2560c341..95ea834fd 100644 --- a/hnn_core/tests/conftest.py +++ b/hnn_core/tests/conftest.py @@ -77,6 +77,7 @@ def _run_hnn_core_fixture(backend=None, n_procs=None, n_jobs=1, reduced=False, record_vsec=False, record_isec=False, record_ca=False, postproc=False, electrode_array=None): + hnn_core_root = op.dirname(hnn_core.__file__) # default params diff --git a/hnn_core/tests/test_dipole.py b/hnn_core/tests/test_dipole.py index c94d8b1ec..6836615ba 100644 --- a/hnn_core/tests/test_dipole.py +++ b/hnn_core/tests/test_dipole.py @@ -229,18 +229,25 @@ def test_cell_response_backends(run_hnn_core_fixture): assert len(joblib_net.cell_response.ca) == n_trials assert len(joblib_net.cell_response.vsec[trial_idx][gid]) == 8 # num sec assert len(joblib_net.cell_response.isec[trial_idx][gid]) == 1 + assert len(joblib_net.cell_response.ca[trial_idx][gid]) == 1 assert len(joblib_net.cell_response.vsec[ trial_idx][gid]['apical_1']) == n_times assert len(joblib_net.cell_response.isec[ trial_idx][gid]['soma']['soma_gabaa']) == n_times + + assert len(joblib_net.cell_response.ca[ + trial_idx][gid]['soma']) == n_times assert len(mpi_net.cell_response.vsec) == n_trials assert len(mpi_net.cell_response.isec) == n_trials assert len(mpi_net.cell_response.vsec[trial_idx][gid]) == 8 # num sec assert len(mpi_net.cell_response.isec[trial_idx][gid]) == 1 + assert len(mpi_net.cell_response.ca[trial_idx][gid]) == 1 assert len(mpi_net.cell_response.vsec[ trial_idx][gid]['apical_1']) == n_times assert len(mpi_net.cell_response.isec[ trial_idx][gid]['soma']['soma_gabaa']) == n_times + assert len(mpi_net.cell_response.ca[ + trial_idx][gid]['apical_1']) == n_times assert mpi_net.cell_response.vsec == joblib_net.cell_response.vsec assert mpi_net.cell_response.isec == joblib_net.cell_response.isec assert mpi_net.cell_response.ca == joblib_net.cell_response.ca From 5ac98a94c63d01833b3c2d38f4009d71d4b5cbc8 Mon Sep 17 00:00:00 2001 From: katduecker Date: Fri, 28 Jun 2024 15:38:33 -0400 Subject: [PATCH 10/21] rebase conflicts --- hnn_core/tests/test_dipole.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/hnn_core/tests/test_dipole.py b/hnn_core/tests/test_dipole.py index 6836615ba..53be5e7f6 100644 --- a/hnn_core/tests/test_dipole.py +++ b/hnn_core/tests/test_dipole.py @@ -229,25 +229,21 @@ def test_cell_response_backends(run_hnn_core_fixture): assert len(joblib_net.cell_response.ca) == n_trials assert len(joblib_net.cell_response.vsec[trial_idx][gid]) == 8 # num sec assert len(joblib_net.cell_response.isec[trial_idx][gid]) == 1 - assert len(joblib_net.cell_response.ca[trial_idx][gid]) == 1 assert len(joblib_net.cell_response.vsec[ trial_idx][gid]['apical_1']) == n_times assert len(joblib_net.cell_response.isec[ - trial_idx][gid]['soma']['soma_gabaa']) == n_times + trial_idx][gid]['soma']['soma_gabaa']) == n_times assert len(joblib_net.cell_response.ca[ trial_idx][gid]['soma']) == n_times assert len(mpi_net.cell_response.vsec) == n_trials assert len(mpi_net.cell_response.isec) == n_trials assert len(mpi_net.cell_response.vsec[trial_idx][gid]) == 8 # num sec - assert len(mpi_net.cell_response.isec[trial_idx][gid]) == 1 - assert len(mpi_net.cell_response.ca[trial_idx][gid]) == 1 + assert len(mpi_net.cell_response.isec[trial_idx][gid]) == 1 assert len(mpi_net.cell_response.vsec[ trial_idx][gid]['apical_1']) == n_times assert len(mpi_net.cell_response.isec[ trial_idx][gid]['soma']['soma_gabaa']) == n_times - assert len(mpi_net.cell_response.ca[ - trial_idx][gid]['apical_1']) == n_times assert mpi_net.cell_response.vsec == joblib_net.cell_response.vsec assert mpi_net.cell_response.isec == joblib_net.cell_response.isec assert mpi_net.cell_response.ca == joblib_net.cell_response.ca From d91fc942c3350ad986b74c8f5bd1ff74a824da05 Mon Sep 17 00:00:00 2001 From: katduecker Date: Thu, 13 Jun 2024 08:40:09 -0400 Subject: [PATCH 11/21] fix pep8 --- hnn_core/cell.py | 2 +- hnn_core/tests/test_dipole.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hnn_core/cell.py b/hnn_core/cell.py index 8efddd600..801671548 100644 --- a/hnn_core/cell.py +++ b/hnn_core/cell.py @@ -809,7 +809,7 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): if 'ca' in self.sections[sec_name].mechs: self.ca[sec_name] = h.Vector() self.ca[sec_name].record( - self._nrn_sections[sec_name](0.5)._ref_cai) # there may be an issue here with referencing mod file + self._nrn_sections[sec_name](0.5)._ref_cai) # calcium concentration diff --git a/hnn_core/tests/test_dipole.py b/hnn_core/tests/test_dipole.py index 53be5e7f6..8158aad0f 100644 --- a/hnn_core/tests/test_dipole.py +++ b/hnn_core/tests/test_dipole.py @@ -239,7 +239,7 @@ def test_cell_response_backends(run_hnn_core_fixture): assert len(mpi_net.cell_response.vsec) == n_trials assert len(mpi_net.cell_response.isec) == n_trials assert len(mpi_net.cell_response.vsec[trial_idx][gid]) == 8 # num sec - assert len(mpi_net.cell_response.isec[trial_idx][gid]) == 1 + assert len(mpi_net.cell_response.isec[trial_idx][gid]) == 1 assert len(mpi_net.cell_response.vsec[ trial_idx][gid]['apical_1']) == n_times assert len(mpi_net.cell_response.isec[ From 265abb44b2455d69303dd7b5f2314f7c41eb3fcf Mon Sep 17 00:00:00 2001 From: katduecker Date: Mon, 1 Jul 2024 12:17:05 -0400 Subject: [PATCH 12/21] rebase --- hnn_core/cell.py | 16 ++++++++++++++++ hnn_core/cell_response.py | 3 +++ hnn_core/dipole.py | 4 ++++ hnn_core/network_builder.py | 3 +++ hnn_core/tests/conftest.py | 5 +++++ hnn_core/tests/test_dipole.py | 12 +++++------- 6 files changed, 36 insertions(+), 7 deletions(-) diff --git a/hnn_core/cell.py b/hnn_core/cell.py index 801671548..b226e92ce 100644 --- a/hnn_core/cell.py +++ b/hnn_core/cell.py @@ -349,8 +349,15 @@ class Cell: Must be enabled by running simulate_dipole(net, record_isec=True) or simulate_dipole(net, record_isoma=True) ca : dict +<<<<<<< HEAD Contains recording of section speicifc calcium concentration. Must be enabled by running simulate_dipole(net, record_ca=True). +======= + Contains recording of section speicifc calcium concentration. + Must be enabled by running simulate_dipole(...) with record_ca + set to 'all' to record form all sections, or 'soma' to record from + the soma only. +>>>>>>> d87a97cd (record calcium concentration in L5pyr) tonic_biases : list of h.IClamp The current clamps inserted at each section of the cell for tonic biasing inputs. @@ -760,11 +767,15 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): Option to record voltages from all sections ('all'), or just the soma ('soma'). Default: False. record_ca : 'all' | 'soma' | False +<<<<<<< HEAD <<<<<<< HEAD Option to record calcium concentration from all sections ('all'), ======= Option to record calcium concentration from all sections ('all'), >>>>>>> d3105f90 (record calcium concentration in L5pyr) +======= + Option to record calcium concentration from all sections ('all'), +>>>>>>> d87a97cd (record calcium concentration in L5pyr) or just the soma ('soma'). Default: False. """ @@ -809,6 +820,7 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): if 'ca' in self.sections[sec_name].mechs: self.ca[sec_name] = h.Vector() self.ca[sec_name].record( +<<<<<<< HEAD self._nrn_sections[sec_name](0.5)._ref_cai) @@ -824,6 +836,10 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): self.ca[sec_name] = h.Vector() self.ca[sec_name].record( self._nrn_sections[sec_name](0.5)._ref_cai) +======= + self._nrn_sections[sec_name](0.5)._ref_cai) # there may be an issue here with referencing mod file + +>>>>>>> d87a97cd (record calcium concentration in L5pyr) def syn_create(self, secloc, e, tau1, tau2): """Create an h.Exp2Syn synapse. diff --git a/hnn_core/cell_response.py b/hnn_core/cell_response.py index 9ce0b1b80..7e08e932e 100644 --- a/hnn_core/cell_response.py +++ b/hnn_core/cell_response.py @@ -237,10 +237,13 @@ def isec(self): @property def ca(self): return self._ca +<<<<<<< HEAD @property def ca(self): return self._ca +======= +>>>>>>> d87a97cd (record calcium concentration in L5pyr) @property def times(self): diff --git a/hnn_core/dipole.py b/hnn_core/dipole.py index 789a91800..cc0a37584 100644 --- a/hnn_core/dipole.py +++ b/hnn_core/dipole.py @@ -38,7 +38,11 @@ def simulate_dipole(net, tstop, dt=0.025, n_trials=None, record_vsec=False, Option to record synaptic currents from all sections ('all'), or just the soma ('soma'). Default: False. record_ca : 'all' | 'soma' | False +<<<<<<< HEAD Option to record calcium concentration from all sections ('all'), +======= + Option to record calcium concentration from all sections ('all'), +>>>>>>> d87a97cd (record calcium concentration in L5pyr) or just the soma ('soma'). Default: False. postproc : bool If True, smoothing (``dipole_smooth_win``) and scaling diff --git a/hnn_core/network_builder.py b/hnn_core/network_builder.py index 722ff905f..74f402b75 100644 --- a/hnn_core/network_builder.py +++ b/hnn_core/network_builder.py @@ -106,6 +106,7 @@ def simulation_time(): for sec_name, ca in ca_dict.items(): if ca is not None: ca_py[gid][sec_name] = ca.to_python() +<<<<<<< HEAD ca_py = dict() for gid, ca_dict in neuron_net._ca.items(): @@ -113,6 +114,8 @@ def simulation_time(): for sec_name, ca in ca_dict.items(): if ca is not None: ca_py[gid][sec_name] = ca.to_python() +======= +>>>>>>> d87a97cd (record calcium concentration in L5pyr) dpl_data = np.c_[ neuron_net._nrn_dipoles['L2_pyramidal'].as_numpy() + diff --git a/hnn_core/tests/conftest.py b/hnn_core/tests/conftest.py index 95ea834fd..cad7354f6 100644 --- a/hnn_core/tests/conftest.py +++ b/hnn_core/tests/conftest.py @@ -75,9 +75,14 @@ def pytest_runtest_setup(item): def run_hnn_core_fixture(): def _run_hnn_core_fixture(backend=None, n_procs=None, n_jobs=1, reduced=False, record_vsec=False, +<<<<<<< HEAD record_isec=False, record_ca=False, postproc=False, electrode_array=None): +======= + record_isec=False, record_ca=False, postproc=False, + electrode_array=None): +>>>>>>> d87a97cd (record calcium concentration in L5pyr) hnn_core_root = op.dirname(hnn_core.__file__) # default params diff --git a/hnn_core/tests/test_dipole.py b/hnn_core/tests/test_dipole.py index 8158aad0f..4bf042602 100644 --- a/hnn_core/tests/test_dipole.py +++ b/hnn_core/tests/test_dipole.py @@ -222,6 +222,7 @@ def test_cell_response_backends(run_hnn_core_fixture): _, mpi_net = run_hnn_core_fixture(backend='mpi', n_procs=2, reduced=True, record_vsec='all', record_isec='soma', record_ca='soma') + n_times = len(joblib_net.cell_response.times) assert len(joblib_net.cell_response.vsec) == n_trials @@ -229,35 +230,32 @@ def test_cell_response_backends(run_hnn_core_fixture): assert len(joblib_net.cell_response.ca) == n_trials assert len(joblib_net.cell_response.vsec[trial_idx][gid]) == 8 # num sec assert len(joblib_net.cell_response.isec[trial_idx][gid]) == 1 + assert len(joblib_net.cell_response.ca[trial_idx][gid]) == 1 assert len(joblib_net.cell_response.vsec[ trial_idx][gid]['apical_1']) == n_times assert len(joblib_net.cell_response.isec[ trial_idx][gid]['soma']['soma_gabaa']) == n_times - assert len(joblib_net.cell_response.ca[ trial_idx][gid]['soma']) == n_times assert len(mpi_net.cell_response.vsec) == n_trials assert len(mpi_net.cell_response.isec) == n_trials assert len(mpi_net.cell_response.vsec[trial_idx][gid]) == 8 # num sec assert len(mpi_net.cell_response.isec[trial_idx][gid]) == 1 + assert len(mpi_net.cell_response.ca[trial_idx][gid]) == 1 assert len(mpi_net.cell_response.vsec[ trial_idx][gid]['apical_1']) == n_times assert len(mpi_net.cell_response.isec[ trial_idx][gid]['soma']['soma_gabaa']) == n_times + assert len(mpi_net.cell_response.ca[ + trial_idx][gid]['apical_1']) == n_times assert mpi_net.cell_response.vsec == joblib_net.cell_response.vsec assert mpi_net.cell_response.isec == joblib_net.cell_response.isec assert mpi_net.cell_response.ca == joblib_net.cell_response.ca - # test if calcium concentration is stored correctly (only L5 pyramidal) gid = joblib_net.gid_ranges['L5_pyramidal'][0] assert len(joblib_net.cell_response.ca[trial_idx][gid]) == 1 assert len(joblib_net.cell_response.ca[ trial_idx][gid]['soma']) == n_times - gid = mpi_net.gid_ranges['L5_pyramidal'][0] - assert len(mpi_net.cell_response.ca[trial_idx][gid]) == 1 - assert len(mpi_net.cell_response.ca[ - trial_idx][gid]['soma']) == n_times - # Test if spike time falls within depolarization window above v_thresh v_thresh = 0.0 times = np.array(joblib_net.cell_response.times) From abe719e07bfe43d7143a522007eeac7289bc5697 Mon Sep 17 00:00:00 2001 From: katduecker Date: Wed, 12 Jun 2024 16:49:11 -0400 Subject: [PATCH 13/21] fixed unit tests calcium L5 --- hnn_core/tests/test_dipole.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/hnn_core/tests/test_dipole.py b/hnn_core/tests/test_dipole.py index 4bf042602..275f789fd 100644 --- a/hnn_core/tests/test_dipole.py +++ b/hnn_core/tests/test_dipole.py @@ -230,7 +230,6 @@ def test_cell_response_backends(run_hnn_core_fixture): assert len(joblib_net.cell_response.ca) == n_trials assert len(joblib_net.cell_response.vsec[trial_idx][gid]) == 8 # num sec assert len(joblib_net.cell_response.isec[trial_idx][gid]) == 1 - assert len(joblib_net.cell_response.ca[trial_idx][gid]) == 1 assert len(joblib_net.cell_response.vsec[ trial_idx][gid]['apical_1']) == n_times assert len(joblib_net.cell_response.isec[ @@ -240,14 +239,11 @@ def test_cell_response_backends(run_hnn_core_fixture): assert len(mpi_net.cell_response.vsec) == n_trials assert len(mpi_net.cell_response.isec) == n_trials assert len(mpi_net.cell_response.vsec[trial_idx][gid]) == 8 # num sec - assert len(mpi_net.cell_response.isec[trial_idx][gid]) == 1 - assert len(mpi_net.cell_response.ca[trial_idx][gid]) == 1 + assert len(mpi_net.cell_response.isec[trial_idx][gid]) == 1 assert len(mpi_net.cell_response.vsec[ trial_idx][gid]['apical_1']) == n_times assert len(mpi_net.cell_response.isec[ trial_idx][gid]['soma']['soma_gabaa']) == n_times - assert len(mpi_net.cell_response.ca[ - trial_idx][gid]['apical_1']) == n_times assert mpi_net.cell_response.vsec == joblib_net.cell_response.vsec assert mpi_net.cell_response.isec == joblib_net.cell_response.isec assert mpi_net.cell_response.ca == joblib_net.cell_response.ca From 196669b0d3f62503c38c7dbda322c3ff5664cc60 Mon Sep 17 00:00:00 2001 From: katduecker Date: Thu, 13 Jun 2024 08:40:09 -0400 Subject: [PATCH 14/21] fix pep8 --- hnn_core/cell.py | 18 ------------------ hnn_core/tests/test_dipole.py | 2 +- 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/hnn_core/cell.py b/hnn_core/cell.py index b226e92ce..6abc38867 100644 --- a/hnn_core/cell.py +++ b/hnn_core/cell.py @@ -349,15 +349,10 @@ class Cell: Must be enabled by running simulate_dipole(net, record_isec=True) or simulate_dipole(net, record_isoma=True) ca : dict -<<<<<<< HEAD - Contains recording of section speicifc calcium concentration. - Must be enabled by running simulate_dipole(net, record_ca=True). -======= Contains recording of section speicifc calcium concentration. Must be enabled by running simulate_dipole(...) with record_ca set to 'all' to record form all sections, or 'soma' to record from the soma only. ->>>>>>> d87a97cd (record calcium concentration in L5pyr) tonic_biases : list of h.IClamp The current clamps inserted at each section of the cell for tonic biasing inputs. @@ -767,15 +762,7 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): Option to record voltages from all sections ('all'), or just the soma ('soma'). Default: False. record_ca : 'all' | 'soma' | False -<<<<<<< HEAD -<<<<<<< HEAD Option to record calcium concentration from all sections ('all'), -======= - Option to record calcium concentration from all sections ('all'), ->>>>>>> d3105f90 (record calcium concentration in L5pyr) -======= - Option to record calcium concentration from all sections ('all'), ->>>>>>> d87a97cd (record calcium concentration in L5pyr) or just the soma ('soma'). Default: False. """ @@ -820,7 +807,6 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): if 'ca' in self.sections[sec_name].mechs: self.ca[sec_name] = h.Vector() self.ca[sec_name].record( -<<<<<<< HEAD self._nrn_sections[sec_name](0.5)._ref_cai) @@ -836,10 +822,6 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): self.ca[sec_name] = h.Vector() self.ca[sec_name].record( self._nrn_sections[sec_name](0.5)._ref_cai) -======= - self._nrn_sections[sec_name](0.5)._ref_cai) # there may be an issue here with referencing mod file - ->>>>>>> d87a97cd (record calcium concentration in L5pyr) def syn_create(self, secloc, e, tau1, tau2): """Create an h.Exp2Syn synapse. diff --git a/hnn_core/tests/test_dipole.py b/hnn_core/tests/test_dipole.py index 275f789fd..d19d779ef 100644 --- a/hnn_core/tests/test_dipole.py +++ b/hnn_core/tests/test_dipole.py @@ -239,7 +239,7 @@ def test_cell_response_backends(run_hnn_core_fixture): assert len(mpi_net.cell_response.vsec) == n_trials assert len(mpi_net.cell_response.isec) == n_trials assert len(mpi_net.cell_response.vsec[trial_idx][gid]) == 8 # num sec - assert len(mpi_net.cell_response.isec[trial_idx][gid]) == 1 + assert len(mpi_net.cell_response.isec[trial_idx][gid]) == 1 assert len(mpi_net.cell_response.vsec[ trial_idx][gid]['apical_1']) == n_times assert len(mpi_net.cell_response.isec[ From 6a0cc4643d1711627f061ae8e5886fb76df3b421 Mon Sep 17 00:00:00 2001 From: katduecker Date: Tue, 25 Jun 2024 12:22:03 -0400 Subject: [PATCH 15/21] update parameters --- hnn_core/cell.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hnn_core/cell.py b/hnn_core/cell.py index 6abc38867..7cb1273f1 100644 --- a/hnn_core/cell.py +++ b/hnn_core/cell.py @@ -350,7 +350,7 @@ class Cell: or simulate_dipole(net, record_isoma=True) ca : dict Contains recording of section speicifc calcium concentration. - Must be enabled by running simulate_dipole(...) with record_ca + Must be enabled by running simulate_dipole(net, record_ca) with record_ca set to 'all' to record form all sections, or 'soma' to record from the soma only. tonic_biases : list of h.IClamp @@ -804,7 +804,7 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): if record_ca: for sec_name in self.ca: - if 'ca' in self.sections[sec_name].mechs: + if hasattr(self._nrn_sections[sec_name](0.5), '_ref_cai'): self.ca[sec_name] = h.Vector() self.ca[sec_name].record( self._nrn_sections[sec_name](0.5)._ref_cai) From 625d15e045a199e8c2124a0d9ab5255762f249f1 Mon Sep 17 00:00:00 2001 From: katduecker Date: Tue, 25 Jun 2024 12:29:09 -0400 Subject: [PATCH 16/21] flake8 fix --- hnn_core/cell.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/hnn_core/cell.py b/hnn_core/cell.py index 7cb1273f1..7dc526d4d 100644 --- a/hnn_core/cell.py +++ b/hnn_core/cell.py @@ -349,10 +349,8 @@ class Cell: Must be enabled by running simulate_dipole(net, record_isec=True) or simulate_dipole(net, record_isoma=True) ca : dict - Contains recording of section speicifc calcium concentration. - Must be enabled by running simulate_dipole(net, record_ca) with record_ca - set to 'all' to record form all sections, or 'soma' to record from - the soma only. + Contains recording of section speicifc calcium concentration. + Must be enabled by running simulate_dipole(net, record_ca=True). tonic_biases : list of h.IClamp The current clamps inserted at each section of the cell for tonic biasing inputs. From 58cfde15477cc0b6fcb1e9abd7c00d6f21586b21 Mon Sep 17 00:00:00 2001 From: katduecker Date: Mon, 1 Jul 2024 12:21:35 -0400 Subject: [PATCH 17/21] rebase --- hnn_core/cell.py | 8 ++++++-- hnn_core/cell_response.py | 2 +- hnn_core/dipole.py | 4 ++++ hnn_core/network_builder.py | 6 +++++- hnn_core/tests/conftest.py | 5 +++++ hnn_core/tests/test_dipole.py | 3 +++ 6 files changed, 24 insertions(+), 4 deletions(-) diff --git a/hnn_core/cell.py b/hnn_core/cell.py index 7dc526d4d..c735e6439 100644 --- a/hnn_core/cell.py +++ b/hnn_core/cell.py @@ -793,19 +793,20 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): self.isec[sec_name][syn_name] = h.Vector() self.isec[sec_name][syn_name].record( self._nrn_synapses[syn_name]._ref_i) - + # calcium concentration if record_ca == 'soma': self.ca = dict.fromkeys(['soma']) elif record_ca == 'all': self.ca = dict.fromkeys(section_names) - if record_ca: + if record_ca: for sec_name in self.ca: if hasattr(self._nrn_sections[sec_name](0.5), '_ref_cai'): self.ca[sec_name] = h.Vector() self.ca[sec_name].record( self._nrn_sections[sec_name](0.5)._ref_cai) +<<<<<<< HEAD # calcium concentration @@ -821,6 +822,9 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): self.ca[sec_name].record( self._nrn_sections[sec_name](0.5)._ref_cai) +======= + +>>>>>>> 8682db4f (flake8 fix) def syn_create(self, secloc, e, tau1, tau2): """Create an h.Exp2Syn synapse. diff --git a/hnn_core/cell_response.py b/hnn_core/cell_response.py index 7e08e932e..81851de66 100644 --- a/hnn_core/cell_response.py +++ b/hnn_core/cell_response.py @@ -233,7 +233,7 @@ def vsec(self): @property def isec(self): return self._isec - + @property def ca(self): return self._ca diff --git a/hnn_core/dipole.py b/hnn_core/dipole.py index cc0a37584..f941f6f39 100644 --- a/hnn_core/dipole.py +++ b/hnn_core/dipole.py @@ -38,11 +38,15 @@ def simulate_dipole(net, tstop, dt=0.025, n_trials=None, record_vsec=False, Option to record synaptic currents from all sections ('all'), or just the soma ('soma'). Default: False. record_ca : 'all' | 'soma' | False +<<<<<<< HEAD <<<<<<< HEAD Option to record calcium concentration from all sections ('all'), ======= Option to record calcium concentration from all sections ('all'), >>>>>>> d87a97cd (record calcium concentration in L5pyr) +======= + Option to record calcium concentration from all sections ('all'), +>>>>>>> 8682db4f (flake8 fix) or just the soma ('soma'). Default: False. postproc : bool If True, smoothing (``dipole_smooth_win``) and scaling diff --git a/hnn_core/network_builder.py b/hnn_core/network_builder.py index 74f402b75..880f6761a 100644 --- a/hnn_core/network_builder.py +++ b/hnn_core/network_builder.py @@ -99,12 +99,13 @@ def simulation_time(): for sec_name, isec in isec_dict.items(): isec_py[gid][sec_name] = { key: isec.to_python() for key, isec in isec.items()} - + ca_py = dict() for gid, ca_dict in neuron_net._ca.items(): ca_py[gid] = dict() for sec_name, ca in ca_dict.items(): if ca is not None: +<<<<<<< HEAD ca_py[gid][sec_name] = ca.to_python() <<<<<<< HEAD @@ -116,6 +117,9 @@ def simulation_time(): ca_py[gid][sec_name] = ca.to_python() ======= >>>>>>> d87a97cd (record calcium concentration in L5pyr) +======= + ca_py[gid][sec_name] = ca.to_python() +>>>>>>> 8682db4f (flake8 fix) dpl_data = np.c_[ neuron_net._nrn_dipoles['L2_pyramidal'].as_numpy() + diff --git a/hnn_core/tests/conftest.py b/hnn_core/tests/conftest.py index cad7354f6..79e0abed9 100644 --- a/hnn_core/tests/conftest.py +++ b/hnn_core/tests/conftest.py @@ -75,6 +75,7 @@ def pytest_runtest_setup(item): def run_hnn_core_fixture(): def _run_hnn_core_fixture(backend=None, n_procs=None, n_jobs=1, reduced=False, record_vsec=False, +<<<<<<< HEAD <<<<<<< HEAD record_isec=False, record_ca=False, postproc=False, electrode_array=None): @@ -83,6 +84,10 @@ def _run_hnn_core_fixture(backend=None, n_procs=None, n_jobs=1, record_isec=False, record_ca=False, postproc=False, electrode_array=None): >>>>>>> d87a97cd (record calcium concentration in L5pyr) +======= + record_isec=False, record_ca=False, + postproc=False, electrode_array=None): +>>>>>>> 8682db4f (flake8 fix) hnn_core_root = op.dirname(hnn_core.__file__) # default params diff --git a/hnn_core/tests/test_dipole.py b/hnn_core/tests/test_dipole.py index d19d779ef..454b099e6 100644 --- a/hnn_core/tests/test_dipole.py +++ b/hnn_core/tests/test_dipole.py @@ -222,7 +222,10 @@ def test_cell_response_backends(run_hnn_core_fixture): _, mpi_net = run_hnn_core_fixture(backend='mpi', n_procs=2, reduced=True, record_vsec='all', record_isec='soma', record_ca='soma') +<<<<<<< HEAD +======= +>>>>>>> 8682db4f (flake8 fix) n_times = len(joblib_net.cell_response.times) assert len(joblib_net.cell_response.vsec) == n_trials From 425bf72d359c667f74628785a7e80c1f85b4b566 Mon Sep 17 00:00:00 2001 From: katduecker Date: Mon, 1 Jul 2024 12:22:59 -0400 Subject: [PATCH 18/21] update cell/test_dipole --- hnn_core/cell.py | 9 ++------- hnn_core/tests/conftest.py | 4 ++++ hnn_core/tests/test_dipole.py | 3 --- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/hnn_core/cell.py b/hnn_core/cell.py index c735e6439..defae8a2a 100644 --- a/hnn_core/cell.py +++ b/hnn_core/cell.py @@ -800,14 +800,12 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): elif record_ca == 'all': self.ca = dict.fromkeys(section_names) - if record_ca: + if record_ca: for sec_name in self.ca: if hasattr(self._nrn_sections[sec_name](0.5), '_ref_cai'): self.ca[sec_name] = h.Vector() self.ca[sec_name].record( - self._nrn_sections[sec_name](0.5)._ref_cai) -<<<<<<< HEAD - + self._nrn_sections[sec_name](0.5)._ref_cai) # calcium concentration if record_ca == 'soma': @@ -822,9 +820,6 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): self.ca[sec_name].record( self._nrn_sections[sec_name](0.5)._ref_cai) -======= - ->>>>>>> 8682db4f (flake8 fix) def syn_create(self, secloc, e, tau1, tau2): """Create an h.Exp2Syn synapse. diff --git a/hnn_core/tests/conftest.py b/hnn_core/tests/conftest.py index 79e0abed9..65e9ffbf8 100644 --- a/hnn_core/tests/conftest.py +++ b/hnn_core/tests/conftest.py @@ -76,6 +76,7 @@ def run_hnn_core_fixture(): def _run_hnn_core_fixture(backend=None, n_procs=None, n_jobs=1, reduced=False, record_vsec=False, <<<<<<< HEAD +<<<<<<< HEAD <<<<<<< HEAD record_isec=False, record_ca=False, postproc=False, electrode_array=None): @@ -86,6 +87,9 @@ def _run_hnn_core_fixture(backend=None, n_procs=None, n_jobs=1, >>>>>>> d87a97cd (record calcium concentration in L5pyr) ======= record_isec=False, record_ca=False, +======= + record_isec=False, record_ca=False, +>>>>>>> a1d230e2 (flake8 fix) postproc=False, electrode_array=None): >>>>>>> 8682db4f (flake8 fix) hnn_core_root = op.dirname(hnn_core.__file__) diff --git a/hnn_core/tests/test_dipole.py b/hnn_core/tests/test_dipole.py index 454b099e6..d19d779ef 100644 --- a/hnn_core/tests/test_dipole.py +++ b/hnn_core/tests/test_dipole.py @@ -222,10 +222,7 @@ def test_cell_response_backends(run_hnn_core_fixture): _, mpi_net = run_hnn_core_fixture(backend='mpi', n_procs=2, reduced=True, record_vsec='all', record_isec='soma', record_ca='soma') -<<<<<<< HEAD -======= ->>>>>>> 8682db4f (flake8 fix) n_times = len(joblib_net.cell_response.times) assert len(joblib_net.cell_response.vsec) == n_trials From c32260aaf6db945761ac2d9381c7f119db4d7c2e Mon Sep 17 00:00:00 2001 From: katduecker Date: Mon, 1 Jul 2024 12:32:48 -0400 Subject: [PATCH 19/21] update tests --- hnn_core/cell.py | 2 +- hnn_core/cell_response.py | 7 ------- hnn_core/dipole.py | 8 -------- hnn_core/network_builder.py | 14 -------------- hnn_core/tests/conftest.py | 15 --------------- hnn_core/tests/test_dipole.py | 4 ++-- 6 files changed, 3 insertions(+), 47 deletions(-) diff --git a/hnn_core/cell.py b/hnn_core/cell.py index defae8a2a..a5941c30e 100644 --- a/hnn_core/cell.py +++ b/hnn_core/cell.py @@ -805,7 +805,7 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): if hasattr(self._nrn_sections[sec_name](0.5), '_ref_cai'): self.ca[sec_name] = h.Vector() self.ca[sec_name].record( - self._nrn_sections[sec_name](0.5)._ref_cai) + self._nrn_sections[sec_name](0.5)._ref_cai) # calcium concentration if record_ca == 'soma': diff --git a/hnn_core/cell_response.py b/hnn_core/cell_response.py index 81851de66..75530b4fe 100644 --- a/hnn_core/cell_response.py +++ b/hnn_core/cell_response.py @@ -237,13 +237,6 @@ def isec(self): @property def ca(self): return self._ca -<<<<<<< HEAD - - @property - def ca(self): - return self._ca -======= ->>>>>>> d87a97cd (record calcium concentration in L5pyr) @property def times(self): diff --git a/hnn_core/dipole.py b/hnn_core/dipole.py index f941f6f39..789a91800 100644 --- a/hnn_core/dipole.py +++ b/hnn_core/dipole.py @@ -38,15 +38,7 @@ def simulate_dipole(net, tstop, dt=0.025, n_trials=None, record_vsec=False, Option to record synaptic currents from all sections ('all'), or just the soma ('soma'). Default: False. record_ca : 'all' | 'soma' | False -<<<<<<< HEAD -<<<<<<< HEAD Option to record calcium concentration from all sections ('all'), -======= - Option to record calcium concentration from all sections ('all'), ->>>>>>> d87a97cd (record calcium concentration in L5pyr) -======= - Option to record calcium concentration from all sections ('all'), ->>>>>>> 8682db4f (flake8 fix) or just the soma ('soma'). Default: False. postproc : bool If True, smoothing (``dipole_smooth_win``) and scaling diff --git a/hnn_core/network_builder.py b/hnn_core/network_builder.py index 880f6761a..98f7ba1b8 100644 --- a/hnn_core/network_builder.py +++ b/hnn_core/network_builder.py @@ -105,21 +105,7 @@ def simulation_time(): ca_py[gid] = dict() for sec_name, ca in ca_dict.items(): if ca is not None: -<<<<<<< HEAD - ca_py[gid][sec_name] = ca.to_python() -<<<<<<< HEAD - - ca_py = dict() - for gid, ca_dict in neuron_net._ca.items(): - ca_py[gid] = dict() - for sec_name, ca in ca_dict.items(): - if ca is not None: - ca_py[gid][sec_name] = ca.to_python() -======= ->>>>>>> d87a97cd (record calcium concentration in L5pyr) -======= ca_py[gid][sec_name] = ca.to_python() ->>>>>>> 8682db4f (flake8 fix) dpl_data = np.c_[ neuron_net._nrn_dipoles['L2_pyramidal'].as_numpy() + diff --git a/hnn_core/tests/conftest.py b/hnn_core/tests/conftest.py index 65e9ffbf8..c2560c341 100644 --- a/hnn_core/tests/conftest.py +++ b/hnn_core/tests/conftest.py @@ -75,23 +75,8 @@ def pytest_runtest_setup(item): def run_hnn_core_fixture(): def _run_hnn_core_fixture(backend=None, n_procs=None, n_jobs=1, reduced=False, record_vsec=False, -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD record_isec=False, record_ca=False, postproc=False, electrode_array=None): - -======= - record_isec=False, record_ca=False, postproc=False, - electrode_array=None): ->>>>>>> d87a97cd (record calcium concentration in L5pyr) -======= - record_isec=False, record_ca=False, -======= - record_isec=False, record_ca=False, ->>>>>>> a1d230e2 (flake8 fix) - postproc=False, electrode_array=None): ->>>>>>> 8682db4f (flake8 fix) hnn_core_root = op.dirname(hnn_core.__file__) # default params diff --git a/hnn_core/tests/test_dipole.py b/hnn_core/tests/test_dipole.py index d19d779ef..064f0b627 100644 --- a/hnn_core/tests/test_dipole.py +++ b/hnn_core/tests/test_dipole.py @@ -222,7 +222,7 @@ def test_cell_response_backends(run_hnn_core_fixture): _, mpi_net = run_hnn_core_fixture(backend='mpi', n_procs=2, reduced=True, record_vsec='all', record_isec='soma', record_ca='soma') - + n_times = len(joblib_net.cell_response.times) assert len(joblib_net.cell_response.vsec) == n_trials @@ -233,7 +233,7 @@ def test_cell_response_backends(run_hnn_core_fixture): assert len(joblib_net.cell_response.vsec[ trial_idx][gid]['apical_1']) == n_times assert len(joblib_net.cell_response.isec[ - trial_idx][gid]['soma']['soma_gabaa']) == n_times + trial_idx][gid]['soma']['soma_gabaa']) == n_times assert len(joblib_net.cell_response.ca[ trial_idx][gid]['soma']) == n_times assert len(mpi_net.cell_response.vsec) == n_trials From f1f7e21e3523eec926b7c7efed27aca728a61bde Mon Sep 17 00:00:00 2001 From: katduecker Date: Tue, 2 Jul 2024 12:57:35 -0400 Subject: [PATCH 20/21] fix test_dipole --- hnn_core/tests/test_dipole.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/hnn_core/tests/test_dipole.py b/hnn_core/tests/test_dipole.py index 064f0b627..d329ec98c 100644 --- a/hnn_core/tests/test_dipole.py +++ b/hnn_core/tests/test_dipole.py @@ -218,10 +218,10 @@ def test_cell_response_backends(run_hnn_core_fixture): trial_idx, n_trials, gid = 0, 2, 7 _, joblib_net = run_hnn_core_fixture(backend='joblib', n_jobs=1, reduced=True, record_vsec='all', - record_isec='soma', record_ca='soma') + record_isec='soma', record_ca='all') _, mpi_net = run_hnn_core_fixture(backend='mpi', n_procs=2, reduced=True, record_vsec='all', record_isec='soma', - record_ca='soma') + record_ca='all') n_times = len(joblib_net.cell_response.times) @@ -234,8 +234,6 @@ def test_cell_response_backends(run_hnn_core_fixture): trial_idx][gid]['apical_1']) == n_times assert len(joblib_net.cell_response.isec[ trial_idx][gid]['soma']['soma_gabaa']) == n_times - assert len(joblib_net.cell_response.ca[ - trial_idx][gid]['soma']) == n_times assert len(mpi_net.cell_response.vsec) == n_trials assert len(mpi_net.cell_response.isec) == n_trials assert len(mpi_net.cell_response.vsec[trial_idx][gid]) == 8 # num sec @@ -246,12 +244,17 @@ def test_cell_response_backends(run_hnn_core_fixture): trial_idx][gid]['soma']['soma_gabaa']) == n_times assert mpi_net.cell_response.vsec == joblib_net.cell_response.vsec assert mpi_net.cell_response.isec == joblib_net.cell_response.isec - assert mpi_net.cell_response.ca == joblib_net.cell_response.ca + # test if calcium concentration is stored correctly (only L5 pyramidal) gid = joblib_net.gid_ranges['L5_pyramidal'][0] - assert len(joblib_net.cell_response.ca[trial_idx][gid]) == 1 + assert len(joblib_net.cell_response.ca[trial_idx][gid]) == 9 assert len(joblib_net.cell_response.ca[ trial_idx][gid]['soma']) == n_times + assert len(mpi_net.cell_response.ca[trial_idx][gid]) == 9 + assert len(mpi_net.cell_response.ca[ + trial_idx][gid]['soma']) == n_times + assert len(mpi_net.cell_response.ca[ + trial_idx][gid]['apical_1']) == n_times # Test if spike time falls within depolarization window above v_thresh v_thresh = 0.0 times = np.array(joblib_net.cell_response.times) From 5d05c1e6845fe3eaacdae20e1ac8e62f3e8fb501 Mon Sep 17 00:00:00 2001 From: katduecker Date: Mon, 8 Jul 2024 10:22:05 -0400 Subject: [PATCH 21/21] update whats_new remove duplicate --- doc/whats_new.rst | 2 +- hnn_core/cell.py | 13 ------------- 2 files changed, 1 insertion(+), 14 deletions(-) diff --git a/doc/whats_new.rst b/doc/whats_new.rst index 25addee7d..e131dd203 100644 --- a/doc/whats_new.rst +++ b/doc/whats_new.rst @@ -213,7 +213,7 @@ API - Recorded calcium conncetration from the soma, as well as all sections, are enabled by setting `record_ca` to `soma` or `all` in :func:`~hnn_core.simulate_dipole`. Recordings are accessed through :class:`~hnn_core.CellResponse.ca`, - by `Katharina Duecker`_ in :gh:`792` + by `Katharina Duecker`_ in :gh:`804` People who contributed to this release (in alphabetical order): ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/hnn_core/cell.py b/hnn_core/cell.py index a5941c30e..7e533f087 100644 --- a/hnn_core/cell.py +++ b/hnn_core/cell.py @@ -807,19 +807,6 @@ def record(self, record_vsec=False, record_isec=False, record_ca=False): self.ca[sec_name].record( self._nrn_sections[sec_name](0.5)._ref_cai) - # calcium concentration - if record_ca == 'soma': - self.ca = dict.fromkeys(['soma']) - elif record_ca == 'all': - self.ca = dict.fromkeys(section_names) - - if record_ca: - for sec_name in self.ca: - if hasattr(self._nrn_sections[sec_name](0.5), '_ref_cai'): - self.ca[sec_name] = h.Vector() - self.ca[sec_name].record( - self._nrn_sections[sec_name](0.5)._ref_cai) - def syn_create(self, secloc, e, tau1, tau2): """Create an h.Exp2Syn synapse.