FunVIP 0.3.24.6__tar.gz → 0.3.25__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 (223) hide show
  1. {funvip-0.3.24.6 → funvip-0.3.25}/FunVIP.egg-info/PKG-INFO +2 -3
  2. {funvip-0.3.24.6 → funvip-0.3.25}/FunVIP.egg-info/requires.txt +0 -1
  3. {funvip-0.3.24.6 → funvip-0.3.25}/PKG-INFO +2 -3
  4. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/main.py +1 -0
  5. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/preset/accurate.yaml +1 -3
  6. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/preset/fast.yaml +0 -1
  7. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/cluster.py +2 -2
  8. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/command.py +15 -10
  9. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/concatenate.py +10 -3
  10. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/dataset.py +86 -33
  11. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/ext.py +30 -5
  12. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/initialize.py +34 -12
  13. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/logger.py +6 -0
  14. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/opt_generator.py +16 -0
  15. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/reporter.py +4 -3
  16. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/search.py +5 -4
  17. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/tool.py +5 -0
  18. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/tree.py +2 -2
  19. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/validate_input.py +1 -1
  20. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/validate_option.py +65 -36
  21. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/test_dataset/penicillium/preset.yaml +1 -4
  22. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/test_dataset/sanghuangporus/preset.yaml +1 -2
  23. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/test_dataset/terrei/preset.yaml +1 -3
  24. {funvip-0.3.24.6 → funvip-0.3.25}/pyproject.toml +2 -3
  25. {funvip-0.3.24.6 → funvip-0.3.25}/FunVIP.egg-info/SOURCES.txt +0 -0
  26. {funvip-0.3.24.6 → funvip-0.3.25}/FunVIP.egg-info/dependency_links.txt +0 -0
  27. {funvip-0.3.24.6 → funvip-0.3.25}/FunVIP.egg-info/entry_points.txt +0 -0
  28. {funvip-0.3.24.6 → funvip-0.3.25}/FunVIP.egg-info/top_level.txt +0 -0
  29. {funvip-0.3.24.6 → funvip-0.3.25}/LICENSE +0 -0
  30. {funvip-0.3.24.6 → funvip-0.3.25}/MANIFEST.in +0 -0
  31. {funvip-0.3.24.6 → funvip-0.3.25}/README.md +0 -0
  32. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/FunVIP_GUI.py +0 -0
  33. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/__init__.py +0 -0
  34. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/data/Option_manager.xlsx +0 -0
  35. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/data/__init__.py +0 -0
  36. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/data/genus_line.txt +0 -0
  37. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/BLAST_Windows/Uninstall-ncbi-blast-2.12.0+.exe +0 -0
  38. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/blastn.exe +0 -0
  39. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/cleanup-blastdb-volumes.py +0 -0
  40. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/get_species_taxids.sh +0 -0
  41. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/legacy_blast.pl +0 -0
  42. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/makeblastdb.exe +0 -0
  43. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/nghttp2.dll +0 -0
  44. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/update_blastdb.pl +0 -0
  45. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/BLAST_Windows/doc/README.txt +0 -0
  46. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/FastTree_Windows/FastTree.exe +0 -0
  47. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/Documentation/Gblocks_documentation.html +0 -0
  48. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/Gblocks.exe +0 -0
  49. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/cox2.pir +0 -0
  50. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/cytb.pir +0 -0
  51. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/nad3.pir +0 -0
  52. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/nad5.pir +0 -0
  53. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/nad3.pir +0 -0
  54. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/paths +0 -0
  55. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/MAFFT_LICENSE +0 -0
  56. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/MAFFT_Windows.zip +0 -0
  57. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/RAxML_Windows/GPL-3.0.txt +0 -0
  58. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/RAxML_Windows/README +0 -0
  59. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/RAxML_Windows/raxmlHPC-PTHREADS-AVX2.exe +0 -0
  60. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/__init__.py +0 -0
  61. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/iqtree/bin/iqtree2-click.exe +0 -0
  62. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/iqtree/bin/iqtree2.exe +0 -0
  63. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/iqtree/bin/libiomp5md.dll +0 -0
  64. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/iqtree/example.cf +0 -0
  65. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/iqtree/example.nex +0 -0
  66. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/iqtree/example.phy +0 -0
  67. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/iqtree/models.nex +0 -0
  68. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/LICENSE.md +0 -0
  69. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/README.md +0 -0
  70. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/busybox.exe +0 -0
  71. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/cygbz2-1.dll +0 -0
  72. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/cyggcc_s-seh-1.dll +0 -0
  73. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/cyggomp-1.dll +0 -0
  74. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/cygstdc++-6.dll +0 -0
  75. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/cygwin1.dll +0 -0
  76. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/cygz.dll +0 -0
  77. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/mmseqs.exe +0 -0
  78. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/examples/QUERY.fasta +0 -0
  79. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM10.out +0 -0
  80. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM100.out +0 -0
  81. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM110.out +0 -0
  82. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM120.out +0 -0
  83. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM130.out +0 -0
  84. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM140.out +0 -0
  85. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM150.out +0 -0
  86. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM160.out +0 -0
  87. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM170.out +0 -0
  88. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM180.out +0 -0
  89. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM190.out +0 -0
  90. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM20.out +0 -0
  91. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM30.out +0 -0
  92. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM40.out +0 -0
  93. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM50.out +0 -0
  94. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM60.out +0 -0
  95. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM70.out +0 -0
  96. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM80.out +0 -0
  97. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM90.out +0 -0
  98. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/VTML10.out +0 -0
  99. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/VTML120.out +0 -0
  100. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/VTML160.out +0 -0
  101. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/VTML20.out +0 -0
  102. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/VTML40.out +0 -0
  103. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/VTML80.out +0 -0
  104. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum100.out +0 -0
  105. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum30.out +0 -0
  106. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum35.out +0 -0
  107. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum40.out +0 -0
  108. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum45.out +0 -0
  109. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum50.out +0 -0
  110. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum55.out +0 -0
  111. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum60.out +0 -0
  112. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum62.out +0 -0
  113. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum65.out +0 -0
  114. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum70.out +0 -0
  115. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum75.out +0 -0
  116. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum80.out +0 -0
  117. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum85.out +0 -0
  118. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum90.out +0 -0
  119. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum95.out +0 -0
  120. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/nucleotide.out +0 -0
  121. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/mmseqs.bat +0 -0
  122. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/util/bash-completion.sh +0 -0
  123. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/AUTHORS +0 -0
  124. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/CHANGELOG +0 -0
  125. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/LICENSE +0 -0
  126. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/README +0 -0
  127. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/bin/libgcc_s_dw2-1.dll +0 -0
  128. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/bin/libstdc++-6.dll +0 -0
  129. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/bin/trimal.exe +0 -0
  130. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/check_codon_alignments.py +0 -0
  131. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/compare_trimmed_msas.sh +0 -0
  132. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/generateRandomAlignmentsUsingAsSeedRealAlignments.py +0 -0
  133. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/generate_trimmed_msas.sh +0 -0
  134. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/get_sequence_representative_from_alignment.py +0 -0
  135. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/get_sequences_gaps_ratio.py +0 -0
  136. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/remove_shorter_sequences.py +0 -0
  137. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/selective_trimming_for_dNdS_analyses.based_neighbours.py +0 -0
  138. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/set_manual_boundaries.py +0 -0
  139. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/alignment.cpp +0 -0
  140. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/alignment.h +0 -0
  141. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/alignment.o +0 -0
  142. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/autAlignment.cpp +0 -0
  143. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/autAlignment.o +0 -0
  144. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.cpp +0 -0
  145. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.h +0 -0
  146. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.o +0 -0
  147. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/defines.h +0 -0
  148. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/main.cpp +0 -0
  149. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/makefile +0 -0
  150. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/makefile.MacOS +0 -0
  151. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/readAl.cpp +0 -0
  152. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/readal.exe +0 -0
  153. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/rwAlignment.cpp +0 -0
  154. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/rwAlignment.o +0 -0
  155. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.cpp +0 -0
  156. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.h +0 -0
  157. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.o +0 -0
  158. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.cpp +0 -0
  159. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.h +0 -0
  160. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.o +0 -0
  161. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statAl.cpp +0 -0
  162. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statal.exe +0 -0
  163. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.cpp +0 -0
  164. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.h +0 -0
  165. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.o +0 -0
  166. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsFiles.cpp +0 -0
  167. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsFiles.h +0 -0
  168. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.cpp +0 -0
  169. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.h +0 -0
  170. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.o +0 -0
  171. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/utils.cpp +0 -0
  172. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/utils.h +0 -0
  173. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/utils.o +0 -0
  174. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/values.h +0 -0
  175. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/preset/.gitignore +0 -0
  176. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/.gitignore +0 -0
  177. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__init__.py +0 -0
  178. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/CATV_pipe.cpython-310.pyc +0 -0
  179. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/CAT_V.cpython-310.pyc +0 -0
  180. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/CAT_V.cpython-39.pyc +0 -0
  181. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/CAT_V_pipe.cpython-39.pyc +0 -0
  182. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/__init__.cpython-310.pyc +0 -0
  183. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/__init__.cpython-39.pyc +0 -0
  184. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/align.cpython-310.pyc +0 -0
  185. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/cluster.cpython-39.pyc +0 -0
  186. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/dataset.cpython-39.pyc +0 -0
  187. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/ext.cpython-310.pyc +0 -0
  188. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/ext.cpython-39.pyc +0 -0
  189. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/hasher.cpython-39.pyc +0 -0
  190. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/initialize.cpython-39.pyc +0 -0
  191. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/io.cpython-310.pyc +0 -0
  192. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/io.cpython-39.pyc +0 -0
  193. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/logger.cpython-39.pyc +0 -0
  194. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/modeltest.cpython-39.pyc +0 -0
  195. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/multigene.cpython-39.pyc +0 -0
  196. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/ncbi.cpython-39.pyc +0 -0
  197. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/opt_generator.cpython-39.pyc +0 -0
  198. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/reporter.cpython-39.pyc +0 -0
  199. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/search.cpython-39.pyc +0 -0
  200. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/tool.cpython-39.pyc +0 -0
  201. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/validation.cpython-39.pyc +0 -0
  202. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/visualize.cpython-39.pyc +0 -0
  203. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/align.py +0 -0
  204. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/hasher.py +0 -0
  205. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/logics.py +0 -0
  206. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/modeltest.py +0 -0
  207. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/ncbi.py +0 -0
  208. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/save.py +0 -0
  209. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/templates/template.html +0 -0
  210. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/tree_interpretation.py +0 -0
  211. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/tree_interpretation_pipe.py +0 -0
  212. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/trim.py +0 -0
  213. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/validation.py +0 -0
  214. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/version.py +0 -0
  215. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/visualize.py +0 -0
  216. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/test_dataset/penicillium/DB/DB_Penicillium.xlsx +0 -0
  217. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/test_dataset/penicillium/Options.config +0 -0
  218. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/test_dataset/penicillium/Query/Query.xlsx +0 -0
  219. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/test_dataset/sanghuangporus/DB/FunVIP_Sanghuangporus_db.xlsx +0 -0
  220. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/test_dataset/sanghuangporus/Query/FunVIP_Sanghuangporus_query.xlsx +0 -0
  221. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/test_dataset/terrei/DB/FunVIP_Aspergillus_db.xlsx +0 -0
  222. {funvip-0.3.24.6 → funvip-0.3.25}/funvip/test_dataset/terrei/Query/FunVIP_Aspergillus_query.xlsx +0 -0
  223. {funvip-0.3.24.6 → funvip-0.3.25}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: FunVIP
