Beispiel #1
0
def calc_tsnr(fname, in_file, epi_mask):

    tsnr = TSNR()
    tsnr.inputs.in_file = in_file
    tsnr.inputs.tsnr_file = "{}.nii.gz".format(fname)
    tsnr.inputs.mean_file = "{}_mean.nii.gz".format(fname)
    tsnr.inputs.stddev_file = "{}_stddev.nii.gz".format(fname)
    tsnr.run()

    # FROM MRIQC
    # Get EPI data (with mc done) and get it ready
    msknii = nb.load(epi_mask)
    mskdata = np.nan_to_num(msknii.get_data())
    mskdata = mskdata.astype(np.uint8)
    mskdata[mskdata < 0] = 0
    mskdata[mskdata > 0] = 1

    tsnr_data = nb.load("{}.nii.gz".format(fname)).get_data()
    tsnr_val = float(np.median(tsnr_data[mskdata > 0]))

    return tsnr_val
Beispiel #2
0
    def calc_iqms(self):
        # tSNR
        tsnr = TSNR()
        tsnr.inputs.in_file = self.source_img
        tsnr.inputs.mean_file = os.path.join(self.outputdir, self.task,
                                             self.task + "_mean_tsnr.nii.gz")
        tsnr_res = tsnr.run()
        mean_tsnr_img = tsnr_res.outputs.mean_file
        stat = fsl.ImageStats(in_file=mean_tsnr_img, op_string=' -M')
        stat_run = stat.run()
        mean_tsnr = round(stat_run.outputs.out_stat, 2)
        # framewise-displacement
        if type(
                self.confounds
        ) == str:  # ensure self.confounds doesn't refer to empty string
            mean_fd = 'n/a'
        else:
            column_means = self.confounds.mean(axis=0, skipna=True)
            mean_fd = round(column_means['framewise_displacement'], 2)

        return mean_tsnr, mean_fd
from os.path import basename
from nipype.algorithms.confounds import TSNR
from nilearn.image import math_img

for res_path in ['res_02_tsnr', 'res_02_mean']:
    if not os.path.exists(res_path):
        os.makedirs(res_path)

task = 'MGT'

for sidx in [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]:
    for ridx in range(1, 5):
        for i, in_file in enumerate([
                'fmriflows/preproc_func/sub-{0:03d}/sub-{0:03d}_task-{2}_run-{1:02d}_tFilter_5.0.100.0_sFilter_LP_0.0mm.nii.gz',
                'fmriflows/preproc_func/sub-{0:03d}/sub-{0:03d}_task-{2}_run-{1:02d}_tFilter_None.100.0_sFilter_LP_0.0mm.nii.gz',
                'fmriprep/sub-{0:03d}/func/sub-{0:03d}_task-{2}_run-{1:02d}_space-MNI152NLin2009cAsym_desc-preproc_bold.nii.gz',
                'fsl_feat/sub-{0:03d}/sub-{0:03d}_task-{2}_run-{1:02d}_bold_norm.nii.gz',
                'spm/sub-{0:03d}/wsub-{0:03d}_task-{2}_run-{1:02d}_bold.nii.gz',
        ]):

            in_file = in_file.format(sidx, ridx, task)
            file_name = basename(in_file).replace('.nii.gz', '')
            out_tsnr = 'res_02_tsnr/tsnr_%s.nii.gz' % file_name
            out_mean = 'res_02_mean/mean_%s.nii.gz' % file_name

            tsnr = TSNR(regress_poly=2,
                        in_file=in_file,
                        tsnr_file=out_tsnr,
                        mean_file=out_mean)
            res = tsnr.run()
