Repository 'concoct'
hg clone https://toolshed.g2.bx.psu.edu/repos/iuc/concoct

Changeset 1:031f84cb2fd3 (2022-03-13)
Previous changeset 0:06c0eb033025 (2022-02-18) Next changeset 2:7a145c72d375 (2022-07-01)
Commit message:
"planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/concoct commit 40a09cbfd6052f7b0295946621db1bdf58228b09"
modified:
concoct.xml
macros.xml
added:
coverage_table.py
cut_up_fasta.py
merge_cut_up_clustering.py
static/images/pipeline.png
test-data/input.fasta.gz
test-data/input_coverage_table.fasta.gz
test-data/input_coverage_table.tabular
test-data/input_merge_clusters.tabular
test-data/output_coverage_table.tabular
test-data/output_merge_clusters.tabular
b
diff -r 06c0eb033025 -r 031f84cb2fd3 concoct.xml
--- a/concoct.xml Fri Feb 18 14:18:11 2022 +0000
+++ b/concoct.xml Sun Mar 13 08:45:05 2022 +0000
b
@@ -109,8 +109,9 @@
 sample (the values are the average coverage for this contig in that sample) and a file containing sequences in
 fasta format.
 
-Three are produced; clustering of the > 1000 kmer count, the PCA transformed matrix and the PCA components.
+Three outputs are produced; clustering of the > 1000 kmer count, the PCA transformed matrix and the PCA components.
 
+@HELP_OVERVIEW@
     ]]></help>
     <expand macro="citations"/>
 </tool>
