Skip to content

RF: moving more cmdline things to the cmdline folder #615

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 14 commits into from
Jun 3, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
.project
.pydevproject
*.py.orig
.DS_Store

# Not sure what the next one is for
*.kpf
Expand Down
210 changes: 2 additions & 208 deletions bin/nib-dicomfs
Original file line number Diff line number Diff line change
Expand Up @@ -9,213 +9,7 @@
### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ##
# Copyright (C) 2011 Christian Haselgrove

import sys
import os
import stat
import errno
import time
import locale
import logging
import fuse
import nibabel as nib
import nibabel.dft as dft

from optparse import OptionParser, Option

uid = os.getuid()
gid = os.getgid()
encoding = locale.getdefaultlocale()[1]

fuse.fuse_python_api = (0, 2)

logger = logging.getLogger('nibabel.dft')

class FileHandle:

def __init__(self, fno):
self.fno = fno
self.keep_cache = False
self.direct_io = False
return

def __str__(self):
return 'FileHandle(%d)' % self.fno

class DICOMFS(fuse.Fuse):

def __init__(self, *args, **kwargs):
self.followlinks = kwargs.pop('followlinks', False)
fuse.Fuse.__init__(self, *args, **kwargs)
self.fhs = {}
return

def get_paths(self):
paths = {}
for study in dft.get_studies(self.dicom_path, self.followlinks):
pd = paths.setdefault(study.patient_name_or_uid(), {})
patient_info = 'patient information\n'
patient_info = 'name: %s\n' % study.patient_name
patient_info += 'ID: %s\n' % study.patient_id
patient_info += 'birth date: %s\n' % study.patient_birth_date
patient_info += 'sex: %s\n' % study.patient_sex
pd['INFO'] = patient_info.encode('ascii', 'replace')
study_datetime = '%s_%s' % (study.date, study.time)
study_info = 'study info\n'
study_info += 'UID: %s\n' % study.uid
study_info += 'date: %s\n' % study.date
study_info += 'time: %s\n' % study.time
study_info += 'comments: %s\n' % study.comments
d = {'INFO': study_info.encode('ascii', 'replace')}
for series in study.series:
series_info = 'series info\n'
series_info += 'UID: %s\n' % series.uid
series_info += 'number: %s\n' % series.number
series_info += 'description: %s\n' % series.description
series_info += 'rows: %d\n' % series.rows
series_info += 'columns: %d\n' % series.columns
series_info += 'bits allocated: %d\n' % series.bits_allocated
series_info += 'bits stored: %d\n' % series.bits_stored
series_info += 'storage instances: %d\n' % len(series.storage_instances)
d[series.number] = {'INFO': series_info.encode('ascii', 'replace'),
'%s.nii' % series.number: (series.nifti_size, series.as_nifti),
'%s.png' % series.number: (series.png_size, series.as_png)}
pd[study_datetime] = d
return paths

def match_path(self, path):
wd = self.get_paths()
if path == '/':
logger.debug('return root')
return wd
for part in path.lstrip('/').split('/'):
logger.debug("path:%s part:%s" % (path, part))
if part not in wd:
return None
wd = wd[part]
logger.debug('return')
return wd

def readdir(self, path, fh):
logger.info('readdir %s' % (path,))
matched_path = self.match_path(path)
if matched_path is None:
return -errno.ENOENT
logger.debug('matched %s' % (matched_path,))
fnames = [ k.encode('ascii', 'replace') for k in matched_path.keys() ]
fnames.append('.')
fnames.append('..')
return [ fuse.Direntry(f) for f in fnames ]

