def region_overlap_report(regionName, atlasBase, atlasTarget): """ This function is used to generate a region overlap report. It is used to find which regions a given area in an atlas (base) correspond to in another atlas (target). The returned list is sorted according to overlap ratio. Each element is a tuple with the region name, counts and ratio """ regionData = atlasBase.regions[atlasBase.ticks.index(regionName)] atlasBaseImg = loadsave.load_nii(atlasBase.get_volume('1mm')['niifile']) atlasTargetImg = loadsave.load_nii( atlasTarget.get_volume('1mm')['niifile']) atlasBaseData = atlasBaseImg.get_data() atlasTargetData = atlasTargetImg.get_data() maskMatrix = atlasTargetData.copy() maskMatrix[atlasBaseData == regionData] = 1 maskMatrix[atlasBaseData != regionData] = 0 maskedTargetMatrix = np.multiply(atlasTargetData, maskMatrix) unique, counts = np.unique(maskedTargetMatrix, return_counts=True) resultList = [] for areaData, count in zip(unique, counts): if areaData == 0: continue descriptionTuple = ( atlasTarget.ticks[atlasTarget.regions.index(areaData)], '%d/%s' % (count, atlasTarget.get_volume('1mm')['regioncounts'][ atlasTarget.regions.index(areaData)]), float(count) / int( atlasTarget.get_volume('1mm')['regioncounts'][ atlasTarget.regions.index(areaData)])) resultList.append(descriptionTuple) resultList = sorted(resultList, key=lambda x: int(x[1].split('/')[0]), reverse=True) return resultList
def calc_attr(theattr): img = load_nii('../iso2.0_dtifitresult_{}.nii.gz'.format(theattr)) atlasobj = atlas.getbywd() atlasname = atlasobj.name atlasimg = load_nii(os.path.join('nativespace', 'wtemplate_2.nii.gz')) res = niicalc.calc_region_mean(img, atlasobj, atlasimg) save_csvmat(os.path.join('nativespace', 'mean{}.csv'.format(theattr)), res)
def __init__(self, atlasobj, volumename, img, outfolder, windowLength = 100, stepSize = 1): self.img = img self.atlasobj = atlasobj self.atlasimg = load_nii(atlasobj.get_volume(volumename)['niifile']) self.outfolder = outfolder self.windowLength = windowLength self.stepSize = stepSize
def build_cmd(self, attr = None, nethold = None, out = None): #attr[1,2,3,4,5,6] cmd = [self.exeName,"-i",self.corrPath] if out: cmd.extend(["-o",out+"\\"]) else: cmd.extend(["-o",self.outfolder+"\\"]) if nethold: cmd.extend(["-n",str(nethold)]) else: cmd.extend(["-n",str(self.argsDict['netthreshold'])]) cmd.extend(["-w",str(self.argsDict['windowLength'])]) cmd.extend(["-t",str(self.argsDict['stepSize'])]) img = load_nii(self.niipath) cmd.extend(["-l",str(img.header.get_data_shape()[3])]) if attr: for i in attr: cmd.append("-c"+str(i)) else: for k,v in self.argsDict['calc_attr'].items(): if v: cmd.append("-c"+str(INTER_ATTR_MAPPING[k])) return cmd
def func(args): subject = args[0] atlasname = args[1] volumename = '3mm' atlasobj = atlas.get(atlasname) outfolder = os.path.join(mmdps_locale.MSA_ProcessedPath, subject, atlasobj.name, 'bold_net', 'dynamic 1 100') img = load_nii(os.path.join(mmdps_locale.MSA_ProcessedPath, subject, 'pBOLD.nii')) os.makedirs(outfolder, exist_ok = True) c = CalcDynamic(atlasobj, volumename, img, outfolder, 100, 1) c.run()
def color_atlas_region(atlasobj, regions, colors, outfilepath, resolution='1mm'): """ This function is used to color one or several regions in an atlas. An nii file is saved where the specified region is set to 1 and other areas to 0 Input - regions: a string or a list of strings - colors: int or a list of int Note: if both regions and colors are lists, these two must have the same length """ if type(regions) is list and type(colors) is list and len(regions) != len( colors): print( 'You must specify colors for each regions to label, or specify a single color' ) raise Exception('Number of colors and regions not match') atlasImg = loadsave.load_nii(atlasobj.get_volume(resolution)['niifile']) atlasData = atlasImg.get_data() newAtlasData = atlasData.copy() if type(regions) is list and type(colors) is list: # each color for each region newAtlasData = np.zeros(newAtlasData.shape) for region, color in zip(regions, colors): regionMask = atlasData.copy() regionMask[regionMask != atlasobj.regions[atlasobj.ticks.index( region)]] = 0 regionMask[regionMask == atlasobj.regions[atlasobj.ticks.index( region)]] = color newAtlasData += regionMask elif type(regions) is list and type(colors) is int: # one color for each region newAtlasData = np.zeros(newAtlasData.shape) for region in regions: regionMask = atlasData.copy() regionMask[regionMask != atlasobj.regions[atlasobj.ticks.index( region)]] = 0 regionMask[regionMask == atlasobj.regions[atlasobj.ticks.index( region)]] = colors newAtlasData += regionMask elif type(regions) is str and type(colors) is int: # one color for one region newAtlasData[newAtlasData != atlasobj.regions[atlasobj.ticks.index( regions)]] = 0 newAtlasData[newAtlasData == atlasobj.regions[atlasobj.ticks.index( regions)]] = colors else: raise Exception( 'Unsupported combinations. regions as %s, colors as %s.' % (type(regions), type(colors))) newAtlasImg = nib.Nifti1Image(newAtlasData, atlasImg.affine, atlasImg.header) nib.save(newAtlasImg, outfilepath)
def __init__(self, atlasobj, volumename, img, outfolder, windowLength = 100, stepsize = 3): """ volumename = '3mm' is the name of the atlas volume img is the nii file loaded using load_nii function """ self.img = img self.atlasobj = atlasobj self.atlasimg = load_nii(atlasobj.get_volume(volumename)['niifile']) self.outfolder = outfolder self.stepsize = stepsize self.windowLength = windowLength
def func(args): subject = args[0] atlasname = args[1] windowLength = args[2] stepsize = args[3] volumename = '3mm' atlasobj = atlas.get(atlasname) work_path = 'D:/Research/xuquan_FMRI/Dynamic_tfMRI_work/' outfolder = os.path.join(work_path, subject, atlasname, 'bold_net', 'dynamic_%d_%d' % (stepsize, windowLength)) img = load_nii(os.path.join(work_path, subject, 'pBOLD.nii')) os.makedirs(outfolder, exist_ok=True) c = CalcDynamic(atlasobj, volumename, img, outfolder, windowLength, stepsize) c.run()
def __init__(self, atlasobj, volumename, img, outfolder): self.img = img self.atlasobj = atlasobj self.atlasimg = load_nii(atlasobj.get_volume(volumename)['niifile']) self.outfolder = outfolder
def gen_timeseries(self): data = self.img.get_data() atdata = self.atlasimg.get_data() timepoints = data.shape[3] timeseries = np.empty((self.atlasobj.count, timepoints)) for i, region in enumerate(self.atlasobj.regions): regiondots = data[atdata == region, :] regionts = np.mean(regiondots, axis=0) timeseries[i, :] = regionts return timeseries def gen_net(self): ts = self.gen_timeseries() save_csvmat(self.outpath('timeseries.csv'), ts) tscorr = np.corrcoef(ts) save_csvmat(self.outpath('corrcoef.csv'), tscorr) def run(self): self.gen_net() if __name__ == '__main__': atlasobj = path.curatlas() volumename = '3mm' img = load_nii(os.path.join(path.curparent(), 'pBOLD.nii')) outfolder = 'bold_net' c = Calc(atlasobj, volumename, img, outfolder) c.run()
timepoints = data.shape[3] timeseries = np.empty((atlasobj.count, timepoints)) for i, region in enumerate(atlasobj.regions): regiondots = data[atdata == region, :] regionts = np.mean(regiondots, axis=0) timeseries[i, :] = regionts return timeseries def gen_net(self): ts = self.gen_timeseries() save_csvmat(self.outpath('timeseries.csv'), ts) tscorr = np.corrcoef(ts) save_csvmat(self.outpath('corrcoef.csv'), tscorr) def run(self): self.gen_net() if __name__ == '__main__': atlasobj = atlas.get('bnatlas') volumename = '3mm' for subject in sorted(os.listdir(mmdps_locale.ChanggungAllFullPath)): print('building subject %s' % subject) outfolder = os.path.join(mmdps_locale.ChanggungAllFullPath, subject, 'bold_net', 'bnatlas_3') os.makedirs(outfolder, exist_ok=True) img = load_nii( os.path.join(mmdps_locale.ChanggungAllFullPath, subject, 'Filtered_4DVolume.nii')) c = Calc(atlasobj, volumename, img, outfolder) c.run()
import os import t1_niicalc as niicalc from mmdps.proc import atlas from mmdps.util.loadsave import load_nii, save_csvmat if __name__ == '__main__': img = load_nii('../grey.hdr') curatlas = atlas.getbywd() atlasimg = load_nii(curatlas.get_volume('1mm')['niifile']) res = niicalc.calc_region_mean(img, curatlas, atlasimg) save_csvmat(os.path.join('t1mean', 'greyvolume.csv'), res)
def get_data(self, resolution=1): return loadsave.load_nii( os.path.join(rootconfig.path.atlas, self.name, '%s_%d.nii' % (self.name, resolution))).get_data()
for i, region in enumerate(atlasobj.regions): regiondots = data[atdata==region, :] regionts = np.mean(regiondots, axis=0) timeseries[i, :] = regionts return timeseries def gen_net(self): ts = self.gen_timeseries() save_csvmat(self.outpath('timeseries.csv'), ts) timepoints = ts.shape[1] # number of total timepoints start = 0 while start + self.windowLength < timepoints: tscorr = np.corrcoef(ts[:, start:start + self.windowLength]) save_csvmat(self.outpath('corrcoef-%d.%d.csv' % (start, start + self.windowLength)), tscorr) start += self.stepsize def run(self): self.gen_net() if __name__ == '__main__': atlasList = ['brodmann_lr', 'brodmann_lrce', 'aicha', 'bnatlas'] volumename = '3mm' for subject in sorted(os.listdir(mmdps_locale.ChanggungAllFullPath)): print('building subject %s' % subject) img = load_nii(os.path.join(mmdps_locale.ChanggungAllFullPath, subject, 'pBOLD.nii')) for atlasname in atlasList: atlasobj = atlas.get(atlasname) outfolder = os.path.join(mmdps_locale.ChanggungAllFullPath, subject, atlasobj.name, 'bold_net') os.makedirs(outfolder, exist_ok = True) c = CalcDynamic(atlasobj, volumename, img, outfolder) c.run()