Documentation/Labs/IPython

From Slicer Wiki
Revision as of 17:54, 23 June 2014 by JChris.FillionR (talk | contribs) (Created page with ' == In iPython == '''Important: The example below was developed for an early beta version of slicer4 and is not supported in Slicer 4.0 or 4.1''' See [http://slicer-devel.65872…')
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
Home < Documentation < Labs < IPython

In iPython

Important: The example below was developed for an early beta version of slicer4 and is not supported in Slicer 4.0 or 4.1

See this thread for information on adapting this approach to Slicer 4.1.


iPython is a powerful shell and can also be used to access the vtk and slicer APIs (but not Qt at the moment).

As of Slicer4 beta in February 2011, it is possible to use these steps for installation. This has only been tested on a ubuntu linux system so far.

These instructions assume you have a Slicer4-superbuild directory created according to the Slicer4 Build Instructions.

See the [1] website for more example plot types.

Prerequisites

  • Get readline - it will make iPython more useful.
# do this before building slicer4 - or do "cd Slicer4-superbuild/; rm -rf python* ; make"
sudo apt-get install libreadline6-dev

cd to your Slicer4-superbuild directory for the rest of these steps

  • Install the vtk package in the python tree
# TODO: this should be done in superbuild script
(cd ./VTK-build/Wrapping/Python;  ../../../Slicer-build/Slicer4 --launch ../../../python-build/bin/python setup.py install)
  • Install ipython:
git clone git://github.com/ipython/ipython.git
(cd ./ipython; git checkout 0.10.2)
(cd ./ipython;  ../Slicer-build/Slicer4 --launch ../python-build/bin/python setup.py install)
  • Install matplotlib (remove the source after installing so python import will not get confused by it.)
git clone git://github.com/pieper/matplotlib.git
(cd ./matplotlib;  ../Slicer-build/Slicer4 --launch ../python-build/bin/python setup.py install)
rm -rf matplotlib

Now try it!

python plotting from ipython using slicer libraries

Launch an xterm with all the paths set correctly to find the slicer python packages

./Slicer-build/Slicer4 --launch xterm &

Now, inside the xterm launch ipython

./python-build/bin/ipython

Inside ipython you can past the following script that does:

  • create a mrml scene and add a volume
  • make a numpy aray from the image data
  • do calculations in numpy and vtk for comparision
  • make a histogram plot of the data



import vtk
import slicer
mrml = slicer.vtkMRMLScene()
vl = slicer.vtkSlicerVolumesLogic()
vl.SetAndObserveMRMLScene(mrml)
n = vl.AddArchetypeVolume('../Slicer4/Testing/Data/Input/MRHeadResampled.nhdr', 'CTC')
i = n.GetImageData()
print (i.GetScalarRange())

import vtk.util.numpy_support
a = vtk.util.numpy_support.vtk_to_numpy(i.GetPointData().GetScalars())
print(a.min(),a.max())

import matplotlib
import matplotlib.pyplot
n, bins, patches = matplotlib.pyplot.hist(a, 50, facecolor='g', alpha=0.75)
matplotlib.pyplot.show()

If all goes well, you should see an image like the one shown here.

Parallel Processing

In the shell, run this to install joblib

wget http://pypi.python.org/packages/source/j/joblib/joblib-0.4.6.dev.tar.gz
tar xvfz joblib-0.4.6.dev.tar.gz
(cd ./joblib-0.4.6.dev;  ../Slicer-build/Slicer4 --launch ../python-build/bin/python setup.py install)

Then in ipython you can run this example:

from joblib import *
from math import *
for jobs in xrange(1,8):
  print (jobs, Parallel(n_jobs=jobs)(delayed(sqrt)(i**2) for i in range(10000))[-1])

Packaging/Saving Scenes

A basic example. The following packages all of the scene's referenced files into one specified folder. All images, csvs, volumes, etc. (everything except the scene .mrml) are copied into the folder "<package dir>/data." The scene .mrml is in the "<package dir>" directory.

import os 
# Library for OS specific routines

tempDir = os.path.join(slicer.app.slicerHome, ‘testScene’) 
# Put our temp scene directory into the slicer directory.  os.path.join takes care of slash issues that you may encounter with UNIX-Windows compatibility.    

os.mkdir(tempDir) 
l = slicer.app.applicationLogic()
l.SaveSceneToSlicerDataBundleDirectory(tempDir, None)

Loading DICOM Sets

The approach is to point Slicer's DICOM database to the directory of the new files. The command appends the existing database with the files found in the inputted directory.

i = ctk.ctkDICOMIndexer()
i.addDirectory(slicer.dicomDatabase, '/yourDICOMdir/')

One approach to begin the load process is to call on the DICOM module, which will automatically open the "DICOM Details" popup. However, if the popup has been used already in the current Slicer session, a refresh may not occur and a restart may be required.

m = slicer.util.mainWindow()
m.moduleSelector().selectModule('DICOM')