NA-MIC National Alliance for Medical Image Computing Slicer 2.x Architecture Steve Pieper, PhD.

42
NA-MIC National Alliance for Medical Image Computing http://na-mic.org Slicer 2.x Architecture Steve Pieper, PhD

description

National Alliance for Medical Image Computing Mrml Data Model Tree-structured scene description –Accessible as Mrml(dataTree) Serialized to XML file Compiled to VTK class instances in memory for display and manipulation

Transcript of NA-MIC National Alliance for Medical Image Computing Slicer 2.x Architecture Steve Pieper, PhD.

Page 1: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

NA-MICNational Alliance for Medical Image Computing http://na-mic.org

Slicer 2.x Architecture

Steve Pieper, PhD

Page 2: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Overall Goals• Data Model

– Mrml Tree– Mrml Nodes– Mrml Data

• Module Architecture– Flow of Control, Startup Sequence– Standard Developer Widgets– GUI Modules– Editor Modules– I/O Modules

• Writing Custom Modules

Page 3: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Mrml Data Model

• Tree-structured scene description– Accessible as Mrml(dataTree)

• Serialized to XML file• Compiled to VTK class instances in

memory for display and manipulation

Page 4: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Mrml http://www.slicer.org/mrml

Page 5: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Mrml XML<?xml version="1.0" standalone='no'?><!DOCTYPE MRML SYSTEM "mrml20.dtd"><MRML><Transform> <Matrix name='manual' matrix='1 0 0 -3 0 1 0 -12 0 0 1 28 0 0 0 1'></Matrix> <Volume name='SPGR' filePattern='%s.%03d' filePrefix='spgr/I' rasToIjkMatrix='0 -1.06667 0 142.187

0 0 -1.06667 98.1333 0.666667 0 0 59.9667 0 0 0 1' rasToVtkMatrix='0 -1.06667 0 142.187 0 0 1.06667 157.867 0.666667 0 0 59.9667 0 0 0 1' positionMatrix='0 0 1 -89.95 -1 0 0 133.3 0 1 0 -148 0 0 0 1' description='LR' colorLUT='0' window='146' level='76' applyThreshold='yes' lowerThreshold='17' upperThreshold='355' imageRange='1 124'></Volume>

</Transform>

<Volume name='all' filePattern='%s.%03d' filePrefix='labels/all' rasToIjkMatrix='0 -1.06667 0 128 0 0 -1.06667 128 0.666667 0 0 62 0 0 0 1' rasToVtkMatrix='0 -1.06667 0 128 0 0 1.06667 128 0.666667 0 0 62 0 0 0 1' positionMatrix='0 0 1 -93 -1 0 0 120 0 1 0 -120 0 0 0 1' description='LR' colorLUT='-1' labelMap='yes' interpolate='no' window='4' level='1' lowerThreshold='0' upperThreshold='0' imageRange='1 124'></Volume>

<Model name='Skin' fileName='models/Skin.vtk' color='Skin' visibility='yes'></Model><Model name='Ventricles' fileName='models/Ventricles.vtk' color='Ventricles' visibility='yes'></Model><Model name='Vessels' fileName='models/Vessels.vtk' color='Vessels' visibility='yes'></Model></MRML>

Page 6: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Mrml XML

• Describes the data as it exists on disk

• Composes the scene by positioning data elements

• Retains visualization and other state parameters

Page 7: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Data Model – the Mrml Tree

• Mrml Tree is an in-memory data description corresponding to the mrml xml file– vtkMrmlNode subclasses contain the

metadata– Mapping of metadata to run-time state is

managed mainly in Tcl– vtkMrmlData subclasses are helpers for

classes that need C++ help to efficiently manage runtime state

Page 8: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

vtkMrmlNode

Page 9: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Mrml Nodes• vtkMrmlNode abstract base class

– int ID;– char *Description;– char *Options;– char *Name;– char *Title;– virtual void Write(ofstream& of, int indent);

• IsA vtkObject• Can be subclassed in run time loadable

Modules

Page 10: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

vtkMrmlModelNode• vtkMrmlModelNode Example Instance Variables

// Stringschar *ModelID;char *FileName;char *FullFileName;char *Color;

// Numbersfloat Opacity;

