treesak 1.53.3__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.
Files changed (131) 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 +113 -0
  16. TreeSAK/BMGE.jar +0 -0
  17. TreeSAK/BMGE.py +49 -0
  18. TreeSAK/C60SR4.nex +127 -0
  19. TreeSAK/CompareMCMC.py +138 -0
  20. TreeSAK/ConcateMSA.py +111 -0
  21. TreeSAK/ConvertMSA.py +135 -0
  22. TreeSAK/Dir.rb +82 -0
  23. TreeSAK/ExtractMarkerSeq.py +263 -0
  24. TreeSAK/FastRoot.py +1175 -0
  25. TreeSAK/FastRoot_backup.py +1122 -0
  26. TreeSAK/FigTree.py +34 -0
  27. TreeSAK/GTDB_tree.py +76 -0
  28. TreeSAK/GeneTree.py +142 -0
  29. TreeSAK/KEGG_Luo17.py +807 -0
  30. TreeSAK/LcaToLeaves.py +66 -0
  31. TreeSAK/MarkerRef2Tree.py +616 -0
  32. TreeSAK/MarkerRef2Tree_backup.py +628 -0
  33. TreeSAK/MarkerSeq2Tree.py +299 -0
  34. TreeSAK/MarkerSeq2Tree_backup.py +259 -0
  35. TreeSAK/ModifyTopo.py +116 -0
  36. TreeSAK/Newick_tree_plotter.py +79 -0
  37. TreeSAK/OMA.py +170 -0
  38. TreeSAK/OMA2.py +212 -0
  39. TreeSAK/OneLineAln.py +50 -0
  40. TreeSAK/PB.py +155 -0
  41. TreeSAK/PMSF.py +115 -0
  42. TreeSAK/PhyloBiAssoc.R +84 -0
  43. TreeSAK/PhyloBiAssoc.py +167 -0
  44. TreeSAK/PlotMCMC.py +41 -0
  45. TreeSAK/PlotMcmcNode.py +152 -0
  46. TreeSAK/PlotMcmcNode_old.py +252 -0
  47. TreeSAK/RootTree.py +101 -0
  48. TreeSAK/RootTreeGTDB.py +371 -0
  49. TreeSAK/RootTreeGTDB214.py +288 -0
  50. TreeSAK/RootTreeGTDB220.py +300 -0
  51. TreeSAK/SequentialDating.py +16 -0
  52. TreeSAK/SingleAleHGT.py +157 -0
  53. TreeSAK/SingleLinePhy.py +50 -0
  54. TreeSAK/SliceMSA.py +142 -0
  55. TreeSAK/SplitScore.py +21 -0
  56. TreeSAK/SplitScore1.py +177 -0
  57. TreeSAK/SplitScore1OMA.py +148 -0
  58. TreeSAK/SplitScore2.py +608 -0
  59. TreeSAK/TaxaCountStats.R +256 -0
  60. TreeSAK/TaxonTree.py +47 -0
  61. TreeSAK/TreeSAK_config.py +32 -0
  62. TreeSAK/VERSION +164 -0
  63. TreeSAK/VisHPD95.R +45 -0
  64. TreeSAK/VisHPD95.py +200 -0
  65. TreeSAK/__init__.py +0 -0
  66. TreeSAK/ale_parser.py +74 -0
  67. TreeSAK/ale_splitter.py +63 -0
  68. TreeSAK/alignment_pruner.pl +1471 -0
  69. TreeSAK/assessOG.py +45 -0
  70. TreeSAK/batch_itol.py +171 -0
  71. TreeSAK/catfasta2phy.py +140 -0
  72. TreeSAK/cogTree.py +185 -0
  73. TreeSAK/compare_trees.R +30 -0
  74. TreeSAK/compare_trees.py +255 -0
  75. TreeSAK/dating.py +264 -0
  76. TreeSAK/dating_ss.py +361 -0
  77. TreeSAK/deltall.py +82 -0
  78. TreeSAK/do_rrtc.rb +464 -0
  79. TreeSAK/fa2phy.py +42 -0
  80. TreeSAK/filter_rename_ar53.py +118 -0
  81. TreeSAK/format_leaf_name.py +70 -0
  82. TreeSAK/gap_stats.py +38 -0
  83. TreeSAK/get_SCG_tree.py +742 -0
  84. TreeSAK/get_arCOG_seq.py +97 -0
  85. TreeSAK/global_functions.py +222 -0
  86. TreeSAK/gnm_leaves.py +43 -0
  87. TreeSAK/iTOL.py +791 -0
  88. TreeSAK/iTOL_gene_tree.py +80 -0
  89. TreeSAK/itol_msa_stats.py +56 -0
  90. TreeSAK/keep_highest_rrtc.py +37 -0
  91. TreeSAK/koTree.py +194 -0
  92. TreeSAK/label_gene_tree_by_gnm.py +34 -0
  93. TreeSAK/label_tree.R +75 -0
  94. TreeSAK/label_tree.py +121 -0
  95. TreeSAK/mad.py +708 -0
  96. TreeSAK/mcmc2tree.py +58 -0
  97. TreeSAK/mcmcTC copy.py +92 -0
  98. TreeSAK/mcmcTC.py +104 -0
  99. TreeSAK/mcmctree_vs_reltime.R +44 -0
  100. TreeSAK/mcmctree_vs_reltime.py +252 -0
  101. TreeSAK/merge_pdf.py +32 -0
  102. TreeSAK/pRTC.py +56 -0
  103. TreeSAK/parse_mcmctree.py +198 -0
  104. TreeSAK/parse_reltime.py +141 -0
  105. TreeSAK/phy2fa.py +37 -0
  106. TreeSAK/plot_distruibution_th.py +165 -0
  107. TreeSAK/prep_mcmctree_ctl.py +92 -0
  108. TreeSAK/print_leaves.py +32 -0
  109. TreeSAK/pruneMSA.py +63 -0
  110. TreeSAK/recode.py +73 -0
  111. TreeSAK/remove_bias.R +112 -0
  112. TreeSAK/rename_leaves.py +78 -0
  113. TreeSAK/replace_clade.py +55 -0
  114. TreeSAK/root_with_out_group.py +84 -0
  115. TreeSAK/run_TaxaCountStats_R_s1.py +455 -0
  116. TreeSAK/subsample_drep_gnms.py +74 -0
  117. TreeSAK/subset.py +69 -0
  118. TreeSAK/subset_tree_stupid_old_way.py +193 -0
  119. TreeSAK/supertree.py +330 -0
  120. TreeSAK/tmp_1.py +19 -0
  121. TreeSAK/tmp_2.py +19 -0
  122. TreeSAK/tmp_3.py +120 -0
  123. TreeSAK/tmp_4.py +43 -0
  124. TreeSAK/tmp_5.py +12 -0
  125. TreeSAK/weighted_rand.rb +23 -0
  126. treesak-1.53.3.data/scripts/TreeSAK +955 -0
  127. treesak-1.53.3.dist-info/LICENSE +674 -0
  128. treesak-1.53.3.dist-info/METADATA +27 -0
  129. treesak-1.53.3.dist-info/RECORD +131 -0
  130. treesak-1.53.3.dist-info/WHEEL +5 -0
  131. treesak-1.53.3.dist-info/top_level.txt +1 -0
