treesak 1.51.2__py3-none-any.whl

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.

Potentially problematic release.


This version of treesak might be problematic. Click here for more details.

Files changed (125) hide show
  1. TreeSAK/ALE.py +63 -0
  2. TreeSAK/ALE1.py +268 -0
  3. TreeSAK/ALE2.py +168 -0
  4. TreeSAK/ALE2RTC.py +30 -0
  5. TreeSAK/ALE3.py +205 -0
  6. TreeSAK/ALE4.py +636 -0
  7. TreeSAK/ALE5.py +210 -0
  8. TreeSAK/ALE6.py +401 -0
  9. TreeSAK/ALE7.py +126 -0
  10. TreeSAK/ALE_backup.py +1081 -0
  11. TreeSAK/AssessCVG.py +128 -0
  12. TreeSAK/AssessMarker.py +306 -0
  13. TreeSAK/AssessMarkerDeltaLL.py +257 -0
  14. TreeSAK/AssessMarkerPA.py +317 -0
  15. TreeSAK/AssessPB.py +130 -0
  16. TreeSAK/BMGE.jar +0 -0
  17. TreeSAK/BMGE.py +49 -0
  18. TreeSAK/CompareMCMC.py +138 -0
  19. TreeSAK/ConcateMSA.py +111 -0
  20. TreeSAK/ConvertMSA.py +135 -0
  21. TreeSAK/Dir.rb +82 -0
  22. TreeSAK/ExtractMarkerSeq.py +263 -0
  23. TreeSAK/FastRoot.py +1175 -0
  24. TreeSAK/FastRoot_backup.py +1122 -0
  25. TreeSAK/FigTree.py +34 -0
  26. TreeSAK/GTDB_tree.py +76 -0
  27. TreeSAK/GeneTree.py +142 -0
  28. TreeSAK/KEGG_Luo17.py +807 -0
  29. TreeSAK/LcaToLeaves.py +66 -0
  30. TreeSAK/MarkerRef2Tree.py +616 -0
  31. TreeSAK/MarkerRef2Tree_backup.py +628 -0
  32. TreeSAK/MarkerSeq2Tree.py +290 -0
  33. TreeSAK/MarkerSeq2Tree_backup.py +259 -0
  34. TreeSAK/ModifyTopo.py +116 -0
  35. TreeSAK/Newick_tree_plotter.py +79 -0
  36. TreeSAK/OMA.py +170 -0
  37. TreeSAK/OMA2.py +212 -0
  38. TreeSAK/OneLineAln.py +50 -0
  39. TreeSAK/PB.py +155 -0
  40. TreeSAK/PMSF.py +106 -0
  41. TreeSAK/PhyloBiAssoc.R +84 -0
  42. TreeSAK/PhyloBiAssoc.py +167 -0
  43. TreeSAK/PlotMCMC.py +41 -0
  44. TreeSAK/PlotMcmcNode.py +152 -0
  45. TreeSAK/PlotMcmcNode_old.py +252 -0
  46. TreeSAK/RootTree.py +101 -0
  47. TreeSAK/RootTreeGTDB214.py +288 -0
  48. TreeSAK/RootTreeGTDB220.py +300 -0
  49. TreeSAK/RootTreeGTDB226.py +300 -0
  50. TreeSAK/SequentialDating.py +16 -0
  51. TreeSAK/SingleAleHGT.py +157 -0
  52. TreeSAK/SingleLinePhy.py +50 -0
  53. TreeSAK/SliceMSA.py +142 -0
  54. TreeSAK/SplitScore.py +19 -0
  55. TreeSAK/SplitScore1.py +178 -0
  56. TreeSAK/SplitScore1OMA.py +148 -0
  57. TreeSAK/SplitScore2.py +597 -0
  58. TreeSAK/TaxaCountStats.R +256 -0
  59. TreeSAK/TaxonTree.py +47 -0
  60. TreeSAK/TreeSAK_config.py +32 -0
  61. TreeSAK/VERSION +158 -0
  62. TreeSAK/VisHPD95.R +45 -0
  63. TreeSAK/VisHPD95.py +200 -0
  64. TreeSAK/__init__.py +0 -0
  65. TreeSAK/ale_parser.py +74 -0
  66. TreeSAK/ale_splitter.py +63 -0
  67. TreeSAK/alignment_pruner.pl +1471 -0
  68. TreeSAK/assessOG.py +45 -0
  69. TreeSAK/catfasta2phy.py +140 -0
  70. TreeSAK/cogTree.py +185 -0
  71. TreeSAK/compare_trees.R +30 -0
  72. TreeSAK/compare_trees.py +255 -0
  73. TreeSAK/dating.py +264 -0
  74. TreeSAK/dating_ss.py +361 -0
  75. TreeSAK/deltall.py +82 -0
  76. TreeSAK/do_rrtc.rb +464 -0
  77. TreeSAK/fa2phy.py +42 -0
  78. TreeSAK/format_leaf_name.py +70 -0
  79. TreeSAK/gap_stats.py +38 -0
  80. TreeSAK/get_SCG_tree.py +742 -0
  81. TreeSAK/get_arCOG_seq.py +97 -0
  82. TreeSAK/global_functions.py +222 -0
  83. TreeSAK/gnm_leaves.py +43 -0
  84. TreeSAK/iTOL.py +791 -0
  85. TreeSAK/iTOL_gene_tree.py +80 -0
  86. TreeSAK/itol_msa_stats.py +56 -0
  87. TreeSAK/keep_highest_rrtc.py +37 -0
  88. TreeSAK/koTree.py +194 -0
  89. TreeSAK/label_tree.R +75 -0
  90. TreeSAK/label_tree.py +121 -0
  91. TreeSAK/mad.py +708 -0
  92. TreeSAK/mcmc2tree.py +58 -0
  93. TreeSAK/mcmcTC copy.py +92 -0
  94. TreeSAK/mcmcTC.py +104 -0
  95. TreeSAK/mcmctree_vs_reltime.R +44 -0
  96. TreeSAK/mcmctree_vs_reltime.py +252 -0
  97. TreeSAK/merge_pdf.py +32 -0
  98. TreeSAK/pRTC.py +56 -0
  99. TreeSAK/parse_mcmctree.py +198 -0
  100. TreeSAK/parse_reltime.py +141 -0
  101. TreeSAK/phy2fa.py +37 -0
  102. TreeSAK/plot_distruibution_th.py +165 -0
  103. TreeSAK/prep_mcmctree_ctl.py +92 -0
  104. TreeSAK/print_leaves.py +32 -0
  105. TreeSAK/pruneMSA.py +63 -0
  106. TreeSAK/recode.py +73 -0
  107. TreeSAK/remove_bias.R +112 -0
  108. TreeSAK/rename_leaves.py +77 -0
  109. TreeSAK/replace_clade.py +55 -0
  110. TreeSAK/root_with_out_group.py +84 -0
  111. TreeSAK/run_TaxaCountStats_R_s1.py +455 -0
  112. TreeSAK/subsample_drep_gnms.py +74 -0
  113. TreeSAK/subset.py +69 -0
  114. TreeSAK/subset_tree_stupid_old_way.py +193 -0
  115. TreeSAK/supertree.py +330 -0
  116. TreeSAK/tmp_1.py +19 -0
  117. TreeSAK/tmp_2.py +19 -0
  118. TreeSAK/tmp_3.py +120 -0
  119. TreeSAK/weighted_rand.rb +23 -0
  120. treesak-1.51.2.data/scripts/TreeSAK +950 -0
  121. treesak-1.51.2.dist-info/LICENSE +674 -0
  122. treesak-1.51.2.dist-info/METADATA +27 -0
  123. treesak-1.51.2.dist-info/RECORD +125 -0
  124. treesak-1.51.2.dist-info/WHEEL +5 -0
  125. treesak-1.51.2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,950 @@
