Skip to content

Instantly share code, notes, and snippets.

@chrismullins
Created August 7, 2015 21:56
Show Gist options
  • Save chrismullins/d696005f6dc6fa69892c to your computer and use it in GitHub Desktop.
Save chrismullins/d696005f6dc6fa69892c to your computer and use it in GitHub Desktop.
Separate filelist and roi_summary file into separate txt files.
import argparse
import os
import sys
from itertools import izip
import collections
import errno
"""
This script takes two files: a list of form 'filename,slice#', and another
tab-delimited list of mean values for each ROI. Every line should line up.
"""
#---------------------------------------------------------------------------
class ROIParser(argparse.ArgumentParser):
def error(self, message):
sys.stderr.write('error: %s\n' % message)
self.print_help()
sys.exit(2)
#---------------------------------------------------------------------------
def mkdir_p(path):
"""Recursive directory creation function.
See http://stackoverflow.com/questions/600268/mkdir-p-functionality-in-python
"""
try:
os.makedirs(path)
except OSError as exc: # Python >2.5
if exc.errno == errno.EEXIST and os.path.isdir(path):
pass
else: raise
#---------------------------------------------------------------------------
def getFileNumber(filename):
import re
pos = filename.find("RestingState")
start = pos + len("RestingState")
ss = filename[start:]
# find first digit after RestingState in file
m = re.search("\d", ss)
return ss[m.start():m.start()+3]
#---------------------------------------------------------------------------
def file_len(fname):
with open(fname) as f:
for i, l in enumerate(f):
pass
return i + 1
#---------------------------------------------------------------------------
def ReadData(filenamesFile=None, roiSummaryFile=None, roiNamesList=None):
if file_len(roiSummaryFile.name) != file_len(filenamesFile.name):
print("File line mismatch! ")
sys.exit(2)
fileList = []
fileNameROIListDict = collections.defaultdict(list)
with open(filenamesFile.name) as fidList, open(roiSummaryFile.name) as fidSummary:
for fnItem, sumItem in izip(fidList, fidSummary):
roiList = [float(roi.lstrip().rstrip()) for roi in sumItem.split('\t')]
fileNameROIListDict[fnItem.lstrip().rstrip().split(',')[0]].append(roiList)
fileNameROINameDict = collections.defaultdict(dict)
for fname, timepointList in fileNameROIListDict.iteritems():
for index, roiName in enumerate(roiNamesList):
fileNameROINameDict[fname][roiName] = [roiValueList[index] for roiValueList in timepointList]
mkdir_p("output")
for fname, roiDict in fileNameROINameDict.iteritems():
for roiName, valList in roiDict.iteritems():
with open("output/"+roiName+"_"+getFileNumber(os.path.basename(os.path.splitext(fname)[0]))+".txt", 'a') as outFile:
outFile.write("\n".join(map(str,valList)))
#---------------------------------------------------------------------------
if __name__ == '__main__':
parser = ROIParser()
parser.add_argument("-f", "--fileList", dest="filenames",
required=True, type=argparse.FileType('r'))
parser.add_argument("-s", "--summary", dest="summary",
required=True, type=argparse.FileType('r'))
parser.add_argument('--roiNames',
type=str, default=None,
help='Comma separated list of ROI names. Example: --roiNames "insula,mpfc,striatum,precuneus"')
arguments = parser.parse_args(sys.argv[1:])
roiNamesList = arguments.roiNames.split(',')
ReadData(filenamesFile=arguments.filenames,
roiSummaryFile=arguments.summary,
roiNamesList=roiNamesList)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment