From c971c32e3d89ba6f643d657ad7b20fefc7bbbe66 Mon Sep 17 00:00:00 2001 From: ZiXuan Liu <35823389+Wirkungstreffer@users.noreply.github.com> Date: Tue, 2 Apr 2024 15:04:16 +0200 Subject: [PATCH] Lead field matrix (#249) * add AAL2 atlas data files * add lead-field matrix function script --- examples/data/AAL2_atlas_data/AAL2.nii | Bin 0 -> 1805610 bytes examples/data/AAL2_atlas_data/AAL2.xml | 137 ++++++ neurolib/utils/leadfield.py | 613 +++++++++++++++++++++++++ 3 files changed, 750 insertions(+) create mode 100755 examples/data/AAL2_atlas_data/AAL2.nii create mode 100755 examples/data/AAL2_atlas_data/AAL2.xml create mode 100644 neurolib/utils/leadfield.py diff --git a/examples/data/AAL2_atlas_data/AAL2.nii b/examples/data/AAL2_atlas_data/AAL2.nii new file mode 100755 index 0000000000000000000000000000000000000000..48aab949ecf221a4c2515a5113501efbdb8e23bf GIT binary patch literal 1805610 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 + +
+ aal2 + 1.0 + ROI_MNI_V5 + + + MNI + Label + + AAL2.nii + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/neurolib/utils/leadfield.py b/neurolib/utils/leadfield.py new file mode 100644 index 00000000..d2ed463b --- /dev/null +++ b/neurolib/utils/leadfield.py @@ -0,0 +1,613 @@ +import os +import numpy as np +import matplotlib.pyplot as plt + +import nibabel as nib +import mne +from mne.datasets import eegbci +from mne.datasets import fetch_fsaverage + +import logging +from xml.etree import ElementTree +from neurolib.utils.atlases import AutomatedAnatomicalParcellation2 + + +class LeadfieldGenerator: + + """ + Authors: Mohammad Orabe + Zixuan liu + + A class to compute the lead-field matrix and perform related operations. + The default loaded data is the template data 'fsaverage'. + To establish an AAL2 atlas source space, the average dipole value within each atlas annotation is computed, a process referred to as downsampling. + The initial step is to generate the surface source model. + The downsampling process need NIfTI file and XML file of the AAL2 atlas. + + + Parameters: + ========== + fs_dir (str): Path to the downloaded 'fsaverage' directory, set as default data. + subject (str): The name of the subject. + subjects_dir (str): Path to the directory containing the subject data. + trans (str): Path to the coregistration transformation file. + atlas_nii (str): Path to the NIfTI file of the atlas. + atlas_xml (str): Path to the XML file of the atlas. + + Attributes: + ========== + raw (mne.io.Raw): The raw EEG data. + + + Methods: + ======= + load_data(subject, subjects_dir): + Load subject data and its directory, 'fsaverage' is set as default. For user-specific data, a coregistration transformation file needed to be generated. + + load_transformation file(trans): + load the transformation file of the subject, 'fsaverage' has default transformation file. + + build_BEM(subject, conductivity, subjects_dir) + Construct BEM for the given subject head model. + + generate_surface_source_space(subject, spacing, add_dist): + Generate the overall surface source model. + + EEG_coregistration(subject, configuration, src, trans, visualization): + Align the selected EEG configuration with the subject and visualization. + + calculate_general_forward_solution(raw, trans, src, bem, eeg, mindist, n_jobs): + Compute the general forward solution based on given subject, BEM, and EEG configuration. + + downsample_leadfield_matrix(leadfield, label_codes, atlas_nii, atlas_xml): + Downsample the lead-field matrix according to AAL2 atlas based on general forward solution. + + check_atlas_missing_regions(): + Check for missing regions in the atlas based on label codes. + """ + + def __init__(self, subject): + self.subject = subject + self.fs_dir = None + self.subjects_dir = None + self.trans = None + + def load_data(self, subjects_dir=None, subject="fsaverage"): + """ + Load subject data. + + Parameters: + ========== + subject (str): The name of the subject, default set as 'fsaverage'. + subjects_dir (str): The directory of the subject. + + """ + if subject == "fsaverage": + # Download the template data 'fsaverage' + self.fs_dir = fetch_fsaverage(verbose=True) + self.subjects_dir = os.path.dirname(self.fs_dir) + print("Load template data 'fsaverage'") + else: + self.subjects_dir = subjects_dir + # Generate transformation file, detail see https://mne.tools/stable/generated/mne.gui.coregistration.html#mne.gui.coregistration + mne.gui.coregistration(subject=subject, subjects_dir=subjects_dir) + + # (raw_fname,) = eegbci.load_data(subject=1, runs=[6]) + # raw = mne.io.read_raw_edf(raw_fname, preload=True) + + def load_transformation_file(self, trans_path, subject="fsaverage"): + """ + Load transformation file. + + Parameters: + ========== + trans_path (str): The directory of the transformation file + + """ + # Load the generated transformation file + if subject == "fsaverage": + self.trans = os.path.join(self.subjects_dir, self.subject, "bem", "fsaverage-trans.fif") + print("Load default transformation file of 'fsaverage'") + else: + self.trans = trans_path + + def build_BEM( + self, + conductivity=(0.3, 0.006, 0.3), + visualization=True, + brain_surfaces="white", + orientation="coronal", + slices=[50, 100, 150, 200], + ): + """ + Create the Boundary Element Model (BEM) solution for the given subject using on the linear collocation approach. + + Parameters: + ========== + subject (ndarray | str): Subject identifier. + subjects_dir (str): Subject directory path. + fs_dir (str): FreeSurfer directory path. + conductivity : array of int, shape (3,) or (1,). The conductivities to use for each shell. Should be a single element for a one-layer model, or three elements for a three-layer model. Defaults to ``[0.3, 0.006, 0.3]``. The MNE-C default for a single-layer model would be ``[0.3]``. + + Returns: + ======= + mne.bem.ConductorModel: BEM of the given head model. + plot_bem_kwargs: Image information of the given mri data + + """ + + model = mne.make_bem_model( + subject=self.subject, + ico=4, + conductivity=conductivity, + subjects_dir=self.subjects_dir, + ) + bem = mne.make_bem_solution(model) + + # Visualization of the BEM + plot_bem_kwargs = dict( + subject=self.subject, + subjects_dir=self.subjects_dir, + brain_surfaces=brain_surfaces, + orientation=orientation, + slices=slices, + ) + + if visualization == True: + mne.viz.plot_bem(**plot_bem_kwargs) + + return bem, plot_bem_kwargs + + def generate_surface_source_space(self, plot_bem_kwargs, spacing="ico4", add_dist="patch", visualization=True): + """ + Generate the overall surface source model. + + Parameters: + ========== + subject (ndarray | str): Subject identifier. + subjects_dir (str): Subject directory path. + spacing (str) : The spacing to use. Can be 'ico#' for a recursively subdivided icosahedron, 'oct#' for a recursively subdivided octahedron, 'all' for all points, or an integer to use approximate distance-based spacing (in mm). + add_dist (bool | str): Add distance and patch information to the source space. + + Returns: + ======= + src (mne.SourceSpaces): Surface source space object. + + """ + + if self.subject == "fsaverage": + src = os.path.join(self.fs_dir, "bem", "fsaverage-ico-5-src.fif") + else: + src = mne.setup_source_space( + subject=self.subject, + spacing=spacing, + add_dist=add_dist, + subjects_dir=self.subjects_dir, + ) + + if visualization == True: + mne.viz.plot_bem(src=src, **plot_bem_kwargs) + + return src + + def EEG_coregistration(self, src, configuration="standard_1020", visualization=True): + """ + Align the selected EEG configuration with the subject and visualization. + + Parameters: + ========== + src (mne.SourceSpaces): Source space object. + trans (str): Path to the transformation file. + configuration (str): Type of EEG electrode layout, defaults to 'standard_1020'. + + Returns: + ======= + raw (mne.io.Raw): Raw data coregistrated with EEG. + """ + + # Load the EEGBCI data + (raw_fname,) = eegbci.load_data(subject=1, runs=[6]) + raw = mne.io.read_raw_edf(raw_fname, preload=True) + + # Clean channel names to be able to use a standard 1020 montage + new_names = dict( + (ch_name, ch_name.rstrip(".").upper().replace("Z", "z").replace("FP", "Fp")) for ch_name in raw.ch_names + ) + raw.rename_channels(new_names) + + # Read and set the EEG electrode locations, which are already in fsaverage's space (MNI space) for standard_1020: + montage = mne.channels.make_standard_montage(configuration) + raw.set_montage(montage) + raw.set_eeg_reference(projection=True) # needed for inverse modeling + + # Check that the locations of EEG electrodes is correct with respect to MRI + if visualization == True: + mne.viz.plot_alignment( + raw.info, + src=src, + eeg=["original", "projected"], + trans=self.trans, + show_axes=True, + mri_fiducials=True, + dig="fiducials", + ) + + return raw + + def calculate_general_forward_solution(self, raw, src, bem, eeg=True, mindist=5.0): + """ + Calculate the general forward solution + + Parameters: + ========== + raw (mne.io.Raw): Raw data coregistrated with EEG. + src (mne.SourceSpaces): Surface source space object. + trans (str): Path to the transformation file. + bem (mne.bem.ConductorModel): BEM of the given head model. + + Returns: + ======= + fwd: The general forward solution. + + """ + + # Computer the general forward solution + fwd = mne.make_forward_solution( + raw.info, + trans=self.trans, + src=src, + bem=bem, + eeg=eeg, + mindist=mindist, + n_jobs=None, + ) + print("The general forward solution:", fwd) + print("=====================================================") + + return fwd + + def __create_label_lut(self, path: str) -> dict: + """ + Create a lookup table that contains "anatomical acronyms" corresponding to the encodings of the regions + specified by the used anatomical atlas. Adds an empty label for code "0" if not specified otherwise by atlas. + + Parameters: + ========== + path (str): Path to the XML file containing label information. + + Returns: + ======= + dict: Dictionary with keys being the integer codes of regions and the values being anatomical acronyms. + + """ + # Look up the codes ("index") and the names of the regions defined by the atlas. + tree = ElementTree.parse(path) + root = tree.getroot() + label_lut = {} + for region in root.find("data").findall("label"): + label_lut[region.find("index").text] = region.find("name").text + + if "0 " not in label_lut.keys(): + label_lut["0"] = "" + return label_lut + + def __get_backprojection( + self, point_expanded: np.ndarray, affine: np.ndarray, affine_inverse: np.ndarray + ) -> np.ndarray: + """ + Transform MNI-mm-point into 'voxel-coordinate'. + + Parameters: + ========== + point_expanded (np.ndarray): First three elements are the 3D point in MNI-coordinate space (mm), + last element being a 1 for the offset in transformations. `point_expanded` must have the shape of 4x1. + affine (np.ndarray): Projects voxel-numbers to MNI coordinate space (mm). `affine` must have the shape of 4x4. + affine_inverse (np.ndarray): Back projection from MNI space. `affine_inverse` must have the shape of 4x4. + + Returns: + ======= + np.ndarray: The point projected back into "voxel-number-space", last element 1. Will return the shape of 4x1. + + """ + + # project the point from mni to voxel + back_proj = affine_inverse @ point_expanded + + # Round to voxel resolution, multiplication with elements inverse is equivalent to division with elements of the affine here. + back_proj_rounded = np.round(np.diag(affine_inverse) * back_proj, 0) * np.diag(affine) + + return back_proj_rounded + + def __filter_for_regions(self, label_strings: list[str], regions: list[str]) -> list[bool]: + """ + Create a list of bools indicating if the label_strings are in the regions list. + This function can be used if one is only interested in a subset of regions defined by an atlas. + + Parameters: + ========== + label_strings (list[str]): List of labels that dipoles got assigned to. + regions (list[str]): List of strings that are the acronyms for the regions of interest. + + Returns: + ======= + list[bool]: List of bools indicating if each label_string is in the regions list. + + """ + # Remark: then outside this function the label codes and label-strings can be set to nan or 0 for dipoles that are not of interest such that downsampling works smoothly. + + regions_set = set(regions) + + # Use list comprehension for faster filtering + in_regions = [label in regions_set for label in label_strings] + + return in_regions + + def __get_labels_of_points( + self, + points: np.ndarray, + nii_file: nib.Nifti1Image, + xml_file: dict, + atlas="aal2_cortical", + cortex_parts="only_cortical_parts", + ) -> tuple[list[bool], np.ndarray, list[str]]: + """ + Gives labels of regions the points fall into. + + Parameters: + ========== + points (np.ndarray): Nx3 array of points defined in MNI space (mm). + nii_file (nibabel.Nifti1Image): NIfTI file representing the anatomical atlas. + xml_file (dict): Dictionary containing "anatomical acronyms" corresponding to the encodings of the regions. + atlas (str): Specification of the anatomical atlas. Currently only "aal2_cortical" is supported and is set as default. + cortex_parts (str): Specification of cortex parts, defaults to "only_cortical_parts". + + Returns: + ======= + tuple[list[bool], np.ndarray, list[str]]: Tuple containing: + - List of boolean values indicating if a valid assignment within the space defined by the atlas was found for each point. + - Array of the assigned label codes for each point. + - List of strings representing the "anatomical acronyms" of the assigned labels. + + """ + n_points = points.shape[0] + label_codes = np.zeros( + n_points + ) # Remark: or expand points-array by one dimension and fill label-codes in there? + label_strings = [None] * n_points + points_found = [None] * n_points + + points_expanded = np.ones((n_points, 4)) # Expand by a column with ones only to allow for transformations + points_expanded[:, 0:3] = points # with affines. + + if not points.shape[1] == 3: + raise ValueError + + # Load atlas (integer encoded volume and string-labels). + atlas_img = nii_file + atlas_labels_lut = xml_file + + affine = atlas_img.affine # Transformation from voxel- to mni-space. + affine_inverse = np.linalg.inv(affine) # Transformation mni- to "voxel"-space. + + # Get voxel codes + codes = atlas_img.get_fdata() + for point_idx, point in enumerate(points_expanded): + back_proj = self.__get_backprojection(point, affine, affine_inverse) + + try: + label_codes[point_idx] = codes[int(back_proj[0]), int(back_proj[1]), int(back_proj[2])] + + except IndexError: + label_codes[point_idx] = np.NAN + + if np.isnan(label_codes[point_idx]): + points_found[point_idx] = False + label_strings[point_idx] = "invalid" + else: + points_found[point_idx] = True + label_strings[point_idx] = atlas_labels_lut[ + str(int(label_codes[point_idx])) + ] # ToDo: clean up type- conversions. + if sum(points_found) < n_points: + logging.error( + f"The atlas does not specify valid labels for all the given points.\n" + f"Total number of points: (%s) out of which (%s) were validly assigned." % (n_points, sum(points_found)) + ) + + if atlas == "aal2_cortical": + aal_2 = AutomatedAnatomicalParcellation2() + regions = [] + + # Select cortex part + full_cortex = aal_2.cortex + aal_2.subcortical + only_cortical_parts = aal_2.cortex + subcortical_parts = aal_2.subcortical + + if cortex_parts == "full_cortex": + cortex_parts = full_cortex + if cortex_parts == "only_cortical_parts": + cortex_parts = only_cortical_parts + if cortex_parts == "subcortical_parts": + cortex_parts = subcortical_parts + + for r in cortex_parts: + regions.append(aal_2.aal2[r + 1]) + in_regions = self.__filter_for_regions(label_strings, regions) + + for idx_point in range(len(points_found)): + if not in_regions[idx_point]: + label_codes[idx_point] = 0 + label_strings[idx_point] = "" + + return points_found, label_codes, label_strings + + def __downsample_leadfield_matrix( + self, leadfield: np.ndarray, label_codes: np.ndarray + ) -> tuple[np.ndarray, np.ndarray]: + """ + Downsample the leadfield matrix by computing the average across all dipoles falling within specific regions. This process assumes a one-to-one correspondence between source positions and dipoles, as commonly found in a surface source space where the dipoles' orientations are aligned with the surface normals. + + Parameters: + ========== + leadfield (np.ndarray): Leadfield matrix. Channels x Dipoles. + label_codes (np.ndarray): 1D array of region-labels assigned to the source locations. + + Returns: + ======= + tuple[np.ndarray, np.ndarray]: Tuple containing: + - Array that contains the label-codes of any region that at least one dipole was assigned to. + - Channels x Regions leadfield matrix. The order of rows (channels) is unchanged compared to the input "leadfield", + but the columns are sorted according to the "unique_labels" array. + + """ + leadfield_orig_shape = leadfield.shape + n_channels = leadfield_orig_shape[0] + + if leadfield_orig_shape[1] != label_codes.size: + raise ValueError( + "The lead field matrix does not have the expected number of columns. \n" + "Number of columns differs from labels (equal number dipoles)." + ) + + unique_labels = np.unique(label_codes) + unique_labels = np.delete(unique_labels, np.where(np.isnan(unique_labels))[0]) # Delete NAN if present. + # NAN would indicate point that doesn't fall into space covered by atlas. + unique_labels = np.delete( + unique_labels, np.where(unique_labels == 0)[0] + ) # Delete 0 if present. "0" in AAL2 is non-brain-tissue, eg. CSF. + + downsampled_leadfield = np.zeros((n_channels, unique_labels.size)) + + for label_idx, label in enumerate(unique_labels): # iterate through regions + indices_label = np.where(label_codes == label)[0] + + downsampled_leadfield[:, label_idx] = np.mean(leadfield[:, indices_label], axis=1) + + return unique_labels, downsampled_leadfield + + def compute_downsampled_leadfield( + self, + fwd, + atlas_nii_path, + atlas_xml_path, + atlas="aal2_cortical", + cortex_parts="only_cortical_parts", + path_to_save=None, + ): + """ + Compute the leadfield matrix. + + Parameters: + ========== + raw (mne.io.Raw): Raw data object. + trans (str): Path to the transformation file. + src (mne.SourceSpaces): Source space object. + bem (mne.bem.ConductorModel): BEM object. + subject (str): Subject identifier. + atlas_nii_path (str): Path to the NIfTI file of the atlas. + atlas_xml_path (str): Path to the XML file of the atlas. + atlas (str): Specification of the anatomical atlas, defaults to "aal2_cortical". + cortex_parts (str): Specification of cortex parts, defaults to "only_cortical_parts". + path_to_save (str): Path to save the leadfield matrix as a binary file in NumPy .npy format, defaults to None. + + Returns: + ======= + tuple[np.ndarray, mne.Forward, np.ndarray]: Tuple containing: + - Channels x Regions leadfield matrix. + - Forward solution object. + - Array that contains the label-codes of any region that at least one dipole was assigned to. + + """ + # Calculate the general forward solution + + # Downsample the forward solution to achieve lead-field matrix + ## With the forward solution that being calculated above, compute the average dipole value of the dipoles in each AAL atlas to acquire the lead-field matrix. + + fwd_fixed = mne.convert_forward_solution(fwd, surf_ori=True, force_fixed=True, use_cps=True) + + leadfield_fixed = fwd_fixed["sol"]["data"] + + atlas_nii_file = nib.load(atlas_nii_path) + + atlas_xml_file = self.__create_label_lut(atlas_xml_path) + + lh = fwd_fixed["src"][0] + dip_pos_lh = np.vstack(lh["rr"][lh["vertno"]]) + rh = fwd_fixed["src"][1] + dip_pos_rh = np.vstack(rh["rr"][rh["vertno"]]) + + dip_pos = np.vstack((dip_pos_lh, dip_pos_rh)) + + trans_info = mne.read_trans(self.trans) + + dip_pos_mni = mne.head_to_mni(dip_pos, subject=self.subject, mri_head_t=trans_info) + + points_found, label_codes, label_strings = self.__get_labels_of_points( + dip_pos_mni, + atlas_nii_file, + atlas_xml_file, + atlas=atlas, + cortex_parts=cortex_parts, + ) + + unique_labels, leadfield_downsampled = self.__downsample_leadfield_matrix(leadfield_fixed, label_codes) + + print("Lead-field matrix's size : %d sensors x %d dipoles" % leadfield_downsampled.shape) + print("=====================================================") + + print("Downsampled lead-field matrix:", leadfield_downsampled) + print("=====================================================") + # Export the leadfield matrix an array to a binary file in NumPy .npy format. + if path_to_save is not None: + np.save( + os.path.join(path_to_save, "leadfield_downsampled"), + leadfield_downsampled, + ) + print(f"The leadfiled matrix is saved as a binary file in NumPy .npy format at {path_to_save}") + print("=====================================================") + + return leadfield_downsampled, unique_labels + + def check_atlas_missing_regions(self, atlas_xml_path, unique_labels): + """ + Investigate the missing regions of the atlas. + + Parameters: + ========== + atlas_xml_path (str): Path to the XML file containing label information. + unique_labels (np.ndarray): Array containing the label-codes of any region that at least one dipole was assigned to. + + Returns: + ======= + None + + """ + + aal_2 = AutomatedAnatomicalParcellation2() + full_cortex = aal_2.cortex + aal_2.subcortical + total_region_quantity = np.array(full_cortex).shape[0] + missed_region_quantity = np.array(full_cortex).shape[0] - np.array(unique_labels).shape[0] + + print("total region quantity:", total_region_quantity) + print("missed region quantity: ", missed_region_quantity) + print("=====================================================") + + atlas_xml_file = self.__create_label_lut(atlas_xml_path) + + label_numbers = np.array(list(map(int, atlas_xml_file.keys())))[:-1] # Convert the keys to integers + missed_region_labels = np.setdiff1d(label_numbers, unique_labels) + print("missed region labels:", missed_region_labels) + print("=====================================================") + + missed_region_labels_str = missed_region_labels.astype(str) + # missed_region_labels_str = np.core.defchararray.add(missed_region_labels.astype(str), '') + missed_region_values = list( + atlas_xml_file[label] for label in missed_region_labels_str if label in atlas_xml_file + ) + print("missed region names:", missed_region_values) + print("=====================================================") + + subset = set(missed_region_labels) + missed_region_indices = np.array([i + 1 for i, e in enumerate(label_numbers) if e in subset]) + print("missed region indices:", missed_region_indices) + print("=====================================================")