Permalink
Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
179 lines (148 sloc) 5.42 KB
from os.path import join as pjoin
import os
import sys
# import glob as gb
# import shutil as sh
import nibabel as nib
import fnmatch
import re
from tempfile import mkdtemp
#----
# Define the default size of the image
IMG_FILE_SIZE = 614728
PAT = r'(.*)(\d{12})(.*)' # pattern to match a PSC in a filename (with path)
#------------------------------------------------------------------------------#
# deal - badly - with the onlines arguments
#------------------------------------------------------------------------------#
def usage(msg):
print('\n Usage: "python check_estimable.py in_dir out_dir [*.nii] " %s'
% msg)
print('\n in_dir : a directory that contains all the contrast images')
print(' (contrasts can be in several sub-directories)')
print('\n out_dir : a directory that contains the resulting txt files \n')
quit()
if len(sys.argv) < 2:
usage(' ')
# get directory - check it exists
basedir = sys.argv[1]
if not os.path.exists(basedir):
msg = 'directory %s does not exist' % basedir
usage(msg)
# if a second argument is provided:
if len(sys.argv) > 2:
savedir = sys.argv[2]
if not os.path.exists(savedir):
usage(str('save directory %s doesnt exist' % savedir))
else:
savedir = mkdtemp()
# if a third argument is provided:
if len(sys.argv) > 3:
PSC = sys.argv[3]
else:
PSC = '*.nii'
print('searching %s images in directory %s ' % (PSC,basedir))
#------------------------------------------------------------------------------#
# find files with a given pattern
def find_files(directory, pattern):
"""find files in directory and subdirectory with a given pattern
Parameters
----------
directory: string
The directory where to find files recursively
Returns
-------
pattern: string
A pattern to match
Examples
--------
find_files('/home/user/code','*.py')
"""
for root, dirs, files in os.walk(directory):
for base_name in files:
if fnmatch.fnmatch(base_name, pattern):
filename = pjoin(root, base_name)
yield filename
class LoadImgError(Exception):
""" exception if load image fails """
#------------------------------------------------------------------------------#
def find_files_with_string_header(lfiles, searchstring='unestimable',
pscpatt = PAT):
""" Find the files with the string in the header
Parameters
----------
lfiles: list
list of files names
searchstring : str
the string to search in the header
Returns
-------
dictionary, list_with_string: list
lists of filenames
"""
fdic = { 'all': [],
'psc': [],
'bad_psc': [],
'too_small': [],
'cannot_load': [],
'nonestim': [],
'estim': []
}
r = re.compile(pscpatt)
for filename in lfiles:
fdic['all'].append(filename)
# check if filename has a PSC
#-----------------------------------------------------------------
m = r.match(filename)
if m:
fdic['psc'].append(m.groups()[1])
else:
fdic['bad_psc'].append(filename)
continue
# check if filename has a reasonable size
#-----------------------------------------------------------------
if os.lstat(filename).st_size < IMG_FILE_SIZE:
fdic['too_small'].append(filename)
continue
# check if filename can be loaded by nibabel and header readable
#-----------------------------------------------------------------
try:
img = nib.load(filename)
except:
print('Nibabel Could not load file : %s ' % filename)
fdic['cannot_load'].append(filename)
continue
try:
imghdr = img.get_header()
except:
print('Nibabel Could not get header of file : %s ' % filename)
fdic['cannot_load'].append(filename)
continue
# check if the filename has string ("unestimable") in the descrip
#-----------------------------------------------------------------
if imghdr['descrip'].tostring().find(searchstring) >= 0:
print(imghdr['descrip'].tostring())
print('%s',filename)
fdic['nonestim'].append(filename)
else:
fdic['estim'].append(filename)
return(fdic)
#------------------------------------------------------------------------------#
# save the txt files in savedir, use basedir to provide a name
def save_results(savedir, basedir, lfiles, suffix):
fname = (basedir[1:] + suffix).replace(os.path.sep,'_')
fid = open(pjoin(savedir,fname), 'w')
fid.writelines("%s\n" % item for item in lfiles)
fid.close()
print('Saved text files: \n\t%s\n in directory %s\n' % (fname, savedir))
#------------------------------------------------------------------------------#
# do it:
#------------------------------------------------------------------------------#
# print(' find the files ...')
lfiles = find_files(basedir, PSC)
# print('find those that are not estimable')
res = find_files_with_string_header(lfiles)
for k in res:
if res[k]: # not empty
print('number of %s is : %d' % (k,len(res[k])))
save_results(savedir, basedir, res[k], '_' + k + '.txt')
#------------------------------------------------------------------------------#