[med-svn] [circlator] 01/06: Imported Upstream version 1.2.1

Afif Elghraoui afif at moszumanska.debian.org
Sun Apr 24 06:54:45 UTC 2016


This is an automated email from the git hooks/post-receive script.

afif pushed a commit to branch master
in repository circlator.

commit 03b0ae81df867558fc4801b1397f8dbc583d652d
Author: Afif Elghraoui <afif at ghraoui.name>
Date:   Sat Apr 23 20:35:25 2016 -0700

    Imported Upstream version 1.2.1
---
 circlator/__init__.py        |  9 +++++++++
 circlator/bamfilter.py       | 20 +++++++++++++++++++-
 circlator/common.py          |  2 --
 circlator/external_progs.py  | 10 ++++------
 circlator/tasks/all.py       | 23 +++++++++++++++++++++--
 circlator/tasks/bam2reads.py |  2 ++
 circlator/tasks/progcheck.py |  5 ++---
 circlator/tasks/version.py   |  3 ++-
 circlator/versions.py        | 40 ++++++++++++++++++++++++++++++++++++++++
 setup.py                     |  8 ++++----
 10 files changed, 103 insertions(+), 19 deletions(-)

diff --git a/circlator/__init__.py b/circlator/__init__.py
index 62985b5..4d4e7b9 100644
--- a/circlator/__init__.py
+++ b/circlator/__init__.py
@@ -1,3 +1,11 @@
+from pkg_resources import get_distribution
+
+try:
+    __version__ = get_distribution('circlator').version
+except:
+    __version__ = 'local'
+
+
 __all__ = [
     'assemble',
     'assembly',
@@ -12,6 +20,7 @@ __all__ = [
     'minimus2',
     'program',
     'tasks',
+    'versions',
 ]
 
 from circlator import *
diff --git a/circlator/bamfilter.py b/circlator/bamfilter.py
index 35194d6..b480c46 100644
--- a/circlator/bamfilter.py
+++ b/circlator/bamfilter.py
@@ -16,6 +16,7 @@ class BamFilter:
              contigs_to_use=None,
              discard_unmapped=False,
              log_prefix='[bamfilter]',
+             verbose=False,
     ):
         self.bam = os.path.abspath(bam)
         if not os.path.exists(self.bam):
@@ -28,6 +29,7 @@ class BamFilter:
         self.contigs_to_use = self._get_contigs_to_use(contigs_to_use)
         self.discard_unmapped = discard_unmapped
         self.min_read_length = min_read_length
+        self.verbose = verbose
 
 
     def _get_ref_lengths(self):
@@ -141,32 +143,48 @@ class BamFilter:
         f_log = pyfastaq.utils.open_file_write(self.log)
         f_fa = pyfastaq.utils.open_file_write(self.reads_fa)
         print(self.log_prefix, '#contig', 'length', 'reads_kept', sep='\t', file=f_log)
+        if self.verbose:
+            print('Getting reads from BAM file', self.bam, flush=True)
 
         for contig in sorted(ref_lengths):
             if len(self.contigs_to_use) > 0 and contig not in self.contigs_to_use:
                 print(self.log_prefix, contig, ref_lengths[contig], 'skipping', sep='\t', file=f_log)
+                if self.verbose:
+                    print('Skipping contig', contig, flush=True)
                 continue
 
             if ref_lengths[contig] <= self.length_cutoff:
                 self._all_reads_from_contig(contig, f_fa)
                 print(self.log_prefix, contig, ref_lengths[contig], 'all', sep='\t', file=f_log)
+                if self.verbose:
+                    print('Getting all reads that map to contig', contig, flush=True)
             else:
                 end_bases_keep = int(0.5 * self.length_cutoff)
                 start = end_bases_keep - 1
                 end = max(end_bases_keep - 1, ref_lengths[contig] - end_bases_keep)
                 self._get_region(contig, 0, start, f_fa, min_length=self.min_read_length)
                 self._get_region(contig, end, ref_lengths[contig], f_fa, min_length=self.min_read_length)
+                coords_string = '1-' + str(start + 1) +  ';' + str(end + 1) + '-' + str(ref_lengths[contig])
                 print(
                     self.log_prefix,
                     contig,
                     ref_lengths[contig],
-                    '1-' + str(start + 1) +  ';' + str(end + 1) + '-' + str(ref_lengths[contig]),
+                    coords_string,
                     sep='\t',
                     file=f_log
                 )
+                if self.verbose:
+                    print('Getting all reads that map to ends of contig ', contig, '. Coords: ', coords_string, sep='', flush=True)
 
         if not self.discard_unmapped:
+            if self.verbose:
+                print('Getting all unmapped reads', sep='', flush=True)
             self._get_all_unmapped_reads(f_fa)
 
         pyfastaq.utils.close(f_fa)
         pyfastaq.utils.close(f_log)
+
+        if self.verbose:
+            print('Finished getting reads.')
+            print('Log file:', self.log)
+            print('Reads file:', self.reads_fa, flush=True)
diff --git a/circlator/common.py b/circlator/common.py
index 76fd3ee..114c980 100644
--- a/circlator/common.py
+++ b/circlator/common.py
@@ -4,8 +4,6 @@ import subprocess
 
 class Error (Exception): pass
 
