FunVIP 0.3.24.7__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.7 → funvip-0.3.25}/FunVIP.egg-info/PKG-INFO +2 -3
  2. {funvip-0.3.24.7 → funvip-0.3.25}/FunVIP.egg-info/requires.txt +0 -1
  3. {funvip-0.3.24.7 → funvip-0.3.25}/PKG-INFO +2 -3
  4. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/main.py +1 -0
  5. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/preset/accurate.yaml +1 -3
  6. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/preset/fast.yaml +0 -1
  7. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/cluster.py +2 -2
  8. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/command.py +15 -10
  9. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/concatenate.py +10 -3
  10. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/dataset.py +60 -18
  11. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/ext.py +30 -5
  12. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/initialize.py +34 -12
  13. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/logger.py +6 -0
  14. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/opt_generator.py +16 -0
  15. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/reporter.py +4 -3
  16. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/search.py +5 -4
  17. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/tool.py +5 -0
  18. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/tree.py +2 -2
  19. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/validate_input.py +1 -1
  20. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/validate_option.py +65 -36
  21. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/test_dataset/penicillium/preset.yaml +1 -4
  22. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/test_dataset/sanghuangporus/preset.yaml +1 -2
  23. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/test_dataset/terrei/preset.yaml +1 -3
  24. {funvip-0.3.24.7 → funvip-0.3.25}/pyproject.toml +2 -3
  25. {funvip-0.3.24.7 → funvip-0.3.25}/FunVIP.egg-info/SOURCES.txt +0 -0
  26. {funvip-0.3.24.7 → funvip-0.3.25}/FunVIP.egg-info/dependency_links.txt +0 -0
  27. {funvip-0.3.24.7 → funvip-0.3.25}/FunVIP.egg-info/entry_points.txt +0 -0
  28. {funvip-0.3.24.7 → funvip-0.3.25}/FunVIP.egg-info/top_level.txt +0 -0
  29. {funvip-0.3.24.7 → funvip-0.3.25}/LICENSE +0 -0
  30. {funvip-0.3.24.7 → funvip-0.3.25}/MANIFEST.in +0 -0
  31. {funvip-0.3.24.7 → funvip-0.3.25}/README.md +0 -0
  32. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/FunVIP_GUI.py +0 -0
  33. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/__init__.py +0 -0
  34. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/data/Option_manager.xlsx +0 -0
  35. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/data/__init__.py +0 -0
  36. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/data/genus_line.txt +0 -0
  37. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/BLAST_Windows/Uninstall-ncbi-blast-2.12.0+.exe +0 -0
  38. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/blastn.exe +0 -0
  39. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/cleanup-blastdb-volumes.py +0 -0
  40. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/get_species_taxids.sh +0 -0
  41. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/legacy_blast.pl +0 -0
  42. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/makeblastdb.exe +0 -0
  43. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/nghttp2.dll +0 -0
  44. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/update_blastdb.pl +0 -0
  45. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/BLAST_Windows/doc/README.txt +0 -0
  46. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/FastTree_Windows/FastTree.exe +0 -0
  47. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/Documentation/Gblocks_documentation.html +0 -0
  48. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/Gblocks.exe +0 -0
  49. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/cox2.pir +0 -0
  50. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/cytb.pir +0 -0
  51. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/nad3.pir +0 -0
  52. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/nad5.pir +0 -0
  53. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/nad3.pir +0 -0
  54. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/paths +0 -0
  55. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/MAFFT_LICENSE +0 -0
  56. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/MAFFT_Windows.zip +0 -0
  57. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/RAxML_Windows/GPL-3.0.txt +0 -0
  58. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/RAxML_Windows/README +0 -0
  59. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/RAxML_Windows/raxmlHPC-PTHREADS-AVX2.exe +0 -0
  60. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/__init__.py +0 -0
  61. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/iqtree/bin/iqtree2-click.exe +0 -0
  62. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/iqtree/bin/iqtree2.exe +0 -0
  63. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/iqtree/bin/libiomp5md.dll +0 -0
  64. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/iqtree/example.cf +0 -0
  65. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/iqtree/example.nex +0 -0
  66. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/iqtree/example.phy +0 -0
  67. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/iqtree/models.nex +0 -0
  68. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/LICENSE.md +0 -0
  69. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/README.md +0 -0
  70. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/busybox.exe +0 -0
  71. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/cygbz2-1.dll +0 -0
  72. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/cyggcc_s-seh-1.dll +0 -0
  73. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/cyggomp-1.dll +0 -0
  74. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/cygstdc++-6.dll +0 -0
  75. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/cygwin1.dll +0 -0
  76. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/cygz.dll +0 -0
  77. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/mmseqs.exe +0 -0
  78. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/examples/QUERY.fasta +0 -0
  79. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM10.out +0 -0
  80. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM100.out +0 -0
  81. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM110.out +0 -0
  82. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM120.out +0 -0
  83. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM130.out +0 -0
  84. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM140.out +0 -0
  85. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM150.out +0 -0
  86. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM160.out +0 -0
  87. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM170.out +0 -0
  88. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM180.out +0 -0
  89. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM190.out +0 -0
  90. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM20.out +0 -0
  91. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM30.out +0 -0
  92. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM40.out +0 -0
  93. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM50.out +0 -0
  94. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM60.out +0 -0
  95. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM70.out +0 -0
  96. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM80.out +0 -0
  97. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM90.out +0 -0
  98. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/VTML10.out +0 -0
  99. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/VTML120.out +0 -0
  100. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/VTML160.out +0 -0
  101. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/VTML20.out +0 -0
  102. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/VTML40.out +0 -0
  103. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/VTML80.out +0 -0
  104. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum100.out +0 -0
  105. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum30.out +0 -0
  106. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum35.out +0 -0
  107. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum40.out +0 -0
  108. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum45.out +0 -0
  109. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum50.out +0 -0
  110. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum55.out +0 -0
  111. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum60.out +0 -0
  112. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum62.out +0 -0
  113. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum65.out +0 -0
  114. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum70.out +0 -0
  115. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum75.out +0 -0
  116. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum80.out +0 -0
  117. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum85.out +0 -0
  118. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum90.out +0 -0
  119. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum95.out +0 -0
  120. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/nucleotide.out +0 -0
  121. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/mmseqs.bat +0 -0
  122. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/mmseqs_Windows/util/bash-completion.sh +0 -0
  123. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/AUTHORS +0 -0
  124. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/CHANGELOG +0 -0
  125. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/LICENSE +0 -0
  126. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/README +0 -0
  127. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/bin/libgcc_s_dw2-1.dll +0 -0
  128. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/bin/libstdc++-6.dll +0 -0
  129. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/bin/trimal.exe +0 -0
  130. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/check_codon_alignments.py +0 -0
  131. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/compare_trimmed_msas.sh +0 -0
  132. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/generateRandomAlignmentsUsingAsSeedRealAlignments.py +0 -0
  133. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/generate_trimmed_msas.sh +0 -0
  134. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/get_sequence_representative_from_alignment.py +0 -0
  135. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/get_sequences_gaps_ratio.py +0 -0
  136. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/remove_shorter_sequences.py +0 -0
  137. {funvip-0.3.24.7 → 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.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/set_manual_boundaries.py +0 -0
  139. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/alignment.cpp +0 -0
  140. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/alignment.h +0 -0
  141. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/alignment.o +0 -0
  142. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/autAlignment.cpp +0 -0
  143. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/autAlignment.o +0 -0
  144. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.cpp +0 -0
  145. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.h +0 -0
  146. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.o +0 -0
  147. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/defines.h +0 -0
  148. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/main.cpp +0 -0
  149. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/makefile +0 -0
  150. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/makefile.MacOS +0 -0
  151. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/readAl.cpp +0 -0
  152. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/readal.exe +0 -0
  153. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/rwAlignment.cpp +0 -0
  154. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/rwAlignment.o +0 -0
  155. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.cpp +0 -0
  156. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.h +0 -0
  157. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.o +0 -0
  158. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.cpp +0 -0
  159. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.h +0 -0
  160. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.o +0 -0
  161. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statAl.cpp +0 -0
  162. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statal.exe +0 -0
  163. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.cpp +0 -0
  164. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.h +0 -0
  165. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.o +0 -0
  166. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsFiles.cpp +0 -0
  167. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsFiles.h +0 -0
  168. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.cpp +0 -0
  169. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.h +0 -0
  170. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.o +0 -0
  171. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/utils.cpp +0 -0
  172. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/utils.h +0 -0
  173. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/utils.o +0 -0
  174. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/values.h +0 -0
  175. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/preset/.gitignore +0 -0
  176. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/.gitignore +0 -0
  177. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__init__.py +0 -0
  178. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/CATV_pipe.cpython-310.pyc +0 -0
  179. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/CAT_V.cpython-310.pyc +0 -0
  180. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/CAT_V.cpython-39.pyc +0 -0
  181. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/CAT_V_pipe.cpython-39.pyc +0 -0
  182. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/__init__.cpython-310.pyc +0 -0
  183. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/__init__.cpython-39.pyc +0 -0
  184. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/align.cpython-310.pyc +0 -0
  185. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/cluster.cpython-39.pyc +0 -0
  186. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/dataset.cpython-39.pyc +0 -0
  187. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/ext.cpython-310.pyc +0 -0
  188. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/ext.cpython-39.pyc +0 -0
  189. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/hasher.cpython-39.pyc +0 -0
  190. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/initialize.cpython-39.pyc +0 -0
  191. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/io.cpython-310.pyc +0 -0
  192. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/io.cpython-39.pyc +0 -0
  193. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/logger.cpython-39.pyc +0 -0
  194. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/modeltest.cpython-39.pyc +0 -0
  195. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/multigene.cpython-39.pyc +0 -0
  196. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/ncbi.cpython-39.pyc +0 -0
  197. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/opt_generator.cpython-39.pyc +0 -0
  198. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/reporter.cpython-39.pyc +0 -0
  199. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/search.cpython-39.pyc +0 -0
  200. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/tool.cpython-39.pyc +0 -0
  201. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/validation.cpython-39.pyc +0 -0
  202. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/__pycache__/visualize.cpython-39.pyc +0 -0
  203. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/align.py +0 -0
  204. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/hasher.py +0 -0
  205. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/logics.py +0 -0
  206. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/modeltest.py +0 -0
  207. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/ncbi.py +0 -0
  208. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/save.py +0 -0
  209. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/templates/template.html +0 -0
  210. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/tree_interpretation.py +0 -0
  211. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/tree_interpretation_pipe.py +0 -0
  212. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/trim.py +0 -0
  213. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/validation.py +0 -0
  214. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/version.py +0 -0
  215. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/src/visualize.py +0 -0
  216. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/test_dataset/penicillium/DB/DB_Penicillium.xlsx +0 -0
  217. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/test_dataset/penicillium/Options.config +0 -0
  218. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/test_dataset/penicillium/Query/Query.xlsx +0 -0
  219. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/test_dataset/sanghuangporus/DB/FunVIP_Sanghuangporus_db.xlsx +0 -0
  220. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/test_dataset/sanghuangporus/Query/FunVIP_Sanghuangporus_query.xlsx +0 -0
  221. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/test_dataset/terrei/DB/FunVIP_Aspergillus_db.xlsx +0 -0
  222. {funvip-0.3.24.7 → funvip-0.3.25}/funvip/test_dataset/terrei/Query/FunVIP_Aspergillus_query.xlsx +0 -0
  223. {funvip-0.3.24.7 → 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.7
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.7
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
@@ -207,7 +210,7 @@ class FunVIP_var:
207
210
  for group in self.list_group:
208
211
  logging.info(f"Generating dataset for {group}")
209
212
 
210
- print(f"opt.queryonly: {opt.queryonly}")
213
+ # print(f"opt.queryonly: {opt.queryonly}")
211
214
 
212
215
  dict_funinfo[group] = {}
213
216
 
@@ -455,6 +458,7 @@ class FunVIP_var:
455
458
 
456
459
  # Validate if any multiple sequence alignment has no overlapping region
457
460
  def validate_alignments(self, path, opt):
461
+ # 1. Manual validation for illegal alignments
458
462
  fail_list = []
459
463
  remove_dict = {}
460
464
  tree_hash_dict = hasher.encode(self.list_FI, newick=True)
@@ -510,16 +514,6 @@ class FunVIP_var:
510
514
 
511
515
  remove_dict[group][gene] = remove_hash
512
516
 
513
- """
514
- for _hash in remove_hash:
515
- if _hash in self.dict_dataset[group][gene].list_db_FI:
516
- self.dict_dataset[group][gene].list_db_FI.pop(_hash)
517
- if _hash in self.dict_dataset[group][gene].list_query_FI:
518
- self.dict_dataset[group][gene].list_query_FI.pop(_hash)
519
- if _hash in self.dict_dataset[group][gene].list_og_FI:
520
- self.dict_dataset[group][gene].list_og_FI.pop(_hash)
521
- """
522
-
523
517
  # Remove unusable sequence and re-read it
524
518
  ## db_list, query_list, outgroup_list might has to be changed
525
519
  seq_list = [
@@ -591,12 +585,12 @@ class FunVIP_var:
591
585
  # Add issue
592
586
  for fail in fail_list:
593
587
  for FI in self.list_FI:
594
- if FI.adjusted_group == fail[0]:
595
- if fail[1] in FI.seq:
596
- if FI.seq[fail[1]] != "":
597
- FI.issues.add(f"alignfail:{fail[1]}")
598
-
599
- # 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]}")
600
594
 
601
595
  logging.debug("Remove dict")
602
596
  logging.debug(remove_dict)
@@ -701,7 +695,55 @@ class FunVIP_var:
701
695
  if FI.seq[fail[1]] != "":
702
696
  FI.issues.add(f"lackseq")
703
697
 
704
- # 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
+ )
705
747
 
706
748
  # check inconsistency exists along identification result of each genes
707
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.",
@@ -1,6 +1,7 @@
1
1
  from funvip.src import cluster, tool, hasher, validate_input, save
2
2
  from funvip.src.ext import blast, makeblastdb, mmseqs, makemmseqsdb
3
3
  from funvip.src.save import save_df
4
+ from funvip.src.tool import mkdir
4
5
  import copy
5
6
  import pandas as pd
6
7
  import numpy as np
@@ -156,7 +157,7 @@ def search(query_fasta, db_fasta, path, opt) -> pd.DataFrame():
156
157
  os.path.isdir(f"{path.in_db}/{opt.method.search.lower()}/{_hash}")
157
158
  is True
158
159
  ):
159
- logging.info("[INFO] Found existing database! Skipping database build")
160
+ logging.info("Found existing database! Skipping database build")
160
161
  db = f"{path.in_db}/{opt.method.search.lower()}/{_hash}/{_hash}"
161
162
 
162
163
  # When parsing existing DB failed
@@ -170,7 +171,7 @@ def search(query_fasta, db_fasta, path, opt) -> pd.DataFrame():
170
171
  )
