Source code for deepmreye.util.data_io

import os
import urllib

import numpy as np
from scipy.io import loadmat


# --------------------------------------------------------------------------------
# --------------------------IO-NAU------------------------------------------------
# --------------------------------------------------------------------------------
[docs] def get_subject_labels(subject_string, mat_data): for subject in mat_data: if str(subject["subID"]) == subject_string: all_runs = subject["TR_xy"].tolist() return all_runs return -1
[docs] def get_all_subject_labels(subject_string, mat_data, num_downsampled=10, use_real=False): """ For models with multiple outputs we want to estimate the sub-TR XY. Inputs: - subject_string : Subject identified - mat_data : Data to subject logs in mat format - num_downsampled : How many sub-TR XY are left in the output """ real_et = None for subject in mat_data: if str(subject["subID"]) == subject_string: try: if use_real: all_runs = subject["TR_xy_samples_ET"].tolist() real_et = True else: raise ValueError("Hack") except ValueError: print(f"Subject {subject_string} has no real eye tracking, use XY of moving dot.") all_runs = subject["TR_xy_samples"].tolist() real_et = False subject_xy = list() for run in all_runs: run_xy = list() for ft in run: if len(ft.shape) > 1: ft_xy = ft[:, np.linspace(0, ft.shape[1] - 1, num_downsampled, dtype=int)] run_xy.append(ft_xy.transpose()) else: run_xy.append(np.full([num_downsampled, 2], np.nan)) subject_xy.append(np.array(run_xy)) subject_xy = np.array(subject_xy) return (subject_xy, real_et) return (-1, -1)
# -------------------------------------------------------------------------------- # --------------------------IO-IGN------------------------------------------------ # --------------------------------------------------------------------------------
[docs] def get_all_subject_labels_ign(subject_string, num_downsampled=10): """ For models with multiple outputs we want to estimate the sub-TR XY. Parameters ---------- subject_string : Subject identified mat_data : Data to subject logs in mat format num_downsampled : How many sub-TR XY are left in the output """ subj_data = np.load(subject_string) np.testing.assert_(np.unique(np.diff(np.where(subj_data[:, 0] == 1)[0]))[0] == 510) all_labels, all_runs = [], [] for idx, l in enumerate(subj_data): if l[1] == 0: if all_labels: all_runs.append(np.array(all_labels)) all_labels = [] bln_tr = int(l[0]) if bln_tr: if (idx + 510) >= subj_data.shape[0]: this_label = subj_data[np.linspace(idx, subj_data.shape[0] - 1, num_downsampled, dtype=int), 2:4] else: this_label = subj_data[np.linspace(idx, idx + 510, num_downsampled, dtype=int), 2:4] all_labels.append(this_label) all_runs.append(np.array(all_labels)) all_runs = np.array(all_runs) return all_runs
# -------------------------------------------------------------------------------- # --------------------------IO-BMD------------------------------------------------ # --------------------------------------------------------------------------------
[docs] def get_all_subject_labels_bmd(subject_string, run_idx, num_downsampled=10, real_et=False): """ For models with multiple outputs we want to estimate the sub-TR XY. Parameters ---------- subject_string : Subject identified run_idx : Index for run num_downsampled : How many sub-TR XY are left in the output """ mat_data = loadmat(subject_string, mat_dtype=True) if real_et: mat_data = mat_data["XY"]["samples_ET"][0, 0] else: mat_data = mat_data["XY"]["samples"][0, 0] if run_idx < mat_data.shape[1]: if mat_data[0, run_idx].shape[0] == 0: return np.array([]) this_run = mat_data[0, run_idx][0, :] all_subtr = np.array( [ ( x[np.linspace(0, len(x) - 1, num_downsampled, dtype=int), :] if x.size > 0 else np.zeros((num_downsampled, 2)) * np.nan ) for x in this_run ] ) return all_subtr return np.array([])
# -------------------------------------------------------------------------------- # --------------------------IO-MMD------------------------------------------------ # --------------------------------------------------------------------------------
[docs] def get_all_subject_labels_mmd(subject_string, run_idx, num_downsampled=10): """ For models with multiple outputs we want to estimate the sub-TR XY. Parameters ---------- subject_string : Subject identified run_idx : Index for run num_downsampled : How many sub-TR XY are left in the output """ mat_data = loadmat(subject_string, mat_dtype=True) mat_data = mat_data["XY"]["samples_ET"][0, 0] if run_idx < mat_data.shape[1]: this_run = mat_data[0, run_idx][0, :] all_subtr = np.array( [ ( x[np.linspace(0, len(x) - 1, num_downsampled, dtype=int), :] if x.size > 0 else np.zeros((num_downsampled, 2)) * np.nan ) for x in this_run ] ) return all_subtr return np.array([])
# -------------------------------------------------------------------------------- # --------------------------IO-MASKS---------------------------------------------- # --------------------------------------------------------------------------------
[docs] def download_mask(data_path, remote_path="https://github.com/DeepMReye/DeepMReye/blob/main/deepmreye/masks/"): mask_name = os.path.basename(data_path) mask_remote = f"{remote_path}{mask_name}?raw=true" try: (f, m) = urllib.request.urlretrieve(mask_remote, data_path) except urllib.error.URLError as e: raise RuntimeError(f"Failed to download '{mask_remote}'. '{e.reason}'")