def getattr(self, path):
logger.debug('getattr %s' % path)
matched_path = self.match_path(path)
logger.debug('matched: %s' % (matched_path,))
now = time.time()
st = fuse.Stat()
if isinstance(matched_path, dict):
st.st_mode = stat.S_IFDIR | 0755
st.st_ctime = now
st.st_mtime = now
st.st_atime = now
st.st_uid = uid
st.st_gid = gid
st.st_nlink = len(matched_path)
return st
if isinstance(matched_path, str):
st.st_mode = stat.S_IFREG | 0644
st.st_ctime = now
st.st_mtime = now
st.st_atime = now
st.st_uid = uid
st.st_gid = gid
st.st_size = len(matched_path)
st.st_nlink = 1
return st
if isinstance(matched_path, tuple):
st.st_mode = stat.S_IFREG | 0644
st.st_ctime = now
st.st_mtime = now
st.st_atime = now
st.st_uid = uid
st.st_gid = gid
st.st_size = matched_path[0]()
st.st_nlink = 1
return st
return -errno.ENOENT

def open(self, path, flags):
logger.debug('open %s' % (path,))
matched_path = self.match_path(path)
if matched_path is None:
return -errno.ENOENT
for i in range(1, 10):
if i not in self.fhs:
if isinstance(matched_path, str):
self.fhs[i] = matched_path
elif isinstance(matched_path, tuple):
self.fhs[i] = matched_path[1]()
else:
raise -errno.EFTYPE
return FileHandle(i)
raise -errno.ENFILE

# not done
def read(self, path, size, offset, fh):
logger.debug('read')
logger.debug(path)
logger.debug(size)
logger.debug(offset)
logger.debug(fh)
return self.fhs[fh.fno][offset:offset+size]

def release(self, path, flags, fh):
logger.debug('release')
logger.debug(path)
logger.debug(fh)
del self.fhs[fh.fno]
return

def get_opt_parser():
# use module docstring for help output
p = OptionParser(
usage="%s [OPTIONS] <DIRECTORY CONTAINING DICOMSs> <mount point>"
% os.path.basename(sys.argv[0]),
version="%prog " + nib.__version__)

p.add_options([
Option("-v", "--verbose", action="count",
dest="verbose", default=0,
help="make noise. Could be specified multiple times"),
])

p.add_options([
Option("-L", "--follow-links", action="store_true",
dest="followlinks", default=False,
help="Follow symbolic links in DICOM directory"),
])
return p
from nibabel.cmdline.dicomfs import main

if __name__ == '__main__':
parser = get_opt_parser()
(opts, files) = parser.parse_args()

if opts.verbose:
logger.addHandler(logging.StreamHandler(sys.stdout))
logger.setLevel(opts.verbose > 1 and logging.DEBUG or logging.INFO)

if len(files) != 2:
sys.stderr.write("Please provide two arguments:\n%s\n" % parser.usage)
sys.exit(1)

fs = DICOMFS(dash_s_do='setsingle', followlinks=opts.followlinks)
fs.parse(['-f', '-s', files[1]])
fs.dicom_path = files[0].decode(encoding)
try:
fs.main()
except fuse.FuseError:
# fuse prints the error message
sys.exit(1)

sys.exit(0)

# eof
main()
26 changes: 1 addition & 25 deletions bin/nib-nifti-dx
Original file line number Diff line number Diff line change
Expand Up @@ -8,32 +8,8 @@
#
### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ##
''' Print nifti diagnostics for header files '''
from __future__ import division, print_function, absolute_import

import sys

from optparse import OptionParser

import nibabel as nib


def main():
""" Go go team """
parser = OptionParser(
usage="%s [FILE ...]\n\n" % sys.argv[0] + __doc__,
version="%prog " + nib.__version__)
(opts, files) = parser.parse_args()

for fname in files:
with nib.openers.ImageOpener(fname) as fobj:
hdr = fobj.read(nib.nifti1.header_dtype.itemsize)
result = nib.Nifti1Header.diagnose_binaryblock(hdr)
if len(result):
print('Picky header check output for "%s"\n' % fname)
print(result + '\n')
else:
print('Header for "%s" is clean' % fname)

from nibabel.cmdline.nifti_dx import main

if __name__ == '__main__':
main()
2 changes: 1 addition & 1 deletion bin/parrec2nii
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"""PAR/REC to NIfTI converter
"""

from nibabel.parrec2nii_cmd import main
from nibabel.cmdline.parrec2nii import main


if __name__ == '__main__':
Expand Down
Loading