Tracts¶

Diffusion-weighted imaging can be used to infer fiber bundles. NiiVue can display these streamlines. This notebook mirrors this JavaScript web page

In [1]:
import ipywidgets as widgets
from ipyniivue import NiiVue, SliceType

nv = NiiVue(show_3d_crosshair=True, back_color=(0.8, 0.8, 1, 1))
nv.opts.is_colorbar = True
nv.set_slice_type(SliceType.RENDER)
nv.set_clip_plane(-0.1, 270, 0)

nv.load_volumes([{"path": "../images/mni152.nii.gz"}])
    
nv.load_meshes([{"path": "../images/dpsv.trx", "rgba255": [0, 142, 0, 255]},])

nv.meshes[0].colormap = "blue"
nv.meshes[0].rgba255 = (0, 255, 255, 255)

## Create sliders and dropdowns

radius_slider = widgets.IntSlider(
    value=0,
    min=0,
    max=20,
    description="Radius",
)

length_slider = widgets.IntSlider(
    value=3,
    min=1,
    max=80,
    description="Length",
)

dither_slider = widgets.IntSlider(
    value=1,
    min=0,
    max=10,
    description="Dither",
)

fiber_coloration_options = [
    ("Global direction", "Global"),
    ("Local direction", "Local"),
    ("Fixed", "Fixed"),
    ("First Per Vertex Type (if available)", "DPV0"),
    ("First Per Streamline Type (if available)", "DPS0"),
]
fiber_color_dropdown = widgets.Dropdown(
    options=fiber_coloration_options,
    value="Global",
    description="Fiber Coloration:",
    style={"description_width": "initial"}
)

fiber_reduction_options = [("100%", 1), ("50%", 2), ("25%", 4), ("10%", 10)]
fiber_reduction_dropdown = widgets.Dropdown(
    options=fiber_reduction_options,
    value=1,
    description="Fiber Reduction",
    style={"description_width": "initial"}
)

## Set up callbacks

def on_radius_change(change):
    """Set fiber radius."""
    nv.set_mesh_property(nv.meshes[0].id, "fiber_radius", change["new"] * 0.1)

radius_slider.observe(on_radius_change, names="value")

def on_length_change(change):
    """Set fiber length."""
    nv.set_mesh_property(nv.meshes[0].id, "fiber_length", change["new"])

length_slider.observe(on_length_change, names="value")

def on_dither_change(change):
    """Set fiber dither."""
    nv.set_mesh_property(nv.meshes[0].id, "fiber_dither", change["new"] * 0.1)

dither_slider.observe(on_dither_change, names="value")

def on_fiber_color_change(change):
    """Set fiber color."""
    nv.set_mesh_property(nv.meshes[0].id, "fiber_color", change["new"])

fiber_color_dropdown.observe(on_fiber_color_change, names="value")

def on_fiber_reduction_change(change):
    """Set fiber decimation stride."""
    nv.set_mesh_property(nv.meshes[0].id, "fiber_decimation_stride", change["new"])


fiber_reduction_dropdown.observe(on_fiber_reduction_change, names="value")

## Display all

controls = widgets.VBox(
    [
        radius_slider,
        length_slider,
        dither_slider,
        fiber_color_dropdown,
        fiber_reduction_dropdown,
    ]
)

widgets.VBox(
    [
        controls,
        nv,
    ]
)
Out[1]:
In [ ]: