diff --git a/preprocessing_rsfmri/functions.py b/preprocessing_rsfmri/functions.py
new file mode 100644
index 0000000000000000000000000000000000000000..c02ec5ce96aa755c65d5d9051676f6640618e60f
--- /dev/null
+++ b/preprocessing_rsfmri/functions.py
@@ -0,0 +1,543 @@
+
+
+import os
+import numpy as np
+import nibabel as nib
+import nibabel.gifti as ng
+import time
+from scipy.stats import pearsonr
+
+
+# ***** PROJECTION *************************************************************
+def project_epi(fs_subdir, sub, nii_file, filename, gii_dir,
+                tgt_subject, hem_list=['lh', 'rh'], sfwhm=0):
+    """
+        Project one Nifti file (3D image) to surface saved as Gifti file.
+
+        Projection is done for left and right
+        :param fs_subdir: FreeSurfer subjects directory
+        :param sub: Subject name
+        :param nii_file: Splitted .nii directory
+        :param gii_dir: Output directory
+        :param gii_sfx: Gifti files suffix (add to the hemisphere name)
+        :param tgt_subject: Name of target subject
+        :param hem_list: Hemispheres (default: left and right)
+        :param sfwhm: Surface smoothing (default = 0mm)
+    """
+    for hem in hem_list:
+        gii_file = "{}/{}.{}_{}.gii".format(gii_dir, filename, hem, tgt_subject)
+
+        cmd = '$FREESURFER_HOME/bin/mri_vol2surf --src {} --o {} ' \
+              '--out_type gii --regheader {} --hemi {} '\
+              '--projfrac-avg 0 1 0.1 --surf-fwhm {:d} --sd {} ' \
+              '--trgsubject {}'.format(
+               nii_file, gii_file, sub, hem, sfwhm, fs_subdir, tgt_subject)
+        os.system(cmd)
+def project_epi_fsaverage5(fs_subdir, sub, nii_file, filename, gii_dir,
+                tgt_subject, hem_list=['lh', 'rh'], sfwhm=0):
+    """
+        Project one Nifti file (3D image) to surface saved as Gifti file.
+
+        Projection is done for left and right
+        :param fs_subdir: FreeSurfer subjects directory
+        :param sub: Subject name
+        :param nii_file: Splitted .nii directory
+        :param gii_dir: Output directory
+        :param gii_sfx: Gifti files suffix (add to the hemisphere name)
+        :param tgt_subject: Name of target subject
+        :param hem_list: Hemispheres (default: left and right)
+        :param sfwhm: Surface smoothing (default = 0mm)
+    """
+    for hem in hem_list:
+        gii_file = "{}/{}.{}_fsaverage5.gii".format(gii_dir, filename, hem)
+
+        cmd = '$FREESURFER_HOME/bin/mri_vol2surf --src {} --o {} ' \
+              '--out_type gii --regheader {} --hemi {} ' \
+              '--projfrac-avg 0 1 0.1 --surf-fwhm {:d} --sd {} ' \
+              '--trgsubject {}'.format(
+            nii_file, gii_file, sub, hem, sfwhm, fs_subdir, tgt_subject)
+        os.system(cmd)
+
+# ***** CORRELATION MATRIX ******************************************************************
+def correlation(subdir, sub, template):
+    """"
+    This code allows to compute the correlation bewteen vowels and ROIs.
+    It needs a set of labels (annotation files) and gii files.
+    The code is decomposed into three phases (procedures)
+        :proc  1: matrix construction of gii file (each line is a voxel, and the column is the j time serie)
+        :proc  2: : for each ROI, we save the set of selected voxels based on the annotation file (labels)
+        !proc  3: Coorelation matrix, for each voxel we compute their correlation with the average value of each ROI
+
+    """
+    trgt_fsaverage= '/hpc/soft/freesurfer/freesurfer_6.0.0/subjects/fsaverage/label/'
+    trgt_fsaverage5 = '/hpc/soft/freesurfer/freesurfer_6.0.0/subjects/fsaverage5/label/'
+    trgt= '/hpc/soft/freesurfer/freesurfer_6.0.0/subjects/{}/label/'.format(template)
+
+    subname = sub
+    start = time.time()
+
+    # FS AVERAGE 5
+    """""
+    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, 621):
+            filename = subdir + "/" + subname + "/glm/noisefiltering/Res_{:04d}.{}_{}.gii".format(i, hem, template)
+            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 = subdir + "/" + subname + "/glm/noisefiltering/gii_matrix_{}_lh.npy".format(template)
+            np.save(file, gii_matrix)
+        else:
+            file = subdir + "/" + subname + "/glm/noisefiltering/gii_matrix_{}_rh.npy".format(template)
+            np.save(file, gii_matrix)
+        end = time.time()
+        hours, rem = divmod(end - start, 3600)
+        minutes, seconds = divmod(rem, 60)
+        print("Elapsed time Step 1: {:0>2}:{:0>2}:{:05.2f}".format(int(hours), int(minutes), seconds))
+        start = time.time()
+        """""
+        Step 2 : ROI averaging.
+        """""
+        # Read Annotation LH file
+        print("STEP 2: ROI AVERAGING")
+        print("Read annotation {} file: {}.aparc.a2009s.annot".format(hem, hem))
+        #filepath = subdir + "/" + subname + "/label/{}.aparc.a2009s.annot".format(hem) # espace natif
+        filepath = trgt+ "{}.aparc.a2009s.annot".format(hem)    # espace fsaverage
+        [labels, ctab, names] = nib.freesurfer.io.read_annot(filepath, orig_ids=False)
+        print("labels {}".format(hem), labels)
+        print("Size of labels", labels.shape)
+        # print("List of names", names)
+        print("Number of ROIs", len(names))
+        # ID Regions Extraction
+        print("ID ROI extraction")
+        Id_ROI = np.asarray(sorted(set(labels)))
+        print("Ids ROIs:", Id_ROI)
+        print("ROIs dimensions:", Id_ROI.shape)
+        # print("len",len(labels))
+
+        # Extract time series for each ROI (averaging)
+        print('Extract time series for each ROI by averaging operation')
+        roi_avg = np.empty((len(Id_ROI), gii_matrix.shape[1]))
+        for i in range(0, len(Id_ROI)):
+            print("*********************************************************")
+            print("ID ROI:", Id_ROI[i])
+            mask = np.where(labels == Id_ROI[i])
+            roi_timeseries = gii_matrix[mask, :].mean(1)
+            roi_avg[i, :] = roi_timeseries
+        print("*********************************************************")
+        print("********** Results: **********")
+        print("Size of the Average Matrix of ALL ROIs", roi_avg.shape)
+        # Save the average matrix of all ROIs
+        if hem == 'lh':
+            file = subdir + "/" + subname + "/glm/noisefiltering/roi_avg_lh_{}.npy".format(template)
+            np.save(file, roi_avg)
+        else:
+            file = subdir + "/" + subname + "/glm/noisefiltering/roi_avg_rh_{}.npy".format(template)
+            np.save(file, roi_avg)
+        print("*********************************************************")
+        end = time.time()
+        hours, rem = divmod(end - start, 3600)
+        minutes, seconds = divmod(rem, 60)
+        print("Elapsed time Step 2: {:0>2}:{:0>2}:{:05.2f}".format(int(hours), int(minutes), seconds))
+        print("*********************************************************")
+        start = time.time()
+    """""
+    Step 3 : Correlation Matrix
+    """""
+    print("STEP 3: COMPUTING OF THE CORRELATION MATRIX ")
+    roi_avg_lh=np.load(subdir + "/" + subname + "/glm/noisefiltering/roi_avg_lh_{}.npy".format(template))
+    roi_avg_rh = np.load(subdir + "/" + subname + "/glm/noisefiltering/roi_avg_rh_{}.npy".format(template))
+    roi_avg=np.concatenate((roi_avg_lh, roi_avg_rh))
+    print("roi avg shape", roi_avg.shape)
+    gii_matrix_lh=np.load(subdir + "/" + subname + "/glm/noisefiltering/gii_matrix_{}_lh.npy".format(template))
+    gii_matrix_rh=np.load(subdir + "/" + subname + "/glm/noisefiltering/gii_matrix_{}_rh.npy".format(template))
+    gii_matrix=np.concatenate((gii_matrix_lh, gii_matrix_rh))
+    print("gii matrix shape", gii_matrix.shape)
+    correlation_matrix = np.empty((gii_matrix.shape[0], roi_avg.shape[0]))
+    print("correlation matrix shape", correlation_matrix.shape)
+    for n in range(gii_matrix.shape[0]):
+        for m in range(roi_avg.shape[0]):
+            correlation_matrix[n, m] = pearsonr(gii_matrix[n, :], roi_avg[m, :])[0]
+    correlation_matrix[np.where(np.isnan(correlation_matrix[:]))] = 0
+    file = subdir + "/" + subname + "/glm/noisefiltering/correlation_matrix_{}.npy".format(template)
+    np.save(file, correlation_matrix)
+    print("********** Results: **********")
+    print("Dimensions of the correlation Matrix:", correlation_matrix.shape)
+    print("Computing of the correlation matrix, DONE!:", subname)
+    test = np.isnan(correlation_matrix[:])
+    if True in test[:]:
+        print("Nan values exist in correlation matrix")
+        print("Number of Nan Values:", np.sum(test))
+    else:
+        print("No Nan values in correlation matrix")
+    end = time.time()
+    hours, rem = divmod(end - start, 3600)
+    minutes, seconds = divmod(rem, 60)
+    print("Elapsed time Step 3: {:0>2}:{:0>2}:{:05.2f}".format(int(hours), int(minutes), seconds ))
+
+def correlation_voxel_voxel(subdir, sub, template):
+    """"
+    This code allows to compute the correlation bewteen vowels and ROIs.
+    It needs a set of labels (annotation files) and gii files.
+    The code is decomposed into three phases (procedures)
+        :proc  1: matrix construction of gii file (each line is a voxel, and the column is the j time serie)
+        :proc  2: : for each ROI, we save the set of selected voxels based on the annotation file (labels)
+        !proc  3: Coorelation matrix, for each voxel we compute their correlation with the average value of each ROI
+
+    """
+    trgt_fsaverage = '/hpc/soft/freesurfer/freesurfer_6.0.0/subjects/fsaverage/label/'
+    trgt_fsaverage5 = '/hpc/soft/freesurfer/freesurfer_6.0.0/subjects/fsaverage5/label/'
+    trgt = '/hpc/soft/freesurfer/freesurfer_6.0.0/subjects/{}/label/'.format(template)
+
+    subname = sub
+    start = time.time()
+
+    """""
+    Step 1 : Correlation Matrix
+    """""
+    print("STEP 1: COMPUTING OF THE CORRELATION MATRIX ")
+    # roi_avg_lh = np.load(subdir + "/" + subname + "/glm/noisefiltering/roi_avg_lh_{}.npy".format(template))
+    # roi_avg_rh = np.load(subdir + "/" + subname + "/glm/noisefiltering/roi_avg_rh_{}.npy".format(template))
+    # roi_avg = np.concatenate((roi_avg_lh, roi_avg_rh))
+    # print("roi avg shape", roi_avg.shape)
+    gii_matrix_lh = np.load(subdir + "/" + subname + "/glm/noisefiltering/gii_matrix_{}_lh.npy".format(template))
+    gii_matrix_rh = np.load(subdir + "/" + subname + "/glm/noisefiltering/gii_matrix_{}_rh.npy".format(template))
+    gii_matrix = np.concatenate((gii_matrix_lh, gii_matrix_rh))
+    print("gii matrix shape", gii_matrix.shape)
+    correlation_matrix = np.empty((gii_matrix.shape[0], gii_matrix.shape[0]))
+    print("correlation matrix shape", correlation_matrix.shape)
+    for n in range(gii_matrix.shape[0]):
+        for m in range(gii_matrix.shape[0]):
+            correlation_matrix[n, m] = pearsonr(gii_matrix[n, :], gii_matrix[m, :])[0]
+    correlation_matrix[np.where(np.isnan(correlation_matrix[:]))] = 0
+    file = subdir + "/" + subname + "/glm/noisefiltering/correlation_matrix_voxel_voxel_{}.npy".format(template)
+    np.save(file, correlation_matrix)
+    print("********** Results: **********")
+    print("Dimensions of the correlation Matrix:", correlation_matrix.shape)
+    print("Computing of the correlation matrix, DONE!:", subname)
+    test = np.isnan(correlation_matrix[:])
+    if True in test[:]:
+        print("Nan values exist in correlation matrix")
+        print("Number of Nan Values:", np.sum(test))
+    else:
+        print("No Nan values in correlation matrix")
+    end = time.time()
+    hours, rem = divmod(end - start, 3600)
+    minutes, seconds = divmod(rem, 60)
+    print("Elapsed time Step 3: {:0>2}:{:0>2}:{:05.2f}".format(int(hours), int(minutes), seconds))
+
+    # Fsaverage
+
+    # 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, 621):
+    #         filename = subdir + "/" + subname + "/glm/noisefiltering/Res_{:04d}.{}.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 = subdir + "/" + subname + "/glm/noisefiltering/gii_matrix_lh.npy"
+    #         np.save(file, gii_matrix)
+    #     else:
+    #         file = subdir + "/" + subname + "/glm/noisefiltering/gii_matrix_rh.npy"
+    #         np.save(file, gii_matrix)
+    #     end = time.time()
+    #     hours, rem = divmod(end - start, 3600)
+    #     minutes, seconds = divmod(rem, 60)
+    #     print("Elapsed time Step 1: {:0>2}:{:0>2}:{:05.2f}".format(int(hours), int(minutes), seconds))
+    #     start = time.time()
+    #     """""
+    #     Step 2 : ROI averaging.
+    #     """""
+    #     # Read Annotation LH file
+    #     print("STEP 2: ROI AVERAGING")
+    #     print("Read annotation {} file: {}.aparc.a2009s.annot".format(hem, hem))
+    #     # filepath = subdir + "/" + subname + "/label/{}.aparc.a2009s.annot".format(hem) # espace natif
+    #     filepath = trgt_fsaverage5 + "{}.aparc.a2009s.annot".format(hem)  # espace fsaverage
+    #     [labels, ctab, names] = nib.freesurfer.io.read_annot(filepath, orig_ids=False)
+    #     print("labels {}".format(hem), labels)
+    #     print("Size of labels", labels.shape)
+    #     # print("List of names", names)
+    #     print("Number of ROIs", len(names))
+    #     # ID Regions Extraction
+    #     print("ID ROI extraction")
+    #     Id_ROI = np.asarray(sorted(set(labels)))
+    #     print("Ids ROIs:", Id_ROI)
+    #     print("ROIs dimensions:", Id_ROI.shape)
+    #     # print("len",len(labels))
+    #
+    #     # Extract time series for each ROI (averaging)
+    #     print('Extract time series for each ROI by averaging operation')
+    #     roi_avg = np.empty((len(Id_ROI), gii_matrix.shape[1]))
+    #     for i in range(0, len(Id_ROI)):
+    #         print("*********************************************************")
+    #         print("ID ROI:", Id_ROI[i])
+    #         mask = np.where(labels == Id_ROI[i])
+    #         roi_timeseries = gii_matrix[mask, :].mean(1)
+    #         roi_avg[i, :] = roi_timeseries
+    #     print("*********************************************************")
+    #     print("********** Results: **********")
+    #     print("Size of the Average Matrix of ALL ROIs", roi_avg.shape)
+    #     # Save the average matrix of all ROIs
+    #     if hem == 'lh':
+    #         file = subdir + "/" + subname + "/glm/noisefiltering/roi_avg_lh.npy"
+    #         np.save(file, roi_avg)
+    #     else:
+    #         file = subdir + "/" + subname + "/glm/noisefiltering/roi_avg_rh.npy"
+    #         np.save(file, roi_avg)
+    #     print("*********************************************************")
+    #     end = time.time()
+    #     hours, rem = divmod(end - start, 3600)
+    #     minutes, seconds = divmod(rem, 60)
+    #     print("Elapsed time Step 2: {:0>2}:{:0>2}:{:05.2f}".format(int(hours), int(minutes), seconds))
+    #     print("*********************************************************")
+    #     start = time.time()
+    #
+    # """""
+    # Step 3 : Correlation Matrix
+    # """""
+    # print("STEP 3: COMPUTING OF THE CORRELATION MATRIX ")
+    # roi_avg_lh=np.load(subdir + "/" + subname + "/glm/noisefiltering/roi_avg_lh.npy")
+    # roi_avg_rh = np.load(subdir + "/" + subname + "/glm/noisefiltering/roi_avg_rh.npy")
+    # roi_avg=np.concatenate((roi_avg_lh, roi_avg_rh))
+    # print("roi avg shape", roi_avg.shape)
+    # gii_matrix_lh=np.load(subdir + "/" + subname + "/glm/noisefiltering/gii_matrix_lh.npy")
+    # gii_matrix_rh=np.load(subdir + "/" + subname + "/glm/noisefiltering/gii_matrix_rh.npy")
+    # gii_matrix=np.concatenate((gii_matrix_lh, gii_matrix_rh))
+    # print("gii matrix shape", gii_matrix.shape)
+    # correlation_matrix = np.empty((gii_matrix.shape[0], roi_avg.shape[0]))
+    # print("correlation matrix shape", correlation_matrix.shape)
+    # for n in range(gii_matrix.shape[0]):
+    #     for m in range(roi_avg.shape[0]):
+    #         correlation_matrix[n, m] = pearsonr(gii_matrix[n, :], roi_avg[m, :])[0]
+    # file = subdir + "/" + subname + "/glm/noisefiltering/correlation_matrix.npy"
+    # np.save(file, correlation_matrix)
+    # print("********** Results: **********")
+    # print("Dimensions of the correlation Matrix:", correlation_matrix.shape)
+    # print("Computing of the correlation matrix, DONE!:", subname)
+    # end = time.time()
+    # hours, rem = divmod(end - start, 3600)
+    # minutes, seconds = divmod(rem, 60)
+    # print("Elapsed time Step 3: {:0>2}:{:0>2}:{:05.2f}".format(int(hours), int(minutes), seconds))
+
+
+
+def convert_mesh(subdir, sub, hem_list=['lh', 'rh']):
+    """
+        Convert whit mesh to to surface saved as Gifti file.
+
+        Projection is done for left and right
+        :param fs_subdir: FreeSurfer subjects directory
+        :param sub: Subject name
+        :param nii_file: Splitted .nii directory
+        :param gii_dir: Output directory
+        :param gii_sfx: Gifti files suffix (add to the hemisphere name)
+        :param tgt_subject: Name of target subject
+        :param hem_list: Hemispheres (default: left and right)
+        :param sfwhm: Surface smoothing (default = 0mm)
+    """
+    for hem in hem_list:
+        fs_subdir = "/hpc/banco/cagna.b/my_intertva/surf/data/" + sub + "/fs/" +sub+ "/surf/{}.white".format(hem)
+        gii_subdir = subdir + "/" + sub + "/glm/noisefiltering/{}.white.gii".format(hem)
+
+        cmd = '$FREESURFER_HOME/bin/mris_convert {} {}'.format(fs_subdir, gii_subdir)
+
+        os.system(cmd)
+
+
+def solve_nan(subdir, sub):
+    start = time.time()
+    subname=sub
+    for ct in range(1, 621):
+        filename = subdir + "/" + subname + "/glm/noisefiltering/Res_{:04d}.nii".format(ct)
+        print(filename)
+        ex = os.path.join(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)
+    # elapsed_time_fl = (time.time() - start)
+    # print("elapsed time:", elapsed_time_fl)
+    end = time.time()
+    hours, rem = divmod(end - start, 3600)
+    minutes, seconds = divmod(rem, 60)
+    print("Elapsed time: {:0>2}:{:0>2}:{:05.2f}".format(int(hours), int(minutes), seconds))