3
- Version: 0.3.24.6
3
+ Version: 0.3.25
4
4
  Summary: Fungal Validation & Identification Pipeline
5
5
  Author-email: Changwan Seo <wan101010@snu.ac.kr>
6
6
  License: GPL-3.0
@@ -17,7 +17,6 @@ Requires-Dist: matplotlib
17
17
  Requires-Dist: numpy<2.0.0
18
18
  Requires-Dist: openpyxl==3.1.0
19
19
  Requires-Dist: pandas==2.2.2
20
- Requires-Dist: plotly==5.9.0
21
20
  Requires-Dist: psutil
22
21
  Requires-Dist: pyyaml
23
22
  Requires-Dist: sip>=4.19.4
@@ -8,7 +8,6 @@ matplotlib
8
8
  numpy<2.0.0
9
9
  openpyxl==3.1.0
10
10
  pandas==2.2.2
11
- plotly==5.9.0
12
11
  psutil
13
12
  pyyaml
14
13
  sip>=4.19.4
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: FunVIP
3
- Version: 0.3.24.6
3
+ Version: 0.3.25
4
4
  Summary: Fungal Validation & Identification Pipeline
5
5
  Author-email: Changwan Seo <wan101010@snu.ac.kr>
6
6
  License: GPL-3.0
