Skip to content
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

Report all versions #59

Merged
merged 10 commits into from
Apr 21, 2016
9 changes: 9 additions & 0 deletions ariba/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
from pkg_resources import get_distribution

try:
__version__ = get_distribution('ariba').version
except:
__version__ = 'local'


__all__ = [
'assembly',
'assembly_compare',
Expand Down Expand Up @@ -26,6 +34,7 @@
'sequence_variant',
'summary',
'tasks',
'versions',
]

from ariba import *
15 changes: 11 additions & 4 deletions ariba/clusters.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ def __init__(self,
reads_2,
outdir,
extern_progs,
version_report_lines=None,
assembly_kmer=21,
assembly_coverage=100,
threads=1,
Expand All @@ -51,6 +52,12 @@ def __init__(self,
self.reads_2 = os.path.abspath(reads_2)
self.outdir = os.path.abspath(outdir)
self.extern_progs = extern_progs

if version_report_lines is None:
self.version_report_lines = []
else:
self.version_report_lines = version_report_lines

self.clusters_outdir = os.path.join(self.outdir, 'Clusters')
self.clean = clean

Expand Down Expand Up @@ -361,12 +368,11 @@ def _clean(self):

def write_versions_file(self, original_dir):
with open('version_info.txt', 'w') as f:
print('ARIBA version', common.version, 'run with this command:', file=f)
print('ARIBA run with this command:', file=f)
print(' '.join([sys.argv[0]] + ['run'] + sys.argv[1:]), file=f)
print('from this directory:', original_dir, file=f)
print(file=f)
print('Versions of dependencies:\n', file=f)
print(*self.extern_progs.version_report, sep='\n', file=f)
print(*self.version_report_lines, sep='\n', file=f)


def run(self):
Expand Down Expand Up @@ -409,12 +415,13 @@ def run(self):
rf.run(self.report_file_filtered_prefix)

if self.verbose:
print()
print('{:_^79}'.format(' Writing fasta of assembled sequences '), flush=True)
print(self.catted_assembled_seqs_fasta)
self._write_catted_assembled_seqs_fasta(self.catted_assembled_seqs_fasta)

if self.verbose:
print('\n\nCleaning files:', flush=True)
print('{:_^79}'.format(' Cleaning files '), flush=True)
self._clean()

if self.verbose:
Expand Down
2 changes: 0 additions & 2 deletions ariba/common.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import sys
import subprocess

version = '0.6.0'

def syscall(cmd, allow_fail=False, verbose=False, verbose_filehandle=sys.stdout, print_errors=True):
if verbose:
print('syscall:', cmd, flush=True, file=verbose_filehandle)
Expand Down
15 changes: 9 additions & 6 deletions ariba/external_progs.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,14 +47,14 @@ class Error (Exception): pass


class ExternalProgs:
def __init__(self, verbose=False):
def __init__(self, verbose=False, fail_on_error=True):
optional_progs = {'sspace', 'gapfiller'}
self.progs = {}
self.version_report = ['\t'.join(['tool', 'version', 'path'])]
self.version_report = []
self.all_deps_ok = True

if verbose:
print('{:_^79}'.format(' Checking dependencies and their versions '))
print(self.version_report[-1])

errors = []
warnings = []
Expand All @@ -66,13 +66,13 @@ def __init__(self, verbose=False):
# python3.4, not python2. SPAdes throws an error about not being
# compatible with python3.4.
# This means we need to explicitly run SPAdes with python2.
if prog == 'spades':
if prog == 'spades' and self.progs[prog] is not None:
self.progs[prog] = 'python2 ' + self.progs[prog]
if self.progs[prog] is None:
if prog in optional_progs:
warnings.append(prog + ' not found in path. Looked for ' + prog_exe + '. But it is optional so will be skipped during assembly')
else:
errors.append(prog + ' not found in path. Looked for ' + prog_exe + '. Cannot continue')
errors.append(prog + ' not found in path. Looked for ' + prog_exe)

self.version_report.append('\t'.join([prog, 'NA', 'NOT_FOUND']))
if verbose:
Expand Down Expand Up @@ -103,10 +103,13 @@ def __init__(self, verbose=False):


if len(errors):
self.all_deps_ok = False

for line in errors:
print('ERROR:', line, file=sys.stderr)
print('\nSomething wrong with at least one dependency. Please see the above error message(s)', file=sys.stderr)
raise Error('Depency error(s). Cannot continue')
if fail_on_error:
raise Error('Dependency error(s). Cannot continue')
elif verbose:
if len(warnings):
print('\nWARNING: Required dependencies found, but at least one optional one was not. Please see previous warning(s) for more details.', file=sys.stderr)
Expand Down
29 changes: 28 additions & 1 deletion ariba/ref_preparer.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import sys
import os
import pickle
from ariba import common, mapping, reference_data
Expand All @@ -8,6 +9,7 @@ class Error (Exception): pass
class RefPreparer:
def __init__(self,
extern_progs,
version_report_lines=None,
ref_prefix=None,
presabs=None,
varonly=None,
Expand All @@ -23,6 +25,12 @@ def __init__(self,
verbose=False,
):
self.extern_progs = extern_progs

if version_report_lines is None:
self.version_report_lines = []
else:
self.version_report_lines = version_report_lines

self.ref_prefix = ref_prefix
self.presabs = presabs
self.varonly = varonly
Expand Down Expand Up @@ -95,6 +103,8 @@ def _write_info_file(self, outfile):


def run(self, outdir):
original_dir = os.getcwd()

if os.path.exists(outdir):
raise Error('Error! Output directory ' + outdir + ' already exists. Cannot continue')

Expand All @@ -103,6 +113,12 @@ def run(self, outdir):
except:
raise Error('Error making output directory ' + outdir + '. Cannot continue')

with open(os.path.join(outdir, 'version_info.txt'), 'w') as f:
print('ARIBA run with this command:', file=f)
print(' '.join([sys.argv[0]] + ['prepareref'] + sys.argv[1:]), file=f)
print('from this directory:', original_dir, file=f)
print(file=f)
print(*self.version_report_lines, sep='\n', file=f)

self.filenames = self._get_ref_files(self.ref_prefix, self.presabs, self.varonly, self.noncoding, self.metadata, self.verbose)
self._write_info_file(os.path.join(outdir, 'info.txt'))
Expand All @@ -118,10 +134,13 @@ def run(self, outdir):
)

if self.verbose:
print('{:_^79}'.format(' Checking reference data '), flush=True)
print('\nLoading and checking input data', flush=True)

refdata_outprefix = os.path.join(outdir, 'refcheck')
self.refdata.sanity_check(refdata_outprefix)

if self.verbose:
print('\nRunning cdhit', flush=True)
cdhit_outprefix = os.path.join(outdir, 'cdhit')

clusters = self.refdata.cluster_with_cdhit(
Expand All @@ -135,20 +154,28 @@ def run(self, outdir):
cd_hit_est=self.extern_progs.exe('cdhit')
)

if self.verbose:
print('\nWriting clusters to file.', len(clusters), 'in total', flush=True)

clusters_pickle_file = cdhit_outprefix + '.clusters.pickle'
with open(clusters_pickle_file, 'wb') as f:
pickle.dump(clusters, f)

cluster_representatives_fa = cdhit_outprefix + '.cluster_representatives.fa'

if self.verbose:
print('\nRunning bowtie2-build on FASTA of cluster representatives')

mapping.bowtie2_index(
cluster_representatives_fa,
cluster_representatives_fa,
bowtie2=self.extern_progs.exe('bowtie2'),
verbose=self.verbose,
)

if self.verbose:
print('\nRunning samtools faidx on FASTA of cluster representatives')

cmd = ' '.join([
self.extern_progs.exe('samtools'),
'faidx',
Expand Down
8 changes: 6 additions & 2 deletions ariba/tasks/prepareref.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import argparse
from ariba import ref_preparer, external_progs
from ariba import ref_preparer, external_progs, versions

def run():
parser = argparse.ArgumentParser(
Expand All @@ -26,10 +26,14 @@ def run():

parser.add_argument('outdir', help='Output directory (must not already exist)')
options = parser.parse_args()
extern_progs = external_progs.ExternalProgs(verbose=options.verbose)

extern_progs, version_report_lines = versions.get_all_versions()
if options.verbose:
print(*version_report_lines, sep='\n')

preparer = ref_preparer.RefPreparer(
extern_progs,
version_report_lines=version_report_lines,
ref_prefix=options.ref_prefix,
presabs=options.presabs,
varonly=options.varonly,
Expand Down
5 changes: 4 additions & 1 deletion ariba/tasks/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,14 +53,17 @@ def run():
print('Input directory', options.prepareref_dir, 'not found. Cannot continue', file=sys.stderr)
sys.exit(1)

extern_progs = ariba.external_progs.ExternalProgs(verbose=options.verbose)
extern_progs, version_report_lines = ariba.versions.get_all_versions()
if options.verbose:
print(*version_report_lines, sep='\n')

c = ariba.clusters.Clusters(
options.prepareref_dir,
options.reads_1,
options.reads_2,
options.outdir,
extern_progs,
version_report_lines=version_report_lines,
assembly_kmer=options.assembler_k,
assembly_coverage=options.assembly_cov,
assembler='spades',
Expand Down
23 changes: 14 additions & 9 deletions ariba/tasks/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,14 @@
import ariba


def boxymcboxface(message):
print('-' * 79)
print('|', '=' * 77, '|', sep='')
print('|', '{: ^75}'.format(message), '|')
print('|', '=' * 77, '|', sep='')
print('-' * 79)


def run():
parser = argparse.ArgumentParser(
description = 'Run ARIBA on a small test dataset',
Expand All @@ -17,14 +25,16 @@ def run():

print('Running ARIBA on test data...')

boxymcboxface('Preparing input data')

try:
os.mkdir(options.outdir)
os.chdir(options.outdir)
except:
print('Error making output directory "', options.outdir, '". Cannot continue.', sep='', file=sys.stderr)
sys.exit(1)

print('Made output directory. Copying test data files into it:')
print('Made output directory ', options.outdir, '. Copying test data files into it:', sep='')

modules_dir = os.path.dirname(os.path.abspath(ariba.__file__))
test_data_dir = os.path.join(modules_dir, 'test_run_data')
Expand All @@ -34,6 +44,8 @@ def run():
print(' copied', filename)


boxymcboxface('Try running ariba prepareref')

prepareref_command = ' '.join([
ariba_exe,
'prepareref',
Expand All @@ -54,11 +66,7 @@ def run():
sys.exit(1)

print()
print('-' * 79)
print('-' * 79)
print('ariba prepareref finished OK')
print('-' * 79)
print('-' * 79)


ariba_command = ' '.join([
Expand All @@ -72,6 +80,7 @@ def run():
'OUT'
])

boxymcboxface('Try running ariba run')
print('\nRunning ARIBA with:', ariba_command, '', sep='\n')

return_code = subprocess.call(ariba_command, shell=True)
Expand All @@ -81,9 +90,5 @@ def run():
sys.exit(1)

print()
print('-' * 79)
print('-' * 79)
print('ariba run finished OK')
print('-' * 79)
print('-' * 79)
print('Finished run on test data OK')
6 changes: 4 additions & 2 deletions ariba/tasks/version.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import ariba
import sys
from ariba import versions

def run():
print(ariba.common.version)
extern_progs, report_lines = versions.get_all_versions(raise_error=False)
print(*report_lines, sep='\n')
8 changes: 8 additions & 0 deletions ariba/tests/versions_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import unittest
from ariba import versions

class TestVersions(unittest.TestCase):
def test_get_all_versions(self):
'''Test get_all_versions'''
versions.get_all_versions(None)

Loading