You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
168 lines
4.6 KiB
168 lines
4.6 KiB
2 years ago
|
"""
|
||
|
These are the graphs that can be used to present certain graphs through the pyqtgraph window
|
||
|
"""
|
||
|
|
||
|
import pyqtgraph as pg
|
||
|
import numpy as np
|
||
|
import cnmodel.util.pynrnutilities as PU
|
||
|
|
||
|
|
||
|
def stimulus_graph(win, stim, row, col):
|
||
|
"""
|
||
|
Presents a graph of
|
||
|
win: pg.GraphicsWindow()
|
||
|
stim:(list) dummy sgc stim results
|
||
|
"""
|
||
|
p1 = win.addPlot(
|
||
|
title="Stimulus", row=row, col=col, labels={"bottom": "T (ms)", "left": "V"}
|
||
|
)
|
||
|
data = zip(stim.time, stim.sound)
|
||
|
time = []
|
||
|
stim = []
|
||
|
for x, y in data:
|
||
|
if 0.1 < x < 0.25:
|
||
|
time.append(x * 1000)
|
||
|
stim.append(y)
|
||
|
p1.plot(time, stim, pen=pg.mkPen("k", width=0.75))
|
||
|
return p1
|
||
|
|
||
|
|
||
|
def an_spike_graph(win, pre_cells, row, col):
|
||
|
"""
|
||
|
Displays the spikes over time as lines with each cell representing a single row a single trial presentation
|
||
|
:param win: pg.GraphicsWindow()
|
||
|
:param pre_cells: (list) spike train time values
|
||
|
:return: exists to allow for further modifications on the pg.GraphicsWindow object
|
||
|
"""
|
||
|
p2 = win.addPlot(
|
||
|
title="AN spikes",
|
||
|
row=row,
|
||
|
col=col,
|
||
|
labels={"bottom": "T (ms)", "left": "AN spikes (first trial)"},
|
||
|
)
|
||
|
xan = []
|
||
|
yan = []
|
||
|
for k in range(len(pre_cells[0])):
|
||
|
r = pre_cells[0][k]
|
||
|
xan.extend(r)
|
||
|
yr = k + np.zeros_like(r) + 0.2
|
||
|
yan.extend(yr)
|
||
|
c = pg.PlotCurveItem()
|
||
|
xp = np.repeat(np.array(xan), 2)
|
||
|
yp = np.repeat(np.array(yan), 2)
|
||
|
yp[1::2] = yp[::2] + 0.6
|
||
|
c.setData(
|
||
|
xp.flatten(),
|
||
|
yp.flatten(),
|
||
|
connect="pairs",
|
||
|
width=1.0,
|
||
|
pen=pg.mkPen("k", width=1.5),
|
||
|
)
|
||
|
p2.addItem(c)
|
||
|
return p2
|
||
|
|
||
|
|
||
|
def spike_graph(win, time, vms, row, col, title="cell"):
|
||
|
"""
|
||
|
Displays the spikes over time as lines with each cell representing a single row a single trial presentation
|
||
|
:param win: pg.GraphicsWindow()
|
||
|
:param time: (list) of time that lines up with Vms
|
||
|
:param vms: voltage trace data as a list
|
||
|
:return: exists to allow for further modifications on the pg.GraphicsWindow object
|
||
|
"""
|
||
|
p3 = win.addPlot(
|
||
|
title=f"{title} Spikes",
|
||
|
row=row,
|
||
|
col=col,
|
||
|
labels={"bottom": "T (ms)", "left": "Trial #"},
|
||
|
)
|
||
|
xcn = []
|
||
|
ycn = []
|
||
|
for k in range(len(time)):
|
||
|
bspk = PU.findspikes(time[k], vms[k], -35.0)
|
||
|
xcn.extend(bspk)
|
||
|
yr = k + np.zeros_like(bspk) + 0.2
|
||
|
ycn.extend(yr)
|
||
|
d = pg.PlotCurveItem()
|
||
|
xp = np.repeat(np.array(xcn), 2)
|
||
|
yp = np.repeat(np.array(ycn), 2)
|
||
|
yp[1::2] = yp[::2] + 0.6
|
||
|
d.setData(xp.flatten(), yp.flatten(), connect="pairs", pen=pg.mkPen("k", width=1.5))
|
||
|
p3.addItem(d)
|
||
|
|
||
|
return p3
|
||
|
|
||
|
|
||
|
def voltage_graph(win, time, vms, row, col):
|
||
|
"""
|
||
|
Actually displays the voltage trace
|
||
|
:param win: pg.GraphicsWindow()
|
||
|
:param time: (list) of time that lines up with Vms
|
||
|
:param vms: voltage trace data as a list
|
||
|
:return: exists to allow for further modifications on the pg.GraphicsWindow object
|
||
|
"""
|
||
|
p4 = win.addPlot(
|
||
|
title="Pyramidal Vm",
|
||
|
row=row,
|
||
|
col=col,
|
||
|
labels={"bottom": "T (ms)", "left": "Vm (mV)"},
|
||
|
)
|
||
|
nrep = len(time)
|
||
|
if nrep > 3:
|
||
|
display = 3
|
||
|
else:
|
||
|
display = nrep
|
||
|
for nr in range(display):
|
||
|
p4.plot(
|
||
|
time[nr], vms[nr], pen=pg.mkPen(pg.intColor(nr, nrep), hues=nrep, width=1.0)
|
||
|
)
|
||
|
return p4
|
||
|
|
||
|
|
||
|
def an_psth_graph(win, pre_cells, row, col):
|
||
|
p6 = win.addPlot(
|
||
|
title="AN PSTH",
|
||
|
row=row,
|
||
|
col=col,
|
||
|
labels={"bottom": "T (ms)", "left": "Sp/ms/trial"},
|
||
|
)
|
||
|
bins = np.arange(100, 250, 1)
|
||
|
all_xan = []
|
||
|
for x in range(len(pre_cells)):
|
||
|
for y in range(len(pre_cells[x])):
|
||
|
all_xan.extend(pre_cells[x][y])
|
||
|
(hist, binedges) = np.histogram(all_xan, bins)
|
||
|
curve6 = p6.plot(
|
||
|
binedges,
|
||
|
hist,
|
||
|
stepMode=True,
|
||
|
fillBrush=(0, 0, 0, 255),
|
||
|
brush=pg.mkBrush("k"),
|
||
|
fillLevel=0,
|
||
|
)
|
||
|
return p6
|
||
|
|
||
|
|
||
|
def cell_psth_graph(win, time, vms, row, col, title="cell"):
|
||
|
p7 = win.addPlot(
|
||
|
title=f"{title} PSTH",
|
||
|
row=row,
|
||
|
col=col,
|
||
|
labels={"bottom": "T (ms)", "left": "Sp/ms/trial"},
|
||
|
)
|
||
|
spike_times = []
|
||
|
for k in range(len(time)):
|
||
|
bspk = PU.findspikes(time[k], vms[k], -35.0)
|
||
|
spike_times.extend(bspk)
|
||
|
bins = np.arange(100, 250, 0.1)
|
||
|
(hist, binedges) = np.histogram(spike_times, bins)
|
||
|
curve7 = p7.plot(
|
||
|
binedges,
|
||
|
hist,
|
||
|
stepMode=True,
|
||
|
fillBrush=(0, 0, 0, 255),
|
||
|
brush=pg.mkBrush("k"),
|
||
|
fillLevel=0,
|
||
|
)
|
||
|
return p7
|