kssdtree 2.0.0__tar.gz → 2.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. {kssdtree-2.0.0/kssdtree.egg-info → kssdtree-2.0.1}/PKG-INFO +1 -1
  2. {kssdtree-2.0.0 → kssdtree-2.0.1/kssdtree.egg-info}/PKG-INFO +1 -1
  3. {kssdtree-2.0.0 → kssdtree-2.0.1}/kssdtree.py +45 -32
  4. {kssdtree-2.0.0 → kssdtree-2.0.1}/setup.py +24 -17
  5. {kssdtree-2.0.0 → kssdtree-2.0.1}/MANIFEST.in +0 -0
  6. {kssdtree-2.0.0 → kssdtree-2.0.1}/README.md +0 -0
  7. {kssdtree-2.0.0 → kssdtree-2.0.1}/align.c +0 -0
  8. {kssdtree-2.0.0 → kssdtree-2.0.1}/buildtree.c +0 -0
  9. {kssdtree-2.0.0 → kssdtree-2.0.1}/bytescale.c +0 -0
  10. {kssdtree-2.0.0 → kssdtree-2.0.1}/cluster.c +0 -0
  11. {kssdtree-2.0.0 → kssdtree-2.0.1}/co2mco.c +0 -0
  12. {kssdtree-2.0.0 → kssdtree-2.0.1}/command_composite.c +0 -0
  13. {kssdtree-2.0.0 → kssdtree-2.0.1}/command_dist.c +0 -0
  14. {kssdtree-2.0.0 → kssdtree-2.0.1}/command_dist_wrapper.c +0 -0
  15. {kssdtree-2.0.0 → kssdtree-2.0.1}/command_set.c +0 -0
  16. {kssdtree-2.0.0 → kssdtree-2.0.1}/command_shuffle.c +0 -0
  17. {kssdtree-2.0.0 → kssdtree-2.0.1}/distancemat.c +0 -0
  18. {kssdtree-2.0.0 → kssdtree-2.0.1}/dnj.c +0 -0
  19. {kssdtree-2.0.0 → kssdtree-2.0.1}/dnjheaders/bytescale.h +0 -0
  20. {kssdtree-2.0.0 → kssdtree-2.0.1}/dnjheaders/dnj.h +0 -0
  21. {kssdtree-2.0.0 → kssdtree-2.0.1}/dnjheaders/filebuff.h +0 -0
  22. {kssdtree-2.0.0 → kssdtree-2.0.1}/dnjheaders/hclust.h +0 -0
  23. {kssdtree-2.0.0 → kssdtree-2.0.1}/dnjheaders/matrix.h +0 -0
  24. {kssdtree-2.0.0 → kssdtree-2.0.1}/dnjheaders/mman.h +0 -0
  25. {kssdtree-2.0.0 → kssdtree-2.0.1}/dnjheaders/nj.h +0 -0
  26. {kssdtree-2.0.0 → kssdtree-2.0.1}/dnjheaders/nwck.h +0 -0
  27. {kssdtree-2.0.0 → kssdtree-2.0.1}/dnjheaders/pherror.h +0 -0
  28. {kssdtree-2.0.0 → kssdtree-2.0.1}/dnjheaders/phy.h +0 -0
  29. {kssdtree-2.0.0 → kssdtree-2.0.1}/dnjheaders/qseqs.h +0 -0
  30. {kssdtree-2.0.0 → kssdtree-2.0.1}/dnjheaders/str.h +0 -0
  31. {kssdtree-2.0.0 → kssdtree-2.0.1}/dnjheaders/threader.h +0 -0
  32. {kssdtree-2.0.0 → kssdtree-2.0.1}/dnjheaders/tmp.h +0 -0
  33. {kssdtree-2.0.0 → kssdtree-2.0.1}/dnjheaders/vector.h +0 -0
  34. {kssdtree-2.0.0 → kssdtree-2.0.1}/filebuff.c +0 -0
  35. {kssdtree-2.0.0 → kssdtree-2.0.1}/global_basic.c +0 -0
  36. {kssdtree-2.0.0 → kssdtree-2.0.1}/hclust.c +0 -0
  37. {kssdtree-2.0.0 → kssdtree-2.0.1}/iseq2comem.c +0 -0
  38. {kssdtree-2.0.0 → kssdtree-2.0.1}/kssdheaders/co2mco.h +0 -0
  39. {kssdtree-2.0.0 → kssdtree-2.0.1}/kssdheaders/command_composite.h +0 -0
  40. {kssdtree-2.0.0 → kssdtree-2.0.1}/kssdheaders/command_dist.h +0 -0
  41. {kssdtree-2.0.0 → kssdtree-2.0.1}/kssdheaders/command_dist_wrapper.h +0 -0
  42. {kssdtree-2.0.0 → kssdtree-2.0.1}/kssdheaders/command_set.h +0 -0
  43. {kssdtree-2.0.0 → kssdtree-2.0.1}/kssdheaders/command_shuffle.h +0 -0
  44. {kssdtree-2.0.0 → kssdtree-2.0.1}/kssdheaders/global_basic.h +0 -0
  45. {kssdtree-2.0.0 → kssdtree-2.0.1}/kssdheaders/iseq2comem.h +0 -0
  46. {kssdtree-2.0.0 → kssdtree-2.0.1}/kssdheaders/mman.h +0 -0
  47. {kssdtree-2.0.0 → kssdtree-2.0.1}/kssdheaders/mytime.h +0 -0
  48. {kssdtree-2.0.0 → kssdtree-2.0.1}/kssdtree.egg-info/SOURCES.txt +0 -0
  49. {kssdtree-2.0.0 → kssdtree-2.0.1}/kssdtree.egg-info/dependency_links.txt +0 -0
  50. {kssdtree-2.0.0 → kssdtree-2.0.1}/kssdtree.egg-info/not-zip-safe +0 -0
  51. {kssdtree-2.0.0 → kssdtree-2.0.1}/kssdtree.egg-info/requires.txt +0 -0
  52. {kssdtree-2.0.0 → kssdtree-2.0.1}/kssdtree.egg-info/top_level.txt +0 -0
  53. {kssdtree-2.0.0 → kssdtree-2.0.1}/matrix.c +0 -0
  54. {kssdtree-2.0.0 → kssdtree-2.0.1}/mman.c +0 -0
  55. {kssdtree-2.0.0 → kssdtree-2.0.1}/mytime.c +0 -0
  56. {kssdtree-2.0.0 → kssdtree-2.0.1}/nj.c +0 -0
  57. {kssdtree-2.0.0 → kssdtree-2.0.1}/njheaders/align.h +0 -0
  58. {kssdtree-2.0.0 → kssdtree-2.0.1}/njheaders/buildtree.h +0 -0
  59. {kssdtree-2.0.0 → kssdtree-2.0.1}/njheaders/cluster.h +0 -0
  60. {kssdtree-2.0.0 → kssdtree-2.0.1}/njheaders/distancemat.h +0 -0
  61. {kssdtree-2.0.0 → kssdtree-2.0.1}/njheaders/sequence.h +0 -0
  62. {kssdtree-2.0.0 → kssdtree-2.0.1}/njheaders/tree.h +0 -0
  63. {kssdtree-2.0.0 → kssdtree-2.0.1}/njheaders/util.h +0 -0
  64. {kssdtree-2.0.0 → kssdtree-2.0.1}/nwck.c +0 -0
  65. {kssdtree-2.0.0 → kssdtree-2.0.1}/pherror.c +0 -0
  66. {kssdtree-2.0.0 → kssdtree-2.0.1}/phy.c +0 -0
  67. {kssdtree-2.0.0 → kssdtree-2.0.1}/pydnj.c +0 -0
  68. {kssdtree-2.0.0 → kssdtree-2.0.1}/pykssd.c +0 -0
  69. {kssdtree-2.0.0 → kssdtree-2.0.1}/pynj.c +0 -0
  70. {kssdtree-2.0.0 → kssdtree-2.0.1}/qseqs.c +0 -0
  71. {kssdtree-2.0.0 → kssdtree-2.0.1}/sequence.c +0 -0
  72. {kssdtree-2.0.0 → kssdtree-2.0.1}/setup.cfg +0 -0
  73. {kssdtree-2.0.0 → kssdtree-2.0.1}/str.c +0 -0
  74. {kssdtree-2.0.0 → kssdtree-2.0.1}/tmp.c +0 -0
  75. {kssdtree-2.0.0 → kssdtree-2.0.1}/toolutils.py +0 -0
  76. {kssdtree-2.0.0 → kssdtree-2.0.1}/tree.c +0 -0
  77. {kssdtree-2.0.0 → kssdtree-2.0.1}/util.c +0 -0
  78. {kssdtree-2.0.0 → kssdtree-2.0.1}/vector.c +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kssdtree