171
172
 
172
173
  # Create DB saving directory
173
- os.mkdir(f"{path.in_db}/{opt.method.search.lower()}/{_hash}")
174
+ mkdir(f"{path.in_db}/{opt.method.search.lower()}/{_hash}")
174
175
  db = f"{path.in_db}/{opt.method.search.lower()}/{_hash}/{_hash}"
175
176
 
176
177
  # DB saving starts
@@ -184,14 +185,14 @@ def search(query_fasta, db_fasta, path, opt) -> pd.DataFrame():
184
185
  logging.info(
185
186
  "--cachedb not selected, saving database will be passed"
186
187
  )
187
- os.mkdir(f"{path.tmp}/{opt.runname}/{_hash}")
188
+ mkdir(f"{path.tmp}/{opt.runname}/{_hash}")
188
189
  db = f"{path.tmp}/{opt.runname}/{_hash}/{_hash}"
189
190
 
190
191
  # Create search database
191
192
  create_search_db(opt, db_fasta, db, path)
192
193
 
193
194
  else:
194
- os.mkdir(f"{path.tmp}/{opt.runname}/{_hash}")
195
+ mkdir(f"{path.tmp}/{opt.runname}/{_hash}")
195
196
  db = f"{path.tmp}/{opt.runname}/{_hash}/{_hash}"
