moose-classifier 0.12__tar.gz → 0.13__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. moose_classifier-0.13/.github/workflows/unnittests.yml +29 -0
  2. moose_classifier-0.13/.gitignore +5 -0
  3. moose_classifier-0.13/PKG-INFO +436 -0
  4. {moose_classifier-0.12 → moose_classifier-0.13}/pyproject.toml +12 -3
  5. moose_classifier-0.13/requirements.txt +6 -0
  6. moose_classifier-0.13/sphinx/Makefile +225 -0
  7. moose_classifier-0.13/sphinx/classifier.rst +29 -0
  8. moose_classifier-0.13/sphinx/conf.py +345 -0
  9. moose_classifier-0.13/sphinx/index.rst +22 -0
  10. moose_classifier-0.13/sphinx/make.bat +281 -0
  11. moose_classifier-0.13/sphinx/modules.rst +7 -0
  12. {moose_classifier-0.12 → moose_classifier-0.13}/src/classify.py +66 -47
  13. moose_classifier-0.13/src/moose_classifier.egg-info/PKG-INFO +436 -0
  14. moose_classifier-0.13/src/moose_classifier.egg-info/SOURCES.txt +77 -0
  15. moose_classifier-0.13/testfiles/TestClassify/blast.csv.bz2 +0 -0
  16. moose_classifier-0.13/testfiles/TestClassify/blast_3strepto.csv +5 -0
  17. moose_classifier-0.13/testfiles/TestClassify/blast_extrafields.csv.bz2 +0 -0
  18. moose_classifier-0.13/testfiles/TestClassify/map.csv.bz2 +0 -0
  19. moose_classifier-0.13/testfiles/TestClassify/map_single.csv.bz2 +0 -0
  20. moose_classifier-0.13/testfiles/TestClassify/seq_info.csv.bz2 +0 -0
  21. moose_classifier-0.13/testfiles/TestClassify/taxonomy.csv.bz2 +0 -0
  22. moose_classifier-0.13/testfiles/TestClassify/test01/classifications.csv.bz2 +0 -0
  23. moose_classifier-0.13/testfiles/TestClassify/test01/details.csv.bz2 +0 -0
  24. moose_classifier-0.13/testfiles/TestClassify/test02/classifications.csv.bz2 +0 -0
  25. moose_classifier-0.13/testfiles/TestClassify/test02/details.csv.bz2 +0 -0
  26. moose_classifier-0.13/testfiles/TestClassify/test02/map_single.csv.bz2 +0 -0
  27. moose_classifier-0.13/testfiles/TestClassify/test03/classifications.csv.bz2 +0 -0
  28. moose_classifier-0.13/testfiles/TestClassify/test03/details.csv.bz2 +0 -0
  29. moose_classifier-0.13/testfiles/TestClassify/test06/classifications.csv.bz2 +0 -0
  30. moose_classifier-0.13/testfiles/TestClassify/test06/details.csv.bz2 +0 -0
  31. moose_classifier-0.13/testfiles/TestClassify/test06/map.csv.bz2 +0 -0
  32. moose_classifier-0.13/testfiles/TestClassify/test07/blast.csv.bz2 +0 -0
  33. moose_classifier-0.13/testfiles/TestClassify/test07/classifications.csv.bz2 +0 -0
  34. moose_classifier-0.13/testfiles/TestClassify/test07/details.csv.bz2 +0 -0
  35. moose_classifier-0.13/testfiles/TestClassify/test07/map.csv.bz2 +0 -0
  36. moose_classifier-0.13/testfiles/TestClassify/test07/seq_info.csv.bz2 +0 -0
  37. moose_classifier-0.13/testfiles/TestClassify/test07/taxonomy.csv.bz2 +0 -0
  38. moose_classifier-0.13/testfiles/TestClassify/test08/classifications.csv.bz2 +0 -0
  39. moose_classifier-0.13/testfiles/TestClassify/test08/details.csv.bz2 +0 -0
  40. moose_classifier-0.13/testfiles/TestClassify/test09/blast.csv.bz2 +0 -0
  41. moose_classifier-0.13/testfiles/TestClassify/test09/classifications.csv.bz2 +0 -0
  42. moose_classifier-0.13/testfiles/TestClassify/test09/details.csv.bz2 +0 -0
  43. moose_classifier-0.13/testfiles/TestClassify/test09/map.csv.bz2 +0 -0
  44. moose_classifier-0.13/testfiles/TestClassify/test10/classifications.csv.bz2 +0 -0
  45. moose_classifier-0.13/testfiles/TestClassify/test10/details.csv.bz2 +0 -0
  46. moose_classifier-0.13/testfiles/TestClassify/test11/blast.csv.bz2 +0 -0
  47. moose_classifier-0.13/testfiles/TestClassify/test11/classifications.csv.bz2 +0 -0
  48. moose_classifier-0.13/testfiles/TestClassify/test11/details.csv.bz2 +0 -0
  49. moose_classifier-0.13/testfiles/TestClassify/test11/seq_info.csv.bz2 +0 -0
  50. moose_classifier-0.13/testfiles/TestClassify/test11/taxonomy.csv.bz2 +0 -0
  51. moose_classifier-0.13/testfiles/TestClassify/test12/map_single.csv.bz2 +0 -0
  52. moose_classifier-0.13/testfiles/TestClassify/test13/blast.csv.bz2 +0 -0
  53. moose_classifier-0.13/testfiles/TestClassify/test13/classifications.csv.bz2 +0 -0
  54. moose_classifier-0.13/testfiles/TestClassify/test13/seq_info.csv.bz2 +0 -0
  55. moose_classifier-0.13/testfiles/TestClassify/test13/weights.csv.bz2 +0 -0
  56. moose_classifier-0.13/testfiles/TestClassify/test14/classifications.csv.bz2 +0 -0
  57. moose_classifier-0.13/testfiles/TestClassify/test14/details.csv.bz2 +0 -0
  58. moose_classifier-0.13/testfiles/TestClassify/test15/classifications.csv.bz2 +0 -0
  59. moose_classifier-0.13/testfiles/TestClassify/test15/details.csv.bz2 +0 -0
  60. moose_classifier-0.13/testfiles/TestClassify/test16/classifications.csv.bz2 +0 -0
  61. moose_classifier-0.13/testfiles/TestClassify/test16/details.csv.bz2 +0 -0
  62. moose_classifier-0.13/testfiles/TestClassify/test17/classifications.csv.bz2 +0 -0
  63. moose_classifier-0.13/testfiles/TestClassify/test17/details.csv.bz2 +0 -0
  64. moose_classifier-0.13/testfiles/TestClassify/test18/classifications.csv.bz2 +0 -0
  65. moose_classifier-0.13/testfiles/TestClassify/test18/details.csv.bz2 +0 -0
  66. moose_classifier-0.13/testfiles/TestClassify/weights.csv.bz2 +0 -0
  67. moose_classifier-0.13/testfiles/rank_thresholds.csv +2 -0
  68. moose_classifier-0.13/testfiles/rrnDB_16S_copy_num.csv.bz2 +0 -0
  69. moose_classifier-0.13/testfiles/taxonomy.csv.bz2 +0 -0
  70. moose_classifier-0.13/tests/__init__.py +59 -0
  71. {moose_classifier-0.12 → moose_classifier-0.13}/tests/test_classify.py +51 -0
  72. moose_classifier-0.12/LICENSE +0 -674
  73. moose_classifier-0.12/PKG-INFO +0 -1112
  74. moose_classifier-0.12/src/moose_classifier.egg-info/PKG-INFO +0 -1112
  75. moose_classifier-0.12/src/moose_classifier.egg-info/SOURCES.txt +0 -13
  76. {moose_classifier-0.12 → moose_classifier-0.13}/README.md +0 -0
  77. {moose_classifier-0.12 → moose_classifier-0.13}/setup.cfg +0 -0
  78. {moose_classifier-0.12 → moose_classifier-0.13}/src/lineages.py +0 -0
  79. {moose_classifier-0.12 → moose_classifier-0.13}/src/moose_classifier.egg-info/dependency_links.txt +0 -0
  80. {moose_classifier-0.12 → moose_classifier-0.13}/src/moose_classifier.egg-info/entry_points.txt +0 -0
  81. {moose_classifier-0.12 → moose_classifier-0.13}/src/moose_classifier.egg-info/requires.txt +0 -0
  82. {moose_classifier-0.12 → moose_classifier-0.13}/src/moose_classifier.egg-info/top_level.txt +0 -0
  83. {moose_classifier-0.12 → moose_classifier-0.13}/src/version.py +0 -0