3
- Version: 2.0.0
3
+ Version: 2.0.1
4
4
  Summary: Kssdtree is a versatile Python package for phylogenetic analysis. It also provides one-stop tree construction and visualization. It can handle DNA sequences of both fasta or fastq format, whether gzipped or not.
5
5
  Home-page: https://github.com/yhlink/kssdtree
6
6
  Download-URL: https://pypi.org/project/kssdtree
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: kssdtree
3
- Version: 2.0.0
3
+ Version: 2.0.1
4
4
  Summary: Kssdtree is a versatile Python package for phylogenetic analysis. It also provides one-stop tree construction and visualization. It can handle DNA sequences of both fasta or fastq format, whether gzipped or not.
5
5
  Home-page: https://github.com/yhlink/kssdtree
6
6
  Download-URL: https://pypi.org/project/kssdtree
@@ -26,12 +26,15 @@ def sketch(shuf_file=None, genome_files=None, output=None, set_opt=None):
26
26
  print('Genome format error for file:', filename)
27
27
  return False
28
28
  if not os.path.exists(shuf_file):
29
- if shuf_file in ['L3K9.shuf', './L3K9.shuf']:
29
+ if shuf_file in ['L3K9.shuf', './L3K9.shuf', 'L3K10.shuf', './L3K10.shuf']:
30
30
  print('Downloading...', shuf_file)
