Repository 'metadegalaxy_symmetric_plot'
hg clone https://toolshed.g2.bx.psu.edu/repos/qfabrepo/metadegalaxy_symmetric_plot

Changeset 0:0cac08094b86 (2020-09-14)
Next changeset 1:680917d9d415 (2020-09-14)
Commit message:
"planemo upload for repository https://github.com/QFAB-Bioinformatics/metaDEGalaxy/tree/master/symmetric_plot commit a68579d7bdde7420b8f04346d3b6e361588acf50"
added:
symmetric_plot.r
symmetric_plot.xml
test-data/SymmetricPlot.html
test-data/count.txt
test-data/metadata.txt
test-data/observation.txt
b
diff -r 000000000000 -r 0cac08094b86 symmetric_plot.r
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/symmetric_plot.r Mon Sep 14 06:04:44 2020 +0000
[
@@ -0,0 +1,182 @@
+library('getopt')
+library('tidyr')
+suppressPackageStartupMessages(library('dplyr'))
+suppressPackageStartupMessages(library('phyloseq'))
+suppressPackageStartupMessages(library('DESeq2'))
+suppressPackageStartupMessages(library('ggplot2'))
+suppressPackageStartupMessages(library('data.table'))
+Sys.setenv("DISPLAY"=":1")
+
+
+options(warn= -1)
+option_specification = matrix(c(
+  'input.data','i',2,'character',
+   'meta.data','m',2,'character',
+   'obs.data','t',2,'character',
+   'record','r',2,'numeric',
+   'taxrank','x',2,'character',
+ 'norm','n',2,'logical',
+    'n.column','c',2,'numeric',
+     'g.group','g',2,'character',
+      'outdir','o',2,'character',
+    'htmlfile','h',2,'character'
+),byrow=TRUE,ncol=4);
+
+
+options <- getopt(option_specification);
+options(bitmapType="cairo")

+
+if (!is.null(options$outdir)) {
+  # Create the directory
+  dir.create(options$outdir,FALSE)
+}
+
+
+input.table<-read.table(options$input.data,header=T,sep="\t",stringsAsFactors = F)
+metadata.table<-read.table(options$meta.data,header=T,sep="\t",stringsAsFactors = F,comment.char="")
+obs.table<-read.table(options$obs.data,header=F,sep="\t",stringsAsFactors = F,comment.char="")
+
+colnames(obs.table)<-c("OTUID","taxonomy")
+
+
+tax_col <- c("OTUID","Kingdom","Phylum","Class","Order","Family","Genus","Species")
+tax_col_extra <- c("OTUID","None","Kingdom","Phylum","Class","Order","Family","Genus","Species")
+
+### remove the leading #sign in column name if the column name begins with number
+colnames(input.table)<-gsub("^X","",colnames(input.table))
+colnames(metadata.table)<-gsub("^X.","",colnames(metadata.table))
+
+
+column.name<-colnames(metadata.table)[options$n.column]
+#in.column<-options$g.column
+in.group<-options$g.group
+nrecord<-options$record
+ranking<-options$taxrank
+
+### create data frame for group
+group.df<-data.frame(group=unlist(strsplit(in.group,",")),stringsAsFactors = F)
+
+### get the number of group
+number.of.group<-dim(group.df)[1]
+
+if(number.of.group != 2){
+  print(paste("Number of group for comparision is",number.of.group,sep=""))
+  quit("yes")
+}
+
+
+
+group1<-metadata.table[which(metadata.table[,column.name] %in% group.df$group[1]),]$SampleID
+group2<-metadata.table[which(metadata.table[,column.name] %in% group.df$group[2]),]$SampleID
+
+sample2group.map <- data.frame(sample=colnames(input.table[,c(group1,group2)]),
+                          groups=c(rep(group.df$group[1],length(group1)),
+                                   rep(group.df$group[2],length(group2))))
+
+
+if(options$norm =="false"){
+### raw count table
+    count.table<-input.table
+    rownames(count.table)<-count.table[,1]
+    count.table<-count.table[,-1]
+
+    suppressMessages(raw.count.deseq.obj<-DESeqDataSetFromMatrix(countData = count.table,colData=metadata.table, as.formula(paste('~',column.name,sep=""))))
+
+    gm_mean = function(x, na.rm=TRUE){
+      exp(sum(log(x[x > 0]), na.rm=na.rm) / length(x))
+      }
+
+    geoMeans = apply(counts(raw.count.deseq.obj), 1, gm_mean)
+    deseq_obj = estimateSizeFactors(raw.count.deseq.obj, geoMeans = geoMeans)
+    deseq_obj_norm<-counts(deseq_obj,normalized=T)
+} else {
+    deseq_obj_norm<-input.table
+    rownames(deseq_obj_norm)<-deseq_obj_norm[,1]
+    deseq_obj_norm<-deseq_obj_norm[,-1]
+}
+
+
+#first.50.otu.id<-rownames(counts(raw.count.deseq.obj))[1:50]
+first.50.otu.id<-rownames(deseq_obj_norm)[1:nrecord]
+
+
+#filtered.data<-counts(raw.count.deseq.obj)[first.50.otu.id,c(group1,group2)]
+filtered.data<-deseq_obj_norm[first.50.otu.id,c(group1,group2)]
+filtered.data<-as.data.frame(cbind(OTUID=rownames(filtered.data),filtered.data),stringsAsFactors=F)
+
+nc <- match('OTUID',colnames(filtered.data))
+filtered.data[,-nc]<-sapply(filtered.data[,-nc],as.integer)
+stopifnot(min(range(filtered.data[,-nc]))>=0)
+
+long <- gather(filtered.data,sample,expr,-OTUID)
+suppressMessages((long <- left_join(long, sample2group.map)))
+long$expr[long$groups == group.df$group[1]] <- long$expr*-1
+
+sorted.OTU <- rev(sort(unique(long$OTUID)))
+long$OTUID <- factor(long$OTUID, levels=sorted.OTU)
+long$sample  <- as.factor(long$sample)
+
+
+tax.table.new<-as.data.frame(cbind(obs.table[,1],t(as.data.table(strsplit(obs.table[,2],";")))))
+
+if(length(colnames(tax.table.new)) != length(tax_col_extra))
+{
+colnames(tax.table.new)<-tax_col
+} else {
+colnames(tax.table.new)<-tax_col_extra
+}
+
+long<-cbind(long,tax.table.new[match(long$OTUID,tax.table.new$OTUID),-1])
+
+comparison<-paste(column.name,paste(group.df$group[1],group.df$group[2],sep="-"),sep=" ")
+
+
+p<-ggplot(long,aes(x=reorder(OTUID,expr),y=expr, fill=groups)) +
+  geom_bar(stat='identity') + theme_bw() + 
+  xlab("OTU ID") + 
+  labs(title=comparison) + facet_grid( as.formula(paste(ranking,"~ .",sep="")),scales = "free", space = "free" ) + theme(strip.text.y = element_text(angle = 0)) +
+  coord_flip()
+q<-ggplot_build(p)
+q$layout$panel_ranges[[1]]$x.labels <- gsub("-","",q$layout$panel_ranges[[1]]$x.labels)
+#Reassemble the plot using ggplot_gtable()
+q<-ggplot_gtable(q)
+
+
+
+
+pdffile <- gsub("[ ]+", "", paste(options$outdir,"/symmetric.pdf"))
+pngfile_symmetric <- gsub("[ ]+", "", paste(options$outdir,"/symmetric.png"))
+htmlfile <- gsub("[ ]+", "", paste(options$htmlfile))
+
+
+# Produce PDF file
+pdf(pdffile);
+plot(q)
+garbage<-dev.off();
+
+#png('richness.png')
+bitmap(pngfile_symmetric,"png16m",height=10,width=10,res=100)
+plot(q)
+garbage<-dev.off()
+
+# Produce the HTML file
+ htmlfile_handle <- file(htmlfile)
+ html_output = c('<html><body>',
+            '<table align="center">',
+           '<tr>',
+           '<td valign="middle" style="vertical-align:middle;">',
+                 '<a href="pdffile.pdf"><img src="symmetric.png"/></a>',
+           '</td>',
+           '</tr>',
+           '</table>',
+          '<table align="center>',
+  '<tr>',
+  '<td valign="middle" style="vertical-align:middle;">',
+                 '<a href="pdffile.pdf"><img src="symmetric.png"/></a>',
+  '</td>',
+  '</tr>',
+  '</table>',
+                 '</html></body>');
+ writeLines(html_output, htmlfile_handle);
+ close(htmlfile_handle);
b
diff -r 000000000000 -r 0cac08094b86 symmetric_plot.xml
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/symmetric_plot.xml Mon Sep 14 06:04:44 2020 +0000
[
@@ -0,0 +1,135 @@
+<tool id="symmetricPlot" name="Symmetric Plot" version="1.0.1" hidden="false" force_history_refresh="True">>
+  <description>Symmetric Plot</description>
+  <requirements>
+          <requirement type="package" version="3.4.1">r-base</requirement>
+          <requirement type="package" version="1.22.3">bioconductor-phyloseq</requirement>
+   <requirement type="package" version="1.18.1">bioconductor-deseq2</requirement>
+   <requirement type="package" version="1.20.0">r-getopt</requirement>
+   <requirement type="package" version="0.6.3">r-tidyr</requirement>
+   <requirement type="package" version="9.18">ghostscript</requirement>
+<tool id="symmetricPlot2" name="Symmetric Plot" version="1.0.1" hidden="false" force_history_refresh="True">>
+  <description>Symmetric Plot</description>
+  <requirements>
+   <requirement type="package" version="3.4.1">r-base</requirement>
+          <requirement type="package" version="1.22.3">bioconductor-phyloseq</requirement>
+   <requirement type="package" version="1.18.1">bioconductor-deseq2</requirement>
+          <requirement type="package" version="1.20.0">r-getopt</requirement>
+   <requirement type="package" version="0.6.3">r-tidyr</requirement>
+          <requirement type="package" version="9.18">ghostscript</requirement>
+  </requirements>
+  <version_command><![CDATA[
+    echo $(R --version | grep version | grep -v GNU)", phyloseq version" $(R --vanilla --slave -e "library(phyloseq); cat(sessionInfo()\$otherPkgs\$phyloseq\$Version)" 2> /dev/null | grep -v -i "WARNING: ")
+   ]]></version_command>
+  <command detect_errors="exit_code"><![CDATA[
+   Rscript '${__tool_directory__}/symmetric_plot.r' 
+    --input.data='$input_table' 
+ --meta.data='$meta_table' 
+ --obs.data='$obs_table' 
+ --taxrank='$taxonomy_rank' 
+ --record='$nTop' 
+ --norm="${norm_bool}" 
+ --n.column="${selectedCol}" 
+ --g.group="${group}" 
+ --outdir="$htmlfile.files_path" 
+ --htmlfile='$htmlfile' 
+  ]]></command>

+  <inputs>
+    <param format="tabular" name="input_table" type="data" label="Count table file"/>
+    <param format="tabular" name="meta_table" type="data" label="Metadata file"/>
+    <param format="tabular" name="obs_table" type="data" label="OTU Taxonomy file"/>
+
+    <param name="nTop" type="select" display="radio" label="Select number of records to display">
+      <option value="20" selected="true">20</option>
+      <option value="30">30</option>
+      <option value="40">40</option>
+      <option value="50">50</option>
+      <option value="100">100</option>
+    </param>
+
+    <param name="taxonomy_rank" type="select" display="radio" label="Select a taxonomy rank">
+      <option value="Kingdom" selected="true">Kingdom</option>
+      <option value="Phylum">Phylum</option>
+      <option value="Class">Class</option>
+      <option value="Order">Order</option>
+      <option value="Family">Family</option>
+      <option value="Genus">Genus</option>
+      <option value="Species">Species</option>
+    </param>
+
+
+    <param name="norm_bool" type="boolean" truevalue="true" falsevalue="false" checked="false" label="is the data normalised?"/> 
+    <param name="selectedCol" type="data_column" data_ref="meta_table" use_header_names="TRUE" label="Variable to compare"/>
+    <param name="group" type="text" label="Fill in two comparable group separated by comma"/>
+
+  </inputs>

+  <outputs>
+    <data format="html" name="htmlfile" label="${tool.name} SymmetricPlot.html"/>   
+  </outputs>
+
+  <tests>
+   <test>
+ <param name="input_table" value="count.txt"/>
+ <param name="meta_table" value="metadata.txt"/>
+ <param name="obs_table" value="observation.txt"/>
+ <param name="nTop" value="30"/>
+ <param name="taxonomy_rank" value="Phylum"/>
+ <param name="selectedCol" value="3"/>
+ <param name="group" value="Early,Late"/>
+ <output name="htmlfile" ftype="html" file="SymmetricPlot.html"/></test>
+   </tests>
+  <help>
+.. class:: infomark
+
+**TIP:** The input data should be in tabular format.
+
+.. class:: infomark
+
+**TIP:** The first column should contain OTU ID.
+
+.. class:: infomark
+
+**TIP:** This program takes in two files:1)raw count/normalised table, 2) a metadata file
+   
+.. class:: infomark
+  
+**What it does**

