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

Changeset 2:5ade5cf200da (2019-06-12)
Previous changeset 1:253c9448f524 (2019-06-03)
Commit message:
planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/crosscontamination_barcode_filter commit 82a0fd493f5866b3ef65019709ae5c865998f802
modified:
crosscontamination_barcode_filter.xml
scripts/batch_plotting_functions.R
scripts/config_assertions.R
scripts/contamination_plot.R
scripts/crosscontamination_filter.R
scripts/reorder_matrix_headers.R
test-data/out.pdf
added:
test-data/b12.matrix
test-data/b12.pdf
test-data/b12.table
b
diff -r 253c9448f524 -r 5ade5cf200da crosscontamination_barcode_filter.xml
--- a/crosscontamination_barcode_filter.xml Mon Jun 03 14:55:24 2019 -0400
+++ b/crosscontamination_barcode_filter.xml Wed Jun 12 04:58:19 2019 -0400
[
@@ -1,7 +1,7 @@
 <tool id="crosscontamination_barcode_filter" name="Cross-contamination Barcode Filter" version="@VERSION@">
     <description>for use in plate-based barcoded analyses</description>
     <macros>
-        <token name="@VERSION@">0.2</token>
+        <token name="@VERSION@">0.3</token>
         <macro name="sanitize_batch">
             <sanitizer invalid_char="">
                 <valid initial="string.digits">
@@ -85,6 +85,7 @@
 #end if
 regex.extract = '$advanced.regex_extract'
 regex.display = '$advanced.regex_display'
+sort.cells = as.logical('$advanced.sort_sizes')
 out.pdf = '$out_plots'
 out.table = '$out_table'
 ]]>
@@ -115,13 +116,14 @@
                 </repeat>
             </when>
         </conditional>
-        <section name="advanced" expanded="false" title="RegEx Parameters" >
+        <section name="advanced" expanded="false" title="Advanced Parameters" >
             <param name="regex_extract" type="text" value=".*P(\\d)_B(\\d)_([ACTG]+)" label="RegEx to extract Plate, Batch, and Barcodes from headers" >
                 <expand macro="sanitize_regex" />
             </param>
             <param name="regex_display" type="text" value="P\\1_B\\2_\\3" label="RegEx to replace Plate, Batch, and Barcodes from headers" >
                 <expand macro="sanitize_regex" />
             </param>
+            <param name="sort_sizes" type="boolean" truevalue="TRUE" falsevalue="FALSE" checked="false" label="Sort Cells by Library Size" />
         </section>
     </inputs>
     <outputs>
@@ -165,12 +167,44 @@
             <output name="out_plots" value="out.pdf" compare="sim_size" />
             <output name="out_table" value="out.table" />
         </test>