31
31
  import http.client
32
32
  http.client.HTTPConnection._http_vsn = 10
33
33
  http.client.HTTPConnection._http_vsn_str = 'HTTP/1.0'
34
- url = 'http://www.metakssdcoabundance.link/kssdtree/shuffle/' + shuf_file
34
+ if shuf_file == 'L3K9.shuf' or shuf_file == './L3K9.shuf':
35
+ url = 'https://zenodo.org/records/12699159/files/L3K9.shuf?download=1'
36
+ else:
37
+ url = 'https://zenodo.org/records/12699159/files/L3K10.shuf?download=1'
35
38
  start_time = time.time()
36
39
  response = requests.get(url, stream=True)
37
40
  with open(shuf_file, 'wb') as file:
@@ -44,8 +47,7 @@ def sketch(shuf_file=None, genome_files=None, output=None, set_opt=None):
44
47
  "Network timeout, please manually download from github (https://github.com/yhlink/kssdtree/tree/master/shuffle_file)")
45
48
  return False
46
49
  print('Download finished: ', shuf_file)
47
- elif shuf_file in ['L2K8.shuf', 'L3K10.shuf', 'L2K9.shuf', 'L3K11.shuf', './L2K8.shuf', './L3K10.shuf',
48
- './L2K9.shuf', './L3K11.shuf']:
50
+ elif shuf_file in ['L2K8.shuf', 'L2K9.shuf', 'L3K11.shuf', './L2K8.shuf', './L2K9.shuf', './L3K11.shuf']:
49
51
  print('Shuffling...', shuf_file)
50
52
  file_name = shuf_file.split('.')[0]
51
53
  k = int(file_name[3:])
@@ -74,14 +76,14 @@ def sketch(shuf_file=None, genome_files=None, output=None, set_opt=None):
74
76
  return False
75
77
 
76
78
 
77
- def dist(ref_sketch=None, qry_sketch=None, output=None, flag=None):
78
- if ref_sketch is not None and qry_sketch is not None and output is not None:
79
- if not os.path.exists(ref_sketch):
80
- print('No such file or directory: ', ref_sketch)
81
- return False
82
- if not os.path.exists(qry_sketch):
83
- print('No such file or directory: ', qry_sketch)
79
+ def dist(genome_sketch=None, output=None, flag=None):
80
+ if genome_sketch is not None and output is not None:
81
+ if not os.path.exists(genome_sketch):
82
+ print('No such file or directory: ', genome_sketch)
84
83
  return False