b
diff -r 06c0eb033025 -r 031f84cb2fd3 coverage_table.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/coverage_table.py Sun Mar 13 08:45:05 2022 +0000
[
@@ -0,0 +1,83 @@
+#!/usr/bin/env python
+
+import argparse
+import gzip
+from functools import partial
+
+from Bio import SeqIO
+
+
+def generate_coverage_table(input_fasta, input_tabular, gzipped, output):
+    # Read input file into a dict and return everything
+    # in the table format required by CONCOCT.
+    gc_and_len_dict = get_gc_and_len_dict(input_fasta, gzipped)
+    assert(len(gc_and_len_dict) > 0)
+    bed_coverage_dict = get_bed_coverage_dict(input_tabular)
+
+    with open(output, 'w') as fh:
+        # Output the header.
+        fh.write("contig\tlength")
+        t = tuple(range(len(bed_coverage_dict)))
+        fh.write("\tcov_mean_sample_%d\n" % len(t))
+        # Output the content.
+        for acc in gc_and_len_dict:
+            # Fasta stats.
+            fh.write("%s\t%s" % (acc, gc_and_len_dict[acc]['length']))
+            # Mean
+            try:
+                # Coverage mean
+                fh.write("\t%f" % (bed_coverage_dict[acc]["cov_mean"]))
+            except KeyError:
+                # No reads mapped to this contig
+                fh.write("\t0")
+            fh.write("\n")
+
+
+def get_bed_coverage_dict(input_tabular):
+    # Ddetermine mean coverage and percentage covered
+    # for each contig, returning a dict with fasta id
+    # as key and percentage covered and cov_mean as keys
+    # for the inner dict.
+    out_dict = {}
+
+    with open(input_tabular, 'r') as fh:
+        for line in fh:
+            line = line.rstrip('\r\n')
+            cols = line.split('\t')
+            try:
+                d = out_dict[cols[0]]
+            except KeyError:
+                d = {}
+                out_dict[cols[0]] = d
+            if int(cols[1]) == 0:
+                d["percentage_covered"] = 100 - float(cols[4]) * 100.0
+            else:
+                d["cov_mean"] = d.get("cov_mean", 0) + int(cols[1]) * float(cols[4])
+    return out_dict
+
+
+def get_gc_and_len_dict(input_fasta, gzipped):
+    # Creates a dictionary with the fasta id as key
+    # and GC and length as keys for the inner dictionary.
+    if gzipped:
+        _open = partial(gzip.open, mode='rt')
+    else:
+        _open = open
+
+    out_dict = {}
+    with _open(input_fasta) as input_fh:
+        for rec in SeqIO.parse(input_fh, "fasta"):
+            out_dict[rec.id] = {}
+            out_dict[rec.id]["length"] = len(rec.seq)
+    return out_dict
+
+
+parser = argparse.ArgumentParser(description=__doc__)
+parser.add_argument('--input_tabular', action='store', dest='input_tabular', help='bedtools genomeCoverageBed bed file')
+parser.add_argument('--input_fasta', action='store', dest='input_fasta', help='Contigs fasta file')
+parser.add_argument("--gzipped", action="store_true", dest="gzipped", default=False, help="input_fasta is gzipped")
+parser.add_argument('--output', action='store', dest='output', help='Output file')
+
+args = parser.parse_args()
+
+generate_coverage_table(args.input_fasta, args.input_tabular, args.gzipped, args.output)
b
diff -r 06c0eb033025 -r 031f84cb2fd3 cut_up_fasta.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cut_up_fasta.py Sun Mar 13 08:45:05 2022 +0000
[
@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+
+import argparse
+import gzip
+from functools import partial
+
+from Bio import SeqIO
+
+
+def cut_up_fasta(input_fasta, chunk_size, overlap, merge_last, output_fasta, output_bed, gzipped):
+    if gzipped:
+        _open = partial(gzip.open, mode='rt')
+    else:
+        _open = open
+
+    fasta_fh = open(output_fasta, 'w')
+
+    if output_bed is not None:
+        bed_fh = open(output_bed, 'w')
+
+    with _open(input_fasta) as input_fh:
+        for record in SeqIO.parse(input_fh, "fasta"):
+            if (not merge_last and len(record.seq) > chunk_size) or (merge_last and len(record.seq) >= 2 * chunk_size):
+                for index, split_seq in enumerate(chunks(record.seq, chunk_size, overlap, merge_last)):
+                    fasta_fh.write(f">{record.id}.concoct_part_{index}\n{split_seq}\n")
+                    if output_bed is not None:
+                        bed_fh.write(f"{record.id}\t{chunk_size * index}\t{chunk_size * index + len(split_seq)}\t{record.id}.concoct_part_{index}\n")
+            else:
+                fasta_fh.write(f">{record.id}.concoct_part_0\n{record.seq}\n")
+                if output_bed is not None:
+                    bed_fh.write(f"{record.id}\t0\t{len(record.seq)}\t{record.id}.concoct_part_0\n")
+    if output_bed is not None:
+        bed_fh.close()
+
+
+def chunks(seq, chunk_size, overlap_size, merge_last):
+    # Yield successive chunk_size-sized chunks from seq
+    # with given overlap overlap_size between the chunks.
+    assert chunk_size > overlap_size
+    if merge_last:
+        for i in range(0, len(seq) - chunk_size + 1, chunk_size - overlap_size):
+            yield seq[i:i + chunk_size] if i + chunk_size + chunk_size - overlap_size <= len(seq) else seq[i:]
+    else:
+        for i in range(0, len(seq), chunk_size - overlap_size):
+            yield seq[i:i + chunk_size]
+
+
+parser = argparse.ArgumentParser()
+parser.add_argument("--input_fasta", action="store", dest="input_fasta", help="Fasta files with contigs")
+parser.add_argument("--gzipped", action="store_true", dest="gzipped", help="Input file is gzipped")
+parser.add_argument("--chunk_size", action="store", dest="chunk_size", type=int, help="Chunk size\n")
+parser.add_argument("--overlap_size", action="store", dest="overlap_size", type=int, help="Overlap size\n")
+parser.add_argument("--merge_last", default=False, action="store_true", dest="merge_last", help="Concatenate final part to last contig\n")
+parser.add_argument("--output_bed", action="store", dest="output_bed", default=None, help="BED file to be created with exact regions of the original contigs corresponding to the newly created contigs")
+parser.add_argument("--output_fasta", action="store", dest="output_fasta", help="Output fasta file with cut contigs")
+
+args = parser.parse_args()
+cut_up_fasta(args.input_fasta, args.chunk_size, args.overlap_size, args.merge_last, args.output_fasta, args.output_bed, args.gzipped)
b
diff -r 06c0eb033025 -r 031f84cb2fd3 macros.xml
--- a/macros.xml Fri Feb 18 14:18:11 2022 +0000
+++ b/macros.xml Sun Mar 13 08:45:05 2022 +0000
b
@@ -4,11 +4,20 @@
     <token name="@PROFILE@">21.01</token>
     <xml name="requirements">
         <requirements>
+            <requirement type="package" version="1.79">biopython</requirement>
             <requirement type="package" version="@TOOL_VERSION@">concoct</requirement>
             <requirement type="package" version="0.19.2">pandas</requirement>
-            <requirement type="package" version="1.79">biopython</requirement>
         </requirements>
     </xml>
+    <token name="@HELP_OVERVIEW@">
+
+The intended use of the CONCOCT tools is shown in the following image.
+
+.. image:: pipeline.png
+
+More information may be found on the CONCOCT homepage:: https://github.com/BinPro/CONCOCT
+
+    </token>
     <xml name="citations">
         <citations>
             <citation type="doi">10.1038/nmeth.3103</citation>
b
diff -r 06c0eb033025 -r 031f84cb2fd3 merge_cut_up_clustering.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/merge_cut_up_clustering.py Sun Mar 13 08:45:05 2022 +0000
[
@@ -0,0 +1,56 @@
+#!/usr/bin/env python
+
+import argparse
+import re
+import sys
+from collections import Counter
+from collections import defaultdict
+
+
+CONTIG_PART_EXPR = re.compile(r'(.*)\.concoct_part_([0-9]*)')
+
+
+def original_contig_name_special(contig_id):
+    try:
+        original_id, part_index = CONTIG_PART_EXPR.match(contig_id).group(1, 2)
+        return original_id, part_index
+    except AttributeError:
+        # No matches for concoct_part regex.
+        return contig_id, 0
+
+
+parser = argparse.ArgumentParser()
+parser.add_argument("--input", action="store", dest="input", help="Tabular file with cut up clusters")
+parser.add_argument("--output", action="store", dest="output", help="Output file with merged clusters")
+
+args = parser.parse_args()
+
+# Get cut up clusters
+all_seqs = {}
+all_originals = defaultdict(dict)
+with open(args.input, 'r') as ifh:
+    for i, line in enumerate(ifh):
+        if i == 0:
+            if 'contig_id' not in line:
+                sys.stderr.write("ERROR nvalid clustering file, 'contig_id' is not found in the header.")
+                sys.exit(-1)
+            # Skip header.
+            continue
+        line = line.rstrip('\r\n')
+        contig_id, cluster_id = line.split('\t')
+        original_contig_name, part_id = original_contig_name_special(contig_id)
+        all_originals[original_contig_name][part_id] = cluster_id
+
+# Merge cut up clusters.
+with open(args.output, 'w') as ofh:
+    ofh.write("contig_id\tcluster_id\n")
+    for original_contig_id, part_ids_d in all_originals.items():
+        if len(part_ids_d) > 1:
+            c = Counter(part_ids_d.values())
+            cluster_id = c.most_common(1)[0][0]
+            c_string = [(a, b) for a, b in c.items()]
+            # Here if len(c.values()) > 1,
+            # then no cluster for contig.
+        else:
+            cluster_id = list(part_ids_d.values())[0]
+        ofh.write(f"{original_contig_id}\t{cluster_id}\n")
b
diff -r 06c0eb033025 -r 031f84cb2fd3 static/images/pipeline.png
b
Binary file static/images/pipeline.png has changed
b
diff -r 06c0eb033025 -r 031f84cb2fd3 test-data/input.fasta.gz
b
Binary file test-data/input.fasta.gz has changed
b
diff -r 06c0eb033025 -r 031f84cb2fd3 test-data/input_coverage_table.fasta.gz
b
Binary file test-data/input_coverage_table.fasta.gz has changed
b
diff -r 06c0eb033025 -r 031f84cb2fd3 test-data/input_coverage_table.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/input_coverage_table.tabular Sun Mar 13 08:45:05 2022 +0000
b
b'@@ -0,0 +1,422 @@\n+NODE_100_length_1535_cov_6.691205\t0\t1605\t1605\t1\n+NODE_101_length_153_cov_4.235294\t0\t223\t223\t1\n+NODE_103_length_20202_cov_8.395357.0\t0\t10000\t10000\t1\n+NODE_103_length_20202_cov_8.395357.1\t0\t10272\t10272\t1\n+NODE_104_length_823_cov_8.356014\t0\t893\t893\t1\n+NODE_105_length_260_cov_4.142308\t0\t330\t330\t1\n+NODE_106_length_2172_cov_16.183702\t0\t2242\t2242\t1\n+NODE_107_length_7609_cov_8.569195\t0\t7679\t7679\t1\n+NODE_108_length_1232_cov_16.167208\t0\t1302\t1302\t1\n+NODE_109_length_178_cov_16.084270\t0\t248\t248\t1\n+NODE_10_length_186_cov_4.327957\t0\t256\t256\t1\n+NODE_111_length_80116_cov_8.871636.0\t0\t10000\t10000\t1\n+NODE_111_length_80116_cov_8.871636.1\t0\t10000\t10000\t1\n+NODE_111_length_80116_cov_8.871636.2\t0\t10000\t10000\t1\n+NODE_111_length_80116_cov_8.871636.3\t0\t10000\t10000\t1\n+NODE_111_length_80116_cov_8.871636.4\t0\t10000\t10000\t1\n+NODE_111_length_80116_cov_8.871636.5\t0\t10000\t10000\t1\n+NODE_111_length_80116_cov_8.871636.6\t0\t10000\t10000\t1\n+NODE_111_length_80116_cov_8.871636.7\t0\t10186\t10186\t1\n+NODE_112_length_846_cov_18.049644\t0\t916\t916\t1\n+NODE_113_length_286_cov_12.695805\t0\t356\t356\t1\n+NODE_114_length_4896_cov_18.356821\t0\t4966\t4966\t1\n+NODE_115_length_78252_cov_8.512166.0\t0\t10000\t10000\t1\n+NODE_115_length_78252_cov_8.512166.1\t0\t10000\t10000\t1\n+NODE_115_length_78252_cov_8.512166.2\t0\t10000\t10000\t1\n+NODE_115_length_78252_cov_8.512166.3\t0\t10000\t10000\t1\n+NODE_115_length_78252_cov_8.512166.4\t0\t10000\t10000\t1\n+NODE_115_length_78252_cov_8.512166.5\t0\t10000\t10000\t1\n+NODE_115_length_78252_cov_8.512166.6\t0\t18322\t18322\t1\n+NODE_116_length_203_cov_4.093596\t0\t273\t273\t1\n+NODE_117_length_248_cov_25.778225\t0\t318\t318\t1\n+NODE_118_length_15438_cov_8.266615\t0\t15508\t15508\t1\n+NODE_119_length_83_cov_11.493976\t0\t153\t153\t1\n+NODE_11_length_153_cov_12.470589\t0\t223\t223\t1\n+NODE_121_length_60582_cov_8.522333.0\t0\t10000\t10000\t1\n+NODE_121_length_60582_cov_8.522333.1\t0\t10000\t10000\t1\n+NODE_121_length_60582_cov_8.522333.2\t0\t10000\t10000\t1\n+NODE_121_length_60582_cov_8.522333.3\t0\t10000\t10000\t1\n+NODE_121_length_60582_cov_8.522333.4\t0\t10000\t10000\t1\n+NODE_121_length_60582_cov_8.522333.5\t0\t10652\t10652\t1\n+NODE_123_length_75191_cov_8.369140.0\t0\t10000\t10000\t1\n+NODE_123_length_75191_cov_8.369140.1\t0\t10000\t10000\t1\n+NODE_123_length_75191_cov_8.369140.2\t0\t10000\t10000\t1\n+NODE_123_length_75191_cov_8.369140.3\t0\t10000\t10000\t1\n+NODE_123_length_75191_cov_8.369140.4\t0\t10000\t10000\t1\n+NODE_123_length_75191_cov_8.369140.5\t0\t10000\t10000\t1\n+NODE_123_length_75191_cov_8.369140.6\t0\t15261\t15261\t1\n+NODE_124_length_407_cov_4.159705\t0\t477\t477\t1\n+NODE_128_length_532_cov_17.454887\t0\t602\t602\t1\n+NODE_129_length_160323_cov_8.254436.0\t0\t10000\t10000\t1\n+NODE_129_length_160323_cov_8.254436.1\t0\t10000\t10000\t1\n+NODE_129_length_160323_cov_8.254436.10\t0\t10000\t10000\t1\n+NODE_129_length_160323_cov_8.254436.11\t0\t10000\t10000\t1\n+NODE_129_length_160323_cov_8.254436.12\t0\t10000\t10000\t1\n+NODE_129_length_160323_cov_8.254436.13\t0\t10000\t10000\t1\n+NODE_129_length_160323_cov_8.254436.14\t0\t10000\t10000\t1\n+NODE_129_length_160323_cov_8.254436.15\t0\t10393\t10393\t1\n+NODE_129_length_160323_cov_8.254436.2\t0\t10000\t10000\t1\n+NODE_129_length_160323_cov_8.254436.3\t0\t10000\t10000\t1\n+NODE_129_length_160323_cov_8.254436.4\t0\t10000\t10000\t1\n+NODE_129_length_160323_cov_8.254436.5\t0\t10000\t10000\t1\n+NODE_129_length_160323_cov_8.254436.6\t0\t10000\t10000\t1\n+NODE_129_length_160323_cov_8.254436.7\t0\t10000\t10000\t1\n+NODE_129_length_160323_cov_8.254436.8\t0\t10000\t10000\t1\n+NODE_129_length_160323_cov_8.254436.9\t0\t10000\t10000\t1\n+NODE_12_length_555_cov_14.255856\t0\t625\t625\t1\n+NODE_130_length_3461_cov_7.763941\t0\t3531\t3531\t1\n+NODE_131_length_92242_cov_8.320277.0\t0\t10000\t10000\t1\n+NODE_131_length_92242_cov_8.320277.1\t0\t10000\t10000\t1\n+NODE_131_length_92242_cov_8.320277.2\t0\t10000\t10000\t1\n+NODE_131_length_92242_cov_8.320277.3\t0\t10000\t10000\t1\n+NODE_131_length_92242_cov_8.320277.4\t0\t10000\t10000\t1\n+NODE_131_length_92242_cov_8.320277.5\t0\t10000\t10000\t1\n+NODE_131_length_92242_cov_8.320277.6\t0\t10000\t10000\t1\n+NODE_131_length_92242_cov_8.320277.7\t0\t10000\t10000\t1\n+NODE_131_length_92242_cov_8.320277.8\t0\t12312\t'..b'0000\t1\n+NODE_260_length_165083_cov_8.801846.3\t0\t10000\t10000\t1\n+NODE_260_length_165083_cov_8.801846.4\t0\t10000\t10000\t1\n+NODE_260_length_165083_cov_8.801846.5\t0\t10000\t10000\t1\n+NODE_260_length_165083_cov_8.801846.6\t0\t10000\t10000\t1\n+NODE_260_length_165083_cov_8.801846.7\t0\t10000\t10000\t1\n+NODE_260_length_165083_cov_8.801846.8\t0\t10000\t10000\t1\n+NODE_260_length_165083_cov_8.801846.9\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.0\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.1\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.10\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.11\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.12\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.13\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.14\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.15\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.16\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.17\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.18\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.19\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.2\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.20\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.21\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.22\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.23\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.24\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.25\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.26\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.27\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.28\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.29\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.3\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.30\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.31\t0\t11531\t11531\t1\n+NODE_261_length_321461_cov_8.199894.4\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.5\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.6\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.7\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.8\t0\t10000\t10000\t1\n+NODE_261_length_321461_cov_8.199894.9\t0\t10000\t10000\t1\n+NODE_262_length_112_cov_9.366072\t0\t182\t182\t1\n+NODE_264_length_143_cov_21.937063\t0\t213\t213\t1\n+NODE_265_length_543_cov_4.924494\t0\t613\t613\t1\n+NODE_266_length_205_cov_15.878049\t0\t275\t275\t1\n+NODE_267_length_4676_cov_7.631737\t0\t4746\t4746\t1\n+NODE_269_length_849_cov_6.312132\t0\t919\t919\t1\n+NODE_26_length_3431_cov_15.138152\t0\t3501\t3501\t1\n+NODE_270_length_151_cov_4.258278\t0\t221\t221\t1\n+NODE_271_length_164_cov_15.048780\t0\t234\t234\t1\n+NODE_272_length_154_cov_14.188312\t0\t224\t224\t1\n+NODE_274_length_173_cov_11.838150\t0\t243\t243\t1\n+NODE_275_length_149_cov_4.000000\t0\t219\t219\t1\n+NODE_277_length_146_cov_4.280822\t0\t216\t216\t1\n+NODE_27_length_35477_cov_8.181526.0\t0\t10000\t10000\t1\n+NODE_27_length_35477_cov_8.181526.1\t0\t10000\t10000\t1\n+NODE_27_length_35477_cov_8.181526.2\t0\t15547\t15547\t1\n+NODE_283_length_165_cov_4.200000\t0\t235\t235\t1\n+NODE_284_length_148_cov_4.236486\t0\t218\t218\t1\n+NODE_285_length_433_cov_5.106236\t0\t503\t503\t1\n+NODE_288_length_174_cov_4.316092\t0\t244\t244\t1\n+NODE_28_length_34835_cov_8.108799.0\t0\t10000\t10000\t1\n+NODE_28_length_34835_cov_8.108799.1\t0\t10000\t10000\t1\n+NODE_28_length_34835_cov_8.108799.2\t0\t14905\t14905\t1\n+NODE_290_length_1962_cov_6.746177\t0\t2032\t2032\t1\n+NODE_293_length_832_cov_6.325721\t0\t902\t902\t1\n+NODE_294_length_210_cov_4.066667\t0\t280\t280\t1\n+NODE_295_length_196_cov_4.397959\t0\t266\t266\t1\n+NODE_29_length_44540_cov_9.429951.0\t0\t10000\t10000\t1\n+NODE_29_length_44540_cov_9.429951.1\t0\t10000\t10000\t1\n+NODE_29_length_44540_cov_9.429951.2\t0\t10000\t10000\t1\n+NODE_29_length_44540_cov_9.429951.3\t0\t14610\t14610\t1\n+NODE_2_length_16156_cov_8.219856\t0\t16226\t16226\t1\n+ODE_101_length_153_cov_4.235294\t0\t242193529\t242193529\t1\n+ODE_107_length_7609_cov_8.569195\t0\t159345973\t159345973\t1\n+ODE_10_length_186_cov_4.327957\t0\t138394717\t138394717\t1\n+ODE_116_length_203_cov_4.093596\t0\t80373285\t80373285\t1\n+genome\t0\t623573523\t623652648\t0.999873\n'
b
diff -r 06c0eb033025 -r 031f84cb2fd3 test-data/input_merge_clusters.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/input_merge_clusters.tabular Sun Mar 13 08:45:05 2022 +0000
b
b'@@ -0,0 +1,330 @@\n+contig_id\tcluster_id\n+NODE_100_length_1535_cov_6.691205.concoct_part_0\t14\n+NODE_103_length_20202_cov_8.395357.0.concoct_part_0\t28\n+NODE_103_length_20202_cov_8.395357.1.concoct_part_0\t26\n+NODE_106_length_2172_cov_16.183702.concoct_part_0\t2\n+NODE_107_length_7609_cov_8.569195.concoct_part_0\t0\n+NODE_108_length_1232_cov_16.167208.concoct_part_0\t2\n+NODE_111_length_80116_cov_8.871636.0.concoct_part_0\t28\n+NODE_111_length_80116_cov_8.871636.1.concoct_part_0\t28\n+NODE_111_length_80116_cov_8.871636.2.concoct_part_0\t28\n+NODE_111_length_80116_cov_8.871636.3.concoct_part_0\t28\n+NODE_111_length_80116_cov_8.871636.4.concoct_part_0\t28\n+NODE_111_length_80116_cov_8.871636.5.concoct_part_0\t28\n+NODE_111_length_80116_cov_8.871636.6.concoct_part_0\t28\n+NODE_111_length_80116_cov_8.871636.7.concoct_part_0\t28\n+NODE_114_length_4896_cov_18.356821.concoct_part_0\t10\n+NODE_115_length_78252_cov_8.512166.0.concoct_part_0\t28\n+NODE_115_length_78252_cov_8.512166.1.concoct_part_0\t28\n+NODE_115_length_78252_cov_8.512166.2.concoct_part_0\t28\n+NODE_115_length_78252_cov_8.512166.3.concoct_part_0\t28\n+NODE_115_length_78252_cov_8.512166.4.concoct_part_0\t28\n+NODE_115_length_78252_cov_8.512166.5.concoct_part_0\t28\n+NODE_115_length_78252_cov_8.512166.6.concoct_part_0\t28\n+NODE_115_length_78252_cov_8.512166.6.concoct_part_1\t28\n+NODE_118_length_15438_cov_8.266615.concoct_part_0\t28\n+NODE_118_length_15438_cov_8.266615.concoct_part_1\t28\n+NODE_121_length_60582_cov_8.522333.0.concoct_part_0\t28\n+NODE_121_length_60582_cov_8.522333.1.concoct_part_0\t28\n+NODE_121_length_60582_cov_8.522333.2.concoct_part_0\t28\n+NODE_121_length_60582_cov_8.522333.3.concoct_part_0\t28\n+NODE_121_length_60582_cov_8.522333.4.concoct_part_0\t28\n+NODE_121_length_60582_cov_8.522333.5.concoct_part_0\t28\n+NODE_123_length_75191_cov_8.369140.0.concoct_part_0\t28\n+NODE_123_length_75191_cov_8.369140.1.concoct_part_0\t28\n+NODE_123_length_75191_cov_8.369140.2.concoct_part_0\t28\n+NODE_123_length_75191_cov_8.369140.3.concoct_part_0\t28\n+NODE_123_length_75191_cov_8.369140.4.concoct_part_0\t28\n+NODE_123_length_75191_cov_8.369140.5.concoct_part_0\t28\n+NODE_123_length_75191_cov_8.369140.6.concoct_part_0\t28\n+NODE_123_length_75191_cov_8.369140.6.concoct_part_1\t5\n+NODE_129_length_160323_cov_8.254436.0.concoct_part_0\t28\n+NODE_129_length_160323_cov_8.254436.1.concoct_part_0\t28\n+NODE_129_length_160323_cov_8.254436.10.concoct_part_0\t28\n+NODE_129_length_160323_cov_8.254436.11.concoct_part_0\t28\n+NODE_129_length_160323_cov_8.254436.12.concoct_part_0\t28\n+NODE_129_length_160323_cov_8.254436.13.concoct_part_0\t28\n+NODE_129_length_160323_cov_8.254436.14.concoct_part_0\t28\n+NODE_129_length_160323_cov_8.254436.15.concoct_part_0\t28\n+NODE_129_length_160323_cov_8.254436.2.concoct_part_0\t28\n+NODE_129_length_160323_cov_8.254436.3.concoct_part_0\t28\n+NODE_129_length_160323_cov_8.254436.4.concoct_part_0\t28\n+NODE_129_length_160323_cov_8.254436.5.concoct_part_0\t28\n+NODE_129_length_160323_cov_8.254436.6.concoct_part_0\t28\n+NODE_129_length_160323_cov_8.254436.7.concoct_part_0\t28\n+NODE_129_length_160323_cov_8.254436.8.concoct_part_0\t28\n+NODE_129_length_160323_cov_8.254436.9.concoct_part_0\t28\n+NODE_130_length_3461_cov_7.763941.concoct_part_0\t9\n+NODE_131_length_92242_cov_8.320277.0.concoct_part_0\t28\n+NODE_131_length_92242_cov_8.320277.1.concoct_part_0\t28\n+NODE_131_length_92242_cov_8.320277.2.concoct_part_0\t28\n+NODE_131_length_92242_cov_8.320277.3.concoct_part_0\t28\n+NODE_131_length_92242_cov_8.320277.4.concoct_part_0\t28\n+NODE_131_length_92242_cov_8.320277.5.concoct_part_0\t28\n+NODE_131_length_92242_cov_8.320277.6.concoct_part_0\t28\n+NODE_131_length_92242_cov_8.320277.7.concoct_part_0\t28\n+NODE_131_length_92242_cov_8.320277.8.concoct_part_0\t28\n+NODE_131_length_92242_cov_8.320277.8.concoct_part_1\t13\n+NODE_13_length_6591_cov_8.574723.concoct_part_0\t9\n+NODE_151_length_29715_cov_8.256470.0.concoct_part_0\t28\n+NODE_151_length_29715_cov_8.256470.1.concoct_part_0\t28\n+NODE_151_length_29715_cov_8.256470.1.concoct_part_1\t28\n+NODE_157_length_58632_cov_8.156433.0.concoct_'..b'ov_8.177872.7.concoct_part_0\t28\n+NODE_258_length_263280_cov_8.177872.8.concoct_part_0\t28\n+NODE_258_length_263280_cov_8.177872.9.concoct_part_0\t28\n+NODE_260_length_165083_cov_8.801846.0.concoct_part_0\t28\n+NODE_260_length_165083_cov_8.801846.1.concoct_part_0\t28\n+NODE_260_length_165083_cov_8.801846.10.concoct_part_0\t28\n+NODE_260_length_165083_cov_8.801846.11.concoct_part_0\t28\n+NODE_260_length_165083_cov_8.801846.12.concoct_part_0\t28\n+NODE_260_length_165083_cov_8.801846.13.concoct_part_0\t28\n+NODE_260_length_165083_cov_8.801846.14.concoct_part_0\t28\n+NODE_260_length_165083_cov_8.801846.15.concoct_part_0\t28\n+NODE_260_length_165083_cov_8.801846.15.concoct_part_1\t28\n+NODE_260_length_165083_cov_8.801846.2.concoct_part_0\t28\n+NODE_260_length_165083_cov_8.801846.3.concoct_part_0\t28\n+NODE_260_length_165083_cov_8.801846.4.concoct_part_0\t28\n+NODE_260_length_165083_cov_8.801846.5.concoct_part_0\t28\n+NODE_260_length_165083_cov_8.801846.6.concoct_part_0\t28\n+NODE_260_length_165083_cov_8.801846.7.concoct_part_0\t28\n+NODE_260_length_165083_cov_8.801846.8.concoct_part_0\t28\n+NODE_260_length_165083_cov_8.801846.9.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.0.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.1.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.10.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.11.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.12.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.13.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.14.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.15.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.16.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.17.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.18.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.19.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.2.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.20.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.21.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.22.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.23.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.24.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.25.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.26.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.27.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.28.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.29.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.3.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.30.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.31.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.31.concoct_part_1\t21\n+NODE_261_length_321461_cov_8.199894.4.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.5.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.6.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.7.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.8.concoct_part_0\t28\n+NODE_261_length_321461_cov_8.199894.9.concoct_part_0\t28\n+NODE_267_length_4676_cov_7.631737.concoct_part_0\t3\n+NODE_26_length_3431_cov_15.138152.concoct_part_0\t4\n+NODE_27_length_35477_cov_8.181526.0.concoct_part_0\t28\n+NODE_27_length_35477_cov_8.181526.1.concoct_part_0\t28\n+NODE_27_length_35477_cov_8.181526.2.concoct_part_0\t28\n+NODE_27_length_35477_cov_8.181526.2.concoct_part_1\t28\n+NODE_28_length_34835_cov_8.108799.0.concoct_part_0\t28\n+NODE_28_length_34835_cov_8.108799.1.concoct_part_0\t28\n+NODE_28_length_34835_cov_8.108799.2.concoct_part_0\t28\n+NODE_28_length_34835_cov_8.108799.2.concoct_part_1\t6\n+NODE_290_length_1962_cov_6.746177.concoct_part_0\t1\n+NODE_29_length_44540_cov_9.429951.0.concoct_part_0\t28\n+NODE_29_length_44540_cov_9.429951.1.concoct_part_0\t28\n+NODE_29_length_44540_cov_9.429951.2.concoct_part_0\t28\n+NODE_29_length_44540_cov_9.429951.3.concoct_part_0\t28\n+NODE_29_length_44540_cov_9.429951.3.concoct_part_1\t3\n+NODE_2_length_16156_cov_8.219856.concoct_part_0\t28\n+NODE_2_length_16156_cov_8.219856.concoct_part_1\t28\n'
b
diff -r 06c0eb033025 -r 031f84cb2fd3 test-data/output_coverage_table.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/output_coverage_table.tabular Sun Mar 13 08:45:05 2022 +0000
b
b'@@ -0,0 +1,447 @@\n+contig\tlength\tcov_mean_sample_422\n+NODE_100_length_1535_cov_6.691205\t1605\t0\n+NODE_101_length_153_cov_4.235294\t223\t0\n+NODE_103_length_20202_cov_8.395357.0\t10000\t0\n+NODE_103_length_20202_cov_8.395357.1.0\t10000\t0\n+NODE_103_length_20202_cov_8.395357.1.1\t272\t0\n+NODE_104_length_823_cov_8.356014\t893\t0\n+NODE_105_length_260_cov_4.142308\t330\t0\n+NODE_106_length_2172_cov_16.183702\t2242\t0\n+NODE_107_length_7609_cov_8.569195\t7679\t0\n+NODE_108_length_1232_cov_16.167208\t1302\t0\n+NODE_109_length_178_cov_16.084270\t248\t0\n+NODE_10_length_186_cov_4.327957\t256\t0\n+NODE_111_length_80116_cov_8.871636.0\t10000\t0\n+NODE_111_length_80116_cov_8.871636.1\t10000\t0\n+NODE_111_length_80116_cov_8.871636.2\t10000\t0\n+NODE_111_length_80116_cov_8.871636.3\t10000\t0\n+NODE_111_length_80116_cov_8.871636.4\t10000\t0\n+NODE_111_length_80116_cov_8.871636.5\t10000\t0\n+NODE_111_length_80116_cov_8.871636.6\t10000\t0\n+NODE_111_length_80116_cov_8.871636.7.0\t10000\t0\n+NODE_111_length_80116_cov_8.871636.7.1\t186\t0\n+NODE_112_length_846_cov_18.049644\t916\t0\n+NODE_113_length_286_cov_12.695805\t356\t0\n+NODE_114_length_4896_cov_18.356821\t4966\t0\n+NODE_115_length_78252_cov_8.512166.0\t10000\t0\n+NODE_115_length_78252_cov_8.512166.1\t10000\t0\n+NODE_115_length_78252_cov_8.512166.2\t10000\t0\n+NODE_115_length_78252_cov_8.512166.3\t10000\t0\n+NODE_115_length_78252_cov_8.512166.4\t10000\t0\n+NODE_115_length_78252_cov_8.512166.5\t10000\t0\n+NODE_115_length_78252_cov_8.512166.6.0\t10000\t0\n+NODE_115_length_78252_cov_8.512166.6.1\t8322\t0\n+NODE_116_length_203_cov_4.093596\t273\t0\n+NODE_117_length_248_cov_25.778225\t318\t0\n+NODE_118_length_15438_cov_8.266615.0\t10000\t0\n+NODE_118_length_15438_cov_8.266615.1\t5508\t0\n+NODE_119_length_83_cov_11.493976\t153\t0\n+NODE_11_length_153_cov_12.470589\t223\t0\n+NODE_121_length_60582_cov_8.522333.0\t10000\t0\n+NODE_121_length_60582_cov_8.522333.1\t10000\t0\n+NODE_121_length_60582_cov_8.522333.2\t10000\t0\n+NODE_121_length_60582_cov_8.522333.3\t10000\t0\n+NODE_121_length_60582_cov_8.522333.4\t10000\t0\n+NODE_121_length_60582_cov_8.522333.5.0\t10000\t0\n+NODE_121_length_60582_cov_8.522333.5.1\t652\t0\n+NODE_123_length_75191_cov_8.369140.0\t10000\t0\n+NODE_123_length_75191_cov_8.369140.1\t10000\t0\n+NODE_123_length_75191_cov_8.369140.2\t10000\t0\n+NODE_123_length_75191_cov_8.369140.3\t10000\t0\n+NODE_123_length_75191_cov_8.369140.4\t10000\t0\n+NODE_123_length_75191_cov_8.369140.5\t10000\t0\n+NODE_123_length_75191_cov_8.369140.6.0\t10000\t0\n+NODE_123_length_75191_cov_8.369140.6.1\t5261\t0\n+NODE_124_length_407_cov_4.159705\t477\t0\n+NODE_128_length_532_cov_17.454887\t602\t0\n+NODE_129_length_160323_cov_8.254436.0\t10000\t0\n+NODE_129_length_160323_cov_8.254436.1\t10000\t0\n+NODE_129_length_160323_cov_8.254436.10\t10000\t0\n+NODE_129_length_160323_cov_8.254436.11\t10000\t0\n+NODE_129_length_160323_cov_8.254436.12\t10000\t0\n+NODE_129_length_160323_cov_8.254436.13\t10000\t0\n+NODE_129_length_160323_cov_8.254436.14\t10000\t0\n+NODE_129_length_160323_cov_8.254436.15.0\t10000\t0\n+NODE_129_length_160323_cov_8.254436.15.1\t393\t0\n+NODE_129_length_160323_cov_8.254436.2\t10000\t0\n+NODE_129_length_160323_cov_8.254436.3\t10000\t0\n+NODE_129_length_160323_cov_8.254436.4\t10000\t0\n+NODE_129_length_160323_cov_8.254436.5\t10000\t0\n+NODE_129_length_160323_cov_8.254436.6\t10000\t0\n+NODE_129_length_160323_cov_8.254436.7\t10000\t0\n+NODE_129_length_160323_cov_8.254436.8\t10000\t0\n+NODE_129_length_160323_cov_8.254436.9\t10000\t0\n+NODE_12_length_555_cov_14.255856\t625\t0\n+NODE_130_length_3461_cov_7.763941\t3531\t0\n+NODE_131_length_92242_cov_8.320277.0\t10000\t0\n+NODE_131_length_92242_cov_8.320277.1\t10000\t0\n+NODE_131_length_92242_cov_8.320277.2\t10000\t0\n+NODE_131_length_92242_cov_8.320277.3\t10000\t0\n+NODE_131_length_92242_cov_8.320277.4\t10000\t0\n+NODE_131_length_92242_cov_8.320277.5\t10000\t0\n+NODE_131_length_92242_cov_8.320277.6\t10000\t0\n+NODE_131_length_92242_cov_8.320277.7\t10000\t0\n+NODE_131_length_92242_cov_8.320277.8.0\t10000\t0\n+NODE_131_length_92242_cov_8.320277.8.1\t2312\t0\n+NODE_132_length_71_cov_36.070423\t141\t0\n+NODE_133_length_543_cov_15.108656\t613\t0\n+NODE_134_length_519_cov_18.038536\t589\t0\n+NODE_136_length_245_'..b'\n+NODE_259_length_266_cov_4.357143\t336\t0\n+NODE_25_length_286_cov_24.356644\t356\t0\n+NODE_260_length_165083_cov_8.801846.0\t10000\t0\n+NODE_260_length_165083_cov_8.801846.1\t10000\t0\n+NODE_260_length_165083_cov_8.801846.10\t10000\t0\n+NODE_260_length_165083_cov_8.801846.11\t10000\t0\n+NODE_260_length_165083_cov_8.801846.12\t10000\t0\n+NODE_260_length_165083_cov_8.801846.13\t10000\t0\n+NODE_260_length_165083_cov_8.801846.14\t10000\t0\n+NODE_260_length_165083_cov_8.801846.15.0\t10000\t0\n+NODE_260_length_165083_cov_8.801846.15.1\t5153\t0\n+NODE_260_length_165083_cov_8.801846.2\t10000\t0\n+NODE_260_length_165083_cov_8.801846.3\t10000\t0\n+NODE_260_length_165083_cov_8.801846.4\t10000\t0\n+NODE_260_length_165083_cov_8.801846.5\t10000\t0\n+NODE_260_length_165083_cov_8.801846.6\t10000\t0\n+NODE_260_length_165083_cov_8.801846.7\t10000\t0\n+NODE_260_length_165083_cov_8.801846.8\t10000\t0\n+NODE_260_length_165083_cov_8.801846.9\t10000\t0\n+NODE_261_length_321461_cov_8.199894.0\t10000\t0\n+NODE_261_length_321461_cov_8.199894.1\t10000\t0\n+NODE_261_length_321461_cov_8.199894.10\t10000\t0\n+NODE_261_length_321461_cov_8.199894.11\t10000\t0\n+NODE_261_length_321461_cov_8.199894.12\t10000\t0\n+NODE_261_length_321461_cov_8.199894.13\t10000\t0\n+NODE_261_length_321461_cov_8.199894.14\t10000\t0\n+NODE_261_length_321461_cov_8.199894.15\t10000\t0\n+NODE_261_length_321461_cov_8.199894.16\t10000\t0\n+NODE_261_length_321461_cov_8.199894.17\t10000\t0\n+NODE_261_length_321461_cov_8.199894.18\t10000\t0\n+NODE_261_length_321461_cov_8.199894.19\t10000\t0\n+NODE_261_length_321461_cov_8.199894.2\t10000\t0\n+NODE_261_length_321461_cov_8.199894.20\t10000\t0\n+NODE_261_length_321461_cov_8.199894.21\t10000\t0\n+NODE_261_length_321461_cov_8.199894.22\t10000\t0\n+NODE_261_length_321461_cov_8.199894.23\t10000\t0\n+NODE_261_length_321461_cov_8.199894.24\t10000\t0\n+NODE_261_length_321461_cov_8.199894.25\t10000\t0\n+NODE_261_length_321461_cov_8.199894.26\t10000\t0\n+NODE_261_length_321461_cov_8.199894.27\t10000\t0\n+NODE_261_length_321461_cov_8.199894.28\t10000\t0\n+NODE_261_length_321461_cov_8.199894.29\t10000\t0\n+NODE_261_length_321461_cov_8.199894.3\t10000\t0\n+NODE_261_length_321461_cov_8.199894.30\t10000\t0\n+NODE_261_length_321461_cov_8.199894.31.0\t10000\t0\n+NODE_261_length_321461_cov_8.199894.31.1\t1531\t0\n+NODE_261_length_321461_cov_8.199894.4\t10000\t0\n+NODE_261_length_321461_cov_8.199894.5\t10000\t0\n+NODE_261_length_321461_cov_8.199894.6\t10000\t0\n+NODE_261_length_321461_cov_8.199894.7\t10000\t0\n+NODE_261_length_321461_cov_8.199894.8\t10000\t0\n+NODE_261_length_321461_cov_8.199894.9\t10000\t0\n+NODE_262_length_112_cov_9.366072\t182\t0\n+NODE_264_length_143_cov_21.937063\t213\t0\n+NODE_265_length_543_cov_4.924494\t613\t0\n+NODE_266_length_205_cov_15.878049\t275\t0\n+NODE_267_length_4676_cov_7.631737\t4746\t0\n+NODE_269_length_849_cov_6.312132\t919\t0\n+NODE_26_length_3431_cov_15.138152\t3501\t0\n+NODE_270_length_151_cov_4.258278\t221\t0\n+NODE_271_length_164_cov_15.048780\t234\t0\n+NODE_272_length_154_cov_14.188312\t224\t0\n+NODE_274_length_173_cov_11.838150\t243\t0\n+NODE_275_length_149_cov_4.000000\t219\t0\n+NODE_277_length_146_cov_4.280822\t216\t0\n+NODE_27_length_35477_cov_8.181526.0\t10000\t0\n+NODE_27_length_35477_cov_8.181526.1\t10000\t0\n+NODE_27_length_35477_cov_8.181526.2.0\t10000\t0\n+NODE_27_length_35477_cov_8.181526.2.1\t5547\t0\n+NODE_283_length_165_cov_4.200000\t235\t0\n+NODE_284_length_148_cov_4.236486\t218\t0\n+NODE_285_length_433_cov_5.106236\t503\t0\n+NODE_288_length_174_cov_4.316092\t244\t0\n+NODE_28_length_34835_cov_8.108799.0\t10000\t0\n+NODE_28_length_34835_cov_8.108799.1\t10000\t0\n+NODE_28_length_34835_cov_8.108799.2.0\t10000\t0\n+NODE_28_length_34835_cov_8.108799.2.1\t4905\t0\n+NODE_290_length_1962_cov_6.746177\t2032\t0\n+NODE_293_length_832_cov_6.325721\t902\t0\n+NODE_294_length_210_cov_4.066667\t280\t0\n+NODE_295_length_196_cov_4.397959\t266\t0\n+NODE_29_length_44540_cov_9.429951.0\t10000\t0\n+NODE_29_length_44540_cov_9.429951.1\t10000\t0\n+NODE_29_length_44540_cov_9.429951.2\t10000\t0\n+NODE_29_length_44540_cov_9.429951.3.0\t10000\t0\n+NODE_29_length_44540_cov_9.429951.3.1\t4610\t0\n+NODE_2_length_16156_cov_8.219856.0\t10000\t0\n+NODE_2_length_16156_cov_8.219856.1\t6226\t0\n'
b
diff -r 06c0eb033025 -r 031f84cb2fd3 test-data/output_merge_clusters.tabular
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/output_merge_clusters.tabular Sun Mar 13 08:45:05 2022 +0000
b
b'@@ -0,0 +1,306 @@\n+contig_id\tcluster_id\n+NODE_100_length_1535_cov_6.691205\t14\n+NODE_103_length_20202_cov_8.395357.0\t28\n+NODE_103_length_20202_cov_8.395357.1\t26\n+NODE_106_length_2172_cov_16.183702\t2\n+NODE_107_length_7609_cov_8.569195\t0\n+NODE_108_length_1232_cov_16.167208\t2\n+NODE_111_length_80116_cov_8.871636.0\t28\n+NODE_111_length_80116_cov_8.871636.1\t28\n+NODE_111_length_80116_cov_8.871636.2\t28\n+NODE_111_length_80116_cov_8.871636.3\t28\n+NODE_111_length_80116_cov_8.871636.4\t28\n+NODE_111_length_80116_cov_8.871636.5\t28\n+NODE_111_length_80116_cov_8.871636.6\t28\n+NODE_111_length_80116_cov_8.871636.7\t28\n+NODE_114_length_4896_cov_18.356821\t10\n+NODE_115_length_78252_cov_8.512166.0\t28\n+NODE_115_length_78252_cov_8.512166.1\t28\n+NODE_115_length_78252_cov_8.512166.2\t28\n+NODE_115_length_78252_cov_8.512166.3\t28\n+NODE_115_length_78252_cov_8.512166.4\t28\n+NODE_115_length_78252_cov_8.512166.5\t28\n+NODE_115_length_78252_cov_8.512166.6\t28\n+NODE_118_length_15438_cov_8.266615\t28\n+NODE_121_length_60582_cov_8.522333.0\t28\n+NODE_121_length_60582_cov_8.522333.1\t28\n+NODE_121_length_60582_cov_8.522333.2\t28\n+NODE_121_length_60582_cov_8.522333.3\t28\n+NODE_121_length_60582_cov_8.522333.4\t28\n+NODE_121_length_60582_cov_8.522333.5\t28\n+NODE_123_length_75191_cov_8.369140.0\t28\n+NODE_123_length_75191_cov_8.369140.1\t28\n+NODE_123_length_75191_cov_8.369140.2\t28\n+NODE_123_length_75191_cov_8.369140.3\t28\n+NODE_123_length_75191_cov_8.369140.4\t28\n+NODE_123_length_75191_cov_8.369140.5\t28\n+NODE_123_length_75191_cov_8.369140.6\t28\n+NODE_129_length_160323_cov_8.254436.0\t28\n+NODE_129_length_160323_cov_8.254436.1\t28\n+NODE_129_length_160323_cov_8.254436.10\t28\n+NODE_129_length_160323_cov_8.254436.11\t28\n+NODE_129_length_160323_cov_8.254436.12\t28\n+NODE_129_length_160323_cov_8.254436.13\t28\n+NODE_129_length_160323_cov_8.254436.14\t28\n+NODE_129_length_160323_cov_8.254436.15\t28\n+NODE_129_length_160323_cov_8.254436.2\t28\n+NODE_129_length_160323_cov_8.254436.3\t28\n+NODE_129_length_160323_cov_8.254436.4\t28\n+NODE_129_length_160323_cov_8.254436.5\t28\n+NODE_129_length_160323_cov_8.254436.6\t28\n+NODE_129_length_160323_cov_8.254436.7\t28\n+NODE_129_length_160323_cov_8.254436.8\t28\n+NODE_129_length_160323_cov_8.254436.9\t28\n+NODE_130_length_3461_cov_7.763941\t9\n+NODE_131_length_92242_cov_8.320277.0\t28\n+NODE_131_length_92242_cov_8.320277.1\t28\n+NODE_131_length_92242_cov_8.320277.2\t28\n+NODE_131_length_92242_cov_8.320277.3\t28\n+NODE_131_length_92242_cov_8.320277.4\t28\n+NODE_131_length_92242_cov_8.320277.5\t28\n+NODE_131_length_92242_cov_8.320277.6\t28\n+NODE_131_length_92242_cov_8.320277.7\t28\n+NODE_131_length_92242_cov_8.320277.8\t28\n+NODE_13_length_6591_cov_8.574723\t9\n+NODE_151_length_29715_cov_8.256470.0\t28\n+NODE_151_length_29715_cov_8.256470.1\t28\n+NODE_157_length_58632_cov_8.156433.0\t28\n+NODE_157_length_58632_cov_8.156433.1\t28\n+NODE_157_length_58632_cov_8.156433.2\t28\n+NODE_157_length_58632_cov_8.156433.3\t28\n+NODE_157_length_58632_cov_8.156433.4\t28\n+NODE_15_length_3555_cov_8.369058\t9\n+NODE_173_length_51809_cov_8.202050.0\t28\n+NODE_173_length_51809_cov_8.202050.1\t28\n+NODE_173_length_51809_cov_8.202050.2\t28\n+NODE_173_length_51809_cov_8.202050.3\t38\n+NODE_173_length_51809_cov_8.202050.4\t28\n+NODE_179_length_197611_cov_8.217700.0\t28\n+NODE_179_length_197611_cov_8.217700.1\t28\n+NODE_179_length_197611_cov_8.217700.10\t28\n+NODE_179_length_197611_cov_8.217700.11\t28\n+NODE_179_length_197611_cov_8.217700.12\t28\n+NODE_179_length_197611_cov_8.217700.13\t28\n+NODE_179_length_197611_cov_8.217700.14\t28\n+NODE_179_length_197611_cov_8.217700.15\t28\n+NODE_179_length_197611_cov_8.217700.16\t28\n+NODE_179_length_197611_cov_8.217700.17\t28\n+NODE_179_length_197611_cov_8.217700.18\t28\n+NODE_179_length_197611_cov_8.217700.2\t28\n+NODE_179_length_197611_cov_8.217700.3\t12\n+NODE_179_length_197611_cov_8.217700.4\t28\n+NODE_179_length_197611_cov_8.217700.5\t28\n+NODE_179_length_197611_cov_8.217700.6\t28\n+NODE_179_length_197611_cov_8.217700.7\t28\n+NODE_179_length_197611_cov_8.217700.8\t28\n+NODE_179_length_197611_cov_8.217700.9\t28\n+NODE_188_length_948_cov_28.155064\t34\n+NODE_1'..b'398.3\t28\n+NODE_254_length_191233_cov_8.270398.4\t28\n+NODE_254_length_191233_cov_8.270398.5\t28\n+NODE_254_length_191233_cov_8.270398.6\t28\n+NODE_254_length_191233_cov_8.270398.7\t28\n+NODE_254_length_191233_cov_8.270398.8\t28\n+NODE_254_length_191233_cov_8.270398.9\t28\n+NODE_257_length_6277_cov_8.895651\t28\n+NODE_258_length_263280_cov_8.177872.0\t28\n+NODE_258_length_263280_cov_8.177872.1\t28\n+NODE_258_length_263280_cov_8.177872.10\t28\n+NODE_258_length_263280_cov_8.177872.11\t28\n+NODE_258_length_263280_cov_8.177872.12\t37\n+NODE_258_length_263280_cov_8.177872.13\t28\n+NODE_258_length_263280_cov_8.177872.14\t28\n+NODE_258_length_263280_cov_8.177872.15\t28\n+NODE_258_length_263280_cov_8.177872.16\t28\n+NODE_258_length_263280_cov_8.177872.17\t28\n+NODE_258_length_263280_cov_8.177872.18\t28\n+NODE_258_length_263280_cov_8.177872.19\t28\n+NODE_258_length_263280_cov_8.177872.2\t28\n+NODE_258_length_263280_cov_8.177872.20\t28\n+NODE_258_length_263280_cov_8.177872.21\t28\n+NODE_258_length_263280_cov_8.177872.22\t28\n+NODE_258_length_263280_cov_8.177872.23\t28\n+NODE_258_length_263280_cov_8.177872.24\t28\n+NODE_258_length_263280_cov_8.177872.25\t28\n+NODE_258_length_263280_cov_8.177872.3\t28\n+NODE_258_length_263280_cov_8.177872.4\t28\n+NODE_258_length_263280_cov_8.177872.5\t28\n+NODE_258_length_263280_cov_8.177872.6\t28\n+NODE_258_length_263280_cov_8.177872.7\t28\n+NODE_258_length_263280_cov_8.177872.8\t28\n+NODE_258_length_263280_cov_8.177872.9\t28\n+NODE_260_length_165083_cov_8.801846.0\t28\n+NODE_260_length_165083_cov_8.801846.1\t28\n+NODE_260_length_165083_cov_8.801846.10\t28\n+NODE_260_length_165083_cov_8.801846.11\t28\n+NODE_260_length_165083_cov_8.801846.12\t28\n+NODE_260_length_165083_cov_8.801846.13\t28\n+NODE_260_length_165083_cov_8.801846.14\t28\n+NODE_260_length_165083_cov_8.801846.15\t28\n+NODE_260_length_165083_cov_8.801846.2\t28\n+NODE_260_length_165083_cov_8.801846.3\t28\n+NODE_260_length_165083_cov_8.801846.4\t28\n+NODE_260_length_165083_cov_8.801846.5\t28\n+NODE_260_length_165083_cov_8.801846.6\t28\n+NODE_260_length_165083_cov_8.801846.7\t28\n+NODE_260_length_165083_cov_8.801846.8\t28\n+NODE_260_length_165083_cov_8.801846.9\t28\n+NODE_261_length_321461_cov_8.199894.0\t28\n+NODE_261_length_321461_cov_8.199894.1\t28\n+NODE_261_length_321461_cov_8.199894.10\t28\n+NODE_261_length_321461_cov_8.199894.11\t28\n+NODE_261_length_321461_cov_8.199894.12\t28\n+NODE_261_length_321461_cov_8.199894.13\t28\n+NODE_261_length_321461_cov_8.199894.14\t28\n+NODE_261_length_321461_cov_8.199894.15\t28\n+NODE_261_length_321461_cov_8.199894.16\t28\n+NODE_261_length_321461_cov_8.199894.17\t28\n+NODE_261_length_321461_cov_8.199894.18\t28\n+NODE_261_length_321461_cov_8.199894.19\t28\n+NODE_261_length_321461_cov_8.199894.2\t28\n+NODE_261_length_321461_cov_8.199894.20\t28\n+NODE_261_length_321461_cov_8.199894.21\t28\n+NODE_261_length_321461_cov_8.199894.22\t28\n+NODE_261_length_321461_cov_8.199894.23\t28\n+NODE_261_length_321461_cov_8.199894.24\t28\n+NODE_261_length_321461_cov_8.199894.25\t28\n+NODE_261_length_321461_cov_8.199894.26\t28\n+NODE_261_length_321461_cov_8.199894.27\t28\n+NODE_261_length_321461_cov_8.199894.28\t28\n+NODE_261_length_321461_cov_8.199894.29\t28\n+NODE_261_length_321461_cov_8.199894.3\t28\n+NODE_261_length_321461_cov_8.199894.30\t28\n+NODE_261_length_321461_cov_8.199894.31\t28\n+NODE_261_length_321461_cov_8.199894.4\t28\n+NODE_261_length_321461_cov_8.199894.5\t28\n+NODE_261_length_321461_cov_8.199894.6\t28\n+NODE_261_length_321461_cov_8.199894.7\t28\n+NODE_261_length_321461_cov_8.199894.8\t28\n+NODE_261_length_321461_cov_8.199894.9\t28\n+NODE_267_length_4676_cov_7.631737\t3\n+NODE_26_length_3431_cov_15.138152\t4\n+NODE_27_length_35477_cov_8.181526.0\t28\n+NODE_27_length_35477_cov_8.181526.1\t28\n+NODE_27_length_35477_cov_8.181526.2\t28\n+NODE_28_length_34835_cov_8.108799.0\t28\n+NODE_28_length_34835_cov_8.108799.1\t28\n+NODE_28_length_34835_cov_8.108799.2\t28\n+NODE_290_length_1962_cov_6.746177\t1\n+NODE_29_length_44540_cov_9.429951.0\t28\n+NODE_29_length_44540_cov_9.429951.1\t28\n+NODE_29_length_44540_cov_9.429951.2\t28\n+NODE_29_length_44540_cov_9.429951.3\t28\n+NODE_2_length_16156_cov_8.219856\t28\n'