changeset 3:76d4cbefff85 draft

"planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/purge_dups commit 5d56aa02b0f905507e1d98a2d74f0629b7591cd3"
author iuc
date Mon, 14 Jun 2021 18:01:05 +0000
parents 17b378303f2d
children a315c25dc813
files hist_plot.py purge_dups.xml test-data/hist.png test-data/hist_options.png test-data/out_hist_options.cov test-data/out_hist_options.wig test-data/pbcstats.tabular test-data/pbcstats2.tabular test-data/pbcstats_hist_options.tabular test-data/tx_stats.tabular
diffstat 10 files changed, 3448 insertions(+), 61 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hist_plot.py	Mon Jun 14 18:01:05 2021 +0000
@@ -0,0 +1,129 @@
+#!/usr/bin/env python3
+# read depth histogram plot
+
+# imported from https://github.com/dfguan/purge_dups/blob/master/scripts/hist_plot.py
+
+import argparse
+
+import matplotlib as mpl
+import matplotlib.pyplot as plt
+
+mpl.use("Agg")
+
+
+def col_hist(stat_fn, delim):
+    hists = []
+    # we consider the coverage histogram start with 0
+    with open(stat_fn) as f:
+        for ln in f:
+            lnlist = ln.strip().split(delim)
+            hists.append(int(lnlist[1]))
+    return hists
+
+
+def get_cutoffs(con):
+    if con:
+        lnlst = []
+        with open(con) as f:
+            lnlst = f.readline().strip().split("\t")
+        if len(lnlst):
+            return [int(lnlst[0]), int(lnlst[3]), int(lnlst[5])]
+        else:
+            return []
+    else:
+        return []
+
+
+def mk_plot(hists, cutoffs, ttle, xm, xM, ym, yM, out_fl):
+
+    if ttle is None:
+        ttle = "read depth histogram"
+    if xm is None:
+        xm = 0
+    if xM is None:
+        xM = len(hists) - 2  # ignore the last read depth count
+    if ym is None:
+        ym = 0
+    if yM is None:
+        yM = 1.2 * max(hists)
+    x = [t for t in range(xm, xM)]
+    plt.axis([xm, xM, ym, yM])
+    width = 8
+    height = 6
+    plt.figure(num=None, figsize=(width, height))
+    plt.plot(x, hists[xm:xM], label="l", color="blue")  #
+    plt.xticks([z for z in range(xm, xM, 10)], fontsize=3)
+    # cutoffs
+    colors = ["r", "g", "c"]
+    if len(cutoffs):
+        for i in range(len(cutoffs)):
+            plt.text(cutoffs[i], 0, str(cutoffs[i]), fontsize=5, color=colors[i])
+            plt.axvline(x=cutoffs[i], linewidth=1, color=colors[i])
+
+    plt.title(ttle)
+    plt.gca().xaxis.grid(True, color="black", alpha=0.2)
+
+    # plt.grid(True, color="black", alpha=0.2)
+    # plt.gca().get_legend().remove()
+
+    plt.tight_layout()
+    plt.savefig(out_fl, dpi=300)
+
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser(description="read depth histogram plot")
+
+    parser.add_argument(
+        "-c",
+        "--cutoffs",
+        type=str,
+        action="store",
+        dest="con",
+        help="read depth cutoffs",
+    )
+    parser.add_argument(
+        "-y", "--ymin", type=int, action="store", dest="ymin", help="set ymin"
+    )
+    parser.add_argument(
+        "-x", "--xmin", type=int, action="store", dest="xmin", help="set xmin"
+    )
+    parser.add_argument(
+        "-Y", "--ymax", type=int, action="store", dest="ymax", help="set ymax"
+    )
+    parser.add_argument(
+        "-X", "--xmax", type=int, action="store", dest="xmax", help="set xmax"
+    )
+    parser.add_argument(
+        "-t",
+        "--title",
+        type=str,
+        action="store",
+        dest="title",
+        help="figure title [NULL]",
+        default="",
+    )
+    parser.add_argument(
+        "-d",
+        "--delim",
+        type=str,
+        action="store",
+        dest="delim",
+        help="delimiter",
+        default="\t",
+    )
+    parser.add_argument("-v", "--version", action="version", version="hist_plot 0.0.0")
+    parser.add_argument("stat_fn", type=str, action="store", help="stat file")
+    parser.add_argument("out_fn", type=str, action="store", help="output file")
+    opts = parser.parse_args()
+    hists = col_hist(opts.stat_fn, opts.delim)
+    cutoffs = get_cutoffs(opts.con)
+    mk_plot(
+        hists,
+        cutoffs,
+        opts.title,
+        opts.xmin,
+        opts.xmax,
+        opts.ymin,
+        opts.ymax,
+        opts.out_fn,
+    )
--- a/purge_dups.xml	Tue Apr 27 20:48:51 2021 +0000
+++ b/purge_dups.xml	Mon Jun 14 18:01:05 2021 +0000
@@ -2,13 +2,72 @@
     <description>and haplotigs in an assembly based on read depth (purge_dups)</description>
     <macros>
         <token name="@TOOL_VERSION@">1.2.5</token>
-        <token name="@VERSION_SUFFIX@">2</token>
+        <token name="@VERSION_SUFFIX@">3</token>
+        <xml name="trimmers">
+            <section name="section_hist" title="Histogram plot options" >
+                <!--<param name="cutoffs_his" type="data" optional="true" format="txt" label="Read depth cutoffs file" />-->
+                <param argument="--ymin" type="integer" optional="true" min="0" label="Specify a minimum for the Y axis"/>
+                <param argument="--ymax" type="integer" optional="true" label="Specify a maximum for the Y axis"/>
+                <param argument="--xmin" type="integer" optional="true" min="0" label="Specify a minimum for the X axis"/>
+                <param argument="--xmax" type="integer" optional="true" label="Specify a maximum for the X axis"/>
+                <param argument="--title" type="text" value="Read depth histogram plot" label="Histogram title"/>
+            </section>
+        </xml>
+        <token name="@HIST_PLOT@"><![CDATA[
+            python '$__tool_directory__/hist_plot.py' 
+            --cutoffs cutoffs.tsv
+            #if $function_select.section_hist.ymin
+                --ymin $function_select.section_hist.ymin
+            #end if
+            #if $function_select.section_hist.ymax
+                --ymax $function_select.section_hist.ymax
+            #end if
+            #if $function_select.section_hist.xmin
+                --xmin $function_select.section_hist.xmin
+            #end if
+            #if $function_select.section_hist.xmax
+                --xmax $function_select.section_hist.xmax
+            #end if
+            #if $function_select.section_hist.title
+                --title '${function_select.section_hist.title}'
+            #end if
+            depth.stat hist.png
+        ]]></token>
+        <token name="@CALCUTS@"><![CDATA[
+            calcuts
+            #if $function_select.section_calcuts.min_depth:
+                -f $function_select.section_calcuts.min_depth
+            #end if
+            #if $function_select.section_calcuts.low_depth:
+                -l $function_select.section_calcuts.low_depth
+            #end if
+            #if $function_select.section_calcuts.transition:
+                -m $function_select.section_calcuts.transition
+            #end if
+            #if $function_select.section_calcuts.upper_depth:
+                -u $function_select.section_calcuts.upper_depth
+            #end if
+            $function_select.section_calcuts.ploidy
+        ]]></token>
+        <xml name="calcuts">
+            <section name="section_calcuts" title="Calcuts options">
+                <param name="min_depth" type="float" label="Minimum depth count fraction to maximum depth coun" min="0" max="1" argument="-f" optional="true" help="Default = 0.1"/>
+                <param name="low_depth" label="Lower bound for read depth" type="integer" argument="-l" optional="true"/>
+                <param name="transition" label="Transition between haploid and diploid" type="integer" argument="-m" optional="true"/>
+                <param name="upper_depth" label="Upper bound for read depth" type="integer" argument="-u" optional="true"/>
+                <param name="ploidy" argument="-d" type="select" label="Ploidy">
+                    <option value="-d 0" selected="true">Diploid [0]</option>
+                    <option value="-d 1">Haploid [1]</option>
+                </param>
+            </section>
+        </xml>
     </macros>
     <requirements>
         <requirement type="package" version="@TOOL_VERSION@">purge_dups</requirement>
