From c0ad160688c0cc5dfbcbffc83d41c40cd4d782af Mon Sep 17 00:00:00 2001 From: ZexinLee <551901204@qq.com> Date: Sun, 24 Mar 2019 00:04:52 +0800 Subject: [PATCH 1/5] Refactor code for Mag_Dipole.ipynb --- geoscilabs/mag/MagDipole.py | 90 ++++++++++++++++++++- notebooks/mag/Mag_Dipole.ipynb | 141 +++------------------------------ 2 files changed, 101 insertions(+), 130 deletions(-) diff --git a/geoscilabs/mag/MagDipole.py b/geoscilabs/mag/MagDipole.py index 1184f522..ea5fae54 100644 --- a/geoscilabs/mag/MagDipole.py +++ b/geoscilabs/mag/MagDipole.py @@ -1,5 +1,6 @@ import numpy as np - +from mpl_toolkits.mplot3d import Axes3D +import matplotlib.pyplot as plt def MagneticMonopoleField(obsloc, poleloc=(0.0, 0.0, 0.0), Q=1): # relative obs. loc. to pole, assuming pole at origin @@ -88,3 +89,90 @@ def MagneticLongDipoleField( obsloc, (x2 + dipoleloc[0], y2 + dipoleloc[1], z2 + dipoleloc[2]), Q=-Q ) return Bx1 + Bx2, By1 + By2, Bz1 + Bz2 + +def DrawMagneticDipole3D( + dipoleloc=(0.,0.,-50.), dipoledec=0., dipoleinc=90., dipoleL=100., obsloc="null", dipolemoment=1.0 +): + # define a dipole + # dipoleloc = (0.,0.,-50.) + # dipoleL = 100. + # dipoledec, dipoleinc = 0., 90. + # dipolemoment = 1e13 + + # geomagnetic field + B0, Binc, Bdec = 53600e-9, 90., 0. # in Tesla, degree, degree + 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 + xmin, xmax, ymin, ymax, z = -5., 5., -5., 5., 1. # x, y bounds and elevation + profile_x = 0. # x-coordinate of y-profile + profile_y = 0. # y-coordinate of x-profile + h = 0.2 # grid interval + radii = (2., 5.) # how many layers of field lines for plotting + 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_[xmin:xmax+h:h], np.r_[ymin:ymax+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_[xmin:xmax+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_[ymin:ymax+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') + + # plot field lines + for lx,ly,lz in zip(linex,liney,linez): + ax.plot(lx,ly,lz,'-',markersize=1) + + # plot map + ax.scatter(x1,y1,z1,s=2,alpha=0.3) + Bt = Ba1.reshape(xi.shape)*1e9 # contour and color scale in nT + c = ax.contourf(xi,yi,Bt,alpha=1,zdir='z',offset=z-max(radii)*2,cmap='jet', + levels=np.linspace(Bt.min(),Bt.max(),50,endpoint=True)) + fig.colorbar(c) + + # 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=ymax,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(z-max(radii)*2, max(radii)*1.5) + diff --git a/notebooks/mag/Mag_Dipole.ipynb b/notebooks/mag/Mag_Dipole.ipynb index 18e7f612..cc11cd53 100644 --- a/notebooks/mag/Mag_Dipole.ipynb +++ b/notebooks/mag/Mag_Dipole.ipynb @@ -2,15 +2,18 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, - "metadata": {}, + "execution_count": 2, + "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 mpl_toolkits.mplot3d import Axes3D\n", + "# import matplotlib.pyplot as plt\n", + "# import numpy as np\n", + "from geoscilabs.mag.MagDipole import DrawMagneticDipole3D\n", + "# MagneticLongDipoleLine, MagneticLongDipoleField, " ] }, { @@ -27,19 +30,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 +41,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,21 +55,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": {}, @@ -100,42 +62,6 @@ "### 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,7 +74,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -934,7 +860,7 @@ { "data": { "text/html": [ - "" + "" ], "text/plain": [ "" @@ -942,53 +868,10 @@ }, "metadata": {}, "output_type": "display_data" - }, - { - "data": { - "text/plain": [ - "(-9.0, 7.5)" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ - "fig = plt.figure()\n", - "ax = fig.gca(projection='3d')\n", - "\n", - "# plot field lines\n", - "for lx,ly,lz in zip(linex,liney,linez):\n", - " ax.plot(lx,ly,lz,'-',markersize=1)\n", - "\n", - "# plot map\n", - "ax.scatter(x1,y1,z1,s=2,alpha=0.3)\n", - "Bt = Ba1.reshape(xi.shape)*1e9 # contour and color scale in nT \n", - "c = ax.contourf(xi,yi,Bt,alpha=1,zdir='z',offset=z-max(radii)*2,cmap='jet',\n", - " levels=np.linspace(Bt.min(),Bt.max(),50,endpoint=True))\n", - "fig.colorbar(c)\n", - "\n", - "# auto-scaling for profile plot\n", - "ptpmax = np.max((Ba2.ptp(),Ba3.ptp())) # dynamic range\n", - "autoscaling = np.max(radii) / ptpmax\n", - "\n", - "# plot x-profile\n", - "ax.scatter(x2,y2,z2,s=2,c='black',alpha=0.3)\n", - "ax.plot(x2,Ba2*autoscaling,zs=ymax,c='black',zdir='y')\n", - "\n", - "# plot y-profile\n", - "ax.scatter(x3,y3,z3,s=2,c='black',alpha=0.3)\n", - "ax.plot(y3,Ba3*autoscaling,zs=xmin,c='black',zdir='x')\n", - "\n", - "ax.set_xlabel('X')\n", - "ax.set_ylabel('Y')\n", - "ax.set_zlabel('Z')\n", - "\n", - "ax.set_xlim(xmin, xmax)\n", - "ax.set_ylim(ymin, ymax)\n", - "ax.set_zlim(z-max(radii)*2, max(radii)*1.5)\n", - "\n" + "DrawMagneticDipole3D()" ] }, { From f77567e615a156943f2f9f53799efe41c086ded5 Mon Sep 17 00:00:00 2001 From: wwzzyyzzrr Date: Fri, 29 Mar 2019 23:29:00 +0800 Subject: [PATCH 2/5] Modify MagDipole --- geoscilabs/mag/MagDipole.py | 211 +++++++-- notebooks/mag/Mag_Dipole.ipynb | 832 ++------------------------------- 2 files changed, 217 insertions(+), 826 deletions(-) diff --git a/geoscilabs/mag/MagDipole.py b/geoscilabs/mag/MagDipole.py index ea5fae54..2a39f13b 100644 --- a/geoscilabs/mag/MagDipole.py +++ b/geoscilabs/mag/MagDipole.py @@ -1,7 +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): # relative obs. loc. to pole, assuming pole at origin dx, dy, dz = obsloc[0] - poleloc[0], obsloc[1] - poleloc[1], obsloc[2] - poleloc[2] @@ -91,22 +105,19 @@ def MagneticLongDipoleField( return Bx1 + Bx2, By1 + By2, Bz1 + Bz2 def DrawMagneticDipole3D( - dipoleloc=(0.,0.,-50.), dipoledec=0., dipoleinc=90., dipoleL=100., obsloc="null", dipolemoment=1.0 + dipoleLoc_X=0.,dipoleLoc_Y=0.,dipoleLoc_Z=-50., dipoledec=0., dipoleinc=90., dipoleL=100., dipolemoment=1.0, B0=53600e-9 , Binc=90., Bdec=0, + xStart=-3, xEnd=3, yStart=-3,yEnd=3, + showField =True,showCurve=True,showLocation=True,showStrength=True ): - # define a dipole - # dipoleloc = (0.,0.,-50.) - # dipoleL = 100. - # dipoledec, dipoleinc = 0., 90. - # dipolemoment = 1e13 - - # geomagnetic field - B0, Binc, Bdec = 53600e-9, 90., 0. # in Tesla, degree, degree + 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 - xmin, xmax, ymin, ymax, z = -5., 5., -5., 5., 1. # x, y bounds and elevation + z = 1. # x, y bounds and elevation + ymin=xmin = min(xStart,yStart) + ymax=xmax = max(xEnd,yEnd) profile_x = 0. # x-coordinate of y-profile profile_y = 0. # y-coordinate of x-profile h = 0.2 # grid interval @@ -117,7 +128,7 @@ def DrawMagneticDipole3D( linex, liney, linez = MagneticLongDipoleLine(dipoleloc,dipoledec,dipoleinc,dipoleL,radii,Naz) # get map - xi, yi = np.meshgrid(np.r_[xmin:xmax+h:h], np.r_[ymin:ymax+h:h]) + 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)) @@ -127,7 +138,7 @@ def DrawMagneticDipole3D( Ba1 = np.dot(np.r_[B0x,B0y,B0z], np.vstack((Bx,By,Bz))) # get x-profile - x2 = np.r_[xmin:xmax+h:h] + 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)): @@ -135,7 +146,7 @@ def DrawMagneticDipole3D( Ba2 = np.dot(np.r_[B0x,B0y,B0z], np.vstack((Bx,By,Bz))) # get y-profile - y3 = np.r_[ymin:ymax+h:h] + 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)): @@ -145,28 +156,32 @@ def DrawMagneticDipole3D( fig = plt.figure() ax = fig.gca(projection='3d') - # plot field lines - for lx,ly,lz in zip(linex,liney,linez): - ax.plot(lx,ly,lz,'-',markersize=1) - - # plot map - ax.scatter(x1,y1,z1,s=2,alpha=0.3) - Bt = Ba1.reshape(xi.shape)*1e9 # contour and color scale in nT - c = ax.contourf(xi,yi,Bt,alpha=1,zdir='z',offset=z-max(radii)*2,cmap='jet', - levels=np.linspace(Bt.min(),Bt.max(),50,endpoint=True)) - fig.colorbar(c) + if showField: + # plot field lines + for lx,ly,lz in zip(linex,liney,linez): + ax.plot(lx,ly,lz,'-',markersize=1, zorder=100) - # auto-scaling for profile plot - ptpmax = np.max((Ba2.ptp(),Ba3.ptp())) # dynamic range - autoscaling = np.max(radii) / ptpmax + 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=z-max(radii)*2,cmap='jet', + levels=np.linspace(Bt.min(),Bt.max(),50,endpoint=True),zorder = 0) + fig.colorbar(c) - # plot x-profile - ax.scatter(x2,y2,z2,s=2,c='black',alpha=0.3) - ax.plot(x2,Ba2*autoscaling,zs=ymax,c='black',zdir='y') + 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=ymax,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') + # 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') @@ -175,4 +190,134 @@ def DrawMagneticDipole3D( ax.set_xlim(xmin, xmax) ax.set_ylim(ymin, ymax) ax.set_zlim(z-max(radii)*2, max(radii)*1.5) + + +# draw the widgets +def interact_pic(): + dipoleLoc_X=FloatText( + value=0, + description='X', + disabled=False + ) + dipoleLoc_Y=FloatText( + value=0, + description='Y', + disabled=False + ) + dipoleLoc_Z=FloatText( + value=-50., + description='Z', + disabled=False + ) + dipoleL=FloatText( + value=100., + description='Length', + disabled=False + ) + dipoleDec=FloatText( + value=0, + description='dipoleDec', + disabled=False + ) + dipoleInc=FloatText( + value=90., + description='dipoleInc', + disabled=False + ) + dipolemoment=FloatText( + value=1., + description='Dipolemoment', + 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=-3, + description="xStart", + disabled=False + ) + xEnd = FloatText( + value=3, + description="xEnd", + disabled=False + ) + yStart = FloatText( + value=-3, + description="yStart", + disabled=False + ) + yEnd = FloatText( + value=3, + description="yEnd", + disabled=False + ) + + showField = Checkbox( + value=True, + description='Show the Field', + disabled=False + ) + showCurve = Checkbox( + value=True, + description='Show the Black Curve', + disabled=False + ) + showLocation = Checkbox( + value=True, + description='Show the Location of the Point', + disabled=False + ) + showStrength = Checkbox( + value=True, + description='Show the Field Strength Figure', + disabled=False + ) + + + + 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]) + 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, + }, + ) + return VBox([out1,out2,out3,out4,out5,out6,out7,HBox([out, out8])]) \ No newline at end of file diff --git a/notebooks/mag/Mag_Dipole.ipynb b/notebooks/mag/Mag_Dipole.ipynb index cc11cd53..29d4c047 100644 --- a/notebooks/mag/Mag_Dipole.ipynb +++ b/notebooks/mag/Mag_Dipole.ipynb @@ -2,18 +2,14 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "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 DrawMagneticDipole3D\n", - "# MagneticLongDipoleLine, MagneticLongDipoleField, " + "from geoscilabs.mag.MagDipole import interact_pic" ] }, { @@ -74,796 +70,18 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "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 = $('