Skip to content
This repository was archived by the owner on Feb 26, 2025. It is now read-only.

Commit efeb84a

Browse files
authored
Merge pull request #31 from alejoe91/cleaning
Some refactoring
2 parents 1c60a0c + 84802f0 commit efeb84a

27 files changed

+2113
-160
lines changed

bluepyopt/ephys/extra_features_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ def recovery_slope(waveforms, sampling_frequency, window):
341341
time = np.arange(0, waveforms.shape[1]) * (1 / sampling_frequency) # in s
342342

343343
for i in range(waveforms.shape[0]):
344-
if peak_idx[i] == 0 or peak_idx[i] == waveforms.shape[1]:
344+
if peak_idx[i] in [0, waveforms.shape[1]]:
345345
continue
346346
max_idx = int(peak_idx[i] + ((window / 1000) * sampling_frequency))
347347
max_idx = np.min([max_idx, waveforms.shape[1]])

bluepyopt/ephys/models.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,7 @@ class LFPyCellModel(Model):
488488
def __init__(
489489
self,
490490
name,
491+
electrode=None,
491492
morph=None,
492493
mechs=None,
493494
params=None,
@@ -525,7 +526,9 @@ def __init__(
525526

526527
# Cell instantiation in simulator
527528
self.icell = None
528-
self.LFPyCell = None
529+
self.lfpy_cell = None
530+
self.electrode = electrode
531+
self.lfpy_electrode = None
529532

530533
self.dt = dt
531534
self.v_init = v_init
@@ -656,7 +659,8 @@ def create_empty_cell(name, sim, seclist_names=None, secarray_names=None):
656659

657660
def instantiate(self, sim=None):
658661
"""Instantiate model in simulator"""
659-
import LFPy
662+
from LFPy import Cell
663+
from lfpykit import RecExtElectrode
660664

661665
# TODO replace this with the real template name
662666
if not hasattr(sim.neuron.h, self.name):
@@ -673,7 +677,7 @@ def instantiate(self, sim=None):
673677

674678
self.morphology.instantiate(sim=sim, icell=self.icell)
675679

676-
self.LFPyCell = LFPy.Cell(
680+
self.lfpy_cell = Cell(
677681
morphology=sim.neuron.h.allsec(),
678682
dt=self.dt,
679683
v_init=self.v_init,
@@ -682,6 +686,10 @@ def instantiate(self, sim=None):
682686
nsegs_method=None,
683687
)
684688

689+
self.lfpy_electrode = RecExtElectrode(
690+
self.lfpy_cell, probe=self.electrode
691+
)
692+
685693
if self.mechanisms is not None:
686694
for mechanism in self.mechanisms:
687695
mechanism.instantiate(sim=sim, icell=self.icell)

bluepyopt/ephys/parameters.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ def __init__(
196196
value_scaler (float): value used to scale the parameter value
197197
locations (list of ephys.locations.Location): locations on which
198198
to instantiate the parameter
199-
param_dependencies (list): dependencies needed to intantiate
199+
param_dependencies (list): dependencies needed to instantiate
200200
the parameter
201201
"""
202202

bluepyopt/ephys/protocols.py

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
"""Protocol classes"""
2+
from .recordings import LFPRecording
3+
from .simulators import LFPySimulator
4+
from .stimuli import LFPStimulus
25

36
"""
47
Copyright (c) 2016-2020, EPFL/Blue Brain Project
@@ -193,23 +196,19 @@ def _run_func(self, cell_model, param_values, sim=None):
193196
cell_model.freeze(param_values)
194197
cell_model.instantiate(sim=sim)
195198

196-
if isinstance(cell_model, models.LFPyCellModel):
197-
LFPyCell = cell_model.LFPyCell
198-
else:
199-
LFPyCell = None
200-
201-
self.instantiate(
202-
sim=sim, icell=cell_model.icell, LFPyCell=LFPyCell
203-
)
204-
205-
if hasattr(sim, "electrode"):
206-
if any(["LFP" in rec.name for rec in self.recordings]):
207-
sim.effective_electrode = sim.electrode
208-
else:
209-
sim.effective_electrode = None
199+
self.instantiate(sim=sim, cell_model=cell_model)
210200

211201
try:
212-
sim.run(self.total_duration, cvode_active=self.cvode_active)
202+
if isinstance(sim, LFPySimulator):
203+
sim.run(
204+
lfpy_cell=cell_model.lfpy_cell,
205+
lfpy_electrode=cell_model.lfpy_electrode,
206+
tstop=self.total_duration,
207+
cvode_active=self.cvode_active)
208+
else:
209+
sim.run(
210+
self.total_duration, cvode_active=self.cvode_active
211+
)
213212
except (RuntimeError, simulators.NrnSimulatorException):
214213
logger.debug(
215214
'SweepProtocol: Running of parameter set {%s} generated '
@@ -284,23 +283,23 @@ def _reduce_method(meth):
284283
sim=sim)
285284
return responses
286285

287-
def instantiate(self, sim=None, icell=None, LFPyCell=None):
286+
def instantiate(self, sim=None, cell_model=None):
288287
"""Instantiate"""
289288

290289
for stimulus in self.stimuli:
291-
if LFPyCell is not None:
292-
stimulus.instantiate(sim=sim, icell=icell, LFPyCell=LFPyCell)
290+
if isinstance(stimulus, LFPStimulus):
291+
stimulus.instantiate(lfpy_cell=cell_model.lfpy_cell)
293292
else:
294-
stimulus.instantiate(sim=sim, icell=icell)
293+
stimulus.instantiate(sim=sim, icell=cell_model.icell)
295294

296295
for recording in self.recordings:
297296
try:
298-
# try to instantiate as an LFPy recording
299-
try:
300-
recording.instantiate(sim=sim, icell=icell,
301-
LFPyCell=LFPyCell)
302-
except Exception as e:
303-
recording.instantiate(sim=sim, icell=icell)
297+
if isinstance(recording, LFPRecording):
298+
recording.instantiate(sim=sim,
299+
lfpy_cell=cell_model.lfpy_cell,
300+
electrode=cell_model.lfpy_electrode)
301+
else:
302+
recording.instantiate(sim=sim, icell=cell_model.icell)
304303
except locations.EPhysLocInstantiateException:
305304
logger.debug(
306305
'SweepProtocol: Instantiating recording generated '

bluepyopt/ephys/recordings.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,10 @@ def response(self):
141141
return None
142142
self.tvector = self.cell.tvec
143143
return responses.TimeLFPResponse(
144-
self.name, self.tvector, self.sim.lfpyelectrode.data
144+
self.name, self.tvector, self.electrode.data
145145
)
146146

147-
def instantiate(self, sim=None, icell=None, LFPyCell=None):
147+
def instantiate(self, sim=None, lfpy_cell=None, electrode=None):
148148
import LFPy
149149

150150
"""Instantiate recording"""
@@ -154,10 +154,11 @@ def instantiate(self, sim=None, icell=None, LFPyCell=None):
154154
)
155155

156156
assert isinstance(
157-
LFPyCell, LFPy.Cell
157+
lfpy_cell, LFPy.Cell
158158
), "LFPRecording is only available for LFPCellModel"
159-
self.cell = LFPyCell
159+
self.cell = lfpy_cell
160160
self.tvector = None
161+
self.electrode = electrode
161162
self.sim = sim
162163

163164
self.instantiated = True
@@ -168,7 +169,8 @@ def destroy(self, sim=None):
168169
self.electrode = None
169170
self.LFP = None
170171
self.tvector = None
171-
172+
self.electrode = None
173+
self.cell = None
172174
self.instantiated = False
173175

174176
def __str__(self):

bluepyopt/ephys/responses.py

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -86,35 +86,22 @@ def plot(self, axes):
8686
self.name)
8787

8888

89-
class TimeLFPResponse(Response):
89+
class TimeLFPResponse(TimeVoltageResponse):
9090

9191
"""Response to stimulus"""
9292

93-
def __init__(self, name, time=None, LFP=None):
93+
def __init__(self, name, time=None, lfp=None):
9494
"""Constructor
9595
Args:
9696
name (str): name of this object
9797
time (list of floats): time series
98-
LFP (list of floats): voltage series
98+
lfp (list of floats): voltage series
9999
"""
100100

101-
super(TimeLFPResponse, self).__init__(name)
102-
101+
super(TimeLFPResponse, self).__init__(name, time=time, voltage=None)
103102
self.response = {}
104103
self.response["time"] = time
105-
self.response["voltage"] = LFP
106-
107-
def read_csv(self, filename):
108-
"""Load response from csv file"""
109-
110-
self.response = pandas.read_csv(filename)
111-
112-
def to_csv(self, filename):
113-
"""Write response to csv file"""
114-
115-
self.response.to_csv(filename)
116-
117-
def __getitem__(self, index):
118-
"""Return item at index"""
104+
self.response["voltage"] = lfp
119105

120-
return self.response.__getitem__(index)
106+
def plot(self, axes):
107+
raise NotImplementedError

bluepyopt/ephys/simulators.py

Lines changed: 19 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -184,18 +184,16 @@ def __init__(self, message, original):
184184
self.original = original
185185

186186

187-
class LFPySimulator(object):
187+
class LFPySimulator(NrnSimulator):
188188

189189
"""LFPy simulator"""
190190

191-
def __init__(self, LFPyCellModel, electrode=None, cvode_active=True,
192-
cvode_minstep=None, random123_globalindex=None,
193-
mechanisms_directory=None):
191+
def __init__(self, dt=None, cvode_active=True, cvode_minstep=None,
192+
random123_globalindex=None, mechanisms_directory=None):
194193
"""Constructor
194+
195195
Args:
196-
LFPyCellModel (LFPyCellModel): the LFPy cell model
197-
electrode (MEAutility.MEA): the MEAutility probe used to compute
198-
extracellular signals
196+
dt (float): the integration time step used by neuron.
199197
cvode_active (bool): should neuron use the variable time step
200198
integration method
201199
cvode_minstep (float): the minimum time step allowed for a cvode
@@ -208,81 +206,30 @@ def __init__(self, LFPyCellModel, electrode=None, cvode_active=True,
208206
"./data/".
209207
"""
210208

211-
self.LFPyCellModel = LFPyCellModel
212-
self.electrode = electrode
213-
self.effective_electrode = electrode
214-
215-
self.lfpyelectrode = None
216-
217-
if platform.system() == "Windows":
218-
# hoc.so does not exist on NEURON Windows
219-
# although \\hoc.pyd can work here, it gives an error for
220-
# nrn_nobanner_ line
221-
self.disable_banner = False
222-
self.banner_disabled = False
223-
else:
224-
self.disable_banner = True
225-
self.banner_disabled = False
226-
227-
self.mechanisms_directory = mechanisms_directory
228-
self.neuron.h.load_file('stdrun.hoc')
229-
230-
self.cvode_active = cvode_active
231-
self.cvode_minstep_value = cvode_minstep
232-
233-
self.random123_globalindex = random123_globalindex
234-
235-
@staticmethod
236-
def _nrn_disable_banner():
237-
"""Disable Neuron banner"""
238-
239-
nrnpy_path = os.path.join(imp.find_module("neuron")[1])
240-
import glob
241-
242-
hoc_so_list = glob.glob(os.path.join(nrnpy_path, "hoc*.so"))
243-
244-
if len(hoc_so_list) != 1:
245-
warnings.warn(
246-
"Unable to find Neuron hoc shared library in %s, "
247-
"not disabling banner" % nrnpy_path
248-
)
249-
else:
250-
hoc_so = hoc_so_list[0]
251-
nrndll = ctypes.cdll[hoc_so]
252-
ctypes.c_int.in_dll(nrndll, "nrn_nobanner_").value = 1
253-
254-
@property
255-
def neuron(self):
256-
"""Return neuron module"""
257-
258-
if self.disable_banner and not self.banner_disabled:
259-
NrnSimulator._nrn_disable_banner()
260-
self.banner_disabled = True
261-
262-
import neuron # NOQA
263-
if self.mechanisms_directory is not None:
264-
neuron.load_mechanisms(
265-
self.mechanisms_directory, warn_if_already_loaded=False
266-
)
267-
268-
return neuron
209+
super(LFPySimulator, self).__init__(
210+
dt=dt,
211+
cvode_active=cvode_active,
212+
cvode_minstep=cvode_minstep,
213+
random123_globalindex=random123_globalindex,
214+
mechanisms_directory=mechanisms_directory
215+
)
269216

270217
def run(
271218
self,
219+
lfpy_cell,
220+
lfpy_electrode,
272221
tstop=None,
273222
dt=None,
274223
cvode_active=None,
275224
random123_globalindex=None):
276225
"""Run protocol"""
277-
import LFPy
278-
# import neuron mechanisms
279226
_ = self.neuron
280227

281-
self.LFPyCellModel.LFPyCell.tstart = 0.0
282-
self.LFPyCellModel.LFPyCell.tstop = tstop
228+
lfpy_cell.tstart = 0.0
229+
lfpy_cell.tstop = tstop
283230

284231
if dt is not None:
285-
self.LFPyCellModel.LFPyCell.dt = dt
232+
lfpy_cell.dt = dt
286233

287234
if cvode_active and dt is not None:
288235
raise ValueError(
@@ -302,12 +249,7 @@ def run(
302249
rng = self.neuron.h.Random()
303250
rng.Random123_globalindex(random123_globalindex)
304251

305-
if self.effective_electrode is not None:
306-
self.lfpyelectrode = LFPy.RecExtElectrode(
307-
self.LFPyCellModel.LFPyCell, probe=self.electrode)
308-
probes = [self.lfpyelectrode]
309-
else:
310-
probes = None
252+
probes = [lfpy_electrode] if lfpy_electrode is not None else None
311253

312254
sim_params = {
313255
"probes": probes,
@@ -324,7 +266,7 @@ def run(
324266
}
325267

326268
try:
327-
self.LFPyCellModel.LFPyCell.simulate(**sim_params)
269+
lfpy_cell.simulate(**sim_params)
328270
except Exception as e:
329271
raise LFPySimulatorException("LFPy simulator error", e)
330272

0 commit comments

Comments
 (0)