Precomputed forward model results

We provide precomputed fluence and sensitivity files for the example datasets. These are created by this notebook and can be obtained through cedalion.data.get_precomputed_sensitivity.

The second part of the notebook visualizes the currently available sensitivities.

[1]:
# This cells setups the environment when executed in Google Colab.
try:
    import google.colab
    !curl -s https://raw.githubusercontent.com/ibs-lab/cedalion/dev/scripts/colab_setup.py -o colab_setup.py
    # Select branch with --branch "branch name" (default is "dev")
    %run colab_setup.py
except ImportError:
    pass
[2]:
# set to true, to actually compute fluence and sensitivity files
RUN_COMPUTATION = False
[3]:
import pyvista as pv
pv.set_jupyter_backend('static')

from functools import lru_cache
import os
from pathlib import Path

import xarray as xr

import cedalion.data
import cedalion.dot as dot
from cedalion.io.forward_model import FluenceFile, load_Adot
from cedalion.vis.anatomy import sensitivity_matrix

xr.set_options(display_expand_data=False);
[4]:
def compute_fluence_mcx(geo3d_snapped_ijk, meas_list, head, output_file):
    fwm = dot.ForwardModel(
        head, geo3d_snapped_ijk, meas_list
    )

    fwm.compute_fluence_mcx(output_file)


def compute_sensitivity(geo3d_snapped_ijk, meas_list, head, fluence_fname, sensitivity_fname):
    fwm = dot.ForwardModel(
        head, geo3d_snapped_ijk, meas_list
    )

    fwm.compute_sensitivity(fluence_fname, sensitivity_fname)


def get_fnirs_dataset(dataset):
    if dataset == "fingertappingDOT":
        rec = cedalion.data.get_fingertappingDOT()
        return rec.geo3d, rec._measurement_lists["amp"]
    elif dataset == "fingertapping":
        rec = cedalion.data.get_fingertapping()
        return rec.geo3d, rec._measurement_lists["amp"]
    elif dataset == "nn22_resting":
        rec = cedalion.data.get_nn22_resting_state()
        return rec.geo3d, rec._measurement_lists["amp"]
    elif dataset == "ninja_cap_56x144":
        geo3d, landmarks, meas_list = cedalion.data.get_ninja_cap_probe()
        geo3d = xr.concat((geo3d, landmarks), dim="label")
        geo3d = geo3d.pint.quantify("mm")
        return geo3d, meas_list
    elif dataset == "ninja_uhd_cap_164x496":
        geo3d, landmarks, meas_list = cedalion.data.get_ninja_uhd_cap_probe()
        geo3d = xr.concat((geo3d, landmarks), dim="label")
        geo3d = geo3d.pint.quantify("mm")
        return geo3d, meas_list

def snap(head, geo3d, dataset):
    if dataset in ["fingertapping", "fingertappingDOT"]:
        # right handed; too few fiducials
        geo3d_snapped_ijk = head.align_and_snap_to_scalp(
            geo3d, mode="trans_rot_isoscale"
        )
    elif dataset in ["nn22_resting", "ninja_cap_56x144", "ninja_uhd_cap_164x496"]:
        # left handed
        geo3d_snapped_ijk = head.align_and_snap_to_scalp(geo3d, mode="general")

    return geo3d_snapped_ijk


def plot_sensitivity(dataset, headmodel, Adot=None):
    sensitivity_fname = f"sensitivity_{dataset}_{headmodel}.nc"

    if Adot is None:
        Adot = load_Adot(sensitivity_fname)

    head = cedalion.dot.get_standard_headmodel(headmodel)

    geo3d, meas_list = get_fnirs_dataset(dataset)
    geo3d_snapped_ijk = snap(head, geo3d, dataset)

    plotter = sensitivity_matrix.Main(
        sensitivity=Adot,
        brain_surface=head.brain,
        head_surface=head.scalp,
        labeled_points=geo3d_snapped_ijk,
    )
    plotter.plot(high_th=0, low_th=-3)
    plotter.plt.show()

