-
Notifications
You must be signed in to change notification settings - Fork 1
/
currents_visualization.py
146 lines (130 loc) · 5.16 KB
/
currents_visualization.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
from pylab import *
def plotCurrentscape(voltage, currents):
# make a copy of currents
# CURRENTSCAPE CALCULATION STARTS HERE.
curr = array(currents)
cpos = curr.copy()
cpos[curr < 0] = 0
cneg = curr.copy()
cneg[curr > 0] = 0
normapos = sum(abs(array(cpos)), axis=0)
normaneg = sum(abs(array(cneg)), axis=0)
npPD = normapos
nnPD = normaneg
cnorm = curr.copy()
cnorm[curr > 0] = (abs(curr) / normapos)[curr > 0]
cnorm[curr < 0] = -(abs(curr) / normaneg)[curr < 0]
resy = 1000
impos = zeros((resy, shape(cnorm)[-1])) - 1
imneg = zeros((resy, shape(cnorm)[-1])) - 1
times = arange(0, shape(cnorm)[-1])
for t in times:
lastpercent = 0
for numcurr, curr in enumerate(cnorm):
if (curr[t] > 0):
percent = int(curr[t] * (resy))
impos[lastpercent:lastpercent + percent, t] = numcurr
lastpercent = lastpercent + percent
for t in times:
lastpercent = 0
for numcurr, curr in enumerate(cnorm):
if (curr[t] < 0):
percent = int(abs(curr[t]) * (resy))
imneg[lastpercent:lastpercent + percent, t] = numcurr
lastpercent = lastpercent + percent
im0 = vstack((impos, imneg))
# CURRENTSCAPE CALCULATION ENDS HERE.
# PLOT CURRENTSCAPE
fig = figure(figsize=(3, 4))
# PLOT VOLTAGE TRACE
xmax = len(voltage)
swthres = -50
ax = subplot2grid((7, 1), (0, 0), rowspan=2)
t = arange(0, len(voltage))
plot(t, voltage, color='black', lw=1.)
plot(t, ones(len(t)) * swthres, ls='dashed', color='black', lw=0.75)
vlines(1, -50, -20, lw=1)
ylim(min([-55, min(voltage) - 5]), max([-15, max(voltage) + 5]))
xlim(0, xmax)
axis('off')
# PLOT TOTAL INWARD CURRENT IN LOG SCALE
ax = subplot2grid((7, 1), (2, 0), rowspan=1)
fill_between(arange(len((npPD))), (npPD), color='black')
plot(0.0005 * ones(len(nnPD)), color='black', ls=':', lw=1)
plot(0.005 * ones(len(nnPD)), color='black', ls=':', lw=1)
plot(0.05 * ones(len(nnPD)), color='black', ls=':', lw=1)
yscale('log')
ylim(0.000001, 0.5)
xlim(0, xmax)
axis('off')
# PLOT CURRENT SHARES
elcolormap = 'tab10'
ax = subplot2grid((7, 1), (3, 0), rowspan=3)
cs = imshow(im0[::1, ::1], interpolation='nearest', aspect='auto', cmap=elcolormap)
ylim(2 * resy, 0)
plot(resy * ones(len(npPD)), color='black', lw=2)
plt.gca().xaxis.set_major_locator(plt.NullLocator())
plt.gca().yaxis.set_major_locator(plt.NullLocator())
xlim(0, xmax)
clim(-0.0001, 10)
cs.cmap.set_under('w')
axis('off')
# PLOT TOTAL OUTWARD CURRENT IN LOG SCALE
ax = subplot2grid((7, 1), (6, 0), rowspan=1)
fill_between(arange(len((nnPD))), (nnPD), color='black')
plot(0.0005 * ones(len(nnPD)), color='black', ls=':', lw=1)
plot(0.005 * ones(len(nnPD)), color='black', ls=':', lw=1)
plot(0.05 * ones(len(nnPD)), color='black', ls=':', lw=1)
yscale('log')
ylim(0.5, 0.000001)
xlim(0, xmax)
axis('off')
subplots_adjust(wspace=0, hspace=0)
return fig
def plotVoltageDistributions(Vdist):
im = Vdist
fig = figure()
cmmap = 'Greys'
# proper visualization requires that we take the logarithm (we add +1 to avoid NaN)
imshow((log10(im + 1)), aspect='auto', cmap=cmmap, extent=[1, 0, -75, 30], interpolation='nearest')
xlim(1, 0)
ylim(-75, 30)
clim(1, 5)
axis('off')
subplots_adjust(left=0, bottom=0, right=1, top=1, wspace=0, hspace=0)
return fig
def plotVoltageDistributionsEnhanceEdges(Vdist):
im = Vdist
fig = figure(figsize=(3, 6))
# choose a colormap (see also gnuplot1, gnuplot2, helix)
cmmap = 'hot'
# proper visualization requires that we take the logarithm
a = log10(im + 1)
# We smooth the distribution using a convolution with the identity. This does not have a big effect.
filt = ones(3) / 3.
r = np.apply_along_axis(lambda m: np.convolve(m, filt, mode='same'), axis=0, arr=a)
# We enhance edges by performing a derivative (along the V-axis).
imm = abs(diff(r, axis=0))
imshow(imm, aspect='auto', cmap=cmmap, extent=[1, 0, -75, 30], interpolation='nearest')
xlim(1, 0)
ylim(-75, 30)
axis('off')
subplots_adjust(left=0, bottom=0, right=1, top=1, wspace=0, hspace=0)
clim(0.0, 0.3)
return fig
def plotCurrentSharesDistributions(current_share_dist):
im = current_share_dist
fig = figure()
cmmap = 'gnuplot2'
# proper visualization requires that we take the logarithm (we add +1 to avoid NaN)
imshow(log10(im + 1), aspect='auto', cmap=cmmap, extent=[1, 0, 0, 1], interpolation='nearest')
percents = linspace(1, 0, 101)
plot(percents, ones(len(percents)) * (0.25), color='white', ls=':')
plot(percents, ones(len(percents)) * (0.5), color='white', ls=':')
plot(percents, ones(len(percents)) * (0.75), color='white', ls=':')
xlim(1, 0)
ylim(0, 1)
clim(1, 5)
axis('off')
subplots_adjust(left=0, bottom=0, right=1, top=1, wspace=0, hspace=0)
return fig