def qap_functional_temporal( func_motion_correct, func_brain_mask, coord_xfm_matrix, subject_id, session_id, scan_id, site_name=None, motion_threshold=1.0, ): import sys from qap.temporal_qc import ( mean_dvars_wrapper, summarize_fd, mean_outlier_timepoints, mean_quality_timepoints, global_correlation, ) # DVARS mean_dvars = mean_dvars_wrapper(func_motion_correct, func_brain_mask) # Mean FD (Jenkinson) (mean_fd, num_fd, percent_fd) = summarize_fd(coord_xfm_matrix, threshold=motion_threshold) # 3dTout mean_outlier = mean_outlier_timepoints(func_motion_correct, func_brain_mask) # 3dTqual mean_quality = mean_quality_timepoints(func_motion_correct) # new thing gcor = global_correlation(func_motion_correct, func_brain_mask) # Compile qc = { "subject": subject_id, "session": session_id, "scan": scan_id, "dvars": mean_dvars, "mean_fd": mean_fd, "num_fd": num_fd, "perc_fd": percent_fd, "outlier": mean_outlier, "quality": mean_quality, "gcor": gcor, } if site_name: qc["site"] = site_name return qc
def test_global_correlation(): import os import pkg_resources as p import numpy.testing as nt from qap.temporal_qc import global_correlation func_reorient = p.resource_filename("qap", os.path.join(test_sub_dir, \ "func_reorient.nii.gz")) func_mask = p.resource_filename("qap", os.path.join(test_sub_dir, \ "functional_brain_mask.nii.gz")) gcor = global_correlation(func_reorient, func_mask) nt.assert_almost_equal(gcor, 0.13903011798720202, decimal=4)
def test_global_correlation(): import os import pkg_resources as p from qap.temporal_qc import global_correlation func_motion = p.resource_filename("qap", os.path.join(test_sub_dir, \ "rest_1", \ "func_motion_correct", \ "rest_calc_tshift_resample_" \ "volreg.nii.gz")) func_mask = p.resource_filename("qap", os.path.join(test_sub_dir, \ "rest_1", \ "functional_brain_mask", \ "rest_calc_tshift_resample_volreg" \ "_mask.nii.gz")) gcor = global_correlation(func_motion, func_mask) assert gcor == 0.0090767564485253263
def qap_functional_temporal( func_timeseries, func_brain_mask, bg_func_brain_mask, fd_file, subject_id, session_id, scan_id, site_name=None, starter=None): """ Calculate the functional temporal QAP measures for a functional scan. - The inclusion of the starter node allows several QAP measure pipelines which are not dependent on one another to be executed as one pipeline. This allows the MultiProc Nipype plugin to efficiently manage resources when parallelizing. :type func_timeseries: str :param func_timeseries: Filepath to the 4D functional timeseries. :type func_brain_mask: str :param func_brain_mask: Filepath to the binary mask defining the brain within the functional image. :type bg_func_brain_mask: str :param bg_func_brain_mask: Filepath to the inversion of the functional brain mask. :type fd_file: str :param fd_file: File containing the RMSD values (calculated previously). :type subject_id: str :param subject_id: The participant ID. :type session_id: str :param session_id: The session ID. :type scan_id: str :param scan_id: The scan ID. :type site_name: str :param site_name: (default: None) The name of the site where the scan was acquired. :type starter: str :param starter: (default: None) If this function is being pulled into a Nipype pipeline, this is the dummy input for the function node. :rtype: dict :return: A dictionary mapping out the QAP measure values for the current participant. """ import numpy as np from time import strftime import qap from qap.temporal_qc import outlier_timepoints, quality_timepoints, \ global_correlation, calculate_percent_outliers from qap.dvars import calc_dvars # DVARS dvars = calc_dvars(func_timeseries, func_brain_mask) dvars_outliers, dvars_IQR = calculate_percent_outliers(dvars) mean_dvars = dvars.mean(0) mean_dvars = mean_dvars[0] # Mean FD (Jenkinson) fd = np.loadtxt(fd_file) meanfd_outliers, meanfd_IQR = calculate_percent_outliers(fd) # 3dTout outliers = outlier_timepoints(func_timeseries, mask_file=func_brain_mask) # calculate the outliers of the outliers! AAHH! outlier_perc_out, outlier_IQR = calculate_percent_outliers(outliers) # 3dTout (outside of brain) oob_outliers = outlier_timepoints(func_timeseries, mask_file=bg_func_brain_mask) oob_outlier_perc_out, oob_outlier_IQR = \ calculate_percent_outliers(oob_outliers) # 3dTqual quality = quality_timepoints(func_timeseries) quality_outliers, quality_IQR = calculate_percent_outliers(quality) # GCOR gcor = global_correlation(func_timeseries, func_brain_mask) # Compile id_string = "%s %s %s" % (subject_id, session_id, scan_id) qc = { id_string: { "QAP_pipeline_id": "QAP version %s" % qap.__version__, "Time": strftime("%Y-%m-%d %H:%M:%S"), "Participant": str(subject_id), "Session": str(session_id), "Series": str(scan_id), "functional_temporal": { "Std. DVARS (Mean)": mean_dvars, "Std. DVARS (Std Dev)": np.std(dvars), "Std. DVARS (Median)": np.median(dvars), "Std. DVARs IQR": dvars_IQR, "Std. DVARS percent outliers": dvars_outliers, "RMSD (Mean)": np.mean(fd), "RMSD (Std Dev)": np.std(fd), "RMSD (Median)": np.median(fd), "RMSD IQR": meanfd_IQR, "RMSD percent outliers": meanfd_outliers, "Fraction of Outliers (Mean)": np.mean(outliers), "Fraction of Outliers (Std Dev)": np.std(outliers), "Fraction of Outliers (Median)": np.median(outliers), "Fraction of Outliers IQR": outlier_IQR, "Fraction of Outliers percent outliers": outlier_perc_out, "Fraction of OOB Outliers (Mean)": np.mean(oob_outliers), "Fraction of OOB Outliers (Std Dev)": np.std(oob_outliers), "Fraction of OOB Outliers (Median)": np.median(oob_outliers), "Fraction of OOB Outliers IQR": oob_outlier_IQR, "Fraction of OOB Outliers percent outliers": oob_outlier_perc_out, "Quality (Mean)": np.mean(quality), "Quality (Std Dev)": np.std(quality), "Quality (Median)": np.median(quality), "Quality IQR": quality_IQR, "Quality percent outliers": quality_outliers, "GCOR": gcor } } } if site_name: qc[id_string]['Site'] = str(site_name) for key in qc[id_string]["functional_temporal"].keys(): qc[id_string]["functional_temporal"][key] = \ str(qc[id_string]["functional_temporal"][key]) return qc
def qap_functional_temporal(func_timeseries, func_brain_mask, bg_func_brain_mask, fd_file, subject_id, session_id, scan_id, site_name=None, starter=None): """ Calculate the functional temporal QAP measures for a functional scan. - The inclusion of the starter node allows several QAP measure pipelines which are not dependent on one another to be executed as one pipeline. This allows the MultiProc Nipype plugin to efficiently manage resources when parallelizing. :type func_timeseries: str :param func_timeseries: Filepath to the 4D functional timeseries. :type func_brain_mask: str :param func_brain_mask: Filepath to the binary mask defining the brain within the functional image. :type bg_func_brain_mask: str :param bg_func_brain_mask: Filepath to the inversion of the functional brain mask. :type fd_file: str :param fd_file: File containing the RMSD values (calculated previously). :type subject_id: str :param subject_id: The participant ID. :type session_id: str :param session_id: The session ID. :type scan_id: str :param scan_id: The scan ID. :type site_name: str :param site_name: (default: None) The name of the site where the scan was acquired. :type starter: str :param starter: (default: None) If this function is being pulled into a Nipype pipeline, this is the dummy input for the function node. :rtype: dict :return: A dictionary mapping out the QAP measure values for the current participant. """ import numpy as np from time import strftime import qap from qap.temporal_qc import outlier_timepoints, quality_timepoints, \ global_correlation, calculate_percent_outliers from qap.dvars import calc_dvars # DVARS dvars = calc_dvars(func_timeseries, func_brain_mask) dvars_outliers, dvars_IQR = calculate_percent_outliers(dvars) mean_dvars = dvars.mean(0) mean_dvars = mean_dvars[0] # Mean FD (Jenkinson) fd = np.loadtxt(fd_file) meanfd_outliers, meanfd_IQR = calculate_percent_outliers(fd) # 3dTout outliers = outlier_timepoints(func_timeseries, mask_file=func_brain_mask) # calculate the outliers of the outliers! AAHH! outlier_perc_out, outlier_IQR = calculate_percent_outliers(outliers) # 3dTout (outside of brain) oob_outliers = outlier_timepoints(func_timeseries, mask_file=bg_func_brain_mask) oob_outlier_perc_out, oob_outlier_IQR = \ calculate_percent_outliers(oob_outliers) # 3dTqual quality = quality_timepoints(func_timeseries) quality_outliers, quality_IQR = calculate_percent_outliers(quality) # GCOR gcor = global_correlation(func_timeseries, func_brain_mask) # Compile id_string = "%s %s %s" % (subject_id, session_id, scan_id) qc = { id_string: { "QAP_pipeline_id": "QAP version %s" % qap.__version__, "Time": strftime("%Y-%m-%d %H:%M:%S"), "Participant": str(subject_id), "Session": str(session_id), "Series": str(scan_id), "functional_temporal": { "Std. DVARS (Mean)": mean_dvars, "Std. DVARS (Std Dev)": np.std(dvars), "Std. DVARS (Median)": np.median(dvars), "Std. DVARs IQR": dvars_IQR, "Std. DVARS percent outliers": dvars_outliers, "RMSD (Mean)": np.mean(fd), "RMSD (Std Dev)": np.std(fd), "RMSD (Median)": np.median(fd), "RMSD IQR": meanfd_IQR, "RMSD percent outliers": meanfd_outliers, "Fraction of Outliers (Mean)": np.mean(outliers), "Fraction of Outliers (Std Dev)": np.std(outliers), "Fraction of Outliers (Median)": np.median(outliers), "Fraction of Outliers IQR": outlier_IQR, "Fraction of Outliers percent outliers": outlier_perc_out, "Fraction of OOB Outliers (Mean)": np.mean(oob_outliers), "Fraction of OOB Outliers (Std Dev)": np.std(oob_outliers), "Fraction of OOB Outliers (Median)": np.median(oob_outliers), "Fraction of OOB Outliers IQR": oob_outlier_IQR, "Fraction of OOB Outliers percent outliers": oob_outlier_perc_out, "Quality (Mean)": np.mean(quality), "Quality (Std Dev)": np.std(quality), "Quality (Median)": np.median(quality), "Quality IQR": quality_IQR, "Quality percent outliers": quality_outliers, "GCOR": gcor } } } if site_name: qc[id_string]['Site'] = str(site_name) for key in qc[id_string]["functional_temporal"].keys(): qc[id_string]["functional_temporal"][key] = \ str(qc[id_string]["functional_temporal"][key]) return qc
def qap_functional_temporal(func_motion_correct, func_brain_mask, tsnr_volume, fd_file, subject_id, session_id, scan_id, site_name=None, motion_threshold=1.0): import sys import nibabel as nb import numpy as np from qap.temporal_qc import mean_dvars_wrapper, mean_outlier_timepoints, \ mean_quality_timepoints, global_correlation # DVARS mean_dvars = mean_dvars_wrapper(func_motion_correct, func_brain_mask) # Mean FD (Jenkinson) fd = np.loadtxt(fd_file) # Calculate Outliers # Number and Percent of frames (time points) where # movement (FD) exceeded threshold num_fd = np.float((fd > motion_threshold).sum()) percent_fd = (num_fd * 100) / (len(fd) + 1) # 3dTout mean_outlier = mean_outlier_timepoints(func_motion_correct, func_brain_mask) # 3dTqual mean_quality = mean_quality_timepoints(func_motion_correct) # new thing gcor = global_correlation(func_motion_correct, func_brain_mask) # tSNR tsnr_data = nb.load(tsnr_volume).get_data() msk_data = np.ones_like(tsnr_data) try: msk_data = nb.load(func_brain_mask).get_data() except: pass # Compile qc = { "subject": subject_id, "session": session_id, "scan": scan_id, "dvars": mean_dvars, "m_tsnr": np.median(tsnr_data[msk_data > 0]), "mean_fd": fd.mean(), 'num_fd': num_fd, 'perc_fd': percent_fd, "outlier": mean_outlier, "quality": mean_quality, "gcor": gcor } if site_name: qc['site'] = site_name return qc
def qap_functional_temporal( func_motion_correct, func_brain_mask, tsnr_volume, fd_file, subject_id, session_id, scan_id, site_name=None, motion_threshold=1.0, ): import sys import nibabel as nb import numpy as np from qap.temporal_qc import mean_dvars_wrapper, mean_outlier_timepoints, mean_quality_timepoints, global_correlation # DVARS mean_dvars = mean_dvars_wrapper(func_motion_correct, func_brain_mask) # Mean FD (Jenkinson) fd = np.loadtxt(fd_file) # Calculate Outliers # Number and Percent of frames (time points) where # movement (FD) exceeded threshold num_fd = np.float((fd > motion_threshold).sum()) percent_fd = (num_fd * 100) / (len(fd) + 1) # 3dTout mean_outlier = mean_outlier_timepoints(func_motion_correct, func_brain_mask) # 3dTqual mean_quality = mean_quality_timepoints(func_motion_correct) # new thing gcor = global_correlation(func_motion_correct, func_brain_mask) # tSNR tsnr_data = nb.load(tsnr_volume).get_data() msk_data = np.ones_like(tsnr_data) try: msk_data = nb.load(func_brain_mask).get_data() except: pass # Compile qc = { "subject": subject_id, "session": session_id, "scan": scan_id, "dvars": mean_dvars, "m_tsnr": np.median(tsnr_data[msk_data > 0]), "mean_fd": fd.mean(), "num_fd": num_fd, "perc_fd": percent_fd, "outlier": mean_outlier, "quality": mean_quality, "gcor": gcor, } if site_name: qc["site"] = site_name return qc