1
+ #!python
2
+
3
+ # Copyright (C) 2017, Weizhi Song.
4
+ # songwz03@gmail.com
5
+
6
+ # TreeSAK is free software: you can redistribute it and/or modify
7
+ # it under the terms of the GNU Affero General Public License as published by
8
+ # the Free Software Foundation, either version 3 of the License, or
9
+ # (at your option) any later version.
10
+
11
+ # TreeSAK is distributed in the hope that it will be useful,
12
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ # GNU Affero General Public License for more details.
15
+
16
+ # You should have received a copy of the GNU Affero General Public License
17
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
18
+
19
+ import sys
20
+ import warnings
21
+ import argparse
22
+ from TreeSAK.TreeSAK_config import config_dict
23
+
24
+
25
+ def version(config_dict):
26
+ version_file = open('%s/VERSION' % config_dict['config_file_path'])
27
+ return version_file.readline().strip()
28
+
29
+
30
+ def print_main_help():
31
+
32
+ help_message = '''
33
+ ...::: TreeSAK v%s :::...
34
+
35
+ Marker-related
36
+ ExtractMarkerSeq -> Extract marker by blastn
37
+ deltall -> Parse stdout of deltaLL.rb
38
+ get_arCOG_seq -> Retrieve arCOG sequences
39
+ AssessMarkerPA -> Assess Markers by P/A among groups
40
+ SplitScore -> Assess markers by split score
41
+ AssessMarkerDeltaLL -> Assess Markers by DeltaLL
42
+ OMA -> Prepare input files for running OMA
43
+ OMA2 -> Filter OMA predicted OGs
44
+
45
+ Multiple Sequence Alignment
46
+ BMGE -> Run BMGE
47
+ pruneMSA -> Prune MSA with alignment_pruner.pl
48
+ recodeAA -> Recode amino acids to Dayoff 4, Dayoff 6 or SR4 categories
49
+ fa2phy -> Convert MSA format (fasta to phylip)
50
+ phy2fa -> Convert MSA format (phylip to fasta)
51
+ SliceMSA -> Slice MSA by column
52
+ ConcateMSA -> Concatenate MSAs
53
+ ConvertMSA -> Convert MSA format
54
+ OneLineAln -> One-line fasta format alignments
55
+ SingleLinePhy -> Put sequences in single line in phylip format
56
+ CS_trim -> (to be added) perform chi-squared trimming to reduce compositional heterogeneity
57
+ gap_stats -> The percentage of gap in each sequence of a MSA
58
+
59
+ Tree-related
60
+ iTOL -> Prepare iTOL files
61
+ iTOL_gene_tree -> Genome metadata to gene metadata
62
+ iTOL_msa_stats -> iTOL_msa_stats
63
+ PB -> Infer tree with PhyloBayes-MPI
64
+ supertree -> Infer species tree from multiple gene trees
65
+ AssessPB -> Compare PhyloBayes chains
66
+ MarkerSeq2Tree -> Marker sequence to tree
67
+ MarkerRef2Tree -> Marker (reference sequence) to Tree
68
+ GTDB_tree -> Get GTDB tree
69
+ subset -> Subset tree
70
+ TaxonTree -> Subset GTDB tree by taxon
71
+ compare_trees -> Compare trees with Mantel test
72
+ rename_leaves -> Rename tree leaves
73
+ print_leaves -> print out tree leaves
74
+ FLN -> Format leaf names (e.g. remove spaces in names)
75
+ ModifyTopo -> Modify tree topology
76
+ GeneRax -> (to be added) Run GeneRax
77
+ ALE -> Modules for running ALE
78
+ cogTree -> Infer tree for individual COG function
79
+ koTree -> Infer tree for individual KEGG function
80
+ RootTree -> Root tree with outgroup leaves
81
+ RootTreeGTDB214 -> Root tree by GTDB taxonomy (r214)
82
+ RootTreeGTDB220 -> Root tree by GTDB taxonomy (r220)
83
+ RootTreeGTDB226 -> Root tree by GTDB taxonomy (r226)
84
+ LcaToLeaves -> Get two leaves that define an internal node
85
+ replace_clade -> Replace tree clade
86
+ GeneTree -> Infer gene tree
87
+
88
+ Model-related
89
+ PMSF -> run iqtree with PMSF
90
+ PPA -> (to be added) Perform Posterior Predictive Analysis (across-site)
91
+
92
+ Dating-related
93
+ dating -> Perform molecular dating
94
+ AssessCVG -> Assess dating convergence
95
+ CompareMCMC -> Compare MCMCTree outputs
96
+ PlotMcmcNode -> distribution of node's age estimation
97
+ VisHPD95 -> HPD95 of estimated node age
98
+ pRTC -> Perform probabilistic RTC dating
99
+ mcmcTC -> adding time constraints to mcmctree tree
100
+ mcmc2tree -> get the tree with internal node id from mcmctree output
101
+
102
+ Phylo-related stats
103
+ PhyloBiAssoc -> A wrapper for binaryPGLMM test
104
+
105
+ # Upgrade with: pip3 install --upgrade TreeSAK
106
+ ''' % version(config_dict)
107
+
108
+ print(help_message)
109
+
110
+
111
+ if __name__ == '__main__':
112
+
113
+ ########################################################################################### initialize subparsers ############################################################################################
114
+
115
+ # initialize the options parser
116
+ parser = argparse.ArgumentParser()
117
+ subparsers = parser.add_subparsers(help="--", dest='subparser_name')
118
+ warnings.filterwarnings('ignore')
119
+
120
+ # parse options
121
+ if (len(sys.argv) == 1) or (sys.argv[1] in ['-h', '-H', '-help', '-Help', '--help', '--Help']):
122
+ print_main_help()
123
+ sys.exit(0)
124
+
125
+ elif sys.argv[1] == 'subset':
126
+ from TreeSAK import subset
127
+ subset_parser = subparsers.add_parser('subset', description='Subset tree', usage=subset.subset_usage)
128
+ subset_parser.add_argument('-i', required=True, help='input tree file')
129
+ subset_parser.add_argument('-o', required=True, help='output tree file')
130
+ subset_parser.add_argument('-k', required=False, default=None, help='leaves to keep')
131
+ subset_parser.add_argument('-r', required=False, default=None, help='leaves to remove')
132
+ subset_parser.add_argument('-fmt', required=False, default=1, type=int, help='tree format, default: 1')
133
+ args = vars(parser.parse_args())
134
+ subset.subset(args)
135
+
136
+ elif sys.argv[1] == 'label_tree':
137
+ from TreeSAK import label_tree
138
+ label_tree_parser = subparsers.add_parser('label_tree', description='Add labels to tree leaves', usage=label_tree.label_tree_usage)
139
+ label_tree_parser.add_argument('-tree', required=True, help='tree file in newick format')
140
+ label_tree_parser.add_argument('-label', required=False, default=None, help='label file (label,leaf)')
141
+ label_tree_parser.add_argument('-taxon', required=False, default=None, help='taxonomic classification')
142
+ label_tree_parser.add_argument('-rank', required=False, default=None, help='taxonomic rank to label')
143
+ args = vars(parser.parse_args())
144
+ label_tree.label_tree(args, config_dict)
145
+
146
+ elif sys.argv[1] == 'OneLineAln':
147
+ from TreeSAK import OneLineAln
148
+ OneLineAln_parser = subparsers.add_parser('OneLineAln', description='One-line fasta format alignments', usage=OneLineAln.OneLineAln_usage)
149
+ OneLineAln_parser.add_argument('-in', required=True, help='input MSA in fasta format')
150
+ OneLineAln_parser.add_argument('-out', required=False, default=None, help='output file')
151
+ OneLineAln_parser.add_argument('-upper', required=False, action='store_true', help='turn to uppercase')
152
+ args = vars(parser.parse_args())
153
+ OneLineAln.OneLineAln(args)
154
+
155
+ elif sys.argv[1] == 'SliceMSA':
156
+ from TreeSAK import SliceMSA
157
+ SliceMSA_parser = subparsers.add_parser('SliceMSA', description='Slice MSA by column', usage=SliceMSA.SliceMSA_usage)
158
+ SliceMSA_parser.add_argument('-i', required=True, help='input MSA in fasta format')
159
+ SliceMSA_parser.add_argument('-fi', required=False, default='fasta', help='format (NOT file extension) of input MSA, default: fasta')
160
+ SliceMSA_parser.add_argument('-s', required=True, help='columns to export, e.g. 200-300, -100, 50-')
161
+ SliceMSA_parser.add_argument('-o', required=True, help='output file or folder')
162
+ SliceMSA_parser.add_argument('-fo', required=False, default='fasta', help='format of output MSA, select from fasta and phylip-relaxed, default: fasta')
163
+ SliceMSA_parser.add_argument('-force', required=False, action="store_true", help='force overwrite existing output folder')
164
+ args = vars(parser.parse_args())
165
+ SliceMSA.SliceMSA(args)
166
+
167
+ elif sys.argv[1] == 'compare_trees':
168
+ from TreeSAK import compare_trees
169
+ compare_trees_parser = subparsers.add_parser('compare_trees', usage=compare_trees.compare_trees_usage)
170
+ compare_trees_parser.add_argument('-o', required=True, help='output directory')
171
+ compare_trees_parser.add_argument('-t1', required=True, help='tree (folder) 1')
172
+ compare_trees_parser.add_argument('-t2', required=True, help='tree (folder) 2')
173
+ compare_trees_parser.add_argument('-tx', required=False, default='newick', help='extention of tree files, default: newick')
174
+ compare_trees_parser.add_argument('-dm', required=False, action="store_true", help='export distance-alike matrix, obtained by subtract the similarity value from 1')
175
+ compare_trees_parser.add_argument('-t', required=False, type=int, default=1, help='number of threads')
176
+ compare_trees_parser.add_argument('-tmp', required=False, action="store_true", help='keep tmp files')
177
+ compare_trees_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
178
+ args = vars(parser.parse_args())
179
+ compare_trees.compare_trees(args)
180
+
181
+ elif sys.argv[1] == 'rename_leaves':
182
+ from TreeSAK import rename_leaves
183
+ rename_leaves_parser = subparsers.add_parser('rename_leaves', usage=rename_leaves.rename_leaves_usage)
184
+ rename_leaves_parser.add_argument('-i', required=True, help='input tree')
185
+ rename_leaves_parser.add_argument('-r', required=True, help='rename file')
186
+ rename_leaves_parser.add_argument('-f', required=False, default=1, help='tree format, default: 1')
187
+ rename_leaves_parser.add_argument('-o', required=True, help='output tree')
188
+ args = vars(parser.parse_args())
189
+ rename_leaves.rename_leaves(args)
190
+
191
+ elif sys.argv[1] == 'FLN':
192
+ from TreeSAK import format_leaf_name
193
+ format_leaf_name_parser = subparsers.add_parser('FLN', usage=format_leaf_name.format_leaf_name_usage)
194
+ format_leaf_name_parser.add_argument('-i', required=True, help='input tree')
195
+ format_leaf_name_parser.add_argument('-fmt', required=False, default=1, help='tree format, default: 1')
196
+ format_leaf_name_parser.add_argument('-o', required=True, help='output tree')
197
+ format_leaf_name_parser.add_argument('-s2u', required=False, action="store_true", help='change space in tree leaves to underscore')
198
+ format_leaf_name_parser.add_argument('-ns', required=False, action="store_true", help='remove space from leaf names')
199
+ format_leaf_name_parser.add_argument('-nsqm', required=False, action="store_true", help='remove single quotation marks from leaf names')
200
+ format_leaf_name_parser.add_argument('-ndqm', required=False, action="store_true", help='remove double quotation marks from leaf names')
201
+ args = vars(parser.parse_args())
202
+ format_leaf_name.format_leaf_name(args)
203
+
204
+ elif sys.argv[1] == 'AssessCVG':
205
+ from TreeSAK import AssessCVG
206
+ AssessCVG_parser = subparsers.add_parser('AssessCVG', usage=AssessCVG.AssessCVG_usage)
207
+ AssessCVG_parser.add_argument('-m1', required=True, help='mcmc.txt from run 1')
208
+ AssessCVG_parser.add_argument('-m2', required=True, help='mcmc.txt from run 2')
209
+ AssessCVG_parser.add_argument('-o', required=True, help='output convergence plot')
210
+ args = vars(parser.parse_args())
211
+ AssessCVG.AssessCVG(args)
212
+
213
+ elif sys.argv[1] == 'deltall':
214
+ from TreeSAK import deltall
215
+ parse_deltall_stdout_parser = subparsers.add_parser('parse_deltall_stdout', usage=deltall.deltall_usage)
216
+ parse_deltall_stdout_parser.add_argument('-i', required=True, help='input file (e.g., nohup.out)')
217
+ parse_deltall_stdout_parser.add_argument('-o', required=True, help='output summary')
218
+ args = vars(parser.parse_args())
219
+ deltall.deltall(args)
220
+
221
+ elif sys.argv[1] == 'get_arCOG_seq':
222
+ from TreeSAK import get_arCOG_seq
223
+ get_arCOG_seq_parser = subparsers.add_parser('get_arCOG_seq', usage=get_arCOG_seq.get_arCOG_seq_usage)
224
+ get_arCOG_seq_parser.add_argument('-i', required=True, help='arCOD id file, one id per line')
225
+ get_arCOG_seq_parser.add_argument('-db_dir', required=True, help='database folder')
226
+ get_arCOG_seq_parser.add_argument('-o', required=True, help='output folder')
227
+ get_arCOG_seq_parser.add_argument('-f', required=False, action="store_true", help='force overwrite existing output folder')
228
+ args = vars(parser.parse_args())
229
+ get_arCOG_seq.get_arCOG_seq(args)
230
+
231
+ elif sys.argv[1] == 'ConvertMSA':
232
+ from TreeSAK import ConvertMSA
233
+ ConvertMSA_parser = subparsers.add_parser('ConvertMSA', usage=ConvertMSA.ConvertMSA_usage)
234
+ ConvertMSA_parser.add_argument('-i', required=True, help='input alignment')
235
+ ConvertMSA_parser.add_argument('-xi', required=False, default='aln', help='input alignment extension')
236
+ ConvertMSA_parser.add_argument('-fi', required=True, help='input alignment format, e.g., fasta, phylip')
237
+ ConvertMSA_parser.add_argument('-o', required=True, help='output alignment')
238
+ ConvertMSA_parser.add_argument('-xo', required=False, default='aln', help='output alignment extension')
239
+ ConvertMSA_parser.add_argument('-fo', required=True, help='output alignment format, e.g., fasta, phylip')
240
+ ConvertMSA_parser.add_argument('-oneline', required=False, action="store_true", help='put sequence in single line, available if -fo is fasta')
241
+ ConvertMSA_parser.add_argument('-nogap', required=False, action="store_true", help='remove gaps from alignment, available if -fo is fasta')
242
+ ConvertMSA_parser.add_argument('-f', required=False, action="store_true", help='force overwrite existing output folder')
243
+ args = vars(parser.parse_args())
244
+ ConvertMSA.ConvertMSA(args)
245
+
246
+ elif sys.argv[1] == 'MarkerRef2Tree':
247
+ from TreeSAK import MarkerRef2Tree
248
+ MarkerRef2Tree_parser = subparsers.add_parser('MarkerRef2Tree', usage=MarkerRef2Tree.MarkerRef2Tree_usage)
249
+ MarkerRef2Tree_parser.add_argument('-i', required=True, help='faa dir')
250
+ MarkerRef2Tree_parser.add_argument('-x', required=False, default='faa', help='faa file extension, default: faa')
251
+ MarkerRef2Tree_parser.add_argument('-m', required=True, help='marker seq dir, file extension need to be faa')
252
+ MarkerRef2Tree_parser.add_argument('-mx', required=False, default='faa', help='marker seq file extension, default: faa')
253
+ MarkerRef2Tree_parser.add_argument('-g', required=False, default=None, help='genome group')
254
+ MarkerRef2Tree_parser.add_argument('-c', required=False, default='85', help='presence absence cutoffs, default: 85')
255
+ MarkerRef2Tree_parser.add_argument('-o', required=True, help='output dir')
256
+ MarkerRef2Tree_parser.add_argument('-e', required=False, default='1e-30', help='e-value cutoff, default: 1e-30')
257
+ MarkerRef2Tree_parser.add_argument('-t', required=True, type=int, help='num of threads')
258
+ MarkerRef2Tree_parser.add_argument('-mmn', required=False, default=1, type=int, help='minimal marker number, default: 1')
259
+ MarkerRef2Tree_parser.add_argument('-psiblast', required=False, action="store_true", help='run psiblast')
260
+ MarkerRef2Tree_parser.add_argument('-bmge', required=False, action="store_true", help='trim MSA with BMGE, default is trimal')
261
+ MarkerRef2Tree_parser.add_argument('-bmge_m', required=False, default='BLOSUM30', help='BMGE trim model, default: BLOSUM30')
262
+ MarkerRef2Tree_parser.add_argument('-bmge_esc', required=False, default='0.55', help='BMGE entropy score cutoff, default: 0.55')
263
+ MarkerRef2Tree_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
264
+ args = vars(parser.parse_args())
265
+ MarkerRef2Tree.MarkerRef2Tree(args)
266
+
267
+ elif sys.argv[1] == 'AssessMarkerPA':
268
+ from TreeSAK import AssessMarkerPA
269
+ AssessMarkerPA_parser = subparsers.add_parser('AssessMarkerPA', usage=AssessMarkerPA.AssessMarkerPA_usage)
270
+ AssessMarkerPA_parser.add_argument('-ta', required=True, help='trimmed alignments')
271
+ AssessMarkerPA_parser.add_argument('-tax', required=True, help='extension of trimmed alignments')
272
+ AssessMarkerPA_parser.add_argument('-aa', required=True, help='faa file dir')
273
+ AssessMarkerPA_parser.add_argument('-aax', required=True, help='faa file ext')
274
+ AssessMarkerPA_parser.add_argument('-g', required=True, help='genome group')
275
+ AssessMarkerPA_parser.add_argument('-c', required=False, default='25-50-75-85-100', help='cutoffs, default: 25-50-75-85-100')
276
+ AssessMarkerPA_parser.add_argument('-o', required=True, help='output dir')
277
+ AssessMarkerPA_parser.add_argument('-f', required=False, action="store_true", help='force overwrite existing output folder')
278
+ args = vars(parser.parse_args())
279
+ AssessMarkerPA.AssessMarkerPA(args)
280
+
281
+ elif sys.argv[1] == 'AssessMarkerDeltaLL':
282
+ from TreeSAK import AssessMarkerDeltaLL
283
+ AssessMarkerDeltaLL_parser = subparsers.add_parser('AssessMarkerDeltaLL', usage=AssessMarkerDeltaLL.AssessMarkerDeltaLL_usage)
284
+ AssessMarkerDeltaLL_parser.add_argument('-deltall', required=True, help='DeltaLL stdout')
285
+ AssessMarkerDeltaLL_parser.add_argument('-o', required=True, help='output dir')
286
+ AssessMarkerDeltaLL_parser.add_argument('-c', required=False, default='25-50-75-100', help='cutoffs, default: 25-50-75-100')
287
+ AssessMarkerDeltaLL_parser.add_argument('-mmn', required=False, default=20, type=int, help='minimal marker number, default: 20')
288
+ AssessMarkerDeltaLL_parser.add_argument('-aln', required=True, help='faa file dir')
289
+ AssessMarkerDeltaLL_parser.add_argument('-jst', required=False, default='6', help='threads to request in job script, for running iqtree')
290
+ AssessMarkerDeltaLL_parser.add_argument('-qsub', required=False, action="store_true", help='submit job scripts')
291
+ AssessMarkerDeltaLL_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
292
+ args = vars(parser.parse_args())
293
+ AssessMarkerDeltaLL.AssessMarkerDeltaLL(args)
294
+
295
+ elif sys.argv[1] == 'dating_ss':
296
+ from TreeSAK import dating_ss
297
+ Dating_parser = subparsers.add_parser('Dating_ss', usage=dating_ss.Dating_usage)
298
+ Dating_parser.add_argument('-deltall', required=True, help='DeltaLL stdout')
299
+ Dating_parser.add_argument('-aod', required=True, help='AssessMarkerDeltaLL output dir')
300
+ Dating_parser.add_argument('-og', required=True, help='outgroup leaves, one leaf id per line')
301
+ Dating_parser.add_argument('-eu', required=True, help='EU tree with time constraints')
302
+ Dating_parser.add_argument('-o', required=True, help='dating wd')
303
+ Dating_parser.add_argument('-c', required=False, default='25-50-75-100', help='cutoffs, default: 25-50-75-100')
304
+ Dating_parser.add_argument('-mmn', required=False, default=20, type=int, help='minimal marker number, default: 20')
305
+ Dating_parser.add_argument('-ra', required=False, default=45, type=int, help='root age, default: 45')
306
+ Dating_parser.add_argument('-qsub', required=False, action="store_true", help='submit job scripts for getting in.BV')
307
+ Dating_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
308
+ Dating_parser.add_argument('-to_test', required=True, help='Settings to test')
309
+ args = vars(parser.parse_args())
310
+ dating_ss.dating_ss(args)
311
+
312
+ elif sys.argv[1] == 'dating':
313
+ from TreeSAK import dating
314
+ dating_parser = subparsers.add_parser('dating', usage=dating.dating_usage)
315
+ dating_parser.add_argument('-i', required=True, help='tree file')
316
+ dating_parser.add_argument('-m', required=True, help='sequence alignments')
317
+ dating_parser.add_argument('-o', required=True, help='output directory')
318
+ dating_parser.add_argument('-p', required=True, help='output prefix')
319
+ dating_parser.add_argument('-s', required=True, help='settings to compare')
320
+ dating_parser.add_argument('-st', required=False, default='2', help='sequence type, 0 for nucleotides, 1 for codons, 2 for AAs, default: 2')
321
+ dating_parser.add_argument('-srun', required=False, action="store_true", help='wrap commands with BioSAK srun')
322
+ dating_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
323
+ args = vars(parser.parse_args())
324
+ dating.dating(args)
325
+
326
+ elif sys.argv[1] == 'fa2phy':
327
+ from TreeSAK import fa2phy
328
+ fa2phy_parser = subparsers.add_parser('fa2phy', usage=fa2phy.fa2phy_usage)
329
+ fa2phy_parser.add_argument('-i', required=True, help='input MSA in fasta format')
330
+ fa2phy_parser.add_argument('-o', required=True, help='output MSA in phylip format')
331
+ args = vars(parser.parse_args())
332
+ fa2phy.fa2phy(args)
333
+
334
+ elif sys.argv[1] == 'print_leaves':
335
+ from TreeSAK import print_leaves
336
+ print_leaves_parser = subparsers.add_parser('print_leaves', usage=print_leaves.print_leaves_usage)
337
+ print_leaves_parser.add_argument('-i', required=True, help='input tree file')
338
+ args = vars(parser.parse_args())
339
+ print_leaves.print_leaves(args)
340
+
341
+ elif sys.argv[1] == 'CompareMCMC':
342
+ from TreeSAK import CompareMCMC
343
+ CompareMCMC_parser = subparsers.add_parser('CompareMCMC', usage=CompareMCMC.CompareMCMC_usage)
344
+ CompareMCMC_parser.add_argument('-mx', required=True, help='mcmc.txt for x axis')
345
+ CompareMCMC_parser.add_argument('-my', required=True, help='mcmc.txt for y axis')
346
+ CompareMCMC_parser.add_argument('-lx', required=False, default=None, help='label for x axis')
347
+ CompareMCMC_parser.add_argument('-ly', required=False, default=None, help='label for y axis')
348
+ CompareMCMC_parser.add_argument('-max', required=False, default=None, type=int, help='maximum axis value')
349
+ CompareMCMC_parser.add_argument('-fs', required=False, default=16, type=int, help='label font size, default: 16')
350
+ CompareMCMC_parser.add_argument('-o', required=True, help='output plot')
351
+ args = vars(parser.parse_args())
352
+ CompareMCMC.CompareMCMC(args)
353
+
354
+ elif sys.argv[1] == 'PlotMcmcNode':
355
+ from TreeSAK import PlotMcmcNode
356
+ PlotMcmcNode_parser = subparsers.add_parser('PlotMcmcNode', usage=PlotMcmcNode.PlotMcmcNode_usage)
357
+ PlotMcmcNode_parser.add_argument('-i', required=True, help='input txt file')
358
+ PlotMcmcNode_parser.add_argument('-o', required=True, help='output plot')
359
+ args = vars(parser.parse_args())
360
+ PlotMcmcNode.PlotMcmcNode(args)
361
+
362
+ elif sys.argv[1] == 'VisHPD95':
363
+ from TreeSAK import VisHPD95
364
+ VisHPD95_parser = subparsers.add_parser('VisHPD95', usage=VisHPD95.VisHPD95_usage)
365
+ VisHPD95_parser.add_argument('-i', required=True, help='mcmc.txt file or folder')
366
+ VisHPD95_parser.add_argument('-n', required=True, help='Nodes to plot')
367
+ VisHPD95_parser.add_argument('-label', required=False, default=None, help='labels on y axis')
368
+ VisHPD95_parser.add_argument('-x', required=False, default=8,type=int, help='plot width, default: 8')
369
+ VisHPD95_parser.add_argument('-y', required=False, default=5,type=int, help='plot height, default: 5')
370
+ VisHPD95_parser.add_argument('-o', required=True, help='Output plot')
371
+ args = vars(parser.parse_args())
372
+ VisHPD95.VisHPD95(args)
373
+
374
+ elif sys.argv[1] == 'PMSF':
375
+ from TreeSAK import PMSF
376
+ PMSF_parser = subparsers.add_parser('PMSF', usage=PMSF.PMSF_usage)
377
+ PMSF_parser.add_argument('-i', required=True, help='input MSA file')
378
+ PMSF_parser.add_argument('-gm', required=False, default='LG+F+G', help='iqtree model for guide tree, default: LG+F+G')
379
+ PMSF_parser.add_argument('-m', required=False, default='LG+C60+F+G', help='iqtree model, default: LG+C60+F+G')
380
+ PMSF_parser.add_argument('-o', required=True, help='output plot')
381
+ PMSF_parser.add_argument('-p', required=False, default='PMSF', help='tree prefix, default: PMSF')
382
+ PMSF_parser.add_argument('-topo', required=False, default=None, help='topological constraint tree, pass to -g, default is None')
383
+ PMSF_parser.add_argument('-t', required=False, type=int, default=1, help='num of threads')
384
+ PMSF_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
385
+ args = vars(parser.parse_args())
386
+ PMSF.PMSF(args)
387
+
388
+ elif sys.argv[1] == 'SingleLinePhy':
389
+ from TreeSAK import SingleLinePhy
390
+ SingleLinePhy_parser = subparsers.add_parser('SingleLinePhy', usage=SingleLinePhy.SingleLinePhy_usage)
391
+ SingleLinePhy_parser.add_argument('-i', required=True, help='input file')
392
+ SingleLinePhy_parser.add_argument('-o', required=True, help='output file')
393
+ args = vars(parser.parse_args())
394
+ SingleLinePhy.SingleLinePhy(args)
395
+
396
+ elif sys.argv[1] == 'SplitScore':
397
+ from TreeSAK import SplitScore
398
+ print(SplitScore.SplitScore_usage)
399
+ exit()
400
+
401
+ elif sys.argv[1] == 'SplitScore1OMA':
402
+ from TreeSAK import SplitScore1OMA
403
+ SplitScore1OMA_parser = subparsers.add_parser('SplitScore1OMA', usage=SplitScore1OMA.SplitScore1OMA_usage)
404
+ SplitScore1OMA_parser.add_argument('-i', required=True, help='OrthologousGroups.txt, produced by OMA')
405
+ SplitScore1OMA_parser.add_argument('-s', required=True, help='OrthologousGroupsFasta, produced by OMA')
406
+ SplitScore1OMA_parser.add_argument('-u', required=False, default= None, help='ID of interested genomes, no file extension')
407
+ SplitScore1OMA_parser.add_argument('-o', required=True, help='output directory')
408
+ SplitScore1OMA_parser.add_argument('-m', required=False, default='LG+G+I', help='iqtree_model, default: LG+G+I')
409
+ SplitScore1OMA_parser.add_argument('-c', required=False, type=int, default=80, help='coverage cutoff, default: 80')
410
+ SplitScore1OMA_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
411
+ SplitScore1OMA_parser.add_argument('-jst', required=False, type=int, default=3, help='num of threads for inferring gene tree, default: 3')
412
+ args = vars(parser.parse_args())
413
+ SplitScore1OMA.SplitScore1OMA(args)
414
+
415
+ elif sys.argv[1] == 'SplitScore1':
416
+ from TreeSAK import SplitScore1
417
+ SplitScore1_parser = subparsers.add_parser('SplitScore1', usage=SplitScore1.SplitScore1_usage)
418
+ SplitScore1_parser.add_argument('-i', required=True, help='orthologous gene sequence')
419
+ SplitScore1_parser.add_argument('-x', required=True, help='fasta file extension')
420
+ SplitScore1_parser.add_argument('-o', required=True, help='output directory')
421
+ SplitScore1_parser.add_argument('-u', required=False, default=None, help='interested genomes, no file extension')
422
+ SplitScore1_parser.add_argument('-m', required=False, default='LG+G+I', help='iqtree_model, default: LG+G+I')
423
+ SplitScore1_parser.add_argument('-c', required=False, type=int, default=85, help='coverage cutoff, default: 85')
424
+ SplitScore1_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
425
+ SplitScore1_parser.add_argument('-jst', required=False, type=int, default=1, help='num of threads for iqtree2, default: 1')
426
+ args = vars(parser.parse_args())
427
+ SplitScore1.SplitScore1(args)
428
+
429
+ elif sys.argv[1] == 'SplitScore2':
430
+ from TreeSAK import SplitScore2
431
+ SplitScore2_parser = subparsers.add_parser('SplitScore2', usage=SplitScore2.SplitScore2_usage)
432
+ SplitScore2_parser.add_argument('-i', required=True, help='outputs of iqtree from step 1, only needs the contree and ufboot files')
433
+ SplitScore2_parser.add_argument('-g', required=True, help='genome group')
434
+ SplitScore2_parser.add_argument('-k', required=True, help='genome taxon, GTDB format')
435
+ SplitScore2_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
436
+ SplitScore2_parser.add_argument('-t', required=False, type=int, default=1, help='num of threads, default: 1')
437
+ SplitScore2_parser.add_argument('-c', required=False, default='25,50,75', help='marker ranking cutoffs, default: 25,50,75')
438
+ SplitScore2_parser.add_argument('-o', required=True, help='output directory')
439
+ args = vars(parser.parse_args())
440
+ SplitScore2.SplitScore2(args)
441
+
442
+ elif sys.argv[1] == 'MarkerSeq2Tree':
443
+ from TreeSAK import MarkerSeq2Tree
444
+ MarkerSeq2Tree_parser = subparsers.add_parser('MarkerSeq2Tree', usage=MarkerSeq2Tree.MarkerSeq2Tree_usage)
445
+ MarkerSeq2Tree_parser.add_argument('-i', required=True, help='marker seq dir')
446
+ MarkerSeq2Tree_parser.add_argument('-x', required=True, help='marker seq ext')
447
+ MarkerSeq2Tree_parser.add_argument('-o', required=True, help='output dir')
448
+ MarkerSeq2Tree_parser.add_argument('-t', required=False, type=int, default=1, help='num of threads')
449
+ MarkerSeq2Tree_parser.add_argument('-bmge', required=False, action="store_true", help='perform BMGE trimming on concatenated MSA')
450
+ MarkerSeq2Tree_parser.add_argument('-bmge_m', required=False, default='BLOSUM30', help='BMGE trim model, default: BLOSUM30')
451
+ MarkerSeq2Tree_parser.add_argument('-bmge_esc', required=False, default='0.55', help='BMGE entropy score cutoff, default: 0.55')
452
+ MarkerSeq2Tree_parser.add_argument('-prune', required=False, default=None, help='conservation cutoffs for alignment_pruner.pl')
453
+ MarkerSeq2Tree_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
454
+ args = vars(parser.parse_args())
455
+ MarkerSeq2Tree.MarkerSeq2Tree(args)
456
+
457
+ elif sys.argv[1] == 'GTDB_tree':
458
+ from TreeSAK import GTDB_tree
459
+ GTDB_tree_parser = subparsers.add_parser('GTDB_tree', usage=GTDB_tree.GTDB_tree_usage)
460
+ GTDB_tree_parser.add_argument('-p', required=True, help='output prefix')
461
+ GTDB_tree_parser.add_argument('-i', required=True, help='genome folder')
462
+ GTDB_tree_parser.add_argument('-x', required=True, help='genome file extension')
463
+ GTDB_tree_parser.add_argument('-t', required=False, type=int, default=1, help='number of threads')
464
+ args = vars(parser.parse_args())
465
+ GTDB_tree.GTDB_tree(args)
466
+
467
+ elif sys.argv[1] == 'ExtractMarkerSeq':
468
+ from TreeSAK import ExtractMarkerSeq
469
+ ExtractMarkerSeq_parser = subparsers.add_parser('ExtractMarkerSeq', usage=ExtractMarkerSeq.ExtractMarkerSeq_usage)
470
+ ExtractMarkerSeq_parser.add_argument('-m', required=True, help='marker seq dir')
471
+ ExtractMarkerSeq_parser.add_argument('-mx', required=True, help='marker seq ext')
472
+ ExtractMarkerSeq_parser.add_argument('-aa', required=True, help='faa file dir')
473
+ ExtractMarkerSeq_parser.add_argument('-aax', required=True, help='faa file ext')
474
+ ExtractMarkerSeq_parser.add_argument('-o', required=True, help='output dir')
475
+ ExtractMarkerSeq_parser.add_argument('-e', required=True, default=1e-30, help='e-value cutoff, default: 1e-30')
476
+ ExtractMarkerSeq_parser.add_argument('-t', required=True, type=int, help='num of threads')
477
+ ExtractMarkerSeq_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
478
+ args = vars(parser.parse_args())
479
+ ExtractMarkerSeq.ExtractMarkerSeq(args)
480
+
481
+ elif sys.argv[1] == 'OMA':
482
+ from TreeSAK import OMA
483
+ OMA_parser = subparsers.add_parser('OMA', usage=OMA.OMA_usage)
484
+ OMA_parser.add_argument('-i', required=True, help='genome folder')
485
+ OMA_parser.add_argument('-x', required=True, help='genome file extension')
486
+ OMA_parser.add_argument('-st', required=False, default='AA', help='sequence type, AA or DNA, default: AA')
487
+ OMA_parser.add_argument('-og', required=True, help='id of outgroup genomes, without file extension')
488
+ OMA_parser.add_argument('-o', required=True, default=None, help='output dir, i.e., OMA working directory')
489
+ OMA_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
490
+ OMA_parser.add_argument('-t', required=False, type=int, default=6, help='number of threads for running OMA, default: 6')
491
+ args = vars(parser.parse_args())
492
+ OMA.OMA(args)
493
+
494
+ elif sys.argv[1] == 'OMA2':
495
+ from TreeSAK import OMA2
496
+ OMA2_parser = subparsers.add_parser('OMA2', usage=OMA2.OMA2_usage)
497
+ OMA2_parser.add_argument('-i', required=True, help='OrthologousGroups.txt')
498
+ OMA2_parser.add_argument('-s', required=True, help='sequence dir, OrthologousGroupsFasta')
499
+ OMA2_parser.add_argument('-g', required=False, default=None, help='interested genomes')
500
+ OMA2_parser.add_argument('-o', required=True, default=None, help='output directory')
501
+ OMA2_parser.add_argument('-n', required=False, default=None, help='minimal number of gene in a OG, not compatible with -c')
502
+ OMA2_parser.add_argument('-c', required=False, default=None, help='minimal genome coverage cutoff, not compatible with -n')
503
+ OMA2_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
504
+ args = vars(parser.parse_args())
505
+ OMA2.OMA2(args)
506
+
507
+ elif sys.argv[1] in ['ALE', 'ale', 'Ale']:
508
+ from TreeSAK import ALE
509
+ print(ALE.ALE_usage)
510
+ exit()
511
+
512
+ elif sys.argv[1] == 'ALE1':
513
+ from TreeSAK import ALE1
514
+ ALE1_parser = subparsers.add_parser('ALE1', usage=ALE1.ALE1_usage)
515
+ ALE1_parser.add_argument('-i', required=False, default=None, help='orthologous groups, either from orthofinder or oma')
516
+ ALE1_parser.add_argument('-s', required=False, default=None, help='sequence file, e.g., combined.faa')
517
+ ALE1_parser.add_argument('-ms', required=False, default=None, help='input is a folder holds the sequence of each marker')
518
+ ALE1_parser.add_argument('-msx', required=False, default='fa', help='file extension of marker sequence file, default: fa')
519
+ ALE1_parser.add_argument('-p', required=True, help='orthologous identification program, orthofinder or oma')
520
+ ALE1_parser.add_argument('-m', required=False, type=int, default=50, help='min_og_genome_num, default: 50')
521
+ ALE1_parser.add_argument('-bmge', required=False, action="store_true", help='trim MSA with BMGE, default no trimming')
522
+ ALE1_parser.add_argument('-bmge_m', required=False, default='BLOSUM30', help='BMGE trim model, default: BLOSUM30')
523
+ ALE1_parser.add_argument('-bmge_esc', required=False, default='0.55', help='BMGE entropy score cutoff, default: 0.55')
524
+ ALE1_parser.add_argument('-o', required=True, help='output dir, i.e., OMA working directory')
525
+ ALE1_parser.add_argument('-jst', required=False, type=int, default=3, help='number of threads specified in job script, default: 3')
526
+ ALE1_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
527
+ args = vars(parser.parse_args())
528
+ ALE1.ALE1(args)
529
+
530
+ elif sys.argv[1] == 'ALE2':
531
+ from TreeSAK import ALE2
532
+ ALE2_parser = subparsers.add_parser('ALE2', usage=ALE2.ALE2_usage)
533
+ ALE2_parser.add_argument('-1', required=True, help='ALE1 output directory')
534
+ ALE2_parser.add_argument('-s', required=True, help='rooted species tree')
535
+ ALE2_parser.add_argument('-o', required=True, help='output dir, i.e., OMA working directory')
536
+ ALE2_parser.add_argument('-runALE', required=False, action="store_true", help='run ALE')
537
+ ALE2_parser.add_argument('-docker', required=False, default=None, help='Docker image, if ALE was installed with Docker, e.g., gregmich/alesuite_new')
538
+ ALE2_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
539
+ ALE2_parser.add_argument('-t', required=False, type=int, default=6, help='number of threads, default: 6')
540
+ args = vars(parser.parse_args())
541
+ ALE2.ALE2(args)
542
+
543
+ elif sys.argv[1] == 'ALE3':
544
+ from TreeSAK import ALE3
545
+ ALE3_parser = subparsers.add_parser('ALE3', usage=ALE3.ALE3_usage)
546
+ ALE3_parser.add_argument('-2', required=True, help='Folder with uml_rec files')
547
+ ALE3_parser.add_argument('-c', required=False, type=float, default=75, help='gene family presence cutoff in percentage, default: 75')
548
+ ALE3_parser.add_argument('-a', required=False, default=None, help='OG functional description')
549
+ ALE3_parser.add_argument('-o', required=True, help='output dir')
550
+ ALE3_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
551
+ args = vars(parser.parse_args())
552
+ ALE3.ALE3(args)
553
+
554
+ elif sys.argv[1] == 'ALE4':
555
+ from TreeSAK import ALE4
556
+ ALE4_parser = subparsers.add_parser('ALE4', usage=ALE4.ALE4_usage)
557
+ ALE4_parser.add_argument('-1', required=True, help='ALE1 output directory')
558
+ ALE4_parser.add_argument('-2', required=True, help='ALE2 output directory')
559
+ ALE4_parser.add_argument('-c', required=True, help='genome_taxon, GTDB format')
560
+ ALE4_parser.add_argument('-color', required=True, help='phylum color code')
561
+ ALE4_parser.add_argument('-o', required=True, help='output dir, i.e., ALE4_op_dir')
562
+ ALE4_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
563
+ ALE4_parser.add_argument('-api', required=True, help='iTOL API key')
564
+ ALE4_parser.add_argument('-fc', required=False, type=float, default=0.5, help='hgt_freq_cutoff, default: 0.5')
565
+ ALE4_parser.add_argument('-mld', required=False, type=int, default=5, help='donor_node_min_leaf_num, default: 5')
566
+ ALE4_parser.add_argument('-mlr', required=False, type=int, default=5, help='recipient_node_min_leaf_num, default: 5')
567
+ ALE4_parser.add_argument('-itol', required=False, default='batch_access_tmp', help='iTOL project_name, default: batch_access_tmp')
568
+ args = vars(parser.parse_args())
569
+ ALE4.ALE4(args)
570
+
571
+ elif sys.argv[1] == 'ALE6':
572
+ from TreeSAK import ALE6
573
+ ALE6_parser = subparsers.add_parser('ALE6', usage=ALE6.ALE6_usage)
574
+ ALE6_parser.add_argument('-1', required=True, help='ALE1 output directory')
575
+ ALE6_parser.add_argument('-3', required=True, help='ALE3 output directory')
576
+ ALE6_parser.add_argument('-s', required=True, help='rooted species tree')
577
+ ALE6_parser.add_argument('-n', required=False, default=None, help='interested internal node(s)')
578
+ ALE6_parser.add_argument('-cog', required=False, default=None, help='COG annotation results')
579
+ ALE6_parser.add_argument('-kegg', required=False, default=None, help='KEGG annotation results')
580
+ ALE6_parser.add_argument('-o', required=True, help='output directory')
581
+ ALE6_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
582
+ args = vars(parser.parse_args())
583
+ ALE6.ALE6(args)
584
+
585
+ elif sys.argv[1] == 'ALE7':
586
+ from TreeSAK import ALE7
587
+ ALE7_parser = subparsers.add_parser('ALE7', usage=ALE7.ALE7_usage)
588
+ ALE7_parser.add_argument('-6', required=True, help='ALE6 output directory')
589
+ ALE7_parser.add_argument('-fun', required=True, help='interested functions')
590
+ ALE7_parser.add_argument('-node', required=True, help='interested internal nodes')
591
+ ALE7_parser.add_argument('-o', required=True, help='output directory')
592
+ args = vars(parser.parse_args())
593
+ ALE7.ALE7(args)
594
+
595
+ elif sys.argv[1] == 'RootTree':
596
+ from TreeSAK import RootTree
597
+ RootTree_parser = subparsers.add_parser('RootTree', usage=RootTree.RootTree_usage)
598
+ RootTree_parser.add_argument('-i', required=True, help='input tree')
599
+ RootTree_parser.add_argument('-og', required=True, help='out group leaves')
600
+ RootTree_parser.add_argument('-o', required=True, help='output tree')
601
+ RootTree_parser.add_argument('-add_root', required=False, action='store_true', help='add the root branch')
602
+ RootTree_parser.add_argument('-fmt', required=False, default=1, type=int, help='tree format, default: 1')
603
+ args = vars(parser.parse_args())
604
+ RootTree.RootTree(args)
605
+
606
+ elif sys.argv[1] == 'BMGE':
607
+ from TreeSAK import BMGE
608
+ BMGE_parser = subparsers.add_parser('BMGE', usage=BMGE.BMGE_usage)
609
+ BMGE_parser.add_argument('-p', required=True, help='output prefix')
610
+ BMGE_parser.add_argument('-i', required=True, help='input MSA')
611
+ BMGE_parser.add_argument('-m', required=False, default='BLOSUM30', help='trim model, default: BLOSUM30')
612
+ BMGE_parser.add_argument('-esc', required=False, default='0.55', help='entropy score cutoff, default: 0.55')
613
+ args = vars(parser.parse_args())
614
+ BMGE.BMGE(args)
615
+
616
+ elif sys.argv[1] == 'pRTC':
617
+ from TreeSAK import pRTC
618
+ pRTC_parser = subparsers.add_parser('pRTC', usage=pRTC.pRTC_usage)
619
+ pRTC_parser.add_argument('-i', required=True, help='the file "out" generated by MCMCTree')
620
+ pRTC_parser.add_argument('-m', required=True, help='the file "mcmc.txt" generated by MCMCTree')
621
+ pRTC_parser.add_argument('-r', required=True, help='the folder that contains RTCs')
622
+ pRTC_parser.add_argument('-o', required=True, help='output txt file')
623
+ pRTC_parser.add_argument('-ruby', required=False, default='ruby', help='path to ruby executable file, default: ruby')
624
+ args = vars(parser.parse_args())
625
+ pRTC.pRTC(args)
626
+
627
+ elif sys.argv[1] == 'ConcateMSA':
628
+ from TreeSAK import ConcateMSA
629
+ ConcateMSA_parser = subparsers.add_parser('ConcateMSA', usage=ConcateMSA.ConcateMSA_usage)
630
+ ConcateMSA_parser.add_argument('-i', required=True, help='input MSA folder')
631
+ ConcateMSA_parser.add_argument('-x', required=True, help='input file extension')
632
+ ConcateMSA_parser.add_argument('-p', required=True, help='output prefix')
633
+ ConcateMSA_parser.add_argument('-gene2gnm', required=False, action="store_true", help='gene id to gnm id, split sequence id before the last _')
634
+ args = vars(parser.parse_args())
635
+ ConcateMSA.ConcateMSA(args)
636
+
637
+ elif sys.argv[1] == 'SingleAleHGT':
638
+ from TreeSAK import SingleAleHGT
639
+ SingleAleHGT_parser = subparsers.add_parser('SingleAleHGT', usage=SingleAleHGT.SingleAleHGT_usage)
640
+ SingleAleHGT_parser.add_argument('-faa', required=False, default=None, help='input aa file, e.g., OMA0001.faa')
641
+ SingleAleHGT_parser.add_argument('-msa', required=False, default=None, help='input MSA file, e.g., OMA0001.aln')
642
+ SingleAleHGT_parser.add_argument('-o', required=True, help='output dir, e.g., SingleAleHGT_wd')
643
+ SingleAleHGT_parser.add_argument('-s', required=True, help='rooted species tree')
644
+ SingleAleHGT_parser.add_argument('-c', required=True, help='genome_taxon, GTDB format')
645
+ SingleAleHGT_parser.add_argument('-color', required=True, help='phylum color code')
646
+ SingleAleHGT_parser.add_argument('-fc', required=False, type=float, default=0.5, help='hgt_freq_cutoff, default: 0.5')
647
+ SingleAleHGT_parser.add_argument('-mld', required=False, type=int, default=5, help='donor_node_min_leaf_num, default: 5')
648
+ SingleAleHGT_parser.add_argument('-mlr', required=False, type=int, default=5, help='recipient_node_min_leaf_num, default: 5')
649
+ SingleAleHGT_parser.add_argument('-trim', required=False, action="store_true", help='trim MSA')
650
+ SingleAleHGT_parser.add_argument('-docker', required=False, default=None, help='Docker image, if ALE was installed with Docker, e.g., gregmich/alesuite_new')
651
+ SingleAleHGT_parser.add_argument('-itol', required=False, default='batch_access_tmp', help='iTOL project_name, default: batch_access_tmp')
652
+ SingleAleHGT_parser.add_argument('-api', required=True, help='iTOL API key')
653
+ SingleAleHGT_parser.add_argument('-t', required=False, type=int, default=6, help='number of threads, default: 6')
654
+ SingleAleHGT_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
655
+ args = vars(parser.parse_args())
656
+ SingleAleHGT.SingleAleHGT(args)
657
+
658
+ elif sys.argv[1] == 'LcaToLeaves':
659
+ from TreeSAK import LcaToLeaves
660
+ LcaToLeaves_parser = subparsers.add_parser('LcaToLeaves', usage=LcaToLeaves.LcaToLeaves_usage)
661
+ LcaToLeaves_parser.add_argument('-s', required=True, help='the .stree file from ALE')
662
+ LcaToLeaves_parser.add_argument('-n', required=True, help='internal node(s)')
663
+ args = vars(parser.parse_args())
664
+ LcaToLeaves.LcaToLeaves(args)
665
+
666
+ elif sys.argv[1] == 'PhyloBiAssoc':
667
+ from TreeSAK import PhyloBiAssoc
668
+ PhyloBiAssoc_parser = subparsers.add_parser('PhyloBiAssoc', usage=PhyloBiAssoc.PhyloBiAssoc_usage)
669
+ PhyloBiAssoc_parser.add_argument('-i', required=True, help='tree file')
670
+ PhyloBiAssoc_parser.add_argument('-d', required=True, help='data file')
671
+ PhyloBiAssoc_parser.add_argument('-o', required=True, help='output directory')
672
+ PhyloBiAssoc_parser.add_argument('-t', required=False, type=int, default=1, help='number of threads, default: 1')
673
+ PhyloBiAssoc_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
674
+ args = vars(parser.parse_args())
675
+ PhyloBiAssoc.PhyloBiAssoc(args)
676
+
677
+ elif sys.argv[1] == 'replace_clade':
678
+ from TreeSAK import replace_clade
679
+ replace_clade_parser = subparsers.add_parser('replace_clade', usage=replace_clade.replace_clade_usage)
680
+ replace_clade_parser.add_argument('-m', required=True, help='main tree file')
681
+ replace_clade_parser.add_argument('-s', required=True, help='subtree file')
682
+ replace_clade_parser.add_argument('-l', required=True, help='leaves on main tree to be replaced')
683
+ replace_clade_parser.add_argument('-o', required=True, help='output tree')
684
+ replace_clade_parser.add_argument('-of', required=False, default=9, type=int, help='output tree format, default is 9')
685
+ args = vars(parser.parse_args())
686
+ replace_clade.replace_clade(args)
687
+
688
+ elif sys.argv[1] == 'RootTreeGTDB214':
689
+ from TreeSAK import RootTreeGTDB214
690
+ RootTreeGTDB214_parser = subparsers.add_parser('RootTreeGTDB214', usage=RootTreeGTDB214.RootTreeGTDB214_usage)
691
+ RootTreeGTDB214_parser.add_argument('-tree', required=True, help='input unrooted tree')
692
+ RootTreeGTDB214_parser.add_argument('-tax', required=False, default='fna', help='leaf taxon')
693
+ RootTreeGTDB214_parser.add_argument('-db', required=True, help='GTDB database files')
694
+ RootTreeGTDB214_parser.add_argument('-d', required=False, default=None, help='domain, either ar or bac')
695
+ RootTreeGTDB214_parser.add_argument('-o', required=True, help='output folder')
696
+ args = vars(parser.parse_args())
697
+ RootTreeGTDB214.RootTreeGTDB214(args)
698
+
699
+ elif sys.argv[1] == 'RootTreeGTDB220':
700
+ from TreeSAK import RootTreeGTDB220
701
+ RootTreeGTDB220_parser = subparsers.add_parser('RootTreeGTDB220', usage=RootTreeGTDB220.RootTreeGTDB220_usage)
702
+ RootTreeGTDB220_parser.add_argument('-tree', required=True, help='input unrooted tree')
703
+ RootTreeGTDB220_parser.add_argument('-tax', required=False, default='fna', help='leaf taxon')
704
+ RootTreeGTDB220_parser.add_argument('-db', required=True, help='GTDB database files')
705
+ RootTreeGTDB220_parser.add_argument('-d', required=False, default=None, help='domain, either ar or bac')
706
+ RootTreeGTDB220_parser.add_argument('-add_root', required=False, action='store_true', help='add the root branch')
707
+ RootTreeGTDB220_parser.add_argument('-o', required=True, help='output folder')
708
+ args = vars(parser.parse_args())
709
+ RootTreeGTDB220.RootTreeGTDB220(args)
710
+
711
+ elif sys.argv[1] == 'RootTreeGTDB226':
712
+ from TreeSAK import RootTreeGTDB226
713
+ RootTreeGTDB226_parser = subparsers.add_parser('RootTreeGTDB226', usage=RootTreeGTDB226.RootTreeGTDB226_usage)
714
+ RootTreeGTDB226_parser.add_argument('-tree', required=True, help='input unrooted tree')
715
+ RootTreeGTDB226_parser.add_argument('-tax', required=False, default='fna', help='leaf taxon')
716
+ RootTreeGTDB226_parser.add_argument('-db', required=True, help='GTDB database files')
717
+ RootTreeGTDB226_parser.add_argument('-d', required=False, default=None, help='domain, either ar or bac')
718
+ RootTreeGTDB226_parser.add_argument('-add_root', required=False, action='store_true', help='add the root branch')
719
+ RootTreeGTDB226_parser.add_argument('-o', required=True, help='output folder')
720
+ args = vars(parser.parse_args())
721
+ RootTreeGTDB226.RootTreeGTDB226(args)
722
+
723
+ elif sys.argv[1] in ['PB', 'Pb', 'pb']:
724
+ from TreeSAK import PB
725
+ PB_parser = subparsers.add_parser('PB', usage=PB.PB_usage)
726
+ PB_parser.add_argument('-i', required=True, help='input MSA file')
727
+ PB_parser.add_argument('-o', required=True, help='output directory')
728
+ PB_parser.add_argument('-p', required=True, help='output prefix')
729
+ PB_parser.add_argument('-fa2plp', required=False, action="store_true", help='convert MSA format from fasta to phylip')
730
+ PB_parser.add_argument('-n', required=False, type=int, default=4, help='number of chains to run in parallel, default: 4')
731
+ PB_parser.add_argument('-t', required=False, type=int, default=12, help='num of cores, default: 12')
732
+ PB_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
733
+ args = vars(parser.parse_args())
734
+ PB.PB(args)
735
+
736
+ elif sys.argv[1] == 'AssessPB':
737
+ from TreeSAK import AssessPB
738
+ AssessPB_parser = subparsers.add_parser('AssessPB', usage=AssessPB.AssessPB_usage)
739
+ AssessPB_parser.add_argument('-c1', required=False, default=None, help='chain 1')
740
+ AssessPB_parser.add_argument('-c2', required=False, default=None, help='chain 2')
741
+ AssessPB_parser.add_argument('-c3', required=False, default=None, help='chain 3')
742
+ AssessPB_parser.add_argument('-c4', required=False, default=None, help='chain 4')
743
+ AssessPB_parser.add_argument('-cdir', required=False, default=None, help='chain folder')
744
+ AssessPB_parser.add_argument('-bi', required=False, default=1000, help='burn-in, default: 1000')
745
+ AssessPB_parser.add_argument('-si', required=False, default=10, help='sample interval, default: 10')
746
+ AssessPB_parser.add_argument('-o', required=True, default=None, help='output directory')
747
+ AssessPB_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
748
+ args = vars(parser.parse_args())
749
+ AssessPB.AssessPB(args)
750
+
751
+ elif sys.argv[1] == 'gap_stats':
752
+ from TreeSAK import gap_stats
753
+ gap_stats_parser = subparsers.add_parser('gap_stats', usage=gap_stats.gap_stats_usage)
754
+ gap_stats_parser.add_argument('-i', required=True, help='MSA in fasta format')
755
+ args = vars(parser.parse_args())
756
+ gap_stats.gap_stats(args)
757
+
758
+ elif sys.argv[1] == 'recode':
759
+ from TreeSAK import recode
760
+ recode_parser = subparsers.add_parser('recode', usage=recode.recode_usage)
761
+ recode_parser.add_argument('-i', required=True, help='input file')
762
+ recode_parser.add_argument('-m', required=True, help='recoding scheme, choose from d4, d6 or s4')
763
+ recode_parser.add_argument('-o', required=True, help='output file')
764
+ args = vars(parser.parse_args())
765
+ recode.recode(args)
766
+
767
+ elif sys.argv[1] == 'pruneMSA':
768
+ from TreeSAK import pruneMSA
769
+ pruneMSA_parser = subparsers.add_parser('pruneMSA', usage=pruneMSA.pruneMSA_usage)
770
+ pruneMSA_parser.add_argument('-i', required=True, help='input MSA file')
771
+ pruneMSA_parser.add_argument('-c', required=True, help='conservation cutoffs, comma separated')
772
+ args = vars(parser.parse_args())
773
+ pruneMSA.pruneMSA(args)
774
+
775
+ elif sys.argv[1] == 'iTOL':
776
+ from TreeSAK import iTOL
777
+ iTOL_parser = subparsers.add_parser('iTOL', description='Decorate tree with iTOL', usage=iTOL.iTOL_usage)
778
+ iTOL_parser.add_argument('-Labels', required=False, action='store_true', help='Labels')
779
+ iTOL_parser.add_argument('-ColoredLabel', required=False, action='store_true', help='ColoredLabel')
780
+ iTOL_parser.add_argument('-MultiStyleLabel', required=False, action='store_true', help='MultiStyleLabel')
781
+ iTOL_parser.add_argument('-ColorStrip', required=False, action='store_true', help='ColorStrip')
782
+ iTOL_parser.add_argument('-ColorRange', required=False, action='store_true', help='ColorRange')
783
+ iTOL_parser.add_argument('-ColorClade', required=False, action='store_true', help='ColorClade')
784
+ iTOL_parser.add_argument('-ColorLabel', required=False, action='store_true', help='ColorLabel')
785
+ iTOL_parser.add_argument('-SimpleBar', required=False, action='store_true', help='SimpleBar')
786
+ iTOL_parser.add_argument('-Heatmap', required=False, action='store_true', help='Heatmap')
787
+ iTOL_parser.add_argument('-ExternalShape', required=False, action='store_true', help='ExternalShape')
788
+ iTOL_parser.add_argument('-Binary', required=False, action='store_true', help='Binary')
789
+ iTOL_parser.add_argument('-BinaryID', required=False, action='store_true', help='Binary specified IDs as 1')
790
+ iTOL_parser.add_argument('-BinaryShape', required=False, default='2', help='Binary Shape, choose from 1(rectangle), 2(circle), 3(star), 4, 5 and 6, default is 2')
791
+ iTOL_parser.add_argument('-BinaryColor', required=False, default='red', help='Binary Color, default is red')
792
+ iTOL_parser.add_argument('-Connection', required=False, action='store_true', help='Connection')
793
+ iTOL_parser.add_argument('-PieChart', required=False, action='store_true', help='PieChart')
794
+ iTOL_parser.add_argument('-Collapse', required=False, action='store_true', help='Collapse')
795
+ iTOL_parser.add_argument('-id', required=False, default=None, help='File contains leaf id')
796
+ iTOL_parser.add_argument('-ll', required=False, default=None, help='Leaf Label')
797
+ iTOL_parser.add_argument('-gc', required=False, default=None, help='Specify Group/column Color (optional)')
798
+ iTOL_parser.add_argument('-cc', required=False, default=None, help='Specify Column Color (for ExternalShape format) (optional)')
799
+ iTOL_parser.add_argument('-lg', required=False, default=None, help='Leaf to Group')
800
+ iTOL_parser.add_argument('-lv', required=False, default=None, help='Leaf to Value')
801
+ iTOL_parser.add_argument('-lm', required=False, default=None, help='Leaf to data Matrix')
802
+ iTOL_parser.add_argument('-dr', required=False, default=None, help='Donor to Recipient')
803
+ iTOL_parser.add_argument('-scale', required=False, default=None, help='Scale Values, in format 0-3-6-9')
804
+ iTOL_parser.add_argument('-lt', required=False, default=None, help='Legend Title')
805
+ iTOL_parser.add_argument('-legend', required=False, action='store_true', help='show legend for ColorStrip')
806
+ iTOL_parser.add_argument('-show_strip_labels', required=False, action='store_true', help='SHOW_STRIP_LABELS')
807
+ iTOL_parser.add_argument('-o', required=True, help='Output filename')
808
+ args = vars(parser.parse_args())
809
+ iTOL.iTOL(args)
810
+
811
+ elif sys.argv[1] == 'supertree':
812
+ from TreeSAK import supertree
813
+ supertree_parser = subparsers.add_parser('supertree', usage=supertree.supertree_usage)
814
+ supertree_parser.add_argument('-i', required=True, help='orthologous gene sequence')
815
+ supertree_parser.add_argument('-x', required=True, help='faa file extension')
816
+ supertree_parser.add_argument('-o', required=True, help='output directory')
817
+ supertree_parser.add_argument('-bmge', required=False, action="store_true", help='trim with BMGE, default is trimal')
818
+ supertree_parser.add_argument('-bmge_m', required=False, default='BLOSUM30', help='trim model, default: BLOSUM30')
819
+ supertree_parser.add_argument('-bmge_esc', required=False, default='0.55', help='entropy score cutoff, default: 0.55')
820
+ supertree_parser.add_argument('-iqtree_m', required=False, default='LG+G+I', help='iqtree_model, default: LG+G+I')
821
+ supertree_parser.add_argument('-pb', required=False, action="store_true", help='infer tree with PhyloBayes-MPI, default is iqtree')
822
+ supertree_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
823
+ supertree_parser.add_argument('-t', required=False, type=int, default=1, help='num of threads, default: 1')
824
+ args = vars(parser.parse_args())
825
+ supertree.supertree(args)
826
+
827
+ elif sys.argv[1] == 'TaxonTree':
828
+ from TreeSAK import TaxonTree
829
+ TaxonTree_parser = subparsers.add_parser('TaxonTree', usage=TaxonTree.TaxonTree_usage)
830
+ TaxonTree_parser.add_argument('-i', required=True, help='input tree file')
831
+ TaxonTree_parser.add_argument('-tax', required=True, help='interested taxon')
832
+ TaxonTree_parser.add_argument('-o', required=True, help='output tree file')
833
+ args = vars(parser.parse_args())
834
+ TaxonTree.TaxonTree(args)
835
+
836
+ elif sys.argv[1] == 'mcmcTC':
837
+ from TreeSAK import mcmcTC
838
+ mcmcTC_parser = subparsers.add_parser('mcmcTC', usage=mcmcTC.mcmcTC_usage)
839
+ mcmcTC_parser.add_argument('-i', required=True, help='input tree')
840
+ mcmcTC_parser.add_argument('-o', required=True, help='output tree')
841
+ mcmcTC_parser.add_argument('-tc', required=True, help='time constraint file')
842
+ args = vars(parser.parse_args())
843
+ mcmcTC.mcmcTC(args)
844
+
845
+ elif sys.argv[1] == 'mcmc2tree':
846
+ from TreeSAK import mcmc2tree
847
+ mcmc2tree_parser = subparsers.add_parser('mcmc2tree', usage=mcmc2tree.mcmc2tree_usage)
848
+ mcmc2tree_parser.add_argument('-i', required=True, help='the .out file from mcmctree')
849
+ mcmc2tree_parser.add_argument('-o', required=True, help='output tree file')
850
+ args = vars(parser.parse_args())
851
+ mcmc2tree.mcmc2tree(args)
852
+
853
+ elif sys.argv[1] == 'cogTree':
854
+ from TreeSAK import cogTree
855
+ cogTree_parser = subparsers.add_parser('cogTree', usage=cogTree.cogTree_usage)
856
+ cogTree_parser.add_argument('-i', required=True, help='orthologous gene sequence')
857
+ cogTree_parser.add_argument('-fun', required=True, help='interested functions')
858
+ cogTree_parser.add_argument('-cog', required=False, default=None, help='COG annotation results')
859
+ cogTree_parser.add_argument('-o', required=True, help='output directory')
860
+ cogTree_parser.add_argument('-bmge', required=False, action="store_true", help='trim with BMGE, default is trimal')
861
+ cogTree_parser.add_argument('-bmge_m', required=False, default='BLOSUM30', help='trim model, default: BLOSUM30')
862
+ cogTree_parser.add_argument('-bmge_esc', required=False, default='0.55', help='entropy score cutoff, default: 0.55')
863
+ cogTree_parser.add_argument('-iqtree_m', required=False, default='LG+G+I', help='iqtree_model, default: LG+G+I')
864
+ cogTree_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
865
+ cogTree_parser.add_argument('-t', required=False, type=int, default=1, help='num of threads, default: 1')
866
+ args = vars(parser.parse_args())
867
+ cogTree.cogTree(args)
868
+
869
+ elif sys.argv[1] == 'koTree':
870
+ from TreeSAK import koTree
871
+ koTree_parser = subparsers.add_parser('koTree', usage=koTree.koTree_usage)
872
+ koTree_parser.add_argument('-i', required=True, help='orthologous gene sequence')
873
+ koTree_parser.add_argument('-fun', required=True, help='interested functions')
874
+ koTree_parser.add_argument('-kegg', required=False, default=None, help='KEGG annotation results')
875
+ koTree_parser.add_argument('-o', required=True, help='output directory')
876
+ koTree_parser.add_argument('-bmge', required=False, action="store_true", help='trim with BMGE, default is trimal')
877
+ koTree_parser.add_argument('-bmge_m', required=False, default='BLOSUM30', help='trim model, default: BLOSUM30')
878
+ koTree_parser.add_argument('-bmge_esc', required=False, default='0.55', help='entropy score cutoff, default: 0.55')
879
+ koTree_parser.add_argument('-iqtree_m', required=False, default='LG+G+I', help='iqtree_model, default: LG+G+I')
880
+ koTree_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
881
+ koTree_parser.add_argument('-t', required=False, type=int, default=1, help='num of threads, default: 1')
882
+ args = vars(parser.parse_args())
883
+ koTree.koTree(args)
884
+
885
+ elif sys.argv[1] == 'iTOL_gene_tree':
886
+ from TreeSAK import iTOL_gene_tree
887
+ iTOL_gene_tree_parser = subparsers.add_parser('iTOL_gene_tree', usage=iTOL_gene_tree.iTOL_gene_tree_usage)
888
+ iTOL_gene_tree_parser.add_argument('-i', required=True, help='input metadata')
889
+ iTOL_gene_tree_parser.add_argument('-tree', required=False, default=None, help='gene id, in tree file')
890
+ iTOL_gene_tree_parser.add_argument('-txt', required=False, default=None, help='gene id, in txt file')
891
+ iTOL_gene_tree_parser.add_argument('-o', required=True, help='output metadata')
892
+ iTOL_gene_tree_parser.add_argument('-na', required=False, action='store_true', help='include leaves with na values')
893
+ args = vars(parser.parse_args())
894
+ iTOL_gene_tree.iTOL_gene_tree(args)
895
+
896
+ elif sys.argv[1] == 'GeneTree':
897
+ from TreeSAK import GeneTree
898
+ GeneTree_parser = subparsers.add_parser('GeneTree', usage=GeneTree.GeneTree_usage)
899
+ GeneTree_parser.add_argument('-i', required=False, default=None, help='sequence file')
900
+ GeneTree_parser.add_argument('-o', required=True, help='output dir')
901
+ GeneTree_parser.add_argument('-t', required=False, type=int, default=1, help='number of threads, default is 1')
902
+ GeneTree_parser.add_argument('-trimal', required=False, action="store_true", help='trim with trimal, default is BMGE')
903
+ GeneTree_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
904
+ GeneTree_parser.add_argument('-max_gap', required=False, default='40', help='maximum percentage of gap, default is 40')
905
+ args = vars(parser.parse_args())
906
+ GeneTree.GeneTree(args)
907
+
908
+ elif sys.argv[1] == 'parse_reltime':
909
+ from TreeSAK import parse_reltime
910
+ parse_reltime_parser = subparsers.add_parser('parse_reltime', usage=parse_reltime.parse_reltime_usage)
911
+ parse_reltime_parser.add_argument('-i', required=True, help='reltime output file')
912
+ parse_reltime_parser.add_argument('-n', required=True, help='interested node txt')
913
+ parse_reltime_parser.add_argument('-o', required=True, help='output txt file')
914
+ args = vars(parser.parse_args())
915
+ parse_reltime.parse_reltime(args)
916
+
917
+ elif sys.argv[1] == 'mcmctree_vs_reltime':
918
+ from TreeSAK import mcmctree_vs_reltime
919
+ mcmctree_vs_reltime_parser = subparsers.add_parser('mcmctree_vs_reltime', usage=mcmctree_vs_reltime.mcmctree_vs_reltime_usage)
920
+ mcmctree_vs_reltime_parser.add_argument('-m', required=True, help='.out file from MCMCTree')
921
+ mcmctree_vs_reltime_parser.add_argument('-r', required=True, help='output from elTime')
922
+ mcmctree_vs_reltime_parser.add_argument('-n', required=True, help='interested nodes txt file')
923
+ mcmctree_vs_reltime_parser.add_argument('-o', required=True, help='output pdf')
924
+ args = vars(parser.parse_args())
925
+ mcmctree_vs_reltime.mcmctree_vs_reltime(args)
926
+
927
+ elif sys.argv[1] == 'iTOL_msa_stats':
928
+ from TreeSAK import iTOL_msa_stats
929
+ iTOL_msa_stats_parser = subparsers.add_parser('iTOL_msa_stats', usage=iTOL_msa_stats.iTOL_msa_stats_usage)
930
+ iTOL_msa_stats_parser.add_argument('-i', required=True, help='MSA file')
931
+ args = vars(parser.parse_args())
932
+ iTOL_msa_stats.iTOL_msa_stats(args)
933
+
934
+ else:
935
+ print('Unrecognized module: %s, program exited!' % sys.argv[1])
936
+ exit()
937
+
938
+
939
+ upload_to_pypi_cmd = '''
940
+
941
+ cd /Users/songweizhi/PycharmProjects/TreeSAK
942
+ rm -r build dist TreeSAK.egg-info
943
+ python3 setup.py sdist bdist_wheel
944
+ twine upload dist/*
945
+
946
+ __token__
947
+
948
+ pip3 install --upgrade TreeSAK
949
+
950
+ '''