+        <requirement type="package" version="3.4.2">matplotlib-base</requirement>
     </requirements>
     <command detect_errors="exit_code"><![CDATA[
-        #if $function_select.functions == "purge_dups":
+        #if $function_select.functions == 'purge_dups':
             #for $i, $file in enumerate($function_select.input):
                 #if $file.is_of_type("paf"):
                     gzip -c '${file}' > '${i}.gz' &&
@@ -18,10 +77,10 @@
             #end for
             purge_dups
             #if $function_select.coverage:
-                -c '$function_select.coverage'
+                -c '${function_select.coverage}'
             #end if
             #if $function_select.cutoffs:
-                -T '$function_select.cutoffs'
+                -T '${function_select.cutoffs}'
             #end if
             #if $function_select.min_bad:
                 -f $function_select.min_bad
@@ -38,7 +97,7 @@
             #if $function_select.max_gap:
                 -M $function_select.max_gap
             #end if
-            #if $function_select.double_chain.chaining_rounds == "two":
+            #if $function_select.double_chain.chaining_rounds == 'two':
                 -2
                 #if $function_select.double_chain.max_gap_2:
                     -G $function_select.double_chain.max_gap_2
@@ -54,15 +113,15 @@
                 '${i}.gz'
             #end for
             > dups.bed 2> purge_dups.log
-        #else if $function_select.functions == "split_fa":
+        #else if $function_select.functions == 'split_fa':
             split_fa
             #if $function_select.split:
                 -n $function_select.split
             #end if
-            '$function_select.input' > split.fasta
-        #else if $function_select.functions == "pbcstat":
+            '${function_select.input}' > split.fasta
+        #else if $function_select.functions == 'pbcstat':
             #for $i, $file in enumerate($function_select.input):
-                #if $file.is_of_type("paf"):
+                #if $file.is_of_type('paf'):
                     gzip -c '${file}' > '${i}.gz' &&
                 #else
                     ln -s '${file}' '${i}.gz' &&
@@ -82,10 +141,15 @@
                 -l $function_select.flank
             #end if
             $function_select.primary_alignments
+ 
             #for $i, $file in enumerate($function_select.input):
                 '${i}.gz'
-            #end for 
-        #else if $function_select.functions == "ngscstat":
+            #end for
+            && mv PB.stat depth.stat
+            && @CALCUTS@ depth.stat > cutoffs.tsv 2>calcuts.log
+            && @HIST_PLOT@
+
+        #else if $function_select.functions == 'ngscstat':
             ngscstat
             #if $function_select.min_align_qual:
                 -q $function_select.min_align_qual
@@ -96,24 +160,15 @@
             #if $function_select.max_insert:
                 -L $function_select.max_insert
             #end if
-            '$function_select.input'
-        #else if $function_select.functions == "calcuts":
-            calcuts
-            #if $function_select.min_depth:
-                -f $function_select.min_depth
-            #end if
-            #if $function_select.low_depth:
-                -l $function_select.low_depth
-            #end if
-            #if $function_select.transition:
-                -m $function_select.transition
-            #end if
-            #if $function_select.upper_depth:
-                -u $function_select.upper_depth
-            #end if
-            $function_select.ploidy
-            '$function_select.input' > cutoffs.tsv 2>calcuts.log
-        #else if $function_select.functions == "get_seqs":
+            '${function_select.input}'
+            && mv TX.stat depth.stat
+            && @CALCUTS@ depth.stat > cutoffs.tsv 2>calcuts.log
+            && @HIST_PLOT@ 
+
+        #else if $function_select.functions == 'calcuts':
+            @CALCUTS@ '${function_select.input}' > cutoffs.tsv 2>calcuts.log
+
+        #else if $function_select.functions == 'get_seqs':
             get_seqs
             $function_select.coverage
             $function_select.haplotigs
@@ -128,18 +183,18 @@
             #if $function_select.min_gap:
                 -g $function_select.min_gap
             #end if
-            '$function_select.bed_input' '$function_select.fasta_input'
+            '${function_select.bed_input}' '${function_select.fasta_input}'
         #end if
     ]]></command>
     <inputs>
         <conditional name="function_select">
             <param type="select" name="functions" label="Select the purge_dups function">
-                <option value="purge_dups">purge haplotigs and overlaps for an assembly</option>
-                <option value="split_fa">split FASTA file by 'N's</option>
-                <option value="pbcstat">create read depth histogram and base-level read depth for pacbio data</option>
-                <option value="ngscstat">create read depth histogram and base-level read detph for illumina data</option>
-                <option value="calcuts">calculate coverage cutoffs</option>
-                <option value="get_seqs">obtain seqeuences after purging</option>
+                <option value="purge_dups">Purge haplotigs and overlaps for an assembly (purge_dups)</option>
+                <option value="split_fa">Split FASTA file by 'N's (split_fa)</option>
+                <option value="pbcstat">Calculate coverage cutoff and create read depth histogram and base-levelread depth for PacBio data (calcuts+pbcstats)</option>
+                <option value="ngscstat">Calculate coverage cutoff and create read depth histogram and base-level read detph for Illumina data (calcuts+ngscstat)</option>
+                <option value="calcuts">calculate coverage cutoffs (calcuts)</option>
+                <option value="get_seqs">Obtain seqeuences after purging (get_seqs)</option>
             </param>
             <when value="purge_dups">
                 <param name="input" type="data" format="paf,paf.gz" multiple="true" label="PAF input file"/>
@@ -174,6 +229,8 @@
                 <param name="min_map_qual" type="integer"  argument="-q" optional="true" label="Minimum mapping quality"/>
                 <param name="flank" type="integer" argument="-l" optional="true" label="Flanking space" />
                 <param name="primary_alignments" argument="-p" type="boolean" truevalue="-p" falsevalue="" checked="true" label="Use only primary alignments" />
+                <expand macro="calcuts" />
+                <expand macro="trimmers"/>
             </when>
             <when value="ngscstat">
                 <param name="input" type="data" format="bam" label="BAM input file"/>
@@ -181,18 +238,15 @@
                 <!-- Param exists in help text, but isn't actually part of the code. Maybe in the next release? -->
                 <!-- <param name="max_depth" type="integer" label="Maximum read depth" argument="-M" optional="true"/> -->
                 <param name="max_insert" type="integer"  argument="-L" optional="true" label="Maximum insert size"/>
+                <expand macro="calcuts" />
+                <expand macro="trimmers"/>
             </when>
+
             <when value="calcuts">
                 <param name="input" type="data" format="tabular" label="STAT input file"/>
-                <param name="min_depth" type="float" label="Minimum depth count fraction to maximum depth coun" min="0" max="1" argument="-f" optional="true" help="Default = 0.1"/>
-                <param name="low_depth" label="Lower bound for read depth" type="integer" argument="-l" optional="true"/>
-                <param name="transition" label="Transition between haploid and diploid" type="integer" argument="-m" optional="true"/>
-                <param name="upper_depth" label="Upper bound for read depth" type="integer" argument="-u" optional="true"/>
-                <param name="ploidy" argument="-d" type="select" label="Ploidy">
-                    <option value="-d 0" selected="true">Diploid [0]</option>
-                    <option value="-d 1">Haploid [1]</option>
-                </param>
+                <expand macro="calcuts" />
             </when>
+
             <when value="get_seqs">
                 <param name="fasta_input" type="data" format="fasta" label="Fasta input file"/>
                 <param name="bed_input" type="data" format="bed" label="Bed input file"/>
@@ -222,8 +276,8 @@
         <data name="ngscstat_cov" format="tabular" from_work_dir="TX.base.cov" label="${tool.name} on ${on_string}: ngscstat base coverage file">
             <filter>function_select['functions'] == 'ngscstat'</filter>
         </data>
