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

Changeset 0:4cd9f0008d9c (2019-06-04)
Next changeset 1:cfe1e6c28d95 (2019-08-26)
Commit message:
planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/dropletutils/ commit e66ab3d4fc0c1a72523e8f93447cc07cdd6816b7
added:
dropletutils.xml
scripts/dropletutils.Rscript
scripts/generateTestData.Rscript
test-data/defs_barcoderankings.png
test-data/defs_defaultdrops.h5ad
test-data/defs_emptydrops_150_0002.h5ad
test-data/defs_emptydrops_150_0002.png
test-data/defs_emptydrops_150_0002a.h5ad
test-data/defs_emptydrops_150_0002a.png
test-data/in_barcodes.tsv
test-data/in_genes.tsv
test-data/in_matrix.h5ad
test-data/in_matrix.mtx
test-data/in_matrix.tsv
b
diff -r 000000000000 -r 4cd9f0008d9c dropletutils.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dropletutils.xml Tue Jun 04 17:19:52 2019 -0400
[
b'@@ -0,0 +1,310 @@\n+<?xml version="1.0" encoding="utf-8"?>\n+<tool id="dropletutils" name="DropletUtils" version="@PACKAGE_VERSION@+@GALAXY_VERSION@" >\n+    <description>Utilities for handling droplet-based single-cell RNA-seq data</description>\n+    <macros>\n+        <token name="@PACKAGE_VERSION@" >1.2.1</token>\n+        <token name="@GALAXY_VERSION@" >1</token>\n+        <token name="@TXIN@">tenx.input</token>\n+        <token name="@TXOUT@">tenx.output</token>\n+        <xml name="test_dirin" >\n+            <conditional name="tenx_format">\n+                <param name="use" value="directory" />\n+                <param name="input" value="in_matrix.mtx" />\n+                <param name="input_genes" value="in_genes.tsv" />\n+                <param name="input_barcodes" value="in_barcodes.tsv" />\n+            </conditional>\n+        </xml>\n+    </macros>\n+    <requirements>\n+        <requirement type="package" version="@PACKAGE_VERSION@">bioconductor-dropletutils</requirement>\n+        <requirement type="package" version="1.2_17" >r-matrix</requirement>\n+    </requirements>\n+    <version_command><![CDATA[\n+    Rscript -e \'packageVersion("DropletUtils")\' | grep -oP \'\\d\\.\\d\\.\\d\'\n+    ]]>\n+    </version_command>\n+    <command detect_errors=\'exit_code\'><![CDATA[\n+#if str($tenx_format.use) == \'directory\':\n+    mkdir \'@TXIN@\' &&\n+    ln -s \'$tenx_format.input\' \'@TXIN@/matrix.mtx\' &&\n+    ln -s \'$tenx_format.input_genes\' \'@TXIN@/genes.tsv\' &&\n+    ln -s \'$tenx_format.input_barcodes\' \'@TXIN@/barcodes.tsv\' &&\n+#end if\n+\n+#if str($operation.use) == \'filter\':\n+    #if str($operation.outformat) == \'directory\':\n+    mkdir \'@TXOUT@\' &&\n+    #end if\n+#end if\n+\n+Rscript \'$__tool_directory__/scripts/dropletutils.Rscript\' \'$droplet_conf\'\n+    ]]>\n+    </command>\n+    <configfiles>\n+        <configfile name="droplet_conf" >\n+## defaults\n+empty.fdr_threshold = 0.01\n+eparams=formals(emptyDrops)\n+dparams=formals(defaultDrops)\n+bparams=formals(barcodeRanks)\n+\n+## File params\n+in.type=\'$tenx_format.use\'\n+out.type=NULL\n+\n+files=list()\n+files\\$table=\'$table\'\n+files\\$plot=\'$plot\'\n+files\\$out=NULL\n+\n+#if str($tenx_format.use) == \'directory\':\n+files\\$infile=\'@TXIN@\'\n+#else\n+files\\$infile=\'$input\'\n+#end if\n+\n+#if str($operation.use) == \'filter\':\n+    #if str($operation.method.use) == \'defaultdrops\':\n+do.method="defaultDrops"\n+dparams\\$expected=as.integer(\'$operation.method.expected\')\n+dparams\\$upper.quant=as.numeric(\'$operation.method.upperquant\')\n+dparams\\$lower.prop=as.numeric(\'$operation.method.lowerprop\')\n+    #else if str($operation.method.use) == \'emptydrops\':\n+do.method="emptyDrops"\n+eparams\\$lower=as.integer(\'$operation.method.lower\')\n+empty.fdr_threshold=as.numeric(\'$operation.method.fdr_thresh\')\n+    #end if\n+\n+out.type=\'$operation.outformat\'\n+    #if str($operation.outformat) == \'directory\':\n+files\\$out=\'@TXOUT@\'\n+    #else if str($operation.outformat) == \'h5ad\':\n+files\\$out=\'$fileout_h5ad\'\n+    #else if str($operation.outformat) == \'tsv\':\n+files\\$out=\'$fileout_tsv\'\n+    #end if\n+\n+#else if str($operation.use) == \'barcode_rank\':\n+do.method="barcodeRankings"\n+bparams\\$lower=as.integer(\'$operation.lower\')\n+#end if\n+\n+seed.val=as.integer(\'$seed\')\n+\n+        </configfile>\n+    </configfiles>\n+    <inputs>\n+        <conditional name="tenx_format">\n+            <param name="use" type="select" label="Format for the input matrix">\n+                <option value="directory" >Bundled (barcodes.tsv, genes.tsv, matrix.mtx)</option>\n+                <option value="h5ad" selected="true" >AnnData/H5</option>\n+                <option value="tsv">Tabular</option>\n+            </param>\n+            <when value="directory">\n+                <param name="input" type="data" format="mtx,txt" label="Count Data"/>\n+                <param name="input_genes" type="data" format="tabular,tsv,txt" label="Genes List"/>\n+                <param name="input_barcodes" type="data" format="tabular,tsv,txt" label="Barcodes List"/>\n+            </when>\n+            <when value="h5ad">\n+'..b'output name="table" >\n+                <assert_contents>\n+                    <has_n_columns n="9" />\n+                    <has_line_matching expression="^\\sbar.names\\sTotal\\sLogProb\\sPValue\\sLimited\\sFDR\\sis.Cell\\sis.CellAndLimited" />\n+                    <has_line_matching expression="^1\\sGGAAGAAGAA\\s20\\sNA\\sNA\\sNA\\sNA\\sNA\\sNA" />\n+                    <has_line_matching expression="^11100\\sGCTGAAGCAA\\s203\\s-222.833111872316\\s9.99900009999e-05\\sTRUE\\s0.000126279506880773\\sTRUE\\sTRUE" />\n+                </assert_contents>\n+            </output>\n+            <output name="plot" value="defs_emptydrops_150_0002a.png" compare="sim_size" delta="100" />\n+        </test>\n+        <!-- Output a directory -->\n+        <test expect_num_outputs="3">\n+            <conditional name="tenx_format" >\n+                <param name="use" value="tsv" />\n+                <param name="input" value="in_matrix.tsv" />\n+            </conditional>\n+            <conditional name="operation">\n+                <param name="use" value="filter" />\n+                <param name="outformat" value="directory" />\n+                <conditional name="method">\n+                    <param name="use" value="defaultdrops" />\n+                    <param name="expected" value="2000" />\n+                    <param name="upperquant" value="0.85" />\n+                    <param name="lowerpopr" value="0.2" />\n+                </conditional>\n+            </conditional>\n+            <output name="genes_out" file="in_genes.tsv" ftype="tsv" /><!-- same as the input in this case -->\n+            <output name="barcodes_out" ftype="tsv" >\n+                <assert_contents>\n+                    <has_n_columns n="1" />\n+                    <has_line line="GGAAGAAGAA" />\n+                    <has_line line="TCGAATGGAA" />\n+                </assert_contents>\n+            </output>\n+            <output name="matrix_out" ftype="mtx" >\n+                <assert_contents>\n+                    <has_line_matching expression="^100\\s2650\\s64072$" />\n+                    <has_line_matching expression="^19\\s1\\s1$" />\n+                    <has_line_matching expression="^100\\s2650\\s1$" />\n+                </assert_contents>\n+            </output>\n+        </test>\n+    </tests>\n+    <help><![CDATA[\n+Utilities to process 10X data in a variety of formats. Methods include:\n+\n+*Filter data:*\n+\n+* **DefaultDrops** emulates the native 10X method to produce a filtered count matrix\n+* **EmptyDrops** is a more informative quantile-based approach to produce a filtered count matrix.\n+\n+*Metrics:*\n+\n+* **RankBarcodes** produces a gap statistic plot to estimate the number of barcodes detected in the sample matrix.\n+\n+*Background*\n+\n+Droplet-based single-cell RNA sequencing (scRNA-seq) technologies allow researchers to obtain transcriptome-wide expression profiles for thousands of cells at once. Briefly, each cell is encapsulated in a droplet in a oil-water emulsion, along with a bead containing reverse transcription primers with a unique barcode sequence. After reverse transcription inside the droplet, each cell\xe2\x80\x99s cDNA is labelled with that barcode (referred to a \xe2\x80\x9ccell barcode\xe2\x80\x9d). Bursting of the droplets yields a pool of cDNA for library preparation and sequencing. Debarcoding of the sequences can then be performed to obtain the expression profile for each cell.\n+\n+This tool implements some general utilities for handling these data after quantification of expression. In particular, we focus on the 10X Genomics platform, providing functions to load in the matrix of unique molecule identifier (UMI) counts as well as the raw molecule information. Functions are also available for downsampling the UMI count matrix or the raw reads; for distinguishing cells from empty droplets, based on the UMI counts; and to eliminate the effects of barcode swapping on Illumina 4000 sequencing machine.\n+]]></help>\n+    <citations>\n+        <citation type="doi">10.1186/s13059-019-1662-y</citation>\n+    </citations>\n+</tool>\n'
b
diff -r 000000000000 -r 4cd9f0008d9c scripts/dropletutils.Rscript
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/dropletutils.Rscript Tue Jun 04 17:19:52 2019 -0400
[
@@ -0,0 +1,137 @@
+## Load in data
+args = commandArgs(trailingOnly = T)
+if (length(args) != 1){
+    stop("Please provide the config file")
+}
+
+suppressWarnings(suppressPackageStartupMessages(require(DropletUtils)))
+suppressWarnings(suppressPackageStartupMessages(require(Matrix)))
+
+source(args[1])
+
+## Helper functions
+setSparse <- function(obj){
+    return(as(obj, "dgCMatrix"))
+}
+
+writeTSV <- function(fileout, obj){
+    write.table(as.matrix(obj), file=fileout, col.names=NA, sep='\t', quote=FALSE)
+}
+
+writeOut <- function(counts, fileout, typeout){
+    if (typeout == "tsv"){
+        writeTSV(fileout, counts)
+    }
+    else if (typeout == "h5ad"){
+        write10xCounts(fileout, counts, type="HDF5", overwrite=TRUE)
+    }
+    else if (typeout == "directory"){
+        write10xCounts(fileout, counts, type="sparse", overwrite=TRUE)
+    }
+}
+
+
+read10xFiles <- function(filein, typein){
+    sce <- NULL
+    if (typein == "tsv"){
+        dat <- read.table(filein, header = TRUE,  sep='\t', stringsAsFactors=FALSE, quote="", row.names=1)
+        sce <- SingleCellExperiment(assays = list(counts = as.matrix(dat)))
+    }
+    else if (typein == "h5ad"){
+        sce <- read10xCounts(filein, col.names=T, type="HDF5")   # use barcodes.tsv as column names
+    }
+    else if (typein == "directory"){
+        sce <- read10xCounts(filein, col.names=T, type="sparse")
+    }
+    counts(sce) <- setSparse(counts(sce))
+    return(sce)
+}
+
+
+## Methods
+
+
+doEmptyDrops <- function(files, eparams, in.type="directory", out.type="h5ad", fdr_threshold = 0.01){
+    sce <- read10xFiles(files$infile, in.type)
+
+    eparams$... <- NULL ## hack
+    eparams$m = Matrix(counts(sce), sparse=TRUE)
+    
+    e.out <- do.call(emptyDrops, c(eparams))
+    
+    bar.names <- colnames(sce)
+    if (length(bar.names) != nrow(e.out)){    
+        stop("Length of barcodes and output metrics don't match.")
+    }
+    e.out <- cbind(bar.names, e.out)
+    e.out$is.Cell <- e.out$FDR <= fdr_threshold
+    e.out$is.CellAndLimited <- e.out$is.Cell & e.out$Limited
+    
+    # Write to table
+    writeTSV(files$table, e.out)
+    
+    # Print to log
+    print(table(Limited=e.out$Limited, Significant=e.out$is.Cell))
+    
+    # Write to Plot
+    png(files$plot)
+    plot(e.out$Total, -e.out$LogProb, col=ifelse(e.out$is.Cell, "red", "black"),
+    xlab="Total UMI count", ylab="-Log Probability")
+    dev.off()
+    
+    # Filtered
+    called <- e.out$is.CellAndLimited
+    called[is.na(called)] <- FALSE    # replace NA's with FALSE
+    sce.filtered <- sce[,called]
+    
+    writeOut(counts(sce.filtered), files$out, out.type)
+}
+
+
+doDefaultDrops <- function(files, dparams, in.type="directory", out.type="h5ad"){
+    sce <- read10xFiles(files$infile, in.type)
+
+    dparams$m = as.matrix(counts(sce))
+    called <- do.call(defaultDrops, c(dparams))
+    print(table(called))
+        
+    # Filtered
+    sce.filtered <- sce[,called]
+    
+    writeOut(Matrix(counts(sce.filtered),sparse=TRUE), files$out, out.type)
+}
+
+
+doBarcodeRankings <- function(files, bparams, in.type="directory"){
+    sce <- read10xFiles(files$infile, in.type)
+
+    bparams$... <- NULL ## hack
+    bparams$m = as.matrix(counts(sce))
+
+    br.out <- do.call(barcodeRanks, c(bparams))
+    
+    png(files$plot)
+    plot(br.out$rank, br.out$total, log="xy", xlab="(log) Rank", ylab="(log) Total Number of Barcodes")
+    o <- order(br.out$rank)
+    lines(br.out$rank[o], br.out$fitted[o], col="red")
+
+    abline(h=br.out$knee, col="dodgerblue", lty=2)
+    abline(h=br.out$inflection, col="forestgreen", lty=2)
+    legend("bottomleft", lty=2, col=c("dodgerblue", "forestgreen"), legend=c("knee", "inflection"))
+    dev.off()
+    
+    print(paste("knee =", br.out$knee, ", inflection = ", br.out$inflection))
+}
+
+## Main
+set.seed(seed.val)
+
+if (do.method == "barcodeRankings") {
+    doBarcodeRankings(files, bparams, in.type)
+
+} else if (do.method == "defaultDrops") {
+    doDefaultDrops(files, dparams, in.type, out.type)
+
+} else if (do.method == "emptyDrops") {
+    doEmptyDrops(files, eparams, in.type, out.type, empty.fdr_threshold)
+}
b
diff -r 000000000000 -r 4cd9f0008d9c scripts/generateTestData.Rscript
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/generateTestData.Rscript Tue Jun 04 17:19:52 2019 -0400
[
@@ -0,0 +1,38 @@
+##
+## conda install bioconductor-dropletutils bioconductor-dnabarcodes
+##
+
+suppressWarnings(suppressPackageStartupMessages(library(DropletUtils)))
+suppressWarnings(suppressPackageStartupMessages(library(DNABarcodes)))
+library(Matrix)
+
+## Matrix with no column barcodes
+set.seed(100)
+##my.counts <- DropletUtils:::simCounts()
+my.counts <- DropletUtils:::simCounts(large.rate=0.01, nlarge=500, nsmall=50, nempty=500)
+
+## Generate barcodes (size=10, edit=3) and set as headers
+barcodes <- create.pool(10)
+colnames(my.counts) <- barcodes[1:ncol(my.counts)]
+
+sce <- SingleCellExperiment(assays = list(counts = as.matrix(my.counts)))
+
+writeTSV <- function(fileout, obj){
+    write.table(as.matrix(obj), file=fileout, col.names=NA, sep='\t', quote=FALSE)
+}
+
+writeOut <- function(counts, fileout, typeout){
+    if (typeout == "tsv"){
+        writeTSV(fileout, counts)
+    }
+    else if (typeout == "h5ad"){
+        write10xCounts(fileout, counts, type="HDF5", overwrite=TRUE)
+    }
+    else if (typeout == "directory"){
+        write10xCounts(fileout, Matrix(counts), type="sparse", overwrite=TRUE)
+    }
+}
+
+writeOut(Matrix(counts(sce)), "test-data", type="directory")
+writeOut(counts(sce), "test-data.h5ad", type="h5ad")
+writeOut(counts(sce), "test-data.tsv", type="tsv")
b
diff -r 000000000000 -r 4cd9f0008d9c test-data/defs_barcoderankings.png
b
Binary file test-data/defs_barcoderankings.png has changed
b
diff -r 000000000000 -r 4cd9f0008d9c test-data/defs_defaultdrops.h5ad
b
Binary file test-data/defs_defaultdrops.h5ad has changed
b
diff -r 000000000000 -r 4cd9f0008d9c test-data/defs_emptydrops_150_0002.h5ad
b
Binary file test-data/defs_emptydrops_150_0002.h5ad has changed
b
diff -r 000000000000 -r 4cd9f0008d9c test-data/defs_emptydrops_150_0002.png
b
Binary file test-data/defs_emptydrops_150_0002.png has changed
b
diff -r 000000000000 -r 4cd9f0008d9c test-data/defs_emptydrops_150_0002a.h5ad
b
Binary file test-data/defs_emptydrops_150_0002a.h5ad has changed
b
diff -r 000000000000 -r 4cd9f0008d9c test-data/defs_emptydrops_150_0002a.png
b
Binary file test-data/defs_emptydrops_150_0002a.png has changed
b
diff -r 000000000000 -r 4cd9f0008d9c test-data/in_barcodes.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/in_barcodes.tsv Tue Jun 04 17:19:52 2019 -0400
b
b'@@ -0,0 +1,11100 @@\n+GGAAGAAGAA\n+CGAAGAAGAA\n+GCAAGAAGAA\n+CCAAGAAGAA\n+GAGAGAAGAA\n+CAGAGAAGAA\n+AGGAGAAGAA\n+CGGAGAAGAA\n+TGGAGAAGAA\n+ACGAGAAGAA\n+GCGAGAAGAA\n+CCGAGAAGAA\n+TCGAGAAGAA\n+GTGAGAAGAA\n+CTGAGAAGAA\n+GACAGAAGAA\n+CACAGAAGAA\n+AGCAGAAGAA\n+GGCAGAAGAA\n+CGCAGAAGAA\n+TGCAGAAGAA\n+ACCAGAAGAA\n+GCCAGAAGAA\n+TCCAGAAGAA\n+GTCAGAAGAA\n+CTCAGAAGAA\n+GGTAGAAGAA\n+CGTAGAAGAA\n+GCTAGAAGAA\n+CCTAGAAGAA\n+GAAGGAAGAA\n+CAAGGAAGAA\n+AGAGGAAGAA\n+GGAGGAAGAA\n+CGAGGAAGAA\n+TGAGGAAGAA\n+ACAGGAAGAA\n+GCAGGAAGAA\n+CCAGGAAGAA\n+TCAGGAAGAA\n+GTAGGAAGAA\n+CTAGGAAGAA\n+AACGGAAGAA\n+GACGGAAGAA\n+CACGGAAGAA\n+TACGGAAGAA\n+AGCGGAAGAA\n+GGCGGAAGAA\n+CGCGGAAGAA\n+TGCGGAAGAA\n+ACCGGAAGAA\n+GCCGGAAGAA\n+TCCGGAAGAA\n+ATCGGAAGAA\n+GTCGGAAGAA\n+CTCGGAAGAA\n+TTCGGAAGAA\n+GATGGAAGAA\n+CATGGAAGAA\n+AGTGGAAGAA\n+GGTGGAAGAA\n+CGTGGAAGAA\n+TGTGGAAGAA\n+ACTGGAAGAA\n+GCTGGAAGAA\n+CCTGGAAGAA\n+TCTGGAAGAA\n+GTTGGAAGAA\n+CTTGGAAGAA\n+GAACGAAGAA\n+CAACGAAGAA\n+AGACGAAGAA\n+GGACGAAGAA\n+CGACGAAGAA\n+TGACGAAGAA\n+ACACGAAGAA\n+GCACGAAGAA\n+CCACGAAGAA\n+TCACGAAGAA\n+GTACGAAGAA\n+CTACGAAGAA\n+AAGCGAAGAA\n+GAGCGAAGAA\n+CAGCGAAGAA\n+TAGCGAAGAA\n+AGGCGAAGAA\n+CGGCGAAGAA\n+TGGCGAAGAA\n+ACGCGAAGAA\n+GCGCGAAGAA\n+CCGCGAAGAA\n+TCGCGAAGAA\n+ATGCGAAGAA\n+GTGCGAAGAA\n+CTGCGAAGAA\n+TTGCGAAGAA\n+AACCGAAGAA\n+GACCGAAGAA\n+CACCGAAGAA\n+TACCGAAGAA\n+AGCCGAAGAA\n+GGCCGAAGAA\n+CGCCGAAGAA\n+TGCCGAAGAA\n+ATCCGAAGAA\n+GTCCGAAGAA\n+CTCCGAAGAA\n+TTCCGAAGAA\n+GATCGAAGAA\n+CATCGAAGAA\n+AGTCGAAGAA\n+GGTCGAAGAA\n+CGTCGAAGAA\n+TGTCGAAGAA\n+ACTCGAAGAA\n+GCTCGAAGAA\n+CCTCGAAGAA\n+TCTCGAAGAA\n+GTTCGAAGAA\n+CTTCGAAGAA\n+GGATGAAGAA\n+CGATGAAGAA\n+GCATGAAGAA\n+CCATGAAGAA\n+GAGTGAAGAA\n+CAGTGAAGAA\n+AGGTGAAGAA\n+CGGTGAAGAA\n+TGGTGAAGAA\n+ACGTGAAGAA\n+GCGTGAAGAA\n+CCGTGAAGAA\n+TCGTGAAGAA\n+GTGTGAAGAA\n+CTGTGAAGAA\n+GACTGAAGAA\n+CACTGAAGAA\n+AGCTGAAGAA\n+GGCTGAAGAA\n+CGCTGAAGAA\n+TGCTGAAGAA\n+ACCTGAAGAA\n+GCCTGAAGAA\n+TCCTGAAGAA\n+GTCTGAAGAA\n+CTCTGAAGAA\n+GGTTGAAGAA\n+CGTTGAAGAA\n+GCTTGAAGAA\n+CCTTGAAGAA\n+GGAACAAGAA\n+CGAACAAGAA\n+GCAACAAGAA\n+CCAACAAGAA\n+GAGACAAGAA\n+CAGACAAGAA\n+AGGACAAGAA\n+CGGACAAGAA\n+TGGACAAGAA\n+ACGACAAGAA\n+GCGACAAGAA\n+CCGACAAGAA\n+TCGACAAGAA\n+GTGACAAGAA\n+CTGACAAGAA\n+GACACAAGAA\n+CACACAAGAA\n+AGCACAAGAA\n+GGCACAAGAA\n+CGCACAAGAA\n+TGCACAAGAA\n+ACCACAAGAA\n+GCCACAAGAA\n+TCCACAAGAA\n+GTCACAAGAA\n+CTCACAAGAA\n+GGTACAAGAA\n+CGTACAAGAA\n+GCTACAAGAA\n+CCTACAAGAA\n+GAAGCAAGAA\n+CAAGCAAGAA\n+AGAGCAAGAA\n+GGAGCAAGAA\n+CGAGCAAGAA\n+TGAGCAAGAA\n+ACAGCAAGAA\n+GCAGCAAGAA\n+CCAGCAAGAA\n+TCAGCAAGAA\n+GTAGCAAGAA\n+CTAGCAAGAA\n+AAGGCAAGAA\n+GAGGCAAGAA\n+CAGGCAAGAA\n+TAGGCAAGAA\n+ACGGCAAGAA\n+GCGGCAAGAA\n+CCGGCAAGAA\n+TCGGCAAGAA\n+ATGGCAAGAA\n+GTGGCAAGAA\n+CTGGCAAGAA\n+TTGGCAAGAA\n+AACGCAAGAA\n+GACGCAAGAA\n+CACGCAAGAA\n+TACGCAAGAA\n+AGCGCAAGAA\n+GGCGCAAGAA\n+CGCGCAAGAA\n+TGCGCAAGAA\n+ACCGCAAGAA\n+GCCGCAAGAA\n+TCCGCAAGAA\n+ATCGCAAGAA\n+GTCGCAAGAA\n+CTCGCAAGAA\n+TTCGCAAGAA\n+GATGCAAGAA\n+CATGCAAGAA\n+AGTGCAAGAA\n+GGTGCAAGAA\n+CGTGCAAGAA\n+TGTGCAAGAA\n+ACTGCAAGAA\n+GCTGCAAGAA\n+CCTGCAAGAA\n+TCTGCAAGAA\n+GTTGCAAGAA\n+CTTGCAAGAA\n+GAACCAAGAA\n+CAACCAAGAA\n+AGACCAAGAA\n+GGACCAAGAA\n+CGACCAAGAA\n+TGACCAAGAA\n+ACACCAAGAA\n+GCACCAAGAA\n+CCACCAAGAA\n+TCACCAAGAA\n+GTACCAAGAA\n+CTACCAAGAA\n+AAGCCAAGAA\n+GAGCCAAGAA\n+CAGCCAAGAA\n+TAGCCAAGAA\n+AGGCCAAGAA\n+CGGCCAAGAA\n+TGGCCAAGAA\n+ACGCCAAGAA\n+GCGCCAAGAA\n+CCGCCAAGAA\n+TCGCCAAGAA\n+ATGCCAAGAA\n+GTGCCAAGAA\n+CTGCCAAGAA\n+TTGCCAAGAA\n+GATCCAAGAA\n+CATCCAAGAA\n+AGTCCAAGAA\n+GGTCCAAGAA\n+CGTCCAAGAA\n+TGTCCAAGAA\n+ACTCCAAGAA\n+GCTCCAAGAA\n+CCTCCAAGAA\n+TCTCCAAGAA\n+GTTCCAAGAA\n+CTTCCAAGAA\n+GGATCAAGAA\n+CGATCAAGAA\n+GCATCAAGAA\n+CCATCAAGAA\n+GAGTCAAGAA\n+CAGTCAAGAA\n+AGGTCAAGAA\n+CGGTCAAGAA\n+TGGTCAAGAA\n+ACGTCAAGAA\n+GCGTCAAGAA\n+CCGTCAAGAA\n+TCGTCAAGAA\n+GTGTCAAGAA\n+CTGTCAAGAA\n+GACTCAAGAA\n+CACTCAAGAA\n+AGCTCAAGAA\n+GGCTCAAGAA\n+CGCTCAAGAA\n+TGCTCAAGAA\n+ACCTCAAGAA\n+GCCTCAAGAA\n+TCCTCAAGAA\n+GTCTCAAGAA\n+CTCTCAAGAA\n+GGTTCAAGAA\n+CGTTCAAGAA\n+GCTTCAAGAA\n+CCTTCAAGAA\n+CGGATAAGAA\n+GCGATAAGAA\n+CCGATAAGAA\n+GGCATAAGAA\n+CGCATAAGAA\n+GCCATAAGAA\n+GGAGTAAGAA\n+CGAGTAAGAA\n+GCAGTAAGAA\n+CCAGTAAGAA\n+GAGGTAAGAA\n+CAGGTAAGAA\n+ACGGTAAGAA\n+GCGGTAAGAA\n+CCGGTAAGAA\n+TCGGTAAGAA\n+GTGGTAAGAA\n+CTGGTAAGAA\n+GACGTAAGAA\n+CACGTAAGAA\n+AGCGTAAGAA\n+GGCGTAAGAA\n+CGCGTAAGAA\n+TGCGTAAGAA\n+ACCGTAAGAA\n+GCCGTAAGAA\n+TCCGTAAGAA\n+GTCGTAAGAA\n+CTCGTAAGAA\n+GGTGTAAGAA\n+CGTGTAAGAA\n+GCTGTA'..b'AA\n+TGACGTACAA\n+ACACGTACAA\n+GCACGTACAA\n+CCACGTACAA\n+TCACGTACAA\n+GTACGTACAA\n+CTACGTACAA\n+AAGCGTACAA\n+GAGCGTACAA\n+CAGCGTACAA\n+TAGCGTACAA\n+AGGCGTACAA\n+CGGCGTACAA\n+TGGCGTACAA\n+ACGCGTACAA\n+GCGCGTACAA\n+CCGCGTACAA\n+TCGCGTACAA\n+ATGCGTACAA\n+GTGCGTACAA\n+CTGCGTACAA\n+TTGCGTACAA\n+AACCGTACAA\n+GACCGTACAA\n+CACCGTACAA\n+TACCGTACAA\n+AGCCGTACAA\n+GGCCGTACAA\n+CGCCGTACAA\n+TGCCGTACAA\n+ATCCGTACAA\n+GTCCGTACAA\n+CTCCGTACAA\n+TTCCGTACAA\n+GATCGTACAA\n+CATCGTACAA\n+AGTCGTACAA\n+GGTCGTACAA\n+CGTCGTACAA\n+TGTCGTACAA\n+ACTCGTACAA\n+GCTCGTACAA\n+CCTCGTACAA\n+TCTCGTACAA\n+GTTCGTACAA\n+CTTCGTACAA\n+GGATGTACAA\n+CGATGTACAA\n+GCATGTACAA\n+CCATGTACAA\n+GAGTGTACAA\n+CAGTGTACAA\n+AGGTGTACAA\n+CGGTGTACAA\n+TGGTGTACAA\n+ACGTGTACAA\n+GCGTGTACAA\n+CCGTGTACAA\n+TCGTGTACAA\n+GTGTGTACAA\n+CTGTGTACAA\n+GACTGTACAA\n+CACTGTACAA\n+AGCTGTACAA\n+GGCTGTACAA\n+CGCTGTACAA\n+TGCTGTACAA\n+ACCTGTACAA\n+GCCTGTACAA\n+TCCTGTACAA\n+GTCTGTACAA\n+CTCTGTACAA\n+GGTTGTACAA\n+CGTTGTACAA\n+GCTTGTACAA\n+CCTTGTACAA\n+GGAACTACAA\n+CGAACTACAA\n+GCAACTACAA\n+CCAACTACAA\n+GAGACTACAA\n+CAGACTACAA\n+AGGACTACAA\n+CGGACTACAA\n+TGGACTACAA\n+ACGACTACAA\n+GCGACTACAA\n+CCGACTACAA\n+TCGACTACAA\n+GTGACTACAA\n+CTGACTACAA\n+GACACTACAA\n+CACACTACAA\n+AGCACTACAA\n+GGCACTACAA\n+CGCACTACAA\n+TGCACTACAA\n+ACCACTACAA\n+GCCACTACAA\n+TCCACTACAA\n+GTCACTACAA\n+CTCACTACAA\n+GGTACTACAA\n+CGTACTACAA\n+GCTACTACAA\n+CCTACTACAA\n+GAAGCTACAA\n+CAAGCTACAA\n+AGAGCTACAA\n+GGAGCTACAA\n+CGAGCTACAA\n+TGAGCTACAA\n+ACAGCTACAA\n+GCAGCTACAA\n+CCAGCTACAA\n+TCAGCTACAA\n+GTAGCTACAA\n+CTAGCTACAA\n+AAGGCTACAA\n+GAGGCTACAA\n+CAGGCTACAA\n+TAGGCTACAA\n+ACGGCTACAA\n+GCGGCTACAA\n+CCGGCTACAA\n+TCGGCTACAA\n+ATGGCTACAA\n+GTGGCTACAA\n+CTGGCTACAA\n+TTGGCTACAA\n+AACGCTACAA\n+GACGCTACAA\n+CACGCTACAA\n+TACGCTACAA\n+AGCGCTACAA\n+GGCGCTACAA\n+CGCGCTACAA\n+TGCGCTACAA\n+ACCGCTACAA\n+GCCGCTACAA\n+TCCGCTACAA\n+ATCGCTACAA\n+GTCGCTACAA\n+CTCGCTACAA\n+TTCGCTACAA\n+GATGCTACAA\n+CATGCTACAA\n+AGTGCTACAA\n+GGTGCTACAA\n+CGTGCTACAA\n+TGTGCTACAA\n+ACTGCTACAA\n+GCTGCTACAA\n+CCTGCTACAA\n+TCTGCTACAA\n+GTTGCTACAA\n+CTTGCTACAA\n+GAACCTACAA\n+CAACCTACAA\n+AGACCTACAA\n+GGACCTACAA\n+CGACCTACAA\n+TGACCTACAA\n+ACACCTACAA\n+GCACCTACAA\n+CCACCTACAA\n+TCACCTACAA\n+GTACCTACAA\n+CTACCTACAA\n+AAGCCTACAA\n+GAGCCTACAA\n+CAGCCTACAA\n+TAGCCTACAA\n+AGGCCTACAA\n+CGGCCTACAA\n+TGGCCTACAA\n+ACGCCTACAA\n+GCGCCTACAA\n+CCGCCTACAA\n+TCGCCTACAA\n+ATGCCTACAA\n+GTGCCTACAA\n+CTGCCTACAA\n+TTGCCTACAA\n+GATCCTACAA\n+CATCCTACAA\n+AGTCCTACAA\n+GGTCCTACAA\n+CGTCCTACAA\n+TGTCCTACAA\n+ACTCCTACAA\n+GCTCCTACAA\n+CCTCCTACAA\n+TCTCCTACAA\n+GTTCCTACAA\n+CTTCCTACAA\n+GGATCTACAA\n+CGATCTACAA\n+GCATCTACAA\n+CCATCTACAA\n+GAGTCTACAA\n+CAGTCTACAA\n+AGGTCTACAA\n+CGGTCTACAA\n+TGGTCTACAA\n+ACGTCTACAA\n+GCGTCTACAA\n+CCGTCTACAA\n+TCGTCTACAA\n+GTGTCTACAA\n+CTGTCTACAA\n+GACTCTACAA\n+CACTCTACAA\n+AGCTCTACAA\n+GGCTCTACAA\n+CGCTCTACAA\n+TGCTCTACAA\n+ACCTCTACAA\n+GCCTCTACAA\n+TCCTCTACAA\n+GTCTCTACAA\n+CTCTCTACAA\n+GGTTCTACAA\n+CGTTCTACAA\n+GCTTCTACAA\n+CCTTCTACAA\n+CGGATTACAA\n+GCGATTACAA\n+CCGATTACAA\n+GGCATTACAA\n+CGCATTACAA\n+GCCATTACAA\n+GGAGTTACAA\n+CGAGTTACAA\n+GCAGTTACAA\n+CCAGTTACAA\n+GAGGTTACAA\n+CAGGTTACAA\n+ACGGTTACAA\n+GCGGTTACAA\n+CCGGTTACAA\n+TCGGTTACAA\n+GTGGTTACAA\n+CTGGTTACAA\n+GACGTTACAA\n+CACGTTACAA\n+AGCGTTACAA\n+GGCGTTACAA\n+CGCGTTACAA\n+TGCGTTACAA\n+ACCGTTACAA\n+GCCGTTACAA\n+TCCGTTACAA\n+GTCGTTACAA\n+CTCGTTACAA\n+GGTGTTACAA\n+CGTGTTACAA\n+GCTGTTACAA\n+CCTGTTACAA\n+GGACTTACAA\n+CGACTTACAA\n+GCACTTACAA\n+CCACTTACAA\n+GAGCTTACAA\n+CAGCTTACAA\n+AGGCTTACAA\n+CGGCTTACAA\n+TGGCTTACAA\n+ACGCTTACAA\n+GCGCTTACAA\n+CCGCTTACAA\n+TCGCTTACAA\n+GTGCTTACAA\n+CTGCTTACAA\n+GACCTTACAA\n+CACCTTACAA\n+AGCCTTACAA\n+GGCCTTACAA\n+CGCCTTACAA\n+TGCCTTACAA\n+GTCCTTACAA\n+CTCCTTACAA\n+GGTCTTACAA\n+CGTCTTACAA\n+GCTCTTACAA\n+CCTCTTACAA\n+GAAGAAGCAA\n+CAAGAAGCAA\n+AGAGAAGCAA\n+GGAGAAGCAA\n+CGAGAAGCAA\n+TGAGAAGCAA\n+ACAGAAGCAA\n+GCAGAAGCAA\n+CCAGAAGCAA\n+TCAGAAGCAA\n+GTAGAAGCAA\n+CTAGAAGCAA\n+AAGGAAGCAA\n+GAGGAAGCAA\n+CAGGAAGCAA\n+TAGGAAGCAA\n+ACGGAAGCAA\n+GCGGAAGCAA\n+CCGGAAGCAA\n+TCGGAAGCAA\n+ATGGAAGCAA\n+GTGGAAGCAA\n+CTGGAAGCAA\n+TTGGAAGCAA\n+AACGAAGCAA\n+GACGAAGCAA\n+CACGAAGCAA\n+TACGAAGCAA\n+AGCGAAGCAA\n+GGCGAAGCAA\n+CGCGAAGCAA\n+TGCGAAGCAA\n+ACCGAAGCAA\n+GCCGAAGCAA\n+TCCGAAGCAA\n+ATCGAAGCAA\n+GTCGAAGCAA\n+CTCGAAGCAA\n+TTCGAAGCAA\n+GATGAAGCAA\n+CATGAAGCAA\n+AGTGAAGCAA\n+GGTGAAGCAA\n+CGTGAAGCAA\n+TGTGAAGCAA\n+ACTGAAGCAA\n+GCTGAAGCAA\n'
b
diff -r 000000000000 -r 4cd9f0008d9c test-data/in_genes.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/in_genes.tsv Tue Jun 04 17:19:52 2019 -0400
b
@@ -0,0 +1,100 @@
+GENE1 GENE1
+GENE2 GENE2
+GENE3 GENE3
+GENE4 GENE4
+GENE5 GENE5
+GENE6 GENE6
+GENE7 GENE7
+GENE8 GENE8
+GENE9 GENE9
+GENE10 GENE10
+GENE11 GENE11
+GENE12 GENE12
+GENE13 GENE13
+GENE14 GENE14
+GENE15 GENE15
+GENE16 GENE16
+GENE17 GENE17
+GENE18 GENE18
+GENE19 GENE19
+GENE20 GENE20
+GENE21 GENE21
+GENE22 GENE22
+GENE23 GENE23
+GENE24 GENE24
+GENE25 GENE25
+GENE26 GENE26
+GENE27 GENE27
+GENE28 GENE28
+GENE29 GENE29
+GENE30 GENE30
+GENE31 GENE31
+GENE32 GENE32
+GENE33 GENE33
+GENE34 GENE34
+GENE35 GENE35
+GENE36 GENE36
+GENE37 GENE37
+GENE38 GENE38
+GENE39 GENE39
+GENE40 GENE40
+GENE41 GENE41
+GENE42 GENE42
+GENE43 GENE43
+GENE44 GENE44
+GENE45 GENE45
+GENE46 GENE46
+GENE47 GENE47
+GENE48 GENE48
+GENE49 GENE49
+GENE50 GENE50
+GENE51 GENE51
+GENE52 GENE52
+GENE53 GENE53
+GENE54 GENE54
+GENE55 GENE55
+GENE56 GENE56
+GENE57 GENE57
+GENE58 GENE58
+GENE59 GENE59
+GENE60 GENE60
+GENE61 GENE61
+GENE62 GENE62
+GENE63 GENE63
+GENE64 GENE64
+GENE65 GENE65
+GENE66 GENE66
+GENE67 GENE67
+GENE68 GENE68
+GENE69 GENE69
+GENE70 GENE70
+GENE71 GENE71
+GENE72 GENE72
+GENE73 GENE73
+GENE74 GENE74
+GENE75 GENE75
+GENE76 GENE76
+GENE77 GENE77
+GENE78 GENE78
+GENE79 GENE79
+GENE80 GENE80
+GENE81 GENE81
+GENE82 GENE82
+GENE83 GENE83
+GENE84 GENE84
+GENE85 GENE85
+GENE86 GENE86
+GENE87 GENE87
+GENE88 GENE88
+GENE89 GENE89
+GENE90 GENE90
+GENE91 GENE91
+GENE92 GENE92
+GENE93 GENE93
+GENE94 GENE94
+GENE95 GENE95
+GENE96 GENE96
+GENE97 GENE97
+GENE98 GENE98
+GENE99 GENE99
+GENE100 GENE100
b
diff -r 000000000000 -r 4cd9f0008d9c test-data/in_matrix.h5ad
b
Binary file test-data/in_matrix.h5ad has changed
b
diff -r 000000000000 -r 4cd9f0008d9c test-data/in_matrix.mtx
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/in_matrix.mtx Tue Jun 04 17:19:52 2019 -0400
b
b'@@ -0,0 +1,49364 @@\n+%%MatrixMarket matrix coordinate integer general\n+100 11100 49362\n+37 3 4\n+85 3 4\n+89 3 4\n+43 10 3\n+87 10 3\n+29 17 3\n+56 17 5\n+82 17 3\n+88 17 4\n+95 17 4\n+53 20 3\n+67 20 3\n+50 23 3\n+84 23 3\n+94 23 3\n+66 27 3\n+58 34 3\n+67 34 3\n+78 34 4\n+85 34 3\n+95 34 4\n+100 34 4\n+67 39 3\n+78 39 4\n+57 40 3\n+64 40 3\n+73 40 3\n+90 40 4\n+97 40 4\n+27 45 3\n+88 48 3\n+47 52 3\n+67 56 3\n+92 56 4\n+89 58 3\n+64 62 3\n+81 62 3\n+99 62 3\n+67 64 3\n+49 69 3\n+77 69 5\n+99 69 4\n+100 72 3\n+69 75 3\n+92 75 3\n+73 76 3\n+81 83 3\n+90 84 3\n+81 93 3\n+94 93 3\n+91 94 4\n+100 94 3\n+99 107 3\n+56 112 3\n+78 112 4\n+90 112 5\n+95 112 3\n+77 120 3\n+75 123 4\n+91 148 3\n+68 155 3\n+90 155 4\n+95 155 3\n+42 156 3\n+82 156 3\n+95 158 3\n+73 160 3\n+63 162 4\n+77 162 6\n+79 162 3\n+98 162 3\n+74 163 3\n+94 163 3\n+63 164 5\n+75 168 3\n+58 172 3\n+95 172 4\n+49 180 3\n+70 183 3\n+97 188 3\n+80 189 3\n+98 189 3\n+65 192 3\n+28 200 3\n+51 200 4\n+57 200 3\n+62 200 3\n+67 200 3\n+72 200 4\n+76 200 3\n+79 200 3\n+83 200 7\n+86 200 6\n+88 200 6\n+93 200 4\n+97 200 4\n+99 200 5\n+94 206 3\n+76 208 4\n+97 208 3\n+52 209 3\n+63 219 3\n+78 219 7\n+77 221 3\n+88 228 3\n+85 235 3\n+75 236 3\n+59 237 3\n+66 237 4\n+73 237 3\n+88 237 3\n+93 237 3\n+83 242 4\n+33 243 3\n+54 243 3\n+57 243 3\n+60 243 3\n+67 243 3\n+72 243 5\n+75 243 4\n+83 243 3\n+86 243 3\n+91 243 3\n+94 243 3\n+97 243 4\n+98 245 3\n+41 253 3\n+83 253 4\n+88 253 5\n+31 254 3\n+35 254 5\n+45 254 3\n+50 254 4\n+57 254 4\n+59 254 3\n+65 254 8\n+67 254 3\n+70 254 3\n+75 254 5\n+81 254 8\n+83 254 5\n+85 254 5\n+91 254 5\n+93 254 4\n+95 254 5\n+97 254 5\n+100 254 6\n+52 255 4\n+80 255 3\n+96 255 3\n+90 256 3\n+67 261 3\n+93 261 4\n+95 261 3\n+57 268 4\n+99 268 6\n+94 269 3\n+97 277 3\n+46 281 3\n+60 281 3\n+64 281 3\n+74 281 3\n+76 281 4\n+78 281 4\n+80 281 3\n+82 281 3\n+91 281 3\n+97 281 5\n+100 281 6\n+61 288 3\n+75 289 4\n+69 292 3\n+65 294 3\n+87 295 3\n+84 298 5\n+94 298 4\n+95 300 4\n+81 303 3\n+96 304 3\n+57 310 3\n+76 310 3\n+92 310 3\n+98 310 8\n+97 316 3\n+81 319 3\n+94 323 3\n+62 325 3\n+84 325 3\n+100 325 3\n+55 328 3\n+34 330 4\n+73 330 3\n+89 330 3\n+96 330 3\n+81 337 3\n+98 337 3\n+78 338 3\n+96 341 3\n+32 346 3\n+64 346 3\n+71 346 4\n+77 346 4\n+89 346 3\n+92 346 3\n+94 346 3\n+96 346 3\n+63 348 3\n+89 348 3\n+94 348 3\n+97 348 3\n+68 350 3\n+73 350 3\n+75 350 3\n+85 350 4\n+92 350 4\n+99 350 7\n+56 362 4\n+67 362 4\n+91 362 5\n+96 362 3\n+100 362 5\n+51 368 6\n+57 368 3\n+78 368 3\n+88 368 3\n+91 368 4\n+98 368 9\n+70 372 3\n+56 386 3\n+78 386 3\n+93 386 3\n+61 387 3\n+46 391 3\n+78 391 3\n+100 391 4\n+57 396 3\n+96 396 4\n+59 405 3\n+57 408 3\n+73 408 3\n+90 408 3\n+75 410 3\n+83 410 4\n+86 410 3\n+88 410 3\n+94 410 5\n+99 410 3\n+77 412 3\n+64 413 3\n+75 413 4\n+95 413 3\n+28 416 3\n+63 416 3\n+85 416 4\n+90 427 4\n+72 430 3\n+58 432 4\n+64 432 4\n+76 432 3\n+80 432 5\n+87 432 3\n+97 432 3\n+93 441 5\n+90 445 4\n+98 466 3\n+68 468 3\n+74 469 3\n+80 469 4\n+91 469 3\n+100 469 3\n+29 471 3\n+38 471 3\n+45 471 3\n+49 471 3\n+51 471 3\n+59 471 3\n+64 471 3\n+66 471 4\n+70 471 3\n+74 471 3\n+79 471 5\n+82 471 5\n+88 471 3\n+90 471 3\n+94 471 4\n+96 471 7\n+100 471 4\n+62 481 4\n+67 481 3\n+70 481 3\n+80 481 5\n+86 481 4\n+96 481 3\n+99 481 3\n+68 485 3\n+72 485 3\n+99 485 3\n+71 494 3\n+81 494 3\n+90 494 4\n+99 494 4\n+100 496 3\n+46 519 4\n+73 519 4\n+76 519 5\n+85 519 3\n+88 519 5\n+91 519 3\n+93 519 5\n+47 520 3\n+59 520 3\n+69 520 3\n+99 520 4\n+83 521 3\n+83 526 4\n+90 526 3\n+93 526 3\n+98 526 3\n+99 529 3\n+56 530 3\n+79 530 3\n+82 530 3\n+85 530 3\n+75 531 3\n+59 540 3\n+67 546 3\n+88 546 3\n+96 552 6\n+40 553 3\n+73 553 3\n+81 553 3\n+92 563 4\n+64 565 3\n+43 572 3\n+67 572 3\n+82 572 3\n+89 572 3\n+99 572 3\n+49 594 3\n+66 594 3\n+83 594 3\n+85 594 3\n+76 596 3\n+58 603 3\n+30 604 4\n+38 604 3\n+44 604 4\n+58 604 3\n+64 604 4\n+69 604 3\n+81 604 3\n+85 604 3\n+91 604 6\n+95 604 3\n+97 604 4\n+94 605 3\n+52 617 4\n+59 621 3\n+88 621 3\n+91 621 3\n+94 621 3\n+96 621 4\n+100 625 3\n+88 632 3\n+92 634 3\n+84 636 4\n+89 639 3\n+81 640 4\n+97 640 3\n+63 642 3\n+93 642 3\n+67 652 4\n+82 652 3\n+30 653 3\n+57 654 3\n+99 654 4\n+84 656 4\n+98 656 3\n+96 665 3\n+62 672 3\n+77 672 3\n+80 672 4\n+83 672 5\n+88 672 3\n+76 675 3\n+76 678 3\n+38 683 3\n+60 683 3\n+65 683 3\n+70 683 3\n+81 683 4\n+85 683 4\n+93 683 3\n+62 684 3\n+61 685 3\n+75 6'..b' 4\n+61 11078 3\n+65 11078 3\n+73 11078 3\n+83 11078 4\n+87 11078 5\n+94 11078 3\n+3 11079 3\n+11 11079 3\n+16 11079 3\n+28 11079 5\n+34 11079 4\n+38 11079 4\n+44 11079 3\n+55 11079 3\n+63 11079 3\n+70 11079 4\n+75 11079 4\n+87 11079 5\n+90 11079 4\n+93 11079 3\n+6 11080 3\n+9 11080 5\n+22 11080 4\n+28 11080 5\n+35 11080 4\n+59 11080 4\n+76 11080 3\n+83 11080 3\n+89 11080 3\n+5 11081 4\n+8 11081 3\n+10 11081 3\n+16 11081 3\n+24 11081 4\n+27 11081 4\n+34 11081 5\n+44 11081 3\n+47 11081 3\n+55 11081 3\n+62 11081 3\n+67 11081 3\n+71 11081 5\n+77 11081 3\n+91 11081 3\n+100 11081 3\n+7 11082 3\n+14 11082 4\n+24 11082 5\n+32 11082 5\n+35 11082 7\n+42 11082 3\n+44 11082 3\n+59 11082 4\n+62 11082 4\n+68 11082 3\n+74 11082 4\n+77 11082 3\n+83 11082 5\n+87 11082 5\n+91 11082 5\n+100 11082 3\n+13 11083 3\n+21 11083 3\n+42 11083 3\n+75 11083 3\n+94 11083 4\n+7 11084 4\n+9 11084 3\n+20 11084 5\n+24 11084 3\n+32 11084 3\n+34 11084 3\n+39 11084 6\n+43 11084 6\n+48 11084 4\n+62 11084 4\n+64 11084 6\n+74 11084 3\n+79 11084 6\n+84 11084 6\n+91 11084 4\n+100 11084 3\n+7 11085 5\n+16 11085 4\n+22 11085 3\n+34 11085 8\n+39 11085 4\n+43 11085 6\n+47 11085 3\n+55 11085 3\n+65 11085 3\n+76 11085 5\n+79 11085 7\n+84 11085 4\n+97 11085 4\n+7 11086 3\n+29 11086 4\n+32 11086 7\n+39 11086 5\n+43 11086 5\n+45 11086 3\n+62 11086 4\n+67 11086 3\n+74 11086 4\n+78 11086 4\n+86 11086 3\n+91 11086 4\n+95 11086 8\n+6 11087 3\n+11 11087 4\n+16 11087 3\n+24 11087 6\n+29 11087 4\n+36 11087 3\n+40 11087 3\n+44 11087 4\n+48 11087 3\n+64 11087 5\n+73 11087 3\n+76 11087 3\n+79 11087 3\n+86 11087 4\n+89 11087 3\n+91 11087 5\n+2 11088 4\n+20 11088 5\n+28 11088 3\n+32 11088 4\n+43 11088 4\n+48 11088 5\n+54 11088 3\n+64 11088 4\n+67 11088 5\n+72 11088 4\n+76 11088 4\n+79 11088 4\n+84 11088 4\n+90 11088 4\n+100 11088 3\n+12 11089 4\n+21 11089 3\n+28 11089 3\n+34 11089 3\n+43 11089 4\n+47 11089 3\n+70 11089 4\n+79 11089 3\n+1 11090 4\n+6 11090 4\n+15 11090 3\n+20 11090 4\n+34 11090 4\n+38 11090 4\n+40 11090 3\n+45 11090 6\n+47 11090 4\n+61 11090 4\n+64 11090 4\n+73 11090 3\n+76 11090 6\n+78 11090 5\n+83 11090 4\n+86 11090 6\n+91 11090 3\n+96 11090 5\n+100 11090 6\n+11 11091 4\n+13 11091 3\n+25 11091 3\n+32 11091 5\n+36 11091 3\n+41 11091 3\n+43 11091 3\n+47 11091 4\n+63 11091 4\n+76 11091 3\n+78 11091 4\n+83 11091 6\n+90 11091 3\n+96 11091 4\n+5 11092 3\n+16 11092 3\n+22 11092 3\n+28 11092 4\n+34 11092 3\n+38 11092 3\n+41 11092 3\n+43 11092 4\n+46 11092 4\n+48 11092 4\n+63 11092 4\n+74 11092 3\n+78 11092 4\n+83 11092 3\n+87 11092 3\n+91 11092 3\n+5 11093 3\n+15 11093 10\n+18 11093 3\n+20 11093 3\n+24 11093 6\n+31 11093 3\n+33 11093 3\n+35 11093 3\n+43 11093 3\n+48 11093 3\n+74 11093 5\n+83 11093 7\n+86 11093 4\n+90 11093 5\n+95 11093 8\n+8 11094 7\n+11 11094 3\n+16 11094 7\n+20 11094 3\n+23 11094 5\n+27 11094 4\n+29 11094 3\n+34 11094 7\n+36 11094 8\n+42 11094 9\n+44 11094 4\n+46 11094 3\n+48 11094 9\n+51 11094 3\n+54 11094 5\n+59 11094 7\n+63 11094 9\n+67 11094 5\n+71 11094 3\n+74 11094 8\n+76 11094 5\n+78 11094 8\n+81 11094 4\n+83 11094 4\n+86 11094 3\n+88 11094 3\n+91 11094 7\n+100 11094 5\n+6 11095 3\n+9 11095 3\n+12 11095 8\n+15 11095 5\n+23 11095 4\n+28 11095 8\n+31 11095 4\n+33 11095 3\n+36 11095 5\n+42 11095 5\n+45 11095 3\n+50 11095 5\n+59 11095 6\n+62 11095 3\n+64 11095 3\n+67 11095 3\n+70 11095 5\n+74 11095 4\n+78 11095 6\n+83 11095 5\n+86 11095 3\n+92 11095 3\n+95 11095 4\n+100 11095 4\n+9 11096 4\n+16 11096 3\n+26 11096 3\n+28 11096 3\n+32 11096 4\n+44 11096 5\n+70 11096 5\n+79 11096 3\n+87 11096 3\n+94 11096 3\n+16 11097 3\n+22 11097 4\n+29 11097 3\n+34 11097 4\n+38 11097 3\n+44 11097 5\n+59 11097 3\n+70 11097 5\n+74 11097 5\n+78 11097 3\n+87 11097 3\n+93 11097 4\n+100 11097 5\n+9 11098 3\n+15 11098 3\n+20 11098 4\n+27 11098 7\n+34 11098 8\n+46 11098 3\n+51 11098 3\n+62 11098 3\n+70 11098 3\n+74 11098 5\n+77 11098 3\n+82 11098 5\n+84 11098 3\n+91 11098 4\n+7 11099 4\n+12 11099 8\n+24 11099 6\n+28 11099 4\n+32 11099 6\n+42 11099 4\n+45 11099 6\n+59 11099 3\n+63 11099 7\n+66 11099 3\n+74 11099 5\n+77 11099 7\n+81 11099 3\n+84 11099 3\n+91 11099 4\n+100 11099 6\n+11 11100 3\n+16 11100 4\n+25 11100 3\n+32 11100 3\n+34 11100 3\n+36 11100 4\n+39 11100 3\n+43 11100 6\n+47 11100 5\n+55 11100 3\n+63 11100 8\n+70 11100 6\n+74 11100 3\n+78 11100 4\n+82 11100 3\n+84 11100 3\n+91 11100 4\n+95 11100 3\n'
b
diff -r 000000000000 -r 4cd9f0008d9c test-data/in_matrix.tsv
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/in_matrix.tsv Tue Jun 04 17:19:52 2019 -0400
b
b'@@ -0,0 +1,101 @@\n+\tGGAAGAAGAA\tCGAAGAAGAA\tGCAAGAAGAA\tCCAAGAAGAA\tGAGAGAAGAA\tCAGAGAAGAA\tAGGAGAAGAA\tCGGAGAAGAA\tTGGAGAAGAA\tACGAGAAGAA\tGCGAGAAGAA\tCCGAGAAGAA\tTCGAGAAGAA\tGTGAGAAGAA\tCTGAGAAGAA\tGACAGAAGAA\tCACAGAAGAA\tAGCAGAAGAA\tGGCAGAAGAA\tCGCAGAAGAA\tTGCAGAAGAA\tACCAGAAGAA\tGCCAGAAGAA\tTCCAGAAGAA\tGTCAGAAGAA\tCTCAGAAGAA\tGGTAGAAGAA\tCGTAGAAGAA\tGCTAGAAGAA\tCCTAGAAGAA\tGAAGGAAGAA\tCAAGGAAGAA\tAGAGGAAGAA\tGGAGGAAGAA\tCGAGGAAGAA\tTGAGGAAGAA\tACAGGAAGAA\tGCAGGAAGAA\tCCAGGAAGAA\tTCAGGAAGAA\tGTAGGAAGAA\tCTAGGAAGAA\tAACGGAAGAA\tGACGGAAGAA\tCACGGAAGAA\tTACGGAAGAA\tAGCGGAAGAA\tGGCGGAAGAA\tCGCGGAAGAA\tTGCGGAAGAA\tACCGGAAGAA\tGCCGGAAGAA\tTCCGGAAGAA\tATCGGAAGAA\tGTCGGAAGAA\tCTCGGAAGAA\tTTCGGAAGAA\tGATGGAAGAA\tCATGGAAGAA\tAGTGGAAGAA\tGGTGGAAGAA\tCGTGGAAGAA\tTGTGGAAGAA\tACTGGAAGAA\tGCTGGAAGAA\tCCTGGAAGAA\tTCTGGAAGAA\tGTTGGAAGAA\tCTTGGAAGAA\tGAACGAAGAA\tCAACGAAGAA\tAGACGAAGAA\tGGACGAAGAA\tCGACGAAGAA\tTGACGAAGAA\tACACGAAGAA\tGCACGAAGAA\tCCACGAAGAA\tTCACGAAGAA\tGTACGAAGAA\tCTACGAAGAA\tAAGCGAAGAA\tGAGCGAAGAA\tCAGCGAAGAA\tTAGCGAAGAA\tAGGCGAAGAA\tCGGCGAAGAA\tTGGCGAAGAA\tACGCGAAGAA\tGCGCGAAGAA\tCCGCGAAGAA\tTCGCGAAGAA\tATGCGAAGAA\tGTGCGAAGAA\tCTGCGAAGAA\tTTGCGAAGAA\tAACCGAAGAA\tGACCGAAGAA\tCACCGAAGAA\tTACCGAAGAA\tAGCCGAAGAA\tGGCCGAAGAA\tCGCCGAAGAA\tTGCCGAAGAA\tATCCGAAGAA\tGTCCGAAGAA\tCTCCGAAGAA\tTTCCGAAGAA\tGATCGAAGAA\tCATCGAAGAA\tAGTCGAAGAA\tGGTCGAAGAA\tCGTCGAAGAA\tTGTCGAAGAA\tACTCGAAGAA\tGCTCGAAGAA\tCCTCGAAGAA\tTCTCGAAGAA\tGTTCGAAGAA\tCTTCGAAGAA\tGGATGAAGAA\tCGATGAAGAA\tGCATGAAGAA\tCCATGAAGAA\tGAGTGAAGAA\tCAGTGAAGAA\tAGGTGAAGAA\tCGGTGAAGAA\tTGGTGAAGAA\tACGTGAAGAA\tGCGTGAAGAA\tCCGTGAAGAA\tTCGTGAAGAA\tGTGTGAAGAA\tCTGTGAAGAA\tGACTGAAGAA\tCACTGAAGAA\tAGCTGAAGAA\tGGCTGAAGAA\tCGCTGAAGAA\tTGCTGAAGAA\tACCTGAAGAA\tGCCTGAAGAA\tTCCTGAAGAA\tGTCTGAAGAA\tCTCTGAAGAA\tGGTTGAAGAA\tCGTTGAAGAA\tGCTTGAAGAA\tCCTTGAAGAA\tGGAACAAGAA\tCGAACAAGAA\tGCAACAAGAA\tCCAACAAGAA\tGAGACAAGAA\tCAGACAAGAA\tAGGACAAGAA\tCGGACAAGAA\tTGGACAAGAA\tACGACAAGAA\tGCGACAAGAA\tCCGACAAGAA\tTCGACAAGAA\tGTGACAAGAA\tCTGACAAGAA\tGACACAAGAA\tCACACAAGAA\tAGCACAAGAA\tGGCACAAGAA\tCGCACAAGAA\tTGCACAAGAA\tACCACAAGAA\tGCCACAAGAA\tTCCACAAGAA\tGTCACAAGAA\tCTCACAAGAA\tGGTACAAGAA\tCGTACAAGAA\tGCTACAAGAA\tCCTACAAGAA\tGAAGCAAGAA\tCAAGCAAGAA\tAGAGCAAGAA\tGGAGCAAGAA\tCGAGCAAGAA\tTGAGCAAGAA\tACAGCAAGAA\tGCAGCAAGAA\tCCAGCAAGAA\tTCAGCAAGAA\tGTAGCAAGAA\tCTAGCAAGAA\tAAGGCAAGAA\tGAGGCAAGAA\tCAGGCAAGAA\tTAGGCAAGAA\tACGGCAAGAA\tGCGGCAAGAA\tCCGGCAAGAA\tTCGGCAAGAA\tATGGCAAGAA\tGTGGCAAGAA\tCTGGCAAGAA\tTTGGCAAGAA\tAACGCAAGAA\tGACGCAAGAA\tCACGCAAGAA\tTACGCAAGAA\tAGCGCAAGAA\tGGCGCAAGAA\tCGCGCAAGAA\tTGCGCAAGAA\tACCGCAAGAA\tGCCGCAAGAA\tTCCGCAAGAA\tATCGCAAGAA\tGTCGCAAGAA\tCTCGCAAGAA\tTTCGCAAGAA\tGATGCAAGAA\tCATGCAAGAA\tAGTGCAAGAA\tGGTGCAAGAA\tCGTGCAAGAA\tTGTGCAAGAA\tACTGCAAGAA\tGCTGCAAGAA\tCCTGCAAGAA\tTCTGCAAGAA\tGTTGCAAGAA\tCTTGCAAGAA\tGAACCAAGAA\tCAACCAAGAA\tAGACCAAGAA\tGGACCAAGAA\tCGACCAAGAA\tTGACCAAGAA\tACACCAAGAA\tGCACCAAGAA\tCCACCAAGAA\tTCACCAAGAA\tGTACCAAGAA\tCTACCAAGAA\tAAGCCAAGAA\tGAGCCAAGAA\tCAGCCAAGAA\tTAGCCAAGAA\tAGGCCAAGAA\tCGGCCAAGAA\tTGGCCAAGAA\tACGCCAAGAA\tGCGCCAAGAA\tCCGCCAAGAA\tTCGCCAAGAA\tATGCCAAGAA\tGTGCCAAGAA\tCTGCCAAGAA\tTTGCCAAGAA\tGATCCAAGAA\tCATCCAAGAA\tAGTCCAAGAA\tGGTCCAAGAA\tCGTCCAAGAA\tTGTCCAAGAA\tACTCCAAGAA\tGCTCCAAGAA\tCCTCCAAGAA\tTCTCCAAGAA\tGTTCCAAGAA\tCTTCCAAGAA\tGGATCAAGAA\tCGATCAAGAA\tGCATCAAGAA\tCCATCAAGAA\tGAGTCAAGAA\tCAGTCAAGAA\tAGGTCAAGAA\tCGGTCAAGAA\tTGGTCAAGAA\tACGTCAAGAA\tGCGTCAAGAA\tCCGTCAAGAA\tTCGTCAAGAA\tGTGTCAAGAA\tCTGTCAAGAA\tGACTCAAGAA\tCACTCAAGAA\tAGCTCAAGAA\tGGCTCAAGAA\tCGCTCAAGAA\tTGCTCAAGAA\tACCTCAAGAA\tGCCTCAAGAA\tTCCTCAAGAA\tGTCTCAAGAA\tCTCTCAAGAA\tGGTTCAAGAA\tCGTTCAAGAA\tGCTTCAAGAA\tCCTTCAAGAA\tCGGATAAGAA\tGCGATAAGAA\tCCGATAAGAA\tGGCATAAGAA\tCGCATAAGAA\tGCCATAAGAA\tGGAGTAAGAA\tCGAGTAAGAA\tGCAGTAAGAA\tCCAGTAAGAA\tGAGGTAAGAA\tCAGGTAAGAA\tACGGTAAGAA\tGCGGTAAGAA\tCCGGTAAGAA\tTCGGTAAGAA\tGTGGTAAGAA\tCTGGTAAGAA\tGACGTAAGAA\tCACGTAAGAA\tAGCGTAAGAA\tGGCGTAAGAA\tCGCGTAAGAA\tTGCGTAAGAA\tACCGTAAGAA\tGCCGTAAGAA\tTCCGTAAGAA\tGTCGTAAGAA\tCTCGTAAGAA\tGGTGTAAGAA\tCGTGTAAGAA\tGCTGTAAGAA\tCCTGTAAGAA\tGGACTAAGAA\tCGACTAAGAA\tGCACTAAGAA\tCCACTAAGAA\tGAGCTAAGAA\tCAGCTAAGAA\tAGGCTAAGAA\tCGGCTAAGAA\tTGGCTAAGAA\tACGCTAAGAA\tGCGCTAAGAA\tCCGCTAAGAA\tTCGCTAAGAA\tGTGCTAAGAA\tCTGCTAAGAA\tGACCTAAGAA\tCACCTAAGAA\tAGCCTAAGAA\tGGCCTAAGAA\tCGCCTAAGAA\tTGCCTAAGAA\tGTCCTAAGAA\tCTCCTAAGAA\tGGTCTAAGAA\tCGTCTAAGAA\tGCTCTAAGAA\tCCTCTAAGAA\tCGGTTAAGAA\tGCGTTAAG'..b'\t1\t0\t1\t0\t0\t0\t1\t0\t0\t2\t0\t0\t0\t0\t0\t0\t0\t0\t3\t0\t0\t0\t0\t0\t0\t0\t0\t0\t2\t1\t1\t1\t0\t0\t0\t0\t0\t0\t0\t0\t2\t0\t1\t0\t2\t0\t1\t0\t1\t0\t0\t0\t1\t0\t0\t0\t0\t1\t1\t0\t0\t0\t0\t2\t0\t0\t0\t0\t0\t2\t0\t0\t0\t0\t1\t0\t1\t0\t0\t1\t0\t0\t1\t1\t0\t0\t0\t0\t1\t1\t0\t0\t0\t0\t1\t2\t0\t3\t0\t2\t1\t0\t0\t0\t0\t0\t1\t0\t0\t0\t2\t2\t0\t0\t0\t2\t0\t0\t0\t1\t0\t4\t0\t0\t0\t0\t2\t1\t1\t0\t0\t0\t1\t1\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t1\t3\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t2\t0\t0\t1\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t2\t0\t0\t0\t0\t2\t0\t0\t1\t0\t0\t1\t0\t0\t0\t1\t0\t2\t0\t0\t0\t0\t0\t1\t0\t0\t1\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t3\t1\t2\t0\t0\t1\t0\t1\t0\t0\t1\t2\t0\t1\t2\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t2\t0\t0\t0\t1\t0\t0\t0\t1\t3\t2\t1\t0\t1\t0\t1\t0\t1\t0\t0\t2\t0\t0\t0\t0\t1\t1\t2\t3\t0\t4\t0\t0\t0\t2\t2\t1\t1\t0\t2\t1\t0\t0\t0\t1\t0\t1\t1\t0\t0\t0\t0\t0\t3\t0\t0\t1\t1\t0\t1\t0\t1\t0\t0\t0\t0\t0\t0\t1\t0\t1\t0\t1\t1\t6\t0\t0\t1\t0\t3\t0\t0\t0\t1\t1\t0\t1\t1\t0\t0\t5\t1\t1\t1\t1\t0\t1\t1\t2\t0\t0\t0\t0\t1\t1\t0\t1\t0\t0\t0\t1\t0\t0\t0\t0\t1\t2\t1\t0\t2\t0\t0\t0\t0\t0\t0\t1\t2\t1\t1\t0\t0\t0\t0\t0\t1\t0\t1\t0\t0\t0\t0\t0\t2\t0\t0\t1\t1\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t3\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t2\t1\t0\t4\t0\t0\t0\t2\t0\t1\t0\t0\t0\t0\t0\t2\t0\t2\t1\t2\t1\t0\t1\t1\t0\t0\t4\t2\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t1\t1\t0\t1\t0\t0\t0\t2\t0\t1\t0\t0\t1\t0\t0\t0\t1\t1\t0\t1\t2\t0\t0\t0\t2\t1\t2\t0\t0\t0\t0\t0\t1\t1\t0\t0\t1\t0\t2\t0\t0\t2\t0\t1\t0\t4\t2\t2\t1\t0\t0\t0\t1\t0\t0\t0\t1\t0\t0\t0\t1\t0\t0\t0\t0\t0\t1\t2\t0\t2\t0\t0\t1\t2\t0\t1\t0\t0\t0\t1\t1\t0\t0\t0\t1\t4\t1\t0\t2\t0\t0\t0\t3\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t5\t0\t0\t0\t1\t1\t0\t1\t1\t0\t0\t0\t0\t0\t2\t0\t3\t2\t3\t0\t0\t0\t0\t0\t0\t1\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t3\t0\t0\t0\t0\t0\t0\t2\t0\t0\t0\t0\t0\t2\t0\t2\t0\t0\t0\t0\t6\t0\t0\t0\t0\t0\t1\t0\t0\t0\t1\t1\t0\t1\t0\t2\t0\t0\t0\t0\t2\t3\t1\t0\t2\t0\t0\t0\t1\t0\t0\t3\t1\t2\t0\t1\t2\t0\t0\t0\t0\t2\t0\t0\t0\t0\t0\t0\t1\t0\t1\t0\t0\t0\t0\t1\t0\t0\t0\t3\t1\t0\t1\t0\t0\t0\t0\t3\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t2\t1\t0\t0\t0\t0\t0\t0\t0\t4\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t2\t2\t0\t1\t0\t0\t0\t0\t1\t0\t0\t1\t0\t0\t0\t0\t2\t1\t0\t0\t1\t0\t0\t4\t0\t0\t0\t0\t1\t0\t0\t0\t1\t0\t4\t1\t0\t0\t1\t0\t0\t1\t0\t3\t2\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t4\t3\t2\t0\t1\t0\t0\t0\t0\t0\t1\t0\t1\t0\t0\t1\t1\t1\t1\t0\t0\t0\t2\t1\t1\t0\t0\t0\t1\t1\t1\t0\t0\t0\t1\t0\t1\t0\t0\t0\t2\t0\t2\t0\t0\t0\t0\t0\t0\t3\t0\t2\t0\t0\t0\t0\t2\t0\t0\t0\t0\t0\t1\t0\t2\t0\t0\t0\t2\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t3\t0\t0\t0\t0\t3\t2\t1\t2\t1\t1\t0\t0\t0\t1\t0\t1\t0\t1\t0\t2\t1\t0\t0\t1\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t1\t0\t2\t0\t1\t1\t1\t0\t1\t0\t1\t3\t0\t0\t1\t0\t0\t0\t1\t1\t0\t0\t0\t0\t0\t1\t0\t0\t0\t2\t0\t0\t1\t2\t0\t0\t1\t0\t0\t0\t0\t0\t0\t1\t1\t0\t0\t0\t1\t0\t0\t2\t0\t0\t0\t0\t0\t0\t0\t0\t1\t1\t0\t0\t1\t0\t0\t0\t1\t0\t0\t1\t1\t3\t1\t0\t0\t0\t0\t0\t2\t0\t1\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t4\t0\t0\t0\t0\t0\t2\t0\t1\t3\t0\t1\t1\t0\t3\t1\t1\t0\t0\t1\t1\t0\t0\t0\t1\t1\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t1\t2\t0\t0\t1\t0\t1\t0\t1\t1\t0\t0\t3\t2\t0\t0\t1\t0\t0\t0\t0\t1\t2\t0\t0\t0\t0\t3\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t1\t0\t0\t0\t0\t0\t1\t0\t0\t2\t0\t3\t0\t0\t0\t1\t0\t0\t0\t0\t1\t0\t0\t0\t1\t0\t0\t1\t0\t1\t0\t1\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t3\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t2\t1\t0\t0\t0\t1\t0\t0\t0\t0\t1\t0\t1\t0\t1\t0\t1\t0\t0\t1\t1\t1\t0\t1\t0\t3\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t3\t0\t0\t0\t0\t0\t1\t0\t2\t0\t1\t2\t0\t4\t0\t2\t0\t0\t0\t0\t2\t2\t0\t0\t0\t4\t1\t1\t2\t0\t0\t0\t1\t0\t0\t0\t0\t0\t2\t1\t2\t0\t0\t0\t0\t0\t2\t2\t1\t1\t0\t5\t0\t0\t0\t1\t1\t0\t2\t1\t1\t1\t1\t0\t0\t0\t1\t0\t0\t1\t0\t0\t0\t1\t0\t0\t0\t1\t0\t0\t0\t1\t0\t1\t1\t0\t0\t0\t0\t0\t0\t1\t1\t1\t0\t1\t0\t0\t0\t0\t0\t0\t0\t3\t2\t2\t0\t3\t0\t0\t0\t0\t0\t1\t0\t0\t0\t1\t1\t0\t0\t0\t0\t0\t2\t3\t0\t1\t0\t2\t0\t0\t0\t2\t0\t1\t0\t0\t0\t0\t0\t0\t1\t1\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t2\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t2\t0\t4\t0\t0\t0\t0\t1\t1\t0\t0\t0\t2\t0\t0\t0\t0\t0\t0\t0\t0\t0\t2\t2\t1\t0\t0\t1\t1\t3\t0\t0\t0\t0\t0\t0\t0\t0\t1\t1\t2\t3\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t2\t0\t0\t0\t0\t0\t0\t0\t1\t0\t2\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t2\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t1\t3\t2\t0\t1\t0\t0\t2\t0\t0\t0\t2\t0\t1\t1\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t1\t2\t0\t1\t1\t0\t0\t0\t0\t5\t0\t1\t0\t1\t0\t0\t0\t1\t0\t1\t0\t0\t0\t0\t0\t1\t0\t1\t0\t0\t0\t3\t0\t1\t1\t0\t0\t0\t0\t0\t0\t1\t0\t0\t5\t1\t1\t0\t0\t2\t0\t0\t0\t1\t1\t3\t0\t2\t2\t0\t1\t0\t0\t1\t0\t0\t4\t0\t0\t4\t2\t1\t1\t0\t0\t0\t0\t0\t0\t0\t0\t1\t1\t0\t0\t2\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t2\t0\t0\t0\t2\t0\t2\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t3\t1\t0\t1\t1\t1\t0\t0\t2\t1\t1\t1\t0\t1\t2\t0\t0\t0\t0\t1\t0\t0\t0\t2\t0\t0\t0\t1\t0\t2\t1\t1\t1\t0\t0\t1\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t2\t0\t0\t0\t1\t0\t0\t2\t0\t0\t0\t0\t1\t0\t2\t1\t0\t1\t0\t0\t8\t0\t1\t1\t0\t2\t0\t1\t1\t1\t0\t0\t1\t0\t0\t0\t0\t0\t1\t2\t0\t0\t0\t0\t0\t2\t3\t0\t2\t0\t1\t0\t0\t0\t0\t0\t1\t1\t0\t1\t1\t0\t2\t0\t0\t2\t1\t0\t1\t1\t2\t0\t0\t1\t1\t0\t0\t0\t0\t4\t0\t0\t0\t0\t0\t1\t0\t0\t2\t1\t0\t0\t3\t1\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t1\t0\t0\t1\t0\t0\t0\t3\t0\t0\t0\t1\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t1\t0\t2\t0\t2\t2\t0\t4\t0\t0\t0\t1\t1\t0\t0\t0\t1\t0\t0\t1\t2\t3\t0\t4\t0\t2\t0\t2\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t1\t5\t0\t1\t0\t0\t2\t0\t1\t2\t2\t0\t0\t1\t0\t0\t0\t0\t0\t0\t3\t0\t1\t0\t0\t0\t0\t0\t0\t4\t0\t1\t3\t1\t0\t1\t1\t0\t0\t4\t0\t2\t0\t1\t0\t1\t2\t0\t2\t2\t0\t0\t0\t1\t0\t1\t0\t0\t2\t1\t0\t0\t1\t0\t0\t0\t1\t2\t0\t0\t0\t0\t0\t0\t0\t2\t1\t0\t0\t1\t1\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t2\t0\t0\t0\t0\t0\t1\t2\t2\t2\t1\t0\t1\t0\t1\t0\t0\t2\t2\t1\t1\t1\t0\t0\t1\t0\t0\t1\t0\t0\t0\t0\t1\t0\t1\t1\t0\t0\t0\t3\t1\t0\t0\t1\n'