Skip to content

Commit

Permalink
[FEATURE] Closes #1; table import
Browse files Browse the repository at this point in the history
  • Loading branch information
valentynbez committed Nov 14, 2022
1 parent 6048d2a commit 3ee25d0
Show file tree
Hide file tree
Showing 22 changed files with 462 additions and 42 deletions.
50 changes: 50 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
name: ci

on:
pull_request:
push:
branches:
- master

jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: checkout source
uses: actions/checkout@v2

- name: set up python 3.8
uses: actions/setup-python@v1
with:
python-version: 3.8

- name: install dependencies
run: python -m pip install --upgrade pip

- name: lint
run: |
pip install -q https://github.com/qiime2/q2lint/archive/master.zip
q2lint
pip install -q flake8
flake8
build-and-test:
needs: lint
strategy:
matrix:
os: [ubuntu-latest, macos-latest]
runs-on: ${{ matrix.os }}
steps:
- name: checkout source
uses: actions/checkout@v2
with:
fetch-depth: 0

- name: set up git repo for versioneer
run: git fetch --depth=1 origin +refs/tags/*:refs/tags/*

- uses: qiime2/action-library-packaging@alpha1
with:
package-name: q2-motus
build-target: dev
additional-tests: py.test --pyargs q2_motus
library-token: ${{ secrets.LIBRARY_TOKEN }}
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -128,4 +128,5 @@ dmypy.json
# Pyre type checker
.pyre/

q2_motus/tests/data/dev.ipynb
q2_motus/tests/data/dev.ipynb
dev.ipynb
5 changes: 3 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@ test-cov: all
py.test --cov=q2_motus

install:
which motus || pip install motu-profiler
which bwa || git clone https://github.com/lh3/bwa.git || cd bwa || make || cd .. || rm -rf bwa
if ! which motus > /dev/null; then pip install motu-profiler; fi
if ! which bwa > /dev/null; then git clone https://github.com/lh3/bwa.git && cd bwa && make && ln -s $(PWD)/bwa/bwa $(CONDA_PREFIX)/bin; fi

motus downloadDB
$(PYTHON) setup.py install

Expand Down
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,12 @@ qiime motus profile \
--p-jobs 2
```

## Optionaly, you can import precomputed, merged mOTU profiles
**Attention**: precomupted mOTU table should be generated from full taxonomy `-q` flag and counts `-c` flag profiles.

```
qiime motus import_table \
## Output
1. `table` - `FeatureTable[Frequency]` - A table of the counts of gene markers in samples.
2. `taxonomy` - `FeatureData[Taxonomy]` - A full taxonomy for each of the gene marker.
Expand Down
41 changes: 41 additions & 0 deletions ci/recipe/meta.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@

{% set data = load_setup_py_data() %}
{% set version = data.get('version') or 'placehold' %}

package:
name: q2-motus
version: {{ version }}

source:
path: ../..

build:
script: make install

requirements:
host:
- python {{ python }}
- setuptools

run:
- python {{ python }}
- pandas {{ pandas }}
- qiime2 {{ qiime2_epoch }}.*
- q2-types {{ qiime2_epoch }}.*
- bwa

test:
requires:
- qiime2 >={{ qiime2 }}
- q2-types >={{ q2_types }}
- pytest
- bwa

imports:
- q2_motus
- qiime2.plugins.motus

about:
home: https://github.com/motu-tool/q2-mOTUs
license: BSD-3-Clause
license_family: BSD
10 changes: 8 additions & 2 deletions q2_motus/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
from ._taxonomy import profile
from ._taxonomy import profile, import_table
from ._version import get_versions

__version__ = get_versions()['version']
del get_versions

__all__ = ['profile']
__all__ = ['profile', 'import_table']

from .plugin_setup import (
MotusMergedAbundanceTable,
MotusMergedAbundanceFormat,
MotusMergedAbundanceDirectoryFormat
)
47 changes: 47 additions & 0 deletions q2_motus/_format.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
from qiime2.plugin import model, ValidationError, TextFileFormat


class MotusMergedAbundanceFormat(TextFileFormat):
def _equal_number_of_columns(self, n_lines):
call_params = {}
with self.open() as fh:
header_line = fh.readline()
param_line = header_line.split("#")[-1]
name, info = param_line.split()[0], param_line
call_params[name] = info
while header_line.startswith('# '):
header_line = fh.readline()
param_line = header_line.split("#")[-1]
name, info = param_line.split()[0], param_line
call_params[name] = info
if not "merge" in call_params["call:"]:
raise ValidationError("This is not a merged abundance file. Please, merge abundance files first.")
n_header_fields = len(header_line.split('\t'))
if n_header_fields < 3:
raise ValidationError(
'No sample columns appear to be present.')
for idx, line in enumerate(fh, 2):
if n_lines is not None and idx > n_lines + 1:
break
fields = line.strip().split('\t')
n_fields = len(fields)
if n_fields != n_header_fields:
raise ValidationError(
f'Number of columns on line {line} is inconsistent with '
'the header line.')
for value in fields[2:]:
try:
value = int(value)
except ValueError:
raise ValidationError(
f'Values in table must be int-able. Found: {value}'
)

def _validate_(self, level):
level_to_n_lines = {'min': 5, 'max': None}
self._equal_number_of_columns(level_to_n_lines[level])

MotusMergedAbundanceDirectoryFormat = model.SingleFileDirectoryFormat(
'MotusMergedAbundanceDirectoryFormat', 'table.tsv',
MotusMergedAbundanceFormat)

22 changes: 16 additions & 6 deletions q2_motus/_taxonomy.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,14 @@ def profile_sample(

return cmd


def load_table_extract_tax(tab_fp: str, ncbi: bool = False) -> Tuple[pd.DataFrame, pd.DataFrame]:
'''Converts merged mOTU table to feature table and taxonomy'''
def load_motus_table(tab_fp: str) -> pd.DataFrame:
df = pd.read_csv(tab_fp, sep='\t', index_col=0, skiprows=2)
return df


def extract_table_tax(df: pd.DataFrame, ncbi: bool = False) -> Tuple[pd.DataFrame, pd.DataFrame]:
df = df.replace({0 : np.nan})
df.index = df.index.rename("Feature ID")
df.index.name = "Feature ID"
if ncbi:
df = df.rename(columns={"NCBI_tax_id" : "Taxon"})
else:
Expand Down Expand Up @@ -159,5 +161,13 @@ def profile(
_run_command(cmd)

# output merged profiles as feature table
tab, tax = load_table_extract_tax(taxatable, ncbi_taxonomy)
return tab, tax
tab, tax = extract_table_tax(load_motus_table(taxatable), ncbi_taxonomy)
return tab, tax


def import_table(
motus_table: pd.DataFrame,
ncbi_taxonomy: bool = False) -> (pd.DataFrame, pd.DataFrame):

tab, tax = extract_table_tax(motus_table, ncbi=ncbi_taxonomy)
return tab, tax
62 changes: 51 additions & 11 deletions q2_motus/plugin_setup.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
import q2_motus

from qiime2.plugin import (Int, Range, Str, Bool, Choices, Plugin, Citations)

from q2_motus._taxonomy import profile
from q2_types.sample_data import SampleData
import pandas as pd
from q2_types.feature_data import FeatureData, Taxonomy
from q2_types.per_sample_sequences import SequencesWithQuality, PairedEndSequencesWithQuality
from q2_types.feature_table import FeatureTable, Frequency
from q2_types.per_sample_sequences import (PairedEndSequencesWithQuality,
SequencesWithQuality)
from q2_types.sample_data import SampleData
from qiime2.plugin import (Bool, Choices, Citations, Int, Plugin, Range,
SemanticType, Str)

import q2_motus
from q2_motus._taxonomy import import_table, profile
from q2_motus._format import MotusMergedAbundanceFormat, MotusMergedAbundanceDirectoryFormat

citations = Citations.load('citations.bib', package='q2_motus')

Expand All @@ -22,6 +25,24 @@
)


MotusMergedAbundanceTable = SemanticType('MotusMergedAbundanceTable')
plugin.register_semantic_types(MotusMergedAbundanceTable)

plugin.register_formats(MotusMergedAbundanceFormat,
MotusMergedAbundanceDirectoryFormat)
plugin.register_semantic_type_to_format(MotusMergedAbundanceTable,
MotusMergedAbundanceDirectoryFormat)

def _motus_to_df(path):
result = pd.read_csv(str(path), sep='\t', header=0, index_col=0, skiprows=2)
result.index.name = 'FeatureID'
return result

@plugin.register_transformer
def _1(data: MotusMergedAbundanceFormat) -> pd.DataFrame:
return _motus_to_df(data)


plugin.methods.register_function(
function=profile,
inputs={"samples": SampleData[SequencesWithQuality | PairedEndSequencesWithQuality]},
Expand All @@ -36,10 +57,10 @@
"reference_genomes": Bool,
"ncbi_taxonomy": Bool,
"jobs": Int % Range(1, None)},
name="mOTU paired end profiler",
description="Executes a taxonomical classification of paired-end sample.",
name="mOTU profiler",
description="Executes a taxonomical classification of a sample.",
citations=[citations["Milanese2019-gw"]],
input_descriptions={"samples": "The paired-end samples to be classified."},
input_descriptions={"samples": "Samples for profiling."},
parameter_descriptions={"threads": "The number of threads to use. We suggest using 4-8 threads.",
"min_alen": "Minimum alignment length.",
"marker_gene_cutoff": "Minimum number of marker genes to be considered a species."
Expand All @@ -53,4 +74,23 @@
"jobs": "The number of jobs to use for the computation. Each job uses n threads from the threads parameter."},
output_descriptions={"table": "The feature table with counts of marker genes in samples.",
"taxonomy": "The taxonomy."}
)
)


plugin.methods.register_function(
function=import_table,
inputs={"motus_table": MotusMergedAbundanceTable},
outputs=[
("table", FeatureTable[Frequency]),
("taxonomy", FeatureData[Taxonomy])
],
parameters={"ncbi_taxonomy": Bool},
name="mOTU table importer",
description="Imports precomputed mOTU table to QIIME2.",
citations=[citations["Milanese2019-gw"]],
input_descriptions={"motus_table": "The path to a precomputed merged mOTU table."},
parameter_descriptions={"ncbi_taxonomy": "Use NCBI taxonomy instead of mOTU."},
output_descriptions={"table": "The feature table with counts of marker genes in samples.",
"taxonomy": "The taxonomy."}
)

14 changes: 14 additions & 0 deletions q2_motus/tests/data/motus-merged-abundance-1.tsv
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# motus version 3.0.3 | merge 3.0.3 | info merged profiles: # git tag version 3.0.3 | motus version 3.0.3 | map_tax 3.0.3 | gene database: nr3.0.3 | calc_mgc 3.0.3 -y insert.scaled_counts -l 75 | calc_motu 3.0.3 -k mOTU -C no_CAMI -g 3 -c | taxonomy: ref_mOTU_3.0.3 meta_mOTU_3.0.3
# call: python /nfs/cds-peta/exports/biol_micro_cds_gr_sunagawa/scratch/vbezshapkin/conda-envs/qiime2/bin/motus merge -i A.motus,B.motus -o paired-end.motus
#mOTU consensus_taxonomy sampleA sampleB
ref_mOTU_v3_00095 k__Bacteria|p__Proteobacteria|c__Gammaproteobacteria|o__Enterobacterales|f__Enterobacteriaceae|g__Escherichia|s__Escherichia coli 1 0
ref_mOTU_v3_00096 k__Bacteria|p__Proteobacteria|c__Gammaproteobacteria|o__Enterobacterales|f__Enterobacteriaceae|g__Citrobacter|s__ Citrobacter sp. [Citrobacter amalonaticus/Citrobacter braakii/Citrobacter freundii/Citrobacter pasteurii/Citrobacter portucalensis/Citrobacter sp. A1/Citrobacter sp. A316/Citrobacter sp. AATXQ/Citrobacter sp. AATXR/Citrobacter sp. BIDMC107/Citrobacter sp. BIDMC108/Citrobacter sp. CFSAN044567/Citrobacter sp. FDAARGOS_156/Citrobacter sp. KTE151/Citrobacter sp. KTE30/Citrobacter sp. KTE32/Citrobacter sp. L17/Citrobacter sp. MGH100/Citrobacter sp. MGH103/Citrobacter sp. MGH104/Citrobacter sp. MGH105/Citrobacter sp. MGH109/Citrobacter sp. MGH110/Citrobacter sp. MGH99/Citrobacter werkmanii/Citrobacter youngae/Enterobacter cloacae/Enterobacter sp. GN02600/Escherichia coli/Salmonella enterica] 1 0
ref_mOTU_v3_00855 k__Bacteria|p__Bacteroidetes|c__Bacteroidia|o__Bacteroidales|f__Bacteroidaceae|g__Bacteroides|s__Bacteroides uniformis 0 1
ref_mOTU_v3_02367 k__Bacteria|p__Bacteroidetes|c__Bacteroidia|o__Bacteroidales|f__Bacteroidaceae|g__Bacteroides|s__Bacteroides dorei/vulgatus [Bacteroidia bacterium UC5.1-2G11/Candidatus Gastranaerophilales bacterium HUM_8/Bacteroides dorei/Bacteroides sp. 3_1_33FAA/Bacteroides sp. 4_3_47FAA/Bacteroides sp. 9_1_42FAA/Bacteroides sp. 3_1_40A/Bacteroides vulgatus] 0 1
ref_mOTU_v3_03592 k__Bacteria|p__Verrucomicrobia|c__Verrucomicrobiae|o__Verrucomicrobiales|f__Akkermansiaceae|g__Akkermansia|s__Akkermansia sp. CAG:344 1 0
ref_mOTU_v3_03928 k__Bacteria|p__Firmicutes|c__Clostridia|o__Clostridiales|f__Clostridiales fam. incertae sedis|g__Intestinimonas|s__Intestinimonas butyriciproducens [Intestinimonas butyriciproducens/uncultured Clostridium sp.] 0 1
ref_mOTU_v3_04716 k__Bacteria|p__Firmicutes|c__Clostridia|o__Clostridiales|f__Ruminococcaceae|g__Ruthenibacterium|s__Ruthenibacterium lactatiformans [Ruthenibacterium lactatiformans/Ruminococcaceae bacterium cv2/Subdoligranulum sp. 4_3_54A2FAA] 1 1
ref_mOTU_v3_05238 k__Bacteria|p__Firmicutes|c__Clostridia|o__Clostridiales|f__Ruminococcaceae|g__Flavonifractor|s__Flavonifractor plautii [Clostridia bacterium UC5.1-2H11/Flavonifractor plautii/Lachnospiraceae bacterium 7_1_58FAA] 1 0
meta_mOTU_v3_12805 k__Bacteria|p__Verrucomicrobia|c__Verrucomicrobiae|o__Verrucomicrobiales|f__Akkermansiaceae|g__Akkermansia|s__Akkermansia species incertae sedis 1 0
ext_mOTU_v3_26730 k__Bacteria|p__Verrucomicrobia|c__Verrucomicrobiae|o__Verrucomicrobiales|f__Akkermansiaceae|g__Akkermansia|s__Akkermansia species incertae sedis 1 0
unassigned unassigned 1 1
14 changes: 14 additions & 0 deletions q2_motus/tests/data/motus-merged-abundance-2.tsv
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# motus version 3.0.3 | merge 3.0.3 | info merged profiles: # git tag version 3.0.3 | motus version 3.0.3 | map_tax 3.0.3 | gene database: nr3.0.3 | calc_mgc 3.0.3 -y insert.scaled_counts -l 75 | calc_motu 3.0.3 -k mOTU -C no_CAMI -g 3 -c | taxonomy: ref_mOTU_3.0.3 meta_mOTU_3.0.3
# call: python /nfs/cds-peta/exports/biol_micro_cds_gr_sunagawa/scratch/vbezshapkin/conda-envs/qiime2/bin/motus merge -i A.motus,B.motus -o paired-end.motus
#mOTU consensus_taxonomy
ref_mOTU_v3_00095 k__Bacteria|p__Proteobacteria|c__Gammaproteobacteria|o__Enterobacterales|f__Enterobacteriaceae|g__Escherichia|s__Escherichia coli
ref_mOTU_v3_00096 k__Bacteria|p__Proteobacteria|c__Gammaproteobacteria|o__Enterobacterales|f__Enterobacteriaceae|g__Citrobacter|s__ Citrobacter sp. [Citrobacter amalonaticus/Citrobacter braakii/Citrobacter freundii/Citrobacter pasteurii/Citrobacter portucalensis/Citrobacter sp. A1/Citrobacter sp. A316/Citrobacter sp. AATXQ/Citrobacter sp. AATXR/Citrobacter sp. BIDMC107/Citrobacter sp. BIDMC108/Citrobacter sp. CFSAN044567/Citrobacter sp. FDAARGOS_156/Citrobacter sp. KTE151/Citrobacter sp. KTE30/Citrobacter sp. KTE32/Citrobacter sp. L17/Citrobacter sp. MGH100/Citrobacter sp. MGH103/Citrobacter sp. MGH104/Citrobacter sp. MGH105/Citrobacter sp. MGH109/Citrobacter sp. MGH110/Citrobacter sp. MGH99/Citrobacter werkmanii/Citrobacter youngae/Enterobacter cloacae/Enterobacter sp. GN02600/Escherichia coli/Salmonella enterica]
ref_mOTU_v3_00855 k__Bacteria|p__Bacteroidetes|c__Bacteroidia|o__Bacteroidales|f__Bacteroidaceae|g__Bacteroides|s__Bacteroides uniformis
ref_mOTU_v3_02367 k__Bacteria|p__Bacteroidetes|c__Bacteroidia|o__Bacteroidales|f__Bacteroidaceae|g__Bacteroides|s__Bacteroides dorei/vulgatus [Bacteroidia bacterium UC5.1-2G11/Candidatus Gastranaerophilales bacterium HUM_8/Bacteroides dorei/Bacteroides sp. 3_1_33FAA/Bacteroides sp. 4_3_47FAA/Bacteroides sp. 9_1_42FAA/Bacteroides sp. 3_1_40A/Bacteroides vulgatus]
ref_mOTU_v3_03592 k__Bacteria|p__Verrucomicrobia|c__Verrucomicrobiae|o__Verrucomicrobiales|f__Akkermansiaceae|g__Akkermansia|s__Akkermansia sp. CAG:344
ref_mOTU_v3_03928 k__Bacteria|p__Firmicutes|c__Clostridia|o__Clostridiales|f__Clostridiales fam. incertae sedis|g__Intestinimonas|s__Intestinimonas butyriciproducens [Intestinimonas butyriciproducens/uncultured Clostridium sp.]
ref_mOTU_v3_04716 k__Bacteria|p__Firmicutes|c__Clostridia|o__Clostridiales|f__Ruminococcaceae|g__Ruthenibacterium|s__Ruthenibacterium lactatiformans [Ruthenibacterium lactatiformans/Ruminococcaceae bacterium cv2/Subdoligranulum sp. 4_3_54A2FAA]
ref_mOTU_v3_05238 k__Bacteria|p__Firmicutes|c__Clostridia|o__Clostridiales|f__Ruminococcaceae|g__Flavonifractor|s__Flavonifractor plautii [Clostridia bacterium UC5.1-2H11/Flavonifractor plautii/Lachnospiraceae bacterium 7_1_58FAA]
meta_mOTU_v3_12805 k__Bacteria|p__Verrucomicrobia|c__Verrucomicrobiae|o__Verrucomicrobiales|f__Akkermansiaceae|g__Akkermansia|s__Akkermansia species incertae sedis
ext_mOTU_v3_26730 k__Bacteria|p__Verrucomicrobia|c__Verrucomicrobiae|o__Verrucomicrobiales|f__Akkermansiaceae|g__Akkermansia|s__Akkermansia species incertae sedis
unassigned unassigned
14 changes: 14 additions & 0 deletions q2_motus/tests/data/motus-merged-abundance-3.tsv
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# motus version 3.0.3 | merge 3.0.3 | info merged profiles: # git tag version 3.0.3 | motus version 3.0.3 | map_tax 3.0.3 | gene database: nr3.0.3 | calc_mgc 3.0.3 -y insert.scaled_counts -l 75 | calc_motu 3.0.3 -k mOTU -C no_CAMI -g 3 -c | taxonomy: ref_mOTU_3.0.3 meta_mOTU_3.0.3
# call: python /nfs/cds-peta/exports/biol_micro_cds_gr_sunagawa/scratch/vbezshapkin/conda-envs/qiime2/bin/motus merge -i A.motus,B.motus -o paired-end.motus
#mOTU consensus_taxonomy sampleA sampleB
ref_mOTU_v3_00095 k__Bacteria|p__Proteobacteria|c__Gammaproteobacteria|o__Enterobacterales|f__Enterobacteriaceae|g__Escherichia|s__Escherichia coli 1.0 0.0
ref_mOTU_v3_00096 k__Bacteria|p__Proteobacteria|c__Gammaproteobacteria|o__Enterobacterales|f__Enterobacteriaceae|g__Citrobacter|s__ Citrobacter sp. [Citrobacter amalonaticus/Citrobacter braakii/Citrobacter freundii/Citrobacter pasteurii/Citrobacter portucalensis/Citrobacter sp. A1/Citrobacter sp. A316/Citrobacter sp. AATXQ/Citrobacter sp. AATXR/Citrobacter sp. BIDMC107/Citrobacter sp. BIDMC108/Citrobacter sp. CFSAN044567/Citrobacter sp. FDAARGOS_156/Citrobacter sp. KTE151/Citrobacter sp. KTE30/Citrobacter sp. KTE32/Citrobacter sp. L17/Citrobacter sp. MGH100/Citrobacter sp. MGH103/Citrobacter sp. MGH104/Citrobacter sp. MGH105/Citrobacter sp. MGH109/Citrobacter sp. MGH110/Citrobacter sp. MGH99/Citrobacter werkmanii/Citrobacter youngae/Enterobacter cloacae/Enterobacter sp. GN02600/Escherichia coli/Salmonella enterica] 1.0 0.0
ref_mOTU_v3_00855 k__Bacteria|p__Bacteroidetes|c__Bacteroidia|o__Bacteroidales|f__Bacteroidaceae|g__Bacteroides|s__Bacteroides uniformis 0.0 1.0
ref_mOTU_v3_02367 k__Bacteria|p__Bacteroidetes|c__Bacteroidia|o__Bacteroidales|f__Bacteroidaceae|g__Bacteroides|s__Bacteroides dorei/vulgatus [Bacteroidia bacterium UC5.1-2G11/Candidatus Gastranaerophilales bacterium HUM_8/Bacteroides dorei/Bacteroides sp. 3_1_33FAA/Bacteroides sp. 4_3_47FAA/Bacteroides sp. 9_1_42FAA/Bacteroides sp. 3_1_40A/Bacteroides vulgatus] 0.0 1.0
ref_mOTU_v3_03592 k__Bacteria|p__Verrucomicrobia|c__Verrucomicrobiae|o__Verrucomicrobiales|f__Akkermansiaceae|g__Akkermansia|s__Akkermansia sp. CAG:344 1.0 0.0
ref_mOTU_v3_03928 k__Bacteria|p__Firmicutes|c__Clostridia|o__Clostridiales|f__Clostridiales fam. incertae sedis|g__Intestinimonas|s__Intestinimonas butyriciproducens [Intestinimonas butyriciproducens/uncultured Clostridium sp.] 0.0 1.0
ref_mOTU_v3_04716 k__Bacteria|p__Firmicutes|c__Clostridia|o__Clostridiales|f__Ruminococcaceae|g__Ruthenibacterium|s__Ruthenibacterium lactatiformans [Ruthenibacterium lactatiformans/Ruminococcaceae bacterium cv2/Subdoligranulum sp. 4_3_54A2FAA] 1.0 1.0
ref_mOTU_v3_05238 k__Bacteria|p__Firmicutes|c__Clostridia|o__Clostridiales|f__Ruminococcaceae|g__Flavonifractor|s__Flavonifractor plautii [Clostridia bacterium UC5.1-2H11/Flavonifractor plautii/Lachnospiraceae bacterium 7_1_58FAA] 1.0 0.0
meta_mOTU_v3_12805 k__Bacteria|p__Verrucomicrobia|c__Verrucomicrobiae|o__Verrucomicrobiales|f__Akkermansiaceae|g__Akkermansia|s__Akkermansia species incertae sedis 1.0 0.0
ext_mOTU_v3_26730 k__Bacteria|p__Verrucomicrobia|c__Verrucomicrobiae|o__Verrucomicrobiales|f__Akkermansiaceae|g__Akkermansia|s__Akkermansia species incertae sedis 1.0 0.0
unassigned unassigned 1.0 1.0
Loading

0 comments on commit 3ee25d0

Please sign in to comment.