@@ -17,7 +17,6 @@ Requires-Dist: matplotlib
17
17
  Requires-Dist: numpy<2.0.0
18
18
  Requires-Dist: openpyxl==3.1.0
19
19
  Requires-Dist: pandas==2.2.2
20
- Requires-Dist: plotly==5.9.0
21
20
  Requires-Dist: psutil
22
21
  Requires-Dist: pyyaml
23
22
  Requires-Dist: sip>=4.19.4
@@ -223,6 +223,7 @@ def main():
223
223
  logging.info("TRIMMING")
224
224
  V, path, opt = trim.pipe_trimming(V, path, opt)
225
225
  # Alignment validations - whether some of the sequences does not have overlapping regions
226
+ # Calculate TCS score if speicified by option
226
227
  V.validate_alignments(path=path, opt=opt)
227
228
  R.update_report(
228
229
  V=V,
@@ -1,8 +1,7 @@
1
1
  MODE: identification
2
2
  CONTINUE: false
3
3
  QUERYONLY: true
4
- CONFIDENT: false
5
- CONCATENATE: true
4
+ CONFIDENT: fale
6
5
  MAXOUTGROUP: 3
7
6
  SEARCH: blast
8
7
  ALIGNMENT: mafft
@@ -26,5 +25,4 @@ MAFFT-ep: 0.1
26
25
  AVX: true
27
26
  CACHEDB: true
28
27
  USECACHE: true
29
- FULLGENUS: true
30
28
 
@@ -22,4 +22,3 @@ MAFFT-ep: 0.1
22
22
  AVX: true
23
23
  CACHEDB: true
24
24
  USECACHE: true
25
- FULLGENUS: true
@@ -245,14 +245,14 @@ def append_outgroup(V_list_FI, df_search, gene, group, path, opt):
245
245
  # If no or fewer than designated number of outgroup matches to condition, use flexible criteria
246
246
  if cutoff_df.groupby(["subject_group"]).count().empty:
247
247
  logging.warning(
248
- f"Not enough outgroup sequences matched for group {group} | gene {gene}. There might be outlier sequence that does not matches to group. Trying flexible cutoff"
248
+ f"Not enough outgroup sequences matched for {opt.level} {group} | gene {gene}. There might be outlier sequence that does not matches to group. Trying flexible cutoff"
249
249
  )
250
250
  cutoff_df = df_search[df_search["bitscore"] > 0]
251
251
  cutoff_df = cutoff_df[cutoff_df["subject_group"] != group]
252
252
 
253
253
  elif cutoff_df.groupby(["subject_group"]).count()["sseqid"].max() < opt.maxoutgroup:
254
254
  logging.warning(
255
- f"Not enough outgroup sequences matched for group {group} | gene {gene}. There might be outlier sequence that does not matches to group. Trying flexible cutoff"
255
+ f"Not enough outgroup sequences matched for {opt.level} {group} | gene {gene}. There might be outlier sequence that does not matches to group. Trying flexible cutoff"
256
256
  )
257
257
  cutoff_df = df_search[df_search["bitscore"] > 0]
258
258
  cutoff_df = cutoff_df[cutoff_df["subject_group"] != group]
@@ -91,7 +91,7 @@ class CommandParser:
91
91
  "--continue",
92
92
  dest="continue_from_previous",
93
93
  action="store_true",
94
- help="Continue from previous run",
94
+ help="Continue from previous run, default: False",
95
95
  )