// Booleansint Visibility;int Clipping;int BackfaceCulling;int ScalarVisibility;

Page 11: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

vtkMrmlModelNode - methodsvtkMrmlModelNode -- Example Methods SetModelID with 1 arg GetModelID SetFileName with 1 arg GetFileName SetFullFileName with 1 arg GetFullFileName SetColor with 1 arg GetColor SetOpacity with 1 arg GetOpacity VisibilityOn VisibilityOff GetVisibility SetVisibility with 1 arg ClippingOn ClippingOff GetClipping SetClipping with 1 arg BackfaceCullingOn BackfaceCullingOff GetBackfaceCulling SetBackfaceCulling with 1 arg ScalarVisibilityOn ScalarVisibilityOff GetScalarVisibility SetScalarVisibility with 1 arg

Page 12: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

vtkMrmlModelNode DTD• XML Representation Example:

<Model name='Skin' fileName='models/Skin.vtk' color='Skin' visibility='yes'></Model>

• DTD entry from Base/tcl/mrml20.dtd:<!ELEMENT Model (#PCDATA | Fiducials)><!ATTLIST Model name NMTOKEN "" fileName CDATA #REQUIRED color NMTOKEN "" description CDATA "" opacity NMTOKEN "1.0" visibility (yes | no) "yes" clipping (yes | no) "no" backfaceCulling (yes | no) "yes" scalarVisibility (yes | no) "no" ignore (yes | no) "no" scalarRange NMTOKENS "0 100">

Page 13: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Example Slicer Control Flow

Event Manager

User

Module

MainUpdateMRML

VTK Visualization

1

2

3

4

5ModuleModuleModules

6

Page 14: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

How Mrml Files are Read• MainMrmlReadVersion2.x

– In Base/tcl/tcl-main/Parse.tcl– Reads xml file and returns tcl list of nodes and

values• MainMrmlBuildTreesVersion2.0

– In Base/tcl/tcl-main/MainMrml.tcl– Converts list into vtkMrmlTree and

vtkMrmlNode instances– Modules can define

Module($m,procMRMLLoad) to extend Mrml

Page 15: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Editing the MrmlTree Examples

• MainMrmlAddNode <nodeType>– Creates a new vtkMrmlNode instance and adds it to

Mrml(dataTree) and returns nodeId– Use vtkMrmlNode methods to set data

• Mrml(dataTree) RemoveItem $node– Remove a node

• Mrml(dataTree) InsertAfterItem $nodeBefore $node– Add your new node to specific spot in the hierarchy

• DevCreateNewCopiedVolume <OrigId> {Description ""} { VolName ""}– Create a copy node of existing volume with optional

new name and description

Page 16: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Compiling the Mrml Tree• MainUpdateMRML

– In Base/tcl/tcl-main/Main.tcl– Is called after read or after changes to the

Mrml Tree– Invokes Main*UpdateMRML

• Models, Volumes, etc• Instances VTK classes, reads data, changes render

properties, etc to make scene match the MRML Tree

• Keeps Dev* GUI elements in sync with Tree and Selections

– Invokes Modules($m,procMRML) for each Module

Page 17: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Rendering

• To make the newly updated data visible to the user:– Render3D

• Redraw just the 3D view

– RenderSlice <s>• Redraw slice view 0, 1, or 2

– RenderSlices• Redraw all slice views

– RenderAll• Redraw 3D and Slices

Page 18: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Iterating Through the Mrml Tree

set nitems [Mrml(dataTree) GetNumberOfItems]for {set widx 0} {$widx < $nitems} {incr widx} { set item [Mrml(dataTree) GetNthItem $widx] puts “$item is a [$item GetClassName]”}

Page 19: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Overall Module Goals• Allow Independent Development of Run-Time

Loadable Modules– Enforce code independence– Allow modules delivered under different licenses– Support development outside of main cvs prior to code

sharing• The SLICER_MODULES environment variable

– Space-separated list of directories containing slicer module directory trees

– Used by cmaker, launch, and tarup– Allows you to keep your own code in a distinct cvs

repository/working directory, but integrate with build and distribution scripts

Page 20: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Execution Environment

• Slicer runs inside a VTK Tcl/Tk shell– Uses the vtk executable that gets built when

Tcl wrapping is enabled for the VTK build (or the wish84.exe shell on Windows)

– vtkSlicerBase is a tcl package that gets pulled in at run time

– Each Module is a tcl package– Note that vtkSlicerBase and the Modules can

be wrapped for other languages if desired (python, java)

Page 21: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

What is a Module?

• C++ code (optional)– VTK Subclasses– ITK Subclasses– Extra Helper code (GSL, OpenGL, etc)

• Tcl code– Application Logic– User Interface Code

Page 22: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Tcl Packages / Modules• Includes Tcl code to be interpreted• Includes compiled C++ code as a shared library

(optional) – Can reference and subclass C++ classes from other packages

• Package path that can be used to find module-specific logos, data, etc

3D Slicer ApplicationSlicer Base Module 1 Module N…VTK TclOpenGL Window System

Computer Hardware

Tcl packages

Page 23: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Directory Organization• Modules/vtk<ModuleName>

– cxx• CMakeListsLocal.txt lists the source files plus custom

build directives– tcl

• <ModuleName>.tcl has standard slicer entry points– builds

• Platform specific binary directories– Wrapping

• Standard tcl/java/python wrapping support– data

• Additional files your module needs (will be included in distribution by tarup.tcl)

Page 24: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Flow of Control Outline

• Base/tcl/Go.tcl is main entry point– Parse command line args– Starts tkcon console– Load vtkSlicerBase and all module

packages• Uses tcl ‘package require’ command

– Run MainBoot

Page 25: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Anatomy of A Module• See

Modules/vtkCustomModule/tcl/@[email protected] – For example, Custom

• CustomInit– Analogous to a Constructor

• CustomBuildGUI• CustomEnter / CustomExit

– When user module pane is visible/hidden• Custom*

– Any other “Methods” for the Module– These procs Edit the MrmlTree and call

MainUpdateMRML and Render

Page 26: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

The Shared Dev* Procs• Base/tcl/tcl-shared/Developer.tcl

– Interact with MrmlTree– Use standard look and feel conventions

• DevAddSelectButton– Automatically updating popup menu for Volumes, Models, etc – Adds entries when objects are created

• DevUpdateNodeSelectButton – Updates to currently selected

• DevAddButton• DevAddLabel• DevAddFileBrowse• DevInfoWindow, DevErrorWindow, DevWarningWindow…• Etc…

Page 27: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Event Management

• The <Module>Enter and <Module>Exit procs can be used to set up custom mouse/keyboard bindings

• Base/tcl/tcl-shared/Events.tcl– pushEventManager / popEventManager – Arguments are list of:

• Widget, event, callback

Page 28: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Event Example

In EMSegmentInit: foreach s $Slice(idList) { set widget $Gui(fSl${s}Win) append EMSegment(eventManager) " \ {$widget <Control-Button-1> {EMSegmentBindingCallback Sample %x %y}}” }

In EMSegmentEnter: pushEventManager $EMSegment(eventManager)

In EMSegmentExit: pushEventManager $EMSegment(eventManager)

Page 29: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Event Example (continued)

EMSegmentBindingCallback calls EMSegmentReadGreyValue $x $y 1

In EMSegmentReadGreyValue: set s $Interactor(s) ;# get the slice window where user clicked scan [MainInteractorXY $s $x $y] "%d %d %d %d" xs ys x y ;# convert to pixels Slicer SetReformatPoint $s $x $y scan [Slicer GetIjkPoint] "%g %g %g" xIjk yIjk zIjk ;# convert to array coords set xIjk [expr int($xIjk)] set yIjk [expr int($yIjk)] set zIjk [expr int($zIjk)]

# get the pixel data from the volume set ImageData [Volume($v,vol) GetOutput] set pixel [$ImageData GetScalarComponentAsDouble $xIjk $yIjk $zIjk 0]

Page 30: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Progress Bar

• Progress Bar on Lower part of slicer control window

• For a vtkProcessObject instance X x AddObserver StartEvent MainStartProgress x AddObserver ProgressEvent "MainShowProgress x" x AddObserver EndEvent MainEndProgress

Page 31: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Fiducials Exampleproc intensities {vol} { # Note: does not account for any transforms applied to Volume catch "m Delete" vtkMatrix4x4 m eval m DeepCopy [Volume($vol,node) GetRasToVtkMatrix]

set ids [FiducialsGetPointIdListFromName default] foreach id $ids { set pt [eval m MultiplyPoint [FiducialsGetPointCoordinates $id] 1] set i [expr int([lindex $pt 0])] set j [expr int([lindex $pt 1])] set k [expr int([lindex $pt 2])] set imageData [Volume($vol,vol) GetOutput] set pixel [$imageData GetScalarComponentAsDouble $i $j $k 0] puts "fiducial $id value $pixel at $i $j $k" }}

Page 32: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Reader Modules Motivation

• vtkMrmlVolumeNodes can be created by – User Interface– Reading in XML File– Programmatically

• Once the Node exists, the reader proc provides the vtkImageData when called by MainUpdateMRML

Page 33: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Reader Modules• Managed by Base/tcl/tcl-modules/Volumes.tcl• ReaderModule needs an entry point proc named

Vol<type>Init– For example: VolGenericInit– This will be invoked by VolumesInit

• ReaderModule sets – Volume(readerModules,<type>,procGUI)

• to fill in type-specific controls as sub-pane of Volumes Modules

– Module(Volumes,readerProc,<type>)• so that MainUpdateMRML has a hook to call the reader

when <type> if found in the FileType attribute of a vtkMrmlVolumeNode

Page 34: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Editor Modules Motivation

• The Editor manages manually guided segmentation of a – source volume into a working labelmap

• Editor Modules add to the palette of tools

• Ed(editor) is an instance of vtkImageEditorEffects– Allows you to apply a filtering pipeline

to modify the labelmap

Page 35: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Editor Modules• Similar to Readers, these are managed by

Base/tcl/tcl-modules/Editor.tcl• Editor Module needs an entry point proc named Ed<type>Init

– For example: EdWatershedInit– This will be invoked by EditorInit

• EditorModule sets – Ed(<type>,procGUI)

• to fill in type-specific controls on the this editor type’s own subframe of the editor

• Segmentation is done In the UI control callbacks– Create a vtk (or vtkITK-based) processing pipeline of

vtkImageToImageFilter subclasses – Set parameters from UI elements or Slicer data such as Fiducial

locations– call Ed(editor) Apply <pipeline start> <pipeline end>– Ed(editor) manages progress bar, updating label map, undo (single)

Page 36: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Conclusions

• Slicer provides a usable and extensible application framework for medical image computing research

• A significant base code provides a reference for many common coding tasks and user interface paradigms

Page 37: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Resources

• www.slicer.org• www.na-mic.org/Wiki• www.na-mic.org/Bug• www.na-mic.org/Testing• [email protected][email protected]

Page 38: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

NA-MICNational Alliance for Medical Image Computing http://na-mic.org

Slicer Architecture SupplementAdding A New View OptionNicole Aucoin

Page 39: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Adding a new option example

To add a new View option, X, to the Scene Options node so can save and restore it via Mrml file:

• cxx/vtkMrmlSceneOptionsNode.h– add vtkGet/SetStringMacros(ViewX)– declare char *ViewX

• cxx/vtkMrmlSceneOptionsNode.cxx– Add ViewX in constructor, Write, Copy,

PrintSelf

Page 40: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Adding a new option, con’t

• tcl/tcl-main/MainView.tcl– MainViewInit: add to Module(View,presets)

list, set View(X) to same default value. – Add a new proc MainViewSetX, with default

arg set to default value– MainViewStorePresets: add setting X's Preset

from current value– MainViewRecallPresets: add setting X from

preset value

Page 41: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Adding a new option, con’t

• tcl/tcl-main/MainOptions.tcl– MainOptionsRetrievePresetValues: set

Preset(View,n,X) from the node– MainOptionsUnparsePresets: set the

node's X from the Preset

Page 42: NA-MIC National Alliance for Medical Image Computing  Slicer 2.x Architecture Steve Pieper, PhD.

National Alliance for Medical Image Computing http://na-mic.org

Adding a new option, con’t

• tcl/tcl-main/MainMrml.tcl:– MainMrmlBuildTreesVersion2.0: add to

parsing of SceneOptions node, refer to vtkMrmlSceneOptionsNode C++ code