{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# MayaVi for Data Analysis" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our goal here is to use MayaVi to effectively analyze 3D datasets. We shall show how to save the data to an HDF5 file, then load it for visualization in MayaVi. We assume that the data sets are large, and so try to use data sources that only load the required data into memory. Our data will be simple: rectagular meshes.\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "toc": "true" }, "source": [ "# Table of Contents\n", "

1  MayaVi for Data Analysis
2  Jupyter Notebook
3  Example
3.1  Generating Data
3.2  MayaVi
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Jupyter Notebook" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "MayaVi can be run in a notebook. Instructions are [provided in the documentation](http://docs.enthought.com/mayavi/mayavi/tips.html#using-mayavi-in-jupyter-notebooks): Here is what I needed to do on the server (after updating various packages like `notebook`.)\n", "\n", "```bash\n", "conda install mayavi\n", "jupyter nbextension install --py mayavi\n", "```\n", "\n", "This might work locally, but trying to use the notebooks across the network gives rise to the following error:\n", "\n", "```bash\n", "__main__.py: cannot connect to X server\n", "```\n", "\n", "This is discussed in [Issue #439: Kernel dies on mlab import at jupyter notebook](https://github.com/enthought/mayavi/issues/439).\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Example" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Generating Data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here we generate the generation of some simple data - in this case a mock simulation of a vortex moving through a cloud." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Each frame is 128 MB\n", "100 frames will be 12.5 GB\n" ] } ], "source": [ "import h5py\n", "import numpy as np\n", "\n", "Nt = 100\n", "Nx = Ny = 128\n", "Nz = 512\n", "lam = 8.0 # Aspect ratio\n", "x = np.linspace(-1, 1, Nx)[:, None, None]\n", "y = np.linspace(-1, 1, Ny)[None, :, None]\n", "z = np.linspace(-lam, lam, Nz)[None, None, :]\n", "\n", "xi = 0.1 # Size of vortex core\n", "V = x**2 + y**2 + (z/lam)**2\n", "mu = 0.8**2\n", "phi0 = np.where(V" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nXzz77LMijmOxfft28fTTT5+ql1+SfPe73xVPPPGEuPzyy4u5D3zgA+Luu+8WQgixc+dOceeddwoh\nhHjqqafE9u3bRRzH4tlnnxXnn3++yLLstLzvUfLCCy+IJ598UgghRLvdFhdeeKF4+umnV+35CCFE\nt9sVQgiRJIm47rrrxGOPPbaqz+fv/u7vxK233ire8pa3CCFW77U2PT0tDh06NDS3nOdyyqD1/e9/\nX9x4443F8Y4dO8SOHTtO1csvWZ599tkhaF100UVi//79QggJgosuukgIIcSHP/xhsXPnzuJ+N954\no/jBD35wat/sccjv/M7viG9961tr4ny63a645pprxI9//ONVez579uwRr3/968V3vvMd8du//dtC\niNV7rU1PT4uDBw8OzS3nuZwy83Dfvn2cc845xfFqTag+2r6PqyVhfPfu3Tz55JNcd911q/p88jzn\nqquuYvPmzYXpu1rP5/3vfz8f/ehHh0o5rdZzsSyLN7zhDVxzzTV85jOfAZb3XJYdWgv5rdZidPxq\n3Pex0+lw880384lPfIJWqzV022o7H9u2+c///E/27t3Ld7/7Xf7t3/5t6PbVcj5f//rX2bRpE1df\nffWC9aRWy7kA/Pu//ztPPvkk3/jGN/jHf/xHHnvssaHbT/RclhVaWZbx3ve+l4cffpinn36aL37x\ni/zkJ3LbrGpC9Z49e4YIu1pE7/sInMC+j6dHkiTh5ptv5rbbbiu2flvN56NlcnKS3/qt3+JHP/rR\nqjyf73//+zzwwAOce+65vP3tb+c73/kOt91226o8F4AzzzwTgI0bN/J7v/d7PP7448t6LssKrccf\nf5wLLriA6elpPM/jbW97G/fffz8A11xzDT/72c/YvXs3cRzz5S9/mZtuumk5X/6UiN73EZi37+NK\nThgXQnD77bdz6aWX8r73va+YX63nc/DgwWIFqt/v861vfYurr756VZ7Phz/8Yfbs2cOzzz7Ll770\nJX7zN3+Tz3/+86vyXHq9Hu223K+g2+3yzW9+kyuuuGJ5z2U5HXD/8i//It7znvcUx5///OfFe9/7\n3uL4oYceEhdeeKE4//zzxYc//OHlfOmTIm9729vEmWeeKTzPE1u3bhWf+9znxKFDh8TrX/96sW3b\nNnHDDTeII0eOFPf/0Ic+JM4//3xx0UUXiYcffvg0vvP58thjjwnLssT27dvFVVddJa666irxjW98\n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\nAJSqfjeDlFKMAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%pylab inline\n", "subplot(311)\n", "imshow(abs(psi_t(0))[Nx//2, :, :])\n", "subplot(312)\n", "imshow(abs(psi_t(0.25))[Nx//2, :, :])\n", "subplot(313)\n", "imshow(abs(psi_t(0))[:, Ny//2, :])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In order to be able to load the data directly into VisIt and similar programs, we use an (undocumented?) convention of a \"Pixie\" format. This requires storing each array in a group called ``/Timestep_%i`` where ``%i`` is the frame number. Within each group, one can store different variables.\n", "\n", "Here is the *extremely* sparse documentation I have found:\n", "* [Reverse engineering the VisIt test data](https://elist.ornl.gov/pipermail/visit-users/2013-February/013761.html)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Frame 0 of 100\n", "Frame 10 of 100\n", "Frame 20 of 100\n", "Frame 30 of 100\n", "Frame 40 of 100\n", "Frame 50 of 100\n", "Frame 60 of 100\n", "Frame 70 of 100\n", "Frame 80 of 100\n", "Frame 90 of 100\n" ] } ], "source": [ "filename = 'vortex.h5'\n", "if os.path.exists(filename):\n", " os.remove(filename)\n", "\n", "zero = np.zeros((Nx, Ny, Nz))\n", "with h5py.File(filename) as f:\n", " pass\n", " #f['node_coords/X'] = x + zero#.ravel()\n", " #f['node_coords/Y'] = y + zero#.ravel()\n", " #f['node_coords/Z'] = z + zero#.ravel()\n", "\n", " #f['Origin'] = np.array([_x.min() for _x in (z,y,x)])\n", " #f['DxDyDz'] = np.array([np.diff(_x.ravel())[0] for _x in (z,y,x)])\n", " \n", "ts = np.linspace(0, 1, Nt)\n", "for _n, _t in enumerate(ts):\n", " if _n % 10 == 0:\n", " print(\"Frame %i of %i\" % (_n, Nt))\n", " with h5py.File(filename) as f:\n", " grp = 'Timestep_%i' % (_n,)\n", " f[grp + '/rho'] = abs(psi_t(_t))**2\n", " #f[grp].attrs['coords']=('/node_coords/X', '/node_coords/Y', '/node_coords/Z')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's save 200 frames to a file. There are some tricks here:\n", "\n", "1. We don't want to keep all the images in memory, so we must make an extensible dataset in the HDF5 file. We do this by explicitly creating a dataset with ``maxshape = (None, Nx, Ny, Nz)``. This will allow us to add multiple arrays as we generate them (automatically increasing along the first dimension).\n", "2. Accessing an existing array in the HDF5 file is different than creating a new array. Thus, it is easist to delete the file first, but if you want to append, you will need some logic to check that the arrays are compatible if they already exist.\n", "3. I am using a simple file here. If you want to use a file in a directory, you will need to make sure that the directory exists first - just passing a full name to ``File`` will not create the directory.\n", "4. It is very important to specify the ``chunks`` size if you want good performance. (The default here immediately created an 8GB array!)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Frame 0 of 100\n", "Frame 10 of 100\n", "Frame 20 of 100\n", "Frame 30 of 100\n", "Frame 40 of 100\n", "Frame 50 of 100\n", "Frame 60 of 100\n", "Frame 70 of 100\n", "Frame 80 of 100\n", "Frame 90 of 100\n" ] } ], "source": [ "filename = 'vortex.h5'\n", "if os.path.exists(filename):\n", " os.remove(filename)\n", "\n", "with h5py.File(filename) as f:\n", " f.create_dataset('psis', shape=(0, Nx, Ny, Nz),\n", " maxshape=(None, Nx, Ny, Nz),\n", " chunks=(1, Nx, Ny, Nz),\n", " dtype=double)\n", " f['x'] = x\n", " f['y'] = y\n", " f['z'] = z\n", "\n", "ts = np.linspace(0, 1, Nt)\n", "for _n, _t in enumerate(ts):\n", " if _n % 10 == 0:\n", " print(\"Frame %i of %i\" % (_n, Nt))\n", " with h5py.File(filename) as f:\n", " psis = f['psis']\n", " psis.resize(_n+1, axis=0)\n", " psis[_n] = abs(psi_t(_t))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here are some timings to estimate file access speeds. Apparently the time to open the file is insignificant, so we can do this repeatedly if needed." ] }, { "cell_type": "code", "execution_count": 158, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10 loops, best of 3: 157 ms per loop\n" ] } ], "source": [ "%%timeit\n", "with h5py.File('vortex.hd5') as f:\n", " psi = np.array(f['psis'][0])" ] }, { "cell_type": "code", "execution_count": 156, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10 loops, best of 3: 158 ms per loop\n" ] } ], "source": [ "%%timeit\n", "with h5py.File('vortex.hd5') as f:\n", " psi = np.array(f['psis'][Nt//2])" ] }, { "cell_type": "code", "execution_count": 160, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10 loops, best of 3: 156 ms per loop\n" ] } ], "source": [ "%%timeit\n", "with h5py.File('vortex.hd5') as f:\n", " psi = np.array(f['psis'][Nt - 1])" ] }, { "cell_type": "code", "execution_count": 159, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10 loops, best of 3: 156 ms per loop\n", "10 loops, best of 3: 155 ms per loop\n", "10 loops, best of 3: 163 ms per loop\n" ] } ], "source": [ "with h5py.File('vortex.hd5') as f:\n", " %timeit psi = np.array(f['psis'][0])\n", " %timeit psi = np.array(f['psis'][Nt//2])\n", " %timeit psi = np.array(f['psis'][Nt-1])" ] }, { "cell_type": "code", "execution_count": 164, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 loops, best of 3: 2.27 s per loop\n" ] } ], "source": [ "%%timeit\n", "res = 0\n", "with h5py.File('vortex.hd5') as f:\n", " for n in xrange(10):\n", " res += np.sum(f['psis'][np.random.randint(Nt)])" ] }, { "cell_type": "code", "execution_count": 165, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 loops, best of 3: 2.26 s per loop\n" ] } ], "source": [ "%%timeit\n", "res = 0\n", "for n in xrange(10):\n", " with h5py.File('vortex.hd5') as f:\n", " res += np.sum(f['psis'][np.random.randint(Nt)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## MayaVi" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note: On Mavericks (OS X 9), there are issues related to running MayaVi. In particular, the version of python running must be a \"Framework\" build. This seems to mean that the kernel is started with the version of python in ``python.app/Contents/MacOS/python`` *with the explicit path specified*. I.e. Even if you have a symlink to this on your path, it is not sufficient to use that. You must invoke this explicitly. To find out where this is, look at the ``mayavi2`` script:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "#!/data/apps/anaconda/1.3.1/python.app/Contents/MacOS/python\r\n" ] } ], "source": [ "!head -n1 $(type -p mayavi2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In order to ensure that this is done properly here, all of our examples will be run as scripts, not from this notebook. We start by making a little application that will display the frames." ] }, { "cell_type": "code", "execution_count": 131, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/BUILD/wxPython-src-3.0.0.0/src/common/module.cpp(194): assert \"module->m_state == State_Initialized\" failed in DoCleanUpModules(): not initialized module being cleaned up\n" ] } ], "source": [ "%%script /data/apps/anaconda/1.3.1/python.app/Contents/MacOS/python\n", "import numpy as np\n", "import h5py\n", "\n", "import traits.api as api\n", "import traitsui.api as uapi\n", "\n", "from mayavi.core.api import PipelineBase, Source\n", "from mayavi.core.ui.api import MayaviScene, SceneEditor, MlabSceneModel\n", "from mayavi.core.ui.engine_view import EngineView\n", "from mayavi.sources.api import ArraySource\n", "\n", "from tvtk.api import tvtk\n", "\n", "from mayavi import mlab\n", "\n", "class Data(api.HasTraits):\n", " _filename = 'vortex.hd5'\n", " filename = api.Str(_filename)\n", " with h5py.File(_filename) as f:\n", " frame = api.Range(0, f['psis'].shape[0])\n", " x = np.ravel(f['x'])\n", " y = np.ravel(f['y'])\n", " z = np.ravel(f['z'])\n", "\n", " @property\n", " def psi(self):\n", " with h5py.File(self.filename) as f:\n", " return np.asarray(f['psis'][self.frame])\n", " \n", " def __init__(self, **traits):\n", " api.HasTraits.__init__(self, **traits)\n", "\n", "\n", "class MyModel(api.HasTraits):\n", " #data = api.Instance(Data)\n", " #filename = api.DelegatesTo('data')\n", " #frame = api.DelegatesTo('data')\n", " #scene = api.Instance(MlabSceneModel, ())\n", " #plot = api.Instance(PipelineBase)\n", "\n", " @property \n", " def data(self):\n", " return self\n", "\n", " filename = api.Str('vortex.hd5')\n", " frame = api.Range(0, 99)\n", "\n", " @property\n", " def psi(self):\n", " with h5py.File(self.filename) as f:\n", " return np.asarray(f['psis'][self.frame])\n", "\n", " data_src = api.Instance(Source)\n", " data_src2 = api.Instance(Source)\n", "\n", " scene = api.Instance(MlabSceneModel, ())\n", " scene2 = api.Instance(MlabSceneModel, ())\n", " plot = api.Instance(PipelineBase)\n", " plot2 = api.Instance(PipelineBase)\n", " \n", " def __init__(self, **traits):\n", " api.HasTraits.__init__(self, **traits)\n", " with h5py.File(self.filename) as f:\n", " frame = api.Range(0, f['psis'].shape[0])\n", " x = np.asarray(f['x'])\n", " y = np.asarray(f['y'])\n", " z = np.asarray(f['z'])\n", " self.Nx, self.Ny, self.Nz = self.N = (len(x.ravel()), len(y.ravel()), len(z.ravel()))\n", " zero = np.zeros(self.N)\n", "\n", " self.data_src = mlab.pipeline.scalar_field(\n", " x + zero, y + zero, z + zero,\n", " abs(self.data.psi)**2,\n", " figure=self.scene.mayavi_scene,\n", " name='Density',)\n", " self.data_src2 = ArraySource(\n", " scene=self.scene2,\n", " parent=self.scene2,\n", " **self.data_src.get([\n", " 'origin',\n", " 'spacing',\n", " 'image_data',\n", " 'scalar_data',\n", " 'name',\n", " 'type',\n", " 'scalar_name'\n", " 'transpose_input_array',\n", " #'vector_name',\n", " #'outputs',\n", " #'input_info',\n", " #'change_information_filter',\n", " #'output_info',\n", " #'mlab_source',\n", " ]))\n", " \n", " #self.make_main_view()\n", "\n", " #self.outline = mlab.pipeline.outline(\n", " # self.data_src.mlab_source.dataset,\n", " # figure=self.scene2.mayavi_scene)\n", " \n", " #self.make_end_view()\n", " #_image_data = self.data_src.mlab_source.dataset\n", " #_image_data.spacing = tuple(np.diff(_x)[0] for _x in [x, y, z])\n", " #_image_data.origin = tuple(_x[0] for _x in [x, y, z])\n", " #_image_data.bounds = (x.min(), x.max(), y.min(), y.max(), z.min(), z.max())\n", "\n", " @api.on_trait_change('scene.activated')\n", " def make_main_view(self):\n", " mlab.pipeline.outline(self.data_src)\n", " mlab.pipeline.image_plane_widget(\n", " self.data_src, plane_orientation='x_axes', slice_index=self.Nx//2)\n", " mlab.pipeline.image_plane_widget(\n", " self.data_src, plane_orientation='y_axes', slice_index=self.Ny//2)\n", " \n", " @api.on_trait_change('scene2.activated')\n", " def make_end_view(self):\n", " mlab.pipeline.outline(self.data_src2,\n", " figure=self.scene2.mayavi_scene)\n", " mlab.pipeline.image_plane_widget(#self.data_src.mlab_source.dataset,\n", " self.data_src2, \n", " plane_orientation='x_axes', slice_index=self.Nx//2,\n", " figure=self.scene2.mayavi_scene)\n", "\n", " \n", " #mlab.pipeline.image_plane_widget(\n", " # self.data_src.mlab_source.dataset, plane_orientation='y_axes', slice_index=self.Ny//2)\n", " \n", " #mlab.pipeline.image_plane_widget(\n", " # self.data_src, plane_orientation='x_axes', slice_index=10)\n", " #mlab.pipeline.image_plane_widget(\n", " # self.data_src, plane_orientation='y_axes', slice_index=10)\n", "\n", "\n", " # When the scene is activated, or when the parameters are changed, we\n", " # update the plot.\n", " @api.on_trait_change('frame')\n", " def update_plot(self):\n", " self.data_src.mlab_source.set(scalars=abs(self.data.psi)**2)\n", " self.data_src2.update()\n", "\n", " # The layout of the dialog created\n", " view = uapi.View(\n", " uapi.Item('scene', editor=SceneEditor(scene_class=MayaviScene),\n", " height=250, width=300, show_label=False),\n", " uapi.Item('scene2', editor=SceneEditor(scene_class=MayaviScene),\n", " height=250, width=300, show_label=False),\n", " uapi.Group(\n", " '_', 'frame',\n", " ),\n", " resizable=True,\n", " )\n", "\n", "my_model = MyModel()\n", "my_model.configure_traits()" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Process is terminated.\n" ] } ], "source": [ "%%script /data/apps/anaconda/1.3.1/python.app/Contents/MacOS/python\n", "import numpy as np\n", "import h5py\n", "from tvtk.api import tvtk\n", "from mayavi import mlab\n", "\n", "grid = tvtk.RectilinearGrid()\n", "with h5py.File('vortex.hd5') as f:\n", " grid.x_coordinates = np.ravel(f['x'])\n", " grid.y_coordinates = np.ravel(f['y'])\n", " grid.z_coordinates = np.ravel(f['z'])\n", "\n", "def set_frame(frame, grid=grid):\n", " with h5py.File('vortex.hd5') as f:\n", " psi = np.asarray(f['psis'][frame])\n", " grid.point_data.scalars = abs(psi).ravel()\n", " grid.point_data.scalars.name = 'density'\n", " grid.dimensions = psi.shape\n", "\n", "set_frame(0)\n", "mlab.pipeline.iso_surface(grid)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from tvtk.api import tvtk\n", "tvtk.ImageData?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import mayavi\n", "import mayavi.mlab as mlab" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [default]", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" }, "nikola": { "date": "2014-03-24 02:44:58 UTC-07:00", "description": "", "link": "", "slug": "mayavi", "tags": "", "title": "MayaVi", "type": "text" }, "toc": { "colors": { "hover_highlight": "#DAA520", "running_highlight": "#FF0000", "selected_highlight": "#FFD700" }, "moveMenuLeft": true, "nav_menu": { "height": "102px", "width": "252px" }, "navigate_menu": true, "number_sections": true, "sideBar": true, "threshold": 4, "toc_cell": true, "toc_section_display": "block", "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 0 }