-version = '1.2.0'
-
 def syscall(cmd, allow_fail=False, verbose=False):
     if verbose:
         print('syscall:', cmd, flush=True)
diff --git a/circlator/external_progs.py b/circlator/external_progs.py
index 846fc33..9bf3efe 100644
--- a/circlator/external_progs.py
+++ b/circlator/external_progs.py
@@ -1,6 +1,7 @@
 import re
 import sys
 from circlator import program, common
+from circlator import __version__ as circlator_version
 import shutil
 import pyfastaq
 
@@ -27,7 +28,7 @@ prog_to_version_cmd = {
     'nucmer': ('--version', re.compile('^NUCmer \(NUCleotide MUMmer\) version ([0-9\.]+)')),
     'prodigal': ('-v', re.compile('^Prodigal V([0-9\.]+):')),
     'samtools': ('', re.compile('^Version: ([0-9\.]+)')),
-    'spades': ('', re.compile('^SPAdes genome assembler v.([0-9\.]+)')),
+    'spades': ('', re.compile('^SPAdes genome assembler v.?([0-9][0-9\.]+)')),
 }
 
 
@@ -94,17 +95,14 @@ def make_and_check_prog(name, verbose=False, raise_error=True, filehandle=None):
         return p
 
     if verbose:
-        print('Using', name, 'version', p.version(), 'as', p.full_path)
+        print(name, p.version(), p.full_path, sep='\t')
 
     if filehandle:
-        print('Using', name, 'version', p.version(), 'as', p.full_path, file=filehandle)
+        print(name, p.version(), p.full_path, sep='\t', file=filehandle)
 
     return p
 
 
 def check_all_progs(verbose=False, raise_error=False, filehandle=None):
-    if filehandle is not None:
-        print(sys.argv[0], 'version', common.version, file=filehandle)
-
     for prog in sorted(prog_name_to_default):
         make_and_check_prog(prog, verbose=verbose, raise_error=raise_error, filehandle=filehandle)
diff --git a/circlator/tasks/all.py b/circlator/tasks/all.py
index a392088..5ada723 100644
--- a/circlator/tasks/all.py
+++ b/circlator/tasks/all.py
@@ -18,6 +18,7 @@ def run():
         usage = 'circlator all [options] <assembly.fasta> <reads.fasta> <output directory>')
     parser.add_argument('--threads', type=int, help='Number of threads [%(default)s]', default=1, metavar='INT')
     parser.add_argument('--verbose', action='store_true', help='Be verbose')
+    parser.add_argument('--unchanged_code', type=int, help='Code to return when the input assembly is not changed [%(default)s]', default=0, metavar='INT')
     parser.add_argument('assembly', help='Name of original assembly', metavar='assembly.fasta')
     parser.add_argument('reads', help='Name of corrected reads FASTA file', metavar='reads.fasta')
     parser.add_argument('outdir', help='Name of output directory (must not already exist)', metavar='output directory')
@@ -63,7 +64,11 @@ def run():
     options = parser.parse_args()
 
     print_message('{:_^79}'.format(' Checking external programs '), options)
-    circlator.external_progs.check_all_progs(verbose=options.verbose, raise_error=True)
+    if options.verbose:
+        circlator.versions.get_all_versions(sys.stdout, raise_error=True)
+    else:
+        circlator.versions.get_all_versions(None, raise_error=True)
+
 
     files_to_check = [options.assembly, options.reads]
     if options.b2r_only_contigs:
@@ -92,7 +97,7 @@ def run():
 
     with open('00.info.txt', 'w') as f:
         print(sys.argv[0], 'all', ' '.join(sys.argv[1:]), file=f)
-        circlator.external_progs.check_all_progs(filehandle=f, raise_error=True)
+        circlator.versions.get_all_versions(f)
 
     original_assembly_renamed = '00.input_assembly.fasta'
     bam = '01.mapreads.bam'
@@ -135,6 +140,7 @@ def run():
         min_read_length=options.b2r_min_read_length,
         contigs_to_use=options.b2r_only_contigs,
         discard_unmapped=options.b2r_discard_unmapped,
+        verbose=options.verbose,
     )
     bam_filter.run()
 
@@ -248,5 +254,18 @@ def run():
     )
     fixer.run()
 
+    #-------------------------------- summary -------------------------------
+    print_message('{:_^79}'.format(' Summary '), options)
+    number_of_input_contigs = pyfastaq.tasks.count_sequences(original_assembly_renamed)
+    final_number_of_contigs = pyfastaq.tasks.count_sequences(fixstart_fasta)
+    number_circularized = len(contigs_to_keep)
+    print_message('Number of input contigs: ' + str(number_of_input_contigs), options)
+    print_message('Number of contigs after merging: ' + str(final_number_of_contigs), options)
+    print_message(' '.join(['Circularized', str(number_circularized), 'of', str(final_number_of_contigs), 'contig(s)']), options)
+
     with open(fixstart_prefix + '.ALL_FINISHED', 'w') as f:
         pass
