# Copyright (C) 2009-2022, Ecole Polytechnique Federale de Lausanne (EPFL) and
# Hospital Center and University of Lausanne (UNIL-CHUV), Switzerland, and CMP3 contributors
# All rights reserved.
#
# This software is distributed under the open-source license Modified BSD.
"""The PyCartool module provides Nipype interfaces with Cartool using pycartool."""
import pickle
import numpy as np
import mne
import pycartool as cart
from nipype.interfaces.base import (
BaseInterface, BaseInterfaceInputSpec,
TraitedSpec, traits
)
class CartoolInverseSolutionROIExtractionInputSpec(BaseInterfaceInputSpec):
eeg_ts_file = traits.List(
exists=True, desc='eeg * epochs in .set format', mandatory=True)
invsol_file = traits.List(
exists=True, desc='Inverse solution (.is file loaded with pycartool)', mandatory=True)
rois_file = traits.List(
exists=True, desc='Rois file, loaded with pickle', mandatory=True)
invsol_params = traits.Dict(
desc='Parameters for inverse solution and roi tc extraction', mandatory=True)
roi_ts_file = traits.File(
exists=False, desc="rois * time series in .npy format")
class CartoolInverseSolutionROIExtractionOutputSpec(TraitedSpec):
roi_ts_file = traits.File(
exists=True, desc="rois * time series in .npy format")
class CartoolInverseSolutionROIExtraction(BaseInterface):
"""Use Pycartool to load inverse solutions estimated by Cartool.
Examples
--------
>>> from cmtklib.interfaces.pycartool import CartoolInverseSolutionROIExtraction
>>> cartool_inv_sol = CartoolInverseSolutionROIExtraction()
>>> cartool_inv_sol.inputs.eeg_ts_file = 'sub-01_task-faces_desc-preproc_eeg.set'
>>> cartool_inv_sol.inputs.invsol_file = 'sub-01_eeg.LORETA.is'
>>> cartool_inv_sol.inputs.rois_file = 'sub-01_label-L2008_desc-scale1.rois'
>>> cartool_inv_sol.inputs.invsol_params = {'lamda': 6, 'svd_params': {'toi_begin': 0, 'toi_end': 0.25}}
>>> cartool_inv_sol.inputs.roi_ts_file = 'sub-01_task-faces_label-L2008_desc-scale1_LORETA.npy'
>>> cartool_inv_sol.run() # doctest: +SKIP
References
----------
- https://pycartool.readthedocs.io/en/latest/pycartool.io.html#module-pycartool.io.inverse_solution
"""
input_spec = CartoolInverseSolutionROIExtractionInputSpec
output_spec = CartoolInverseSolutionROIExtractionOutputSpec
def _run_interface(self, runtime):
epochs_file = self.inputs.eeg_ts_file[0]
invsol_file = self.inputs.invsol_file[0]
lamda = self.inputs.invsol_params['lamda']
rois_file = self.inputs.rois_file[0]
svd_params = self.inputs.invsol_params['svd_params']
self.roi_ts_file = self.inputs.roi_ts_file
roi_tcs = self.apply_inverse_epochs_cartool(epochs_file, invsol_file, lamda, rois_file, svd_params)
np.save(self.roi_ts_file, roi_tcs)
return runtime
def _list_outputs(self):
outputs = self._outputs().get()
outputs['roi_ts_file'] = self.roi_ts_file
return outputs