-        <data name="ngscstat_stat" format="tabular" from_work_dir="TX.stat"  label="${tool.name} on ${on_string}: ngscstat stat file">
-            <filter>function_select['functions'] == 'ngscstat'</filter>
+        <data name="stat_file" format="tabular" from_work_dir="depth.stat"  label="${tool.name} on ${on_string}: stat file">
+            <filter>function_select['functions'] == 'ngscstat' or function_select['functions'] == 'pbcstat'</filter>
         </data>
         <!-- Pbcstat -->
         <data name="pbcstat_cov" format="tabular" from_work_dir="PB.base.cov"  label="${tool.name} on ${on_string}: pbcstat base coverage file">
@@ -232,15 +286,17 @@
         <data name="pbcstat_wig" format="wig" from_work_dir="PB.cov.wig" label="${tool.name} on ${on_string}: pbcstat base wig file">
             <filter>function_select['functions'] == 'pbcstat'</filter>
         </data>
-        <data name="pbcstat_stat" format="tabular" from_work_dir="PB.stat" label="${tool.name} on ${on_string}: stat file">
-            <filter>function_select['functions'] == 'pbcstat'</filter>
+
+        <data name="hist" format="png" from_work_dir="hist.png" label="${tool.name} on ${on_string}: histogram plot">
+            <filter>function_select['functions'] == 'pbcstat' or function_select['functions'] == 'ngscstat'</filter>
         </data>
+
         <!-- Calcuts -->
         <data name="calcuts_log" format="txt" from_work_dir="calcuts.log" label="${tool.name} on ${on_string}: calcuts log file">
-            <filter>function_select['functions'] == 'calcuts'</filter>
+            <filter>function_select['functions'] in ('pbcstat', 'ngscstat', 'calcuts')</filter>
         </data>
         <data name="calcuts_tab" format="tabular" from_work_dir="cutoffs.tsv" label="${tool.name} on ${on_string}: calcuts cutoff file">
-            <filter>function_select['functions'] == 'calcuts'</filter>
+            <filter>function_select['functions'] in ('pbcstat', 'ngscstat', 'calcuts')</filter>
         </data>
         <!-- Purge dups -->
         <data name="purge_dups_log" format="txt" from_work_dir="purge_dups.log" label="${tool.name} on ${on_string}: purge_dups log file">
@@ -311,7 +367,7 @@
             <output name="split_fasta" value="split_out.fasta"/>
         </test>
         <!-- pbcstat -->
-        <test expect_num_outputs="3">
+        <test expect_num_outputs="6">
             <conditional name="function_select">
                 <param name="functions" value="pbcstat"/>
                 <param name="input" value="test.paf"/>
@@ -320,12 +376,22 @@
                 <param name="min_map_qual" value="1"/>
                 <param name="flank" value="1"/>
                 <param name="primary_alignments" value="-p"/>
+                <section name="section_calcuts">
+                    <param name="min_depth" value="0.01"/>
+                    <param name="low_depth" value="1"/>
+                    <param name="transition" value="1"/>
+                    <param name="upper_depth" value="100"/>
+                    <param name="ploidy" value="-d 0"/>
+                </section>
             </conditional>
+            <output name="calcuts_tab" value="calcuts_out.tsv"/>
             <output name="pbcstat_cov" value="out.cov"/>
             <output name="pbcstat_wig" value="out.wig"/>
+            <output name="stat_file" value="pbcstats.tabular"/>
+            <output name="hist" value="hist.png" ftype="png" compare="sim_size"/>
         </test>
         <!-- pbcstat gzip -->
-        <test expect_num_outputs="3">
+        <test expect_num_outputs="6">
             <conditional name="function_select">
                 <param name="functions" value="pbcstat"/>
                 <param name="input" value="test.paf.gz" ftype="paf.gz"/>
@@ -334,39 +400,68 @@
                 <param name="min_map_qual" value="1"/>
                 <param name="flank" value="1"/>
                 <param name="primary_alignments" value="-p"/>
+                <section name="section_calcuts">
+                    <param name="min_depth" value="0.01"/>
+                    <param name="low_depth" value="1"/>
+                    <param name="transition" value="1"/>
+                    <param name="upper_depth" value="100"/>
+                    <param name="ploidy" value="-d 0"/>
+                </section>
             </conditional>
+            <output name="calcuts_tab" value="calcuts_out.tsv"/>
             <output name="pbcstat_cov" value="out.cov"/>
             <output name="pbcstat_wig" value="out.wig"/>
         </test>
-                <!-- Pbcstat multiple input -->
-        <test expect_num_outputs="3">
+        <!-- Pbcstat multiple input -->
+        <test expect_num_outputs="6">
             <conditional name="function_select">
                 <param name="functions" value="pbcstat"/>
                 <param name="input" value="test.paf,test2.paf.gz"/>
+                <section name="section_calcuts">
+                    <param name="min_depth" value="0.01"/>
+                    <param name="low_depth" value="1"/>
+                    <param name="transition" value="1"/>
+                    <param name="upper_depth" value="100"/>
+                    <param name="ploidy" value="-d 0"/>
+                </section>
             </conditional>
+            <output name="calcuts_tab" value="calcuts_out.tsv"/>
             <output name="pbcstat_cov" value="out2.cov"/>
-            <output name="pbcstat_wig" value="out2.wig"/>        
+            <output name="stat_file" value="pbcstats2.tabular"/>
+            <output name="pbcstat_wig" value="out2.wig"/>
         </test>
         <!-- ngscstat -->
-        <test expect_num_outputs="2">
+        <test expect_num_outputs="5">
             <conditional name="function_select">
                 <param name="functions" value="ngscstat"/>
                 <param name="input" value="test.bam"/>
                 <param name="min_align_qual" value="10"/>
                 <param name="max_insert" value="100"/>
+                <section name="section_calcuts">
+                    <param name="min_depth" value="0.01"/>
+                    <param name="low_depth" value="1"/>
+                    <param name="transition" value="1"/>
+                    <param name="upper_depth" value="100"/>
+                    <param name="ploidy" value="-d 0"/>
+                </section>
             </conditional>
+            <output name="calcuts_tab" value="calcuts_out.tsv"/>
             <output name="ngscstat_cov" value="ngsc_out.cov"/>
+            <output name="stat_file" value="tx_stats.tabular"/> 
+            <output name="hist" value="hist.png" ftype="png" compare="sim_size"/>
         </test>
         <!-- Calcuts -->
         <test expect_num_outputs="2">
             <conditional name="function_select">
                 <param name="functions" value="calcuts"/>
                 <param name="input" value="test.stat"/>
-                <param name="min_depth" value="0.01"/>
-                <param name="low_depth" value="1"/>
-                <param name="transition" value="1"/>
-                <param name="upper_depth" value="100"/>
-                <param name="ploidy" value="-d 0"/>
+                <section name="section_calcuts">
+                    <param name="min_depth" value="0.01"/>
+                    <param name="low_depth" value="1"/>
+                    <param name="transition" value="1"/>
+                    <param name="upper_depth" value="100"/>
+                    <param name="ploidy" value="-d 0"/>
+                </section>
             </conditional>
             <output name="calcuts_tab" value="calcuts_out.tsv"/>
         </test>
@@ -386,6 +481,35 @@
             </conditional>
             <output name="get_seqs_purged" value="purged_out.fa"/>
         </test>