196
197
  # Create search database
197
198
  create_search_db(opt, db_fasta, db, path)
@@ -26,9 +26,14 @@ def initialize_path(path):
26
26
  genus_file = path.genusdb
27
27
 
28
28
 
29
+ # Check if directory exists and make if not
30
+ # If intermediate directory does not exists, also do it
29
31
  def mkdir(path):
32
+ os.makedirs(path, exist_ok=True)
33
+ """
30
34
  if os.path.exists(path) == False:
31
35
  os.makedirs(path)
36
+ """
32
37
 
33
38
 
34
39
  def union_funinfo_list(funinfo_list1, funinfo_list2):
@@ -130,7 +130,7 @@ def pipe_tree(V, path, opt, model_dict):
130
130
  path=path,
131
131
  thread=opt.thread,
132
132
  bootstrap=opt.bootstrap,
133
- partition=f"{path.out_alignment}/{opt.runname}_{group}.partition",
133
+ partition=f"{path.out_alignment}/partition/{opt.runname}_{group}.partition",
134
134
  model=model_dict[group][gene],
135
135
  version=path.raxml_version,
136
136
  )
@@ -144,7 +144,7 @@ def pipe_tree(V, path, opt, model_dict):
144
144
  memory=opt.memory,
145
145
  thread=opt.thread,
146
146
  bootstrap=opt.bootstrap,
147
- partition=f"{path.out_alignment}/{opt.runname}_{group}.partition",
147
+ partition=f"{path.out_alignment}/partition/{opt.runname}_{group}.partition",
148
148
  model=model_dict[group][gene],
149
149
  )
150
150
 
@@ -830,7 +830,7 @@ def db_input(funinfo_dict, opt, path) -> list:
830
830
 
831
831
  if any(group_cnt_dict[x] < opt.maxoutgroup for x in group_cnt_dict):
832
832
  logging.warning(
833
- f"Sequences in database of some group has lower number than MINIMUM_OUTGROUP_COUNT. It may cause error when outgroup selection, or may select not most appropriate outgroup to group. Please lower number of MINIMUM_OUTGROUP_COUNT in option or add more sequences to these groups"
833
+ f"Sequences in database of some {opt.level} has lower number than MINIMUM_OUTGROUP_COUNT. It may cause error when outgroup selection, or may not select best outgroup. You can either\n 1. Lower number of --maxoutgroup \n 2. Add more sequences to these groups"
834
834
  )
835
835
 
836
836
  return funinfo_dict, GenMine_flag