@@ -0,0 +1,29 @@
1
+ name: unittests
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ branches: [ master ]
8
+ schedule:
9
+ - cron: '0 6 * * 1' # 6am Monday
10
+
11
+ jobs:
12
+ build:
13
+ runs-on: ${{ matrix.os }}
14
+ strategy:
15
+ matrix:
16
+ os: [ubuntu-latest]
17
+ python-version: ['3.12', '3.11', '3.10', '3.9']
18
+ steps:
19
+ -
20
+ uses: actions/setup-python@v3
21
+ with:
22
+ python-version: ${{ matrix.python-version }}
23
+ -
24
+ uses: actions/checkout@v3
25
+ -
26
+ name: Install and test
27
+ run: |
28
+ python -m pip install .
29
+ python -m unittest
@@ -0,0 +1,5 @@
1
+ *.pyc
2
+ build/
3
+ dist
4
+ *.egg-info
5
+ test_output
@@ -0,0 +1,436 @@
1
+ Metadata-Version: 2.4
2
+ Name: moose_classifier
3
+ Version: 0.13
4
+ Summary: Alignment based taxonomic classifier
5
+ Author: Chris Rosenthal
6
+ Author-email: crosenth@gmail.com
7
+ Maintainer-email: Dan Hoogestraat <dhoogest@uw.edu>
8
+ License-Expression: GPL-3.0-only
9
+ Project-URL: repository, https://github.com/crosenth/moose
10
+ Keywords: bioinformatics,blast,classifier,dna,genetics,genomics,ncbi,rna
11
+ Classifier: Environment :: Console
12
+ Classifier: Intended Audience :: End Users/Desktop
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python :: 3
15
+ Requires-Python: >=3.7
16
+ Description-Content-Type: text/markdown
17
+ Requires-Dist: pandas>=2.0.2
18
+
19
+ # moose
20
+
21
+ A tool for taxonomically selecting, grouping and summarizing pairwise
22
+ alignment classifications into something more concise and readable.
23
+
24
+ ## authors
25
+
26
+ * [Noah Hoffman](https://github.com/nhoffman)
27
+ * [Tim Holland](https://github.com/tholland)
28
+ * [Daniel Hoogestraat](https://github.com/dhoogest)
29
+ * [Tyler Land](https://github.com/tyleraland)
30
+ * [Steve Salipante](mailto:stevesal@uw.edu)
31
+ * [Chris Rosenthal](mailto:crosenth@gmail.com)
32
+
33
+ ## about
34
+
35
+ Moose groups pairwise alignments by taxonomy and alignment scores. It works
36
+ safely with large data sets utilizing the Python Data Analysis Library.
37
+
38
+ ## dependencies
39
+
40
+ * Python >= 3.7
41
+ * [Pandas](https://pandas.pydata.org/) >= 2.0.2
42
+
43
+ ## installation
44
+
45
+ Moose can be installed in a few ways:
46
+
47
+ From PyPI:
48
+
49
+ ```
50
+ % pip install moose_classifier
51
+ ```
52
+
53
+ Or cloned from Github:
54
+
55
+ ```
56
+ % git clone https://github.com/crosenth/moose.git
57
+ % python moose/setup.py install
58
+ ```
59
+
60
+ ## examples
61
+
62
+ The following examples will use results using 16s sequences aligned to a local
63
+ NCBI nt database. For instructions on creating a local blast nt database see
64
+ the NCBI walkthrough
65
+ [here](https://www.ncbi.nlm.nih.gov/sites/books/NBK537770/) and
66
+ and [here](https://www.ncbi.nlm.nih.gov/sites/books/NBK279688/).
67
+
68
+ The simplest example pipes blast "10 qaccver saccver pident staxid" into
69
+ the classifier and outputs a table of species level taxonomy results:
70
+
71
+ ```
72
+ % blastn -db nt -outfmt "10 qaccver saccver pident staxid" -query sequences.fasta | classify --columns qaccver,saccver,pident,staxid
73
+ specimen,assignment_id,assignment,best_rank,max_percent,min_percent,min_threshold,reads,clusters,pct_reads
74
+ query1,0,Homo sapiens,species,99.67,99.67,0.00,1,1,100.00
75
+ query10,0,Actinobacteria*;uncultured bacterium*,species,100.00,93.21,0.00,1,1,100.00
76
+ query11,0,Bacteroidetes*;uncultured bacterium*/organism,species,100.00,91.26,0.00,1,1,100.00
77
+ query12,0,Apteryx australis*;Bacteria*;Firmicutes*,species,100.00,98.26,0.00,1,1,100.00
78
+ query13,0,Dikarya*;uncultured bacterium/eukaryote,species,100.00,82.88,0.00,1,1,100.00
79
+ query14,0,Saccharomyces cerevisiae*;uncultured eukaryote,species,100.00,99.00,0.00,1,1,100.00
80
+ query2,0,Homo sapiens;Pan troglodytes,species,97.07,95.40,0.00,1,1,100.00
81
+ query6,0,Bacteria*;Escherichia coli;Staphylococcus,species,100.00,98.62,0.00,1,1,100.00
82
+ query7,0,Bacteroidetes*;uncultured bacterium*/organism*,species,100.00,91.61,0.00,1,1,100.00
83
+ query8,0,Bacteria*;Escherichia coli;Staphylococcus,species,100.00,98.62,0.00,1,1,100.00
84
+ query9,0,Bacteria*;uncultured organism*,species,100.00,98.62,0.00,1,1,100.00
85
+ ```
86
+
87
+ This example shows the bare minimum information required to simplify and group
88
+ alignment results: a query sequence (qseqid), subject sequence (sseqid), a
89
+ percent identiy (pident) and a subject taxonomy id (staxid). If the staxid
90
+ column is unavailable an accession to taxonomy id map file can be used with
91
+ the `--seq-info` argument. Results are output in csv format.
92
+
93
+ Sending the `blastn` results to a standalone file we can look a bit closer
94
+ at what happened. And for purposes of this walkthrough the csv output will
95
+ be displated in as a nicely formatted table:
96
+
97
+ ```
98
+ % blastn -outfmt "10 qaccver saccver pident staxid" -query sequences.fasta -out blast.csv
99
+ % wc --lines blast.csv
100
+ 1084 blast.csv
101
+ % classify --columns qaccver,saccver,pident,staxid blast.csv
102
+ specimen,assignment_id,assignment,best_rank,max_percent,min_percent,min_threshold,reads,clusters,pct_reads
103
+ |----------+---------------+------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
104
+ | specimen | assignment_id | assignment | best_rank | max_percent | min_percent | min_threshold | reads | clusters | pct_reads |
105
+ |----------+---------------+------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
106
+ | query1 | 0 | Homo sapiens | species | 99.67 | 99.67 | 0.00 | 1 | 1 | 100.00 |
107
+ | query10 | 0 | Actinobacteria*;uncultured bacterium* | species | 100.00 | 93.21 | 0.00 | 1 | 1 | 100.00 |
108
+ | query11 | 0 | Bacteroidetes*;uncultured bacterium*/organism | species | 100.00 | 91.26 | 0.00 | 1 | 1 | 100.00 |
109
+ | query12 | 0 | Apteryx australis*;Bacteria*;Firmicutes* | species | 100.00 | 98.26 | 0.00 | 1 | 1 | 100.00 |
110
+ | query13 | 0 | Dikarya*;uncultured bacterium/eukaryote | species | 100.00 | 82.88 | 0.00 | 1 | 1 | 100.00 |
111
+ | query14 | 0 | Saccharomyces cerevisiae*;uncultured eukaryote | species | 100.00 | 99.00 | 0.00 | 1 | 1 | 100.00 |
112
+ | query2 | 0 | Homo sapiens;Pan troglodytes | species | 97.07 | 95.40 | 0.00 | 1 | 1 | 100.00 |
113
+ | query6 | 0 | Bacteria*;Escherichia coli;Staphylococcus | species | 100.00 | 98.62 | 0.00 | 1 | 1 | 100.00 |
114
+ | query7 | 0 | Bacteroidetes*;uncultured bacterium*/organism* | species | 100.00 | 91.61 | 0.00 | 1 | 1 | 100.00 |
115
+ | query8 | 0 | Bacteria*;Escherichia coli;Staphylococcus | species | 100.00 | 98.62 | 0.00 | 1 | 1 | 100.00 |
116
+ | query9 | 0 | Bacteria*;uncultured organism* | species | 100.00 | 98.62 | 0.00 | 1 | 1 | 100.00 |
117
+ |----------+---------------+------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
118
+ ```
119
+
120
+ 1,084 lines of blast results are conveniently grouped taxonomically and
121
+ with a single row per specimen query sequence.
122
+
123
+ Taxonomy grouping is accomplished with a lineages table that can be specified
124
+ using the `--lineages` argument. If a lineages file is not supplied it will be
125
+ generated automatically using NCBI taxonomy data by default. A Moose classify
126
+ built lineages table can be saved to a file using the `lineages-out` command
127
+ which will speed up subsequent classify runs:
128
+
129
+ ```
130
+ classify --columns qaccver,saccver,pident,staxid --lineages-out lineages.csv --specimen one blast.csv
131
+ ```
132
+
133
+ ### Taxonomony grouping
134
+
135
+ By default, classifications are taxonomically grouped according to
136
+ `--max-group-size` with 3 being the default. Classification names will start
137
+ at the species level by default and recursively regroup at a higher taxonomony
138
+ until `--max-group-size` is satisfied.
139
+
140
+ By increasing the `--max-group-size 5`:
141
+ ```
142
+ classify --columns qaccver,saccver,pident,staxid --lineages lineages.csv --max-group-size 5 blast.csv
143
+ |----------+---------------+---------------------------------------------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
144
+ | specimen | assignment_id | assignment | best_rank | max_percent | min_percent | min_threshold | reads | clusters | pct_reads |
145
+ |----------+---------------+---------------------------------------------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
146
+ | query1 | 0 | Homo sapiens | species | 99.67 | 99.67 | 0.00 | 1 | 1 | 100.00 |
147
+ | query10 | 0 | Actinomycetales bacterium 'ARUP UnID 260'*;Corynebacterium*;uncultured actinobacterium/bacterium* | species | 100.00 | 93.21 | 0.00 | 1 | 1 | 100.00 |
148
+ | query11 | 0 | Prevotella*;uncultured Bacteroidales bacterium*;uncultured Bacteroidetes bacterium;uncultured bacterium*/organism | species | 100.00 | 91.26 | 0.00 | 1 | 1 | 100.00 |
149
+ | query12 | 0 | Apteryx australis*;Bacilli*;Staphylococcus*;bacterium*;uncultured Firmicutes bacterium*;uncultured bacterium* | species | 100.00 | 98.26 | 0.00 | 1 | 1 | 100.00 |
150
+ | query13 | 0 | Saccharomycetales*;Xanthophyllomyces dendrorhous;uncultured bacterium/eukaryote | species | 100.00 | 82.88 | 0.00 | 1 | 1 | 100.00 |
151
+ | query14 | 0 | Saccharomyces cerevisiae*;uncultured eukaryote | species | 100.00 | 99.00 | 0.00 | 1 | 1 | 100.00 |
152
+ | query2 | 0 | Homo sapiens;Pan troglodytes | species | 97.07 | 95.40 | 0.00 | 1 | 1 | 100.00 |
153
+ | query6 | 0 | Escherichia coli;Staphylococcus;bacterium CulaenoE10F;human oral bacterium C20;uncultured bacterium* | species | 100.00 | 98.62 | 0.00 | 1 | 1 | 100.00 |
154
+ | query7 | 0 | Prevotella*;uncultured Bacteroidales bacterium*;uncultured Bacteroidetes bacterium*;uncultured bacterium*/organism* | species | 100.00 | 91.61 | 0.00 | 1 | 1 | 100.00 |
155
+ | query8 | 0 | Escherichia coli;Staphylococcus;bacterium CulaenoE10F;human oral bacterium C20;uncultured bacterium* | species | 100.00 | 98.62 | 0.00 | 1 | 1 | 100.00 |
156
+ | query9 | 0 | Bacteria*;Escherichia coli;Staphylococcus;uncultured organism* | species | 100.00 | 98.62 | 0.00 | 1 | 1 | 100.00 |
157
+ |----------+---------------+---------------------------------------------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
158
+ ```
159
+
160
+ And
161
+
162
+ ```
163
+ classify --columns qaccver,saccver,pident,staxid --lineages lineages.csv --max-group-size 9 blast.csv
164
+ |----------+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
165
+ | specimen | assignment_id | assignment | best_rank | max_percent | min_percent | min_threshold | reads | clusters | pct_reads |
166
+ |----------+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
167
+ | query1 | 0 | Homo sapiens | species | 99.67 | 99.67 | 0.00 | 1 | 1 | 100.00 |
168
+ | query10 | 0 | Actinomycetales bacterium 'ARUP UnID 260'*;Corynebacterium*;uncultured actinobacterium/bacterium* | species | 100.00 | 93.21 | 0.00 | 1 | 1 | 100.00 |
169
+ | query11 | 0 | Prevotella amnii/bivia;Prevotella sp. 3-5;uncultured Bacteroidales bacterium*;uncultured Bacteroidetes bacterium;uncultured Prevotella sp.*;uncultured bacterium*/organism | species | 100.00 | 91.26 | 0.00 | 1 | 1 | 100.00 |
170
+ | query12 | 0 | Apteryx australis*;Bacilli*;Staphylococcus*;bacterium*;uncultured Firmicutes bacterium*;uncultured bacterium* | species | 100.00 | 98.26 | 0.00 | 1 | 1 | 100.00 |
171
+ | query13 | 0 | Saccharomycetales*;Xanthophyllomyces dendrorhous;uncultured bacterium/eukaryote | species | 100.00 | 82.88 | 0.00 | 1 | 1 | 100.00 |
172
+ | query14 | 0 | Saccharomyces cerevisiae*;uncultured eukaryote | species | 100.00 | 99.00 | 0.00 | 1 | 1 | 100.00 |
173
+ | query2 | 0 | Homo sapiens;Pan troglodytes | species | 97.07 | 95.40 | 0.00 | 1 | 1 | 100.00 |
174
+ | query6 | 0 | Escherichia coli;Staphylococcus;bacterium CulaenoE10F;human oral bacterium C20;uncultured bacterium* | species | 100.00 | 98.62 | 0.00 | 1 | 1 | 100.00 |
175
+ | query7 | 0 | Prevotella amnii/bivia*;Prevotella sp. 3-5;uncultured Bacteroidales bacterium*;uncultured Bacteroidetes bacterium*;uncultured Prevotella sp.*;uncultured bacterium*/organism* | species | 100.00 | 91.61 | 0.00 | 1 | 1 | 100.00 |
176
+ | query8 | 0 | Escherichia coli;Staphylococcus;bacterium CulaenoE10F;human oral bacterium C20;uncultured bacterium* | species | 100.00 | 98.62 | 0.00 | 1 | 1 | 100.00 |
177
+ | query9 | 0 | Escherichia coli;Staphylococcus;bacterium CulaenoE10F;human oral bacterium C20;uncultured bacterium*/organism* | species | 100.00 | 98.62 | 0.00 | 1 | 1 | 100.00 |
178
+ |----------+---------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
179
+ ```
180
+
181
+ And using `--max-group-size 1`:
182
+
183
+ ```
184
+ classify --columns qaccver,saccver,pident,staxid --lineages lineages.csv --max-group-size 1 blast.csv
185
+ |----------+---------------+--------------+--------------+-------------+-------------+---------------+-------+----------+-----------|
186
+ | specimen | assignment_id | assignment | best_rank | max_percent | min_percent | min_threshold | reads | clusters | pct_reads |
187
+ |----------+---------------+--------------+--------------+-------------+-------------+---------------+-------+----------+-----------|
188
+ | query1 | 0 | Homo sapiens | species | 99.67 | 99.67 | 0.00 | 1 | 1 | 100.00 |
189
+ | query10 | 0 | Bacteria* | superkingdom | 100.00 | 93.21 | 0.00 | 1 | 1 | 100.00 |
190
+ | query11 | 0 | root* | root | 100.00 | 91.26 | 0.00 | 1 | 1 | 100.00 |
191
+ | query12 | 0 | root* | root | 100.00 | 98.26 | 0.00 | 1 | 1 | 100.00 |
192
+ | query13 | 0 | root* | root | 100.00 | 82.88 | 0.00 | 1 | 1 | 100.00 |
193
+ | query14 | 0 | Eukaryota* | superkingdom | 100.00 | 99.00 | 0.00 | 1 | 1 | 100.00 |
194
+ | query2 | 0 | Homininae | subfamily | 97.07 | 95.40 | 0.00 | 1 | 1 | 100.00 |
195
+ | query6 | 0 | Bacteria* | superkingdom | 100.00 | 98.62 | 0.00 | 1 | 1 | 100.00 |
196
+ | query7 | 0 | root* | root | 100.00 | 91.61 | 0.00 | 1 | 1 | 100.00 |
197
+ | query8 | 0 | Bacteria* | superkingdom | 100.00 | 98.62 | 0.00 | 1 | 1 | 100.00 |
198
+ | query9 | 0 | root* | root | 100.00 | 98.62 | 0.00 | 1 | 1 | 100.00 |
199
+ |----------+---------------+--------------+--------------+-------------+-------------+---------------+-------+----------+-----------|
200
+ ```
201
+
202
+ Using the `--specimen` argument the results can be grouped together to further simplify the results:
203
+
204
+ ```
205
+ classify --columns qaccver,saccver,pident,staxid --lineages lineages.csv --max-group-size 1 --specimen one blast.csv
206
+ |----------+---------------+--------------+--------------+-------------+-------------+---------------+-------+----------+-----------|
207
+ | specimen | assignment_id | assignment | best_rank | max_percent | min_percent | min_threshold | reads | clusters | pct_reads |
208
+ |----------+---------------+--------------+--------------+-------------+-------------+---------------+-------+----------+-----------|
209
+ | one | 0 | root* | root | 100.00 | 82.88 | 0.00 | 5 | 5 | 45.45 |
210
+ | one | 1 | Bacteria* | superkingdom | 100.00 | 93.21 | 0.00 | 3 | 3 | 27.27 |
211
+ | one | 2 | Homo sapiens | species | 99.67 | 99.67 | 0.00 | 1 | 1 | 9.09 |
212
+ | one | 3 | Homininae | subfamily | 97.07 | 95.40 | 0.00 | 1 | 1 | 9.09 |
213
+ | one | 4 | Eukaryota* | superkingdom | 100.00 | 99.00 | 0.00 | 1 | 1 | 9.09 |
214
+ |----------+---------------+--------------+--------------+-------------+-------------+---------------+-------+----------+-----------|
215
+ ```
216
+
217
+ If `--columns` is not specified the classifier will check for a header with
218
+ minimum qseqid,sseqid,pident columns. If no header than blast outfmt 6 columns
219
+ are assumed.
220
+
221
+ ### Alignment selection
222
+ TODO
223
+
224
+ ### Rank thresholds
225
+
226
+ The Moose classifier is built to accept dynamic thresholds for any taxonomic
227
+ to provide the best possible classification using the `--rank-thresholds`
228
+ argument. An example input looks like this:
229
+
230
+ ```
231
+ % cl rank_thresholds.csv
232
+ |--------+------+---------+--------+-------+-------+--------+-------+---------|
233
+ | tax_id | root | kingdom | phylum | class | order | family | genus | species | subspecies |
234
+ |--------+------+---------+--------+-------+-------+--------+-------+---------|
235
+ | 1 | 75.0 | 75.0 | 80.0 | 90.0 | 93.0 | 95.0 | 97.0 | 99.0 |
236
+ |--------+------+---------+--------+-------+-------+--------+-------+---------|
237
+ ```
238
+
239
+ Any tax_id can be specified in a rank thresholds file. If a tax_id is not
240
+ present the rank thresholds file the classifier will work its way up the
241
+ reference sequence's taxonomy lineage in order to assign rank thresholds.
242
+
243
+ The classifier will use the rank threshold table to select the lowest possible
244
+ best hits available for classification. Example usage:
245
+
246
+ ```
247
+ classify --columns qaccver,saccver,pident,staxid --lineages lineages.csv --rank-thresholds rank_thresholds.csv --specimen one blast.csv
248
+ |----------+---------------+-----------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
249
+ | specimen | assignment_id | assignment | best_rank | max_percent | min_percent | min_threshold | reads | clusters | pct_reads |
250
+ |----------+---------------+-----------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
251
+ | one | 0 | Bacteroidetes*;uncultured bacterium*/organism* | species | 100.00 | 99.27 | 99.00 | 2 | 2 | 18.18 |
252
+ | one | 1 | Bacteria*;Escherichia coli;Staphylococcus | species | 100.00 | 99.31 | 99.00 | 2 | 2 | 18.18 |
253
+ | one | 2 | Saccharomyces cerevisiae*;uncultured eukaryote | species | 100.00 | 99.33 | 99.00 | 1 | 1 | 9.09 |
254
+ | one | 3 | Homo sapiens | species | 99.67 | 99.67 | 99.00 | 1 | 1 | 9.09 |
255
+ | one | 4 | Homo | genus | 97.07 | 97.07 | 97.00 | 1 | 1 | 9.09 |
256
+ | one | 5 | Clavispora lusitaniae* | species | 100.00 | 100.00 | 99.00 | 1 | 1 | 9.09 |
257
+ | one | 6 | Bacteria*;uncultured organism* | species | 100.00 | 99.31 | 99.00 | 1 | 1 | 9.09 |
258
+ | one | 7 | Apteryx australis*;Bacteria*;Firmicutes* | species | 100.00 | 99.31 | 99.00 | 1 | 1 | 9.09 |
259
+ | one | 8 | Actinomycetales bacterium 'ARUP UnID 260'*;Corynebacterium*;uncultured bacterium* | species | 100.00 | 99.64 | 99.00 | 1 | 1 | 9.09 |
260
+ |----------+---------------+-----------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
261
+ ```
262
+
263
+ There are a few things to notice when using a rank thresholds table.
264
+ The first is the min_percent column will correspond to the lowest rank
265
+ threshold used for hit selection. The second is the difference in
266
+ classifications after dropping hits below the min_threshold.
267
+
268
+ Lastly, the genus level Homo classification was not rolled into the
269
+ Homo sapiens classification because the rank thresholds table determined that
270
+ the best hits available for that query sequence could only be classified at the genus
271
+ level. This is despite the fact that the genus level Homo classification was
272
+ derived from Homo sapien reference sequences. What the rank thresholds table
273
+ defines is classification uncertainty. So, despite the Homo sapien
274
+ reference sequences hits the classifier could not determine the query sequence
275
+ was in fact Homo sapien but only of genus level Homo origin.
276
+
277
+ ### Specimen map
278
+
279
+ A three column specimen,qseqid,weight file included using the `--specimen-map`
280
+ argument. An example might look like this:
281
+
282
+ ```
283
+ cat specimen_map.csv
284
+ one,query1,100
285
+ one,query2,95
286
+ one,query6,75
287
+ one,query7,70
288
+ one,query8,65
289
+ one,query9,60
290
+ one,query10,55
291
+ one,query11,50
292
+ one,query12,45
293
+ one,query13,40
294
+ one,query14,35
295
+ classify --columns qaccver,saccver,pident,staxid --lineages lineages.csv --rank-thresholds rank_thresholds.csv --specimen-map specimen_map.csv blast.csv | cl
296
+ |----------+---------------+-----------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
297
+ | specimen | assignment_id | assignment | best_rank | max_percent | min_percent | min_threshold | reads | clusters | pct_reads |
298
+ |----------+---------------+-----------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
299
+ | one | 0 | Bacteria*;Escherichia coli;Staphylococcus | species | 100.00 | 99.31 | 99.00 | 140 | 2 | 20.29 |
300
+ | one | 1 | Bacteroidetes*;uncultured bacterium*/organism* | species | 100.00 | 99.27 | 99.00 | 120 | 2 | 17.39 |
301
+ | one | 2 | Homo sapiens | species | 99.67 | 99.67 | 99.00 | 100 | 1 | 14.49 |
302
+ | one | 3 | Homo | genus | 97.07 | 97.07 | 97.00 | 95 | 1 | 13.77 |
303
+ | one | 4 | Bacteria*;uncultured organism* | species | 100.00 | 99.31 | 99.00 | 60 | 1 | 8.70 |
304
+ | one | 5 | Actinomycetales bacterium 'ARUP UnID 260'*;Corynebacterium*;uncultured bacterium* | species | 100.00 | 99.64 | 99.00 | 55 | 1 | 7.97 |
305
+ | one | 6 | Apteryx australis*;Bacteria*;Firmicutes* | species | 100.00 | 99.31 | 99.00 | 45 | 1 | 6.52 |
306
+ | one | 7 | Clavispora lusitaniae* | species | 100.00 | 100.00 | 99.00 | 40 | 1 | 5.80 |
307
+ | one | 8 | Saccharomyces cerevisiae*;uncultured eukaryote | species | 100.00 | 99.33 | 99.00 | 35 | 1 | 5.07 |
308
+ |----------+---------------+-----------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
309
+ ```
310
+
311
+ The classifer will interpret each qseqid in the specimen map file as part of
312
+ the specimen. If a qseqid is not included in the blast.csv results then a
313
+ classification of `[no blast result]` will be assigned:
314
+
315
+ ```
316
+ cat specimen_map.csv
317
+ one,query1,100
318
+ one,query2,95
319
+ one,query3,90
320
+ one,query4,85
321
+ one,query5,80
322
+ one,query6,75
323
+ one,query7,70
324
+ one,query8,65
325
+ one,query9,60
326
+ one,query10,55
327
+ one,query11,50
328
+ one,query12,45
329
+ one,query13,40
330
+ one,query14,35
331
+ classify --columns qaccver,saccver,pident,staxid --lineages lineages.csv --rank-thresholds rank_thresholds.csv --specimen-map specimen_map.csv blast.csv
332
+ |----------+---------------+-----------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
333
+ | specimen | assignment_id | assignment | best_rank | max_percent | min_percent | min_threshold | reads | clusters | pct_reads |
334
+ |----------+---------------+-----------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
335
+ | one | 0 | [no blast result] | | | | | 255 | 3 | 26.98 |
336
+ | one | 1 | Bacteria*;Escherichia coli;Staphylococcus | species | 100.00 | 99.31 | 99.00 | 140 | 2 | 14.81 |
337
+ | one | 2 | Bacteroidetes*;uncultured bacterium*/organism* | species | 100.00 | 99.27 | 99.00 | 120 | 2 | 12.70 |
338
+ | one | 3 | Homo sapiens | species | 99.67 | 99.67 | 99.00 | 100 | 1 | 10.58 |
339
+ | one | 4 | Homo | genus | 97.07 | 97.07 | 97.00 | 95 | 1 | 10.05 |
340
+ | one | 5 | Bacteria*;uncultured organism* | species | 100.00 | 99.31 | 99.00 | 60 | 1 | 6.35 |
341
+ | one | 6 | Actinomycetales bacterium 'ARUP UnID 260'*;Corynebacterium*;uncultured bacterium* | species | 100.00 | 99.64 | 99.00 | 55 | 1 | 5.82 |
342
+ | one | 7 | Apteryx australis*;Bacteria*;Firmicutes* | species | 100.00 | 99.31 | 99.00 | 45 | 1 | 4.76 |
343
+ | one | 8 | Clavispora lusitaniae* | species | 100.00 | 100.00 | 99.00 | 40 | 1 | 4.23 |
344
+ | one | 9 | Saccharomyces cerevisiae*;uncultured eukaryote | species | 100.00 | 99.33 | 99.00 | 35 | 1 | 3.70 |
345
+ |----------+---------------+-----------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
346
+ ```
347
+
348
+ Multiple specimens can be specified with qseqids of the same name:
349
+
350
+ ```
351
+ cat specimen_map.csv
352
+ one,query1,100
353
+ one,query2,95
354
+ one,query3,90
355
+ one,query4,85
356
+ one,query5,80
357
+ one,query6,75
358
+ one,query7,70
359
+ one,query8,65
360
+ one,query9,60
361
+ one,query10,55
362
+ one,query11,50
363
+ one,query12,45
364
+ one,query13,40
365
+ one,query14,35
366
+ two,query3,1000
367
+ two,query6,500
368
+ two,query1,25
369
+ two,query8,900
370
+ classify --columns qaccver,saccver,pident,staxid --lineages lineages.csv --rank-thresholds rank_thresholds.csv --specimen-map specimen_map.csv blast.csv
371
+ |----------+---------------+-----------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
372
+ | specimen | assignment_id | assignment | best_rank | max_percent | min_percent | min_threshold | reads | clusters | pct_reads |
373
+ |----------+---------------+-----------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
374
+ | one | 0 | [no blast result] | | | | | 255 | 3 | 26.98 |
375
+ | one | 1 | Bacteria*;Escherichia coli;Staphylococcus | species | 100.00 | 99.31 | 99.00 | 140 | 2 | 14.81 |
376
+ | one | 2 | Bacteroidetes*;uncultured bacterium*/organism* | species | 100.00 | 99.27 | 99.00 | 120 | 2 | 12.70 |
377
+ | one | 3 | Homo sapiens | species | 99.67 | 99.67 | 99.00 | 100 | 1 | 10.58 |
378
+ | one | 4 | Homo | genus | 97.07 | 97.07 | 97.00 | 95 | 1 | 10.05 |
379
+ | one | 5 | Bacteria*;uncultured organism* | species | 100.00 | 99.31 | 99.00 | 60 | 1 | 6.35 |
380
+ | one | 6 | Actinomycetales bacterium 'ARUP UnID 260'*;Corynebacterium*;uncultured bacterium* | species | 100.00 | 99.64 | 99.00 | 55 | 1 | 5.82 |
381
+ | one | 7 | Apteryx australis*;Bacteria*;Firmicutes* | species | 100.00 | 99.31 | 99.00 | 45 | 1 | 4.76 |
382
+ | one | 8 | Clavispora lusitaniae* | species | 100.00 | 100.00 | 99.00 | 40 | 1 | 4.23 |
383
+ | one | 9 | Saccharomyces cerevisiae*;uncultured eukaryote | species | 100.00 | 99.33 | 99.00 | 35 | 1 | 3.70 |
384
+ | two | 0 | Bacteria*;Escherichia coli;Staphylococcus | species | 100.00 | 99.31 | 99.00 | 1400 | 2 | 57.73 |
385
+ | two | 1 | [no blast result] | | | | | 1000 | 1 | 41.24 |
386
+ | two | 2 | Homo sapiens | species | 99.67 | 99.67 | 99.00 | 25 | 1 | 1.03 |
387
+ |----------+---------------+-----------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
388
+ ```
389
+
390
+ If a query sequence is not included in the specimen map but returned as part
391
+ of the blast.csv results then it will be added as its own specimen:
392
+
393
+ ```
394
+ cat specimen_map.csv
395
+ one,query1,100
396
+ one,query4,85
397
+ one,query5,80
398
+ one,query6,75
399
+ one,query7,70
400
+ classify --columns qaccver,saccver,pident,staxid --lineages lineages.csv --rank-thresholds rank_thresholds.csv --specimen-map specimen_map.csv blast.csv
401
+ |----------+---------------+-----------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
402
+ | specimen | assignment_id | assignment | best_rank | max_percent | min_percent | min_threshold | reads | clusters | pct_reads |
403
+ |----------+---------------+-----------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
404
+ | one | 0 | [no blast result] | | | | | 165 | 2 | 40.24 |
405
+ | one | 1 | Homo sapiens | species | 99.67 | 99.67 | 99.00 | 100 | 1 | 24.39 |
406
+ | one | 2 | Bacteria*;Escherichia coli;Staphylococcus | species | 100.00 | 99.31 | 99.00 | 75 | 1 | 18.29 |
407
+ | one | 3 | Bacteroidetes*;uncultured bacterium*/organism* | species | 100.00 | 99.27 | 99.00 | 70 | 1 | 17.07 |
408
+ | query10 | 0 | Actinomycetales bacterium 'ARUP UnID 260'*;Corynebacterium*;uncultured bacterium* | species | 100.00 | 99.64 | 99.00 | 1 | 1 | 100.00 |
409
+ | query11 | 0 | Bacteroidetes*;uncultured bacterium*/organism | species | 100.00 | 99.27 | 99.00 | 1 | 1 | 100.00 |
410
+ | query12 | 0 | Apteryx australis*;Bacteria*;Firmicutes* | species | 100.00 | 99.31 | 99.00 | 1 | 1 | 100.00 |
411
+ | query13 | 0 | Clavispora lusitaniae* | species | 100.00 | 100.00 | 99.00 | 1 | 1 | 100.00 |
412
+ | query14 | 0 | Saccharomyces cerevisiae*;uncultured eukaryote | species | 100.00 | 99.33 | 99.00 | 1 | 1 | 100.00 |
413
+ | query2 | 0 | Homo | genus | 97.07 | 97.07 | 97.00 | 1 | 1 | 100.00 |
414
+ | query8 | 0 | Bacteria*;Escherichia coli;Staphylococcus | species | 100.00 | 99.31 | 99.00 | 1 | 1 | 100.00 |
415
+ | query9 | 0 | Bacteria*;uncultured organism* | species | 100.00 | 99.31 | 99.00 | 1 | 1 | 100.00 |
416
+ |----------+---------------+-----------------------------------------------------------------------------------+-----------+-------------+-------------+---------------+-------+----------+-----------|
417
+ ```
418
+
419
+ ### copy numbers
420
+
421
+ Multiple copies of the gene may be present in a species genome which may
422
+ distort the relative weight abundance of a classification. The Moose
423
+ Classifier excepts a two column csv file with columns `--copy-numbers`:
424
+
425
+ ```
426
+ |--------+-------|
427
+ | tax_id | count |
428
+ |--------+-------|
429
+ ```
430
+
431
+ and will divide the final classification tax_id by the count number in this
432
+ file and expressed under the `corrected` column in the output file. This is
433
+ useful for adjusting relative abundance of species when, for example,
434
+ doing 16s classifications.
435
+
436
+
@@ -1,3 +1,7 @@
1
+ [build-system]
2
+ requires = ["setuptools>=64", "setuptools-scm>=8"]
3
+ build-backend = "setuptools.build_meta"
4
+
1
5
  [project]
2
6
  authors = [
3
7
  {email = "crosenth@gmail.com"},
@@ -6,24 +10,29 @@ authors = [
6
10
  classifiers = [
7
11
  "Environment :: Console",
8
12
  "Intended Audience :: End Users/Desktop",
9
- "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
10
13
  "Operating System :: OS Independent",
11
14
  "Programming Language :: Python :: 3"
12
15
  ]
13
16
  dependencies = ["pandas>=2.0.2"]
14
17
  description = "Alignment based taxonomic classifier"
18
+ dynamic = ["version"]
15
19
  keywords = [
16
20
  "bioinformatics", "blast", "classifier", "dna",
17
21
  "genetics", "genomics", "ncbi", "rna"
18
22
  ]
19
- license = {file = "LICENSE"}
23
+ license = "GPL-3.0-only"
24
+ maintainers = [
25
+ {email = "dhoogest@uw.edu", name="Dan Hoogestraat"}
26
+ ]
20
27
  name = "moose_classifier"
21
28
  readme = "README.md"
22
29
  requires-python = ">=3.7"
23
- version = "0.12"
24
30
 
25
31
  [project.urls]
26
32
  repository = "https://github.com/crosenth/moose"
27
33
 
28
34
  [project.scripts]
29
35
  classify = "classify:main"
36
+
37
+ [tool.setuptools_scm]
38
+ # can be empty if no extra settings are needed, presence enables setuptools-scm
@@ -0,0 +1,6 @@
1
+ sphinx
2
+ ghp-import
3
+ twine
4
+ tox
5
+ flake8
6
+ taxtastic