+
+    if number_of_input_contigs == final_number_of_contigs and number_circularized == 0:
+        sys.exit(options.unchanged_code)
+
diff --git a/circlator/tasks/bam2reads.py b/circlator/tasks/bam2reads.py
index 039aa88..4fd2cc2 100644
--- a/circlator/tasks/bam2reads.py
+++ b/circlator/tasks/bam2reads.py
@@ -11,6 +11,7 @@ def run():
     parser.add_argument('--only_contigs', help='File of contig names (one per line). Only reads that map to these contigs are kept (and unmapped reads, unless --discard_unmapped is used).', metavar='FILENAME')
     parser.add_argument('--length_cutoff', type=int, help='All reads mapped to contigs shorter than this will be kept [%(default)s]', default=100000, metavar='INT')
     parser.add_argument('--min_read_length', type=int, help='Minimum length of read to output [%(default)s]', default=250, metavar='INT')
+    parser.add_argument('--verbose', action='store_true', help='Be verbose')
     parser.add_argument('bam', help='Name of input bam file', metavar='in.bam')
     parser.add_argument('outprefix', help='Prefix of output filenames')
     options = parser.parse_args()
@@ -22,6 +23,7 @@ def run():
         min_read_length=options.min_read_length,
         contigs_to_use=options.only_contigs,
         discard_unmapped=options.discard_unmapped,
+        verbose=options.verbose,
     )
     bam_filter.run()
 
diff --git a/circlator/tasks/progcheck.py b/circlator/tasks/progcheck.py
index 59e6941..86ca05a 100644
--- a/circlator/tasks/progcheck.py
+++ b/circlator/tasks/progcheck.py
@@ -1,11 +1,10 @@
 import argparse
 import sys
-from circlator import external_progs
+from circlator import versions
 
 def run():
     parser = argparse.ArgumentParser(
         description = 'Checks all dependencies are found and are correct versions',
         usage = 'circlator progcheck')
     options = parser.parse_args()
-
-    external_progs.check_all_progs(verbose=True, raise_error=False)
+    versions.get_all_versions(sys.stdout, raise_error=False)
diff --git a/circlator/tasks/version.py b/circlator/tasks/version.py
index c8da227..15473fc 100644
--- a/circlator/tasks/version.py
+++ b/circlator/tasks/version.py
@@ -1,4 +1,5 @@
+from circlator import __version__ as circlator_version
 import circlator
 
 def run():
-    print(circlator.common.version)
+    print(circlator_version)
diff --git a/circlator/versions.py b/circlator/versions.py
new file mode 100644
index 0000000..4358018
--- /dev/null
+++ b/circlator/versions.py
@@ -0,0 +1,40 @@
+import sys
+import bio_assembly_refinement
+import openpyxl
+import pyfastaq
+import pymummer
+import pysam
+from circlator import external_progs, __version__
+from circlator import __version__ as circlator_version
+
+
+def get_all_versions(filehandle, raise_error=True):
+    if filehandle is not None:
+        print('Circlator version:', circlator_version, file=filehandle)
+        print('\nExternal dependencies:', file=filehandle)
+
+    external_progs.check_all_progs(verbose=False, raise_error=raise_error, filehandle=filehandle)
+
+    if filehandle is not None:
+        print('\nPython version:', file=filehandle)
+        print(sys.version, file=filehandle)
+        print('\nPython dependencies:', file=filehandle)
+
+    found_bad_module = False
+
+    for module in ['bio_assembly_refinement', 'openpyxl', 'pyfastaq', 'pymummer', 'pysam']:
+        try:
+            version = eval(module + '.__version__')
+            path = eval(module + '.__file__')
+        except:
+            version = 'NOT_FOUND'
+            path = 'NOT_FOUND'
+            found_bad_module = True
+
+        if filehandle is not None:
+            print(module + '\t' + version + '\t' + path, file=filehandle)
+
+    if raise_error and found_bad_module:
+        print('Some dependencies not satisfied. Cannot continue. Try running: circlator progcheck', file=sys.stderr)
+        sys.exit(1)
+
diff --git a/setup.py b/setup.py
index 86f1fb6..650acc0 100644
--- a/setup.py
+++ b/setup.py
@@ -7,7 +7,7 @@ from setuptools import setup, find_packages
 
 setup(
     name='circlator',
-    version='1.2.0',
+    version='1.2.1',
     description='circlator: a tool to circularise genome assemblies',
     packages = find_packages(),
     package_data={'circlator': ['data/*']},
@@ -19,10 +19,10 @@ setup(
     tests_require=['nose >= 1.3'],
     install_requires=[
         'openpyxl',
-        'pyfastaq >= 3.10.0',
+        'pyfastaq >= 3.12.1',
         'pysam >= 0.8.1, <= 0.8.3',
-        'pymummer>=0.6.1',
-        'bio_assembly_refinement>=0.5.0',
+        'pymummer>=0.7.1',
+        'bio_assembly_refinement>=0.5.1',
     ],
     license='GPLv3',
     classifiers=[

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/circlator.git



More information about the debian-med-commit mailing list