+        <!-- pbcstat histogram options-->
+        <test expect_num_outputs="6">
+            <conditional name="function_select">
+                <param name="functions" value="pbcstat"/>
+                <param name="input" value="test.paf"/>
+                <param name="max_cov" value="1000"/>
+                <param name="min_map_ratio" value="0.01"/>
+                <param name="min_map_qual" value="1"/>
+                <param name="flank" value="1"/>
+                <param name="primary_alignments" value="-p"/>
+                <section name="section_calcuts">
+                    <param name="min_depth" value="0.01"/>
+                    <param name="low_depth" value="1"/>
+                    <param name="transition" value="1"/>
+                    <param name="upper_depth" value="100"/>
+                    <param name="ploidy" value="-d 0"/>
+                </section>
+                <section name="section_hist">
+                    <param name="ymax" value="100"/>
+                    <param name="xmax" value="100"/>
+                    <param name="cutoffs_his" value="calcuts_out.tsv"/>
+                </section>
+            </conditional>
+            <output name="calcuts_tab" value="calcuts_out.tsv"/>
+            <output name="pbcstat_cov" value="out_hist_options.cov"/>
+            <output name="pbcstat_wig" value="out_hist_options.wig"/>
+            <output name="stat_file" value="pbcstats_hist_options.tabular"/>
+            <output name="hist" value="hist_options.png" ftype="png" compare="sim_size"/>
+        </test>
     </tests>
     <help><![CDATA[
         .. class:: infomark
Binary file test-data/hist.png has changed
Binary file test-data/hist_options.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/out_hist_options.cov	Mon Jun 14 18:01:05 2021 +0000
@@ -0,0 +1,14 @@
+>gi|528476637:29857558-29915771	58214
+1	29093	0
+29094	29356	2
+29357	33376	0
+33377	41951	1
+41952	58214	0
+>gi|157734152:29655295-29712160	56866
+1	29214	0
+29215	29477	1
+29478	33498	0
+33499	42073	1
+42074	48471	0
+48472	56865	1
+56866	56866	0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/out_hist_options.wig	Mon Jun 14 18:01:05 2021 +0000
@@ -0,0 +1,116 @@
+track type="wiggle_0" name="PB"
+fixedStep chrom=gi|528476637:29857558-29915771 start=1 step=1024 span=1024
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+1
+1
+1
+1
+1
+1
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+variableStep chrom=gi|528476637:29857558-29915771 span=1894
+56321 0
+fixedStep chrom=gi|157734152:29655295-29712160 start=1 step=1024 span=1024
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+0
+1
+1
+1
+1
+1
+1
+1
+1
+0
+0
+0
+0
+0
+0
+0
+1
+1
+1
+1
+1
+1
+variableStep chrom=gi|157734152:29655295-29712160 span=1570
+55297 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/pbcstats.tabular	Mon Jun 14 18:01:05 2021 +0000
@@ -0,0 +1,1001 @@
+0	89010
+1	25807
+2	263
+3	0
+4	0
+5	0
+6	0
+7	0
+8	0
+9	0
+10	0
+11	0
+12	0
+13	0
+14	0
+15	0
+16	0
+17	0
+18	0
+19	0
+20	0
+21	0
+22	0
+23	0
+24	0
+25	0
+26	0
+27	0
+28	0
+29	0
+30	0
+31	0
+32	0
+33	0
+34	0
+35	0
+36	0
+37	0
+38	0
+39	0
+40	0
+41	0
+42	0
+43	0
+44	0
+45	0
+46	0
+47	0
+48	0
+49	0
+50	0
+51	0
+52	0
+53	0
+54	0
+55	0
+56	0
+57	0
+58	0
+59	0
+60	0
+61	0
+62	0
+63	0
+64	0
+65	0
+66	0
+67	0
+68	0
+69	0
+70	0
+71	0
+72	0
+73	0
+74	0
+75	0
+76	0
+77	0
+78	0
+79	0
+80	0
+81	0
+82	0
+83	0
+84	0
+85	0
+86	0
+87	0
+88	0
+89	0
+90	0
+91	0
+92	0
+93	0
+94	0
+95	0
+96	0
+97	0
+98	0
+99	0
+100	0
+101	0
+102	0
+103	0
+104	0
+105	0
+106	0
+107	0
+108	0
+109	0
+110	0
+111	0
+112	0
+113	0
+114	0
+115	0
+116	0
+117	0
+118	0
+119	0
+120	0
+121	0
+122	0
+123	0
+124	0
+125	0
+126	0
+127	0
+128	0
+129	0
+130	0
+131	0
+132	0
+133	0
+134	0
+135	0
+136	0
+137	0
+138	0
+139	0
+140	0
+141	0
+142	0
+143	0
+144	0
+145	0
+146	0
+147	0
+148	0
+149	0
+150	0
+151	0
+152	0
+153	0
+154	0
+155	0
+156	0
+157	0
+158	0
+159	0
+160	0
+161	0
+162	0
+163	0
+164	0
+165	0
+166	0
+167	0
+168	0
+169	0
+170	0
+171	0
+172	0
+173	0
+174	0
+175	0
+176	0
+177	0
+178	0
+179	0
+180	0
+181	0
+182	0
+183	0
+184	0
+185	0
+186	0
+187	0
+188	0
+189	0
+190	0
+191	0
+192	0
+193	0
+194	0
+195	0
+196	0
+197	0
+198	0
+199	0
+200	0
+201	0
+202	0
+203	0
+204	0
+205	0
+206	0
+207	0
+208	0
+209	0
+210	0
+211	0
+212	0
+213	0
+214	0
+215	0
+216	0
+217	0
+218	0
+219	0
+220	0
+221	0
+222	0
+223	0
+224	0
+225	0
+226	0
+227	0
+228	0
+229	0
+230	0
+231	0
+232	0
+233	0
+234	0
+235	0
+236	0
+237	0
+238	0
+239	0
+240	0
+241	0
+242	0
+243	0
+244	0
+245	0
+246	0
+247	0
+248	0
+249	0
+250	0
+251	0
+252	0
+253	0
+254	0
+255	0
+256	0
+257	0
+258	0
+259	0
+260	0
+261	0
+262	0
+263	0
+264	0
+265	0
+266	0
+267	0
+268	0
+269	0
+270	0
+271	0
+272	0
+273	0
+274	0
+275	0
+276	0
+277	0
+278	0
+279	0
+280	0
+281	0
+282	0
+283	0
+284	0
+285	0
+286	0
+287	0
+288	0
+289	0
+290	0
+291	0
+292	0
+293	0
+294	0
+295	0
+296	0
+297	0
+298	0
+299	0
+300	0
+301	0
+302	0
+303	0
+304	0
+305	0
+306	0
+307	0
+308	0
+309	0
+310	0
+311	0
+312	0
+313	0
+314	0
+315	0
+316	0
+317	0
+318	0
+319	0
+320	0
+321	0
+322	0
+323	0
+324	0
+325	0
+326	0
+327	0
+328	0
+329	0
+330	0
+331	0
+332	0
+333	0
+334	0
+335	0
+336	0
+337	0
+338	0
+339	0
+340	0
+341	0
+342	0
+343	0
+344	0
+345	0
+346	0
+347	0
+348	0
+349	0
+350	0
+351	0
+352	0
+353	0
+354	0
+355	0
+356	0
+357	0
+358	0
+359	0
+360	0
+361	0
+362	0
+363	0
+364	0
+365	0
+366	0
+367	0
+368	0
+369	0
+370	0
+371	0
+372	0
+373	0
+374	0
+375	0
+376	0
+377	0
+378	0
+379	0
+380	0
+381	0
+382	0
+383	0
+384	0
+385	0
+386	0
+387	0
+388	0
+389	0
+390	0
+391	0
+392	0
+393	0
+394	0
+395	0
+396	0
+397	0
+398	0
+399	0
+400	0
+401	0
+402	0
+403	0
+404	0
+405	0
+406	0
+407	0
+408	0
+409	0
+410	0
+411	0
+412	0
+413	0
+414	0
+415	0
+416	0
+417	0
+418	0
+419	0
+420	0
+421	0
+422	0
+423	0
+424	0
+425	0
+426	0
+427	0
+428	0
+429	0
+430	0
+431	0
+432	0
+433	0
+434	0
+435	0
+436	0
+437	0
+438	0
+439	0
+440	0
+441	0
+442	0
+443	0
+444	0
+445	0
+446	0
+447	0
+448	0
+449	0
+450	0
+451	0
+452	0
+453	0
+454	0
+455	0
+456	0
+457	0
+458	0
+459	0
+460	0
+461	0
+462	0
+463	0
+464	0
+465	0
+466	0
+467	0
+468	0
+469	0
+470	0
+471	0
+472	0
+473	0
+474	0
+475	0
+476	0
+477	0
+478	0
+479	0
+480	0
+481	0
+482	0
+483	0
+484	0
+485	0
+486	0
+487	0
+488	0
+489	0
+490	0
+491	0
+492	0
+493	0
+494	0
+495	0
+496	0
+497	0
+498	0
+499	0
+500	0
+501	0
+502	0
+503	0
+504	0
+505	0
+506	0
+507	0
+508	0
+509	0
+510	0
+511	0
+512	0
+513	0
+514	0
+515	0
+516	0
+517	0
+518	0
+519	0
+520	0
+521	0
+522	0
+523	0
+524	0
+525	0
+526	0
+527	0
+528	0
+529	0
+530	0
+531	0
+532	0
+533	0
+534	0
+535	0
+536	0
+537	0
+538	0
+539	0
+540	0
+541	0
+542	0
+543	0
+544	0
+545	0
+546	0
+547	0
+548	0
+549	0
+550	0
+551	0
+552	0
+553	0
+554	0
+555	0
+556	0
+557	0
+558	0
+559	0
+560	0
+561	0
+562	0
+563	0
+564	0
+565	0
+566	0
+567	0
+568	0
+569	0
+570	0
+571	0
+572	0
+573	0
+574	0
+575	0
+576	0
+577	0
+578	0
+579	0
+580	0
+581	0
+582	0
+583	0
+584	0
+585	0
+586	0
+587	0
+588	0
+589	0
+590	0
+591	0
+592	0
+593	0
+594	0
+595	0
+596	0
+597	0
+598	0
+599	0
+600	0
+601	0
+602	0
+603	0
+604	0
+605	0
+606	0
+607	0
+608	0
+609	0
+610	0
+611	0
+612	0
+613	0
+614	0
+615	0
+616	0
+617	0
+618	0
+619	0
+620	0
+621	0
+622	0
+623	0
+624	0
+625	0
+626	0
+627	0
+628	0
+629	0
+630	0
+631	0
+632	0
+633	0
+634	0
+635	0
+636	0
+637	0
+638	0
+639	0
+640	0
+641	0
+642	0
+643	0
+644	0
+645	0
+646	0
+647	0
+648	0
+649	0
+650	0
+651	0
+652	0
+653	0
+654	0
+655	0
+656	0
+657	0
+658	0
+659	0
+660	0
+661	0
+662	0
+663	0
+664	0
+665	0
+666	0
+667	0
+668	0
+669	0
+670	0
+671	0
+672	0
+673	0
+674	0
+675	0
+676	0
+677	0
+678	0
+679	0
+680	0
+681	0
+682	0
+683	0
+684	0
+685	0
+686	0
+687	0
+688	0
+689	0
+690	0
+691	0
+692	0
+693	0
+694	0
+695	0
+696	0
+697	0
+698	0
+699	0
+700	0
+701	0
+702	0
+703	0
+704	0
+705	0
+706	0
+707	0
+708	0
+709	0
+710	0
+711	0
+712	0
+713	0
+714	0
+715	0
+716	0
+717	0
+718	0
+719	0
+720	0
+721	0
+722	0
+723	0
+724	0
+725	0
+726	0
+727	0
+728	0
+729	0
+730	0
+731	0
+732	0
+733	0
+734	0
+735	0
+736	0
+737	0
+738	0
+739	0
+740	0
+741	0
+742	0
+743	0
+744	0
+745	0
+746	0
+747	0
+748	0
+749	0
+750	0
+751	0
+752	0
+753	0
+754	0
+755	0
+756	0
+757	0
+758	0
+759	0
+760	0
+761	0
+762	0
+763	0
+764	0
+765	0
+766	0
+767	0
+768	0
+769	0
+770	0
+771	0
+772	0
+773	0
+774	0
+775	0
+776	0
+777	0
+778	0
+779	0
+780	0
+781	0
+782	0
+783	0
+784	0
+785	0
+786	0
+787	0
+788	0
+789	0
+790	0
+791	0
+792	0
+793	0
+794	0
+795	0
+796	0
+797	0
+798	0
+799	0
+800	0
+801	0
+802	0
+803	0
+804	0
+805	0
+806	0
+807	0
+808	0
+809	0
+810	0
+811	0
+812	0
+813	0
+814	0
+815	0
+816	0
+817	0
+818	0
+819	0
+820	0
+821	0
+822	0
+823	0
+824	0
+825	0
+826	0
+827	0
+828	0
+829	0
+830	0
+831	0
+832	0
+833	0
+834	0
+835	0
+836	0
+837	0
+838	0
+839	0
+840	0
+841	0
+842	0
+843	0
+844	0
+845	0
+846	0
+847	0
+848	0
+849	0
+850	0
+851	0
+852	0
+853	0
+854	0
+855	0
+856	0
+857	0
+858	0
+859	0
+860	0
+861	0
+862	0
+863	0
+864	0
+865	0
+866	0
+867	0
+868	0
+869	0
+870	0
+871	0
+872	0
+873	0
+874	0
+875	0
+876	0
+877	0
+878	0
+879	0
+880	0
+881	0
+882	0
+883	0
+884	0
+885	0
+886	0
+887	0
+888	0
+889	0
+890	0
+891	0
+892	0
+893	0
+894	0
+895	0
+896	0
+897	0
+898	0
+899	0
+900	0
+901	0
+902	0
+903	0
+904	0
+905	0
+906	0
+907	0
+908	0
+909	0
+910	0
+911	0
+912	0
+913	0
+914	0
+915	0
+916	0
+917	0
+918	0
+919	0
+920	0
+921	0
+922	0
+923	0
+924	0
+925	0
+926	0
+927	0
+928	0
+929	0
+930	0
+931	0
+932	0
+933	0
+934	0
+935	0
+936	0
+937	0
+938	0
+939	0
+940	0
+941	0
+942	0
+943	0
+944	0
+945	0
+946	0
+947	0
+948	0
+949	0
+950	0
+951	0
+952	0
+953	0
+954	0
+955	0
+956	0
+957	0
+958	0
+959	0
+960	0
+961	0
+962	0
+963	0
+964	0
+965	0
+966	0
+967	0
+968	0
+969	0
+970	0
+971	0
+972	0
+973	0
+974	0
+975	0
+976	0
+977	0
+978	0
+979	0
+980	0
+981	0
+982	0
+983	0
+984	0
+985	0
+986	0
+987	0
+988	0
+989	0
+990	0
+991	0
+992	0
+993	0
+994	0
+995	0
+996	0
+997	0
+998	0
+999	0
+1000	0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/pbcstats2.tabular	Mon Jun 14 18:01:05 2021 +0000
@@ -0,0 +1,501 @@
+0	89000
+1	25815
+2	265
+3	0
+4	0
+5	0
+6	0
+7	0
+8	0
+9	0
+10	0
+11	0
+12	0
+13	0
+14	0
+15	0
+16	0
+17	0
+18	0
+19	0
+20	0
+21	0
+22	0
+23	0
+24	0
+25	0
+26	0
+27	0
+28	0
+29	0
+30	0
+31	0
+32	0
+33	0
+34	0
+35	0
+36	0
+37	0
+38	0
+39	0
+40	0
+41	0
+42	0
+43	0
+44	0
+45	0
+46	0
+47	0
+48	0
+49	0
+50	0
+51	0
+52	0
+53	0
+54	0
+55	0
+56	0
+57	0
+58	0
+59	0
+60	0
+61	0
+62	0
+63	0
+64	0
+65	0
+66	0
+67	0
+68	0
+69	0
+70	0
+71	0
+72	0
+73	0
+74	0
+75	0
+76	0
+77	0
+78	0
+79	0
+80	0
+81	0
+82	0
+83	0
+84	0
+85	0
+86	0
+87	0
+88	0
+89	0
+90	0
+91	0
+92	0
+93	0
+94	0
+95	0
+96	0
+97	0
+98	0
+99	0
+100	0
+101	0
+102	0
+103	0
+104	0
+105	0
+106	0
+107	0
+108	0
+109	0
+110	0
+111	0
+112	0
+113	0
+114	0
+115	0
+116	0
+117	0
+118	0
+119	0
+120	0
+121	0
+122	0
+123	0
+124	0
+125	0
+126	0
+127	0
+128	0
+129	0
+130	0
+131	0
+132	0
+133	0
+134	0
+135	0
+136	0
+137	0
+138	0
+139	0
+140	0
+141	0
+142	0
+143	0
+144	0
+145	0
+146	0
+147	0
+148	0
+149	0
+150	0
+151	0
+152	0
+153	0
+154	0
+155	0
+156	0
+157	0
+158	0
+159	0
+160	0
+161	0
+162	0
+163	0
+164	0
+165	0
+166	0
+167	0
+168	0
+169	0
+170	0
+171	0
+172	0
+173	0
+174	0
+175	0
+176	0
+177	0
+178	0
+179	0
+180	0
+181	0
+182	0
+183	0
+184	0
+185	0
+186	0
+187	0
+188	0
+189	0
+190	0
+191	0
+192	0
+193	0
+194	0
+195	0
+196	0
+197	0
+198	0
+199	0
+200	0
+201	0
+202	0
+203	0
+204	0
+205	0
+206	0
+207	0
+208	0
+209	0
+210	0
+211	0
+212	0
+213	0
+214	0
+215	0
+216	0
+217	0
+218	0
+219	0
+220	0
+221	0
+222	0
+223	0
+224	0
+225	0
+226	0
+227	0
+228	0
+229	0
+230	0
+231	0
+232	0
+233	0
+234	0
+235	0
+236	0
+237	0
+238	0
+239	0
+240	0
+241	0
+242	0
+243	0
+244	0
+245	0
+246	0
+247	0
+248	0
+249	0
+250	0
+251	0
+252	0
+253	0
+254	0
+255	0
+256	0
+257	0
+258	0
+259	0
+260	0
+261	0
+262	0
+263	0
+264	0
+265	0
+266	0
+267	0
+268	0
+269	0
+270	0
+271	0
+272	0
+273	0
+274	0
+275	0
+276	0
+277	0
+278	0
+279	0
+280	0
+281	0
+282	0
+283	0
+284	0
+285	0
+286	0
+287	0
+288	0
+289	0
+290	0
+291	0
+292	0
+293	0
+294	0
+295	0
+296	0
+297	0
+298	0
+299	0
+300	0
+301	0
+302	0
+303	0
+304	0
+305	0
+306	0
+307	0
+308	0
+309	0
+310	0
+311	0
+312	0
+313	0
+314	0
+315	0
+316	0
+317	0
+318	0
+319	0
+320	0
+321	0
+322	0
+323	0
+324	0
+325	0
+326	0
+327	0
+328	0
+329	0
+330	0
+331	0
+332	0
+333	0
+334	0
+335	0
+336	0
+337	0
+338	0
+339	0
+340	0
+341	0
+342	0
+343	0
+344	0
+345	0
+346	0
+347	0
+348	0
+349	0
+350	0
+351	0
+352	0
+353	0
+354	0
+355	0
+356	0
+357	0
+358	0
+359	0
+360	0
+361	0
+362	0
+363	0
+364	0
+365	0
+366	0
+367	0
+368	0
+369	0
+370	0
+371	0
+372	0
+373	0
+374	0
+375	0
+376	0
+377	0
+378	0
+379	0
+380	0
+381	0
+382	0
+383	0
+384	0
+385	0
+386	0
+387	0
+388	0
+389	0
+390	0
+391	0
+392	0
+393	0
+394	0
+395	0
+396	0
+397	0
+398	0
+399	0
+400	0
+401	0
+402	0
+403	0
+404	0
+405	0
+406	0
+407	0
+408	0
+409	0
+410	0
+411	0
+412	0
+413	0
+414	0
+415	0
+416	0
+417	0
+418	0
+419	0
+420	0
+421	0
+422	0
+423	0
+424	0
+425	0
+426	0
+427	0
+428	0
+429	0
+430	0
+431	0
+432	0
+433	0
+434	0
+435	0
+436	0
+437	0
+438	0
+439	0
+440	0
+441	0
+442	0
+443	0
+444	0
+445	0
+446	0
+447	0
+448	0
+449	0
+450	0
+451	0
+452	0
+453	0
+454	0
+455	0
+456	0
+457	0
+458	0
+459	0
+460	0
+461	0
+462	0
+463	0
+464	0
+465	0
+466	0
+467	0
+468	0
+469	0
+470	0
+471	0
+472	0
+473	0
+474	0
+475	0
+476	0
+477	0
+478	0
+479	0
+480	0
+481	0
+482	0
+483	0
+484	0
+485	0
+486	0
+487	0
+488	0
+489	0
+490	0
+491	0
+492	0
+493	0
+494	0
+495	0
+496	0
+497	0
+498	0
+499	0
+500	0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/pbcstats_hist_options.tabular	Mon Jun 14 18:01:05 2021 +0000
@@ -0,0 +1,1001 @@
+0	89010
+1	25807
+2	263
+3	0
+4	0
+5	0
+6	0
+7	0
+8	0
+9	0
+10	0
+11	0
+12	0
+13	0
+14	0
+15	0
+16	0
+17	0
+18	0
+19	0
+20	0
+21	0
+22	0
+23	0
+24	0
+25	0
+26	0
+27	0
+28	0
+29	0
+30	0
+31	0
+32	0
+33	0
+34	0
+35	0
+36	0
+37	0
+38	0
+39	0
+40	0
+41	0
+42	0
+43	0
+44	0
+45	0
+46	0
+47	0
+48	0
+49	0
+50	0
+51	0
+52	0
+53	0
+54	0
+55	0
+56	0
+57	0
+58	0
+59	0
+60	0
+61	0
+62	0
+63	0
+64	0
+65	0
+66	0
+67	0
+68	0
+69	0
+70	0
+71	0
+72	0
+73	0
+74	0
+75	0
+76	0
+77	0
+78	0
+79	0
+80	0
+81	0
+82	0
+83	0
+84	0
+85	0
+86	0
+87	0
+88	0
+89	0
+90	0
+91	0
+92	0
+93	0
+94	0
+95	0
+96	0
+97	0
+98	0
+99	0
+100	0
+101	0
+102	0
+103	0
+104	0
+105	0
+106	0
+107	0
+108	0
+109	0
+110	0
+111	0
+112	0
+113	0
+114	0
+115	0
+116	0
+117	0
+118	0
+119	0
+120	0
+121	0
+122	0
+123	0
+124	0
+125	0
+126	0
+127	0
+128	0
+129	0
+130	0
+131	0
+132	0
+133	0
+134	0
+135	0
+136	0
+137	0
+138	0
+139	0
+140	0
+141	0
+142	0
+143	0
+144	0
+145	0
+146	0
+147	0
+148	0
+149	0
+150	0
+151	0
+152	0
+153	0
+154	0
+155	0
+156	0
+157	0
+158	0
+159	0
+160	0
+161	0
+162	0
+163	0
+164	0
+165	0
+166	0
+167	0
+168	0
+169	0
+170	0
+171	0
+172	0
+173	0
+174	0
+175	0
+176	0
+177	0
+178	0
+179	0
+180	0
+181	0
+182	0
+183	0
+184	0
+185	0
+186	0
+187	0
+188	0
+189	0
+190	0
+191	0
+192	0
+193	0
+194	0
+195	0
+196	0
+197	0
+198	0
+199	0
+200	0
+201	0
+202	0
+203	0
+204	0
+205	0
+206	0
+207	0
+208	0
+209	0
+210	0
+211	0
+212	0
+213	0
+214	0
+215	0
+216	0
+217	0
+218	0
+219	0
+220	0
+221	0
+222	0
+223	0
+224	0
+225	0
+226	0
+227	0
+228	0
+229	0
+230	0
+231	0
+232	0
+233	0
+234	0
+235	0
+236	0
+237	0
+238	0
+239	0
+240	0
+241	0
+242	0
+243	0
+244	0
+245	0
+246	0
+247	0
+248	0
+249	0
+250	0
+251	0
+252	0
+253	0
+254	0
+255	0
+256	0
+257	0
+258	0
+259	0
+260	0
+261	0
+262	0
+263	0
+264	0
+265	0
+266	0
+267	0
+268	0
+269	0
+270	0
+271	0
+272	0
+273	0
+274	0
+275	0
+276	0
+277	0
+278	0
+279	0
+280	0
+281	0
+282	0
+283	0
+284	0
+285	0
+286	0
+287	0
+288	0
+289	0
+290	0
+291	0
+292	0
+293	0
+294	0
+295	0
+296	0
+297	0
+298	0
+299	0
+300	0
+301	0
+302	0
+303	0
+304	0
+305	0
+306	0
+307	0
+308	0
+309	0
+310	0
+311	0
+312	0
+313	0
+314	0
+315	0
+316	0
+317	0
+318	0
+319	0
+320	0
+321	0
+322	0
+323	0
+324	0
+325	0
+326	0
+327	0
+328	0
+329	0
+330	0
+331	0
+332	0
+333	0
+334	0
+335	0
+336	0
+337	0
+338	0
+339	0
+340	0
+341	0
+342	0
+343	0
+344	0
+345	0
+346	0
+347	0
+348	0
+349	0
+350	0
+351	0
+352	0
+353	0
+354	0
+355	0
+356	0
+357	0
+358	0
+359	0
+360	0
+361	0
+362	0
+363	0
+364	0
+365	0
+366	0
+367	0
+368	0
+369	0
+370	0
+371	0
+372	0
+373	0
+374	0
+375	0
+376	0
+377	0
+378	0
+379	0
+380	0
+381	0
+382	0
+383	0
+384	0
+385	0
+386	0
+387	0
+388	0
+389	0
+390	0
+391	0
+392	0
+393	0
+394	0
+395	0
+396	0
+397	0
+398	0
+399	0
+400	0
+401	0
+402	0
+403	0
+404	0
+405	0
+406	0
+407	0
+408	0
+409	0
+410	0
+411	0
+412	0
+413	0
+414	0
+415	0
+416	0
+417	0
+418	0
+419	0
+420	0
+421	0
+422	0
+423	0
+424	0
+425	0
+426	0
+427	0
+428	0
+429	0
+430	0
+431	0
+432	0
+433	0
+434	0
+435	0
+436	0
+437	0
+438	0
+439	0
+440	0
+441	0
+442	0
+443	0
+444	0
+445	0
+446	0
+447	0
+448	0
+449	0
+450	0
+451	0
+452	0
+453	0
+454	0
+455	0
+456	0
+457	0
+458	0
+459	0
+460	0
+461	0
+462	0
+463	0
+464	0
+465	0
+466	0
+467	0
+468	0
+469	0
+470	0
+471	0
+472	0
+473	0
+474	0
+475	0
+476	0
+477	0
+478	0
+479	0
+480	0
+481	0
+482	0
+483	0
+484	0
+485	0
+486	0
+487	0
+488	0
+489	0
+490	0
+491	0
+492	0
+493	0
+494	0
+495	0
+496	0
+497	0
+498	0
+499	0
+500	0
+501	0
+502	0
+503	0
+504	0
+505	0
+506	0
+507	0
+508	0
+509	0
+510	0
+511	0
+512	0
+513	0
+514	0
+515	0
+516	0
+517	0
+518	0
+519	0
+520	0
+521	0
+522	0
+523	0
+524	0
+525	0
+526	0
+527	0
+528	0
+529	0
+530	0
+531	0
+532	0
+533	0
+534	0
+535	0
+536	0
+537	0
+538	0
+539	0
+540	0
+541	0
+542	0
+543	0
+544	0
+545	0
+546	0
+547	0
+548	0
+549	0
+550	0
+551	0
+552	0
+553	0
+554	0
+555	0
+556	0
+557	0
+558	0
+559	0
+560	0
+561	0
+562	0
+563	0
+564	0
+565	0
+566	0
+567	0
+568	0
+569	0
+570	0
+571	0
+572	0
+573	0
+574	0
+575	0
+576	0
+577	0
+578	0
+579	0
+580	0
+581	0
+582	0
+583	0
+584	0
+585	0
+586	0
+587	0
+588	0
+589	0
+590	0
+591	0
+592	0
+593	0
+594	0
+595	0
+596	0
+597	0
+598	0
+599	0
+600	0
+601	0
+602	0
+603	0
+604	0
+605	0
+606	0
+607	0
+608	0
+609	0
+610	0
+611	0
+612	0
+613	0
+614	0
+615	0
+616	0
+617	0
+618	0
+619	0
+620	0
+621	0
+622	0
+623	0
+624	0
+625	0
+626	0
+627	0
+628	0
+629	0
+630	0
+631	0
+632	0
+633	0
+634	0
+635	0
+636	0
+637	0
+638	0
+639	0
+640	0
+641	0
+642	0
+643	0
+644	0
+645	0
+646	0
+647	0
+648	0
+649	0
+650	0
+651	0
+652	0
+653	0
+654	0
+655	0
+656	0
+657	0
+658	0
+659	0
+660	0
+661	0
+662	0
+663	0
+664	0
+665	0
+666	0
+667	0
+668	0
+669	0
+670	0
+671	0
+672	0
+673	0
+674	0
+675	0
+676	0
+677	0
+678	0
+679	0
+680	0
+681	0
+682	0
+683	0
+684	0
+685	0
+686	0
+687	0
+688	0
+689	0
+690	0
+691	0
+692	0
+693	0
+694	0
+695	0
+696	0
+697	0
+698	0
+699	0
+700	0
+701	0
+702	0
+703	0
+704	0
+705	0
+706	0
+707	0
+708	0
+709	0
+710	0
+711	0
+712	0
+713	0
+714	0
+715	0
+716	0
+717	0
+718	0
+719	0
+720	0
+721	0
+722	0
+723	0
+724	0
+725	0
+726	0
+727	0
+728	0
+729	0
+730	0
+731	0
+732	0
+733	0
+734	0
+735	0
+736	0
+737	0
+738	0
+739	0
+740	0
+741	0
+742	0
+743	0
+744	0
+745	0
+746	0
+747	0
+748	0
+749	0
+750	0
+751	0
+752	0
+753	0
+754	0
+755	0
+756	0
+757	0
+758	0
+759	0
+760	0
+761	0
+762	0
+763	0
+764	0
+765	0
+766	0
+767	0
+768	0
+769	0
+770	0
+771	0
+772	0
+773	0
+774	0
+775	0
+776	0
+777	0
+778	0
+779	0
+780	0
+781	0
+782	0
+783	0
+784	0
+785	0
+786	0
+787	0
+788	0
+789	0
+790	0
+791	0
+792	0
+793	0
+794	0
+795	0
+796	0
+797	0
+798	0
+799	0
+800	0
+801	0
+802	0
+803	0
+804	0
+805	0
+806	0
+807	0
+808	0
+809	0
+810	0
+811	0
+812	0
+813	0
+814	0
+815	0
+816	0
+817	0
+818	0
+819	0
+820	0
+821	0
+822	0
+823	0
+824	0
+825	0
+826	0
+827	0
+828	0
+829	0
+830	0
+831	0
+832	0
+833	0
+834	0
+835	0
+836	0
+837	0
+838	0
+839	0
+840	0
+841	0
+842	0
+843	0
+844	0
+845	0
+846	0
+847	0
+848	0
+849	0
+850	0
+851	0
+852	0
+853	0
+854	0
+855	0
+856	0
+857	0
+858	0
+859	0
+860	0
+861	0
+862	0
+863	0
+864	0
+865	0
+866	0
+867	0
+868	0
+869	0
+870	0
+871	0
+872	0
+873	0
+874	0
+875	0
+876	0
+877	0
+878	0
+879	0
+880	0
+881	0
+882	0
+883	0
+884	0
+885	0
+886	0
+887	0
+888	0
+889	0
+890	0
+891	0
+892	0
+893	0
+894	0
+895	0
+896	0
+897	0
+898	0
+899	0
+900	0
+901	0
+902	0
+903	0
+904	0
+905	0
+906	0
+907	0
+908	0
+909	0
+910	0
+911	0
+912	0
+913	0
+914	0
+915	0
+916	0
+917	0
+918	0
+919	0
+920	0
+921	0
+922	0
+923	0
+924	0
+925	0
+926	0
+927	0
+928	0
+929	0
+930	0
+931	0
+932	0
+933	0
+934	0
+935	0
+936	0
+937	0
+938	0
+939	0
+940	0
+941	0
+942	0
+943	0
+944	0
+945	0
+946	0
+947	0
+948	0
+949	0
+950	0
+951	0
+952	0
+953	0
+954	0
+955	0
+956	0
+957	0
+958	0
+959	0
+960	0
+961	0
+962	0
+963	0
+964	0
+965	0
+966	0
+967	0
+968	0
+969	0
+970	0
+971	0
+972	0
+973	0
+974	0
+975	0
+976	0
+977	0
+978	0
+979	0
+980	0
+981	0
+982	0
+983	0
+984	0
+985	0
+986	0
+987	0
+988	0
+989	0
+990	0
+991	0
+992	0
+993	0
+994	0
+995	0
+996	0
+997	0
+998	0
+999	0
+1000	0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/tx_stats.tabular	Mon Jun 14 18:01:05 2021 +0000
@@ -0,0 +1,501 @@
+0	0
+1	0
+2	0
+3	0
+4	0
+5	0
+6	0
+7	0
+8	0
+9	0
+10	0
+11	0
+12	0
+13	0
+14	0
+15	0
+16	0
+17	0
+18	0
+19	0
+20	0
+21	0
+22	0
+23	0
+24	0
+25	0
+26	0
+27	0
+28	0
+29	0
+30	0
+31	0
+32	0
+33	0
+34	0
+35	0
+36	0
+37	0
+38	0
+39	0
+40	0
+41	0
+42	0
+43	0
+44	0
+45	0
+46	0
+47	0
+48	0
+49	0
+50	0
+51	0
+52	0
+53	0
+54	0
+55	0
+56	0
+57	0
+58	0
+59	0
+60	0
+61	0
+62	0
+63	0
+64	0
+65	0
+66	0
+67	0
+68	0
+69	0
+70	0
+71	0
+72	0
+73	0
+74	0
+75	0
+76	0
+77	0
+78	0
+79	0
+80	0
+81	0
+82	0
+83	0
+84	0
+85	0
+86	0
+87	0
+88	0
+89	0
+90	0
+91	0
+92	0
+93	0
+94	0
+95	0
+96	0
+97	0
+98	0
+99	0
+100	0
+101	0
+102	0
+103	0
+104	0
+105	0
+106	0
+107	0
+108	0
+109	0
+110	0
+111	0
+112	0
+113	0
+114	0
+115	0
+116	0
+117	0
+118	0
+119	0
+120	0
+121	0
+122	0
+123	0
+124	0
+125	0
+126	0
+127	0
+128	0
+129	0
+130	0
+131	0
+132	0
+133	0
+134	0
+135	0
+136	0
+137	0
+138	0
+139	0
+140	0
+141	0
+142	0
+143	0
+144	0
+145	0
+146	0
+147	0
+148	0
+149	0
+150	0
+151	0
+152	0
+153	0
+154	0
+155	0
+156	0
+157	0
+158	0
+159	0
+160	0
+161	0
+162	0
+163	0
+164	0
+165	0
+166	0
+167	0
+168	0
+169	0
+170	0
+171	0
+172	0
+173	0
+174	0
+175	0
+176	0
+177	0
+178	0
+179	0
+180	0
+181	0
+182	0
+183	0
+184	0
+185	0
+186	0
+187	0
+188	0
+189	0
+190	0
+191	0
+192	0
+193	0
+194	0
+195	0
+196	0
+197	0
+198	0
+199	0
+200	0
+201	0
+202	0
+203	0
+204	0
+205	0
+206	0
+207	0
+208	0
+209	0
+210	0
+211	0
+212	0
+213	0
+214	0
+215	0
+216	0
+217	0
+218	0
+219	0
+220	0
+221	0
+222	0
+223	0
+224	0
+225	0
+226	0
+227	0
+228	0
+229	0
+230	0
+231	0
+232	0
+233	0
+234	0
+235	0
+236	0
+237	0
+238	0
+239	0
+240	0
+241	0
+242	0
+243	0
+244	0
+245	0
+246	0
+247	0
+248	0
+249	0
+250	0
+251	0
+252	0
+253	0
+254	0
+255	0
+256	0
+257	0
+258	0
+259	0
+260	0
+261	0
+262	0
+263	0
+264	0
+265	0
+266	0
+267	0
+268	0
+269	0
+270	0
+271	0
+272	0
+273	0
+274	0
+275	0
+276	0
+277	0
+278	0
+279	0
+280	0
+281	0
+282	0
+283	0
+284	0
+285	0
+286	0
+287	0
+288	0
+289	0
+290	0
+291	0
+292	0
+293	0
+294	0
+295	0
+296	0
+297	0
+298	0
+299	0
+300	0
+301	0
+302	0
+303	0
+304	0
+305	0
+306	0
+307	0
+308	0
+309	0
+310	0
+311	0
+312	0
+313	0
+314	0
+315	0
+316	0
+317	0
+318	0
+319	0
+320	0
+321	0
+322	0
+323	0
+324	0
+325	0
+326	0
+327	0
+328	0
+329	0
+330	0
+331	0
+332	0
+333	0
+334	0
+335	0
+336	0
+337	0
+338	0
+339	0
+340	0
+341	0
+342	0
+343	0
+344	0
+345	0
+346	0
+347	0
+348	0
+349	0
+350	0
+351	0
+352	0
+353	0
+354	0
+355	0
+356	0
+357	0
+358	0
+359	0
+360	0
+361	0
+362	0
+363	0
+364	0
+365	0
+366	0
+367	0
+368	0
+369	0
+370	0
+371	0
+372	0
+373	0
+374	0
+375	0
+376	0
+377	0
+378	0
+379	0
+380	0
+381	0
+382	0
+383	0
+384	0
+385	0
+386	0
+387	0
+388	0
+389	0
+390	0
+391	0
+392	0
+393	0
+394	0
+395	0
+396	0
+397	0
+398	0
+399	0
+400	0
+401	0
+402	0
+403	0
+404	0
+405	0
+406	0
+407	0
+408	0
+409	0
+410	0
+411	0
+412	0
+413	0
+414	0
+415	0
+416	0
+417	0
+418	0
+419	0
+420	0
+421	0
+422	0
+423	0
+424	0
+425	0
+426	0
+427	0
+428	0
+429	0
+430	0
+431	0
+432	0
+433	0
+434	0
+435	0
+436	0
+437	0
+438	0
+439	0
+440	0
+441	0
+442	0
+443	0
+444	0
+445	0
+446	0
+447	0
+448	0
+449	0
+450	0
+451	0
+452	0
+453	0
+454	0
+455	0
+456	0
+457	0
+458	0
+459	0
+460	0
+461	0
+462	0
+463	0
+464	0
+465	0
+466	0
+467	0
+468	0
+469	0
+470	0
+471	0
+472	0
+473	0
+474	0
+475	0
+476	0
+477	0
+478	0
+479	0
+480	0
+481	0
+482	0
+483	0
+484	0
+485	0
+486	0
+487	0
+488	0
+489	0
+490	0
+491	0
+492	0
+493	0
+494	0
+495	0
+496	0
+497	0
+498	0
+499	0
+500	0