+ This program uses an R package called DESeq2_ and ggplot2_ to create a symmetric bar plot.
+
+.. _DESeq2 : https://bioconductor.org/packages/release/bioc/html/DESeq2.html
+.. _ggplot2: https://ggplot2.tidyverse.org/
+
+=======
+ This program uses an R package called DESeq2 and ggplot2 to create a symmetric bar plot.
+  
+-----
+
+**Syntax**
+
+This tool creates a symmetric plot based on input table. The input table,if it is a raw count table, will be normalised by DESeq "counts" function with flag "normalised=T".
+   
+- **A normalised dataset** - set to "Yes" only if the input table is a normalised dataset
+- **Group of choice** - The group of choice will appear in the title of the plot(e.g., Tissue, protein and etc).
+- **Select a group** - This is a list of group to use in comparison(e.g., Tissue A vs Tissue B). This should be the same as "Group of choice".
+- **Select only two groups to compare** - select only two groups of interest for comparison.
+
+-----
+
+=========
+Resources
+=========
+
+=======
+**Wrapper Author**
+
+QFAB Bioinformatics (support@qfab.org)
+
+  </help>
+  <citations>
+   <citation type="doi">10.18129/B9.bioc.DESeq2</citation>
+ <citation type="doi">10.1007/978-3-319-24277-4</citation>
+  </citations>
+=======
+</tool>
b
diff -r 000000000000 -r 0cac08094b86 test-data/SymmetricPlot.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/SymmetricPlot.html Mon Sep 14 06:04:44 2020 +0000
b
@@ -0,0 +1,9 @@
+<html><body>
+<table align="center">
+<tr>
+<td valign="middle" style="vertical-align:middle;">
+<a href="pdffile.pdf"><img src="symmetric.png"/></a>
+</td>
+</tr>
+</table>
+</html></body>
b
diff -r 000000000000 -r 0cac08094b86 test-data/count.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/count.txt Mon Sep 14 06:04:44 2020 +0000
b
b'@@ -0,0 +1,3359 @@\n+OTUID\tF3D147\tF3D0\tF3D7\tF3D6\tF3D1\tF3D144\tF3D148\tF3D149\tF3D2\tF3D141\tF3D146\tF3D9\tF3D142\tF3D145\tF3D8\tF3D3\tF3D143\tF3D5\n+297768\t1314\t354\t519\t707\t359\t300\t794\t832\t1721\t379\t236\t431\t327.366656200031\t525\t355\t651\t176\t274\n+794170\t297\t107\t69\t104\t30\t80\t199\t169\t100\t64\t54\t67\t65.4733312400061\t126\t62\t59\t58\t35\n+345662\t806\t44\t176\t201\t71\t159\t415\t448\t437\t164\t114\t143\t88.3370342127067\t198\t109\t313\t99\t170\n+182733\t13\t3\t6\t8\t3\t6\t7\t17\t14\t3\t2\t6\t4.15703690412737\t12\t1\t14\t5\t3\n+328698\t872\t424\t415\t551\t220\t273\t584\t702\t1143\t313\t235\t472\t156.928143130808\t487\t332\t442\t192\t264\n+789537\t515\t55\t9\t13\t10\t57\t263\t209\t38\t84\t61\t9\t29.0992583288916\t105\t5\t16\t36\t19\n+835517\t2\t0\t0\t0\t0\t1\t2\t1\t0\t0\t0\t0\t0\t3\t0\t0\t2\t0\n+768418\t121\t26\t35\t39\t5\t36\t53\t68\t73\t28\t27\t29\t20.7851845206369\t64\t16\t42\t22\t19\n+271934\t21\t116\t0\t0\t0\t5\t29\t8\t2\t5\t1\t0\t4.15703690412737\t14\t0\t0\t2\t1\n+4484676\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t1\t0\t0\t0\n+263472\t1344\t517\t597\t931\t363\t368\t772\t805\t3225\t397\t284\t457\t255.657769603833\t563\t235\t890\t194\t283\n+715297\t5\t0\t0\t1\t0\t1\t1\t2\t2\t0\t0\t1\t3.11777767809553\t0\t1\t2\t1\t1\n+335523\t573\t176\t545\t531\t139\t146\t532\t484\t382\t208\t202\t649\t227.597770500974\t380\t580\t471\t127\t151\n+802273\t0\t5\t2\t13\t30\t3\t8\t11\t76\t3\t8\t25\t1.03925922603184\t7\t29\t6\t4\t10\n+231806\t1173\t468\t6\t12\t36\t354\t866\t648\t113\t320\t269\t2\t180.831105329541\t463\t1\t22\t222\t19\n+262166\t94\t11\t12\t16\t1\t19\t54\t45\t21\t11\t26\t4\t4.15703690412737\t22\t2\t14\t11\t6\n+201490\t319\t81\t1\t1\t0\t113\t283\t180\t17\t107\t37\t1\t53.002220527624\t120\t6\t25\t36\t36\n+784569\t140\t49\t98\t366\t109\t12\t12\t73\t290\t10\t4\t148\t98.7296264730251\t24\t126\t85\t37\t46\n+1051764\t301\t168\t309\t263\t110\t180\t228\t318\t688\t145\t103\t229\t84.1799973085793\t262\t213\t335\t80\t231\n+641881\t0\t21\t13\t14\t93\t0\t0\t1\t173\t0\t1\t67\t0\t0\t66\t5\t0\t8\n+764495\t0\t0\t0\t0\t2\t0\t0\t0\t1\t0\t0\t1\t0\t0\t1\t0\t0\t0\n+611419\t15\t54\t13\t40\t147\t4\t19\t25\t285\t8\t17\t57\t1.03925922603184\t3\t25\t13\t1\t35\n+1116652\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t4\t0\t0\t0\t0\n+794112\t1112\t437\t292\t391\t66\t343\t906\t913\t460\t510\t397\t199\t164.202957713031\t561\t146\t191\t230\t158\n+793544\t26\t26\t11\t45\t43\t14\t13\t42\t131\t8\t36\t62\t3.11777767809553\t13\t41\t17\t11\t40\n+608864\t20\t29\t7\t39\t31\t1\t2\t8\t100\t2\t4\t79\t4.15703690412737\t0\t37\t7\t1\t30\n+793598\t14\t20\t2\t9\t17\t2\t20\t55\t48\t13\t15\t6\t2.07851845206369\t5\t12\t5\t4\t5\n+229622\t98\t179\t249\t268\t197\t44\t590\t600\t1347\t346\t73\t458\t88.3370342127067\t145\t303\t434\t102\t210\n+752203\t2\t10\t0\t5\t6\t1\t1\t4\t7\t0\t5\t4\t0\t1\t3\t3\t0\t2\n+768762\t17\t29\t6\t17\t30\t2\t46\t31\t21\t43\t27\t26\t3.11777767809553\t11\t23\t3\t26\t16\n+803937\t10\t5\t5\t22\t70\t1\t14\t31\t48\t7\t8\t25\t0\t1\t16\t10\t1\t46\n+194043\t89\t14\t0\t1\t0\t29\t45\t33\t2\t17\t19\t0\t11.4318514863503\t44\t0\t2\t15\t0\n+126968\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+636535\t58\t69\t29\t46\t259\t11\t37\t31\t312\t26\t23\t75\t9.35333303428659\t11\t31\t44\t7\t68\n+783396\t764\t248\t160\t250\t83\t207\t507\t492\t297\t214\t199\t197\t138.221477062235\t352\t113\t144\t135\t106\n+315669\t1\t1\t0\t0\t2\t0\t3\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+795920\t31\t66\t47\t101\t93\t2\t6\t5\t181\t2\t31\t49\t4.15703690412737\t6\t39\t13\t1\t47\n+565140\t445\t17\t9\t43\t103\t244\t386\t475\t51\t159\t170\t24\t39.49185058921\t312\t16\t155\t70\t53\n+2096434\t32\t26\t0\t0\t0\t21\t82\t28\t5\t16\t3\t0\t28.0599991028598\t6\t0\t16\t11\t0\n+732155\t1\t89\t8\t16\t12\t9\t9\t10\t40\t22\t3\t13\t3.11777767809553\t4\t17\t6\t5\t10\n+216524\t45\t13\t0\t0\t2\t18\t32\t29\t2\t15\t17\t0\t3.11777767809553\t25\t0\t0\t11\t0\n+781109\t0\t1\t1\t1\t2\t0\t0\t0\t1\t0\t0\t2\t0\t0\t2\t0\t0\t1\n+790211\t3\t54\t11\t38\t46\t0\t1\t8\t83\t3\t5\t11\t2.07851845206369\t3\t7\t12\t0\t19\n+453937\t530\t211\t4\t4\t36\t142\t410\t294\t38\t140\t144\t3\t98.7296264730251\t241\t0\t5\t103\t4\n+214906\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\n+273631\t12\t70\t9\t48\t69\t15\t8\t41\t78\t20\t21\t41\t6.23555535619106\t13\t30\t6\t11\t40\n+795350\t5\t14\t1\t12\t7\t0\t2\t13\t21\t1\t3\t3\t2.07851845206369\t1\t9\t5\t3\t4\n+208402\t71\t16\t24\t30\t9\t20\t43\t33\t92\t17\t15\t12\t20.7851845206369\t24\t7\t26\t14\t11\n+367519\t0\t9\t0\t0\t0\t0\t0\t0\t6\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+796269\t7\t4\t1\t2\t3\t1\t0\t7\t5\t0\t3\t4\t0\t0\t0\t1\t0\t3\n+724472\t33\t5\t1\t10\t9\t4\t16\t15\t22\t9\t1\t7\t7.2748145822229\t10\t5\t4\t6\t4\n+190916\t663\t156\t64\t80\t49\t136\t359\t229\t210\t147\t102\t35\t114.318514863503\t271\t20\t87\t62\t91\n+4406374\t6\t1\t0\t3\t0\t0\t16\t9\t0\t3\t2\t1\t4.15703690412737\t4\t1\t0\t2\t0\n+4444771\t42\t68\t39\t76\t110\t6\t56\t4\t441\t6\t3\t43\t7.2748145822229\t5\t21\t414\t4\t19\n+289443\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+744185\t40\t8\t5\t6\t20\t4\t28\t46\t61\t12\t9\t14\t2.07851845206369\t3\t11\t2\t11\t6\n+309960\t0\t0\t0\t0\t0\t0\t1'..b'\t0\t0\t0\t0\n+236514\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\n+846319\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+258852\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t1\n+769488\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+275657\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+1075919\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+348748\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+331965\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\n+306201\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\n+695966\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\n+227787\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+1101746\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+275931\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\n+261212\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\n+449877\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\n+702183\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\n+183578\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+453377\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+4049151\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+683171\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\n+374831\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+306860\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+214711\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+1036956\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+776532\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\n+162367\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+330353\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\n+232822\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+953889\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+326578\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+187214\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\n+4243544\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+277583\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+194906\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\n+445648\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+314496\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\n+657218\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\n+643245\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\n+4326814\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\n+321821\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+4115286\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1.03925922603184\t0\t0\t0\t0\t0\n+233515\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+608625\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+4307862\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+3314541\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+795663\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+665674\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\n+292398\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+187233\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+284339\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+198882\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+230744\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\n+203970\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+178503\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+4432047\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\n+259382\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\n+268059\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+433422\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\n+510131\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+314903\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\n+697920\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+3449658\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\n+729082\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\n+716470\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\n+272188\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+341504\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+270993\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+659748\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\n+626489\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+4432504\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+349748\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+274521\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+342570\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+612337\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\t0\n+339622\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t1\n+674982\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+188345\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+277533\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+724250\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+1085592\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+534772\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+333049\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+298785\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+1080675\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+272488\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+550699\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+182712\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+343331\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+1044577\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n+511768\t0\t0\t0\t0\t0\t0\t1\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n'
b
diff -r 000000000000 -r 0cac08094b86 test-data/metadata.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/metadata.txt Mon Sep 14 06:04:44 2020 +0000
b
@@ -0,0 +1,19 @@
+#SampleID dpw time Food Replicate_Group
+F3D0 0 Early None Group1
+F3D1 1 Early None Group1
+F3D2 2 Early None Group1
+F3D3 3 Early Cheddar Group2
+F3D5 5 Early Cheddar Group2
+F3D6 6 Early Cheddar Group2
+F3D7 7 Early Swiss Group3
+F3D8 8 Early Swiss Group3
+F3D9 9 Early Swiss Group3
+F3D141 141 Late Cheddar Group4
+F3D142 142 Late Cheddar Group4
+F3D143 143 Late Cheddar Group4
+F3D144 144 Late None Group5
+F3D145 145 Late None Group5
+F3D146 146 Late None Group5
+F3D147 147 Late Swiss Group6
+F3D148 148 Late Swiss Group6
+F3D149 149 Late Swiss Group6
b
diff -r 000000000000 -r 0cac08094b86 test-data/observation.txt
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/observation.txt Mon Sep 14 06:04:44 2020 +0000
[
b'@@ -0,0 +1,3359 @@\n+OTUID\ttaxonomy\n+775126\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+228502\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Ruminococcus; s__\n+314713\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Ruminococcus; s__\n+314425\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Ruminococcus; s__\n+316122\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+432015\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+4374047\tk__Bacteria; p__Actinobacteria; c__Coriobacteriia; o__Coriobacteriales; f__Coriobacteriaceae; g__Adlercreutzia; s__\n+344726\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__\n+1078157\tk__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales; f__Staphylococcaceae; g__Staphylococcus; s__\n+974097\tk__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales; f__Staphylococcaceae; g__Staphylococcus; s__\n+323154\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__\n+266555\tk__Bacteria; p__Actinobacteria; c__Coriobacteriia; o__Coriobacteriales; f__Coriobacteriaceae; g__Adlercreutzia; s__\n+4316029\tk__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales; f__Bacillaceae; g__; s__\n+317867\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+190425\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+323592\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+258628\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+277152\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__\n+271499\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+338644\tk__Bacteria; p__Actinobacteria; c__Coriobacteriia; o__Coriobacteriales; f__Coriobacteriaceae; g__Adlercreutzia; s__\n+338640\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Ruminococcus; s__\n+313804\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__\n+344723\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+188785\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+182836\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+350381\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+338004\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+646532\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+131618\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__\n+351343\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__[Ruminococcus]; s__gnavus\n+309703\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Ruminococcus; s__\n+339092\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__[Ruminococcus]; s__gnavus\n+468933\tk__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales; f__Staphylococcaceae; g__Staphylococcus; s__\n+277588\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__\n+4372373\tk__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__Neisseria; s__cinerea\n+4432700\tk__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__Neisseria; s__cinerea\n+4429481\tk__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__Neisseria; s__cinerea\n+4323499\tk__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__Neisseria; s__cinerea\n+140239\tk__Bacteria; p__Proteobacteria; c__Betaproteobacteria; o__Neisseriales; f__Neisseriaceae; g__Neisseria; s__cinere'..b'iraceae; g__; s__\n+307193\tk__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae; g__Lactobacillus; s__\n+183927\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__\n+329268\tk__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__S24-7; g__; s__\n+313274\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__\n+258750\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+272646\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+269427\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__\n+3697034\tk__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Enterococcaceae; g__Enterococcus; s__\n+2632775\tk__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Aeromonadales; f__Aeromonadaceae; g__; s__\n+349874\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+232276\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Dorea; s__\n+341448\tk__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__S24-7; g__; s__\n+273479\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+553352\tk__Bacteria; p__Firmicutes; c__Bacilli; o__Lactobacillales; f__Lactobacillaceae; g__Lactobacillus; s__\n+172503\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__\n+290844\tk__Bacteria; p__Proteobacteria; c__Gammaproteobacteria; o__Enterobacteriales; f__Enterobacteriaceae; g__; s__\n+788402\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__Coprococcus; s__\n+752420\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__\n+706077\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__\n+189184\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__\n+204126\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Ruminococcaceae; g__Oscillospira; s__\n+204125\tk__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__S24-7; g__; s__\n+1918929\tk__Bacteria; p__Proteobacteria; c__Alphaproteobacteria; o__Rickettsiales; f__mitochondria; g__; s__\n+1058958\tk__Bacteria; p__Firmicutes; c__Bacilli; o__Bacillales; f__Staphylococcaceae; g__Staphylococcus; s__\n+266697\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+273308\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+356148\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__\n+314903\tk__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__S24-7; g__; s__\n+267671\tk__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__S24-7; g__; s__\n+275619\tk__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__S24-7; g__; s__\n+272256\tk__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__S24-7; g__; s__\n+274237\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__\n+188092\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+180535\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+273631\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__; g__; s__\n+288344\tk__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__S24-7; g__; s__\n+212201\tk__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__S24-7; g__; s__\n+1961361\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__\n+665761\tk__Bacteria; p__Firmicutes; c__Clostridia; o__Clostridiales; f__Lachnospiraceae; g__; s__\n+131558\tk__Bacteria; p__Bacteroidetes; c__Bacteroidia; o__Bacteroidales; f__S24-7; g__; s__\n+247570\tk__Bacteria; p__Cyanobacteria; c__Chloroplast; o__Streptophyta; f__; g__; s__\n'