@@ -0,0 +1,955 @@
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
+ filter_rename_ar53 -> Filter rename GTDB markers
45
+
46
+ Multiple Sequence Alignment
47
+ BMGE -> Run BMGE
48
+ pruneMSA -> Prune MSA with alignment_pruner.pl
49
+ recode -> Recode amino acids to Dayoff 4, Dayoff 6 or SR4 categories
50
+ fa2phy -> Convert MSA format (fasta to phylip)
51
+ phy2fa -> Convert MSA format (phylip to fasta)
52
+ SliceMSA -> Slice MSA by column
53
+ ConcateMSA -> Concatenate MSAs
54
+ ConvertMSA -> Convert MSA format
55
+ OneLineAln -> One-line fasta format alignments
56
+ SingleLinePhy -> Put sequences in single line in phylip format
57
+ CS_trim -> (to be added) perform chi-squared trimming to reduce compositional heterogeneity
58
+ gap_stats -> The percentage of gap in each sequence of a MSA
59
+
60
+ Tree-related
61
+ iTOL -> Prepare iTOL files
62
+ batch_itol -> Batch access iTOL
63
+ iTOL_gene_tree -> Genome metadata to gene metadata
64
+ iTOL_msa_stats -> iTOL_msa_stats
65
+ PB -> Infer tree with PhyloBayes-MPI
66
+ supertree -> Infer species tree from multiple gene trees
67
+ AssessPB -> Compare PhyloBayes chains
68
+ MarkerSeq2Tree -> Marker sequence to tree
69
+ MarkerRef2Tree -> Marker (reference sequence) to Tree
70
+ GTDB_tree -> Get GTDB tree
71
+ subset -> Subset tree
72
+ TaxonTree -> Subset GTDB tree by taxon
73
+ compare_trees -> Compare trees with Mantel test
74
+ rename_leaves -> Rename tree leaves
75
+ print_leaves -> print out tree leaves
76
+ FLN -> Format leaf names (e.g. remove spaces in names)
77
+ ModifyTopo -> Modify tree topology
78
+ GeneRax -> (to be added) Run GeneRax
79
+ ALE -> Modules for running ALE
80
+ cogTree -> Infer tree for individual COG function
81
+ koTree -> Infer tree for individual KEGG function
82
+ RootTree -> Root tree with outgroup leaves
83
+ RootTreeGTDB -> Root tree by GTDB taxonomy
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('-mdef', required=False, default=None, help='model definition NEXUS file')
381
+ PMSF_parser.add_argument('-o', required=True, help='output plot')
382
+ PMSF_parser.add_argument('-p', required=False, default='PMSF', help='tree prefix, default: PMSF')
383
+ PMSF_parser.add_argument('-topo', required=False, default=None, help='topological constraint tree, pass to -g, default is None')
384
+ PMSF_parser.add_argument('-t', required=False, type=int, default=1, help='num of threads')
385
+ PMSF_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
386
+ args = vars(parser.parse_args())
387
+ PMSF.PMSF(args)
388
+
389
+ elif sys.argv[1] == 'SingleLinePhy':
390
+ from TreeSAK import SingleLinePhy
391
+ SingleLinePhy_parser = subparsers.add_parser('SingleLinePhy', usage=SingleLinePhy.SingleLinePhy_usage)
392
+ SingleLinePhy_parser.add_argument('-i', required=True, help='input file')
393
+ SingleLinePhy_parser.add_argument('-o', required=True, help='output file')
394
+ args = vars(parser.parse_args())
395
+ SingleLinePhy.SingleLinePhy(args)
396
+
397
+ elif sys.argv[1] == 'SplitScore':
398
+ from TreeSAK import SplitScore
399
+ print(SplitScore.SplitScore_usage)
400
+ exit()
401
+
402
+ elif sys.argv[1] == 'SplitScore1OMA':
403
+ from TreeSAK import SplitScore1OMA
404
+ SplitScore1OMA_parser = subparsers.add_parser('SplitScore1OMA', usage=SplitScore1OMA.SplitScore1OMA_usage)
405
+ SplitScore1OMA_parser.add_argument('-i', required=True, help='OrthologousGroups.txt, produced by OMA')
406
+ SplitScore1OMA_parser.add_argument('-s', required=True, help='OrthologousGroupsFasta, produced by OMA')
407
+ SplitScore1OMA_parser.add_argument('-u', required=False, default= None, help='ID of interested genomes, no file extension')
408
+ SplitScore1OMA_parser.add_argument('-o', required=True, help='output directory')
409
+ SplitScore1OMA_parser.add_argument('-m', required=False, default='LG+G+I', help='iqtree_model, default: LG+G+I')
410
+ SplitScore1OMA_parser.add_argument('-c', required=False, type=int, default=80, help='coverage cutoff, default: 80')
411
+ SplitScore1OMA_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
412
+ SplitScore1OMA_parser.add_argument('-jst', required=False, type=int, default=3, help='num of threads for inferring gene tree, default: 3')
413
+ args = vars(parser.parse_args())
414
+ SplitScore1OMA.SplitScore1OMA(args)
415
+
416
+ elif sys.argv[1] == 'SplitScore1':
417
+ from TreeSAK import SplitScore1
418
+ SplitScore1_parser = subparsers.add_parser('SplitScore1', usage=SplitScore1.SplitScore1_usage)
419
+ SplitScore1_parser.add_argument('-i', required=True, help='orthologous gene sequence')
420
+ SplitScore1_parser.add_argument('-x', required=True, help='fasta file extension')
421
+ SplitScore1_parser.add_argument('-o', required=True, help='output directory')
422
+ SplitScore1_parser.add_argument('-u', required=False, default=None, help='interested genomes, no file extension')
423
+ SplitScore1_parser.add_argument('-m', required=False, default='LG+G+I', help='iqtree_model, default: LG+G+I')
424
+ SplitScore1_parser.add_argument('-c', required=False, type=int, default=75, help='coverage cutoff, default: 75')
425
+ SplitScore1_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
426
+ SplitScore1_parser.add_argument('-seq_named_by_gnm', required=False, action="store_true", help='specify if sequence named by genome id')
427
+ SplitScore1_parser.add_argument('-jst', required=False, type=int, default=1, help='num of threads for iqtree2, default: 1')
428
+ args = vars(parser.parse_args())
429
+ SplitScore1.SplitScore1(args)
430
+
431
+ elif sys.argv[1] == 'SplitScore2':
432
+ from TreeSAK import SplitScore2
433
+ SplitScore2_parser = subparsers.add_parser('SplitScore2', usage=SplitScore2.SplitScore2_usage)
434
+ SplitScore2_parser.add_argument('-i', required=True, help='outputs of iqtree from step 1, only needs the contree and ufboot files')
435
+ SplitScore2_parser.add_argument('-g', required=True, help='genome group')
436
+ SplitScore2_parser.add_argument('-k', required=True, help='genome taxon, GTDB format')
437
+ SplitScore2_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
438
+ SplitScore2_parser.add_argument('-t', required=False, type=int, default=1, help='num of threads, default: 1')
439
+ SplitScore2_parser.add_argument('-c', required=False, default='25,50,75', help='marker ranking cutoffs, default: 25,50,75')
440
+ SplitScore2_parser.add_argument('-seq_named_by_gnm', required=False, action="store_true", help='named_by_gnm, specify if sequence named by gnm')
441
+ SplitScore2_parser.add_argument('-o', required=True, help='output directory')
442
+ args = vars(parser.parse_args())
443
+ SplitScore2.SplitScore2(args)
444
+
445
+ elif sys.argv[1] == 'MarkerSeq2Tree':
446
+ from TreeSAK import MarkerSeq2Tree
447
+ MarkerSeq2Tree_parser = subparsers.add_parser('MarkerSeq2Tree', usage=MarkerSeq2Tree.MarkerSeq2Tree_usage)
448
+ MarkerSeq2Tree_parser.add_argument('-i', required=True, help='marker seq dir')
449
+ MarkerSeq2Tree_parser.add_argument('-x', required=True, help='marker seq ext')
450
+ MarkerSeq2Tree_parser.add_argument('-o', required=True, help='output dir')
451
+ MarkerSeq2Tree_parser.add_argument('-t', required=False, type=int, default=1, help='num of threads')
452
+ MarkerSeq2Tree_parser.add_argument('-bmge', required=False, action="store_true", help='perform BMGE trimming on concatenated MSA')
453
+ MarkerSeq2Tree_parser.add_argument('-bmge_m', required=False, default='BLOSUM30', help='BMGE trim model, default: BLOSUM30')
454
+ MarkerSeq2Tree_parser.add_argument('-bmge_esc', required=False, default='0.55', help='BMGE entropy score cutoff, default: 0.55')
455
+ MarkerSeq2Tree_parser.add_argument('-prune', required=False, default=None, help='conservation cutoffs for alignment_pruner.pl')
456
+ MarkerSeq2Tree_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
457
+ args = vars(parser.parse_args())
458
+ MarkerSeq2Tree.MarkerSeq2Tree(args)
459
+
460
+ elif sys.argv[1] == 'GTDB_tree':
461
+ from TreeSAK import GTDB_tree
462
+ GTDB_tree_parser = subparsers.add_parser('GTDB_tree', usage=GTDB_tree.GTDB_tree_usage)
463
+ GTDB_tree_parser.add_argument('-p', required=True, help='output prefix')
464
+ GTDB_tree_parser.add_argument('-i', required=True, help='genome folder')
465
+ GTDB_tree_parser.add_argument('-x', required=True, help='genome file extension')
466
+ GTDB_tree_parser.add_argument('-t', required=False, type=int, default=1, help='number of threads')
467
+ args = vars(parser.parse_args())
468
+ GTDB_tree.GTDB_tree(args)
469
+
470
+ elif sys.argv[1] == 'ExtractMarkerSeq':
471
+ from TreeSAK import ExtractMarkerSeq
472
+ ExtractMarkerSeq_parser = subparsers.add_parser('ExtractMarkerSeq', usage=ExtractMarkerSeq.ExtractMarkerSeq_usage)
473
+ ExtractMarkerSeq_parser.add_argument('-m', required=True, help='marker seq dir')
474
+ ExtractMarkerSeq_parser.add_argument('-mx', required=True, help='marker seq ext')
475
+ ExtractMarkerSeq_parser.add_argument('-aa', required=True, help='faa file dir')
476
+ ExtractMarkerSeq_parser.add_argument('-aax', required=True, help='faa file ext')
477
+ ExtractMarkerSeq_parser.add_argument('-o', required=True, help='output dir')
478
+ ExtractMarkerSeq_parser.add_argument('-e', required=True, default=1e-30, help='e-value cutoff, default: 1e-30')
479
+ ExtractMarkerSeq_parser.add_argument('-t', required=True, type=int, help='num of threads')
480
+ ExtractMarkerSeq_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
481
+ args = vars(parser.parse_args())
482
+ ExtractMarkerSeq.ExtractMarkerSeq(args)
483
+
484
+ elif sys.argv[1] == 'OMA':
485
+ from TreeSAK import OMA
486
+ OMA_parser = subparsers.add_parser('OMA', usage=OMA.OMA_usage)
487
+ OMA_parser.add_argument('-i', required=True, help='genome folder')
488
+ OMA_parser.add_argument('-x', required=True, help='genome file extension')
489
+ OMA_parser.add_argument('-st', required=False, default='AA', help='sequence type, AA or DNA, default: AA')
490
+ OMA_parser.add_argument('-og', required=True, help='id of outgroup genomes, without file extension')
491
+ OMA_parser.add_argument('-o', required=True, default=None, help='output dir, i.e., OMA working directory')
492
+ OMA_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
493
+ OMA_parser.add_argument('-t', required=False, type=int, default=6, help='number of threads for running OMA, default: 6')
494
+ args = vars(parser.parse_args())
495
+ OMA.OMA(args)
496
+
497
+ elif sys.argv[1] == 'OMA2':
498
+ from TreeSAK import OMA2
499
+ OMA2_parser = subparsers.add_parser('OMA2', usage=OMA2.OMA2_usage)
500
+ OMA2_parser.add_argument('-i', required=True, help='OrthologousGroups.txt')
501
+ OMA2_parser.add_argument('-s', required=True, help='sequence dir, OrthologousGroupsFasta')
502
+ OMA2_parser.add_argument('-g', required=False, default=None, help='interested genomes')
503
+ OMA2_parser.add_argument('-o', required=True, default=None, help='output directory')
504
+ OMA2_parser.add_argument('-n', required=False, default=None, help='minimal number of gene in a OG, not compatible with -c')
505
+ OMA2_parser.add_argument('-c', required=False, default=None, help='minimal genome coverage cutoff, not compatible with -n')
506
+ OMA2_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
507
+ args = vars(parser.parse_args())
508
+ OMA2.OMA2(args)
509
+
510
+ elif sys.argv[1] in ['ALE', 'ale', 'Ale']:
511
+ from TreeSAK import ALE
512
+ print(ALE.ALE_usage)
513
+ exit()
514
+
515
+ elif sys.argv[1] == 'ALE1':
516
+ from TreeSAK import ALE1
517
+ ALE1_parser = subparsers.add_parser('ALE1', usage=ALE1.ALE1_usage)
518
+ ALE1_parser.add_argument('-i', required=False, default=None, help='orthologous groups, either from orthofinder or oma')
519
+ ALE1_parser.add_argument('-s', required=False, default=None, help='sequence file, e.g., combined.faa')
520
+ ALE1_parser.add_argument('-ms', required=False, default=None, help='input is a folder holds the sequence of each marker')
521
+ ALE1_parser.add_argument('-msx', required=False, default='fa', help='file extension of marker sequence file, default: fa')
522
+ ALE1_parser.add_argument('-p', required=True, help='orthologous identification program, orthofinder or oma')
523
+ ALE1_parser.add_argument('-m', required=False, type=int, default=50, help='min_og_genome_num, default: 50')
524
+ ALE1_parser.add_argument('-bmge', required=False, action="store_true", help='trim MSA with BMGE, default no trimming')
525
+ ALE1_parser.add_argument('-bmge_m', required=False, default='BLOSUM30', help='BMGE trim model, default: BLOSUM30')
526
+ ALE1_parser.add_argument('-bmge_esc', required=False, default='0.55', help='BMGE entropy score cutoff, default: 0.55')
527
+ ALE1_parser.add_argument('-o', required=True, help='output dir, i.e., OMA working directory')
528
+ ALE1_parser.add_argument('-jst', required=False, type=int, default=3, help='number of threads specified in job script, default: 3')
529
+ ALE1_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
530
+ args = vars(parser.parse_args())
531
+ ALE1.ALE1(args)
532
+
533
+ elif sys.argv[1] == 'ALE2':
534
+ from TreeSAK import ALE2
535
+ ALE2_parser = subparsers.add_parser('ALE2', usage=ALE2.ALE2_usage)
536
+ ALE2_parser.add_argument('-1', required=True, help='ALE1 output directory')
537
+ ALE2_parser.add_argument('-s', required=True, help='rooted species tree')
538
+ ALE2_parser.add_argument('-o', required=True, help='output dir, i.e., OMA working directory')
539
+ ALE2_parser.add_argument('-runALE', required=False, action="store_true", help='run ALE')
540
+ ALE2_parser.add_argument('-docker', required=False, default=None, help='Docker image, if ALE was installed with Docker, e.g., gregmich/alesuite_new')
541
+ ALE2_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
542
+ ALE2_parser.add_argument('-t', required=False, type=int, default=6, help='number of threads, default: 6')
543
+ args = vars(parser.parse_args())
544
+ ALE2.ALE2(args)
545
+
546
+ elif sys.argv[1] == 'ALE3':
547
+ from TreeSAK import ALE3
548
+ ALE3_parser = subparsers.add_parser('ALE3', usage=ALE3.ALE3_usage)
549
+ ALE3_parser.add_argument('-2', required=True, help='Folder with uml_rec files')
550
+ ALE3_parser.add_argument('-c', required=False, type=float, default=75, help='gene family presence cutoff in percentage, default: 75')
551
+ ALE3_parser.add_argument('-a', required=False, default=None, help='OG functional description')
552
+ ALE3_parser.add_argument('-o', required=True, help='output dir')
553
+ ALE3_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
554
+ args = vars(parser.parse_args())
555
+ ALE3.ALE3(args)
556
+
557
+ elif sys.argv[1] == 'ALE4':
558
+ from TreeSAK import ALE4
559
+ ALE4_parser = subparsers.add_parser('ALE4', usage=ALE4.ALE4_usage)
560
+ ALE4_parser.add_argument('-1', required=True, help='ALE1 output directory')
561
+ ALE4_parser.add_argument('-2', required=True, help='ALE2 output directory')
562
+ ALE4_parser.add_argument('-c', required=True, help='genome_taxon, GTDB format')
563
+ ALE4_parser.add_argument('-color', required=True, help='phylum color code')
564
+ ALE4_parser.add_argument('-o', required=True, help='output dir, i.e., ALE4_op_dir')
565
+ ALE4_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
566
+ ALE4_parser.add_argument('-api', required=True, help='iTOL API key')
567
+ ALE4_parser.add_argument('-fc', required=False, type=float, default=0.5, help='hgt_freq_cutoff, default: 0.5')
568
+ ALE4_parser.add_argument('-mld', required=False, type=int, default=5, help='donor_node_min_leaf_num, default: 5')
569
+ ALE4_parser.add_argument('-mlr', required=False, type=int, default=5, help='recipient_node_min_leaf_num, default: 5')
570
+ ALE4_parser.add_argument('-itol', required=False, default='batch_access_tmp', help='iTOL project_name, default: batch_access_tmp')
571
+ args = vars(parser.parse_args())
572
+ ALE4.ALE4(args)
573
+
574
+ elif sys.argv[1] == 'ALE6':
575
+ from TreeSAK import ALE6
576
+ ALE6_parser = subparsers.add_parser('ALE6', usage=ALE6.ALE6_usage)
577
+ ALE6_parser.add_argument('-1', required=True, help='ALE1 output directory')
578
+ ALE6_parser.add_argument('-3', required=True, help='ALE3 output directory')
579
+ ALE6_parser.add_argument('-s', required=True, help='rooted species tree')
580
+ ALE6_parser.add_argument('-n', required=False, default=None, help='interested internal node(s)')
581
+ ALE6_parser.add_argument('-cog', required=False, default=None, help='COG annotation results')
582
+ ALE6_parser.add_argument('-kegg', required=False, default=None, help='KEGG annotation results')
583
+ ALE6_parser.add_argument('-o', required=True, help='output directory')
584
+ ALE6_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
585
+ args = vars(parser.parse_args())
586
+ ALE6.ALE6(args)
587
+
588
+ elif sys.argv[1] == 'ALE7':
589
+ from TreeSAK import ALE7
590
+ ALE7_parser = subparsers.add_parser('ALE7', usage=ALE7.ALE7_usage)
591
+ ALE7_parser.add_argument('-6', required=True, help='ALE6 output directory')
592
+ ALE7_parser.add_argument('-fun', required=True, help='interested functions')
593
+ ALE7_parser.add_argument('-node', required=True, help='interested internal nodes')
594
+ ALE7_parser.add_argument('-o', required=True, help='output directory')
595
+ args = vars(parser.parse_args())
596
+ ALE7.ALE7(args)
597
+
598
+ elif sys.argv[1] == 'RootTree':
599
+ from TreeSAK import RootTree
600
+ RootTree_parser = subparsers.add_parser('RootTree', usage=RootTree.RootTree_usage)
601
+ RootTree_parser.add_argument('-i', required=True, help='input tree')
602
+ RootTree_parser.add_argument('-og', required=True, help='out group leaves')
603
+ RootTree_parser.add_argument('-o', required=True, help='output tree')
604
+ RootTree_parser.add_argument('-add_root', required=False, action='store_true', help='add the root branch')
605
+ RootTree_parser.add_argument('-fmt', required=False, default=1, type=int, help='tree format, default: 1')
606
+ args = vars(parser.parse_args())
607
+ RootTree.RootTree(args)
608
+
609
+ elif sys.argv[1] == 'BMGE':
610
+ from TreeSAK import BMGE
611
+ BMGE_parser = subparsers.add_parser('BMGE', usage=BMGE.BMGE_usage)
612
+ BMGE_parser.add_argument('-p', required=True, help='output prefix')
613
+ BMGE_parser.add_argument('-i', required=True, help='input MSA')
614
+ BMGE_parser.add_argument('-m', required=False, default='BLOSUM30', help='trim model, default: BLOSUM30')
615
+ BMGE_parser.add_argument('-esc', required=False, default='0.55', help='entropy score cutoff, default: 0.55')
616
+ args = vars(parser.parse_args())
617
+ BMGE.BMGE(args)
618
+
619
+ elif sys.argv[1] == 'pRTC':
620
+ from TreeSAK import pRTC
621
+ pRTC_parser = subparsers.add_parser('pRTC', usage=pRTC.pRTC_usage)
622
+ pRTC_parser.add_argument('-i', required=True, help='the file "out" generated by MCMCTree')
623
+ pRTC_parser.add_argument('-m', required=True, help='the file "mcmc.txt" generated by MCMCTree')
624
+ pRTC_parser.add_argument('-r', required=True, help='the folder that contains RTCs')
625
+ pRTC_parser.add_argument('-o', required=True, help='output txt file')
626
+ pRTC_parser.add_argument('-ruby', required=False, default='ruby', help='path to ruby executable file, default: ruby')
627
+ args = vars(parser.parse_args())
628
+ pRTC.pRTC(args)
629
+
630
+ elif sys.argv[1] == 'ConcateMSA':
631
+ from TreeSAK import ConcateMSA
632
+ ConcateMSA_parser = subparsers.add_parser('ConcateMSA', usage=ConcateMSA.ConcateMSA_usage)
633
+ ConcateMSA_parser.add_argument('-i', required=True, help='input MSA folder')
634
+ ConcateMSA_parser.add_argument('-x', required=True, help='input file extension')
635
+ ConcateMSA_parser.add_argument('-p', required=True, help='output prefix')
636
+ ConcateMSA_parser.add_argument('-gene2gnm', required=False, action="store_true", help='gene id to gnm id, split sequence id before the last _')
637
+ args = vars(parser.parse_args())
638
+ ConcateMSA.ConcateMSA(args)
639
+
640
+ elif sys.argv[1] == 'SingleAleHGT':
641
+ from TreeSAK import SingleAleHGT
642
+ SingleAleHGT_parser = subparsers.add_parser('SingleAleHGT', usage=SingleAleHGT.SingleAleHGT_usage)
643
+ SingleAleHGT_parser.add_argument('-faa', required=False, default=None, help='input aa file, e.g., OMA0001.faa')
644
+ SingleAleHGT_parser.add_argument('-msa', required=False, default=None, help='input MSA file, e.g., OMA0001.aln')
645
+ SingleAleHGT_parser.add_argument('-o', required=True, help='output dir, e.g., SingleAleHGT_wd')
646
+ SingleAleHGT_parser.add_argument('-s', required=True, help='rooted species tree')
647
+ SingleAleHGT_parser.add_argument('-c', required=True, help='genome_taxon, GTDB format')
648
+ SingleAleHGT_parser.add_argument('-color', required=True, help='phylum color code')
649
+ SingleAleHGT_parser.add_argument('-fc', required=False, type=float, default=0.5, help='hgt_freq_cutoff, default: 0.5')
650
+ SingleAleHGT_parser.add_argument('-mld', required=False, type=int, default=5, help='donor_node_min_leaf_num, default: 5')
651
+ SingleAleHGT_parser.add_argument('-mlr', required=False, type=int, default=5, help='recipient_node_min_leaf_num, default: 5')
652
+ SingleAleHGT_parser.add_argument('-trim', required=False, action="store_true", help='trim MSA')
653
+ SingleAleHGT_parser.add_argument('-docker', required=False, default=None, help='Docker image, if ALE was installed with Docker, e.g., gregmich/alesuite_new')
654
+ SingleAleHGT_parser.add_argument('-itol', required=False, default='batch_access_tmp', help='iTOL project_name, default: batch_access_tmp')
655
+ SingleAleHGT_parser.add_argument('-api', required=True, help='iTOL API key')
656
+ SingleAleHGT_parser.add_argument('-t', required=False, type=int, default=6, help='number of threads, default: 6')
657
+ SingleAleHGT_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
658
+ args = vars(parser.parse_args())
659
+ SingleAleHGT.SingleAleHGT(args)
660
+
661
+ elif sys.argv[1] == 'LcaToLeaves':
662
+ from TreeSAK import LcaToLeaves
663
+ LcaToLeaves_parser = subparsers.add_parser('LcaToLeaves', usage=LcaToLeaves.LcaToLeaves_usage)
664
+ LcaToLeaves_parser.add_argument('-s', required=True, help='the .stree file from ALE')
665
+ LcaToLeaves_parser.add_argument('-n', required=True, help='internal node(s)')
666
+ args = vars(parser.parse_args())
667
+ LcaToLeaves.LcaToLeaves(args)
668
+
669
+ elif sys.argv[1] == 'PhyloBiAssoc':
670
+ from TreeSAK import PhyloBiAssoc
671
+ PhyloBiAssoc_parser = subparsers.add_parser('PhyloBiAssoc', usage=PhyloBiAssoc.PhyloBiAssoc_usage)
672
+ PhyloBiAssoc_parser.add_argument('-i', required=True, help='tree file')
673
+ PhyloBiAssoc_parser.add_argument('-d', required=True, help='data file')
674
+ PhyloBiAssoc_parser.add_argument('-o', required=True, help='output directory')
675
+ PhyloBiAssoc_parser.add_argument('-t', required=False, type=int, default=1, help='number of threads, default: 1')
676
+ PhyloBiAssoc_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
677
+ args = vars(parser.parse_args())
678
+ PhyloBiAssoc.PhyloBiAssoc(args)
679
+
680
+ elif sys.argv[1] == 'replace_clade':
681
+ from TreeSAK import replace_clade
682
+ replace_clade_parser = subparsers.add_parser('replace_clade', usage=replace_clade.replace_clade_usage)
683
+ replace_clade_parser.add_argument('-m', required=True, help='main tree file')
684
+ replace_clade_parser.add_argument('-s', required=True, help='subtree file')
685
+ replace_clade_parser.add_argument('-l', required=True, help='leaves on main tree to be replaced')
686
+ replace_clade_parser.add_argument('-o', required=True, help='output tree')
687
+ replace_clade_parser.add_argument('-of', required=False, default=9, type=int, help='output tree format, default is 9')
688
+ args = vars(parser.parse_args())
689
+ replace_clade.replace_clade(args)
690
+
691
+ elif sys.argv[1] == 'RootTreeGTDB':
692
+ from TreeSAK import RootTreeGTDB
693
+ RootTreeGTDB_parser = subparsers.add_parser('RootTreeGTDB', usage=RootTreeGTDB.RootTreeGTDB_usage)
694
+ RootTreeGTDB_parser.add_argument('-tree', required=True, help='input unrooted tree file or folder')
695
+ RootTreeGTDB_parser.add_argument('-x', required=False, default='treefile', help='tree file extension, default is: treefile')
696
+ RootTreeGTDB_parser.add_argument('-tax', required=False, default='fna', help='leaf taxon')
697
+ RootTreeGTDB_parser.add_argument('-db', required=True, help='GTDB database files')
698
+ RootTreeGTDB_parser.add_argument('-d', required=False, default=None, help='domain, either ar or bac')
699
+ RootTreeGTDB_parser.add_argument('-add_root', required=False, action='store_true', help='add the root branch')
700
+ RootTreeGTDB_parser.add_argument('-o', required=True, help='output folder')
701
+ RootTreeGTDB_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
702
+ RootTreeGTDB_parser.add_argument('-r', required=True, help='GTDB release, e.g., r220, r226')
703
+ args = vars(parser.parse_args())
704
+ RootTreeGTDB.RootTreeGTDB(args)
705
+
706
+ elif sys.argv[1] in ['PB', 'Pb', 'pb']:
707
+ from TreeSAK import PB
708
+ PB_parser = subparsers.add_parser('PB', usage=PB.PB_usage)
709
+ PB_parser.add_argument('-i', required=True, help='input MSA file')
710
+ PB_parser.add_argument('-o', required=True, help='output directory')
711
+ PB_parser.add_argument('-p', required=True, help='output prefix')
712
+ PB_parser.add_argument('-fa2plp', required=False, action="store_true", help='convert MSA format from fasta to phylip')
713
+ PB_parser.add_argument('-n', required=False, type=int, default=4, help='number of chains to run in parallel, default: 4')
714
+ PB_parser.add_argument('-t', required=False, type=int, default=12, help='num of cores, default: 12')
715
+ PB_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
716
+ args = vars(parser.parse_args())
717
+ PB.PB(args)
718
+
719
+ elif sys.argv[1] == 'AssessPB':
720
+ from TreeSAK import AssessPB
721
+ AssessPB_parser = subparsers.add_parser('AssessPB', usage=AssessPB.AssessPB_usage)
722
+ AssessPB_parser.add_argument('-c', required=False, default=None, help='a txt file contain all the chains')
723
+ AssessPB_parser.add_argument('-bi', required=False, default=1000, help='burn-in, default: 1000')
724
+ AssessPB_parser.add_argument('-si', required=False, default=10, help='sample interval, default: 10')
725
+ AssessPB_parser.add_argument('-o', required=True, default=None, help='output directory')
726
+ AssessPB_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
727
+ args = vars(parser.parse_args())
728
+ AssessPB.AssessPB(args)
729
+
730
+ elif sys.argv[1] == 'gap_stats':
731
+ from TreeSAK import gap_stats
732
+ gap_stats_parser = subparsers.add_parser('gap_stats', usage=gap_stats.gap_stats_usage)
733
+ gap_stats_parser.add_argument('-i', required=True, help='MSA in fasta format')
734
+ args = vars(parser.parse_args())
735
+ gap_stats.gap_stats(args)
736
+
737
+ elif sys.argv[1] == 'recode':
738
+ from TreeSAK import recode
739
+ recode_parser = subparsers.add_parser('recode', usage=recode.recode_usage)
740
+ recode_parser.add_argument('-i', required=True, help='input file')
741
+ recode_parser.add_argument('-m', required=True, help='recoding scheme, choose from d4, d6 or s4')
742
+ recode_parser.add_argument('-o', required=True, help='output file')
743
+ args = vars(parser.parse_args())
744
+ recode.recode(args)
745
+
746
+ elif sys.argv[1] == 'pruneMSA':
747
+ from TreeSAK import pruneMSA
748
+ pruneMSA_parser = subparsers.add_parser('pruneMSA', usage=pruneMSA.pruneMSA_usage)
749
+ pruneMSA_parser.add_argument('-i', required=True, help='input MSA file')
750
+ pruneMSA_parser.add_argument('-c', required=True, help='conservation cutoffs, comma separated')
751
+ args = vars(parser.parse_args())
752
+ pruneMSA.pruneMSA(args)
753
+
754
+ elif sys.argv[1] == 'iTOL':
755
+ from TreeSAK import iTOL
756
+ iTOL_parser = subparsers.add_parser('iTOL', description='Decorate tree with iTOL', usage=iTOL.iTOL_usage)
757
+ iTOL_parser.add_argument('-Labels', required=False, action='store_true', help='Labels')
758
+ iTOL_parser.add_argument('-ColoredLabel', required=False, action='store_true', help='ColoredLabel')
759
+ iTOL_parser.add_argument('-MultiStyleLabel', required=False, action='store_true', help='MultiStyleLabel')
760
+ iTOL_parser.add_argument('-ColorStrip', required=False, action='store_true', help='ColorStrip')
761
+ iTOL_parser.add_argument('-ColorRange', required=False, action='store_true', help='ColorRange')
762
+ iTOL_parser.add_argument('-ColorClade', required=False, action='store_true', help='ColorClade')
763
+ iTOL_parser.add_argument('-ColorLabel', required=False, action='store_true', help='ColorLabel')
764
+ iTOL_parser.add_argument('-SimpleBar', required=False, action='store_true', help='SimpleBar')
765
+ iTOL_parser.add_argument('-Heatmap', required=False, action='store_true', help='Heatmap')
766
+ iTOL_parser.add_argument('-ExternalShape', required=False, action='store_true', help='ExternalShape')
767
+ iTOL_parser.add_argument('-Binary', required=False, action='store_true', help='Binary')
768
+ iTOL_parser.add_argument('-BinaryID', required=False, action='store_true', help='Binary specified IDs as 1')
769
+ 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')
770
+ iTOL_parser.add_argument('-BinaryColor', required=False, default='red', help='Binary Color, default is red')
771
+ iTOL_parser.add_argument('-Connection', required=False, action='store_true', help='Connection')
772
+ iTOL_parser.add_argument('-PieChart', required=False, action='store_true', help='PieChart')
773
+ iTOL_parser.add_argument('-Collapse', required=False, action='store_true', help='Collapse')
774
+ iTOL_parser.add_argument('-id', required=False, default=None, help='File contains leaf id')
775
+ iTOL_parser.add_argument('-ll', required=False, default=None, help='Leaf Label')
776
+ iTOL_parser.add_argument('-gc', required=False, default=None, help='Specify Group/column Color (optional)')
777
+ iTOL_parser.add_argument('-cc', required=False, default=None, help='Specify Column Color (for ExternalShape format) (optional)')
778
+ iTOL_parser.add_argument('-lg', required=False, default=None, help='Leaf to Group')
779
+ iTOL_parser.add_argument('-lv', required=False, default=None, help='Leaf to Value')
780
+ iTOL_parser.add_argument('-lm', required=False, default=None, help='Leaf to data Matrix')
781
+ iTOL_parser.add_argument('-dr', required=False, default=None, help='Donor to Recipient')
782
+ iTOL_parser.add_argument('-scale', required=False, default=None, help='Scale Values, in format 0-3-6-9')
783
+ iTOL_parser.add_argument('-lt', required=False, default=None, help='Legend Title')
784
+ iTOL_parser.add_argument('-legend', required=False, action='store_true', help='show legend for ColorStrip')
785
+ iTOL_parser.add_argument('-show_strip_labels', required=False, action='store_true', help='SHOW_STRIP_LABELS')
786
+ iTOL_parser.add_argument('-o', required=True, help='Output filename')
787
+ args = vars(parser.parse_args())
788
+ iTOL.iTOL(args)
789
+
790
+ elif sys.argv[1] == 'supertree':
791
+ from TreeSAK import supertree
792
+ supertree_parser = subparsers.add_parser('supertree', usage=supertree.supertree_usage)
793
+ supertree_parser.add_argument('-i', required=True, help='orthologous gene sequence')
794
+ supertree_parser.add_argument('-x', required=True, help='faa file extension')
795
+ supertree_parser.add_argument('-o', required=True, help='output directory')
796
+ supertree_parser.add_argument('-bmge', required=False, action="store_true", help='trim with BMGE, default is trimal')
797
+ supertree_parser.add_argument('-bmge_m', required=False, default='BLOSUM30', help='trim model, default: BLOSUM30')
798
+ supertree_parser.add_argument('-bmge_esc', required=False, default='0.55', help='entropy score cutoff, default: 0.55')
799
+ supertree_parser.add_argument('-iqtree_m', required=False, default='LG+G+I', help='iqtree_model, default: LG+G+I')
800
+ supertree_parser.add_argument('-pb', required=False, action="store_true", help='infer tree with PhyloBayes-MPI, default is iqtree')
801
+ supertree_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
802
+ supertree_parser.add_argument('-t', required=False, type=int, default=1, help='num of threads, default: 1')
803
+ args = vars(parser.parse_args())
804
+ supertree.supertree(args)
805
+
806
+ elif sys.argv[1] == 'TaxonTree':
807
+ from TreeSAK import TaxonTree
808
+ TaxonTree_parser = subparsers.add_parser('TaxonTree', usage=TaxonTree.TaxonTree_usage)
809
+ TaxonTree_parser.add_argument('-i', required=True, help='input tree file')
810
+ TaxonTree_parser.add_argument('-tax', required=True, help='interested taxon')
811
+ TaxonTree_parser.add_argument('-o', required=True, help='output tree file')
812
+ args = vars(parser.parse_args())
813
+ TaxonTree.TaxonTree(args)
814
+
815
+ elif sys.argv[1] == 'mcmcTC':
816
+ from TreeSAK import mcmcTC
817
+ mcmcTC_parser = subparsers.add_parser('mcmcTC', usage=mcmcTC.mcmcTC_usage)
818
+ mcmcTC_parser.add_argument('-i', required=True, help='input tree')
819
+ mcmcTC_parser.add_argument('-o', required=True, help='output tree')
820
+ mcmcTC_parser.add_argument('-tc', required=True, help='time constraint file')
821
+ args = vars(parser.parse_args())
822
+ mcmcTC.mcmcTC(args)
823
+
824
+ elif sys.argv[1] == 'mcmc2tree':
825
+ from TreeSAK import mcmc2tree
826
+ mcmc2tree_parser = subparsers.add_parser('mcmc2tree', usage=mcmc2tree.mcmc2tree_usage)
827
+ mcmc2tree_parser.add_argument('-i', required=True, help='the .out file from mcmctree')
828
+ mcmc2tree_parser.add_argument('-o', required=True, help='output tree file')
829
+ args = vars(parser.parse_args())
830
+ mcmc2tree.mcmc2tree(args)
831
+
832
+ elif sys.argv[1] == 'cogTree':
833
+ from TreeSAK import cogTree
834
+ cogTree_parser = subparsers.add_parser('cogTree', usage=cogTree.cogTree_usage)
835
+ cogTree_parser.add_argument('-i', required=True, help='orthologous gene sequence')
836
+ cogTree_parser.add_argument('-fun', required=True, help='interested functions')
837
+ cogTree_parser.add_argument('-cog', required=False, default=None, help='COG annotation results')
838
+ cogTree_parser.add_argument('-o', required=True, help='output directory')
839
+ cogTree_parser.add_argument('-bmge', required=False, action="store_true", help='trim with BMGE, default is trimal')
840
+ cogTree_parser.add_argument('-bmge_m', required=False, default='BLOSUM30', help='trim model, default: BLOSUM30')
841
+ cogTree_parser.add_argument('-bmge_esc', required=False, default='0.55', help='entropy score cutoff, default: 0.55')
842
+ cogTree_parser.add_argument('-iqtree_m', required=False, default='LG+G+I', help='iqtree_model, default: LG+G+I')
843
+ cogTree_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
844
+ cogTree_parser.add_argument('-t', required=False, type=int, default=1, help='num of threads, default: 1')
845
+ args = vars(parser.parse_args())
846
+ cogTree.cogTree(args)
847
+
848
+ elif sys.argv[1] == 'koTree':
849
+ from TreeSAK import koTree
850
+ koTree_parser = subparsers.add_parser('koTree', usage=koTree.koTree_usage)
851
+ koTree_parser.add_argument('-i', required=True, help='orthologous gene sequence')
852
+ koTree_parser.add_argument('-fun', required=True, help='interested functions')
853
+ koTree_parser.add_argument('-kegg', required=False, default=None, help='KEGG annotation results')
854
+ koTree_parser.add_argument('-o', required=True, help='output directory')
855
+ koTree_parser.add_argument('-bmge', required=False, action="store_true", help='trim with BMGE, default is trimal')
856
+ koTree_parser.add_argument('-bmge_m', required=False, default='BLOSUM30', help='trim model, default: BLOSUM30')
857
+ koTree_parser.add_argument('-bmge_esc', required=False, default='0.55', help='entropy score cutoff, default: 0.55')
858
+ koTree_parser.add_argument('-iqtree_m', required=False, default='LG+G+I', help='iqtree_model, default: LG+G+I')
859
+ koTree_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
860
+ koTree_parser.add_argument('-t', required=False, type=int, default=1, help='num of threads, default: 1')
861
+ args = vars(parser.parse_args())
862
+ koTree.koTree(args)
863
+
864
+ elif sys.argv[1] == 'iTOL_gene_tree':
865
+ from TreeSAK import iTOL_gene_tree
866
+ iTOL_gene_tree_parser = subparsers.add_parser('iTOL_gene_tree', usage=iTOL_gene_tree.iTOL_gene_tree_usage)
867
+ iTOL_gene_tree_parser.add_argument('-i', required=True, help='input metadata')
868
+ iTOL_gene_tree_parser.add_argument('-tree', required=False, default=None, help='gene id, in tree file')
869
+ iTOL_gene_tree_parser.add_argument('-txt', required=False, default=None, help='gene id, in txt file')
870
+ iTOL_gene_tree_parser.add_argument('-o', required=True, help='output metadata')
871
+ iTOL_gene_tree_parser.add_argument('-na', required=False, action='store_true', help='include leaves with na values')
872
+ args = vars(parser.parse_args())
873
+ iTOL_gene_tree.iTOL_gene_tree(args)
874
+
875
+ elif sys.argv[1] == 'GeneTree':
876
+ from TreeSAK import GeneTree
877
+ GeneTree_parser = subparsers.add_parser('GeneTree', usage=GeneTree.GeneTree_usage)
878
+ GeneTree_parser.add_argument('-i', required=False, default=None, help='sequence file')
879
+ GeneTree_parser.add_argument('-o', required=True, help='output dir')
880
+ GeneTree_parser.add_argument('-t', required=False, type=int, default=1, help='number of threads, default is 1')
881
+ GeneTree_parser.add_argument('-trimal', required=False, action="store_true", help='trim with trimal, default is BMGE')
882
+ GeneTree_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
883
+ GeneTree_parser.add_argument('-max_gap', required=False, default='40', help='maximum percentage of gap, default is 40')
884
+ args = vars(parser.parse_args())
885
+ GeneTree.GeneTree(args)
886
+
887
+ elif sys.argv[1] == 'parse_reltime':
888
+ from TreeSAK import parse_reltime
889
+ parse_reltime_parser = subparsers.add_parser('parse_reltime', usage=parse_reltime.parse_reltime_usage)
890
+ parse_reltime_parser.add_argument('-i', required=True, help='reltime output file')
891
+ parse_reltime_parser.add_argument('-n', required=True, help='interested node txt')
892
+ parse_reltime_parser.add_argument('-o', required=True, help='output txt file')
893
+ args = vars(parser.parse_args())
894
+ parse_reltime.parse_reltime(args)
895
+
896
+ elif sys.argv[1] == 'mcmctree_vs_reltime':
897
+ from TreeSAK import mcmctree_vs_reltime
898
+ mcmctree_vs_reltime_parser = subparsers.add_parser('mcmctree_vs_reltime', usage=mcmctree_vs_reltime.mcmctree_vs_reltime_usage)
899
+ mcmctree_vs_reltime_parser.add_argument('-m', required=True, help='.out file from MCMCTree')
900
+ mcmctree_vs_reltime_parser.add_argument('-r', required=True, help='output from elTime')
901
+ mcmctree_vs_reltime_parser.add_argument('-n', required=True, help='interested nodes txt file')
902
+ mcmctree_vs_reltime_parser.add_argument('-o', required=True, help='output pdf')
903
+ args = vars(parser.parse_args())
904
+ mcmctree_vs_reltime.mcmctree_vs_reltime(args)
905
+
906
+ elif sys.argv[1] == 'iTOL_msa_stats':
907
+ from TreeSAK import iTOL_msa_stats
908
+ iTOL_msa_stats_parser = subparsers.add_parser('iTOL_msa_stats', usage=iTOL_msa_stats.iTOL_msa_stats_usage)
909
+ iTOL_msa_stats_parser.add_argument('-i', required=True, help='MSA file')
910
+ args = vars(parser.parse_args())
911
+ iTOL_msa_stats.iTOL_msa_stats(args)
912
+
913
+ elif sys.argv[1] == 'filter_rename_ar53':
914
+ from TreeSAK import filter_rename_ar53
915
+ filter_rename_ar53_parser = subparsers.add_parser('filter_rename_ar53', usage=filter_rename_ar53.filter_rename_ar53_usage)
916
+ filter_rename_ar53_parser.add_argument('-i', required=True, help='sequence folder')
917
+ filter_rename_ar53_parser.add_argument('-x', required=True, help='file extension')
918
+ filter_rename_ar53_parser.add_argument('-g', required=False, default=None, help='interested genome, no ext, one id per line')
919
+ filter_rename_ar53_parser.add_argument('-m', required=False, default=None, help='interested marker, no ext, one id per line')
920
+ filter_rename_ar53_parser.add_argument('-o', required=True, help='output folder')
921
+ filter_rename_ar53_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
922
+ args = vars(parser.parse_args())
923
+ filter_rename_ar53.filter_rename_ar53(args)
924
+
925
+ elif sys.argv[1] == 'batch_itol':
926
+ from TreeSAK import batch_itol
927
+ batch_itol_parser = subparsers.add_parser('batch_itol', usage=batch_itol.batch_itol_usage)
928
+ batch_itol_parser.add_argument('-i', required=True, help='input tree file or folder')
929
+ batch_itol_parser.add_argument('-x', required=False, default=None, help='file extension')
930
+ batch_itol_parser.add_argument('-o', required=True, help='output file or folder')
931
+ batch_itol_parser.add_argument('-a', required=False, default=None, help='a txt file contain absolute to all annotation files')
932
+ batch_itol_parser.add_argument('-para', required=False, default=None, help='parameter file')
933
+ batch_itol_parser.add_argument('-api', required=True, help='iTOL API key')
934
+ batch_itol_parser.add_argument('-ip', required=False, default='batch_access_tmp', help='iTOL project name, default: batch_access_tmp')
935
+ batch_itol_parser.add_argument('-f', required=False, action="store_true", help='force overwrite')
936
+ args = vars(parser.parse_args())
937
+ batch_itol.batch_itol(args)
938
+
939
+ else:
940
+ print('Unrecognized module: %s, program exited!' % sys.argv[1])
941
+ exit()
942
+
943
+
944
+ upload_to_pypi_cmd = '''
945
+
946
+ cd /Users/songweizhi/PycharmProjects/TreeSAK
947
+ rm -r build dist TreeSAK.egg-info
948
+ python3 setup.py sdist bdist_wheel
949
+ twine upload dist/*
950
+
951
+ __token__
952
+
953
+ pip3 install --upgrade TreeSAK
954
+
955
+ '''