def compute_fluence_and_sensitivity(dataset : str, headmodel : str):
    geo3d, meas_list = get_fnirs_dataset(dataset)
    head = cedalion.dot.get_standard_headmodel(headmodel)

    geo3d_snapped_ijk = snap(head, geo3d, dataset)

    fluence_fname = f"fluence_{dataset}_{headmodel}.h5"
    sensitivity_fname = f"sensitivity_{dataset}_{headmodel}.nc"

    if not Path(fluence_fname).exists():
        print(f"computing fluence for {dataset} {headmodel}")
        compute_fluence_mcx(geo3d_snapped_ijk, meas_list, head, fluence_fname)
    else:
        print(f"fluence for {dataset} {headmodel} exists")
    if not Path(sensitivity_fname).exists():
        print(f"computing sensitivity for {dataset} {headmodel}")
        compute_sensitivity(geo3d_snapped_ijk, meas_list, head, fluence_fname, sensitivity_fname)
    else:
        print(f"sensitivity for {dataset} {headmodel} exists")
[5]:
if RUN_COMPUTATION:
    for dataset in [
        "fingertapping",
        "fingertappingDOT",
        "nn22_resting",
        "ninja_cap_56x144",
        "ninja_uhd_cap_164x496",
    ]:
        for headmodel in ["colin27", "icbm152"]:
            compute_fluence_and_sensitivity(dataset, headmodel)
            plot_sensitivity(dataset, headmodel)

Visualize precomputed sensitivities

[6]:
for dataset in ["fingertapping", "fingertappingDOT", "nn22_resting", "ninja_cap_56x144", "ninja_uhd_cap_164x496"]:
        for headmodel in ["colin27", "icbm152"]:
            display(f"{dataset=} {headmodel=}")
            Adot = cedalion.data.get_precomputed_sensitivity(dataset, headmodel)
            plot_sensitivity(dataset, headmodel, Adot)
"dataset='fingertapping' headmodel='colin27'"
Downloading file 'sensitivity_fingertapping_colin27.nc' from 'https://doc.ibs.tu-berlin.de/cedalion/datasets/dev/sensitivity_fingertapping_colin27.nc' to '/home/runner/.cache/cedalion/dev'.
../../_images/examples_head_models_46_precompute_fluence_7_2.png
"dataset='fingertapping' headmodel='icbm152'"
Downloading file 'sensitivity_fingertapping_icbm152.nc' from 'https://doc.ibs.tu-berlin.de/cedalion/datasets/dev/sensitivity_fingertapping_icbm152.nc' to '/home/runner/.cache/cedalion/dev'.
../../_images/examples_head_models_46_precompute_fluence_7_5.png
"dataset='fingertappingDOT' headmodel='colin27'"
../../_images/examples_head_models_46_precompute_fluence_7_7.png
"dataset='fingertappingDOT' headmodel='icbm152'"
../../_images/examples_head_models_46_precompute_fluence_7_9.png
"dataset='nn22_resting' headmodel='colin27'"
../../_images/examples_head_models_46_precompute_fluence_7_11.png
"dataset='nn22_resting' headmodel='icbm152'"
Downloading file 'sensitivity_nn22_resting_icbm152.nc' from 'https://doc.ibs.tu-berlin.de/cedalion/datasets/dev/sensitivity_nn22_resting_icbm152.nc' to '/home/runner/.cache/cedalion/dev'.
../../_images/examples_head_models_46_precompute_fluence_7_14.png
"dataset='ninja_cap_56x144' headmodel='colin27'"
Downloading file 'sensitivity_ninja_cap_56x144_colin27.nc' from 'https://doc.ibs.tu-berlin.de/cedalion/datasets/dev/sensitivity_ninja_cap_56x144_colin27.nc' to '/home/runner/.cache/cedalion/dev'.
../../_images/examples_head_models_46_precompute_fluence_7_17.png
"dataset='ninja_cap_56x144' headmodel='icbm152'"
Downloading file 'sensitivity_ninja_cap_56x144_icbm152.nc' from 'https://doc.ibs.tu-berlin.de/cedalion/datasets/dev/sensitivity_ninja_cap_56x144_icbm152.nc' to '/home/runner/.cache/cedalion/dev'.
../../_images/examples_head_models_46_precompute_fluence_7_20.png
"dataset='ninja_uhd_cap_164x496' headmodel='colin27'"
Downloading file 'sensitivity_ninja_uhd_cap_164x496_colin27.nc' from 'https://doc.ibs.tu-berlin.de/cedalion/datasets/dev/sensitivity_ninja_uhd_cap_164x496_colin27.nc' to '/home/runner/.cache/cedalion/dev'.
../../_images/examples_head_models_46_precompute_fluence_7_23.png
"dataset='ninja_uhd_cap_164x496' headmodel='icbm152'"
Downloading file 'sensitivity_ninja_uhd_cap_164x496_icbm152.nc' from 'https://doc.ibs.tu-berlin.de/cedalion/datasets/dev/sensitivity_ninja_uhd_cap_164x496_icbm152.nc' to '/home/runner/.cache/cedalion/dev'.
../../_images/examples_head_models_46_precompute_fluence_7_26.png