96
96
  group_run.add_argument(
97
97
  "--step",
@@ -106,7 +106,7 @@ class CommandParser:
106
106
  group_run.add_argument(
107
107
  "--all",
108
108
  action="store_true",
109
- help="Run FunVIP for all database sequences, regardless of corrresponding sequences exists in query, default : False",
109
+ help="Run FunVIP for all database sequences, regardless of corresponding sequences exists in query, default : False",
110
110
  )
111
111
  group_run.add_argument(
112
112
  "--confident",
@@ -127,6 +127,11 @@ class CommandParser:
127
127
  help="Multiple sequence alignment methods, [mafft], default : mafft",
128
128
  type=str,
129
129
  )
130
+ group_method.add_argument(
131
+ "--notcs",
132
+ action="store_true",
133
+ help="Skip T-COFFEE TCS(Transitive Consistency Score) for alignment validation. default: False",
134
+ )
130
135
  group_method.add_argument(
131
136
  "--trim",
132
137
  help="Trimming methods, [trimal, gblocks, none], default : trimal",
@@ -227,9 +232,9 @@ class CommandParser:
227
232
  type=int,
228
233
  )
229
234
  group_advanced.add_argument(
230
- "--solveflat",
235
+ "--nosolveflat",
231
236
  action="store_true",
232
- help="Whether to automatically detect 0 length branch and automatically solve them, default : True",
237
+ help="Do not detect 0 length branch and automatically solve them, default : False",
233
238
  )
234
239
  group_advanced.add_argument(
235
240
  "--regex",
@@ -284,7 +289,7 @@ class CommandParser:
284
289
  group_advanced.add_argument(
285
290
  "--allow-innertrimming",
286
291
  dest="allow_innertrimming",
287
- help="Turn off FunVIP adjustment to not to trim inner alignment columns",
292
+ help="Turn off FunVIP adjustment to not to trim inner alignment columns, default: False",
288
293
  action="store_true",
289
294
  )
290
295
  group_advanced.add_argument(
@@ -296,7 +301,7 @@ class CommandParser:
296
301
  group_advanced.add_argument(
297
302
  "--noavx",
298
303
  action="store_true",
299
- help="do not use AVX for RAxML, default: False",
304
+ help="Do not use AVX for RAxML, default: False",
300
305
  )
301
306
  group_advanced.add_argument(
302
307
  "--outgroupoffset",
@@ -306,7 +311,7 @@ class CommandParser:
306
311
  group_advanced.add_argument(
307
312
  "--noambiguous",
308
313
  action="store_true",
309
- help="do not include ambiguous samples for sequence-set. Mostly for metabarcoding analysis",
314
+ help="Do not include ambiguous samples for sequence-set. Mostly for metabarcoding analysis. It may result wrong result with problematic database.",
310
315
  )
311
316
 
312
317
  # Cache
@@ -315,9 +320,9 @@ class CommandParser:
315
320
  description="Save search database for faster run in next time",
316
321
  )
317
322
  group_cache.add_argument(
318
- "--cachedb",
323
+ "--nocachedb",
319
324
  action="store_true",
320
- help="Cache current search database, turn off if your database is too big for system directory, default : True",
325
+ help="Disable caching current search database. Use it if your database is too big for system directory, default : True",
321
326
  )
322
327
  group_cache.add_argument(
323
328
  "--usecache",
@@ -344,7 +349,7 @@ class CommandParser:
344
349
  group_save.add_argument(
345
350
  "--nosearchresult",
346
351
  action="store_true",
347
- help="Do not save blast/mmseqs search matrix, use when dataset gets too big and generates IO bottleneck",
352
+ help="Do not save blast/mmseqs search matrix, use when dataset gets too big and generates IO bottleneck, default: False",
348
353
  )
349
354
 
350
355
  # Preset
@@ -57,10 +57,10 @@ def combine_alignment(V, opt, path):
57
57
 
58
58
  # Generate partition file
59
59
  with open(
60
- f"{path.out_alignment}/{opt.runname}_{group}.partition", "w"
60
+ f"{path.out_alignment}/partition/{opt.runname}_{group}.partition",
61
+ "w",
61
62
  ) as fw:
62
63
  tot_len = 0
63
- print(gene_list)
64
64
  for gene in gene_list:
65
65
  # gene_list.append(gene)
66
66
  fw.write(f"DNA, {gene}= {tot_len+1}-{tot_len+len_dict[gene]}\n")
@@ -109,7 +109,8 @@ def combine_alignment(V, opt, path):
109
109
  )
110
110
  )
111
111
  with open(
112
- f"{path.out_alignment}/{opt.runname}_{group}.partition", "w"
112
+ f"{path.out_alignment}/partition/{opt.runname}_{group}.partition",
113
+ "w",
113
114
  ) as fw:
114
115
  fw.write(f"DNA, {singlegene}= 1-{gene_length}\n")
115
116
 
@@ -273,9 +274,15 @@ def concatenate_df(V, path, opt):
273
274
  mean_linear_constant = linear_constant.mean()
274
275
 
275
276
  # Fill missing bitscores
277
+ """
276
278
  df[f"{gene}_bitscore"].fillna(
277
279
  coeff[k] - mean_linear_constant * grad[k], inplace=True
278
280
  )
281
+ """
282
+ df.fillna(
283
+ {f"{gene}_bitscore": coeff[k] - mean_linear_constant * grad[k]},
284
+ inplace=True,
285
+ )
279
286
  return df
280
287
 
281
288
  # Change to numpy for faster cazlculation
@@ -1,10 +1,13 @@
1
1
  from funvip.src import save
2
2
  from funvip.src import hasher
3
+ from funvip.src import ext
4
+ from funvip.src.opt_generator import opt_generator
3
5
  from Bio import SeqIO
4
6
  import os
5
7
  import sys
6
8
  import shutil
7
9
  import numpy as np
10
+ import multiprocessing as mp
8
11
  import logging
9
12
  import re
10
13
  import json
@@ -206,6 +209,9 @@ class FunVIP_var:
206
209
 
207
210
  for group in self.list_group:
208
211
  logging.info(f"Generating dataset for {group}")
212
+
213
+ # print(f"opt.queryonly: {opt.queryonly}")
214
+
209
215
  dict_funinfo[group] = {}
210
216
 
211
217
  # For queryonly case
@@ -277,28 +283,36 @@ class FunVIP_var:
277
283
  ]
278
284
  self.add_dataset(group, "concatenated", list_qr, list_db, [])
279
285
 
280
- # For opt.queryonly is False -> run all dataset in database
286
+ # For opt.queryonly is False -> run all dataset in database if possible
281
287
  else:
282
288
  for gene in self.list_db_gene:
283
- list_qr = [
284
- FI
285
- for FI in self.list_FI
289
+ list_qr = []
290
+ for FI in self.list_FI:
286
291
  if (
287
- gene in FI.seq
288
- and FI.datatype == "query"
292
+ FI.datatype == "query"
289
293
  and FI.adjusted_group == group
290
- )
291
- ]
292
- list_db = [
293
- FI
294
- for FI in self.list_FI
294
+ and gene in FI.seq
295
+ ):
296
+ if FI.seq[gene] != "":
297
+ list_db.append(FI)
298
+
299
+ list_db = []
300
+ for FI in self.list_FI:
295
301
  if (
296
- gene in FI.seq
297
- and FI.datatype == "db"
302
+ FI.datatype == "db"
298
303
  and FI.adjusted_group == group
304
+ and gene in FI.seq
305
+ ):
306
+ if FI.seq[gene] != "":
307
+ list_db.append(FI)
308
+
309
+ # If none of the database is possible for this group and gene pair, it should be excluded
310
+ if len(list_db) > 0:
311
+ self.add_dataset(group, gene, list_qr, list_db, [])
312
+ else:
313
+ logging.warning(
314
+ f"dataset {group} {gene} did not passed dataset construction due to lack of sequences"
299
315
  )
300
- ]
301
- self.add_dataset(group, gene, list_qr, list_db, [])
302
316
 