84
+ # if not os.path.exists(qry_sketch):
85
+ # print('No such file or directory: ', qry_sketch)
86
+ # return False
85
87
  if flag is None:
86
88
  flag = 0
87
89
  print('Disting...')
@@ -95,7 +97,7 @@ def dist(ref_sketch=None, qry_sketch=None, output=None, flag=None):
95
97
  else:
96
98
  output_name = output
97
99
  if output_name.endswith(".phy") or output_name.endswith(".phylip"):
98
- kssd.dist_dispatch(ref_sketch, output, qry_sketch, 2, 0, flag)
100
+ kssd.dist_dispatch(genome_sketch, output, genome_sketch, 2, 0, flag)
99
101
  end = time.time()
100
102
  print('Dist spend time:%.2fs' % (end - start))
101
103
  print('Dist finished!')
@@ -108,23 +110,26 @@ def dist(ref_sketch=None, qry_sketch=None, output=None, flag=None):
108
110
  return False
109
111
 
110
112
 
111
- def retrieve(ref_sketch=None, qry_sketch=None, output=None, N=None, method=None):
112
- if ref_sketch is not None and qry_sketch is not None and output is not None:
113
+ def retrieve(database=None, genome_sketch=None, output=None, N=None, method=None):
114
+ if database is not None and genome_sketch is not None and output is not None:
113
115
  if method is None:
114
116
  method = 'nj'
115
117
  if method not in ['nj', 'dnj']:
116
118
  print('Only support nj and dnj methods!!!')
117
119
  return
118
- if not os.path.exists(qry_sketch):
119
- print('No such file or directory: ', qry_sketch)
120
+ if not os.path.exists(genome_sketch):
121
+ print('No such file or directory: ', genome_sketch)
120
122
  return False
121
- if ref_sketch == 'gtdbr214_sketch':
123
+ if database == 'gtdbr214':
122
124
  print('Retrieving...')
123
125
  start = time.time()
124
126
  if not os.path.exists(output):
125
127
  os.makedirs(output)
126
128
  print("Created directory:", output)
127
- newick, accession_taxonomy = toolutils.upload_request(qry_sketch=qry_sketch, method=method, N=N)
129
+ else:
130
+ print('Output path exist!!!')
131
+ return False
132
+ newick, accession_taxonomy = toolutils.upload_request(qry_sketch=genome_sketch, method=method, N=N)
128
133
  if newick is None:
129
134
  print('Server error!!!')
130
135
  return False
@@ -138,7 +143,7 @@ def retrieve(ref_sketch=None, qry_sketch=None, output=None, N=None, method=None)
138
143
  print('Retrieve finished!')
139
144
  return True
140
145
  else:
141
- print("ref_sketch must be set to 'gtdbr214_sketch'")
146
+ print("database only support 'gtdbr214'")
142
147
  return False
143
148
  else:
144
149
  print('Args error!!!')
@@ -184,6 +189,12 @@ def build(phylip=None, output=None, method=None):
184
189
  print('Build spend time:%.2fs' % (end - start))
185
190
  print('Build finished!')
186
191
  return True
192
+ else:
193
+ print('phylip format error, Check that the phylip format is consistent with NJ or DNJ requirements!!!')
194
+ return False
195
+ else:
196
+ print('Output type error, only supports .newick (.nwk) format:', output_name)
197
+ return False
187
198
  else:
188
199
  print('Args error!!!')
189
200
  return False
@@ -266,8 +277,8 @@ def subtract(ref_sketch=None, genome_sketch=None, output=None, flag=None):
266
277
  return False
267
278
 
268
279
 
269
- def quick(shuf_file=None, genome_files=None, output=None, reference=None, taxonomy=None, method='nj', mode='r', N=0):
270
- if reference is None and taxonomy is None:
280
+ def quick(shuf_file=None, genome_files=None, output=None, reference=None, database=None, method='nj', mode='r', N=0):
281
+ if reference is None and database is None:
271
282
  if shuf_file is not None and genome_files is not None and output is not None:
272
283
  timeStamp = int(time.mktime(time.localtime(time.time())))
273
284
  temp_sketch = toolutils.rs() + '_sketch_' + str(timeStamp)
