diff --git a/geoscilabs/mag/MagDipole.py b/geoscilabs/mag/MagDipole.py index 1184f522..515631c2 100644 --- a/geoscilabs/mag/MagDipole.py +++ b/geoscilabs/mag/MagDipole.py @@ -1,4 +1,21 @@ import numpy as np +from mpl_toolkits.mplot3d import Axes3D +import matplotlib.pyplot as plt +from ipywidgets import ( + interactive, + IntSlider, + widget, + FloatText, + FloatSlider, + ToggleButton, + VBox, + HBox, + Output, + interactive_output, + Layout, + FloatRangeSlider, + Checkbox, +) def MagneticMonopoleField(obsloc, poleloc=(0.0, 0.0, 0.0), Q=1): @@ -88,3 +105,214 @@ def MagneticLongDipoleField( obsloc, (x2 + dipoleloc[0], y2 + dipoleloc[1], z2 + dipoleloc[2]), Q=-Q ) return Bx1 + Bx2, By1 + By2, Bz1 + Bz2 + + +def DrawMagneticDipole3D( + dipoleLoc_X=0.0, + dipoleLoc_Y=0.0, + dipoleLoc_Z=-5.0, + dipoledec=0.0, + dipoleinc=0.0, + dipoleL=1.0, + dipolemoment=1.0, + B0=53600e-9, + Binc=90.0, + Bdec=0, + xStart=-6, + xEnd=6, + yStart=-6, + yEnd=6, + showField=True, + showCurve=True, + showLocation=True, + showStrength=True, + ifUpdate=True, +): + if ifUpdate is False: + return 0 + dipoleloc = (dipoleLoc_X, dipoleLoc_Y, dipoleLoc_Z) + B0x = B0 * np.cos(np.radians(Binc)) * np.sin(np.radians(Bdec)) + B0y = B0 * np.cos(np.radians(Binc)) * np.cos(np.radians(Bdec)) + B0z = -B0 * np.sin(np.radians(Binc)) + + # set observation grid + z = 1.0 # x, y bounds and elevation + radii = (2.0, 5.0) # how many layers of field lines for plotting + xmin = min(xStart, yStart, z - max(radii) * 2) + xmax = max(xEnd, yEnd, max(radii) * 2) + profile_x = 0.0 # x-coordinate of y-profile + profile_y = 0.0 # y-coordinate of x-profile + h = 0.2 # grid interval + Naz = 10 # number of azimuth + + # get field lines + linex, liney, linez = MagneticLongDipoleLine( + dipoleloc, dipoledec, dipoleinc, dipoleL, radii, Naz + ) + + # get map + xi, yi = np.meshgrid(np.r_[xStart : xEnd + h : h], np.r_[yStart : yEnd + h : h]) + x1, y1 = xi.flatten(), yi.flatten() + z1 = np.full(x1.shape, z) + Bx, By, Bz = np.zeros(len(x1)), np.zeros(len(x1)), np.zeros(len(x1)) + + for i in np.arange(len(x1)): + Bx[i], By[i], Bz[i] = MagneticLongDipoleField( + dipoleloc, + dipoledec, + dipoleinc, + dipoleL, + (x1[i], y1[i], z1[i]), + dipolemoment, + ) + Ba1 = np.dot(np.r_[B0x, B0y, B0z], np.vstack((Bx, By, Bz))) + + # get x-profile + x2 = np.r_[xStart : xEnd + h : h] + y2, z2 = np.full(x2.shape, profile_y), np.full(x2.shape, z) + Bx, By, Bz = np.zeros(len(x2)), np.zeros(len(x2)), np.zeros(len(x2)) + for i in np.arange(len(x2)): + Bx[i], By[i], Bz[i] = MagneticLongDipoleField( + dipoleloc, + dipoledec, + dipoleinc, + dipoleL, + (x2[i], y2[i], z2[i]), + dipolemoment, + ) + Ba2 = np.dot(np.r_[B0x, B0y, B0z], np.vstack((Bx, By, Bz))) + + # get y-profile + y3 = np.r_[yStart : yEnd + h : h] + x3, z3 = np.full(y3.shape, profile_x), np.full(y3.shape, z) + Bx, By, Bz = np.zeros(len(x3)), np.zeros(len(x3)), np.zeros(len(x3)) + for i in np.arange(len(x3)): + Bx[i], By[i], Bz[i] = MagneticLongDipoleField( + dipoleloc, + dipoledec, + dipoleinc, + dipoleL, + (x3[i], y3[i], z3[i]), + dipolemoment, + ) + Ba3 = np.dot(np.r_[B0x, B0y, B0z], np.vstack((Bx, By, Bz))) + + fig = plt.figure() + ax = fig.gca(projection="3d") + + if showField: + # plot field lines + for lx, ly, lz in zip(linex, liney, linez): + ax.plot(lx, ly, lz, "-", markersize=1, zorder=100) + + if showLocation: + ax.scatter(x1, y1, z1, s=2, alpha=0.3) + + if showStrength: + # plot map + Bt = Ba1.reshape(xi.shape) * 1e9 # contour and color scale in nT + c = ax.contourf( + xi, + yi, + Bt, + alpha=1, + zdir="z", + offset=xmin, + cmap="jet", + levels=np.linspace(Bt.min(), Bt.max(), 50, endpoint=True), + zorder=0, + ) + fig.colorbar(c) + + if showCurve: + # auto-scaling for profile plot + ptpmax = np.max((Ba2.ptp(), Ba3.ptp())) # dynamic range + autoscaling = np.max(radii) / ptpmax + # plot x-profile + ax.scatter(x2, y2, z2, s=2, c="black", alpha=0.3) + ax.plot(x2, Ba2 * autoscaling, zs=xmax, c="black", zdir="y") + + # plot y-profile + ax.scatter(x3, y3, z3, s=2, c="black", alpha=0.3) + ax.plot(y3, Ba3 * autoscaling, zs=xmin, c="black", zdir="x") + + ax.set_xlabel("X") + ax.set_ylabel("Y") + ax.set_zlabel("Z") + + # ax.set_xlim(xmin, xmax) + # ax.set_ylim(ymin, ymax) + # ax.set_zlim(-(xmax-xmin)/2, (xmax-xmin)/2) + ax.set_xlim(xmin, xmax) + ax.set_ylim(xmin, xmax) + ax.set_zlim(xmin, xmax) + + +# draw the widgets +def interact_pic(): + dipoleLoc_X = FloatText(value=0, description="DipoleX", disabled=False) + dipoleLoc_Y = FloatText(value=0, description="DipoleY", disabled=False) + dipoleLoc_Z = FloatText(value=-5.0, description="DipoleZ", disabled=False) + dipoleL = FloatText(value=1.0, description="Length", disabled=False) + dipoleDec = FloatText(value=0, description="dipoleDec", disabled=False) + dipoleInc = FloatText(value=0.0, description="dipoleInc", disabled=False) + dipolemoment = FloatText(value=1.0, description="Moment", disabled=False) + B0 = FloatText(value=53600e-9, description=r"$B_0$", disabled=False) + Binc = FloatText(value=90, description="Binc", disabled=False) + Bdec = FloatText(value=0, description="Bdec", disabled=False) + + xStart = FloatText(value=-6, description="xStart", disabled=False) + xEnd = FloatText(value=6, description="xEnd", disabled=False) + yStart = FloatText(value=-6, description="yStart", disabled=False) + yEnd = FloatText(value=6, description="yEnd", disabled=False) + + showField = Checkbox(value=True, description="Show the Field", disabled=False) + showCurve = Checkbox(value=True, description="show the profiles", disabled=False) + showLocation = Checkbox( + value=True, description="show the locations of measurement", disabled=False + ) + showStrength = Checkbox( + value=True, description="Show the Field Strength Figure", disabled=False + ) + ifUpdate = Checkbox(value=True, description="Update Fig Real Time", disabled=False) + # ifUpdate = ToggleButton( + # value=True, + # description="UpdateRealTime", + # disabled=False, + # button_style="info", # 'success', 'info', 'warning', 'danger' or '' + # tooltip="Click me" + # ) + + out1 = HBox([dipoleLoc_X, dipoleLoc_Y, dipoleLoc_Z]) + out2 = HBox([dipoleDec, dipoleInc]) + out3 = HBox([dipoleL]) + out4 = HBox([dipolemoment]) + out5 = HBox([B0, Binc, Bdec]) + out6 = HBox([xStart, xEnd]) + out7 = HBox([yStart, yEnd]) + out8 = VBox([showField, showCurve, showLocation, showStrength, ifUpdate]) + out = interactive_output( + DrawMagneticDipole3D, + { + "dipoleLoc_X": dipoleLoc_X, + "dipoleLoc_Y": dipoleLoc_Y, + "dipoleLoc_Z": dipoleLoc_Z, + "dipoledec": dipoleDec, + "dipoleinc": dipoleInc, + "dipoleL": dipoleL, + "dipolemoment": dipolemoment, + "B0": B0, + "Binc": Binc, + "Bdec": Bdec, + "xStart": xStart, + "xEnd": xEnd, + "yStart": yStart, + "yEnd": yEnd, + "showField": showField, + "showCurve": showCurve, + "showLocation": showLocation, + "showStrength": showStrength, + "ifUpdate": ifUpdate, + }, + ) + return VBox([out1, out2, out3, out4, out5, out6, out7, HBox([out, out8])]) diff --git a/notebooks/mag/Mag_Dipole.ipynb b/notebooks/mag/Mag_Dipole.ipynb index 18e7f612..56de6de9 100644 --- a/notebooks/mag/Mag_Dipole.ipynb +++ b/notebooks/mag/Mag_Dipole.ipynb @@ -3,14 +3,13 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, + "metadata": { + "scrolled": false + }, "outputs": [], "source": [ "%matplotlib notebook\n", - "from mpl_toolkits.mplot3d import Axes3D\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "from geoscilabs.mag.MagDipole import MagneticLongDipoleLine, MagneticLongDipoleField" + "from geoscilabs.mag.MagDipole import interact_pic" ] }, { @@ -27,19 +26,6 @@ "* dipolemoement: $m=\\frac{QL}{\\mu_0}$\n" ] }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "# define a dipole\n", - "dipoleloc = (0.,0.,-50.)\n", - "dipoleL = 100.\n", - "dipoledec, dipoleinc = 0., 90.\n", - "dipolemoment = 1e13" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -51,19 +37,6 @@ "* Bdec: declination of the earth's field" ] }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "# geomagnetic field\n", - "B0, Binc, Bdec = 53600e-9, 90., 0. # in Tesla, degree, degree\n", - "B0x = B0*np.cos(np.radians(Binc))*np.sin(np.radians(Bdec))\n", - "B0y = B0*np.cos(np.radians(Binc))*np.cos(np.radians(Bdec))\n", - "B0z = -B0*np.sin(np.radians(Binc))" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -78,64 +51,6 @@ "* Naz: number of azimuth angles for the field line" ] }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "# set observation grid\n", - "xmin, xmax, ymin, ymax, z = -5., 5., -5., 5., 1. # x, y bounds and elevation\n", - "profile_x = 0. # x-coordinate of y-profile\n", - "profile_y = 0. # y-coordinate of x-profile\n", - "h = 0.2 # grid interval\n", - "radii = (2., 5.) # how many layers of field lines for plotting\n", - "Naz = 10 # number of azimuth" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Calculate data for plotting" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [], - "source": [ - "# get field lines\n", - "linex, liney, linez = MagneticLongDipoleLine(dipoleloc,dipoledec,dipoleinc,dipoleL,radii,Naz)\n", - "\n", - "# get map\n", - "xi, yi = np.meshgrid(np.r_[xmin:xmax+h:h], np.r_[ymin:ymax+h:h])\n", - "x1, y1 = xi.flatten(), yi.flatten()\n", - "z1 = np.full(x1.shape,z)\n", - "Bx, By, Bz = np.zeros(len(x1)), np.zeros(len(x1)), np.zeros(len(x1))\n", - "\n", - "for i in np.arange(len(x1)):\n", - " Bx[i], By[i], Bz[i] = MagneticLongDipoleField(dipoleloc,dipoledec,dipoleinc,dipoleL,(x1[i],y1[i],z1[i]),dipolemoment)\n", - "Ba1 = np.dot(np.r_[B0x,B0y,B0z], np.vstack((Bx,By,Bz)))\n", - "\n", - "# get x-profile\n", - "x2 = np.r_[xmin:xmax+h:h]\n", - "y2, z2 = np.full(x2.shape,profile_y), np.full(x2.shape,z)\n", - "Bx, By, Bz = np.zeros(len(x2)), np.zeros(len(x2)), np.zeros(len(x2))\n", - "for i in np.arange(len(x2)):\n", - " Bx[i], By[i], Bz[i] = MagneticLongDipoleField(dipoleloc,dipoledec,dipoleinc,dipoleL,(x2[i],y2[i],z2[i]),dipolemoment)\n", - "Ba2 = np.dot(np.r_[B0x,B0y,B0z], np.vstack((Bx,By,Bz)))\n", - "\n", - "# get y-profile\n", - "y3 = np.r_[ymin:ymax+h:h]\n", - "x3, z3 = np.full(y3.shape,profile_x), np.full(y3.shape,z)\n", - "Bx, By, Bz = np.zeros(len(x3)), np.zeros(len(x3)), np.zeros(len(x3))\n", - "for i in np.arange(len(x3)):\n", - " Bx[i], By[i], Bz[i] = MagneticLongDipoleField(dipoleloc,dipoledec,dipoleinc,dipoleL,(x3[i],y3[i],z3[i]),dipolemoment)\n", - "Ba3 = np.dot(np.r_[B0x,B0y,B0z], np.vstack((Bx,By,Bz)))" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -148,855 +63,29 @@ }, { "cell_type": "code", - "execution_count": 6, - "metadata": {}, + "execution_count": 2, + "metadata": { + "scrolled": false + }, "outputs": [ { "data": { - "application/javascript": [ - "/* Put everything inside the global mpl namespace */\n", - "window.mpl = {};\n", - "\n", - "\n", - "mpl.get_websocket_type = function() {\n", - " if (typeof(WebSocket) !== 'undefined') {\n", - " return WebSocket;\n", - " } else if (typeof(MozWebSocket) !== 'undefined') {\n", - " return MozWebSocket;\n", - " } else {\n", - " alert('Your browser does not have WebSocket support.' +\n", - " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", - " 'Firefox 4 and 5 are also supported but you ' +\n", - " 'have to enable WebSockets in about:config.');\n", - " };\n", - "}\n", - "\n", - "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", - " this.id = figure_id;\n", - "\n", - " this.ws = websocket;\n", - "\n", - " this.supports_binary = (this.ws.binaryType != undefined);\n", - "\n", - " if (!this.supports_binary) {\n", - " var warnings = document.getElementById(\"mpl-warnings\");\n", - " if (warnings) {\n", - " warnings.style.display = 'block';\n", - " warnings.textContent = (\n", - " \"This browser does not support binary websocket messages. \" +\n", - " \"Performance may be slow.\");\n", - " }\n", - " }\n", - "\n", - " this.imageObj = new Image();\n", - "\n", - " this.context = undefined;\n", - " this.message = undefined;\n", - " this.canvas = undefined;\n", - " this.rubberband_canvas = undefined;\n", - " this.rubberband_context = undefined;\n", - " this.format_dropdown = undefined;\n", - "\n", - " this.image_mode = 'full';\n", - "\n", - " this.root = $('
');\n", - " this._root_extra_style(this.root)\n", - " this.root.attr('style', 'display: inline-block');\n", - "\n", - " $(parent_element).append(this.root);\n", - "\n", - " this._init_header(this);\n", - " this._init_canvas(this);\n", - " this._init_toolbar(this);\n", - "\n", - " var fig = this;\n", - "\n", - " this.waiting = false;\n", - "\n", - " this.ws.onopen = function () {\n", - " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", - " fig.send_message(\"send_image_mode\", {});\n", - " if (mpl.ratio != 1) {\n", - " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", - " }\n", - " fig.send_message(\"refresh\", {});\n", - " }\n", - "\n", - " this.imageObj.onload = function() {\n", - " if (fig.image_mode == 'full') {\n", - " // Full images could contain transparency (where diff images\n", - " // almost always do), so we need to clear the canvas so that\n", - " // there is no ghosting.\n", - " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", - " }\n", - " fig.context.drawImage(fig.imageObj, 0, 0);\n", - " };\n", - "\n", - " this.imageObj.onunload = function() {\n", - " fig.ws.close();\n", - " }\n", - "\n", - " this.ws.onmessage = this._make_on_message_function(this);\n", - "\n", - " this.ondownload = ondownload;\n", - "}\n", - "\n", - "mpl.figure.prototype._init_header = function() {\n", - " var titlebar = $(\n", - " '');\n", - " var titletext = $(\n", - " '');\n", - " titlebar.append(titletext)\n", - " this.root.append(titlebar);\n", - " this.header = titletext[0];\n", - "}\n", - "\n", - "\n", - "\n", - "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "\n", - "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", - "\n", - "}\n", - "\n", - "mpl.figure.prototype._init_canvas = function() {\n", - " var fig = this;\n", - "\n", - " var canvas_div = $('');\n", - "\n", - " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", - "\n", - " function canvas_keyboard_event(event) {\n", - " return fig.key_event(event, event['data']);\n", - " }\n", - "\n", - " canvas_div.keydown('key_press', canvas_keyboard_event);\n", - " canvas_div.keyup('key_release', canvas_keyboard_event);\n", - " this.canvas_div = canvas_div\n", - " this._canvas_extra_style(canvas_div)\n", - " this.root.append(canvas_div);\n", - "\n", - " var canvas = $('');\n", - " canvas.addClass('mpl-canvas');\n", - " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", - "\n", - " this.canvas = canvas[0];\n", - " this.context = canvas[0].getContext(\"2d\");\n", - "\n", - " var backingStore = this.context.backingStorePixelRatio ||\n", - "\tthis.context.webkitBackingStorePixelRatio ||\n", - "\tthis.context.mozBackingStorePixelRatio ||\n", - "\tthis.context.msBackingStorePixelRatio ||\n", - "\tthis.context.oBackingStorePixelRatio ||\n", - "\tthis.context.backingStorePixelRatio || 1;\n", - "\n", - " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", - "\n", - " var rubberband = $('');\n", - " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", - "\n", - " var pass_mouse_events = true;\n", - "\n", - " canvas_div.resizable({\n", - " start: function(event, ui) {\n", - " pass_mouse_events = false;\n", - " },\n", - " resize: function(event, ui) {\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " stop: function(event, ui) {\n", - " pass_mouse_events = true;\n", - " fig.request_resize(ui.size.width, ui.size.height);\n", - " },\n", - " });\n", - "\n", - " function mouse_event_fn(event) {\n", - " if (pass_mouse_events)\n", - " return fig.mouse_event(event, event['data']);\n", - " }\n", - "\n", - " rubberband.mousedown('button_press', mouse_event_fn);\n", - " rubberband.mouseup('button_release', mouse_event_fn);\n", - " // Throttle sequential mouse events to 1 every 20ms.\n", - " rubberband.mousemove('motion_notify', mouse_event_fn);\n", - "\n", - " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", - " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", - "\n", - " canvas_div.on(\"wheel\", function (event) {\n", - " event = event.originalEvent;\n", - " event['data'] = 'scroll'\n", - " if (event.deltaY < 0) {\n", - " event.step = 1;\n", - " } else {\n", - " event.step = -1;\n", - " }\n", - " mouse_event_fn(event);\n", - " });\n", - "\n", - " canvas_div.append(canvas);\n", - " canvas_div.append(rubberband);\n", - "\n", - " this.rubberband = rubberband;\n", - " this.rubberband_canvas = rubberband[0];\n", - " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", - " this.rubberband_context.strokeStyle = \"#000000\";\n", - "\n", - " this._resize_canvas = function(width, height) {\n", - " // Keep the size of the canvas, canvas container, and rubber band\n", - " // canvas in synch.\n", - " canvas_div.css('width', width)\n", - " canvas_div.css('height', height)\n", - "\n", - " canvas.attr('width', width * mpl.ratio);\n", - " canvas.attr('height', height * mpl.ratio);\n", - " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", - "\n", - " rubberband.attr('width', width);\n", - " rubberband.attr('height', height);\n", - " }\n", - "\n", - " // Set the figure to an initial 600x600px, this will subsequently be updated\n", - " // upon first draw.\n", - " this._resize_canvas(600, 600);\n", - "\n", - " // Disable right mouse context menu.\n", - " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", - " return false;\n", - " });\n", - "\n", - " function set_focus () {\n", - " canvas.focus();\n", - " canvas_div.focus();\n", - " }\n", - "\n", - " window.setTimeout(set_focus, 100);\n", - "}\n", - "\n", - "mpl.figure.prototype._init_toolbar = function() {\n", - " var fig = this;\n", - "\n", - " var nav_element = $('')\n", - " nav_element.attr('style', 'width: 100%');\n", - " this.root.append(nav_element);\n", - "\n", - " // Define a callback function for later on.\n", - " function toolbar_event(event) {\n", - " return fig.toolbar_button_onclick(event['data']);\n", - " }\n", - " function toolbar_mouse_event(event) {\n", - " return fig.toolbar_button_onmouseover(event['data']);\n", - " }\n", - "\n", - " for(var toolbar_ind in mpl.toolbar_items) {\n", - " var name = mpl.toolbar_items[toolbar_ind][0];\n", - " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", - " var image = mpl.toolbar_items[toolbar_ind][2];\n", - " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", - "\n", - " if (!name) {\n", - " // put a spacer in here.\n", - " continue;\n", - " }\n", - " var button = $('');\n", - " button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n", - " 'ui-button-icon-only');\n", - " button.attr('role', 'button');\n", - " button.attr('aria-disabled', 'false');\n", - " button.click(method_name, toolbar_event);\n", - " button.mouseover(tooltip, toolbar_mouse_event);\n", - "\n", - " var icon_img = $('');\n", - " icon_img.addClass('ui-button-icon-primary ui-icon');\n", - " icon_img.addClass(image);\n", - " icon_img.addClass('ui-corner-all');\n", - "\n", - " var tooltip_span = $('');\n", - " tooltip_span.addClass('ui-button-text');\n", - " tooltip_span.html(tooltip);\n", - "\n", - " button.append(icon_img);\n", - " button.append(tooltip_span);\n", - "\n", - " nav_element.append(button);\n", - " }\n", - "\n", - " var fmt_picker_span = $('');\n", - "\n", - " var fmt_picker = $('');\n", - " fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n", - " fmt_picker_span.append(fmt_picker);\n", - " nav_element.append(fmt_picker_span);\n", - " this.format_dropdown = fmt_picker[0];\n", - "\n", - " for (var ind in mpl.extensions) {\n", - " var fmt = mpl.extensions[ind];\n", - " var option = $(\n", - " '', {selected: fmt === mpl.default_extension}).html(fmt);\n", - " fmt_picker.append(option)\n", - " }\n", - "\n", - " // Add hover states to the ui-buttons\n", - " $( \".ui-button\" ).hover(\n", - " function() { $(this).addClass(\"ui-state-hover\");},\n", - " function() { $(this).removeClass(\"ui-state-hover\");}\n", - " );\n", - "\n", - " var status_bar = $('