def calc_prob_map(hemi='lh'): import numpy as np import nibabel as nib from cxy_hcp_ffa.lib.predefine import roi2label from magicbox.io.io import save2nifti # inputs n_roi = len(roi2label) print(n_roi) roi_file = pjoin(work_dir, f'rois_v3_{hemi}.nii.gz') # outputs out_file = pjoin(work_dir, f'prob_maps_v3_{hemi}.nii.gz') # prepare rois = nib.load(roi_file).get_fdata().squeeze().T n_vtx = rois.shape[1] # calculate prob_maps = np.ones((n_roi, n_vtx)) * np.nan for idx, roi in enumerate(roi2label.keys()): label = roi2label[roi] print(roi) # get indices of subjects which contain the roi indices = rois == label subj_indices = np.any(indices, 1) # calculate roi probability map among valid subjects prob_map = np.mean(indices[subj_indices], 0) prob_maps[idx] = prob_map # save out save2nifti(out_file, prob_maps.T[:, None, None, :])
def calc_meas_individual(hemi='lh'): import nibabel as nib import numpy as np import pickle as pkl from commontool.io.io import CiftiReader from cxy_hcp_ffa.lib.predefine import hemi2stru, roi2label # inputs work_dir = pjoin(proj_dir, 'analysis/s2/1080_fROI/refined_with_Kevin/tfMRI') rois_file = pjoin(proj_dir, 'analysis/s2/1080_fROI/' f'refined_with_Kevin/rois_v3_{hemi}.nii.gz') meas_file = pjoin(proj_dir, 'analysis/s2/activation.dscalar.nii') # outputs out_file = pjoin(work_dir, f'individual_activ_{hemi}.pkl') rois = nib.load(rois_file).get_data().squeeze().T n_roi = len(roi2label) meas_reader = CiftiReader(meas_file) meas = meas_reader.get_data(hemi2stru[hemi], True) n_subj = meas.shape[0] roi_meas = {'shape': 'n_roi x n_subj', 'roi': list(roi2label.keys()), 'meas': np.ones((n_roi, n_subj)) * np.nan} for roi_idx, roi in enumerate(roi_meas['roi']): lbl_idx_arr = rois == roi2label[roi] for subj_idx in range(n_subj): lbl_idx_vec = lbl_idx_arr[subj_idx] if np.any(lbl_idx_vec): roi_meas['meas'][roi_idx, subj_idx] = np.mean( meas[subj_idx][lbl_idx_vec]) pkl.dump(roi_meas, open(out_file, 'wb'))
def calc_meas_individual(gid=1, hemi='lh', morph='thickness'): """ Calculate morphology using individual ROIs. """ import nibabel as nib import numpy as np import pickle as pkl from cxy_hcp_ffa.lib.predefine import hemi2stru, roi2label from commontool.io.io import CiftiReader morph2file = { 'thickness': '/nfs/p1/public_dataset/datasets/hcp/DATA/' 'HCP_S1200_GroupAvg_v1/HCP_S1200_GroupAvg_v1/' 'S1200.All.thickness_MSMAll.32k_fs_LR.dscalar.nii', 'myelin': '/nfs/p1/public_dataset/datasets/hcp/DATA/' 'HCP_S1200_GroupAvg_v1/HCP_S1200_GroupAvg_v1/' 'S1200.All.MyelinMap_BC_MSMAll.32k_fs_LR.dscalar.nii', 'va': '/nfs/p1/public_dataset/datasets/hcp/DATA/' 'HCP_S1200_GroupAvg_v1/HCP_S1200_GroupAvg_v1/' 'S1200.All.midthickness_MSMAll_va.32k_fs_LR.dscalar.nii' } meas_file = morph2file[morph] gid_file = pjoin(proj_dir, 'analysis/s2/1080_fROI/refined_with_Kevin/' f'grouping/group_id_{hemi}.npy') roi_file = pjoin(proj_dir, 'analysis/s2/1080_fROI/refined_with_Kevin/' f'rois_v3_{hemi}.nii.gz') subj_file = pjoin(proj_dir, 'analysis/s2/subject_id') meas_id_file = pjoin(proj_dir, 'data/HCP/subject_id_1096') trg_file = pjoin(work_dir, f'individual_G{gid}_{morph}_{hemi}.pkl') gid_idx_vec = np.load(gid_file) == gid subj_ids = open(subj_file).read().splitlines() subj_ids = [subj_ids[i] for i in np.where(gid_idx_vec)[0]] n_subj = len(subj_ids) roi_maps = nib.load(roi_file).get_data().squeeze().T[gid_idx_vec] meas_reader = CiftiReader(meas_file) meas_ids = open(meas_id_file).read().splitlines() meas_indices = [meas_ids.index(i) for i in subj_ids] meas = meas_reader.get_data(hemi2stru[hemi], True)[meas_indices] out_dict = {'shape': 'n_roi x n_subj', 'roi': list(roi2label.keys()), 'subject': subj_ids, 'meas': np.ones((len(roi2label), n_subj)) * np.nan} for roi_idx, roi in enumerate(out_dict['roi']): lbl_idx_arr = roi_maps == roi2label[roi] for subj_idx in range(n_subj): lbl_idx_vec = lbl_idx_arr[subj_idx] if np.any(lbl_idx_vec): if morph == 'va': out_dict['meas'][roi_idx, subj_idx] = np.sum( meas[subj_idx][lbl_idx_vec]) else: out_dict['meas'][roi_idx, subj_idx] = np.mean( meas[subj_idx][lbl_idx_vec]) pkl.dump(out_dict, open(trg_file, 'wb'))
def calc_morphology_individual(hemi='lh', morph='thickness'): import nibabel as nib import numpy as np import pickle as pkl from commontool.io.io import CiftiReader from cxy_hcp_ffa.lib.predefine import hemi2stru, roi2label rois_file = pjoin( proj_dir, 'analysis/s2/1080_fROI/' f'refined_with_Kevin/rois_v3_{hemi}.nii.gz') subj_file = pjoin(proj_dir, 'analysis/s2/subject_id') meas_id_file = pjoin(proj_dir, 'data/HCP/subject_id_1096') morph2meas = { 'thickness': '/nfs/p1/public_dataset/datasets/hcp/DATA/' 'HCP_S1200_GroupAvg_v1/HCP_S1200_GroupAvg_v1/' 'S1200.All.thickness_MSMAll.32k_fs_LR.dscalar.nii', 'myelin': '/nfs/p1/public_dataset/datasets/hcp/DATA/' 'HCP_S1200_GroupAvg_v1/HCP_S1200_GroupAvg_v1/' 'S1200.All.MyelinMap_BC_MSMAll.32k_fs_LR.dscalar.nii', 'va': '/nfs/p1/public_dataset/datasets/hcp/DATA/' 'HCP_S1200_GroupAvg_v1/HCP_S1200_GroupAvg_v1/' 'S1200.All.midthickness_MSMAll_va.32k_fs_LR.dscalar.nii' } meas_file = morph2meas[morph] trg_file = pjoin(work_dir, f'individual_{morph}_{hemi}.pkl') rois = nib.load(rois_file).get_data().squeeze().T n_roi = len(roi2label) subj_ids = open(subj_file).read().splitlines() n_subj = len(subj_ids) meas_reader = CiftiReader(meas_file) meas_ids = open(meas_id_file).read().splitlines() meas_indices = [meas_ids.index(i) for i in subj_ids] meas = meas_reader.get_data(hemi2stru[hemi], True)[meas_indices] roi_meas = { 'shape': 'n_roi x n_subj', 'roi': list(roi2label.keys()), 'meas': np.ones((n_roi, n_subj)) * np.nan } for roi_idx, roi in enumerate(roi_meas['roi']): lbl_idx_arr = rois == roi2label[roi] for subj_idx in range(n_subj): lbl_idx_vec = lbl_idx_arr[subj_idx] if np.any(lbl_idx_vec): if morph == 'va': tmp = np.sum(meas[subj_idx][lbl_idx_vec]) else: tmp = np.mean(meas[subj_idx][lbl_idx_vec]) roi_meas['meas'][roi_idx, subj_idx] = tmp pkl.dump(roi_meas, open(trg_file, 'wb'))
def calc_meas(gid=1, hemi='lh'): """ 用一半被试的MPM去提取另一半被试的激活值 如果某个被试没有某个ROI,就不提取该被试该ROI的信号 Args: gid (int, optional): group ID. Defaults to '1'. hemi (str, optional): hemisphere. Defaults to 'lh'. """ import numpy as np import pickle as pkl import nibabel as nib from cxy_hcp_ffa.lib.predefine import hemi2stru, roi2label from commontool.io.io import CiftiReader gh_ids = (gid * 10 + 1, gid * 10 + 2) gh_id_file = pjoin(split_dir, f'half_id_{hemi}.npy') mpm_file = pjoin(split_dir, 'MPM_GH{gh_id}_{hemi}.nii.gz') roi_file = pjoin( proj_dir, 'analysis/s2/1080_fROI/refined_with_Kevin/' f'rois_v3_{hemi}.nii.gz') subj_file = pjoin(proj_dir, 'analysis/s2/subject_id') src_file = pjoin(proj_dir, 'analysis/s2/activation.dscalar.nii') trg_file = pjoin(work_dir, f'G{gid}_activ_{hemi}.pkl') gh_id_vec = np.load(gh_id_file) gid_idx_vec = np.logical_or(gh_id_vec == gh_ids[0], gh_id_vec == gh_ids[1]) hid_vec = gh_id_vec[gid_idx_vec] subj_ids = open(subj_file).read().splitlines() subj_ids = [subj_ids[i] for i in np.where(gid_idx_vec)[0]] n_subj = len(subj_ids) roi_maps = nib.load(roi_file).get_data().squeeze().T[gid_idx_vec] meas_reader = CiftiReader(src_file) meas = meas_reader.get_data(hemi2stru[hemi], True)[gid_idx_vec] out_dict = { 'shape': 'n_roi x n_subj', 'roi': list(roi2label.keys()), 'subject': subj_ids, 'meas': np.ones((len(roi2label), n_subj)) * np.nan } for gh_id in gh_ids: hid_idx_vec = hid_vec == gh_id mpm = nib.load(mpm_file.format(gh_id=gh_id, hemi=hemi)).get_data().squeeze() for roi_idx, roi in enumerate(out_dict['roi']): roi_idx_vec = np.any(roi_maps == roi2label[roi], 1) valid_idx_vec = np.logical_and(~hid_idx_vec, roi_idx_vec) mpm_idx_vec = mpm == roi2label[roi] meas_masked = meas[valid_idx_vec][:, mpm_idx_vec] out_dict['meas'][roi_idx][valid_idx_vec] = np.mean(meas_masked, 1) pkl.dump(out_dict, open(trg_file, 'wb'))
def calc_meas_emotion(hemi='lh'): """ 用个体ROI去提取emotion任务中 faces-shapes的信号 """ import nibabel as nib import numpy as np import pickle as pkl from cxy_hcp_ffa.lib.predefine import roi2label # inputs work_dir = pjoin(proj_dir, 'analysis/s2/1080_fROI/refined_with_Kevin/tfMRI') rois_file = pjoin(proj_dir, 'analysis/s2/1080_fROI/' f'refined_with_Kevin/rois_v3_{hemi}.nii.gz') subj_file_wm = pjoin(proj_dir, 'analysis/s2/subject_id') meas_file = pjoin(proj_dir, 'data/HCP/emotion/analysis_s2/' f'cope3_face-shape_zstat_{hemi}.nii.gz') subj_file_emo = pjoin(proj_dir, 'data/HCP/emotion/analysis_s2/subject_id') # outputs out_file = pjoin(work_dir, f'individual_activ_{hemi}_emo.pkl') # prepare rois = nib.load(rois_file).get_fdata().squeeze().T n_roi = len(roi2label) subj_ids_wm = open(subj_file_wm).read().splitlines() meas = nib.load(meas_file).get_fdata().squeeze().T subj_ids_emo = open(subj_file_emo).read().splitlines() # find index in EMOTION subject IDs for WM subject IDs subj_indices = [] for subj_id in subj_ids_wm: if subj_id in subj_ids_emo: subj_indices.append(subj_ids_emo.index(subj_id)) else: subj_indices.append(None) n_subj = len(subj_indices) roi_meas = {'shape': 'n_roi x n_subj', 'roi': list(roi2label.keys()), 'meas': np.ones((n_roi, n_subj)) * np.nan} for roi_idx, roi in enumerate(roi_meas['roi']): lbl_idx_arr = rois == roi2label[roi] for subj_idx in range(n_subj): lbl_idx_vec = lbl_idx_arr[subj_idx] subj_idx_emo = subj_indices[subj_idx] if np.any(lbl_idx_vec) and subj_idx_emo is not None: roi_meas['meas'][roi_idx, subj_idx] = np.mean( meas[subj_idx_emo][lbl_idx_vec]) pkl.dump(roi_meas, open(out_file, 'wb'))
def roi_stats(gh_id=11, hemi='lh'): import numpy as np import nibabel as nib import pickle as pkl from cxy_hcp_ffa.lib.predefine import roi2label from commontool.io.io import save2nifti gh_id_file = pjoin(split_dir, f'half_id_{hemi}.npy') roi_file = pjoin( proj_dir, 'analysis/s2/1080_fROI/refined_with_Kevin/' f'rois_v3_{hemi}.nii.gz') info_trg_file = pjoin(split_dir, f'rois_info_GH{gh_id}_{hemi}.pkl') prob_trg_file = pjoin(split_dir, f'prob_maps_GH{gh_id}_{hemi}.nii.gz') gh_id_idx_vec = np.load(gh_id_file) == gh_id rois = nib.load(roi_file).get_data().squeeze().T[gh_id_idx_vec] # prepare rois information dict rois_info = dict() for roi in roi2label.keys(): rois_info[roi] = dict() prob_maps = [] for roi, label in roi2label.items(): # get indices of subjects which contain the roi indices = rois == label subj_indices = np.any(indices, 1) # calculate the number of the valid subjects n_subject = np.sum(subj_indices) rois_info[roi]['n_subject'] = n_subject # calculate roi sizes for each valid subject sizes = np.sum(indices[subj_indices], 1) rois_info[roi]['sizes'] = sizes # calculate roi probability map among valid subjects prob_map = np.mean(indices[subj_indices], 0) prob_maps.append(prob_map) prob_maps = np.array(prob_maps) # save out pkl.dump(rois_info, open(info_trg_file, 'wb')) save2nifti(prob_trg_file, prob_maps.T[:, None, None, :])
def calc_meas_MPM(hemi='lh'): """ 用一半被试的MPM去提取另一半被试的激活值 如果某个被试没有某个ROI,就不提取该被试该ROI的信号 Args: hemi (str, optional): hemisphere. Defaults to 'lh'. """ import numpy as np import pickle as pkl import nibabel as nib from cxy_hcp_ffa.lib.predefine import hemi2stru, roi2label from commontool.io.io import CiftiReader hids = (1, 2) hid_file = pjoin(split_dir, 'half_id.npy') mpm_file = pjoin(split_dir, 'MPM_half{hid}_{hemi}.nii.gz') roi_file = pjoin(proj_dir, 'analysis/s2/1080_fROI/refined_with_Kevin/' f'rois_v3_{hemi}.nii.gz') src_file = pjoin(proj_dir, 'analysis/s2/activation.dscalar.nii') trg_file = pjoin(work_dir, f'activ_{hemi}.pkl') hid_vec = np.load(hid_file) n_subj = len(hid_vec) roi_maps = nib.load(roi_file).get_data().squeeze().T n_roi = len(roi2label) meas_reader = CiftiReader(src_file) meas = meas_reader.get_data(hemi2stru[hemi], True) out_dict = {'shape': 'n_roi x n_subj', 'roi': list(roi2label.keys()), 'meas': np.ones((n_roi, n_subj)) * np.nan} for hid in hids: hid_idx_vec = hid_vec == hid mpm = nib.load(mpm_file.format(hid=hid, hemi=hemi) ).get_data().squeeze() for roi_idx, roi in enumerate(out_dict['roi']): roi_idx_vec = np.any(roi_maps == roi2label[roi], 1) valid_idx_vec = np.logical_and(~hid_idx_vec, roi_idx_vec) mpm_idx_vec = mpm == roi2label[roi] meas_masked = meas[valid_idx_vec][:, mpm_idx_vec] out_dict['meas'][roi_idx][valid_idx_vec] = np.mean(meas_masked, 1) pkl.dump(out_dict, open(trg_file, 'wb'))