@@ -286,9 +297,9 @@ def quick(shuf_file=None, genome_files=None, output=None, reference=None, taxono
286
297
  return False
287
298
  print('Step2...')
288
299
  if method == 'nj':
289
- s2 = dist(ref_sketch=temp_sketch, qry_sketch=temp_sketch, output=temp_phy, flag=0)
300
+ s2 = dist(genome_sketch=temp_sketch, output=temp_phy, flag=0)
290
301
  else:
291
- s2 = dist(ref_sketch=temp_sketch, qry_sketch=temp_sketch, output=temp_phy, flag=1)
302
+ s2 = dist(genome_sketch=temp_sketch, output=temp_phy, flag=1)
292
303
  if not s2:
293
304
  return False
294
305
  print('Step3...')
@@ -297,7 +308,7 @@ def quick(shuf_file=None, genome_files=None, output=None, reference=None, taxono
297
308
  return False
298
309
  print('Step4...')
299
310
  print('Tree visualization finished!')
300
- visualize(newick=output, taxonomy=taxonomy, mode=mode)
311
+ visualize(newick=output, mode=mode)
301
312
  if platform.system() == 'Linux':
302
313
  current_directory = os.getcwd()
303
314
  temp_dir1 = os.path.join(current_directory, temp_sketch)
@@ -311,8 +322,7 @@ def quick(shuf_file=None, genome_files=None, output=None, reference=None, taxono
311
322
  else:
312
323
  print('Args error, please see https://kssdtree.readthedocs.io/en/latest!!!')
313
324
  return False
314
-
315
- elif reference == 'gtdbr214_sketch' and taxonomy is None:
325
+ elif reference is None and database == 'gtdbr214':
316
326
  if shuf_file is not None and genome_files is not None and output is not None:
317
327
  if not toolutils.is_positive_integer(N):
318
328
  print("N must >0 !!!")
@@ -325,7 +335,7 @@ def quick(shuf_file=None, genome_files=None, output=None, reference=None, taxono
325
335
  s1 = sketch(shuf_file=shuf_file, genome_files=genome_files, output=qry_sketch, set_opt=True)
326
336
  if not s1:
327
337
  return False
328
- s2 = retrieve(ref_sketch=reference, qry_sketch=qry_sketch, output=output, N=N, method=method)
338
+ s2 = retrieve(database=database, genome_sketch=qry_sketch, output=output, N=N, method=method)
329
339
  if not s2:
330
340
  return False
331
341
  print('Tree visualization finished!')
@@ -342,7 +352,7 @@ def quick(shuf_file=None, genome_files=None, output=None, reference=None, taxono
342
352
  else:
343
353
  print('Args error, please see https://kssdtree.readthedocs.io/en/latest!!!')
344
354
  return False
345
- else:
355
+ elif reference is not None and database is None:
346
356
  if shuf_file is not None and genome_files is not None and output is not None and method in ['nj', 'dnj']:
347
357
  if shuf_file is not None and genome_files is not None and output is not None and method in ['nj', 'dnj']:
348
358
  if not toolutils.allowed_file(genome_files):
@@ -367,7 +377,7 @@ def quick(shuf_file=None, genome_files=None, output=None, reference=None, taxono
367
377
  else:
368
378
  temp_union_sketch = temp_reference_sketch
369
379
  temp_subtract_sketch = toolutils.rs() + '_subtract_sketch_' + str(timeStamp)
370
- temp_phy = toolutils.rs() +'_temp.phy'
380
+ temp_phy = toolutils.rs() + '_temp.phy'
371
381
  print('Step1...')
372
382
  s1 = sketch(shuf_file=shuf_file, genome_files=reference, output=temp_reference_sketch, set_opt=True)
373
383
  if not s1:
@@ -385,10 +395,10 @@ def quick(shuf_file=None, genome_files=None, output=None, reference=None, taxono
385
395
  return False
386
396
  print('Step3...')
387
397
  if method == 'nj':
388
- s5 = dist(ref_sketch=temp_subtract_sketch, qry_sketch=temp_subtract_sketch, output=temp_phy,
398
+ s5 = dist(genome_sketch=temp_subtract_sketch, output=temp_phy,
389
399
  flag=0)
390
400
  else:
391
- s5 = dist(ref_sketch=temp_subtract_sketch, qry_sketch=temp_subtract_sketch, output=temp_phy,
401
+ s5 = dist(genome_sketch=temp_subtract_sketch, output=temp_phy,
392
402
  flag=1)
393
403
  if not s5:
394
404
  return False
@@ -398,7 +408,7 @@ def quick(shuf_file=None, genome_files=None, output=None, reference=None, taxono
398
408
  return False
399
409
  print('Step5...')
400
410
  print('Tree visualization finished!')
401
- visualize(newick=output, taxonomy=taxonomy, mode=mode)
411
+ visualize(newick=output, mode=mode)
402
412
  if platform.system() == 'Linux':
403
413
  current_directory = os.getcwd()
404
414
  temp_dir1 = os.path.join(current_directory, temp_reference_sketch)
@@ -421,3 +431,6 @@ def quick(shuf_file=None, genome_files=None, output=None, reference=None, taxono
421
431
  else:
422
432
  print('Args error, please see https://kssdtree.readthedocs.io/en/latest!!!')
423
433
  return False
434
+ else:
435
+ print('Pipeline error, please see https://kssdtree.readthedocs.io/en/latest!!!')
436
+ return False
@@ -1,17 +1,17 @@
1
1
  import sys
2
-
3
2
  from setuptools import setup, Extension, find_packages
4
3
  from os import environ
5
- import subprocess
6
4
  import os
5
+ import platform
7
6
 
8
7
 
9
- def get_gcc_version():
10
- gcc_version = subprocess.check_output(['gcc', '--version']).decode('utf-8')
11
- version_line = gcc_version.split('\n', 1)[0]
12
- version_str = version_line.split()[-1]
13
- return version_str
14
-
8
+ # def get_gcc_version():
9
+ # gcc_version = subprocess.check_output(['gcc', '--version']).decode('utf-8')
10
+ # version_line = gcc_version.split('\n', 1)[0]
11
+ # version_str = version_line.split()[-1]
12
+ # return version_str
13
+ extra_compile_args = []
14
+ extra_link_args = []
15
15
  if 'darwin' in sys.platform:
16
16
  target_dirs = ["gcc-9", "gcc-10", "gcc-11", "gcc-12", "gcc-13", "gcc-14", "gcc-15"]
17
17
  path = "/opt/homebrew/bin/"
@@ -32,12 +32,10 @@ if 'darwin' in sys.platform:
32
32
  gcc_path = "/opt/homebrew/bin/gcc-15"
33
33
  else:
34
34
  gcc_path = "/opt/homebrew/bin/gcc-13"
35
- gcc_command = 'gcc-' + str(gcc_version)
36
35
  extra_compile_args = ['-fopenmp']
37
36
  extra_link_args = ['-fopenmp']
38
37
  os.environ["CC"] = gcc_path
39
38
  else:
40
- gcc_command = 'gcc'
41
39
  if environ.get('CC') and 'clang' in environ['CC']:
42
40
  # clang
43
41
  extra_compile_args = ['-fopenmp=libomp']
@@ -87,16 +85,25 @@ include_dirs1 = ['kssdheaders']
87
85
  include_dirs2 = ['njheaders']
88
86
  include_dirs3 = ['dnjheaders']
89
87
 
90
- require_pakages = [
91
- 'pyqt5',
92
- 'ete3',
93
- 'requests'
94
- ]
95
-
88
+ if 'darwin' in sys.platform:
89
+ if platform.machine() == 'arm64':
90
+ require_pakages = []
91
+ else:
92
+ require_pakages = [
93
+ 'pyqt5',
94
+ 'ete3',
95
+ 'requests'
96
+ ]
97
+ else:
98
+ require_pakages = [
99
+ 'pyqt5',
100
+ 'ete3',
101
+ 'requests'
102
+ ]
96
103
 
97
104
  setup(
98
105
  name='kssdtree',
99
- version='2.0.0',
106
+ version='2.0.1',
100
107
  author='Hang Yang',
101
108
  author_email='yhlink1207@gmail.com',
102
109
  description="Kssdtree is a versatile Python package for phylogenetic analysis. It also provides one-stop tree construction and visualization. It can handle DNA sequences of both fasta or fastq format, whether gzipped or not. ",
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes