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

Changeset 0:1b0f96ed73f2 (2019-08-17)
Next changeset 1:dddadbbac949 (2019-08-30)
Commit message:
"planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/table_compute commit 1ee75135483d5db22c540bc043746cd986f85762"
added:
allowed_functions.xml
scripts/safety.py
scripts/table_compute.py
table_compute.xml
test-data/examples.1.tsv
test-data/examples.2.tsv
test-data/examples.3p1.tsv
test-data/examples.3p2.tsv
test-data/examples.4.tsv
test-data/examples.5.tsv
test-data/examples.6p1.tsv
test-data/examples.6p2.tsv
test-data/examples.6p3.tsv
test-data/examples.7.tsv
test-data/examples.8.tsv
test-data/mat1.trans.tsv
test-data/mat1.umi.tsv
test-data/mat2.trans.tsv
test-data/mat2.umi.tsv
test-data/small.element.custom.tsv
test-data/small.element.scalerem5.tsv
test-data/small.fs.colsum.gt10.tsv
test-data/small.fs.colsum.neq0.tsv
test-data/small.fs.elemgt2.mm2.tsv
test-data/small.fs.elemnmatch0.mm4.tsv
test-data/small.fs.medvalcol.ge2.tsv
test-data/small.fs.rowsum.gt.50.tsv
test-data/small.fulltable.tsv
test-data/small.matapp.colcust.tsv
test-data/small.matapp.rowmax.tsv
test-data/small.multiple.tsv
test-data/small.select.colsonly.tsv
test-data/small.select.rowsonly.tsv
test-data/small.select.tsv
test-data/small.tsv
b
diff -r 000000000000 -r 1b0f96ed73f2 allowed_functions.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/allowed_functions.xml Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,48 @@
+<macros>
+    <!-- These macros are the allowed functions: numpy, pandas
+         Dataframe, math, or basic operators.
+
+         This file is parsed by the python scripts to reduce
+         duplicate definitions of allowed functions -->
+    <macro name="select_vectorops" >
+        <option value="min" selected="true">Minimum</option>
+        <option value="max">Maximum</option>
+        <option value="sum">Sum</option>
+        <option value="count">Number of Non-NA Values</option>
+        <option value="nunique">Number of Unique Observations</option>
+        <option value="mean">Mean</option>
+        <option value="median">Median</option>
+        <option value="std">Standard Deviation</option>
+        <option value="sem">Standard Error of the Mean</option>
+        <option value="var">Variance</option>
+        <option value="mad">Mean absolute deviation</option>
+        <option value="product">Product</option>
+        <yield />
+    </macro>
+    <macro name="select_onevalueoperator">
+        <option value="log">Ln</option>
+        <option value="log10">Log10</option>
+        <option value="exp">Exponential</option>
+        <option value="floor">Floor</option>
+        <option value="ceil">Ceiling</option>
+        <option value="sqrt">Square root</option>
+    </macro>
+    <macro name="select_twovaluenumericoperator">
+        <option value="add">Add</option>
+        <option value="sub">Subtract</option>
+        <option value="mul">Multiply</option>
+        <option value="truediv">True Divide</option>
+        <option value="floordiv">Floor Divide</option>
+        <option value="pow">Power</option>
+        <option value="mod">Remainder</option>
+    </macro>
+    <macro name="select_twovaluebooleanops">
+        <yield />
+        <option value="lt">&#60; (Less Than)</option>
+        <option value="le">&#8804; (Less Than or Equal to)</option>
+        <option value="gt">&#62; (Greater Than)</option>
+        <option value="ge">&#8805; (Greater Than or Equal to)</option>
+        <option value="eq">&#8801; (Equal to)</option>
+        <option value="ne">&#8800; (Not Equal to)</option>
+    </macro>
+</macros>
b
diff -r 000000000000 -r 1b0f96ed73f2 scripts/safety.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/safety.py Sat Aug 17 16:25:37 2019 -0400
[
b'@@ -0,0 +1,211 @@\n+import re\n+\n+\n+class Safety():\n+    """\n+    Class to safely evaluate mathematical expression on single\n+    or table data\n+    """\n+\n+    __allowed_tokens = (\n+        \'(\', \')\', \'if\', \'else\', \'or\', \'and\', \'not\', \'in\',\n+        \'+\', \'-\', \'*\', \'/\', \'%\', \',\', \'!=\', \'==\', \'>\', \'>=\', \'<\', \'<=\',\n+        \'min\', \'max\', \'sum\',\n+    )\n+    __allowed_ref_types = {\n+        \'pd.DataFrame\': {\n+            \'abs\', \'add\', \'agg\', \'aggregate\', \'align\', \'all\', \'any\', \'append\',\n+            \'apply\', \'applymap\', \'as_matrix\', \'asfreq\', \'at\', \'axes\', \'bool\',\n+            \'clip\', \'clip_lower\', \'clip_upper\', \'columns\', \'combine\',\n+            \'compound\', \'corr\', \'count\', \'cov\', \'cummax\', \'cummin\', \'cumprod\',\n+            \'cumsum\', \'describe\', \'div\', \'divide\', \'dot\', \'drop\',\n+            \'drop_duplicates\', \'droplevel\', \'dropna\', \'duplicated\', \'empty\',\n+            \'eq\', \'equals\', \'expanding\', \'ffill\', \'fillna\', \'filter\', \'first\',\n+            \'first_valid_index\', \'floordiv\', \'ge\', \'groupby\', \'gt\', \'head\',\n+            \'iat\', \'iloc\', \'index\', \'insert\', \'interpolate\', \'isin\', \'isna\',\n+            \'isnull\', \'items\', \'iteritems\', \'iterrows\', \'itertuples\', \'ix\',\n+            \'join\', \'keys\', \'kurt\', \'kurtosis\', \'last\', \'last_valid_index\',\n+            \'le\', \'loc\', \'lookup\', \'lt\', \'mad\', \'mask\', \'max\', \'mean\',\n+            \'median\', \'melt\', \'merge\', \'min\', \'mod\', \'mode\', \'mul\', \'multiply\',\n+            \'ndim\', \'ne\', \'nlargest\', \'notna\', \'notnull\', \'nsmallest\',\n+            \'nunique\', \'pct_change\', \'pivot\', \'pivot_table\', \'pop\', \'pow\',\n+            \'prod\', \'product\', \'quantile\', \'radd\', \'rank\', \'rdiv\', \'replace\',\n+            \'resample\', \'rfloordiv\', \'rmod\', \'rmul\', \'rolling\', \'round\',\n+            \'rpow\', \'rsub\', \'rtruediv\', \'sample\', \'select\',\n+            \'sem\', \'shape\', \'shift\', \'size\', \'skew\', \'slice_shift\',\n+            \'squeeze\', \'stack\', \'std\', \'sub\', \'subtract\', \'sum\', \'swapaxes\',\n+            \'swaplevel\', \'T\', \'tail\', \'take\', \'transform\', \'transpose\',\n+            \'truediv\', \'truncate\', \'tshift\', \'unstack\', \'var\', \'where\',\n+        },\n+        \'pd.Series\': {\n+            \'abs\', \'add\', \'agg\', \'aggregate\', \'align\', \'all\', \'any\', \'append\',\n+            \'apply\', \'argsort\', \'as_matrix\', \'asfreq\', \'asof\', \'astype\', \'at\',\n+            \'at_time\', \'autocorr\', \'axes\', \'between\', \'between_time\', \'bfill\',\n+            \'bool\', \'cat\', \'clip\', \'clip_lower\', \'clip_upper\', \'combine\',\n+            \'combine_first\', \'compound\', \'corr\', \'count\', \'cov\', \'cummax\',\n+            \'cummin\', \'cumprod\', \'cumsum\', \'describe\', \'diff\', \'div\', \'divide\',\n+            \'divmod\', \'dot\', \'drop\', \'drop_duplicates\', \'droplevel\', \'dropna\',\n+            \'dt\', \'dtype\', \'dtypes\', \'duplicated\', \'empty\', \'eq\', \'equals\',\n+            \'ewm\', \'expanding\', \'factorize\', \'ffill\', \'fillna\', \'filter\',\n+            \'first\', \'first_valid_index\', \'flags\', \'floordiv\', \'ge\', \'groupby\',\n+            \'gt\', \'hasnans\', \'head\', \'iat\', \'idxmax\', \'idxmin\', \'iloc\', \'imag\',\n+            \'index\', \'interpolate\', \'is_monotonic\', \'is_monotonic_decreasing\',\n+            \'is_monotonic_increasing\', \'is_unique\', \'isin\', \'isna\', \'isnull\',\n+            \'item\', \'items\', \'iteritems\', \'ix\', \'keys\', \'kurt\', \'kurtosis\',\n+            \'last\', \'last_valid_index\', \'le\', \'loc\', \'lt\', \'mad\', \'map\',\n+            \'mask\', \'max\', \'mean\', \'median\', \'min\', \'mod\', \'mode\', \'mul\',\n+            \'multiply\', \'name\', \'ndim\', \'ne\', \'nlargest\', \'nonzero\', \'notna\',\n+            \'notnull\', \'nsmallest\', \'nunique\', \'pct_change\', \'pop\', \'pow\',\n+            \'prod\', \'product\', \'ptp\', \'quantile\', \'radd\', \'rank\', \'rdiv\',\n+            \'rdivmod\', \'real\', \'repeat\', \'replace\', \'resample\', \'rfloordiv\',\n+            \'rmod\', \'rmul\', \'rolling\', \'round\', \'rpow\', \'rsub\', \'rtruediv\',\n+            \'sample\', \'searchsorted\', \'select\', \'sem\', \'shape\', \'shift\',\n+            \'size\', \'skew\', \'slice_shift\', \'sort_index\', \'sort_values\',\n+            \'squeeze\', \'std\', \'sub\', \'subtract\', \'sum\', \'swapaxes\',\n+            \'swaplevel\', \'T\', \'tail\', \'take\', \'transfo'..b'         if ref_type is None or ref_type not in self.__allowed_ref_types:\n+                self.allowed_qualified[\'_this\'] = set()\n+            else:\n+                self.allowed_qualified[\n+                    \'_this\'\n+                ] = self.__allowed_ref_types[ref_type]\n+        if custom_qualified is not None:\n+            self.allowed_qualified.update(custom_qualified)\n+        self.expr = expression\n+        self.__assertSafe()\n+\n+    def generateFunction(self):\n+        "Generates a function to be evaluated outside the class"\n+        cust_fun = "def fun(%s):\\n\\treturn(%s)" % (self.these[0], self.expr)\n+        return cust_fun\n+\n+    def __assertSafe(self):\n+        indeed, problematic_token = self.__isSafeStatement()\n+        if not indeed:\n+            self.detailedExcuse(problematic_token)\n+            raise ValueError("Custom Expression is not safe.")\n+\n+    @staticmethod\n+    def detailedExcuse(word):\n+        "Gives a verbose statement for why users should not use some specific operators."\n+        mess = None\n+        if word == "for":\n+            mess = "for loops and comprehensions are not allowed. Use numpy or pandas table operations instead."\n+        elif word == ":":\n+            mess = "Colons are not allowed. Use inline Python if/else statements."\n+        elif word == "=":\n+            mess = "Variable assignment is not allowed. Use object methods to substitute values."\n+        elif word in ("[", "]"):\n+            mess = "Direct indexing of arrays is not allowed. Use numpy or pandas functions/methods to address specific parts of tables."\n+        else:\n+            mess = "Not an allowed token in this operation"\n+        print("( \'%s\' ) %s" % (word, mess))\n+\n+    def __isSafeStatement(self):\n+        """\n+        Determines if a user-expression is safe to evaluate.\n+\n+        To be considered safe an expression may contain only:\n+        - standard Python operators and numbers\n+        - inline conditional expressions\n+        - select functions and objects\n+          by default, these come from the math, numpy and pandas\n+          libraries, and must be qualified with the modules\' conventional\n+          names math, np, pd; can be overridden at the instance level\n+        - references to a whitelist of objects (pd.DataFrames by default)\n+          and their methods\n+        """\n+\n+        safe = True\n+        # examples of user-expressions\n+        # \'-math.log(1 - elem/4096) * 4096 if elem != bn else elem - 0.5\'\n+        # \'vec.median() +  vec.sum()\'\n+\n+        # 1. Break expressions into tokens\n+        # e.g.,\n+        # [\n+        #     \'-\', \'math.log\', \'(\', \'1\', \'-\', \'elem\', \'/\', \'4096\', \')\', \'*\',\n+        #     \'4096\', \'if\', \'elem\', \'!=\', \'bn\', \'else\', \'elem\', \'-\', \'0.5\'\n+        # ]\n+        # or\n+        # [\'vec.median\', \'(\', \')\', \'+\', \'vec.sum\', \'(\', \')\']\n+        tokens = [\n+            e for e in re.split(\n+                r\'([a-zA-Z0-9_.]+|[^a-zA-Z0-9_.() ]+|[()])\', self.expr\n+            ) if e.strip()\n+        ]\n+\n+        # 2. Subtract allowed standard tokens\n+        rem = [e for e in tokens if e not in self.__allowed_tokens]\n+\n+        # 3. Subtract allowed qualified objects from allowed modules\n+        #    and whitelisted references and their attributes\n+        rem2 = []\n+        for e in rem:\n+            parts = e.split(\'.\')\n+            if len(parts) == 1:\n+                if parts[0] in self.these:\n+                    continue\n+            if len(parts) == 2:\n+                if parts[0] in self.these:\n+                    parts[0] = \'_this\'\n+                if parts[0] in self.allowed_qualified:\n+                    if parts[1] in self.allowed_qualified[parts[0]]:\n+                        continue\n+            rem2.append(e)\n+\n+        # 4. Assert that rest are real numbers\n+        e = \'\'\n+        for e in rem2:\n+            try:\n+                _ = float(e)\n+            except ValueError:\n+                safe = False\n+                break\n+\n+        return safe, e\n'
b
diff -r 000000000000 -r 1b0f96ed73f2 scripts/table_compute.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/table_compute.py Sat Aug 17 16:25:37 2019 -0400
[
b'@@ -0,0 +1,310 @@\n+#!/usr/bin/env python3\n+"""\n+Table Compute tool - a wrapper around pandas with parameter input validation.\n+"""\n+\n+__version__ = "0.8"\n+\n+import csv\n+import math\n+from sys import argv\n+\n+import numpy as np\n+import pandas as pd\n+import userconfig as uc\n+from safety import Safety\n+# This should be generated in the same directory\n+\n+# Version command should not need to copy the config\n+if len(argv) == 2 and argv[1] == "--version":\n+    print(__version__)\n+    exit(-1)\n+\n+\n+class Utils:\n+    @staticmethod\n+    def getOneValueMathOp(op_name):\n+        "Returns a simple one value math operator such as log, sqrt, etc"\n+        return getattr(math, op_name)\n+\n+    @staticmethod\n+    def getVectorPandaOp(op_name):\n+        "Returns a valid DataFrame vector operator"\n+        return getattr(pd.DataFrame, op_name)\n+\n+    @staticmethod\n+    def getTwoValuePandaOp(op_name, pd_obj):\n+        "Returns a valid two value DataFrame or Series operator"\n+        return getattr(type(pd_obj), "__" + op_name + "__")\n+\n+\n+# Math is imported but not directly used because users\n+# may specify a "math.<function>" when inserting a custom\n+# function. To remove linting errors, which break CI testing\n+# we will just use an arbitrary math statement here.\n+__ = math.log\n+\n+\n+# Set decimal precision\n+pd.options.display.precision = uc.Default["precision"]\n+\n+user_mode = uc.Default["user_mode"]\n+user_mode_single = None\n+out_table = None\n+params = uc.Data["params"]\n+\n+if user_mode == "single":\n+    # Read in TSV file\n+    data = pd.read_csv(\n+        uc.Data["tables"][0]["reader_file"],\n+        header=uc.Data["tables"][0]["reader_header"],\n+        index_col=uc.Data["tables"][0]["reader_row_col"],\n+        keep_default_na=uc.Default["narm"],\n+        sep=\'\\t\'\n+    )\n+    # Fix whitespace issues in index or column names\n+    data.columns = [col.strip() if type(col) is str else col\n+                    for col in data.columns]\n+    data.index = [row.strip() if type(row) is str else row\n+                  for row in data.index]\n+\n+    user_mode_single = params["user_mode_single"]\n+\n+    if user_mode_single == "precision":\n+        # Useful for changing decimal precision on write out\n+        out_table = data\n+\n+    elif user_mode_single == "select":\n+        cols_specified = params["select_cols_wanted"]\n+        rows_specified = params["select_rows_wanted"]\n+\n+        # Select all indexes if empty array of values\n+        if not cols_specified:\n+            cols_specified = range(len(data.columns))\n+        if not rows_specified:\n+            rows_specified = range(len(data))\n+\n+        # do not use duplicate indexes\n+        # e.g. [2,3,2,5,5,4,2] to [2,3,5,4]\n+        nodupes_col = not params["select_cols_unique"]\n+        nodupes_row = not params["select_rows_unique"]\n+\n+        if nodupes_col:\n+            cols_specified = [x for i, x in enumerate(cols_specified)\n+                              if x not in cols_specified[:i]]\n+        if nodupes_row:\n+            rows_specified = [x for i, x in enumerate(rows_specified)\n+                              if x not in rows_specified[:i]]\n+\n+        out_table = data.iloc[rows_specified, cols_specified]\n+\n+    elif user_mode_single == "filtersumval":\n+        mode = params["filtersumval_mode"]\n+        axis = params["filtersumval_axis"]\n+        operation = params["filtersumval_op"]\n+        compare_operation = params["filtersumval_compare"]\n+        value = params["filtersumval_against"]\n+        minmatch = params["filtersumval_minmatch"]\n+\n+        if mode == "operation":\n+            # Perform axis operation\n+            summary_op = Utils.getVectorPandaOp(operation)\n+            axis_summary = summary_op(data, axis=axis)\n+            # Perform vector comparison\n+            compare_op = Utils.getTwoValuePandaOp(\n+                compare_operation, axis_summary\n+            )\n+            axis_bool = compare_op(axis_summary, value)\n+\n+        elif mode == "element":\n+            if operation.star'..b'PandaOp(\n+                params["element_scale_op"], data\n+            )\n+            scale_value = params["element_scale_value"]\n+            out_table = data.mask(\n+                bool_mat, scale_op(data.where(bool_mat), scale_value)\n+            )\n+        elif mode == "custom":\n+            element_customop = params["element_customop"]\n+\n+            def fun(elem):\n+                """Dummy Function"""\n+                return elem\n+\n+            ss = Safety(element_customop, [\'elem\'])\n+            fun_string = ss.generateFunction()\n+            exec(fun_string)  # SUPER DUPER SAFE...\n+\n+            out_table = data.mask(\n+                bool_mat, data.where(bool_mat).applymap(fun)\n+            )\n+        else:\n+            print("No such element mode!", mode)\n+            exit(-1)\n+\n+    elif user_mode_single == "fulltable":\n+        general_mode = params["mode"]\n+\n+        if general_mode == "melt":\n+            melt_ids = params["MELT"]["melt_ids"]\n+            melt_values = params["MELT"]["melt_values"]\n+\n+            out_table = pd.melt(data, id_vars=melt_ids, value_vars=melt_values)\n+        elif general_mode == "pivot":\n+            pivot_index = params["PIVOT"]["pivot_index"]\n+            pivot_column = params["PIVOT"]["pivot_column"]\n+            pivot_values = params["PIVOT"]["pivot_values"]\n+\n+            out_table = data.pivot(\n+                index=pivot_index, columns=pivot_column, values=pivot_values\n+            )\n+        elif general_mode == "custom":\n+            custom_func = params["fulltable_customop"]\n+\n+            def fun(tableau):\n+                """Dummy Function"""\n+                return tableau\n+\n+            ss = Safety(custom_func, [\'table\'], \'pd.DataFrame\')\n+            fun_string = ss.generateFunction()\n+            exec(fun_string)  # SUPER DUPER SAFE...\n+\n+            out_table = fun(data)\n+\n+    else:\n+        print("No such mode!", user_mode_single)\n+        exit(-1)\n+\n+\n+elif user_mode == "multiple":\n+\n+    table_sections = uc.Data["tables"]\n+\n+    if not table_sections:\n+        print("Multiple table sets not given!")\n+        exit(-1)\n+\n+    reader_skip = uc.Default["reader_skip"]\n+\n+    # Data\n+    table = []\n+    # 1-based handlers for users "table1", "table2", etc.\n+    table_names = []\n+    # Actual 0-based references "table[0]", "table[1]", etc.\n+    table_names_real = []\n+\n+    # Read and populate tables\n+    for x, t_sect in enumerate(table_sections):\n+        tmp = pd.read_csv(\n+            t_sect["file"],\n+            header=t_sect["header"],\n+            index_col=t_sect["row_names"],\n+            keep_default_na=uc.Default["narm"],\n+            sep="\\t"\n+        )\n+        table.append(tmp)\n+        table_names.append("table" + str(x + 1))\n+        table_names_real.append("table[" + str(x) + "]")\n+\n+    custom_op = params["fulltable_customop"]\n+    ss = Safety(custom_op, table_names, \'pd.DataFrame\')\n+    fun_string = ss.generateFunction()\n+    # Change the argument to table\n+    fun_string = fun_string.replace("fun(table1):", "fun():")\n+    # table1 to table[1]\n+    for name, name_real in zip(table_names, table_names_real):\n+        fun_string = fun_string.replace(name, name_real)\n+\n+    fun_string = fun_string.replace("fun():", "fun(table):")\n+    exec(fun_string)  # SUPER DUPER SAFE...\n+    out_table = fun(table)\n+\n+else:\n+    print("No such mode!", user_mode)\n+    exit(-1)\n+\n+if not isinstance(out_table, (pd.DataFrame, pd.Series)):\n+    print(\'The specified operation did not result in a table to return.\')\n+    raise RuntimeError(\n+        \'The operation did not generate a pd.DataFrame or pd.Series to return.\'\n+    )\n+out_parameters = {\n+    "sep": "\\t",\n+    "float_format": "%%.%df" % pd.options.display.precision,\n+    "header": uc.Default["out_headers_col"],\n+    "index": uc.Default["out_headers_row"]\n+}\n+if user_mode_single not in (\'matrixapply\', None):\n+    out_parameters["quoting"] = csv.QUOTE_NONE\n+\n+out_table.to_csv(uc.Default["outtable"], **out_parameters)\n'
b
diff -r 000000000000 -r 1b0f96ed73f2 table_compute.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/table_compute.xml Sat Aug 17 16:25:37 2019 -0400
[
b'@@ -0,0 +1,1441 @@\n+<tool id="table_compute" name="Table Compute" version="@VERSION@">\n+    <description>computes operations on table data</description>\n+    <macros>\n+        <token name="@VERSION@">0.8</token>\n+        <token name="@COPEN@"><![CDATA[<code>]]></token>\n+        <token name="@CCLOSE@"><![CDATA[</code>]]></token>\n+        <import>allowed_functions.xml</import>\n+        <!-- text field validators -->\n+        <macro name="validator_text" >\n+            <validator type="regex" message="No special characters allowed">^(?:\\w+)?$</validator>\n+            <sanitizer sanitize="false" />\n+        </macro>\n+        <macro name="validator_text_required" >\n+            <validator type="regex" message="No special characters allowed">^(?:\\w+)?$</validator>\n+            <validator type="empty_field" />\n+        </macro>\n+        <macro name="validator_index_identifiers" >\n+            <validator type="regex" message="Specify a comma-separated list of index names without special characters">^(?:\\w+(?:, *\\w+)*)?$</validator>\n+            <sanitizer sanitize="false" />\n+        </macro>\n+        <macro name="validator_index_ranges">\n+            <validator type="regex" message="Specify a comma-separated list index numbers or ranges">^(?:\\d+(?::\\d)*(?:, *\\d+(?::\\d)*)*)?$</validator>\n+            <sanitizer sanitize="false" />\n+        </macro>\n+        <macro name="validator_functiondef">\n+            <validator type="regex" message="An expression is required and is allowed to contain only letters, numbers and the characters \'_ !-+=/*%.&lt;&gt;()\'">^[\\w !\\-+=/*%,.&lt;&gt;()]+$</validator>\n+            <sanitizer sanitize="false" />\n+        </macro>\n+        <!-- macro for main input tests -->\n+        <macro name="test_inputs_single" >\n+            <conditional name="singtabop" >\n+                <param name="use_type" value="single" />\n+                <param name="input" value="small.tsv" />\n+                <conditional name="user" >\n+                    <yield />\n+                </conditional>\n+            </conditional>\n+        </macro>\n+        <!-- macro for umi to transcript tests -->\n+        <macro name="umi2trans" >\n+            <yield />\n+            <conditional name="user" >\n+                <param name="mode" value="element" />\n+                <param name="element_op" value="gt" />\n+                <param name="element_value" value="0" />\n+                <conditional name="element" >\n+                    <param name="mode" value="custom" />\n+                    <param name="custom_expr" value="-math.log(1 - elem/4096) * 4096 if elem != 4096 else elem - 0.5" />\n+                </conditional>\n+            </conditional>\n+        </macro>\n+        <!-- macro for file inputs -->\n+        <macro name="file_opts">\n+            <param name="input" type="data" format="tsv,tabular" label="Table" />\n+            <param name="col_row_names" type="select" display="checkboxes" multiple="true" optional="true"\n+            label="This input data has">\n+                <option value="has_col_names" selected="true">Column names on the first row</option>\n+                <option value="has_row_names" selected="true">Row names on the first column"</option>\n+            </param>\n+        </macro>\n+        <!-- element value macro -->\n+        <macro name="elem_val_macro" >\n+            <param name="element_value" type="text" optional="true" label="Filter value" help="This value is converted to numeric if possible, otherwise it is treated as a string" />\n+        </macro>\n+    </macros>\n+    <requirements>\n+        <requirement type="package" version="0.25">pandas</requirement>\n+        <requirement type="package" version="1.17">numpy</requirement>\n+    </requirements>\n+\n+    <version_command><![CDATA[\n+        touch \'$__tool_directory__/scripts/userconfig.py\' && python \'$__tool_directory__/scripts/table_compute.py\' --version\n+    ]]></version_command>\n+\n+    <command detect_errors="exit_code"><![CDATA[\n+        ## Can only impo'..b'on \'table\' along axis (0 or 1)* \xe2\x86\x92 ::\n+\n+      table - table.mean(0)/table.std(0)\n+\n+\n+Example 6: Perform operations on multiple tables\n+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n+\n+We have the following three input tables:\n+\n+Table 1\n+\n+ === === === ===\n+  .  c1  c2  c3\n+ === === === ===\n+ g1  10  20  30\n+ g2   3  10   9\n+ g3   4   8  10\n+ === === === ===\n+\n+Table 2\n+\n+ === === ===\n+  .  c1  c2\n+ === === ===\n+ g1   1   2\n+ g2   3   4\n+ g3   6   5\n+ === === ===\n+\n+Table 3\n+\n+ === === === ===\n+  .  c1  c2  c3\n+ === === === ===\n+ g1   1   2   3\n+ g2   1   2   3\n+ === === === ===\n+\n+\n+*Note that the dimensions of these tables do not match.*\n+\n+Dimensions:\n+ * Table1 [3,3]\n+ * Table2 [3,2]\n+ * Table3 [2,3]\n+\n+In order to perform simple operations between Tables, they must be of the same dimensions.\n+\n+To add Table2 to Table3 we would have to transpose one of the tables using the in-built `T` method::\n+\n+    table2 + table3.T\n+\n+or::\n+\n+    table2.T + table3\n+\n+We can also perform more general operations using all 3 tables, such as taking the minimum value of\n+the maximum values of Table2 and Table3, and dividing the Table1 values by it::\n+\n+    table1 / min(table2.values.max(), table3.values.max())\n+\n+\n+To perform these types of operations in Galaxy we would select the following:\n+\n+ * *Input Single or Multiple Tables* \xe2\x86\x92 **Multiple Tables**\n+ * *(For each inserted table)*\n+    * *Column names on first row?* \xe2\x86\x92 **Yes**\n+    * *Row names on first column?* \xe2\x86\x92 **Yes**\n+ * *Custom Expression* \xe2\x86\x92 ::\n+\n+    <insert your desired function>\n+\n+Please note that the last example shown above was chosen to illustrate the\n+limitations of the tool. Nested attributes like `table2.values.max` are\n+disallowed in expressions in the tool so the above would have to be replaced\n+with the harder to read workaround::\n+\n+    table1 / min(np.max(np.max(table2)), np.max(np.max(table3)))\n+\n+Also note that, currently `min()`, `max()` and `sum()` are the only built-in\n+Python functions that can be used inside expressions. If you want to use\n+additional functions, these have to be qualified functions from the `math`,\n+`np` or `pd` libraries.\n+\n+\n+Example 7: Melt\n+~~~~~~~~~~~~~~~\n+\n+We have the following table\n+\n+ === === === ===\n+  .   A   B   C\n+ === === === ===\n+  0   a   B   1\n+  1   b   B   3\n+  2   c   B   5\n+ === === === ===\n+\n+and we want:\n+\n+ === === ======== =====\n+  .   A  variable value\n+ === === ======== =====\n+  0   a     B       B\n+  1   b     B       B\n+  2   c     B       B\n+  3   a     C       1\n+  4   b     C       3\n+  5   c     C       5\n+ === === ======== =====\n+\n+\n+In Galaxy we would select the following:\n+\n+ * *Input Single or Multiple Tables* \xe2\x86\x92 **Single Table**\n+ * *Column names on first row?* \xe2\x86\x92 **Yes**\n+ * *Row names on first column?* \xe2\x86\x92 **Yes**\n+ * *Type of table operation* \xe2\x86\x92  **Perform a Full Table Operation**\n+\n+   * *Operation* \xe2\x86\x92 **Melt**\n+   * *Variable IDs* \xe2\x86\x92 "A"\n+   * *Unpivoted IDs* \xe2\x86\x92 "B,C"\n+\n+This converts the "B" and "C" columns into variables.\n+\n+\n+Example 8: Pivot\n+~~~~~~~~~~~~~~~~\n+\n+We have the following table\n+\n+ === === === === ===\n+  .  foo bar baz zoo\n+ === === === === ===\n+  0  one  A   1   x\n+  1  one  B   2   y\n+  2  one  C   3   z\n+  3  two  A   4   q\n+  4  two  B   5   w\n+  5  two  C   6   t\n+ === === === === ===\n+\n+and we want:\n+\n+ === === === ===\n+  .   A   B   C\n+ === === === ===\n+ one  1   2   3\n+ two  4   5   6\n+ === === === ===\n+\n+In Galaxy we would select the following:\n+\n+ * *Input Single or Multiple Tables* \xe2\x86\x92 **Single Table**\n+ * *Column names on first row?* \xe2\x86\x92 **Yes**\n+ * *Row names on first column?* \xe2\x86\x92 **Yes**\n+ * *Type of table operation* \xe2\x86\x92  **Perform a Full Table Operation**\n+\n+   * *Operation* \xe2\x86\x92 **Pivot**\n+   * *Index* \xe2\x86\x92 "foo"\n+   * *Column* \xe2\x86\x92 "bar"\n+   * *Values* \xe2\x86\x92 "baz"\n+\n+This splits the matrix using "foo" and "bar" using only the values from "baz". Header values may contain extra information.\n+\n+]]></help>\n+    <citations></citations>\n+</tool>\n'
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/examples.1.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/examples.1.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,5 @@
+ c1  c2  c3
+g1  10  20  30
+g2  3  6  9
+g3  4  8  12
+g4  81  6  3
\ No newline at end of file
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/examples.2.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/examples.2.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,5 @@
+ c1  c2  c3
+g1  10  20  30
+g2  3  6  9
+g3  4  8  12
+g4  81  6  3
\ No newline at end of file
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/examples.3p1.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/examples.3p1.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,5 @@
+ c1  c2  c3
+g1  10  20  30
+g2  3  6  9
+g3  4  8  12
+g4  81  6  3
\ No newline at end of file
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/examples.3p2.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/examples.3p2.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,5 @@
+ c1 c2 c3
+g1 False False False
+g2 True True True
+g3 True True False
+g4 False True True
\ No newline at end of file
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/examples.4.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/examples.4.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,5 @@
+ c1  c2  c3
+g1  0  20  30
+g2  3  0  9
+g3  4  8  0
+g4  81  0  0
\ No newline at end of file
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/examples.5.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/examples.5.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,5 @@
+ c1  c2  c3
+g1  10  20  30
+g2  3  10  9
+g3  4  8  10
+g4  81  10  10
\ No newline at end of file
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/examples.6p1.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/examples.6p1.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,4 @@
+ c1  c2  c3
+g1  10  20  30
+g2  3  10  9
+g3  4  8  10
\ No newline at end of file
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/examples.6p2.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/examples.6p2.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,4 @@
+ c1  c2
+g1  1  2
+g2  3  4
+g3  6  5
\ No newline at end of file
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/examples.6p3.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/examples.6p3.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,3 @@
+ c1  c2  c3
+g1  1  2  3
+g2  1  2  3
\ No newline at end of file
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/examples.7.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/examples.7.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,4 @@
+ A  B  C
+0  a  B  1
+1  b  B  3
+2  c  B  5
\ No newline at end of file
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/examples.8.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/examples.8.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,7 @@
+ foo  bar  baz  zoo
+0  one  A  1  x
+1  one  B  2  y
+2  one  C  3  z
+3  two  A  4  q
+4  two  B  5  w
+5  two  C  6  t
\ No newline at end of file
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/mat1.trans.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/mat1.trans.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,22 @@
+ CTTCGA GAAGAC GAAGGA GAATCC GAATGG GACAAC GACAGA GACGAA GAGCAA GAGGTA GAGTGA GAGTTG GATACG GATCGA GATCTG GATTGC GCAACA GCAATG GCAGAA GCATGA GCATTC
+ENSDARG00000087616 -0.000000 1.000122 0 6.004399 -0.000000 0 -0.000000 10.012227 1.000122 -0.000000 -0.000000 -0.000000 1.000122 -0.000000 -0.000000 0 4.001954 -0.000000 0 -0.000000 -0.000000
+ENSDARG00000036044 5.003054 -0.000000 0 -0.000000 -0.000000 0 -0.000000 31.117905 -0.000000 -0.000000 -0.000000 -0.000000 1.000122 -0.000000 -0.000000 0 -0.000000 -0.000000 0 -0.000000 -0.000000
+ENSDARG00000036816 -0.000000 1.000122 0 12.017613 -0.000000 0 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0 5.003054 -0.000000 0 -0.000000 -0.000000
+ENSDARG00000102632 1.000122 -0.000000 0 10.012227 1.000122 0 -0.000000 8.007823 -0.000000 -0.000000 1.000122 -0.000000 1.000122 1.000122 -0.000000 0 1.000122 -0.000000 0 -0.000000 -0.000000
+ENSDARG00000056722 -0.000000 1.000122 0 2.000488 -0.000000 0 -0.000000 17.035376 -0.000000 -0.000000 2.000488 -0.000000 1.000122 -0.000000 -0.000000 0 2.000488 -0.000000 0 -0.000000 -0.000000
+ENSDARG00000098591 -0.000000 -0.000000 0 9.009902 3.001099 0 1.000122 30.110403 -0.000000 -0.000000 1.000122 -0.000000 -0.000000 -0.000000 -0.000000 0 2.000488 -0.000000 0 1.000122 -0.000000
+ENSDARG00000044212 -0.000000 -0.000000 0 -0.000000 -0.000000 0 -0.000000 33.133653 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 4.001954 -0.000000 0 3.001099 -0.000000 0 -0.000000 1.000122
+ENSDARG00000010516 2.000488 -0.000000 0 3.001099 2.000488 0 -0.000000 13.020674 -0.000000 -0.000000 -0.000000 -0.000000 1.000122 -0.000000 -0.000000 0 -0.000000 -0.000000 0 -0.000000 -0.000000
+ENSDARG00000021143 4.001954 -0.000000 0 14.023980 2.000488 0 -0.000000 8.007823 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0 3.001099 -0.000000 0 -0.000000 -0.000000
+ENSDARG00000042905 1.000122 -0.000000 0 -0.000000 -0.000000 0 -0.000000 22.059294 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0 1.000122 -0.000000 0 -0.000000 -0.000000
+ENSDARG00000041435 1.000122 -0.000000 0 6.004399 1.000122 0 -0.000000 15.027533 -0.000000 -0.000000 -0.000000 2.000488 -0.000000 -0.000000 -0.000000 0 1.000122 -0.000000 0 -0.000000 -0.000000
+ENSDARG00000034897 2.000488 -0.000000 0 5.003054 1.000122 0 -0.000000 21.054018 1.000122 -0.000000 -0.000000 1.000122 -0.000000 -0.000000 -0.000000 0 1.000122 -0.000000 0 -0.000000 -0.000000
+ENSDARG00000040287 2.000488 2.000488 0 1.000122 -0.000000 0 -0.000000 11.014797 -0.000000 -0.000000 1.000122 -0.000000 -0.000000 -0.000000 -0.000000 0 1.000122 1.000122 0 -0.000000 -0.000000
+ENSDARG00000007320 3.001099 -0.000000 0 1.000122 -0.000000 0 -0.000000 26.082870 -0.000000 -0.000000 1.000122 2.000488 -0.000000 1.000122 -0.000000 0 -0.000000 -0.000000 0 -0.000000 -0.000000
+ENSDARG00000003599 -0.000000 -0.000000 0 2.000488 2.000488 0 -0.000000 27.089382 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 1.000122 0 -0.000000 -0.000000 0 -0.000000 -0.000000
+ENSDARG00000099104 4.001954 -0.000000 0 3.001099 1.000122 0 -0.000000 14.023980 -0.000000 1.000122 -0.000000 -0.000000 -0.000000 2.000488 -0.000000 0 -0.000000 -0.000000 0 -0.000000 -0.000000
+ENSDARG00000071658 -0.000000 1.000122 0 3.001099 -0.000000 0 -0.000000 8.007823 -0.000000 -0.000000 3.001099 -0.000000 -0.000000 -0.000000 -0.000000 0 5.003054 -0.000000 0 -0.000000 1.000122
+ENSDARG00000030408 1.000122 1.000122 0 1.000122 1.000122 0 -0.000000 25.076606 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0 1.000122 -0.000000 0 -0.000000 -0.000000
+ENSDARG00000039647 -0.000000 -0.000000 0 26.082870 1.000122 0 -0.000000 5.003054 -0.000000 -0.000000 1.000122 -0.000000 -0.000000 -0.000000 -0.000000 0 -0.000000 -0.000000 0 -0.000000 -0.000000
+ENSDARG00000043509 -0.000000 -0.000000 0 -0.000000 1.000122 0 1.000122 27.089382 1.000122 -0.000000 -0.000000 -0.000000 -0.000000 1.000122 -0.000000 0 3.001099 -0.000000 0 -0.000000 -0.000000
+ENSDARG00000017235 1.000122 -0.000000 0 3.001099 1.000122 0 -0.000000 15.027533 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0 -0.000000 -0.000000 0 -0.000000 -0.000000
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/mat1.umi.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/mat1.umi.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,22 @@
+ CTTCGA GAAGAC GAAGGA GAATCC GAATGG GACAAC GACAGA GACGAA GAGCAA GAGGTA GAGTGA GAGTTG GATACG GATCGA GATCTG GATTGC GCAACA GCAATG GCAGAA GCATGA GCATTC
+ENSDARG00000087616 0 1 0 6 0 0 0 10 1 0 0 0 1 0 0 0 4 0 0 0 0
+ENSDARG00000036044 5 0 0 0 0 0 0 31 0 0 0 0 1 0 0 0 0 0 0 0 0
+ENSDARG00000036816 0 1 0 12 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0
+ENSDARG00000102632 1 0 0 10 1 0 0 8 0 0 1 0 1 1 0 0 1 0 0 0 0
+ENSDARG00000056722 0 1 0 2 0 0 0 17 0 0 2 0 1 0 0 0 2 0 0 0 0
+ENSDARG00000098591 0 0 0 9 3 0 1 30 0 0 1 0 0 0 0 0 2 0 0 1 0
+ENSDARG00000044212 0 0 0 0 0 0 0 33 0 0 0 0 0 4 0 0 3 0 0 0 1
+ENSDARG00000010516 2 0 0 3 2 0 0 13 0 0 0 0 1 0 0 0 0 0 0 0 0
+ENSDARG00000021143 4 0 0 14 2 0 0 8 0 0 0 0 0 0 0 0 3 0 0 0 0
+ENSDARG00000042905 1 0 0 0 0 0 0 22 0 0 0 0 0 0 0 0 1 0 0 0 0
+ENSDARG00000041435 1 0 0 6 1 0 0 15 0 0 0 2 0 0 0 0 1 0 0 0 0
+ENSDARG00000034897 2 0 0 5 1 0 0 21 1 0 0 1 0 0 0 0 1 0 0 0 0
+ENSDARG00000040287 2 2 0 1 0 0 0 11 0 0 1 0 0 0 0 0 1 1 0 0 0
+ENSDARG00000007320 3 0 0 1 0 0 0 26 0 0 1 2 0 1 0 0 0 0 0 0 0
+ENSDARG00000003599 0 0 0 2 2 0 0 27 0 0 0 0 0 0 1 0 0 0 0 0 0
+ENSDARG00000099104 4 0 0 3 1 0 0 14 0 1 0 0 0 2 0 0 0 0 0 0 0
+ENSDARG00000071658 0 1 0 3 0 0 0 8 0 0 3 0 0 0 0 0 5 0 0 0 1
+ENSDARG00000030408 1 1 0 1 1 0 0 25 0 0 0 0 0 0 0 0 1 0 0 0 0
+ENSDARG00000039647 0 0 0 26 1 0 0 5 0 0 1 0 0 0 0 0 0 0 0 0 0
+ENSDARG00000043509 0 0 0 0 1 0 1 27 1 0 0 0 0 1 0 0 3 0 0 0 0
+ENSDARG00000017235 1 0 0 3 1 0 0 15 0 0 0 0 0 0 0 0 0 0 0 0 0
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/mat2.trans.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/mat2.trans.tsv Sat Aug 17 16:25:37 2019 -0400
b
b'@@ -0,0 +1,31 @@\n+\tAACACC\tAACCTC\tAACGAG\tAACTGG\tAAGCAC\tAAGCCA\tAAGGTG\tAAGTGC\tACAAGC\tACAGAC\tACAGGA\tACAGTG\tACATGG\tACCAAC\tACCAGA\tACCATG\tACGGTA\tACGTAC\tACGTGA\tACGTTG\tACTCAC\tACTCGA\tACTCTG\tACTTCG\tAGAACG\tAGACAG\tAGACCA\tAGACTC\tAGATGC\tAGCGAA\tAGCTAG\tAGCTCA\tAGCTTC\tAGGAAG\tAGGACA\tAGGATC\tAGGCTA\tAGTACC\tAGTAGG\tAGTGCA\tAGTGTC\tATACGG\tATCACG\tATCAGC\tATCCAC\tATCCGA\tATCGCA\tATCGTG\tATCTCC\tATGACC\tATGAGG\tATGCAG\tATGCTC\tATGGAC\tATGTCG\tATTCGC\tATTGCG\tCAATGC\tCACCAA\tCACGTA\tCACTCA\tCACTTC\tCAGAAG\tCAGGAA\tCATGCA\tCATGTC\tCATTGG\tCCAATC\tCCACAA\tCCAGTA\tCCATAG\tCCATCA\tCCGATA\tCCGTAA\tCCTACA\tCCTATG\tCCTGAA\tCCTTGA\tCGAACA\tCGATGA\tCGATTG\tCGCATA\tCGCTAA\tCGGTTA\tCGTAAG\tCGTCTA\tCGTTAC\tCGTTCA\tCTAACG\tCTAAGC\tCTAGAC\tCTAGGA\tCTAGTG\tCTATCC\tCTCAGA\tCTCATG\tCTCGAA\tCTGCTA\tCTGTTG\tCTTCGA\tGAAGAC\tGAAGGA\tGAATCC\tGAATGG\tGACAAC\tGACAGA\tGACGAA\tGAGCAA\tGAGGTA\tGAGTGA\tGAGTTG\tGATACG\tGATCGA\tGATCTG\tGATTGC\tGCAACA\tGCAATG\tGCAGAA\tGCATGA\tGCATTC\tGCCATA\tGCGTTA\tGCTAAG\tGCTCTA\tGCTTAC\tGCTTCA\tGGAATC\tGGACAA\tGGATAC\tGGATCA\tGGCTTA\tGGTAAC\tGGTAGA\tGGTATG\tGGTGTA\tGGTTAG\tGTAACC\tGTACAG\tGTACCA\tGTACTC\tGTATCG\tGTATGC\tGTCTCA\tGTGAAG\tGTGACA\tGTGATC\tGTGGAA\tGTTAGG\tGTTGAG\tTAACGG\tTACAGG\tTACCAC\tTACCGA\tTACGCA\tTACTCC\tTAGCTC\tTAGGAC\tTAGTGG\tTATCCG\tTATCGC\tTCAACG\tTCACAG\tTCATCC\tTCCGAA\tTCTAGG\tTCTTGC\tTGAACC\tTGAAGG\tTGAGGA\tTGATCG\tTGCAAC\tTGCAGA\tTGGTGA\tTGGTTG\tTGTACG\tTGTAGC\tTGTCGA\tTGTCTG\tTGTTCC\tTGTTGG\tTTACGC\tTTCACC\tTTCCAG\tTTCGAC\tTTCTCG\tTTGCAC\tTTGCGA\tTTGCTG\tTTGGAG\tTTGGCA\tTTGGTC\tTTGTGC\n+ENSDARG00000099970\t5.003054\t1.000122\t14.023980\t-0.000000\t2.000488\t2.000488\t2.000488\t-0.000000\t162.168323\t3.001099\t81.811621\t9.009902\t1.000122\t195.596716\t132.107705\t69.587787\t-0.000000\t-0.000000\t2.000488\t406.522221\t136.240904\t-0.000000\t37.168128\t1.000122\t5.003054\t108.422409\t3.001099\t49.295449\t-0.000000\t1.000122\t45.249018\t13.020674\t173.628588\t4.001954\t5.003054\t21.054018\t5.003054\t1.000122\t-0.000000\t7.005988\t63.489523\t2.000488\t5.003054\t1.000122\t-0.000000\t3.001099\t5.003054\t-0.000000\t0\t2.000488\t7.005988\t3.001099\t-0.000000\t-0.000000\t601.014180\t1.000122\t144.519836\t-0.000000\t6.004399\t2.000488\t257.954777\t2.000488\t268.618673\t1.000122\t-0.000000\t4.001954\t1.000122\t1.000122\t2.000488\t-0.000000\t1.000122\t2.000488\t3.001099\t1.000122\t3.001099\t-0.000000\t1.000122\t1.000122\t-0.000000\t249.443605\t12.017613\t-0.000000\t5.003054\t1.000122\t1.000122\t2.000488\t5.003054\t2.000488\t3.001099\t130.042668\t1.000122\t96.119021\t5.003054\t71.622561\t3.001099\t24.070588\t2.000488\t6.004399\t1.000122\t55.372602\t3.001099\t3.001099\t366.957653\t4.001954\t6.004399\t2.000488\t365.864074\t-0.000000\t1.000122\t16.031332\t2.000488\t6.004399\t4.001954\t-0.000000\t2.000488\t37.168128\t1.000122\t1.000122\t6.004399\t3.001099\t2.000488\t1.000122\t6.004399\t7.005988\t6.004399\t3.001099\t-0.000000\t96.119021\t2.000488\t1.000122\t4.001954\t245.194642\t1.000122\t2.000488\t-0.000000\t2.000488\t-0.000000\t5.003054\t320.195430\t257.954777\t-0.000000\t4.001954\t20.048988\t1.000122\t325.605548\t59.429052\t10.012227\t5.003054\t37.168128\t4.001954\t-0.000000\t2.000488\t4.001954\t-0.000000\t1.000122\t-0.000000\t341.878911\t1.000122\t3.001099\t-0.000000\t2.000488\t33.133653\t3.001099\t146.592186\t2.000488\t51.320165\t2.000488\t245.194642\t5.003054\t0\t59.429052\t55.372602\t69.587787\t2.000488\t-0.000000\t1.000122\t31.117905\t39.186856\t4.001954\t-0.000000\t-0.000000\t80.791574\t2.000488\t3.001099\t38.177367\t-0.000000\t6.004399\t1.000122\t2.000488\t-0.000000\t2.000488\t173.628588\n+ENSDARG00000104945\t-0.000000\t3.001099\t6.004399\t1.000122\t-0.000000\t2.000488\t4.001954\t1.000122\t9.009902\t12.017613\t1.000122\t1.000122\t-0.000000\t19.044204\t21.054018\t29.103148\t1.000122\t1.000122\t1.000122\t145.555880\t23.064818\t-0.000000\t29.103148\t1.000122\t1.000122\t2.000488\t4.001954\t28.096142\t-0.000000\t2.000488\t6.004399\t7.005988\t31.117905\t-0.000000\t3.001099\t13.020674\t1.000122\t1.000122\t1.000122\t14.023980\t60.443792\t1.000122\t1.000122\t-0.000000\t-0.000000\t2.000488\t-0.000000\t1.000122\t0\t2.000488\t-0.000000\t-0.000000\t-0.000000\t1.000122\t26.082870\t1.000122\t77.732955\t-0.000000\t-0.000000\t-0.000000\t55.372602\t3.001099\t18.039667\t1.000122\t1.000122\t2.000488\t2.000488\t-0.000000\t-0.000000\t1.000122\t-0.000000\t2.000488\t2.000488\t4.001954\t3.001099\t-0.000000\t1.000122\t2.000488\t-0.000000\t57.400325\t3.001099\t-0.000000\t4.00'..b'23\t-0.000000\t-0.000000\t-0.000000\t2.000488\t-0.000000\t0\t3.001099\t10.012227\t5.003054\t-0.000000\t-0.000000\t-0.000000\t1.000122\t5.003054\t-0.000000\t-0.000000\t-0.000000\t2.000488\t-0.000000\t-0.000000\t6.004399\t-0.000000\t-0.000000\t-0.000000\t1.000122\t-0.000000\t-0.000000\t8.007823\n+ENSDARG00000009212\t-0.000000\t2.000488\t3.001099\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t50.307682\t-0.000000\t1.000122\t-0.000000\t-0.000000\t3.001099\t4.001954\t4.001954\t-0.000000\t3.001099\t-0.000000\t21.054018\t10.012227\t-0.000000\t4.001954\t1.000122\t1.000122\t29.103148\t-0.000000\t2.000488\t-0.000000\t-0.000000\t-0.000000\t1.000122\t4.001954\t-0.000000\t-0.000000\t7.005988\t-0.000000\t-0.000000\t-0.000000\t2.000488\t8.007823\t-0.000000\t3.001099\t-0.000000\t-0.000000\t-0.000000\t1.000122\t-0.000000\t0\t-0.000000\t-0.000000\t-0.000000\t1.000122\t-0.000000\t2.000488\t-0.000000\t16.031332\t-0.000000\t-0.000000\t-0.000000\t9.009902\t-0.000000\t8.007823\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t12.017613\t3.001099\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t3.001099\t1.000122\t-0.000000\t-0.000000\t1.000122\t-0.000000\t1.000122\t3.001099\t2.000488\t-0.000000\t5.003054\t-0.000000\t-0.000000\t1.000122\t2.000488\t-0.000000\t-0.000000\t7.005988\t-0.000000\t-0.000000\t-0.000000\t18.039667\t-0.000000\t-0.000000\t1.000122\t-0.000000\t1.000122\t-0.000000\t-0.000000\t-0.000000\t2.000488\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t2.000488\t-0.000000\t-0.000000\t-0.000000\t11.014797\t-0.000000\t-0.000000\t-0.000000\t5.003054\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t1.000122\t4.001954\t10.012227\t-0.000000\t1.000122\t4.001954\t-0.000000\t10.012227\t4.001954\t11.014797\t-0.000000\t6.004399\t-0.000000\t-0.000000\t1.000122\t1.000122\t-0.000000\t-0.000000\t-0.000000\t24.070588\t1.000122\t-0.000000\t-0.000000\t1.000122\t6.004399\t1.000122\t9.009902\t-0.000000\t2.000488\t-0.000000\t9.009902\t1.000122\t0\t1.000122\t7.005988\t2.000488\t-0.000000\t-0.000000\t-0.000000\t4.001954\t3.001099\t3.001099\t-0.000000\t-0.000000\t2.000488\t2.000488\t-0.000000\t5.003054\t-0.000000\t1.000122\t-0.000000\t1.000122\t1.000122\t-0.000000\t10.012227\n+ENSDARG00000021124\t-0.000000\t1.000122\t9.009902\t-0.000000\t-0.000000\t-0.000000\t1.000122\t-0.000000\t9.009902\t-0.000000\t1.000122\t-0.000000\t-0.000000\t7.005988\t5.003054\t7.005988\t-0.000000\t3.001099\t-0.000000\t15.027533\t38.177367\t-0.000000\t4.001954\t1.000122\t-0.000000\t15.027533\t-0.000000\t4.001954\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t6.004399\t-0.000000\t-0.000000\t11.014797\t-0.000000\t-0.000000\t-0.000000\t3.001099\t6.004399\t-0.000000\t2.000488\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t0\t-0.000000\t-0.000000\t1.000122\t-0.000000\t1.000122\t9.009902\t1.000122\t10.012227\t-0.000000\t-0.000000\t-0.000000\t9.009902\t-0.000000\t10.012227\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t1.000122\t-0.000000\t-0.000000\t-0.000000\t21.054018\t1.000122\t-0.000000\t-0.000000\t1.000122\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t4.001954\t1.000122\t-0.000000\t1.000122\t-0.000000\t2.000488\t3.001099\t-0.000000\t1.000122\t-0.000000\t3.001099\t-0.000000\t-0.000000\t28.096142\t2.000488\t-0.000000\t-0.000000\t25.076606\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t1.000122\t-0.000000\t-0.000000\t11.014797\t1.000122\t-0.000000\t-0.000000\t1.000122\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t11.014797\t21.054018\t-0.000000\t-0.000000\t1.000122\t-0.000000\t10.012227\t2.000488\t2.000488\t-0.000000\t5.003054\t-0.000000\t1.000122\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t13.020674\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t9.009902\t-0.000000\t5.003054\t-0.000000\t-0.000000\t-0.000000\t5.003054\t-0.000000\t0\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t1.000122\t-0.000000\t1.000122\t10.012227\t-0.000000\t-0.000000\t-0.000000\t5.003054\t-0.000000\t1.000122\t4.001954\t-0.000000\t1.000122\t-0.000000\t-0.000000\t-0.000000\t-0.000000\t17.035376\n'
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/mat2.umi.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/mat2.umi.tsv Sat Aug 17 16:25:37 2019 -0400
b
b'@@ -0,0 +1,31 @@\n+\tAACACC\tAACCTC\tAACGAG\tAACTGG\tAAGCAC\tAAGCCA\tAAGGTG\tAAGTGC\tACAAGC\tACAGAC\tACAGGA\tACAGTG\tACATGG\tACCAAC\tACCAGA\tACCATG\tACGGTA\tACGTAC\tACGTGA\tACGTTG\tACTCAC\tACTCGA\tACTCTG\tACTTCG\tAGAACG\tAGACAG\tAGACCA\tAGACTC\tAGATGC\tAGCGAA\tAGCTAG\tAGCTCA\tAGCTTC\tAGGAAG\tAGGACA\tAGGATC\tAGGCTA\tAGTACC\tAGTAGG\tAGTGCA\tAGTGTC\tATACGG\tATCACG\tATCAGC\tATCCAC\tATCCGA\tATCGCA\tATCGTG\tATCTCC\tATGACC\tATGAGG\tATGCAG\tATGCTC\tATGGAC\tATGTCG\tATTCGC\tATTGCG\tCAATGC\tCACCAA\tCACGTA\tCACTCA\tCACTTC\tCAGAAG\tCAGGAA\tCATGCA\tCATGTC\tCATTGG\tCCAATC\tCCACAA\tCCAGTA\tCCATAG\tCCATCA\tCCGATA\tCCGTAA\tCCTACA\tCCTATG\tCCTGAA\tCCTTGA\tCGAACA\tCGATGA\tCGATTG\tCGCATA\tCGCTAA\tCGGTTA\tCGTAAG\tCGTCTA\tCGTTAC\tCGTTCA\tCTAACG\tCTAAGC\tCTAGAC\tCTAGGA\tCTAGTG\tCTATCC\tCTCAGA\tCTCATG\tCTCGAA\tCTGCTA\tCTGTTG\tCTTCGA\tGAAGAC\tGAAGGA\tGAATCC\tGAATGG\tGACAAC\tGACAGA\tGACGAA\tGAGCAA\tGAGGTA\tGAGTGA\tGAGTTG\tGATACG\tGATCGA\tGATCTG\tGATTGC\tGCAACA\tGCAATG\tGCAGAA\tGCATGA\tGCATTC\tGCCATA\tGCGTTA\tGCTAAG\tGCTCTA\tGCTTAC\tGCTTCA\tGGAATC\tGGACAA\tGGATAC\tGGATCA\tGGCTTA\tGGTAAC\tGGTAGA\tGGTATG\tGGTGTA\tGGTTAG\tGTAACC\tGTACAG\tGTACCA\tGTACTC\tGTATCG\tGTATGC\tGTCTCA\tGTGAAG\tGTGACA\tGTGATC\tGTGGAA\tGTTAGG\tGTTGAG\tTAACGG\tTACAGG\tTACCAC\tTACCGA\tTACGCA\tTACTCC\tTAGCTC\tTAGGAC\tTAGTGG\tTATCCG\tTATCGC\tTCAACG\tTCACAG\tTCATCC\tTCCGAA\tTCTAGG\tTCTTGC\tTGAACC\tTGAAGG\tTGAGGA\tTGATCG\tTGCAAC\tTGCAGA\tTGGTGA\tTGGTTG\tTGTACG\tTGTAGC\tTGTCGA\tTGTCTG\tTGTTCC\tTGTTGG\tTTACGC\tTTCACC\tTTCCAG\tTTCGAC\tTTCTCG\tTTGCAC\tTTGCGA\tTTGCTG\tTTGGAG\tTTGGCA\tTTGGTC\tTTGTGC\n+ENSDARG00000099970\t5\t1\t14\t0\t2\t2\t2\t0\t159\t3\t81\t9\t1\t191\t130\t69\t0\t0\t2\t387\t134\t0\t37\t1\t5\t107\t3\t49\t0\t1\t45\t13\t170\t4\t5\t21\t5\t1\t0\t7\t63\t2\t5\t1\t0\t3\t5\t0\t0\t2\t7\t3\t0\t0\t559\t1\t142\t0\t6\t2\t250\t2\t260\t1\t0\t4\t1\t1\t2\t0\t1\t2\t3\t1\t3\t0\t1\t1\t0\t242\t12\t0\t5\t1\t1\t2\t5\t2\t3\t128\t1\t95\t5\t71\t3\t24\t2\t6\t1\t55\t3\t3\t351\t4\t6\t2\t350\t0\t1\t16\t2\t6\t4\t0\t2\t37\t1\t1\t6\t3\t2\t1\t6\t7\t6\t3\t0\t95\t2\t1\t4\t238\t1\t2\t0\t2\t0\t5\t308\t250\t0\t4\t20\t1\t313\t59\t10\t5\t37\t4\t0\t2\t4\t0\t1\t0\t328\t1\t3\t0\t2\t33\t3\t144\t2\t51\t2\t238\t5\t0\t59\t55\t69\t2\t0\t1\t31\t39\t4\t0\t0\t80\t2\t3\t38\t0\t6\t1\t2\t0\t2\t170\n+ENSDARG00000104945\t0\t3\t6\t1\t0\t2\t4\t1\t9\t12\t1\t1\t0\t19\t21\t29\t1\t1\t1\t143\t23\t0\t29\t1\t1\t2\t4\t28\t0\t2\t6\t7\t31\t0\t3\t13\t1\t1\t1\t14\t60\t1\t1\t0\t0\t2\t0\t1\t0\t2\t0\t0\t0\t1\t26\t1\t77\t0\t0\t0\t55\t3\t18\t1\t1\t2\t2\t0\t0\t1\t0\t2\t2\t4\t3\t0\t1\t2\t0\t57\t3\t0\t4\t1\t1\t7\t2\t1\t2\t0\t1\t2\t3\t1\t5\t3\t2\t2\t1\t4\t3\t1\t48\t1\t1\t0\t26\t5\t4\t10\t0\t1\t3\t0\t3\t15\t0\t0\t6\t1\t1\t0\t2\t4\t2\t0\t0\t17\t5\t3\t2\t2\t3\t0\t0\t0\t1\t0\t31\t66\t0\t1\t0\t0\t40\t19\t10\t1\t24\t1\t3\t0\t1\t2\t1\t0\t3\t1\t0\t2\t4\t9\t3\t14\t1\t8\t2\t34\t5\t0\t9\t1\t6\t0\t1\t2\t17\t27\t3\t0\t1\t31\t2\t1\t22\t1\t2\t0\t11\t0\t1\t51\n+ENSDARG00000045639\t0\t2\t0\t0\t0\t1\t0\t0\t1\t0\t1\t0\t0\t52\t25\t4\t0\t2\t0\t116\t37\t0\t6\t0\t1\t0\t0\t20\t0\t0\t1\t2\t31\t0\t0\t13\t1\t1\t0\t2\t5\t0\t0\t1\t0\t1\t1\t0\t0\t0\t1\t0\t0\t2\t43\t0\t23\t0\t0\t0\t91\t0\t44\t0\t0\t0\t1\t0\t1\t0\t1\t0\t0\t1\t1\t0\t0\t1\t0\t57\t4\t0\t0\t0\t0\t6\t1\t0\t0\t0\t1\t0\t1\t1\t2\t1\t0\t1\t0\t0\t0\t0\t86\t0\t0\t0\t27\t1\t2\t3\t0\t0\t0\t0\t0\t29\t0\t0\t0\t0\t0\t0\t1\t3\t1\t0\t0\t15\t0\t0\t0\t3\t0\t0\t0\t0\t0\t1\t35\t88\t1\t0\t0\t2\t69\t10\t4\t0\t7\t0\t0\t1\t3\t0\t0\t0\t2\t2\t0\t0\t0\t25\t0\t49\t0\t6\t1\t21\t4\t0\t7\t0\t0\t0\t1\t0\t6\t32\t0\t0\t0\t7\t0\t0\t21\t0\t0\t0\t2\t0\t0\t41\n+ENSDARG00000070453\t1\t0\t1\t0\t0\t0\t1\t0\t1\t0\t0\t1\t0\t9\t21\t0\t0\t0\t0\t49\t19\t0\t23\t0\t0\t0\t0\t16\t0\t0\t0\t0\t34\t0\t0\t16\t0\t0\t0\t7\t7\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t7\t0\t18\t0\t1\t0\t111\t2\t0\t0\t1\t0\t2\t0\t0\t0\t1\t0\t0\t0\t0\t0\t1\t0\t0\t44\t1\t0\t0\t0\t0\t1\t0\t0\t2\t0\t0\t0\t0\t1\t2\t0\t0\t0\t0\t0\t0\t0\t34\t0\t0\t2\t9\t0\t2\t0\t0\t0\t1\t0\t0\t6\t0\t0\t1\t1\t0\t0\t1\t1\t0\t1\t0\t14\t0\t0\t0\t1\t0\t0\t0\t0\t1\t0\t14\t125\t0\t0\t1\t0\t45\t5\t0\t0\t1\t0\t0\t0\t0\t2\t0\t0\t0\t1\t0\t0\t1\t8\t0\t31\t1\t0\t0\t0\t1\t0\t11\t0\t0\t0\t0\t0\t21\t28\t0\t0\t0\t11\t0\t0\t7\t0\t0\t0\t0\t0\t0\t101\n+ENSDARG00000014201\t0\t1\t10\t0\t0\t0\t0\t0\t3\t0\t0\t0\t0\t23\t7\t21\t0\t0\t0\t38\t38\t0\t4\t0\t0\t0\t0\t11\t0\t0\t1\t1\t27\t0\t0\t28\t0\t1\t0\t4\t7\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t22\t0\t27\t0\t0\t0\t21\t1\t0\t0\t0\t0\t3\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t102\t0\t0\t0\t0\t0\t0\t1\t0\t1\t0\t0\t1\t1\t0\t1\t0\t1\t0\t0\t0\t1\t0\t56\t1\t0\t0\t59\t1\t0\t0\t0\t0\t0\t0\t0\t2\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t16\t1\t0\t0\t0\t1\t0\t0\t0\t0\t0\t41\t34\t0\t0\t0\t0\t33\t8\t2\t1\t1\t0\t2\t0\t0\t0\t0\t0\t0\t1\t1\t0\t1\t14\t1\t21\t0\t6\t0\t0\t3\t0\t1\t0\t1\t0\t0\t0\t19\t21\t0\t0\t0\t9\t0\t1\t8\t0\t0\t0\t0\t0\t0\t58\n+ENSDARG00000055455\t0\t1\t3\t0\t0\t0\t0\t0\t1\t0\t4\t2\t1\t18\t29\t7\t1\t1\t0\t48\t12\t0\t10\t1\t0\t38\t2\t13\t0\t0\t3\t1\t25\t0\t0\t9\t0\t0\t0\t9\t3\t0\t2\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t15\t0\t15\t1\t0\t0\t37\t1\t17\t0\t0\t0\t1\t1\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t14\t1\t0\t1\t0\t0\t5\t1\t0\t0\t0\t0\t5\t2\t0\t0\t11\t1\t0\t0\t0\t1\t0\t50\t1\t0\t1\t32\t0\t0\t5\t0\t0\t0\t0\t0\t9\t0\t1\t0\t0\t0\t0\t0\t1\t1\t1\t0\t3\t1\t0\t0\t1\t1\t0\t0\t1\t0\t2\t37\t51\t0\t1\t0\t1\t28\t14\t4\t0\t7\t1\t0\t0\t0\t0\t0\t0\t1\t2\t1\t0\t0\t4\t1\t18\t1\t7\t1\t57\t2\t0\t3\t0\t4\t0\t0\t0\t11\t20\t0\t0\t0\t4\t0\t1\t10\t0\t1\t0\t0\t0\t0\t3'..b'1\t0\t0\t0\t0\t2\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t17\t3\t0\t0\t21\t0\t1\t0\t0\t1\t0\t0\t0\t8\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t19\t0\t0\t0\t1\t0\t0\t0\t0\t0\t1\t6\t37\t0\t0\t0\t0\t36\t2\t4\t1\t1\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t16\t0\t19\t0\t2\t0\t12\t0\t0\t0\t0\t0\t0\t0\t0\t0\t28\t0\t0\t0\t1\t0\t0\t11\t0\t0\t0\t0\t0\t0\t15\n+ENSDARG00000036577\t0\t0\t2\t0\t0\t2\t0\t1\t0\t0\t4\t0\t0\t10\t16\t4\t0\t2\t1\t45\t8\t0\t9\t0\t0\t2\t0\t6\t0\t0\t1\t2\t15\t0\t0\t6\t0\t0\t0\t8\t1\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t18\t0\t20\t0\t0\t0\t29\t2\t15\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t8\t0\t0\t0\t0\t0\t3\t0\t1\t1\t0\t0\t10\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t34\t4\t0\t0\t10\t0\t0\t4\t0\t1\t0\t0\t0\t6\t0\t0\t1\t0\t0\t0\t1\t0\t0\t0\t0\t7\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t12\t27\t0\t0\t0\t0\t20\t4\t2\t0\t9\t1\t0\t0\t1\t0\t0\t0\t3\t2\t0\t0\t2\t9\t0\t14\t0\t4\t0\t23\t1\t0\t0\t0\t5\t0\t0\t0\t5\t6\t0\t0\t0\t13\t1\t0\t3\t0\t1\t0\t0\t0\t0\t26\n+ENSDARG00000075542\t0\t0\t1\t0\t0\t0\t0\t0\t7\t2\t2\t0\t0\t1\t11\t3\t0\t0\t0\t18\t12\t0\t7\t1\t0\t6\t0\t6\t0\t1\t1\t0\t25\t1\t0\t8\t0\t0\t0\t0\t3\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t11\t0\t3\t0\t0\t1\t31\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t108\t1\t0\t0\t0\t0\t0\t0\t0\t1\t0\t1\t2\t0\t0\t1\t0\t0\t0\t0\t1\t0\t0\t0\t0\t1\t0\t13\t0\t0\t1\t0\t1\t0\t0\t1\t6\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t4\t1\t0\t0\t2\t0\t0\t0\t0\t0\t0\t5\t5\t0\t1\t0\t0\t6\t2\t1\t0\t9\t0\t1\t0\t0\t0\t0\t0\t11\t1\t0\t0\t0\t5\t0\t9\t0\t5\t0\t6\t4\t0\t1\t4\t0\t2\t0\t0\t7\t2\t0\t0\t0\t1\t0\t0\t1\t0\t0\t0\t0\t0\t0\t112\n+ENSDARG00000029150\t0\t1\t3\t0\t0\t0\t0\t0\t20\t0\t2\t0\t0\t4\t2\t4\t0\t6\t1\t14\t15\t0\t4\t3\t0\t31\t3\t5\t0\t1\t1\t1\t11\t0\t0\t6\t1\t0\t0\t4\t6\t0\t7\t0\t0\t0\t1\t0\t0\t0\t1\t0\t0\t0\t13\t0\t19\t0\t0\t0\t14\t0\t6\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t1\t0\t22\t0\t0\t0\t0\t0\t3\t0\t0\t0\t5\t2\t0\t2\t0\t1\t6\t1\t0\t1\t3\t0\t1\t11\t0\t0\t0\t19\t0\t0\t1\t0\t0\t0\t0\t0\t5\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t18\t2\t0\t0\t1\t0\t0\t0\t0\t0\t0\t7\t46\t1\t0\t0\t0\t10\t6\t5\t0\t7\t0\t0\t0\t0\t0\t1\t0\t18\t0\t0\t0\t0\t3\t0\t18\t0\t0\t0\t5\t2\t0\t1\t3\t4\t0\t0\t0\t1\t12\t0\t1\t0\t5\t1\t0\t2\t0\t0\t0\t0\t0\t0\t16\n+ENSDARG00000016494\t0\t0\t0\t0\t0\t0\t1\t0\t2\t0\t0\t0\t0\t4\t20\t0\t0\t0\t0\t22\t3\t0\t5\t0\t0\t0\t0\t19\t0\t0\t1\t0\t20\t0\t1\t6\t0\t0\t0\t0\t3\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t12\t1\t5\t0\t0\t1\t50\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t10\t1\t0\t0\t0\t0\t4\t0\t0\t0\t0\t0\t0\t1\t0\t1\t0\t0\t0\t0\t0\t0\t0\t3\t0\t0\t0\t1\t0\t0\t0\t0\t1\t1\t0\t0\t8\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t7\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t8\t134\t0\t0\t0\t0\t35\t5\t0\t0\t0\t1\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t7\t2\t2\t0\t1\t0\t0\t1\t0\t2\t0\t1\t0\t0\t0\t3\t16\t0\t0\t0\t9\t0\t0\t1\t0\t0\t0\t0\t0\t0\t26\n+ENSDARG00000021864\t0\t0\t0\t0\t0\t0\t0\t0\t47\t0\t0\t0\t0\t1\t2\t7\t0\t2\t3\t13\t11\t0\t0\t3\t2\t18\t0\t2\t0\t0\t1\t1\t6\t0\t0\t19\t0\t1\t0\t5\t3\t0\t8\t1\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t5\t0\t0\t0\t8\t1\t11\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t2\t11\t0\t0\t0\t0\t0\t0\t0\t0\t0\t9\t2\t1\t3\t0\t1\t8\t0\t0\t0\t5\t1\t0\t5\t1\t0\t0\t48\t0\t1\t0\t1\t1\t4\t1\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t7\t0\t0\t0\t5\t0\t0\t0\t0\t0\t0\t5\t7\t0\t0\t8\t0\t10\t1\t11\t0\t2\t0\t0\t0\t0\t0\t0\t0\t39\t1\t0\t0\t0\t4\t1\t10\t0\t0\t0\t3\t1\t0\t2\t23\t7\t0\t0\t0\t4\t4\t0\t0\t0\t1\t0\t0\t12\t0\t0\t0\t0\t0\t0\t6\n+ENSDARG00000103057\t0\t0\t1\t0\t0\t0\t0\t1\t5\t0\t0\t0\t0\t4\t16\t4\t0\t0\t0\t22\t12\t0\t3\t0\t0\t0\t2\t3\t0\t1\t0\t0\t20\t0\t0\t6\t0\t0\t0\t1\t2\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t22\t0\t12\t0\t0\t0\t8\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t33\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t2\t0\t1\t1\t0\t3\t1\t0\t1\t0\t0\t1\t26\t1\t0\t0\t21\t0\t0\t0\t0\t0\t1\t0\t0\t11\t0\t0\t0\t0\t0\t0\t1\t1\t0\t0\t0\t13\t0\t0\t0\t2\t0\t0\t0\t1\t0\t0\t13\t2\t0\t0\t0\t0\t43\t2\t2\t0\t1\t0\t0\t0\t1\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t14\t0\t6\t0\t24\t4\t0\t0\t0\t0\t0\t0\t0\t2\t21\t0\t0\t0\t1\t1\t0\t9\t0\t3\t0\t0\t0\t0\t27\n+ENSDARG00000051783\t1\t0\t0\t0\t0\t1\t1\t0\t46\t0\t3\t0\t0\t7\t9\t6\t0\t1\t3\t8\t9\t0\t1\t1\t0\t29\t0\t3\t0\t0\t0\t0\t7\t0\t0\t13\t0\t0\t0\t1\t4\t0\t4\t0\t0\t0\t0\t0\t0\t1\t0\t3\t0\t0\t8\t0\t12\t0\t3\t0\t3\t0\t9\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t3\t0\t0\t0\t1\t19\t0\t0\t0\t0\t0\t3\t0\t1\t0\t2\t0\t0\t1\t0\t0\t5\t0\t0\t0\t1\t0\t0\t5\t4\t0\t0\t35\t0\t0\t0\t2\t0\t1\t0\t0\t3\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t9\t0\t0\t0\t5\t0\t0\t0\t0\t0\t0\t9\t9\t0\t0\t3\t0\t1\t3\t7\t1\t0\t1\t0\t0\t0\t0\t0\t0\t43\t0\t1\t0\t0\t3\t0\t8\t0\t0\t0\t2\t0\t0\t3\t10\t5\t0\t0\t0\t1\t5\t0\t0\t0\t2\t0\t0\t6\t0\t0\t0\t1\t0\t0\t8\n+ENSDARG00000009212\t0\t2\t3\t0\t0\t0\t0\t0\t50\t0\t1\t0\t0\t3\t4\t4\t0\t3\t0\t21\t10\t0\t4\t1\t1\t29\t0\t2\t0\t0\t0\t1\t4\t0\t0\t7\t0\t0\t0\t2\t8\t0\t3\t0\t0\t0\t1\t0\t0\t0\t0\t0\t1\t0\t2\t0\t16\t0\t0\t0\t9\t0\t8\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t12\t3\t0\t0\t0\t0\t3\t1\t0\t0\t1\t0\t1\t3\t2\t0\t5\t0\t0\t1\t2\t0\t0\t7\t0\t0\t0\t18\t0\t0\t1\t0\t1\t0\t0\t0\t2\t0\t0\t0\t0\t0\t0\t0\t2\t0\t0\t0\t11\t0\t0\t0\t5\t0\t0\t0\t0\t0\t1\t4\t10\t0\t1\t4\t0\t10\t4\t11\t0\t6\t0\t0\t1\t1\t0\t0\t0\t24\t1\t0\t0\t1\t6\t1\t9\t0\t2\t0\t9\t1\t0\t1\t7\t2\t0\t0\t0\t4\t3\t3\t0\t0\t2\t2\t0\t5\t0\t1\t0\t1\t1\t0\t10\n+ENSDARG00000021124\t0\t1\t9\t0\t0\t0\t1\t0\t9\t0\t1\t0\t0\t7\t5\t7\t0\t3\t0\t15\t38\t0\t4\t1\t0\t15\t0\t4\t0\t0\t0\t0\t6\t0\t0\t11\t0\t0\t0\t3\t6\t0\t2\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t1\t9\t1\t10\t0\t0\t0\t9\t0\t10\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t21\t1\t0\t0\t1\t0\t0\t0\t0\t0\t4\t1\t0\t1\t0\t2\t3\t0\t1\t0\t3\t0\t0\t28\t2\t0\t0\t25\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t11\t1\t0\t0\t1\t0\t0\t0\t0\t0\t0\t11\t21\t0\t0\t1\t0\t10\t2\t2\t0\t5\t0\t1\t0\t0\t0\t0\t0\t13\t0\t0\t0\t0\t9\t0\t5\t0\t0\t0\t5\t0\t0\t0\t0\t0\t0\t1\t0\t1\t10\t0\t0\t0\t5\t0\t1\t4\t0\t1\t0\t0\t0\t0\t17\n'
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/small.element.custom.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/small.element.custom.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,6 @@
+ cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9
+gene1 1.100000 0 1.129692 -10.100000 1.100000 1.037630 0.000000 0 0.000000
+gene2 0.397940 0 1.159040 1.050428 1.065051 1.070787 1.146779 0 0.000000
+gene3 1.150515 0 1.159040 1.157790 1.049237 1.123798 1.109687 0 1.020180
+gene4 0.000000 0 0.000000 0.000000 0.000000 0.000000 0.000000 0 0.000000
+gene5 1.000000 0 0.000000 -10.000000 1.006008 1.129692 0.000000 0 1.146712
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/small.element.scalerem5.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/small.element.scalerem5.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,6 @@
+ cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9
+gene1 0.00 0 1 4.90 0 1.10 0.00 0 0.00
+gene2 0.50 0 3 4.00 0 1.22 4.35 0 0.00
+gene3 2.00 0 3 3.21 0 1.56 3.45 0 1.05
+gene4 0.00 0 0 0.00 0 0.00 0.00 0 0.00
+gene5 1.00 0 0 0.00 0 1.00 0.00 0 1.90
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/small.fs.colsum.gt10.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/small.fs.colsum.gt10.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,6 @@
+ cell1 cell3 cell4 cell5 cell7
+gene1 10.00 6 -10.10 10 0.00
+gene2 0.50 3 29.00 20 4.35
+gene3 2.00 3 3.21 30 8.45
+gene4 0.00 0 0.00 0 0.00
+gene5 1.00 0 -10.00 440 0.00
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/small.fs.colsum.neq0.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/small.fs.colsum.neq0.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,6 @@
+ cell1 cell3 cell4 cell5 cell6 cell7 cell9
+gene1 10.00 6 -10.10 10 1.10 0.00 0.00
+gene2 0.50 3 29.00 20 1.22 4.35 0.00
+gene3 2.00 3 3.21 30 1.56 8.45 1.05
+gene4 0.00 0 0.00 0 0.00 0.00 0.00
+gene5 1.00 0 -10.00 440 6.00 0.00 1.90
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/small.fs.elemgt2.mm2.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/small.fs.elemgt2.mm2.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,5 @@
+ cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9
+gene1 10.00000 0 6 -10.10000 10 1.10000 0.00000 0 0.00000
+gene2 0.50000 0 3 29.00000 20 1.22000 4.35000 0 0.00000
+gene3 2.00000 0 3 3.21000 30 1.56000 8.45000 0 1.05000
+gene5 1.00000 0 0 -10.00000 440 6.00000 0.00000 0 1.90000
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/small.fs.elemnmatch0.mm4.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/small.fs.elemnmatch0.mm4.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,6 @@
+ cell1 cell4 cell5 cell6 cell7 cell9
+gene1 10.0 -10.1 10 1.1 0.0 0.0
+gene2 0.5 29.0 20 1.22 4.35 0.0
+gene3 2.0 3.21 30 1.56 8.45 1.05
+gene4 0.0 0.0 0 0.0 0.0 0.0
+gene5 1.0 -10.0 440 6.0 0.0 1.9
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/small.fs.medvalcol.ge2.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/small.fs.medvalcol.ge2.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,6 @@
+ cell3 cell5
+gene1 6 10
+gene2 3 20
+gene3 3 30
+gene4 0 0
+gene5 0 440
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/small.fs.rowsum.gt.50.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/small.fs.rowsum.gt.50.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,3 @@
+ cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9
+gene2 0.50 0 3 29.00 20 1.22 4.35 0 0.00
+gene5 1.00 0 0 -10.00 440 6.00 0.00 0 1.90
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/small.fulltable.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/small.fulltable.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,6 @@
+ cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9
+gene1 9.348972 5.043817 -10.251376 9.474774 0.249844 -0.674871 -0.684475
+gene2 -0.151028 2.043817 28.848624 19.474774 0.369844 3.675129 -0.684475
+gene3 1.348972 2.043817 3.058624 29.474774 0.709844 7.775129 0.365525
+gene4 -0.651028 -0.956183 -0.151376 -0.525226 -0.850156 -0.674871 -0.684475
+gene5 0.348972 -0.956183 -10.151376 439.474774 5.149844 -0.674871 1.215525
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/small.matapp.colcust.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/small.matapp.colcust.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,9 @@
+cell1 14.50
+cell2 0.00
+cell3 15.00
+cell4 12.11
+cell5 520.00
+cell6 11.10
+cell7 12.80
+cell8 0.00
+cell9 2.95
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/small.matapp.rowmax.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/small.matapp.rowmax.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,5 @@
+gene1 10
+gene2 29
+gene3 30
+gene4 0
+gene5 440
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/small.multiple.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/small.multiple.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,6 @@
+ cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9
+gene1 23.401197 2.995732 15.258097 -17.907465 23.401197 5.249273 2.995732 2.995732 2.995732
+gene2 4.020425 2.995732 9.135494 61.891820 43.688879 5.494944 11.892532 2.995732 2.995732
+gene3 7.091042 2.995732 9.135494 9.564583 63.912023 6.190840 20.248148 2.995732 5.146901
+gene4 2.995732 2.995732 2.995732 2.995732 2.995732 2.995732 2.995732 2.995732 2.995732
+gene5 5.044522 2.995732 2.995732 -17.697415 886.131226 15.258097 2.995732 2.995732 6.886487
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/small.select.colsonly.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/small.select.colsonly.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,6 @@
+ cell2 cell3 cell4 cell2 cell2
+gene1 0 6 -10.10 0 0
+gene2 0 3 29.00 0 0
+gene3 0 3 3.21 0 0
+gene4 0 0 0.00 0 0
+gene5 0 0 -10.00 0 0
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/small.select.rowsonly.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/small.select.rowsonly.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,5 @@
+ cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9
+gene2 0.50 0 3 29.00 20 1.22 4.35 0 0.00
+gene3 2.00 0 3 3.21 30 1.56 8.45 0 1.05
+gene4 0.00 0 0 0.00 0 0.00 0.00 0 0.00
+gene5 1.00 0 0 -10.00 440 6.00 0.00 0 1.90
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/small.select.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/small.select.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,5 @@
+ cell2 cell3 cell4 cell2 cell2
+gene2 0 3 29.00 0 0
+gene3 0 3 3.21 0 0
+gene4 0 0 0.00 0 0
+gene5 0 0 -10.00 0 0
b
diff -r 000000000000 -r 1b0f96ed73f2 test-data/small.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/small.tsv Sat Aug 17 16:25:37 2019 -0400
b
@@ -0,0 +1,6 @@
+ cell1 cell2 cell3 cell4 cell5 cell6 cell7 cell8 cell9
+gene1 10 0 6 -10.1 10 1.1 0 0 0
+gene2 0.5 0 3 29 20 1.22 4.35 0 0
+gene3 2 0 3 3.21 30 1.56 8.45 0 1.05
+gene4 0 0 0 0 0 0 0 0 0
+gene5 1 0 0 -10 440 6 0 0 1.9