+        <test><!-- 12 Batch test -->
+            <param name="input_table" value="b12.matrix" />
+            <param name="input_barcodes" value="celseq_barcodes.192.raw" />
+            <conditional name="inbuilt_spec" >
+                <param name="select_use" value="custom" />
+                <repeat name="barcode_format" >
+                    <param name="range_start" value="1"/>
+                    <param name="range_end" value="96" />
+                    <param name="batches" value="1,3,5,7,9,11" />
+                </repeat>
+                <repeat name="barcode_format" >
+                    <param name="range_start" value="97"/>
+                    <param name="range_end" value="192" />
+                    <param name="batches" value="2,4,6,8,10,12" />
+                </repeat>
+                <repeat name="plate_format" >
+                    <param name="plate" value="1" />
+                    <param name="batches" value="1,2,3,4" />
+                </repeat>
+                <repeat name="plate_format" >
+                    <param name="plate" value="2" />
+                    <param name="batches" value="5,6,7,8" />
+                </repeat>
+                <repeat name="plate_format" >
+                    <param name="plate" value="3" />
+                    <param name="batches" value="9,10,11,12" />
+                </repeat>
+            </conditional>
+            <output name="out_plots" value="b12.pdf" compare="sim_size" />
+            <output name="out_table" value="b12.table" />
+        </test>
     </tests>
     <help><![CDATA[
 Cross-contamination Filter Plot
 ###################################
 
 For a set of barcodes and an experimental setup that uses a subset of these barcodes for each batch, this tool compares each batch against the full range of barcodes in order to determine whether any cross-contamination between batches has occured.
+*Note -- Do not reuse batch numbering across plates!*
 
 If a significant number of transcripts are shown in a batch for cell barcodes that were not designed for that batch, then this tool will show that. In the below plot, we can see that there is no significant cross-contamination taking place (pre-filter), and so we can filter out the false barcodes (post-filter).
 
b
diff -r 253c9448f524 -r 5ade5cf200da scripts/batch_plotting_functions.R
--- a/scripts/batch_plotting_functions.R Mon Jun 03 14:55:24 2019 -0400
+++ b/scripts/batch_plotting_functions.R Wed Jun 12 04:58:19 2019 -0400
[
@@ -5,6 +5,14 @@
 ##
 ## Batch Plotting Functions
 ##
+sortedBatchesOrPlates <- function(batch.list){
+    #' B0, B1, B11, B12, B2, B3, ...
+    #' to B0,B1,B2,---B11,B12
+    vals.and.index = sort(as.integer(sub("^[BP]", "", batch.list)), index.return=TRUE)
+    return(batch.list[vals.and.index$ix])
+}
+
+
 calculateBarcodePositions <- function(barcode.form, full.barcode.size){
     #' Determine x-axis positions of all batches under the context of
     #' unfiltered barcodes (full set), filtered (real set), dividing line
@@ -36,7 +44,7 @@
     filtered_positions <- list(B0=0)
     filter_in_unfilter <- list(B0=0) ## dividing line between real and false barcodes in each batch
 
-    res <- sapply(sort(names(sizes)), function(batch.name){
+    res <- sapply(sortedBatchesOrPlates(names(sizes)), function(batch.name){
 
         batch.num <- as.integer(sub("B","", batch.name))
         if (batch.num > 0){
@@ -80,7 +88,7 @@
     unfilter.plates.sizes = list(P0=0)
     filtered.plates.sizes = list(P0=0)
 
-    res <- sapply(sort(names(plate.form)), function(plate.num){
+    res <- sapply(sortedBatchesOrPlates(names(plate.form)), function(plate.num){
 
         unfilter.plate.size = 0
         filtered.plate.size = 0
@@ -89,7 +97,6 @@
 
         res2 <- sapply(sort(batches), function(batch.num){
             batch.size <- all.batch.data["sizes",paste("B", batch.num, sep="")]
-
             unfilter.plate.size <<- unfilter.plate.size + full.barcode.size
             filtered.plate.size <<- filtered.plate.size + batch.size
         })
b
diff -r 253c9448f524 -r 5ade5cf200da scripts/config_assertions.R
--- a/scripts/config_assertions.R Mon Jun 03 14:55:24 2019 -0400
+++ b/scripts/config_assertions.R Wed Jun 12 04:58:19 2019 -0400
[
@@ -51,10 +51,10 @@
     #' i.e. Batch names are NOT reused across plates
     #'
     #' @param headers matrix headers in P1_B2_ACTG format
-    plate.and.batch <- unique(sort(sub("^(.*)_([ATCGN]+)$", "\\1", headers)))
+    plate.and.batch <- unique(sub("^(.*)_([ATCGN]+)$", "\\1", headers))
     message("Discovered ", length(plate.and.batch), " batches: ", paste(plate.and.batch, collapse=" "))
 
-    batch.only <- sub("^.*_(B\\d)$", "\\1", plate.and.batch)
+    batch.only <- sub("^.*_(B\\d+)$", "\\1", plate.and.batch)
     dupes.batches <- batch.only[duplicated(batch.only)]
 
     if (length(dupes.batches) > 0){
b
diff -r 253c9448f524 -r 5ade5cf200da scripts/contamination_plot.R
--- a/scripts/contamination_plot.R Mon Jun 03 14:55:24 2019 -0400
+++ b/scripts/contamination_plot.R Wed Jun 12 04:58:19 2019 -0400
[
b'@@ -39,58 +39,75 @@\n \n         plate.minyval <- -200\n         plate.color <- "grey"\n-        plate.text.color <- "red"\n-        plate.text.alpha <- 0.5\n-        plate.height <- 2* maxval / 5\n-        plate.spacing <- 12\n+        plate.size <- 2\n+        plate.text.color <- "#7a0909"\n+        plate.text.alpha <- 1\n+        plate.text.height <- -200\n+        plate.height <- 4 * maxval / 5\n+        plate.spacing <- 35\n         plate.height.text <- plate.height - 3000\n-        plate.text.size <- 3\n+        plate.text.size <- 3.5\n \n+        ## Connecting bar underneath\n+        gplot <<- gplot + geom_segment(aes(x=min(unname(unlist(plate.boundaries))), xend=max(unname(unlist(plate.boundaries))),\n+                                           y=plate.minyval, yend=plate.minyval), color=plate.color, lty=1, size=plate.size,\n+                                       linejoin="round", lineend="round")\n \n+        ## Overlay text\n         zzz <- lapply(names(plate.boundaries), function(plate.name){\n             plate.num = as.integer(sub("P","",plate.name))\n             plate.xval = plate.boundaries[[plate.name]]\n \n-            ## If not first plate -- inner boundary, print next plate name to the right\n-            if (plate.name != names(plate.boundaries)[length(plate.boundaries)]){\n-                gplot <<- gplot + annotate("text", x=plate.xval + plate.spacing, label=paste("Plate", plate.num + 1),\n-                                           size=plate.text.size, y=plate.height*0.7, angle=-90,\n+            ## ## If not first plate -- inner boundary, print next plate name to the right\n+            ## if (plate.name != names(plate.boundaries)[length(plate.boundaries)]){\n+            ##     gplot <<- gplot + annotate("text", x=plate.xval + plate.spacing, label=paste("Plate", plate.num + 1),\n+            ##                                size=plate.text.size, y=plate.height*0.7, angle=-90,\n+            ##                                color=plate.text.color, alpha=plate.text.alpha)\n+            ## }\n+            ## ## If not last plate -- inner boundary, print previous name to the left\n+            ## if (plate.name != names(plate.boundaries)[1]){\n+            ##     gplot <<- gplot + annotate("text", x=plate.xval - plate.spacing, label=paste("Plate", plate.num),\n+            ##                                size=plate.text.size, y=plate.height*0.7, angle=90,\n+            ##                                color=plate.text.color, alpha=plate.text.alpha)\n+            ## }\n+           \n+            gplot <<- gplot + geom_segment(aes(x=plate.xval, xend=plate.xval, y=plate.minyval, yend=plate.height), color=plate.color, lty=1, size=plate.size)\n+\n+            if (plate.num > 0){\n+                ## Print under, between plates\n+                prev.plate.name <- paste("P", plate.num - 1, sep="")\n+                prev.plate.xval <- plate.boundaries[[prev.plate.name]]\n+                p.xval = as.integer((plate.xval + prev.plate.xval)/2)\n+\n+                gplot <<- gplot + annotate("text", x=p.xval, label=paste("Plate", plate.num),\n+                                           size=plate.text.size, y=plate.text.height-200,\n                                            color=plate.text.color, alpha=plate.text.alpha)\n             }\n-            ## If not last plate -- inner boundary, print previous name to the left\n-            if (plate.name != names(plate.boundaries)[1]){\n-                gplot <<- gplot + annotate("text", x=plate.xval - plate.spacing, label=paste("Plate", plate.num),\n-                                           size=plate.text.size, y=plate.height*0.7, angle=90,\n-                                           color=plate.text.color, alpha=plate.text.alpha)\n-            }\n-            gplot <<- gplot + geom_segment(aes(x=plate.xval, xend=plate.xval, y=plate.minyval, yend=plate.height), color=plate.color, lty=1, size=1)\n         })\n \n-        ## Connecting bar underneath\n-        gplot <<- gplot + geom_segment(aes(x=min(unname(unlist(plate.bou'..b'\n+        divide.color <- "red"\n         divide.style <- 2 ## dashed\n         divide.size <- 0.3\n+        divide.text.size <- 2\n+        divide.height <- (maxval * 7/8) - 500\n         boundary.color <- "blue"\n         boundary.style <- 1\n         boundary.size <- 0.5\n         divide.text.true.color <- "blue"\n         divide.text.false.color <- "black"\n-        divide.text.name.color <- "grey"\n-        batch.text.height <- maxval * 4/5\n-        batch.text.tf.height <- maxval * 2/5\n-        batch.text.tf.spacing <- 12\n+        divide.text.name.color <- "#7a0909"\n+        batch.text.tf.height <- divide.height * 7/8\n+        batch.text.tf.spacing <- 20\n         batch.text.alpha <- 0.8\n         batch.text.size <- 3\n-        batch.label.text.size <- 6\n-        batch.height <- maxval * 4/5\n-        divide.height <- maxval * 4/5\n+        batch.label.text.size <- 4\n+        batch.height <- maxval\n+        batch.text.height <- maxval * 7/8\n         batch.spacing <- 24\n \n         boundary.pos <- barcode.data["filtered_positions",]\n@@ -123,19 +140,27 @@\n                                                color=divide.color, lty=divide.style, size=divide.size)\n \n                     ## Plot the True/False labels\n-                    gplot <<- gplot + annotate("text", x=divide.xval - batch.text.tf.spacing, label="True positives",\n-                                               size=batch.text.size, y=batch.text.tf.height, angle=+90,\n+                    gplot <<- gplot + annotate("text", x=divide.xval - batch.text.tf.spacing, label="False positives",\n+                                               size=divide.text.size, y=batch.text.tf.height, angle=+90,\n+                                               color=divide.text.false.color, alpha=batch.text.alpha)\n+                    gplot <<- gplot + annotate("text", x=divide.xval + batch.text.tf.spacing, label="True positives",\n+                                               size=divide.text.size, y=batch.text.tf.height, angle=-90,\n                                                color=divide.text.true.color, alpha=batch.text.alpha)\n-                    gplot <<- gplot + annotate("text", x=divide.xval + batch.text.tf.spacing, label="False positives",\n-                                               size=batch.text.size, y=batch.text.tf.height, angle=-90,\n-                                               color=divide.text.false.color, alpha=batch.text.alpha)\n                     ## Plot the Batch names\n                     gplot <<- gplot + annotate("text", x=divide.xval, label=batch.name,\n                                                size=batch.label.text.size, y=batch.text.height, angle=0,\n-                                               color = divide.text.name.color, alpha=batch.text.alpha)\n+                                               color=divide.text.name.color, alpha=batch.text.alpha)\n                 } else {\n                     ## Plot the Batch names between blue lines\n-                    gplot <<- gplot + annotate("text", x=batch.xval, label=batch.name,\n+                    ##\n+                    ## We calculate this by taking the middle between current batch blue lines\n+                    ## and previous blue line\n+                    prev.batch.name = paste("B", batch.num - 1, sep="")\n+                    prev.batch.xval = unname(unlist(boundary.pos[[prev.batch.name]]))\n+\n+                    b.xval <- as.integer((batch.xval + prev.batch.xval)/2)\n+\n+                    gplot <<- gplot + annotate("text", x=b.xval, label=batch.name,\n                                                size=batch.label.text.size, y=batch.text.height, angle=0,\n                                                color = divide.text.name.color, alpha=batch.text.alpha)\n                 }\n@@ -159,9 +184,9 @@\n \n \n     gplot <- ggplot()\n-    drawPlates(plate.data)\n+    plotCells(coldata)\n     drawBatches(barcode.data, plate.data)\n-    plotCells(coldata)\n+    drawPlates(plate.data)\n     plotTheme()\n \n     return(gplot)\n'
b
diff -r 253c9448f524 -r 5ade5cf200da scripts/crosscontamination_filter.R
--- a/scripts/crosscontamination_filter.R Mon Jun 03 14:55:24 2019 -0400
+++ b/scripts/crosscontamination_filter.R Wed Jun 12 04:58:19 2019 -0400
[
@@ -1,5 +1,5 @@
 #!/usr/bin/env R
-VERSION = "0.2"
+VERSION = "0.3"
 
 args = commandArgs(trailingOnly = T)
 
@@ -30,11 +30,10 @@
 num.batches <- sc$batch.n
 num.plates <- sc$plates.n
 
-
 barcode.data <- calculateBarcodePositions(spec$format, num.barcodes)
 plate.data <- calculatePlatePositions(spec$plates, num.barcodes, barcode.data)
 
-ordering <- reorderMatrixHeaders(barcodes, colnames(input_matrix), spec$format, spec$plates)
+ordering <- reorderMatrixHeaders(barcodes, input_matrix, spec$format, spec$plates, sort.cells)
 
 ## Unfiltered, but sorted matrix
 nmatrix <- input_matrix[,ordering$all]
b
diff -r 253c9448f524 -r 5ade5cf200da scripts/reorder_matrix_headers.R
--- a/scripts/reorder_matrix_headers.R Mon Jun 03 14:55:24 2019 -0400
+++ b/scripts/reorder_matrix_headers.R Wed Jun 12 04:58:19 2019 -0400
[
@@ -12,15 +12,19 @@
     return(sub(regex.from, regex.to, col.names))
 }
 
-reorderMatrixHeaders <- function(barcodes, fixed.headers, barcode.format, plate.format){
+reorderMatrixHeaders <- function(barcodes, count.matrix, barcode.format, plate.format, sort.cells){
     #' Reorder headers to segment wanted and unwanted barcodes on opposite sides
     #' of each batch
     #'
     #' @param barcodes list of full barcodes
-    #' @param headers input matrix headers
+    #' @param count.matrix input matrix
     #' @param barcode.format batch list specifying valid barcodes for each batch
+    #' @param plate.format plate list specifying plate format for each batch
+    #' @param sort.cells sort cells by sizes
     #' @return list of all barcodes sorted bilaterally by batch, and true barcodes
 
+    fixed.headers <- colnames(count.matrix)
+
     batch.ordering <- list()
     batch.ordering.filtered <- list()
 
@@ -46,7 +50,17 @@
                 stop("Barcode given twice!", headers.in.batch.wanted[headers.in.batch.wanted %in% headers.in.batch.unwant])
             }
 
-            headers.in.batch.neworder <- c(headers.in.batch.wanted, headers.in.batch.unwant)
+            ## Perform cell sorting if desired
+            if (sort.cells){
+                wanted.sorted.n <- names(sort(colSums(count.matrix[headers.in.batch.wanted])))
+                unwant.sorted.n <- names(sort(colSums(count.matrix[headers.in.batch.unwant])))
+
+                headers.in.batch.wanted <- wanted.sorted.n
+                headers.in.batch.unwant <- unwant.sorted.n
+            }
+
+            ## False on the left, True on the right
+            headers.in.batch.neworder <- c(headers.in.batch.unwant, headers.in.batch.wanted)
             batch.name <- paste("B", bat, sep="")
 
             batch.ordering[[batch.name]] <<- headers.in.batch.neworder
@@ -58,7 +72,7 @@
     barcode.ordering <- c()
     barcode.ordering.filtered <- c()
 
-    res <- sapply(sort(names(plate.format)), function(plate.num){
+    res <- sapply(sortedBatchesOrPlates(names(plate.format)), function(plate.num){
         batches <- plate.format[[plate.num]]
 
         ## Preserve batch order on plates
b
diff -r 253c9448f524 -r 5ade5cf200da test-data/b12.matrix
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/b12.matrix Wed Jun 12 04:58:19 2019 -0400
b
b'@@ -0,0 +1,79 @@\n+P1_B1_AACACC\tP1_B1_AACCTC\tP1_B1_AACGAG\tP1_B1_AACTGG\tP1_B1_AAGCAC\tP1_B1_AAGCCA\tP1_B1_AAGGTG\tP1_B1_AAGTGC\tP1_B1_ACAAGC\tP1_B1_ACAGAC\tP1_B1_ACAGGA\tP1_B1_ACAGTG\tP1_B1_ACATGG\tP1_B1_ACCAAC\tP1_B1_ACCAGA\tP1_B1_ACCATG\tP1_B1_ACGGTA\tP1_B1_ACGTAC\tP1_B1_ACGTGA\tP1_B1_ACGTTG\tP1_B1_ACTCAC\tP1_B1_ACTCGA\tP1_B1_ACTCTG\tP1_B1_ACTTCG\tP1_B1_AGAACG\tP1_B1_AGACAG\tP1_B1_AGACCA\tP1_B1_AGACTC\tP1_B1_AGATGC\tP1_B1_AGCGAA\tP1_B1_AGCTAG\tP1_B1_AGCTCA\tP1_B1_AGCTTC\tP1_B1_AGGAAG\tP1_B1_AGGACA\tP1_B1_AGGATC\tP1_B1_AGGCTA\tP1_B1_AGTACC\tP1_B1_AGTAGG\tP1_B1_AGTGCA\tP1_B1_AGTGTC\tP1_B1_ATACGG\tP1_B1_ATCACG\tP1_B1_ATCAGC\tP1_B1_ATCCAC\tP1_B1_ATCCGA\tP1_B1_ATCGCA\tP1_B1_ATCGTG\tP1_B1_ATCTCC\tP1_B1_ATGACC\tP1_B1_ATGAGG\tP1_B1_ATGCAG\tP1_B1_ATGCTC\tP1_B1_ATGGAC\tP1_B1_ATGTCG\tP1_B1_ATTCGC\tP1_B1_ATTGCG\tP1_B1_CAATGC\tP1_B1_CACCAA\tP1_B1_CACGTA\tP1_B1_CACTCA\tP1_B1_CACTTC\tP1_B1_CAGAAG\tP1_B1_CAGGAA\tP1_B1_CATGCA\tP1_B1_CATGTC\tP1_B1_CATTGG\tP1_B1_CCAATC\tP1_B1_CCACAA\tP1_B1_CCAGTA\tP1_B1_CCATAG\tP1_B1_CCATCA\tP1_B1_CCGATA\tP1_B1_CCGTAA\tP1_B1_CCTACA\tP1_B1_CCTATG\tP1_B1_CCTGAA\tP1_B1_CCTTGA\tP1_B1_CGAACA\tP1_B1_CGATGA\tP1_B1_CGATTG\tP1_B1_CGCATA\tP1_B1_CGCTAA\tP1_B1_CGGTTA\tP1_B1_CGTAAG\tP1_B1_CGTCTA\tP1_B1_CGTTAC\tP1_B1_CGTTCA\tP1_B1_CTAACG\tP1_B1_CTAAGC\tP1_B1_CTAGAC\tP1_B1_CTAGGA\tP1_B1_CTAGTG\tP1_B1_CTATCC\tP1_B1_CTCAGA\tP1_B1_CTCATG\tP1_B1_CTCGAA\tP1_B1_CTGCTA\tP1_B1_CTGTTG\tP1_B1_CTTCGA\tP1_B1_GAAGAC\tP1_B1_GAAGGA\tP1_B1_GAATCC\tP1_B1_GAATGG\tP1_B1_GACAAC\tP1_B1_GACAGA\tP1_B1_GACGAA\tP1_B1_GAGCAA\tP1_B1_GAGGTA\tP1_B1_GAGTGA\tP1_B1_GAGTTG\tP1_B1_GATACG\tP1_B1_GATCGA\tP1_B1_GATCTG\tP1_B1_GATTGC\tP1_B1_GCAACA\tP1_B1_GCAATG\tP1_B1_GCAGAA\tP1_B1_GCATGA\tP1_B1_GCATTC\tP1_B1_GCCATA\tP1_B1_GCGTTA\tP1_B1_GCTAAG\tP1_B1_GCTCTA\tP1_B1_GCTTAC\tP1_B1_GCTTCA\tP1_B1_GGAATC\tP1_B1_GGACAA\tP1_B1_GGATAC\tP1_B1_GGATCA\tP1_B1_GGCTTA\tP1_B1_GGTAAC\tP1_B1_GGTAGA\tP1_B1_GGTATG\tP1_B1_GGTGTA\tP1_B1_GGTTAG\tP1_B1_GTAACC\tP1_B1_GTACAG\tP1_B1_GTACCA\tP1_B1_GTACTC\tP1_B1_GTATCG\tP1_B1_GTATGC\tP1_B1_GTCTCA\tP1_B1_GTGAAG\tP1_B1_GTGACA\tP1_B1_GTGATC\tP1_B1_GTGGAA\tP1_B1_GTTAGG\tP1_B1_GTTGAG\tP1_B1_TAACGG\tP1_B1_TACAGG\tP1_B1_TACCAC\tP1_B1_TACCGA\tP1_B1_TACGCA\tP1_B1_TACTCC\tP1_B1_TAGCTC\tP1_B1_TAGGAC\tP1_B1_TAGTGG\tP1_B1_TATCCG\tP1_B1_TATCGC\tP1_B1_TCAACG\tP1_B1_TCACAG\tP1_B1_TCATCC\tP1_B1_TCCGAA\tP1_B1_TCTAGG\tP1_B1_TCTTGC\tP1_B1_TGAACC\tP1_B1_TGAAGG\tP1_B1_TGAGGA\tP1_B1_TGATCG\tP1_B1_TGCAAC\tP1_B1_TGCAGA\tP1_B1_TGGTGA\tP1_B1_TGGTTG\tP1_B1_TGTACG\tP1_B1_TGTAGC\tP1_B1_TGTCGA\tP1_B1_TGTCTG\tP1_B1_TGTTCC\tP1_B1_TGTTGG\tP1_B1_TTACGC\tP1_B1_TTCACC\tP1_B1_TTCCAG\tP1_B1_TTCGAC\tP1_B1_TTCTCG\tP1_B1_TTGCAC\tP1_B1_TTGCGA\tP1_B1_TTGCTG\tP1_B1_TTGGAG\tP1_B1_TTGGCA\tP1_B1_TTGGTC\tP1_B1_TTGTGC\tP1_B2_AACACC\tP1_B2_AACCTC\tP1_B2_AACGAG\tP1_B2_AACTGG\tP1_B2_AAGCAC\tP1_B2_AAGCCA\tP1_B2_AAGGTG\tP1_B2_AAGTGC\tP1_B2_ACAAGC\tP1_B2_ACAGAC\tP1_B2_ACAGGA\tP1_B2_ACAGTG\tP1_B2_ACATGG\tP1_B2_ACCAAC\tP1_B2_ACCAGA\tP1_B2_ACCATG\tP1_B2_ACGGTA\tP1_B2_ACGTAC\tP1_B2_ACGTGA\tP1_B2_ACGTTG\tP1_B2_ACTCAC\tP1_B2_ACTCGA\tP1_B2_ACTCTG\tP1_B2_ACTTCG\tP1_B2_AGAACG\tP1_B2_AGACAG\tP1_B2_AGACCA\tP1_B2_AGACTC\tP1_B2_AGATGC\tP1_B2_AGCGAA\tP1_B2_AGCTAG\tP1_B2_AGCTCA\tP1_B2_AGCTTC\tP1_B2_AGGAAG\tP1_B2_AGGACA\tP1_B2_AGGATC\tP1_B2_AGGCTA\tP1_B2_AGTACC\tP1_B2_AGTAGG\tP1_B2_AGTGCA\tP1_B2_AGTGTC\tP1_B2_ATACGG\tP1_B2_ATCACG\tP1_B2_ATCAGC\tP1_B2_ATCCAC\tP1_B2_ATCCGA\tP1_B2_ATCGCA\tP1_B2_ATCGTG\tP1_B2_ATCTCC\tP1_B2_ATGACC\tP1_B2_ATGAGG\tP1_B2_ATGCAG\tP1_B2_ATGCTC\tP1_B2_ATGGAC\tP1_B2_ATGTCG\tP1_B2_ATTCGC\tP1_B2_ATTGCG\tP1_B2_CAATGC\tP1_B2_CACCAA\tP1_B2_CACGTA\tP1_B2_CACTCA\tP1_B2_CACTTC\tP1_B2_CAGAAG\tP1_B2_CAGGAA\tP1_B2_CATGCA\tP1_B2_CATGTC\tP1_B2_CATTGG\tP1_B2_CCAATC\tP1_B2_CCACAA\tP1_B2_CCAGTA\tP1_B2_CCATAG\tP1_B2_CCATCA\tP1_B2_CCGATA\tP1_B2_CCGTAA\tP1_B2_CCTACA\tP1_B2_CCTATG\tP1_B2_CCTGAA\tP1_B2_CCTTGA\tP1_B2_CGAACA\tP1_B2_CGATGA\tP1_B2_CGATTG\tP1_B2_CGCATA\tP1_B2_CGCTAA\tP1_B2_CGGTTA\tP1_B2_CGTAAG\tP1_B2_CGTCTA\tP1_B2_CGTTAC\tP1_B2_CGTTCA\tP1_B2_CTAACG\tP1_B2_CTAAGC\tP1_B2_CTAGAC\tP1_B2_CTAGGA\tP1_B2_CTAGTG\tP1_B2_CTATCC\tP1_B2_CTCAGA\tP1_B2_CTCATG\tP1_B2_CTCGAA\tP1_B2_CTGCTA\tP1_B2_CTGTTG\tP1_B2_CTTCGA\tP1_B2_GAAGAC\tP1_B2_GAAGGA\tP1_B2_GAATCC\tP1_B2_GAATGG\tP1_B2_GACAAC\tP1_B2_GACAGA\tP1_B2_GACGAA\tP1_B2_GAGCAA\tP1_B2_GAGGTA\tP1_B2_GAGTGA\tP1_B2_GAGTTG\tP1_B2_GATACG\tP1_B2_GATCGA\tP1_B2_GATCTG\tP1_'..b'0\t2\t0\t0\t14\t1\t0\t0\t49\t0\t0\t0\t0\t0\t0\t0\t64\t0\t0\t0\t12\t15\t0\t0\t0\t0\t0\t0\t67\t27\t8\t0\t0\t1\t0\t9\t4\t5\t73\t11\t29\t55\t53\t27\t26\t48\t0\t63\t0\t49\t0\t9\t0\t0\t0\t5\t0\t0\t4\t29\t0\t10\t0\t8\t19\t10\t29\t11\t6\t2\t17\t0\t0\t7\t5\t48\t4\t0\t8\t2\t48\t0\t0\t0\t0\t0\t0\t0\t6\t2\t0\t0\t0\t0\t0\t0\t0\t0\t0\t17\t4\t0\t0\t0\t0\t0\t26\t0\t45\t10\t11\t7\t17\t8\t1\t19\t4\t1\t8\t0\t51\t1\t3\t0\t48\t3\t5\t3\t17\t0\t0\t0\t37\t3\t0\t0\t0\t0\t0\t21\t0\t0\t16\t4\t8\t5\t13\t88\t1\t0\t38\t7\t8\t0\t0\t0\t5\t0\t0\t0\t0\t35\t0\t0\t0\t1\t0\t59\t0\t0\t26\t52\t9\t0\t0\t24\t0\t32\t133\t40\t63\t8\t3\t0\t0\t12\t78\t0\t0\t85\t0\t3\t105\t74\t21\t0\t0\t86\t61\t25\t0\t68\t5\t36\t83\t16\t87\t77\t0\t56\t44\t4\t0\t0\t116\t2\t33\t9\t12\t32\t0\t0\t1\t125\t5\t0\t88\t0\t0\t0\t2\t0\t0\t0\t0\t0\t0\t0\t34\t0\t96\t0\t19\t0\t24\t74\t65\t0\t17\t58\t0\t0\t41\t0\t9\t0\t0\t0\t0\t1\t0\t0\t0\t13\t128\t0\t0\t0\t0\t22\t0\t0\t0\t12\t48\t91\t92\t79\t142\t20\t0\t0\t20\t31\t118\t3\t17\t67\t14\t20\t68\t0\t0\t35\t21\t69\t28\t37\t1\t74\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t3\t0\t0\t0\t12\t0\t0\t0\t0\t0\t9\t51\t5\t0\t0\t64\t25\t10\t42\t16\t0\t32\t4\t0\t0\t0\t0\t0\t0\t52\t11\t0\t0\t0\t58\t81\t14\t0\t56\t113\t2\t7\t0\t83\t19\t28\t27\t68\t0\t50\t4\t0\t0\t0\t22\t101\t0\t46\t0\t0\t0\t0\t0\t0\t182\t18\t4\t7\t45\t12\t1\t22\t29\t0\t5\t29\t14\t6\t11\t7\t1\t22\t23\t12\t1\t3\t16\t5\t6\t2\t5\t0\t5\t24\t23\t9\t6\t5\t0\t8\t4\t14\t15\t16\t25\t1\t9\t14\t15\t29\t26\t5\t6\t13\t23\t6\t0\t25\t11\t2\t5\t7\t30\t3\t3\t4\t19\t0\t24\t10\t19\t46\t9\t0\t10\t3\t3\t1\t6\t5\t1\t1\t5\t9\t3\t1\t9\t14\t0\t9\t13\t0\t15\t3\t3\t17\t17\t0\t0\t4\t22\t4\t20\t8\t3\t9\t1\t5\t0\t5\t0\t0\t3\t10\t0\t1\t26\t3\t0\t20\t11\t13\t14\t7\t33\t0\t11\t13\t6\t12\t23\t9\t2\t13\t0\t0\t2\t4\t5\t2\t1\t10\t12\t2\t0\t8\t4\t1\t7\t7\t3\t0\t44\t9\t1\t10\t13\t18\t0\t31\t16\t5\t9\t4\t80\t0\t2\t4\t4\t9\t2\t11\t5\t12\t8\t7\t4\t7\t18\t24\t16\t4\t1\t44\t1\t21\t8\t7\t31\t10\t26\t2\t3\t24\t8\t5\t2\t18\t9\t36\t107\t29\t8\t60\t40\t0\t10\t59\t41\t11\t25\t21\t12\t65\t34\t31\t8\t27\t52\t8\t28\t1\t10\t11\t14\t26\t59\t38\t12\t11\t1\t44\t12\t30\t36\t50\t52\t5\t14\t21\t15\t75\t75\t10\t10\t20\t55\t3\t7\t40\t15\t13\t15\t11\t33\t5\t5\t9\t36\t7\t73\t23\t17\t114\t18\t0\t30\t23\t7\t3\t14\t7\t8\t9\t13\t34\t5\t1\t54\t82\t4\t13\t50\t3\t27\t11\t11\t37\t42\t2\t2\t16\t86\t16\t65\t14\t8\t12\t8\t11\t2\t9\t15\t4\t17\t19\t2\t8\t38\t9\t1\t30\t11\t46\t44\t23\t103\t3\t35\t28\t18\t22\t65\t14\t2\t19\t3\t0\t3\t9\t11\t20\t9\t33\t23\t14\t4\t15\t11\t7\t11\t15\t4\t6\t101\t26\t2\t37\t26\t39\t3\t43\t23\t8\t27\t13\t137\t1\t4\t8\t13\t7\t3\t17\t27\t27\t18\t20\t5\t18\t44\t27\t24\t2\t2\t35\t9\t58\t17\t6\t36\t26\t40\t11\t9\t79\t17\t10\t1\t101\t0\t0\t1\t8\t0\t48\t1\t0\t0\t0\t0\t6\t0\t0\t0\t6\t0\t0\t0\t0\t0\t0\t0\t20\t0\t0\t0\t33\t23\t0\t0\t0\t0\t0\t1\t27\t0\t26\t0\t0\t28\t0\t91\t1\t4\t54\t17\t10\t17\t2\t9\t12\t9\t0\t10\t0\t20\t0\t12\t0\t0\t0\t16\t0\t0\t0\t18\t0\t13\t0\t31\t2\t3\t52\t14\t38\t11\t15\t0\t0\t8\t11\t15\t28\t0\t7\t7\t1\t0\t0\t0\t0\t0\t0\t0\t70\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t23\t6\t0\t0\t0\t0\t0\t20\t0\t52\t3\t53\t12\t48\t75\t5\t2\t6\t56\t17\t0\t32\t20\t2\t0\t36\t54\t0\t15\t13\t0\t0\t1\t26\t8\t0\t0\t0\t0\t0\t34\t0\t0\t23\t14\t5\t5\t2\t47\t0\t0\t6\t11\t104\t0\t0\t1\t48\t0\t0\t0\t0\t4\t0\t0\t0\t0\t0\t26\t0\t0\t90\t39\t40\t0\t0\t6\t0\t22\t36\t33\t45\t74\t18\t0\t0\t0\t4\t0\t0\t6\t0\t0\t16\t0\t11\t2\t0\t0\t0\t4\t1\t4\t13\t8\t23\t3\t1\t8\t0\t9\t5\t8\t0\t0\t0\t6\t18\t17\t4\t18\t0\t0\t0\t11\t20\t0\t5\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t1\t0\t1\t0\t9\t0\t1\t17\t5\t0\t12\t1\t1\t0\t13\t0\t2\t0\t0\t0\t0\t0\t0\t0\t0\t31\t8\t0\t0\t0\t0\t17\t0\t0\t0\t4\t0\t10\t3\t4\t2\t6\t0\t0\t0\t33\t7\t6\t5\t14\t5\t0\t1\t0\t0\t2\t3\t9\t0\t1\t0\t1\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t4\t0\t0\t0\t11\t0\t0\t0\t0\t0\t10\t6\t14\t0\t0\t2\t11\t5\t3\t25\t0\t5\t8\t0\t1\t0\t0\t0\t0\t7\t14\t0\t0\t0\t3\t14\t20\t0\t3\t10\t0\t6\t0\t8\t5\t2\t2\t8\t0\t1\t8\t0\t0\t0\t5\t8\t0\t2\t0\t0\t0\t0\t0\t0\t14\t57\t0\t0\t4\t5\t0\t20\t14\t0\t0\t0\t0\t41\t0\t0\t0\t23\t0\t0\t0\t0\t0\t0\t0\t24\t0\t0\t0\t51\t34\t0\t0\t0\t0\t0\t0\t41\t25\t21\t0\t1\t22\t0\t69\t12\t11\t2\t33\t13\t9\t14\t25\t5\t3\t0\t26\t0\t49\t0\t25\t0\t0\t0\t1\t0\t0\t11\t19\t0\t0\t0\t38\t23\t14\t12\t7\t21\t29\t14\t1\t0\t72\t33\t28\t19\t0\t26\t15\t1\t0\t0\t0\t0\t0\t1\t0\t7\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t19\t5\t0\t0\t0\t0\t0\t74\t0\t22\t12\t69\t32\t19\t11\t16\t15\t15\t10\t3\t0\t27\t0\t1\t0\t23\t4\t23\t6\t1\t0\t0\t0\t6\t1\t0\t1\t0\t0\t0\t15\t0\t0\t32\t38\t31\t26\t19\t27\t0\t0\t123\t18\t61\t0\t0\t0\t68\t0\t0\t0\t0\t20\t0\t0\t0\t0\t0\t66\t0\t0\t37\t2\t0\t0\t0\t48\t0\t34\t8\t9\t9\t11\t21\t0\t0\t8\t4\t0\t0\t4\t0\t0\t0\t10\t15\t0\t0\t7\t0\t5\t0\t12\t10\t0\t0\t18\t0\t3\t0\t1\t4\t2\t0\t0\t1\t1\t0\t2\t4\t7\t0\t0\t0\t4\t8\t0\t13\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t3\t0\t5\t0\t1\t0\t2\t16\t1\t0\t1\t0\t0\t0\t4\t0\t2\t0\t0\t0\t0\t0\t0\t0\t0\t0\t11\t0\t0\t0\t0\t9\t0\t0\t0\t0\t4\t9\t4\t0\t6\t10\t1\t0\t1\t4\t2\t1\t0\t0\t5\t4\t0\t0\t0\t1\t5\t2\t9\t2\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t6\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t3\t4\t7\t0\t2\t0\t5\t12\t1\t0\t0\t0\t0\t0\t12\t4\t0\t0\t0\t5\t2\t0\t0\t3\t10\t3\t0\t0\t5\t7\t3\t0\t6\t0\t2\t14\t0\t0\t0\t1\t16\t0\t3\t0\t0\t0\t0\t0\t0\t31\t4\t0\t0\t7\t5\t0\t2\t1\t0\t0\t0\t0\t0\t0\t0\t0\t7\t0\t0\t0\t0\t0\t0\t0\t23\t0\t0\t0\t9\t25\t0\t0\t0\t0\t0\t0\t1\t6\t4\t1\t0\t4\t0\t23\t1\t2\t55\t0\t5\t6\t6\t1\t72\t16\t0\t2\t0\t3\t0\t45\t0\t0\t0\t0\t0\t0\t0\t48\t0\t5\t0\t89\t30\t0\t9\t5\t0\t27\t18\t0\t1\t1\t7\t0\t3\t1\t97\t0\t19\t0\t0\t0\t0\t0\t0\t0\t4\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t18\t0\t0\t0\t0\t1\t3\t0\t14\t0\t14\t0\t2\t12\t1\t9\t1\t67\t1\t0\t26\t9\t0\t0\t4\t4\t3\t0\t3\t0\t0\t0\t16\t1\t0\t1\t0\t0\t0\t11\t0\t1\t32\t3\t4\t1\t79\t101\t0\t0\t8\t76\t7\t0\t0\t0\t4\t0\t0\t0\t0\t8\t0\t0\t0\t0\t0\t1\t0\t0\t2\t0\t2\t0\t0\t11\t0\t2\t0\t12\t1\t10\t14\t0\n'
b
diff -r 253c9448f524 -r 5ade5cf200da test-data/b12.pdf
b
Binary file test-data/b12.pdf has changed
b
diff -r 253c9448f524 -r 5ade5cf200da test-data/b12.table
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/b12.table Wed Jun 12 04:58:19 2019 -0400
b
b'@@ -0,0 +1,79 @@\n+P1_B1_AACCTC\tP1_B1_AACGAG\tP1_B1_AAGCCA\tP1_B1_ACAAGC\tP1_B1_ACAGAC\tP1_B1_ACAGGA\tP1_B1_ACAGTG\tP1_B1_ACCAAC\tP1_B1_ACCAGA\tP1_B1_ACCATG\tP1_B1_ACGTAC\tP1_B1_ACGTGA\tP1_B1_ACGTTG\tP1_B1_ACTCAC\tP1_B1_ACTCGA\tP1_B1_ACTCTG\tP1_B1_ACTTCG\tP1_B1_AGACAG\tP1_B1_AGACCA\tP1_B1_AGACTC\tP1_B1_AGCTAG\tP1_B1_AGCTCA\tP1_B1_AGCTTC\tP1_B1_AGGAAG\tP1_B1_AGGACA\tP1_B1_AGGATC\tP1_B1_AGTGCA\tP1_B1_AGTGTC\tP1_B1_ATCACG\tP1_B1_ATGTCG\tP1_B1_ATTGCG\tP1_B1_CACCAA\tP1_B1_CACTCA\tP1_B1_CACTTC\tP1_B1_CAGAAG\tP1_B1_CATGCA\tP1_B1_CATGTC\tP1_B1_CCACAA\tP1_B1_CCATAG\tP1_B1_CGATGA\tP1_B1_CGATTG\tP1_B1_CGTCTA\tP1_B1_CTAAGC\tP1_B1_CTAGAC\tP1_B1_CTAGGA\tP1_B1_CTAGTG\tP1_B1_CTATCC\tP1_B1_CTCAGA\tP1_B1_CTCATG\tP1_B1_CTGTTG\tP1_B1_CTTCGA\tP1_B1_GAAGAC\tP1_B1_GAAGGA\tP1_B1_GAATCC\tP1_B1_GAATGG\tP1_B1_GACAAC\tP1_B1_GACAGA\tP1_B1_GACGAA\tP1_B1_GAGTGA\tP1_B1_GAGTTG\tP1_B1_GATACG\tP1_B1_GATCGA\tP1_B1_GATCTG\tP1_B1_GCAACA\tP1_B1_GGACAA\tP1_B1_GGTAAC\tP1_B1_GTACAG\tP1_B1_GTACCA\tP1_B1_GTACTC\tP1_B1_GTCTCA\tP1_B1_GTGAAG\tP1_B1_GTGACA\tP1_B1_GTGATC\tP1_B1_GTGGAA\tP1_B1_GTTGAG\tP1_B1_TAACGG\tP1_B1_TAGGAC\tP1_B1_TAGTGG\tP1_B1_TCACAG\tP1_B1_TCATCC\tP1_B1_TCCGAA\tP1_B1_TCTTGC\tP1_B1_TGAACC\tP1_B1_TGAAGG\tP1_B1_TGAGGA\tP1_B1_TGCAAC\tP1_B1_TGCAGA\tP1_B1_TGGTGA\tP1_B1_TGGTTG\tP1_B1_TGTACG\tP1_B1_TGTCGA\tP1_B1_TGTCTG\tP1_B1_TTCACC\tP1_B1_TTCCAG\tP1_B1_TTCTCG\tP1_B1_TTGTGC\tP1_B2_AACACC\tP1_B2_AACTGG\tP1_B2_AAGCAC\tP1_B2_AAGGTG\tP1_B2_AAGTGC\tP1_B2_ACATGG\tP1_B2_ACGGTA\tP1_B2_AGAACG\tP1_B2_AGATGC\tP1_B2_AGCGAA\tP1_B2_AGGCTA\tP1_B2_AGTACC\tP1_B2_AGTAGG\tP1_B2_ATACGG\tP1_B2_ATCAGC\tP1_B2_ATCCAC\tP1_B2_ATCCGA\tP1_B2_ATCGCA\tP1_B2_ATCGTG\tP1_B2_ATCTCC\tP1_B2_ATGACC\tP1_B2_ATGAGG\tP1_B2_ATGCAG\tP1_B2_ATGCTC\tP1_B2_ATGGAC\tP1_B2_ATTCGC\tP1_B2_CAATGC\tP1_B2_CACGTA\tP1_B2_CAGGAA\tP1_B2_CATTGG\tP1_B2_CCAATC\tP1_B2_CCAGTA\tP1_B2_CCATCA\tP1_B2_CCGATA\tP1_B2_CCGTAA\tP1_B2_CCTACA\tP1_B2_CCTATG\tP1_B2_CCTGAA\tP1_B2_CCTTGA\tP1_B2_CGAACA\tP1_B2_CGCATA\tP1_B2_CGCTAA\tP1_B2_CGGTTA\tP1_B2_CGTAAG\tP1_B2_CGTTAC\tP1_B2_CGTTCA\tP1_B2_CTAACG\tP1_B2_CTCGAA\tP1_B2_CTGCTA\tP1_B2_GAGCAA\tP1_B2_GAGGTA\tP1_B2_GATTGC\tP1_B2_GCAATG\tP1_B2_GCAGAA\tP1_B2_GCATGA\tP1_B2_GCATTC\tP1_B2_GCCATA\tP1_B2_GCGTTA\tP1_B2_GCTAAG\tP1_B2_GCTCTA\tP1_B2_GCTTAC\tP1_B2_GCTTCA\tP1_B2_GGAATC\tP1_B2_GGATAC\tP1_B2_GGATCA\tP1_B2_GGCTTA\tP1_B2_GGTAGA\tP1_B2_GGTATG\tP1_B2_GGTGTA\tP1_B2_GGTTAG\tP1_B2_GTAACC\tP1_B2_GTATCG\tP1_B2_GTATGC\tP1_B2_GTTAGG\tP1_B2_TACAGG\tP1_B2_TACCAC\tP1_B2_TACCGA\tP1_B2_TACGCA\tP1_B2_TACTCC\tP1_B2_TAGCTC\tP1_B2_TATCCG\tP1_B2_TATCGC\tP1_B2_TCAACG\tP1_B2_TCTAGG\tP1_B2_TGATCG\tP1_B2_TGTAGC\tP1_B2_TGTTCC\tP1_B2_TGTTGG\tP1_B2_TTACGC\tP1_B2_TTCGAC\tP1_B2_TTGCAC\tP1_B2_TTGCGA\tP1_B2_TTGCTG\tP1_B2_TTGGAG\tP1_B2_TTGGCA\tP1_B2_TTGGTC\tP1_B3_AACCTC\tP1_B3_AACGAG\tP1_B3_AAGCCA\tP1_B3_ACAAGC\tP1_B3_ACAGAC\tP1_B3_ACAGGA\tP1_B3_ACAGTG\tP1_B3_ACCAAC\tP1_B3_ACCAGA\tP1_B3_ACCATG\tP1_B3_ACGTAC\tP1_B3_ACGTGA\tP1_B3_ACGTTG\tP1_B3_ACTCAC\tP1_B3_ACTCGA\tP1_B3_ACTCTG\tP1_B3_ACTTCG\tP1_B3_AGACAG\tP1_B3_AGACCA\tP1_B3_AGACTC\tP1_B3_AGCTAG\tP1_B3_AGCTCA\tP1_B3_AGCTTC\tP1_B3_AGGAAG\tP1_B3_AGGACA\tP1_B3_AGGATC\tP1_B3_AGTGCA\tP1_B3_AGTGTC\tP1_B3_ATCACG\tP1_B3_ATGTCG\tP1_B3_ATTGCG\tP1_B3_CACCAA\tP1_B3_CACTCA\tP1_B3_CACTTC\tP1_B3_CAGAAG\tP1_B3_CATGCA\tP1_B3_CATGTC\tP1_B3_CCACAA\tP1_B3_CCATAG\tP1_B3_CGATGA\tP1_B3_CGATTG\tP1_B3_CGTCTA\tP1_B3_CTAAGC\tP1_B3_CTAGAC\tP1_B3_CTAGGA\tP1_B3_CTAGTG\tP1_B3_CTATCC\tP1_B3_CTCAGA\tP1_B3_CTCATG\tP1_B3_CTGTTG\tP1_B3_CTTCGA\tP1_B3_GAAGAC\tP1_B3_GAAGGA\tP1_B3_GAATCC\tP1_B3_GAATGG\tP1_B3_GACAAC\tP1_B3_GACAGA\tP1_B3_GACGAA\tP1_B3_GAGTGA\tP1_B3_GAGTTG\tP1_B3_GATACG\tP1_B3_GATCGA\tP1_B3_GATCTG\tP1_B3_GCAACA\tP1_B3_GGACAA\tP1_B3_GGTAAC\tP1_B3_GTACAG\tP1_B3_GTACCA\tP1_B3_GTACTC\tP1_B3_GTCTCA\tP1_B3_GTGAAG\tP1_B3_GTGACA\tP1_B3_GTGATC\tP1_B3_GTGGAA\tP1_B3_GTTGAG\tP1_B3_TAACGG\tP1_B3_TAGGAC\tP1_B3_TAGTGG\tP1_B3_TCACAG\tP1_B3_TCATCC\tP1_B3_TCCGAA\tP1_B3_TCTTGC\tP1_B3_TGAACC\tP1_B3_TGAAGG\tP1_B3_TGAGGA\tP1_B3_TGCAAC\tP1_B3_TGCAGA\tP1_B3_TGGTGA\tP1_B3_TGGTTG\tP1_B3_TGTACG\tP1_B3_TGTCGA\tP1_B3_TGTCTG\tP1_B3_TTCACC\tP1_B3_TTCCAG\tP1_B3_TTCTCG\tP1_B3_TTGTGC\tP1_B4_AACACC\tP1_B4_AACTGG\tP1_B4_AAGCAC\tP1_B4_AAGGTG\tP1_B4_AAGTGC\tP1_B4_ACATGG\tP1_B4_ACGGTA\tP1_B4_AGAACG\tP1_B4_AGATGC\tP1_B4_AGCGAA\tP1_B4_AGGCTA\tP1_B4_AGTACC\tP1_B4_AGTAGG\tP1_B4_ATACGG\tP1_B4_ATCAGC\tP1_B4_ATCCAC\tP1_B4_ATCCGA\tP1_B4_ATCGCA\tP1_'..b'\t36\t4\t0\t0\t1\t0\t3\t19\t0\t5\t8\t9\t7\t2\t1\t0\t7\t2\t2\t13\t2\t0\t31\t1\t50\t6\t1\t8\t1\t1\t1\t0\t19\t2\t34\t14\t16\t2\t37\t18\t1\t0\t5\t7\t53\t1\t2\t9\t3\t1\t9\t14\t22\t0\t3\t8\t16\t33\t30\t23\t48\t12\t0\t2\t3\t5\t41\t16\t18\t0\t25\t5\t2\t35\t95\t10\t3\t18\t1\t14\t21\t5\t0\t3\t18\t4\t5\t7\t12\t4\t0\t5\t1\t6\t0\t1\t6\t8\t0\t17\t4\t0\t16\t89\t1\t0\t1\t7\t7\t18\t7\t16\t37\t101\t8\t6\t1\t2\t7\t48\t2\t0\t17\t3\t34\t1\t9\t0\t6\t74\t3\t1\t8\t0\t31\t0\t5\t5\t14\t64\t13\t26\t8\t46\t8\t1\t1\t31\t5\t9\t8\t13\t3\t1\t1\t20\t12\t0\t0\t10\t1\t37\t7\t6\t17\t0\t11\t0\t20\t6\t17\t2\t8\t1\t8\t3\t6\t1\t1\t4\t81\t12\t22\t88\t92\t37\t15\t17\t4\t2\t5\t0\t48\t0\t0\t10\t0\t65\t0\t0\t4\t2\t3\t103\t40\t13\t13\t4\t8\t0\t4\t90\t6\t15\t17\t18\t1\t0\t22\t4\t3\t3\t16\t3\t12\t50\t5\t2\t0\t33\t4\t0\t1\t1\t14\t24\t52\t0\t9\t7\t5\t1\t16\t24\t1\t4\t0\t0\t25\t21\t57\t3\t1\t55\t4\t14\t0\t97\t47\t30\t1\t2\t2\t0\t0\t55\t4\t0\t2\t79\t8\t0\t0\t4\t10\t18\t3\t2\t0\t0\t80\t21\t0\t21\t41\t6\t1\t7\t1\t10\t2\t7\t23\t2\t3\t8\t34\t1\t1\t4\t33\t45\t6\t6\t0\t0\t2\t6\t0\t0\t9\t59\t4\t2\t1\t0\t14\t3\t121\t2\t46\t0\t2\t0\t0\t0\t0\t0\t15\t0\t1\t0\t0\t0\t0\t2\t0\t0\t0\t0\t0\t5\t0\t1\t0\t0\t0\t0\t0\t0\t1\t26\t4\t0\t23\t0\t1\t0\t0\t4\t15\t0\t8\t0\t0\t0\t1\t7\t0\t1\t0\t4\t0\t3\t3\t4\t0\t0\t7\t0\t3\t0\t14\t0\t38\t3\t0\t0\t0\t1\t0\t1\t0\t0\t1\t13\t1\t0\t0\t12\t17\t6\t13\t4\t0\t0\t1\t0\t1\t0\t1\t0\t0\t2\t0\t3\t3\n+78\t32\t57\t8\t30\t39\t5\t11\t21\t7\t29\t15\t13\t18\t67\t0\t34\t50\t31\t51\t12\t3\t20\t47\t32\t18\t20\t115\t40\t16\t11\t5\t11\t28\t60\t11\t50\t9\t11\t28\t47\t56\t14\t26\t32\t3\t48\t27\t26\t2\t9\t24\t8\t23\t44\t19\t34\t7\t12\t52\t6\t46\t9\t15\t25\t11\t9\t39\t20\t17\t30\t12\t35\t18\t9\t10\t33\t90\t39\t8\t28\t14\t28\t190\t1\t15\t10\t19\t49\t27\t31\t19\t35\t94\t10\t47\t115\t87\t23\t17\t16\t47\t21\t16\t2\t129\t28\t16\t64\t82\t17\t130\t20\t91\t26\t17\t93\t54\t13\t35\t179\t19\t44\t28\t16\t62\t37\t35\t83\t28\t113\t31\t24\t98\t20\t6\t12\t8\t17\t2\t81\t67\t76\t10\t22\t51\t17\t85\t98\t26\t6\t10\t54\t58\t61\t88\t57\t73\t51\t20\t127\t29\t20\t1\t105\t45\t7\t28\t40\t152\t75\t28\t77\t79\t128\t13\t217\t30\t10\t17\t7\t30\t145\t137\t75\t103\t95\t13\t5\t4\t23\t37\t82\t88\t17\t17\t7\t70\t13\t19\t67\t36\t29\t17\t30\t24\t13\t19\t9\t72\t90\t50\t50\t80\t6\t33\t19\t41\t71\t56\t80\t210\t6\t55\t8\t4\t49\t57\t34\t91\t31\t6\t37\t185\t28\t92\t21\t64\t2\t65\t18\t40\t37\t19\t16\t12\t27\t74\t35\t4\t17\t75\t30\t89\t70\t29\t1\t10\t29\t93\t70\t11\t37\t23\t65\t15\t16\t76\t66\t49\t57\t14\t17\t27\t32\t130\t56\t70\t42\t14\t52\t100\t90\t65\t53\t11\t104\t6\t150\t32\t0\t6\t72\t114\t14\t49\t64\t12\t15\t67\t27\t8\t1\t9\t4\t5\t73\t11\t29\t55\t53\t27\t26\t48\t63\t49\t9\t5\t4\t29\t10\t8\t19\t10\t29\t11\t6\t2\t17\t7\t5\t48\t4\t8\t2\t48\t6\t2\t17\t4\t26\t45\t10\t11\t7\t17\t8\t1\t19\t4\t1\t8\t51\t1\t3\t48\t3\t5\t3\t17\t37\t3\t21\t16\t4\t8\t5\t13\t88\t38\t7\t8\t5\t35\t59\t26\t52\t9\t24\t32\t133\t40\t63\t8\t3\t12\t78\t85\t105\t74\t21\t0\t86\t61\t25\t68\t5\t36\t83\t16\t87\t77\t56\t44\t4\t116\t2\t33\t9\t12\t32\t125\t5\t88\t34\t96\t19\t24\t74\t65\t17\t58\t41\t9\t13\t128\t22\t12\t48\t91\t92\t79\t142\t20\t20\t31\t118\t3\t17\t67\t14\t20\t68\t35\t21\t69\t28\t37\t74\t3\t12\t9\t51\t5\t64\t25\t10\t42\t16\t32\t4\t52\t11\t58\t81\t14\t56\t113\t2\t7\t83\t19\t28\t27\t68\t50\t4\t22\t101\t46\t182\t18\t45\t12\t22\t29\t6\t22\t2\t24\t23\t14\t15\t16\t9\t15\t29\t26\t5\t6\t13\t23\t6\t0\t25\t11\t5\t30\t3\t24\t46\t9\t10\t3\t1\t6\t5\t1\t1\t5\t9\t9\t14\t0\t9\t0\t15\t3\t4\t20\t3\t10\t20\t13\t14\t7\t33\t0\t11\t13\t6\t12\t23\t9\t13\t0\t0\t4\t5\t2\t1\t10\t8\t4\t44\t10\t13\t18\t0\t31\t16\t4\t80\t0\t9\t8\t16\t44\t1\t21\t31\t26\t2\t3\t24\t8\t5\t9\t36\t8\t0\t10\t59\t41\t25\t21\t12\t34\t31\t8\t27\t52\t8\t28\t10\t11\t14\t38\t12\t11\t1\t44\t12\t52\t5\t21\t13\t11\t5\t9\t36\t7\t23\t17\t0\t23\t5\t1\t50\t11\t37\t42\t2\t2\t16\t86\t14\t8\t12\t8\t11\t2\t9\t15\t4\t2\t8\t38\t9\t1\t11\t2\t3\t23\t14\t4\t7\t11\t15\t4\t6\t26\t2\t8\t27\t4\t8\t13\t3\t17\t27\t27\t20\t5\t18\t44\t27\t2\t2\t17\t6\t26\t1\t101\t1\t8\t48\t1\t6\t6\t20\t33\t23\t27\t0\t26\t28\t91\t1\t4\t54\t17\t10\t17\t2\t9\t12\t9\t10\t20\t12\t16\t0\t18\t13\t31\t2\t3\t52\t14\t38\t11\t15\t8\t11\t15\t28\t7\t7\t1\t70\t1\t23\t6\t20\t52\t3\t53\t12\t48\t75\t5\t2\t6\t56\t17\t32\t20\t2\t36\t54\t0\t15\t13\t26\t8\t34\t23\t14\t5\t5\t2\t47\t6\t11\t104\t48\t4\t26\t90\t39\t40\t6\t22\t36\t33\t45\t74\t18\t0\t4\t6\t16\t0\t11\t2\t0\t0\t4\t4\t13\t8\t23\t3\t1\t8\t9\t5\t8\t0\t6\t18\t17\t4\t18\t11\t20\t5\t1\t1\t9\t1\t17\t5\t12\t1\t13\t2\t31\t8\t17\t4\t0\t10\t3\t4\t2\t6\t0\t33\t7\t6\t5\t14\t5\t0\t1\t2\t3\t9\t0\t1\t1\t4\t11\t10\t6\t14\t2\t11\t5\t3\t25\t5\t8\t7\t14\t3\t14\t20\t3\t10\t0\t6\t8\t5\t2\t2\t8\t1\t8\t5\t8\t2\t14\t57\t4\t5\t20\t14\t41\t23\t24\t51\t34\t41\t25\t21\t22\t69\t12\t11\t2\t33\t13\t9\t14\t25\t5\t3\t26\t49\t25\t1\t11\t19\t0\t38\t23\t14\t12\t7\t21\t29\t14\t72\t33\t28\t19\t26\t15\t1\t7\t0\t19\t5\t74\t22\t12\t69\t32\t19\t11\t16\t15\t15\t10\t3\t27\t0\t1\t23\t4\t23\t6\t1\t6\t1\t15\t32\t38\t31\t26\t19\t27\t123\t18\t61\t68\t20\t66\t37\t2\t0\t48\t34\t8\t9\t9\t11\t21\t8\t4\t4\t0\t10\t15\t0\t7\t0\t5\t12\t10\t0\t0\t18\t0\t3\t1\t4\t2\t1\t1\t0\t2\t4\t7\t4\t8\t13\t3\t5\t1\t2\t16\t1\t1\t0\t4\t2\t0\t11\t9\t0\t4\t9\t4\t0\t6\t10\t1\t4\t2\t1\t0\t0\t5\t4\t0\t1\t5\t2\t9\t2\t0\t6\t0\t1\t0\t0\t3\t4\t7\t0\t2\t5\t12\t12\t4\t5\t2\t0\t3\t10\t3\t0\t5\t7\t3\t0\t6\t2\t14\t1\t16\t3\t31\t4\t7\t5\t2\t1\t0\t7\t23\t9\t25\t1\t6\t4\t4\t23\t1\t2\t55\t0\t5\t6\t6\t1\t72\t16\t2\t3\t45\t0\t0\t48\t5\t89\t30\t0\t9\t5\t0\t27\t18\t1\t7\t0\t3\t97\t0\t19\t4\t1\t1\t18\t3\t14\t0\t14\t0\t2\t12\t1\t9\t1\t67\t1\t26\t9\t0\t4\t4\t3\t0\t3\t16\t1\t11\t32\t3\t4\t1\t79\t101\t8\t76\t7\t4\t8\t1\t2\t0\t2\t11\t2\t0\t12\t1\t10\t14\n'
b
diff -r 253c9448f524 -r 5ade5cf200da test-data/out.pdf
b
Binary file test-data/out.pdf has changed