def make_subject_qc(population, workspace):
    print '========================================================================================'
    print ''
    print '                    Tourettome - 006. QUALITY CONTROL                                   '
    print ''
    print '========================================================================================'

    count = 0
    for subject in population:

        count +=1

        print '%s.Running Quality Control for subject %s' %(count, subject)

        site_id = subject[0:2]
        subdir  = os.path.join(workspace, subject)
        qcdir   = mkdir_path(os.path.join(workspace, subject, 'QUALITY_CONTROL'))
        os.chdir(qcdir)

        df = pd.DataFrame(index=['%s' % subject])

        # EXTRACT ANATOMICAL AND FUNCTIONAL IMAGE QUALITY METRICS

        if not os.path.isfile(os.path.join(qcdir, 'quality_paramters.csv')):

            ############################################################################################
            #  Anatomical measures

            # Load data
            anat       = nb.load(os.path.join(subdir, 'RAW',        'ANATOMICAL.nii.gz' )).get_data()
            anat_mask  = nb.load(os.path.join(subdir, 'ANATOMICAL', 'ANATOMICAL_BRAIN_MASK.nii.gz' )).get_data()
            anat_gm    = nb.load(os.path.join(subdir, 'ANATOMICAL', 'seg_spm/c1ANATOMICAL.nii' )).get_data()
            anat_wm    = nb.load(os.path.join(subdir, 'ANATOMICAL', 'seg_spm/c2ANATOMICAL.nii' )).get_data()
            anat_csf   = nb.load(os.path.join(subdir, 'ANATOMICAL', 'seg_spm/c3ANATOMICAL.nii' )).get_data()

            # Intermediate measures
            anat_fg_mu, anat_fg_sd, anat_fg_size    = summary_mask(anat, anat_mask)
            anat_gm_mu, anat_gm_sd, anat_gm_size    = summary_mask(anat, np.where(anat_gm > 0.5, 1, 0 ))
            anat_wm_mu, anat_wm_sd, anat_wm_size    = summary_mask(anat, np.where(anat_wm > 0.5, 1, 0 ))
            anat_csf_mu, anat_gm_sd, anat_csf_size  = summary_mask(anat, np.where(anat_csf > 0.5, 1, 0 ))
            anat_bg_data, anat_bg_mask              = get_background(anat, anat_mask)
            anat_bg_mu, anat_bg_sd, anat_bg_size    = summary_mask(anat, anat_bg_mask)

            # Calculate spatial anatomical summary measures
            df.loc[subject, 'qc_anat_cjv']  = mriqca.cjv(anat_wm_mu, anat_gm_mu, anat_wm_sd, anat_gm_sd)
            df.loc[subject, 'qc_anat_cnr']  = mriqca.cnr(anat_wm_mu, anat_gm_mu, anat_bg_sd)
            df.loc[subject, 'qc_anat_snr']  = mriqca.snr(anat_fg_mu, anat_fg_sd, anat_fg_size)
            df.loc[subject, 'qc_anat_snrd'] = mriqca.snr_dietrich(anat_fg_mu, anat_bg_sd)
            df.loc[subject, 'qc_anat_efc']  = mriqca.efc(anat)
            df.loc[subject, 'qc_anat_fber'] = mriqca.fber(anat, anat_mask)
            # df.loc[subject]['qc_anat_fwhm'] = fwhm(os.path.join(subdir, 'RAW','ANATOMICAL.nii.gz' ),
            #                                        os.path.join(subdir, 'ANATOMICAL', 'ANATOMICAL_BRAIN_MASK.nii.gz'),out_vox=False)

            ############################################################################################
            # Functional measures

            # Load data
            func      =  np.mean(nb.load(os.path.join(subdir, 'FUNCTIONAL', 'REST_EDIT.nii.gz' )).get_data(), axis =3)
            func_mask =  nb.load(os.path.join(subdir, 'FUNCTIONAL', 'REST_BRAIN_MASK.nii.gz' )).get_data()
            movpar    =  os.path.join(subdir, 'FUNCTIONAL', 'moco/REST_EDIT_moco2.par')

            # Calculate spatial functional summary measures
            func_fg_mu, func_fg_sd, func_fg_size = summary_mask(func, func_mask)
            df.loc[subject, 'qc_func_snr']  = mriqca.snr(func_fg_mu, func_fg_sd, func_fg_size)
            df.loc[subject, 'qc_func_efc']  = mriqca.efc(func)
            df.loc[subject, 'qc_func_fber'] = mriqca.fber(func, func_mask)
            # df.loc[subject]['qc_func_fwhm'] = fwhm(func, func_mask, out_vox=False)

            # Calculate temporal functional summary measures
            FD1D          = np.loadtxt(calculate_FD_Power(movpar))
            frames_in     = [frame for frame, val in enumerate(FD1D) if val < 0.2]
            quat          = int(len(FD1D) / 4)
            fd_in_percent = (float(len(frames_in)) / float(len(FD1D))) * 100.

            df.loc[subject, 'qc_func_fd']     = str(np.round(np.mean(FD1D), 3))
            df.loc[subject, 'qc_func_fd_in']  = str(np.round(fd_in_percent, 2))
            df.loc[subject, 'qc_func_fd']     = str(np.round(np.mean(FD1D), 3))
            df.loc[subject, 'qc_func_fd_max'] = str(np.round(np.max(FD1D), 3))
            df.loc[subject, 'qc_func_fd_q4 '] = str(np.round(np.mean(np.sort(FD1D)[::-1][:quat]), 3))
            df.loc[subject, 'qc_func_fd_rms'] = str(np.round(np.sqrt(np.mean(FD1D)), 3))

            # Calculate DVARS
            func_proc = os.path.join(subdir, 'REGISTRATION', 'REST_EDIT_UNI_BRAIN_MNI2mm.nii.gz')
            func_gm = os.path.join(subdir, 'REGISTRATION', 'ANATOMICAL_GM_MNI2mm.nii.gz')
            df.loc[subject, 'qc_func_dvars']    = np.mean(np.load(calculate_DVARS(func_proc, func_gm)))

            # Calculate TSNR map
            if not os.path.isfile(os.path.join(qcdir, 'tsnr.nii.gz')):
                 tsnr = TSNR()
                 tsnr.inputs.in_file = os.path.join(subdir, 'FUNCTIONAL', 'REST_EDIT.nii.gz')
                 tsnr.run()
                 # os.system('flirt -in tsnr -ref ../ANATOMICAL/ANATOMICAL -applxfm -init ../REGISTRATION/reg_anat/rest2anat_2.mat -out tsnr2anat')

            if not os.path.isfile('TSNR_data.npy'):
                 tsnr_data = nb.load('./tsnr.nii.gz').get_data()
                 nan_mask = np.logical_not(np.isnan(tsnr_data))
                 mask = func_mask > 0
                 data = tsnr_data[np.logical_and(nan_mask, mask)]
                 np.save(os.path.join(os.getcwd(), 'TSNR_data.npy'), data)


            df.loc[subject, 'qc_func_tsnr'] = str(np.round(np.median(np.load('TSNR_data.npy')), 3))

            df.to_csv('quality_paramters.csv')

        ############################################################################################
        #  Make Image Quality Plots

        if not os.path.isfile(os.path.join(qcdir, 'plot_func_tsnr.png')):

            # 1. anat brain mask
            plot_quality(os.path.join(subdir, 'RAW', 'ANATOMICAL.nii.gz'),
                         os.path.join(subdir, 'ANATOMICAL', 'ANATOMICAL_BRAIN_MASK.nii.gz'),
                         subject[0:2], '%s-anat_brain_mask' % subject, 'r', alpha=0.9, title='plot_anat_brain_mask.png')

            # 2. anat gm seg
            plot_quality(os.path.join(subdir, 'RAW', 'ANATOMICAL.nii.gz'),
                         os.path.join(subdir, 'ANATOMICAL', 'ANATOMICAL_GM.nii.gz'),
                         subject[0:2], '%s-anat_gm_seg' % subject, 'r', alpha=0.9, title='plot_anat_gm_seg.png')

            # 3. anat2mni
            plot_quality(mni_head_1mm, os.path.join(subdir, 'REGISTRATION', 'ANATOMICAL_GM_MNI1mm.nii.gz'),
                         'MNI', '%s-anat_gm_seg' % subject, 'r', alpha=0.9, title='plot_anat2mni.png',
                         tissue2=os.path.join(subdir, 'REGISTRATION', 'ANATOMICAL_CSF_MNI1mm.nii.gz'))

            # 4. func2mni
            plot_quality(os.path.join(subdir, 'REGISTRATION', 'REST_EDIT_MOCO_BRAIN_MEAN_BBR_ANAT1mm.nii.gz'),
                         os.path.join(subdir, 'ANATOMICAL', 'ANATOMICAL_GM.nii.gz'),
                         subject[0:2], '%s-func2mni' % subject, 'r', alpha=0.9, title='plot_func2anat.png')

            # 5. func_tsnr
            plot_quality(os.path.join(subdir, 'QUALITY_CONTROL', 'tsnr.nii.gz'), None,
                         'TSNR', '%s-func_tsnr' % subject, 'r', alpha=0.9, title='plot_func_tsnr.png')

        # 6. plot FD, DVARS, CARPET

        resid = nb.load(os.path.join(subdir, 'DENOISE/residuals_compcor/residual_bp_z.nii.gz')).get_data().astype(np.float32)
        gm = resid[nb.load(os.path.join(subdir, 'DENOISE/tissue_signals/gm_mask.nii.gz')).get_data().astype('bool')]
        wm = resid[nb.load(os.path.join(subdir, 'DENOISE/tissue_signals/wm_mask.nii.gz')).get_data().astype('bool')]
        cm = resid[nb.load(os.path.join(subdir, 'DENOISE/tissue_signals/csf_mask.nii.gz')).get_data().astype('bool')]
        fd = np.loadtxt(os.path.join(subdir, 'QUALITY_CONTROL/FD.1D'))
        dv = np.load(os.path.join(subdir, 'QUALITY_CONTROL/DVARS.npy'))

        if not os.path.isfile(os.path.join(qcdir,'xplot_func_motion.png')):
            plot_temporal(gm, wm, cm, fd, dv, os.path.join(qcdir,'plot_func_motion.png'))
Beispiel #5
0
for f in filelist.func:
    print(f)
    tsnr=TSNR()
    tsnr.inputs.in_file=f
    scanDir=op.dirname(f)
    scan=op.basename(f).split('.')[0]
#    src = str(Path(scanDir,scan + '.nii'))
#    dest = str(Path(scanDir, "cp_" + scan + '.nii'))
#    copy2(src, dest) # To make sure you don't have to run the normalization again.

    #print(scanDir,name)
    tsnr.inputs.tsnr_file=str(Path(scanDir,"tsnr_"+ scan + '_tsnr.nii'))
    tsnr.inputs.stddev_file=str(Path(scanDir,"tsnr_" + scan + '_std.nii'))
    tsnr.inputs.mean_file=str(Path(scanDir,"tsnr_"+scan+'_mean.nii'))
    tsnr.inputs.detrended_file=str(Path(scanDir,"tsnr_" + scan + '_detrended.nii'))
    res = tsnr.run().outputs

    for key in ['stddev_file','mean_file','tsnr_file']:
        results[f][key] = eval('res.'+key) # eval is BAD practice in python, but to build this dictionary, the variable must be called dynamically



for k,v in results.items():
    tsnr_map=v['tsnr_file']
    comp_file=v['mean_file']
    plot_anat(comp_file, title=comp_file, display_mode='z', dim=-1, draw_cross=False)
    plot_anat(tsnr_map, title=tsnr_map, display_mode='z', dim=-1, draw_cross=False)