from __future__ import print_function, absolute_import
import sys
if sys.version_info > (2,):
xrange = range
import numpy as np
from .alkali_atom_functions import printStateString, C_e, C_h, pi
[docs]def htmlLiteratureOutput(v, ref):
print("<div class='lit'><p>Literature values<p>Radial part of dipole matrix element: %.3f</p>" % v)
typeOfSource = "experimental value"
if ref[0] == 1:
typeOfSource = "theoretical value"
print("<p>Source: <a class='link' target='_blank' href='http://dx.doi.org/%s'>%s</a>, %s (%s) </p>" %
(ref[4], ref[3], typeOfSource, ref[2]))
print("</div>")
[docs]def printValueString(value, unit, decimalPlaces=3):
prefix = ["f", "p", "n", "$\\mu$", "m", "", "k", "M", "G", "T"]
i = 5
sg = 1.
if value < 0:
sg = -1.
value = abs(value)
formatString = "%%.%df %%s%%s" % decimalPlaces
if value > 1000:
while (value > 1000)and(i < 9):
value = value * 1.e-3
i += 1
return formatString % (sg * value, prefix[i], unit)
elif value < 1:
while (value < 1) and (i > 0):
value = value * 1.e3
i -= 1
return formatString % (sg * value, prefix[i], unit)
else:
return formatString % (sg * value, "", unit)
[docs]def plotStarkMap(calc, units=1, xlim=[], ylim=[], filename=""):
originalState = calc.basisStates[calc.indexOfCoupledState]
n = originalState[0]
l = originalState[1]
j = originalState[2]
ax = webPlot()
x = []
y = []
yState = []
ax.xlabel = "E field (V/cm)"
coeff = 1.0
ax.ylabel = "Energy/h (GHz)"
if (units == 1):
# in cm^{-1}
coeff = 0.03336 # conversion factor from GHz to cm^{-1}
ax.ylabel = "Energy/(h c) (cm^{-1})"
if (ylim == []):
ylim = [calc.atom.getEnergy(n, l, j) * C_e / C_h * 1e-9 * coeff - 10,
calc.atom.getEnergy(n, l, j) * C_e / C_h * 1e-9 * coeff + 10]
for br in xrange(len(calc.y)):
for i in xrange(len(calc.y[br])):
yt = calc.y[br][i] * coeff
if (yt < ylim[1] and ylim[0] < yt):
x.append(calc.eFieldList[i])
y.append(yt)
yState.append(calc.highlight[br][i])
yState = np.array(yState)
sortOrder = yState.argsort(kind='heapsort')
x = np.array(x)
y = np.array(y)
x = x[sortOrder]
y = y[sortOrder]
yState = yState[sortOrder]
ct = "|< %s | \mu > |^2" % printStateString(n, l, j)
ax.scatter(x / 100., y, c=yState, cmin=0, cmax=1, ctitle=ct)
if (xlim == []):
xlim = [min(x) / 100., max(x) / 100.]
ax.printPlot(xlim=xlim, ylim=ylim, filename=filename, name="starkdiv1",
height=600)
return 0
[docs]def plotInteractionLevels(calc, xlim=[], ylim=[], filename=""):
ax = webPlot()
ax.xlabel = "R (\mu m)"
ax.ylabel = "\Delta E (GHz)"
if (calc.drivingFromState[0] == 0):
# colouring is based on the contribution of the original pair state here
ct = r"|< %s %.1f , %s %.1f | \mu > |^2$" % \
(printStateString(calc.n, calc.l, calc.j),
calc.m1,
printStateString(calc.nn, calc.ll, calc.jj),
calc.m1)
else:
# colouring is based on the coupling to different states
ct = "\Omega_\mu/\Omega"
x = []
y = []
yState = []
for br in xrange(len(calc.y)):
for i in xrange(len(calc.y[br])):
x.append(calc.r[i])
y.append(calc.y[br][i])
yState.append(calc.highlight[br][i])
yState = np.array(yState)
sortOrder = yState.argsort(kind='heapsort')
x = np.array(x)
y = np.array(y)
x = x[sortOrder]
y = y[sortOrder]
yState = yState[sortOrder]
ax.scatter(x, y, c=yState, cmin=0, cmax=1, ctitle=ct)
ax.printPlot(xlim=xlim, ylim=ylim, filename=filename, name="levelintdiv")
return
[docs]class webPlot:
[docs] def __init__(self):
self.traces = []
self.layout = []
self.traceNo = 0
self.xlabel = ""
self.ylabel = ""
self.layoutx = ""
self.layouty = ""
self.title = ""
def plot(self, x, y, type, name=""):
np.set_printoptions(threshold=1e10)
self.traceNo += 1
temp = "{ x:" + np.array2string(x, separator=',') + ",\n"
temp = temp + "y: " + np.array2string(y, separator=',') + ",\n"
if (type == "."):
temp += "mode: 'markers',\n marker: {size:5},\n"
elif (type == "-"):
temp += "mode: 'lines',\n"
temp += "name: '%s'" % name
temp += "}"
self.traces.append(temp)
def semilogx(self, x, y, type, name=""):
self.layoutx = "type:'log' ,\n\
tickformat :'.1e',\n "
self.plot(x, y, type, name)
def semilogy(self, x, y, type, name=""):
self.layouty = "type:'log' ,\n\
tickformat :'.1e',\n "
self.plot(x, y, type, name)
def scatter(self, x, y, c=[], cmin=0, cmax=1, ctitle="", name=""):
np.set_printoptions(threshold=1e10)
self.traceNo += 1
temp = "{ x:" + np.array2string(x, separator=',',) + ",\n"
temp = temp + "y: " + np.array2string(y, separator=',') + ",\n"
temp += "name: '%s',\n" % name
if (c != []):
temp = temp + " text: " + np.array2string(c, separator=',') + ",\n"
temp += "mode: 'markers',\n"
if (c != []):
temp = temp + "marker:{\n\
color:" + np.array2string(c, separator=',') + ",\n\
cmin:%f,\n\
cmax:%f,\n\
showscale: true,\n\
colorbar:{\n\
title:'" % (cmin, cmax) + str(ctitle) + "',\n\
},\n\
size:5\n\
},\n"
else:
temp = temp + "marker:{\n\
size:5\n\
},\n"
temp += "}"
self.traces.append(temp)
def printPlot(self, name="", width=600, height=363, xlim=[], ylim=[], filename="",
scriptName="returnscript"):
d = ""
i = 0
while i < self.traceNo:
if i != 0:
d += ","
d += self.traces[i]
i += 1
d = "data=[" + d + "];\n"
xLimData = ""
if (not xlim == []):
xLimData = "range: [%.2E,%.2E],\n" % (xlim[0], xlim[1])
yLimData = ""
if (not ylim == []):
yLimData = "range: [%.2E,%.2E],\n" % (ylim[0], ylim[1])
# now layout
l = "layout = {\n\
hovermode: 'closest',\n\
xaxis:{\n\
zeroline:false,\n\
" + self.layoutx + "\
" + xLimData + "\
title: '" + self.xlabel + "',\n\
ticks: 'inside',\n\
showline: true\n\
},\n\
yaxis:{\n\
zeroline:false,\n\
" + self.layouty + "\
" + yLimData + "\
title: '" + self.ylabel + "',\n\
ticks: 'inside' ,\n\
showline: true \n\
}\n\
};\n"
if filename == "":
if name == "":
name = 'plotdiv'
if (self.title != ""):
print("<p>" + self.title + "</p>")
print("<div id='" + name +
"' style='width:%dpx;height:%dpx;'></div>\n" % (width, height))
print("<script id='" + scriptName + "' type='text/javascript'>\n")
print("plotarea = document.getElementById('" + name + "');\n")
print(d)
print(l)
print("Plotly.plot(plotarea, data, layout);\n")
print("</script>\n")
else:
f = open(filename, "w")
if name == "":
name = 'plotdiv'
if (self.title != ""):
f.write("<p>" + self.title + "</p>")
f.write("<div id='" + name +
"' style='width:%dpx;height:%dpx;'></div>\n" % (width, height))
f.write("<script id='" + scriptName +
"' type='text/javascript'>\n")
f.write("plotarea = document.getElementById('" + name + "')\n")
f.write(d)
f.write(l)
f.write("Plotly.plot(plotarea, data, layout);\n")
f.write("</script>\n")
f.close()