Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
raise ValueError("'shape' must have two elements: (rows, cols)")
if np.prod(shape) <= 0:
raise ValueError("Grid must have all non-zero rows and columns.")
if not isinstance(type, str):
raise TypeError("'type' must be a string, either 'rect' or 'hex'.")
if not isinstance(orientation, str):
raise TypeError("'orientation' must be a string, either "
"'horizontal' or 'veritical'.")
if type not in ['rect', 'hex']:
raise ValueError("'type' must be either 'rect' or 'hex'.")
if orientation not in ['horizontal', 'vertical']:
raise ValueError(
"'orientation' must be either 'horizontal' or 'vertical'.")
if not issubclass(etype, Electrode):
raise TypeError("'etype' must be a valid Electrode object.")
if issubclass(etype, DiskElectrode):
if 'r' not in kwargs.keys():
raise ValueError("A DiskElectrode needs a radius ``r``.")
if not isinstance(names, (tuple, list, np.ndarray)):
raise TypeError("'names' must be a tuple or list, not "
"%s." % type(names))
else:
if len(names) != 2 and len(names) != np.prod(shape):
raise ValueError("'names' must either have two entries for "
"rows/columns or %d entries, not "
"%d" % (np.prod(shape), len(names)))
self.shape = shape
self.type = type
self.spacing = spacing
# Instantiate empty collection of electrodes. This dictionary will be
# populated in a private method ``_set_egrid``:
def __init__(self, x, y, z, r):
super(DiskElectrode, self).__init__(x, y, z)
if isinstance(r, (Sequence, np.ndarray)):
raise TypeError("Electrode radius must be a scalar.")
if r <= 0:
raise ValueError("Electrode radius must be > 0, not %f." % r)
self.r = r
self.plot_patch = Circle
self.plot_kwargs = {'radius': r, 'linewidth': 2,
'ec': (0.3, 0.3, 0.3, 1),
'fc': (0.8, 0.8, 0.8, 0.7)}
'21k', '21l', '21m'])
names.extend(['R1', 'R2'])
# Rotate the grid:
rotmat = np.array([np.cos(rot), -np.sin(rot),
np.sin(rot), np.cos(rot)]).reshape((2, 2))
xy = np.matmul(rotmat, np.vstack((x_arr, y_arr)))
x_arr = xy[0, :]
y_arr = xy[1, :]
# Apply offset to make the grid centered at (x, y):
x_arr += x
y_arr += y
for x, y, z, r, name in zip(x_arr, y_arr, z_arr, r_arr, names):
self.earray.add_electrode(name, DiskElectrode(x, y, z, r))
# Beware of race condition: Stim must be set last, because it requires
# indexing into self.electrodes:
self.stim = stim
def __init__(self, x=0, y=0, z=0, rot=0, eye='RE', stim=None):
self.eye = eye
self.shape = (40, 40)
elec_radius = 15.0
e_spacing = 70.0 # um
self.earray = ElectrodeGrid(self.shape, e_spacing, x=x, y=y, z=z,
rot=rot, etype=DiskElectrode,
r=elec_radius)
# Beware of race condition: Stim must be set last, because it requires
# indexing into self.electrodes:
self.stim = stim
# Set left/right eye:
# Unfortunately, in the left eye the labeling of columns is reversed...
if eye == 'LE':
# FIXME: Would be better to have more flexibility in the naming
# convention. This is a quick-and-dirty fix:
names = list(self.earray.keys())
objects = list(self.earray.values())
names = np.array(names).reshape(self.earray.shape)
# Reverse column names:
for row in range(self.earray.shape[0]):
def __init__(self, x=0, y=0, z=0, rot=0, eye='RE', stim=None):
self.shape = (6, 10)
r = 225.0 / 2.0
spacing = 575.0
names = ('A', '1')
self.earray = ElectrodeGrid(self.shape, spacing, x=x, y=y, z=z, r=r,
rot=rot, names=names, etype=DiskElectrode)
# Beware of race condition: Stim must be set last, because it requires
# indexing into self.electrodes:
self.stim = stim
# Set left/right eye:
if not isinstance(eye, str):
raise TypeError("'eye' must be a string, either 'LE' or 'RE'.")
if eye != 'LE' and eye != 'RE':
raise ValueError("'eye' must be either 'LE' or 'RE'.")
self.eye = eye
# Unfortunately, in the left eye the labeling of columns is reversed...
if eye == 'LE':
# TODO: Would be better to have more flexibility in the naming
# convention. This is a quick-and-dirty fix:
names = list(self.earray.keys())
y_arr += y
if issubclass(etype, DiskElectrode):
if isinstance(kwargs['r'], (list, np.ndarray)):
# Specify different radius for every electrode in a list:
if len(kwargs['r']) != n_elecs:
err_s = ("If `r` is a list, it must have %d entries, not "
"%d)." % (n_elecs, len(kwargs['r'])))
raise ValueError(err_s)
r_arr = kwargs['r']
else:
# If `r` is a scalar, choose same radius for all electrodes:
r_arr = np.ones(n_elecs, dtype=float) * kwargs['r']
# Create a grid of DiskElectrode objects:
for x, y, z, r, name in zip(x_arr, y_arr, z_arr, r_arr, names):
self.add_electrode(name, DiskElectrode(x, y, z, r))
else:
# Pass keyword arguments to the electrode constructor:
for x, y, z, name in zip(x_arr, y_arr, z_arr, names):
self.add_electrode(name, etype(x, y, z, **kwargs))
y_arr = np.array(y_arr)
else:
raise NotImplementedError
# Rotate the grid:
rotmat = np.array([np.cos(rot), -np.sin(rot),
np.sin(rot), np.cos(rot)]).reshape((2, 2))
xy = np.matmul(rotmat, np.vstack((x_arr.flatten(), y_arr.flatten())))
x_arr = xy[0, :]
y_arr = xy[1, :]
# Apply offset to make the grid centered at (x, y):
x_arr += x
y_arr += y
if issubclass(etype, DiskElectrode):
if isinstance(kwargs['r'], (list, np.ndarray)):
# Specify different radius for every electrode in a list:
if len(kwargs['r']) != n_elecs:
err_s = ("If `r` is a list, it must have %d entries, not "
"%d)." % (n_elecs, len(kwargs['r'])))
raise ValueError(err_s)
r_arr = kwargs['r']
else:
# If `r` is a scalar, choose same radius for all electrodes:
r_arr = np.ones(n_elecs, dtype=float) * kwargs['r']
# Create a grid of DiskElectrode objects:
for x, y, z, r, name in zip(x_arr, y_arr, z_arr, r_arr, names):
self.add_electrode(name, DiskElectrode(x, y, z, r))
else:
# Pass keyword arguments to the electrode constructor:
for x, y, z, name in zip(x_arr, y_arr, z_arr, names):