303
317
  # for concatenated
304
318
  list_qr = [
@@ -444,6 +458,7 @@ class FunVIP_var:
444
458
 
445
459
  # Validate if any multiple sequence alignment has no overlapping region
446
460
  def validate_alignments(self, path, opt):
461
+ # 1. Manual validation for illegal alignments
447
462
  fail_list = []
448
463
  remove_dict = {}
449
464
  tree_hash_dict = hasher.encode(self.list_FI, newick=True)
@@ -499,16 +514,6 @@ class FunVIP_var:
499
514
 
500
515
  remove_dict[group][gene] = remove_hash
501
516
 
502
- """
503
- for _hash in remove_hash:
504
- if _hash in self.dict_dataset[group][gene].list_db_FI:
505
- self.dict_dataset[group][gene].list_db_FI.pop(_hash)
506
- if _hash in self.dict_dataset[group][gene].list_query_FI:
507
- self.dict_dataset[group][gene].list_query_FI.pop(_hash)
508
- if _hash in self.dict_dataset[group][gene].list_og_FI:
509
- self.dict_dataset[group][gene].list_og_FI.pop(_hash)
510
- """
511
-
512
517
  # Remove unusable sequence and re-read it
513
518
  ## db_list, query_list, outgroup_list might has to be changed
514
519
  seq_list = [
@@ -580,12 +585,12 @@ class FunVIP_var:
580
585
  # Add issue
581
586
  for fail in fail_list:
582
587
  for FI in self.list_FI:
583
- if FI.adjusted_group == fail[0]:
584
- if fail[1] in FI.seq:
585
- if FI.seq[fail[1]] != "":
586
- FI.issues.add(f"alignfail:{fail[1]}")
587
-
588
- # print(fail_list)
588
+ if (
589
+ FI.adjusted_group == fail[0]
590
+ and fail[1] in FI.seq
591
+ and FI.seq[fail[1]] != ""
592
+ ):
593
+ FI.issues.add(f"alignfail:{fail[1]}")
589
594
 
590
595
  logging.debug("Remove dict")
591
596
  logging.debug(remove_dict)
@@ -685,12 +690,60 @@ class FunVIP_var:
685
690
 
686
691
  # Add issue: the number of sequences are insufficient
687
692
  for fail in final_fail_list:
688
- for FI in V.list_FI:
693
+ for FI in self.list_FI:
689
694
  if FI.adjusted_group == fail[0]:
690
695
  if FI.seq[fail[1]] != "":
691
696
  FI.issues.add(f"lackseq")
692
697
 
693
- # return V
698
+ # Validate multiple sequence alignment with TCS score from T-COFFEE
699
+ # As T-COFFEE build is only available in Mac and Linux, should check if it is available
700
+ if opt.method.tcs is True:
701
+ bad_cnt = 0
702
+
703
+ if opt.verbose < 3:
704
+ tcs_opt = opt_generator(
705
+ V=self, opt=opt, path=path, step="tcs", thread=1
706
+ )
707
+ p = mp.Pool(opt.thread)
708
+ p.starmap(ext.TCS, tcs_opt)
709
+ p.close()
710
+ p.join()
711
+
712
+ else:
713
+ tcs_opt = opt_generator(V=self, opt=opt, path=path, step="tcs")
714
+ for option in tcs_opt:
715
+ ext.TCS(*option)
716
+
717
+ # non-multithreading mode for debugging
718
+ for group in self.dict_dataset:
719
+ for gene in self.dict_dataset[group]:
720
+ # Running TCS for concatenated alignment is duplicate
721
+ if gene != "concatenated":
722
+ tcs_out = f"{path.out_alignment}/alignment/{opt.runname}_{group}_{gene}.tcs"
723
+ # Parse tcs result
724
+ with open(tcs_out, "r") as f_tcs:
725
+ tcs_result_raw = f_tcs.read()
726
+ tcs_result = tcs_result_raw.split("*")[2].split("cons")[
727
+ 0
728
+ ]
729
+ for line in tcs_result.split("\n")[1:-1]:
730
+ _hash = line.split(":")[0].strip()
731
+ tcs_score = int(line.split(":")[1].strip())
732
+ if (
733
+ tcs_score < 50
734
+ ): # cutoff 50 comes from TCS documentation
735
+ FI_id = self.dict_hash_FI[_hash].id
736
+ logging.warning(
737
+ f"{FI_id} has poor alignment score in {group} {gene}"
738
+ )
739
+ bad_cnt += 1
740
+
741
+ if bad_cnt == 0:
742
+ logging.info(f"All sequences in alignment passed TCS validation")
743
+ else:
744
+ logging.warning(
745
+ f"{bad_cnt} sequences in alignment failed TCS validation. Please check sequneces"
746
+ )
694
747
 
695
748
  # check inconsistency exists along identification result of each genes
696
749
  def check_inconsistent(self):
@@ -80,7 +80,8 @@ def makeblastdb(fasta, db, path):
80
80
  # run make blast db
81
81
  CMD = f"{path_makeblastdb} -in {fasta_tmp} -blastdb_version 4 -title {db_tmp} -dbtype nucl"
82
82
  logging.info(CMD)
83
- Run = subprocess.call(CMD, shell=True)
83
+ # I cannot find any "quiet" options for makeblastdb
84
+ Run = subprocess.call(CMD, stdout=open(os.devnull, "wb"), shell=True)
84
85
  # Change db names
85
86
  shutil.move(fasta_tmp + ".nsq", db + ".nsq")
86
87
  shutil.move(fasta_tmp + ".nin", db + ".nin")
@@ -93,7 +94,8 @@ def makeblastdb(fasta, db, path):
93
94
  else:
94
95
  CMD = f"makeblastdb -in '{fasta}' -blastdb_version 4 -title '{db}' -dbtype nucl"
95
96
  logging.info(CMD)
96
- return_code = subprocess.call(CMD, shell=True)
97
+ # I cannot find any "quiet" options for makeblastdb
98
+ return_code = subprocess.call(CMD, stdout=open(os.devnull, "wb"), shell=True)
97
99
 
98
100
  if return_code != 0:
99
101
  logging.error(f"Make blast_db failed!!")
@@ -325,14 +327,14 @@ def RAxML(
325
327
  if " " in out:
326
328
  out = f'"{out}"'
327
329
 
328
- CMD = f"{path.sys_path}/external/RAxML_Windows/raxmlHPC-PTHREADS-AVX2.exe -s {fasta} -n {out} -p 1 -T {thread} -f a -# {bootstrap} -x 1 {model}"
330
+ CMD = f"{path.sys_path}/external/RAxML_Windows/raxmlHPC-PTHREADS-AVX2.exe -s {fasta} -n {out} -p 1 -T {thread} -f a -# {bootstrap} -x 1 {model} --silent"
329
331
  elif platform == "darwin":
330
332
  CMD = f"raxmlHPC-PTHREADS -s '{fasta}' -n '{out}' -p 1 -T {thread} -f a -# {bootstrap} -x 1 {model}"
331
333
  else:
332
334
  if version == "old":
333
- CMD = f"raxmlHPC-PTHREADS-AVX -s '{fasta}' -n '{out}' -p 1 -T {thread} -f a -# {bootstrap} -x 1 {model}"
335
+ CMD = f"raxmlHPC-PTHREADS-AVX -s '{fasta}' -n '{out}' -p 1 -T {thread} -f a -# {bootstrap} -x 1 {model} --silent"
334
336
  elif version == "new":
335
- CMD = f"raxmlHPC-PTHREADS-AVX2 -s '{fasta}' -n '{out}' -p 1 -T {thread} -f a -# {bootstrap} -x 1 {model}"
337
+ CMD = f"raxmlHPC-PTHREADS-AVX2 -s '{fasta}' -n '{out}' -p 1 -T {thread} -f a -# {bootstrap} -x 1 {model} --silent"
336
338
  else:
337
339
  logging.error(
338
340
  f"DEVELOPMENTAL ERROR - unexpected RAxML version, {version} in ext.py"
@@ -455,3 +457,26 @@ def IQTREE(
455
457
  hash_file_path=f"{path.out_tree}/hash_{file}",
456
458
  decoded_file_path=f"{path.out_tree}/{file}",
457
459
  )
460
+
461
+
462
+ # TCS calculation from T-COFFEE
463
+ def TCS(fasta, thread, out):
464
+ if platform == "win32":
465
+ logging.error("TCS(From T-COFFEE) is only available in Linux")
466
+ raise Exception
467
+ else:
468
+ # T_COFFEE env variable MAX_N_PID_4_TCOFFEE should be changed for 64bit machine
469
+ # should be already done in installation check process
470
+ # subprocess.call("export MAX_N_PID_4_TCOFFEE=4194304", shell=True)
471
+ CMD = f"t_coffee -infile {fasta} -cpu {thread} -method fast_pair -type DNA -evaluate -output score_ascii -outfile {out} -quiet"
472
+
473
+ logging.info(CMD)
474
+ # Even though "quiet" option exists, TCS show some blank lines
475
+ # Run = subprocess.call(CMD, stdout=open(os.devnull, "wb"), shell=True)
476
+ Run = subprocess.run(
477
+ CMD, stdout=open(os.devnull, "wb"), stderr=subprocess.STDOUT, shell=True
478
+ ).returncode
479
+
480
+ if Run != 0:
481
+ logging.error(f"TCS Failed!")
482
+ raise Exception
@@ -31,10 +31,10 @@ def check(
31
31
  obj,
32
32
  type_,
33
33
  criterion,
34
- value=np.NaN,
35
- min_=np.NaN,
36
- max_=np.NaN,
37
- default=np.NaN,
34
+ value=np.nan,
35
+ min_=np.nan,
36
+ max_=np.nan,
37
+ default=np.nan,
38
38
  solve=False,
39
39
  ):
40
40
  # obj : option things that should be checked
@@ -187,9 +187,17 @@ class Path:
187
187
  for program in check_commands:
188
188
  cmd = check_commands[program]
189
189
  # Quietly call each programs
190
+ """
190
191
  return_code = subprocess.call(
191
192
  cmd, shell=True, stdout=open(os.devnull, "wb")
192
193
  )
194
+ """
195
+ return_code = subprocess.run(
196
+ cmd,
197
+ shell=True,
198
+ stdout=open(os.devnull, "wb"),
199
+ stderr=subprocess.STDOUT,
200
+ ).returncode
193
201
  if return_code != 0:
194
202
  print(f"[ERROR] {program} not installed!")
195
203
  install_flag = 1
@@ -198,12 +206,18 @@ class Path:
198
206
  # I don't know why, but apt install RAxML can use raxmlHPC-PTHREADS-AVX,
199
207
  # while conda install RAxML can use raxmlHPC -PTHREADS-AVX / raxmlHPC-PTHREADS-AVX2 (blank between raxmlHPC and -PTHREADS-AVX)
200
208
  # However, if using 'raxmlHPC -PTHREADS-AVX', the computer cannot utilize full threads
201
- return_code_1 = subprocess.call(
202
- "raxmlHPC-PTHREADS-AVX -h", shell=True, stdout=open(os.devnull, "wb")
203
- )
204
- return_code_2 = subprocess.call(
205
- "raxmlHPC-PTHREADS-AVX2 -h", shell=True, stdout=open(os.devnull, "wb")
206
- )
209
+ return_code_1 = subprocess.run(
210
+ "raxmlHPC-PTHREADS-AVX -h",
211
+ shell=True,
212
+ stdout=open(os.devnull, "wb"),
213
+ stderr=subprocess.STDOUT,
214
+ ).returncode
215
+ return_code_2 = subprocess.run(
216
+ "raxmlHPC-PTHREADS-AVX2 -h",
217
+ shell=True,
218
+ stdout=open(os.devnull, "wb"),
219
+ stderr=subprocess.STDOUT,
220
+ ).returncode
207
221
 
208
222
  if return_code_1 != 0 and return_code_2 != 0:
209
223
  print(f"[ERROR] RAxML not installed!")
@@ -224,6 +238,9 @@ class Path:
224
238
  )
225
239
  raise Exception
226
240
 
241
+ # For t-coffee, check it and just turn off it tcs is not installed
242
+ # it should be done in validation_option.py so moved
243
+
227
244
  # Location for list of genus file
228
245
  self.genusdb = f"{self.sys_path}/data/genus_line.txt"
229
246
 
@@ -247,7 +264,8 @@ class Path:
247
264
  self.root = os.path.abspath(self.root)
248
265
 
249
266
  # Logging directory
250
- self.log = f"{self.root}/log.txt"
267
+ self.log = f"{self.root}/log.txt" # for overall logging
268
+ self.criticallog = f"{self.root}/log_critical.txt" # for warnings and errors
251
269
  self.extlog = f"{self.root}/log" # for saving external program logs
252
270
  mkdir(self.extlog)
253
271
 
@@ -288,6 +306,10 @@ class Path:
288
306
  mkdir(f"{self.out_alignment}/hash")
289
307
  # For failed alignments
290
308
  mkdir(f"{self.out_alignment}/failed")
309
+ # For partition file
310
+ mkdir(f"{self.out_alignment}/partition")
311
+ # For tcs results
312
+ mkdir(f"{self.out_alignment}/tcs")
291
313
 
292
314
  # modeltest result directory
293
315
  self.out_modeltest = f"{self.root}/06_Modeltest"
@@ -311,7 +333,7 @@ def initialize(path_run, parser):
311
333
 
312
334
  # Move option loading as independent class or function
313
335
  # Generate path class
314
- print(f"Output location: {path_run}")
336
+ print(f"[INFO] Output location: {path_run}")
315
337
  path = Path(path_run)
316
338
 
317
339
  # Parsing options
@@ -54,6 +54,12 @@ def setup_logging(list_info, list_warning, list_error, path, opt, tool):
54
54
  for handler in logging.root.handlers:
55
55
  handler.setFormatter(formatter)
56
56
 
57
+ # Add a new FileHandler for warnings, errors, and critical messages
58
+ warning_error_critical_handler = logging.FileHandler(path.criticallog)
59
+ warning_error_critical_handler.setLevel(logging.WARNING)
60
+ warning_error_critical_handler.setFormatter(formatter)
61
+ logging.getLogger().addHandler(warning_error_critical_handler)
62
+
57
63
  # Delayed logging for option parsing
58
64
 
59
65
  # I don't know why, but in some environment, ANSI color works only after first subprocess.call was done
@@ -65,6 +65,22 @@ def opt_generator(V, opt, path, step, thread=None):
65
65
  )
66
66
  )
67
67
 
68
+ # For tcs alignment validation
69
+ elif step == "tcs":
70
+ for group in V.dict_dataset:
71
+ for gene in V.dict_dataset[group]:
72
+ if gene != "concatenated":
73
+ tcs_out = (
74
+ f"{path.out_alignment}/tcs/{opt.runname}_{group}_{gene}.tcs"
75
+ )
76
+ list_opt.append(
77
+ (
78
+ f"{path.out_alignment}/{opt.runname}_trimmed_{group}_{gene}.fasta",
79
+ thread,
80
+ tcs_out,
81
+ )
82
+ )
83
+
68
84
  else:
69
85
  logging.error(f"[Error] Unexpected step {step} given for opt_generator")
70
86
  raise Exception
@@ -3,7 +3,8 @@ import pandas as pd
3
3
  import matplotlib.pyplot as plt
4
4
  import io
5
5
  import logging
6
- import plotly.express as px
6
+
7
+ # import plotly.express as px
7
8
  import sys
8
9
  from tabulate import tabulate
9
10
  from funvip.src.tool import index_step
@@ -298,7 +299,7 @@ class Report:
298
299
 
299
300
  # Count groups
300
301
  for group in sorted(list(set(self.query_result["GROUP_ASSIGNED"]))):
301
- df_group = df_result_group.get_group(group)
302
+ df_group = df_result_group.get_group((group,))
302
303
 
303
304
  # Collect statistics
304
305
  """
@@ -828,7 +829,7 @@ class Report:
828
829
  dict_citation = {
829
830
  "FunVIP": "https://github.com/Changwanseo/FunVIP",
830
831
  "GenMine": "Seo, C. W., Kim, S. H., Lim, Y. W., & Park, M. S. (2022). Re-identification on Korean Penicillium sequences in GenBank collected by software GenMine. Mycobiology, 50(4), 231-237.",
831
- "BLASTn": "Altschul, S. F., Gish, W., Miller, W., Myers, E. W., & Lipman, D. J. (1990). Basic local alignment search tool. Journal of molecular biology, 215(3), 403-410.",
832
+ "BLASTn": "Camacho, C., Coulouris, G., Avagyan, V., Ma, N., Papadopoulos, J., Bealer, K., & Madden, T. L. (2009). BLAST+: architecture and applications. BMC bioinformatics, 10, 1-9.",
832
833
  "MMseqs2": "Steinegger, M., & Söding, J. (2017). MMseqs2 enables sensitive protein sequence searching for the analysis of massive data sets. Nature biotechnology, 35(11), 1026-1028.",
833
834
  "MAFFT": "Katoh, K., & Standley, D. M. (2013). MAFFT multiple sequence alignment software version 7: improvements in performance and usability. Molecular biology and evolution, 30(4), 772-780.",
834
835
  "Gblocks": "Talavera, G., & Castresana, J. (2007). Improvement of phylogenies after removing divergent and ambiguously aligned blocks from protein sequence alignments. Systematic biology, 56(4), 564-577.",