References

[7]:
cedalion.bib.dump_to_notebook()

Methods used

[1]Fang2009cedalion.data.get_precomputed_sensitivityQianqian Fang and David A Boas. Monte carlo simulation of photon migration in 3d turbid media accelerated by graphics processing units. Optics express, 17(22):20178–20190, 2009. doi:10.1364/OE.17.020178.
[2]Yu2018cedalion.data.get_precomputed_sensitivityLeiming Yu, Fanny Nina-Paravecino, David Kaeli, and Qianqian Fang. Scalable and massively parallel monte carlo photon transport simulations for heterogeneous computing platforms. Journal of biomedical optics, 23(1):010504–010504, 2018. doi:10.1117/1.JBO.23.1.010504.
[3]Yan2020cedalion.data.get_precomputed_sensitivityShijie Yan and Qianqian Fang. Hybrid mesh and voxel based monte carlo algorithm for accurate and efficient photon transport modeling in complex bio-tissues. Biomedical Optics Express, 11(11):6262–6270, 2020. doi:10.1364/BOE.409468.
[4]Holmes1998cedalion.data.get_colin27_headmodel_filesColin J. Holmes, Rick Hoge, Louis Collins, Roger Woods, Arthur W. Toga, and Alan C. Evans. Enhancement of mr images using registration for signal averaging. Journal of Computer Assisted Tomography, 22(2):324–333, March 1998. doi:10.1097/00004728-199803000-00032.
[5]Fischl2012cedalion.data.get_colin27_headmodel_files, cedalion.data.get_icbm152_headmodel_filesBruce Fischl. FreeSurfer. NeuroImage, 62(2):774–781, 2012. doi:10.1016/j.neuroimage.2012.01.021.
[6]Schaefer2018cedalion.data.get_colin27_headmodel_files, cedalion.data.get_icbm152_headmodel_filesAlexander Schaefer, Ru Kong, Evan M Gordon, Timothy O Laumann, Xi-Nian Zuo, Avram J Holmes, Simon B Eickhoff, and BT Thomas Yeo. Local-global parcellation of the human cerebral cortex from intrinsic functional connectivity mri. Cerebral cortex, 28(9):3095–3114, 2018. doi:10.1093/cercor/bhx179.
[7]Luke2021cedalion.data.get_fingertappingRobert Luke and David McAlpine. fNIRS Finger Tapping Data in BIDS Format. September 2021. doi:10.5281/zenodo.5529797.
[8]Tucker2022cedalion.io.snirf.read_snirfStephen Tucker, Jay Dubb, Sreekanth Kura, Alexander von Lühmann, Robert Franke, Jörn M. Horschig, Samuel Powell, Robert Oostenveld, Michael Lührs, Édouard Delaire, Zahra M. Aghajan, Hanseok Yun, Meryem A. Yücel, Qianqian Fang, Theodore J. Huppert, Blaise deB. Frederick, Luca Pollonini, David A. Boas, and Robert Luke. Introduction to the shared near infrared spectroscopy format. Neurophotonics, 10(1):013507, 2022. doi:10.1117/1.NPh.10.1.013507.
[9]Fonov2011cedalion.data.get_icbm152_headmodel_filesVladimir Fonov, Alan C. Evans, Kelly Botteron, C. Robert Almli, Robert C. McKinstry, and D. Louis Collins. Unbiased average age-appropriate atlases for pediatric studies. NeuroImage, 54(1):313–327, January 2011. doi:10.1016/j.neuroimage.2010.07.033.