From d1577a21d87bd375c0770b996c40bfcf8018a207 Mon Sep 17 00:00:00 2001 From: Akrem Sellami <akrem.sellami@lis-lab.fr> Date: Thu, 20 Feb 2020 15:18:19 +0100 Subject: [PATCH] Upload New File --- preprocessing_tfmri/pre_processing_tfmri.py | 337 ++++++++++++++++++++ 1 file changed, 337 insertions(+) create mode 100644 preprocessing_tfmri/pre_processing_tfmri.py diff --git a/preprocessing_tfmri/pre_processing_tfmri.py b/preprocessing_tfmri/pre_processing_tfmri.py new file mode 100644 index 0000000..1763122 --- /dev/null +++ b/preprocessing_tfmri/pre_processing_tfmri.py @@ -0,0 +1,337 @@ +""" + Preprocessing of InterTVA resting state fMRI data for the computing of the correlation matrix (voxels/ROIs) + + Processing + ========== + + 1 - Avoid nan values + + 2- Projection of nni files to gii files using white mesh + + 3- Construction of activation matrix + + + + Softwares + ========= + + This pipeline use: + * Python 3 + * SPM12 toolbox in Matlab 2018 + * FSL 5.0 (fslmaths) + * Freesurfer 6 + + Arguments + ========= + + List of subjects' number (or ID) + + + Example + ======= + + python preprocessing_tfmri.py 4 5 6 + + + + +""" + +import sys +import numpy as np +import nibabel as nib +from utils import run, spm_run_batch, matlab_run_script, matlab_define, run_script_matlab +import nibabel.gifti as ng +from functions import project_epi, correlation, solve_nan, convert_mesh, project_epi_fsaverage5 +# ************************** PIPELINE ****************************************** +def import_data(src_bids, intertva_dir, subdir, sub): + """ + Import all needed files for one subject + + :param src_bids: Original BIDS directory (from Bastien Cagna) + :param intertva_dir: Already preprocessed and anaysed data directory + :param subdir: New directory for rsfMRI data + :param sub: Subject's ID + """ + # Import data + + print("Import tfMRI of " + sub) + run('mkdir {}/{}/ -vp'.format(subdir, sub)) + run("cp -r {}/{}/glm/vol/u{}_task-localizer_model-singletrial_denoised {}/{}/".format(intertva_dir, sub, sub, subdir, sub)) + +def solve_nan_tfmri(subdir, sub): + + gii_dir = subdir + "/{}/u{}_task-localizer_model-singletrial_denoised/".format(sub, sub) + for ct in range(1,145): + nii_file= "beta_{:04d}".format(ct) + filename = gii_dir + nii_file + ".nii" + print(filename) + ex = filename + nii = nib.load(ex) + data = nii.get_data().copy() + # print("Dimensions:", data.shape) + # Test on NAN Values + test = np.isnan(data[:]) + if True in test[:]: + if ct == 1: + print("NAN VALUES EXIST") + print("Number of Nan Values:", np.sum(test)) + # Convert Boolean Matrix to int (0 or 1) + mat = test.astype(int) + # print(mat) + [x, y, z] = mat.shape + for k in range(0, z): + for i in range(0, x): + for j in range(0, y): + if test[i, j, k] == 1: # if NAN exist + if k == 0: # if the first matrix (3D) + if i == 0: # if the first line + if j == 0: # if the first column + V = np.concatenate((data[i:i + 2, j:j + 2, k].flatten(), + data[i:i + 2, j:j + 2, k + 1].flatten()), axis=None) + m = np.mean(V[~np.isnan(V)]) # Extract non nan values + data[i, j, k] = m + elif j == y - 1: # if the end column + V = np.concatenate((data[i:i + 2, j - 1:j + 2, k].flatten(), + data[i:i + 2, j - 1:j + 2, k + 1].flatten()), axis=None) + m = np.mean(V[~np.isnan(V)]) + data[i, j, k] = m + elif i == x - 1: # if the end line + if j == 0: # if the first column + V = np.concatenate((data[i - 1:i + 1, j:j + 2, k].flatten(), + data[i - 1:i + 1, j:j + 2, k + 1].flatten()), axis=None) + # Extract non nan values + m = np.mean(V[~np.isnan(V)]) + data[i, j, k] = m + elif j == y - 1: # if the end column + V = np.concatenate((data[i - 1:i + 1, j - 1:j + 1, k].flatten(), + data[i - 1:i + 1, j - 1:j + 1, k + 1].flatten()), axis=None) + # Extract non nan values + m = np.mean(V[~np.isnan(V)]) + data[i, j, k] = m + else: + if j == 0: # If the first column + V = np.concatenate((data[i - 1:i + 2, j:j + 2, k].flatten(), + data[i - 1:i + 2, j:j + 2, k + 1].flatten()), axis=None) + # Extract no nan values + m = np.mean(V[~np.isnan(V)]) + data[i, j, k] = m + elif j == y - 1: # end column + V = np.concatenate((data[i - 1:i + 2, j - 1:j + 1, k].flatten(), + data[i - 1:i + 2, j - 1:j + 1, k + 1].flatten()), axis=None) + # Extract non nan values + m = np.mean(V[~np.isnan(V)]) + data[i, j, k] = m + else: + V = np.concatenate((data[i - 1:i + 2, j - 1:j + 2, k].flatten(), + data[i - 1:i + 2, j - 1:j + 2, k + 1].flatten()), axis=None) + m = np.mean(V[~np.isnan(V)]) # Extract non nan values + data[i, j, k] = m + elif k == z - 1: # if the end matrix + if i == 0: # if the first line + if j == 0: # if the first column + V = np.concatenate((data[i:i + 2, j:j + 2, k - 1].flatten(), + data[i:i + 2, j:j + 2, k].flatten()), axis=None) + m = np.mean(V[~np.isnan(V)]) # Extract non nan values + data[i, j, k] = m + elif j == y - 1: # if the end column + V = np.concatenate((data[i:i + 2, j - 1:j + 2, k - 1].flatten(), + data[i:i + 2, j - 1:j + 2, k].flatten()), axis=None) + m = np.mean(V[~np.isnan(V)]) + data[i, j, k] = m + elif i == x - 1: # if the end line + if j == 0: # if the first column + V = np.concatenate((data[i - 1:i + 1, j:j + 2, k - 1].flatten(), + data[i - 1:i + 1, j:j + 2, k].flatten()), axis=None) + # Extract non nan values + m = np.mean(V[~np.isnan(V)]) + data[i, j, k] = m + elif j == y - 1: # if the end column + V = np.concatenate((data[i - 1:i + 1, j - 1:j + 1, k - 1].flatten(), + data[i - 1:i + 1, j - 1:j + 1, k].flatten()), axis=None) + # Extract non nan values + m = np.mean(V[~np.isnan(V)]) + data[i, j, k] = m + else: + if j == 0: # If the first column + V = np.concatenate((data[i - 1:i + 2, j:j + 2, k - 1].flatten(), + data[i - 1:i + 2, j:j + 2, k].flatten()), axis=None) + # Extract no nan values + m = np.mean(V[~np.isnan(V)]) + data[i, j, k] = m + + elif j == y - 1: # end column + V = np.concatenate((data[i - 1:i + 2, j - 1:j + 1, k - 1].flatten(), + data[i - 1:i + 2, j - 1:j + 1, k].flatten()), axis=None) + # Extract non nan values + m = np.mean(V[~np.isnan(V)]) + data[i, j, k] = m + else: + V = np.concatenate((data[i - 1:i + 2, j - 1:j + 2, k - 1].flatten(), + data[i - 1:i + 2, j - 1:j + 2, k].flatten()), axis=None) + m = np.mean(V[~np.isnan(V)]) # Extract non nan values + data[i, j, k] = m + else: + if i == 0: # if the first line + if j == 0: # if the first column + V = np.concatenate((data[i:i + 2, j:j + 2, k - 1].flatten(), + data[i:i + 2, j:j + 2, k].flatten(), + data[i:i + 2, j:j + 2, k + 1].flatten()), axis=None) + m = np.mean(V[~np.isnan(V)]) # Extract non nan values + data[i, j, k] = m + elif j == y - 1: # if the end column + V = np.concatenate((data[i:i + 2, j - 1:j + 2, k - 1].flatten(), + data[i:i + 2, j - 1:j + 2, k].flatten(), + data[i:i + 2, j - 1:j + 2, k + 1].flatten()), axis=None) + m = np.mean(V[~np.isnan(V)]) + data[i, j, k] = m + elif i == x - 1: # if the end line + if j == 0: # if the first column + V = np.concatenate((data[i - 1:i + 1, j:j + 2, k - 1].flatten(), + data[i - 1:i + 1, j:j + 2, k].flatten(), + data[i - 1:i + 1, j:j + 2, k + 1].flatten()), axis=None) + # Extract non nan values + m = np.mean(V[~np.isnan(V)]) + data[i, j, k] = m + elif j == y - 1: # if the end column + V = np.concatenate((data[i - 1:i + 1, j - 1:j + 1, k - 1].flatten(), + data[i - 1:i + 1, j - 1:j + 1, k].flatten(), + data[i - 1:i + 1, j - 1:j + 1, k + 1].flatten()), axis=None) + # Extract non nan values + m = np.mean(V[~np.isnan(V)]) + data[i, j, k] = m + else: + if j == 0: # If the first column + V = np.concatenate((data[i - 1:i + 2, j:j + 2, k - 1].flatten(), + data[i - 1:i + 2, j:j + 2, k].flatten(), + data[i - 1:i + 2, j:j + 2, k + 1].flatten()), axis=None) + # Extract no nan values + m = np.mean(V[~np.isnan(V)]) + data[i, j, k] = m + # print(V) + # print(i, j, k) + # print(m) + elif j == y - 1: # end column + V = np.concatenate((data[i - 1:i + 2, j - 1:j + 1, k - 1].flatten(), + data[i - 1:i + 2, j - 1:j + 1, k].flatten(), + data[i - 1:i + 2, j - 1:j + 1, k + 1].flatten()), axis=None) + # Extract non nan values + m = np.mean(V[~np.isnan(V)]) + data[i, j, k] = m + + else: + V = np.concatenate((data[i - 1:i + 2, j - 1:j + 2, k - 1].flatten(), + data[i - 1:i + 2, j - 1:j + 2, k].flatten(), + data[i - 1:i + 2, j - 1:j + 2, k + 1].flatten()), axis=None) + m = np.mean(V[~np.isnan(V)]) # Extract non nan values + data[i, j, k] = m + else: + print("NO NAN :) ") + array_img = nib.Nifti1Image(data, nii.affine, nii.header) + # new_img.to_filename(new_fname) + nib.save(array_img, filename) + print("nan solved on:", filename) + + + + + +def gifti_files(subdir, sub): + """" + This code allows to construct the activation matrix using gifti files + + + """ + trgt_fsaverage5 = '/hpc/soft/freesurfer/freesurfer_6.0.0/subjects/fsaverage5/label/' + + subname = sub + gii_dir = subdir + "/{}/u{}_task-localizer_model-singletrial_denoised/".format(sub, sub) + + """"" + STEP 1: MATRIX CONSTRUCTION OF lh.Gifti AND rh.Gifti files + """"" + print("STEP 1: MATRIX CONSTRUCTION OF lh.Gifti AND rh.Gifti files") + hem_list = ['lh', 'rh'] + gii_matrix = np.empty([]) + for hem in hem_list: + print("load of " + hem + ".gifti files") + for i in range(1, 145): + filename = gii_dir + "/beta_{:04d}.{}_fsaverage5.gii".format(i, hem) + gii = ng.read(filename) + data = np.array([gii.darrays[0].data]) + if i == 1: + gii_matrix = data + else: + gii_matrix = np.concatenate((gii_matrix, data), axis=0) + gii_matrix = np.transpose(gii_matrix) + print("Size of Matrix " + hem + ":", gii_matrix.shape) + if hem == 'lh': + file = gii_dir+ "/gii_matrix_fsaverage5_lh.npy" + np.save(file, gii_matrix) + else: + file = gii_dir + "/gii_matrix_fsaverage5_rh.npy" + np.save(file, gii_matrix) + +def projection(subdir, sub): + gii_dir = subdir + "/{}/u{}_task-localizer_model-singletrial_denoised/".format(sub, sub) + fs_subdir = "/hpc/banco/cagna.b/my_intertva/surf/data/" + sub + "/fs" + for ct in range(1,145): + filename = "beta_{:04d}".format(ct) + nii_file = gii_dir + filename + ".nii" + project_epi(fs_subdir, sub, nii_file, filename, gii_dir, tgt_subject=sub, hem_list=['lh', 'rh'], sfwhm=0) + +def projection_fsaverage(subdir, sub): + gii_dir = subdir + "/{}/u{}_task-localizer_model-singletrial_denoised/".format(sub, sub) + fs_subdir = "/hpc/banco/cagna.b/my_intertva/surf/data/" + sub + "/fs" + + for ct in range(1, 145): + filename = "beta_{:04d}".format(ct) + nii_file = gii_dir + filename + ".nii" + project_epi(fs_subdir, sub, nii_file, filename, gii_dir, tgt_subject='fsaverage', hem_list=['lh', 'rh'], + sfwhm=0) + +def projection_fsaverage5(subdir, sub): + gii_dir = subdir + "/{}/u{}_task-localizer_model-singletrial_denoised/".format(sub, sub) + fs_subdir = "/hpc/banco/cagna.b/my_intertva/surf/data/" + sub + "/fs" + + for ct in range(1, 145): + filename = "beta_{:04d}".format(ct) + nii_file = gii_dir + filename + ".nii" + project_epi_fsaverage5(fs_subdir, sub, nii_file, filename, gii_dir, tgt_subject='fsaverage5', hem_list=['lh', 'rh'], + sfwhm=0) + + +def pipeline(root, sub, src_bids, intertva_dir): + subdir = root + "/tfmri" + matlabdir = root + "/scripts/matlab" + + + # Importation of data + import_data(src_bids, intertva_dir, subdir, sub) + + + # Check and solve the nan values in nii files + solve_nan_tfmri(subdir, sub) + + # Projection of nii files into gii files on freesurfer6 template + projection_fsaverage5(subdir, sub) + + # Convert white mesh to gii format + convert_mesh(subdir, sub) + + + # Construct the activation matrix + + gifti_files(subdir, sub) + + +# ************************ INTERPRETER ***************************************** +if __name__ == "__main__": + rt = "/hpc/banco/sellami.a/InterTVA" + orig_bids = "/hpc/banco/cagna.b/my_intertva/openneuro/bids" + intertva = "/hpc/banco/cagna.b/my_intertva/surf/data" + + # Process each subject that specified in the command line + for i in range(1, len(sys.argv)): + pipeline(rt, sys.argv[i], orig_bids, intertva) # No Interactive mode + #pipeline(rt, "sub-{:02d}".format(int(sys.argv[i])), orig_bids, intertva) # Interactive mode -- GitLab