FunVIP 0.4.1__tar.gz → 0.5.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. funvip-0.5.1/FunVIP.egg-info/PKG-INFO +159 -0
  2. {funvip-0.4.1 → funvip-0.5.1}/FunVIP.egg-info/requires.txt +1 -1
  3. funvip-0.5.1/PKG-INFO +159 -0
  4. {funvip-0.4.1 → funvip-0.5.1}/README.md +16 -3
  5. {funvip-0.4.1 → funvip-0.5.1}/funvip/main.py +21 -0
  6. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/cluster.py +43 -19
  7. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/command.py +7 -2
  8. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/dataset.py +36 -1
  9. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/hasher.py +21 -1
  10. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/tree_interpretation.py +25 -139
  11. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/tree_interpretation_pipe.py +1 -12
  12. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/validate_option.py +27 -13
  13. funvip-0.5.1/funvip/test_dataset/penicillium/DB/DB_Penicillium.xlsx +0 -0
  14. {funvip-0.4.1 → funvip-0.5.1}/pyproject.toml +7 -2
  15. funvip-0.4.1/FunVIP.egg-info/PKG-INFO +0 -30
  16. funvip-0.4.1/PKG-INFO +0 -30
  17. funvip-0.4.1/funvip/test_dataset/penicillium/DB/DB_Penicillium.xlsx +0 -0
  18. {funvip-0.4.1 → funvip-0.5.1}/FunVIP.egg-info/SOURCES.txt +0 -0
  19. {funvip-0.4.1 → funvip-0.5.1}/FunVIP.egg-info/dependency_links.txt +0 -0
  20. {funvip-0.4.1 → funvip-0.5.1}/FunVIP.egg-info/entry_points.txt +0 -0
  21. {funvip-0.4.1 → funvip-0.5.1}/FunVIP.egg-info/top_level.txt +0 -0
  22. {funvip-0.4.1 → funvip-0.5.1}/LICENSE +0 -0
  23. {funvip-0.4.1 → funvip-0.5.1}/MANIFEST.in +0 -0
  24. {funvip-0.4.1 → funvip-0.5.1}/funvip/FunVIP_GUI.py +0 -0
  25. {funvip-0.4.1 → funvip-0.5.1}/funvip/__init__.py +0 -0
  26. {funvip-0.4.1 → funvip-0.5.1}/funvip/data/Option_manager.xlsx +0 -0
  27. {funvip-0.4.1 → funvip-0.5.1}/funvip/data/__init__.py +0 -0
  28. {funvip-0.4.1 → funvip-0.5.1}/funvip/data/genus_line.txt +0 -0
  29. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/BLAST_Windows/Uninstall-ncbi-blast-2.12.0+.exe +0 -0
  30. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/BLAST_Windows/bin/blastn.exe +0 -0
  31. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/BLAST_Windows/bin/cleanup-blastdb-volumes.py +0 -0
  32. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/BLAST_Windows/bin/get_species_taxids.sh +0 -0
  33. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/BLAST_Windows/bin/legacy_blast.pl +0 -0
  34. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/BLAST_Windows/bin/makeblastdb.exe +0 -0
  35. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/BLAST_Windows/bin/nghttp2.dll +0 -0
  36. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/BLAST_Windows/bin/update_blastdb.pl +0 -0
  37. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/BLAST_Windows/doc/README.txt +0 -0
  38. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/FastTree_Windows/FastTree.exe +0 -0
  39. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/Documentation/Gblocks_documentation.html +0 -0
  40. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/Gblocks.exe +0 -0
  41. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/cox2.pir +0 -0
  42. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/cytb.pir +0 -0
  43. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/nad3.pir +0 -0
  44. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/nad5.pir +0 -0
  45. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/nad3.pir +0 -0
  46. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/paths +0 -0
  47. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/MAFFT_LICENSE +0 -0
  48. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/MAFFT_Windows.zip +0 -0
  49. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/RAxML_Windows/GPL-3.0.txt +0 -0
  50. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/RAxML_Windows/README +0 -0
  51. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/RAxML_Windows/raxmlHPC-PTHREADS-AVX2.exe +0 -0
  52. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/__init__.py +0 -0
  53. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/iqtree/bin/iqtree2-click.exe +0 -0
  54. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/iqtree/bin/iqtree2.exe +0 -0
  55. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/iqtree/bin/libiomp5md.dll +0 -0
  56. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/iqtree/example.cf +0 -0
  57. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/iqtree/example.nex +0 -0
  58. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/iqtree/example.phy +0 -0
  59. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/iqtree/models.nex +0 -0
  60. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/LICENSE.md +0 -0
  61. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/README.md +0 -0
  62. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/bin/busybox.exe +0 -0
  63. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/bin/cygbz2-1.dll +0 -0
  64. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/bin/cyggcc_s-seh-1.dll +0 -0
  65. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/bin/cyggomp-1.dll +0 -0
  66. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/bin/cygstdc++-6.dll +0 -0
  67. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/bin/cygwin1.dll +0 -0
  68. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/bin/cygz.dll +0 -0
  69. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/bin/mmseqs.exe +0 -0
  70. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/examples/QUERY.fasta +0 -0
  71. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM10.out +0 -0
  72. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM100.out +0 -0
  73. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM110.out +0 -0
  74. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM120.out +0 -0
  75. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM130.out +0 -0
  76. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM140.out +0 -0
  77. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM150.out +0 -0
  78. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM160.out +0 -0
  79. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM170.out +0 -0
  80. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM180.out +0 -0
  81. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM190.out +0 -0
  82. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM20.out +0 -0
  83. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM30.out +0 -0
  84. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM40.out +0 -0
  85. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM50.out +0 -0
  86. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM60.out +0 -0
  87. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM70.out +0 -0
  88. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM80.out +0 -0
  89. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM90.out +0 -0
  90. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/VTML10.out +0 -0
  91. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/VTML120.out +0 -0
  92. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/VTML160.out +0 -0
  93. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/VTML20.out +0 -0
  94. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/VTML40.out +0 -0
  95. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/VTML80.out +0 -0
  96. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum100.out +0 -0
  97. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum30.out +0 -0
  98. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum35.out +0 -0
  99. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum40.out +0 -0
  100. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum45.out +0 -0
  101. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum50.out +0 -0
  102. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum55.out +0 -0
  103. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum60.out +0 -0
  104. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum62.out +0 -0
  105. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum65.out +0 -0
  106. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum70.out +0 -0
  107. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum75.out +0 -0
  108. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum80.out +0 -0
  109. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum85.out +0 -0
  110. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum90.out +0 -0
  111. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum95.out +0 -0
  112. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/nucleotide.out +0 -0
  113. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/mmseqs.bat +0 -0
  114. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/util/bash-completion.sh +0 -0
  115. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/modeltest-ng_Windows/cyggcc_s-seh-1.dll +0 -0
  116. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/modeltest-ng_Windows/cygstdc++-6.dll +0 -0
  117. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/modeltest-ng_Windows/cygwin1.dll +0 -0
  118. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/modeltest-ng_Windows/modeltest-ng.exe +0 -0
  119. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/AUTHORS +0 -0
  120. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/CHANGELOG +0 -0
  121. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/LICENSE +0 -0
  122. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/README +0 -0
  123. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/bin/libgcc_s_dw2-1.dll +0 -0
  124. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/bin/libstdc++-6.dll +0 -0
  125. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/bin/trimal.exe +0 -0
  126. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/scripts/check_codon_alignments.py +0 -0
  127. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/scripts/compare_trimmed_msas.sh +0 -0
  128. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/scripts/generateRandomAlignmentsUsingAsSeedRealAlignments.py +0 -0
  129. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/scripts/generate_trimmed_msas.sh +0 -0
  130. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/scripts/get_sequence_representative_from_alignment.py +0 -0
  131. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/scripts/get_sequences_gaps_ratio.py +0 -0
  132. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/scripts/remove_shorter_sequences.py +0 -0
  133. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/scripts/selective_trimming_for_dNdS_analyses.based_neighbours.py +0 -0
  134. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/scripts/set_manual_boundaries.py +0 -0
  135. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/alignment.cpp +0 -0
  136. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/alignment.h +0 -0
  137. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/alignment.o +0 -0
  138. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/autAlignment.cpp +0 -0
  139. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/autAlignment.o +0 -0
  140. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.cpp +0 -0
  141. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.h +0 -0
  142. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.o +0 -0
  143. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/defines.h +0 -0
  144. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/main.cpp +0 -0
  145. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/makefile +0 -0
  146. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/makefile.MacOS +0 -0
  147. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/readAl.cpp +0 -0
  148. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/readal.exe +0 -0
  149. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/rwAlignment.cpp +0 -0
  150. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/rwAlignment.o +0 -0
  151. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.cpp +0 -0
  152. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.h +0 -0
  153. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.o +0 -0
  154. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.cpp +0 -0
  155. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.h +0 -0
  156. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.o +0 -0
  157. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/statAl.cpp +0 -0
  158. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/statal.exe +0 -0
  159. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.cpp +0 -0
  160. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.h +0 -0
  161. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.o +0 -0
  162. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/statisticsFiles.cpp +0 -0
  163. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/statisticsFiles.h +0 -0
  164. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.cpp +0 -0
  165. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.h +0 -0
  166. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.o +0 -0
  167. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/utils.cpp +0 -0
  168. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/utils.h +0 -0
  169. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/utils.o +0 -0
  170. {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/values.h +0 -0
  171. {funvip-0.4.1 → funvip-0.5.1}/funvip/preset/.gitignore +0 -0
  172. {funvip-0.4.1 → funvip-0.5.1}/funvip/preset/accurate.yaml +0 -0
  173. {funvip-0.4.1 → funvip-0.5.1}/funvip/preset/fast.yaml +0 -0
  174. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/.gitignore +0 -0
  175. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__init__.py +0 -0
  176. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/CATV_pipe.cpython-310.pyc +0 -0
  177. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/CAT_V.cpython-310.pyc +0 -0
  178. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/CAT_V.cpython-39.pyc +0 -0
  179. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/CAT_V_pipe.cpython-39.pyc +0 -0
  180. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/__init__.cpython-310.pyc +0 -0
  181. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/__init__.cpython-39.pyc +0 -0
  182. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/align.cpython-310.pyc +0 -0
  183. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/cluster.cpython-39.pyc +0 -0
  184. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/dataset.cpython-39.pyc +0 -0
  185. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/ext.cpython-310.pyc +0 -0
  186. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/ext.cpython-39.pyc +0 -0
  187. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/hasher.cpython-39.pyc +0 -0
  188. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/initialize.cpython-39.pyc +0 -0
  189. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/io.cpython-310.pyc +0 -0
  190. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/io.cpython-39.pyc +0 -0
  191. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/logger.cpython-39.pyc +0 -0
  192. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/modeltest.cpython-39.pyc +0 -0
  193. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/multigene.cpython-39.pyc +0 -0
  194. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/ncbi.cpython-39.pyc +0 -0
  195. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/opt_generator.cpython-39.pyc +0 -0
  196. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/reporter.cpython-39.pyc +0 -0
  197. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/search.cpython-39.pyc +0 -0
  198. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/tool.cpython-39.pyc +0 -0
  199. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/validation.cpython-39.pyc +0 -0
  200. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/visualize.cpython-39.pyc +0 -0
  201. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/align.py +0 -0
  202. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/concatenate.py +0 -0
  203. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/ext.py +0 -0
  204. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/initialize.py +0 -0
  205. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/logger.py +0 -0
  206. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/logics.py +0 -0
  207. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/modeltest.py +0 -0
  208. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/ncbi.py +0 -0
  209. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/opt_generator.py +0 -0
  210. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/reporter.py +0 -0
  211. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/save.py +0 -0
  212. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/search.py +0 -0
  213. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/templates/template.html +0 -0
  214. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/tool.py +0 -0
  215. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/tree.py +0 -0
  216. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/trim.py +0 -0
  217. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/validate_input.py +0 -0
  218. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/validation.py +0 -0
  219. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/version.py +0 -0
  220. {funvip-0.4.1 → funvip-0.5.1}/funvip/src/visualize.py +0 -0
  221. {funvip-0.4.1 → funvip-0.5.1}/funvip/test_dataset/penicillium/Options.config +0 -0
  222. {funvip-0.4.1 → funvip-0.5.1}/funvip/test_dataset/penicillium/Query/Query.xlsx +0 -0
  223. {funvip-0.4.1 → funvip-0.5.1}/funvip/test_dataset/penicillium/preset.yaml +0 -0
  224. {funvip-0.4.1 → funvip-0.5.1}/funvip/test_dataset/sanghuangporus/DB/FunVIP_Sanghuangporus_db.xlsx +0 -0
  225. {funvip-0.4.1 → funvip-0.5.1}/funvip/test_dataset/sanghuangporus/Query/FunVIP_Sanghuangporus_query.xlsx +0 -0
  226. {funvip-0.4.1 → funvip-0.5.1}/funvip/test_dataset/sanghuangporus/preset.yaml +0 -0
  227. {funvip-0.4.1 → funvip-0.5.1}/funvip/test_dataset/terrei/DB/FunVIP_Aspergillus_db.xlsx +0 -0
  228. {funvip-0.4.1 → funvip-0.5.1}/funvip/test_dataset/terrei/Query/FunVIP_Aspergillus_query.xlsx +0 -0
  229. {funvip-0.4.1 → funvip-0.5.1}/funvip/test_dataset/terrei/preset.yaml +0 -0
  230. {funvip-0.4.1 → funvip-0.5.1}/setup.cfg +0 -0
@@ -0,0 +1,159 @@
1
+ Metadata-Version: 2.4
2
+ Name: FunVIP
3
+ Version: 0.5.1
4
+ Summary: Fungal Validation & Identification Pipeline
5
+ Author-email: Changwan Seo <wan101010@snu.ac.kr>
6
+ License: GPL-3.0
7
+ Project-URL: Homepage, https://github.com/Changwanseo/FunVIP
8
+ Requires-Python: <3.13,>=3.9
9
+ Description-Content-Type: text/markdown
10
+ License-File: LICENSE
11
+ Requires-Dist: biopython==1.84
12
+ Requires-Dist: ete3==3.1.3
13
+ Requires-Dist: Cython
14
+ Requires-Dist: dendropy
15
+ Requires-Dist: GenMine<1.4.0,>=1.3.0
16
+ Requires-Dist: lxml
17
+ Requires-Dist: matplotlib
18
+ Requires-Dist: numpy<2.0.0
19
+ Requires-Dist: openpyxl==3.1.0
20
+ Requires-Dist: pandas==2.2.2
21
+ Requires-Dist: psutil
22
+ Requires-Dist: pyyaml
23
+ Requires-Dist: sip>=4.19.4
24
+ Requires-Dist: scikit-learn
25
+ Requires-Dist: scipy
26
+ Requires-Dist: tabulate
27
+ Requires-Dist: unidecode==1.2.0
28
+ Requires-Dist: xlrd==2.0.1
29
+ Requires-Dist: xlsxwriter
30
+ Requires-Dist: xmltodict==0.12.0
31
+ Requires-Dist: PyQt5>=5.15.0; sys_platform != "darwin"
32
+ Dynamic: license-file
33
+
34
+
35
+ # FunVIP [![DOI](https://zenodo.org/badge/588465720.svg)](https://zenodo.org/doi/10.5281/zenodo.10714946)
36
+
37
+
38
+ FunVIP is now published please cite:
39
+ #### Seo CW, Yoo S, Cho Y, Kim JS, Steinegger M, Lim YW. FunVIP: Fungal Validation and Identification Pipeline based on phylogenetic analysis. J. Microbiol. 2025;63(4):e2411017.
40
+ <br><br/>
41
+
42
+
43
+
44
+
45
+ ### **Fun**gal **V**alidation & **I**dentification **P**ipeline
46
+ #### An automatic tree-based sequence identification and validation pipeline for fungal (or maybe other) species
47
+
48
+
49
+
50
+ - Automatic tree-based identification
51
+ - Works with multiple genetic marker
52
+ - Database sequence validation algorithm implemented
53
+
54
+ ![figure1 - ver17A](https://github.com/user-attachments/assets/22a50a62-14e8-41a7-87a0-8f5a1f9c3f62)
55
+
56
+ Bug reports are always welcomed
57
+ <br><br/>
58
+
59
+
60
+
61
+ #### IMPORTANT NOTICE: The python dependency for Linux platform has changed from 3.12 to 3.11 for TCS inclusion. Please remake conda environment for FunVIP 0.3.25 update
62
+
63
+ ## Tutorial
64
+ * [Part 1 - Getting started!](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/tutorial.md)
65
+ * [Part 2 - Preparing database and query](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/tutorial2.md)
66
+ * [Advanced tips](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/advanced.md)
67
+ <br><br/>
68
+ ## Documentation
69
+ * See [Documentation](https://github.com/Changwanseo/FunVIP/blob/main/Documentation.md) for advanced usage !
70
+ <br><br/>
71
+ ## Requirements
72
+ - Conda or Mamba environment
73
+
74
+ \* See [here](https://conda.io/projects/conda/en/latest/user-guide/install/index.html) for how to install conda environment
75
+
76
+ \* Recently, Mamba is a lot faster than conda. See [here](https://github.com/conda-forge/miniforge?tab=readme-ov-file) to how to install mamba environment
77
+ <br><br/>
78
+ ## Installation
79
+ * [Windows](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/installation.md##Windows)
80
+ * [Mac - apple silicon](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/installation.md##Apple )
81
+ * [Linux](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/installation.md##Linux)
82
+ * [from source](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/installation.md##Installation)
83
+ <br><br/>
84
+ ## Usage
85
+ ```FunVIP --db {Your database file} --query {Your query file} --email {Your email} --gene {Your genes} --preset {fast or accurate}```
86
+ <br><br/>
87
+ ### Example
88
+ ```FunVIP --db Penicillium.xlsx --query Query.xlsx --email {Your email} --thread 8 --gene ITS BenA RPB2 CaM --preset fast```
89
+
90
+ \* See documentation for detailed usage
91
+ <br><br/>
92
+
93
+
94
+
95
+
96
+
97
+
98
+ ## How to make database?
99
+ ![figure1 - ver17B](https://github.com/user-attachments/assets/0043e6f6-7470-4c2b-bc96-b51f41c43ee4)
100
+
101
+
102
+
103
+
104
+ [See example database here](https://github.com/Changwanseo/FunVIP/blob/main/funvip/test_dataset/penicillium/DB/DB_Penicillium.xlsx)
105
+
106
+
107
+ <!--##
108
+ ## What query formats can be used?
109
+ #### Query formats can be either
110
+ fasta (```.fa```, ```.fna```, ```.fas```, ```.fasta```, ```.txt```) or
111
+ tabular (```.xlsx```, ```.csv```, ```.parquet```, ```.ftr```) form
112
+
113
+ - fasta form : Do not use ambiguous accessions in your fasta name. For example, accessions "A1234" and "A123" can be confused in pipeline. Section and genus name of the sequences will be automatically assigned according to your database. So if you want to fix it, use tabular form
114
+ - tabular form : your table should include ```ID```, and ```{gene names}``` (highly recommended for multigene analysis)-->
115
+
116
+ <!--## Tips for method selection
117
+ * SEARCH_METHOD : blast is faster for smaller dataset, while mmseqs are faster in huge dataset, but consumes a lot of memory
118
+ * ALIGNMENT_METHOD : currently mafft is only available.
119
+ * TRIMMING_METHOD : use trimal or gblocks, in your favor. gblocks usally cuts more, but can be differ by advanced option. Use none if you have enough time and resource for calculation
120
+ * MODEL_METHOD : model method is currently not working good enough please wait
121
+ * TREE_METHOD : fasttree is fastest, but least accurate (However, still a lot accurate than NJ tree). It is treated that iqtree is faster but slightly less accurate than raxml, but iqtree requires at least 1000 bootstrap. So in case of speed, raxml could be a little bit faster when low bootstrap selected-->
122
+
123
+ ## Results
124
+ * ```Section Assignment.xlsx``` : Your clustering result is here. You can find which of your sequences are clustered to which section
125
+ * ```Identification_result.xlsx``` : Your final identification result. Shows how your sequences were assigned to species level through tree-based identification
126
+ * ```report.xlsx``` : overall statistics about the tree. If your find taxon ends with numbers, these taxon are found to be paraphyletic, so should be checked
127
+ * ```/Tree/{section}_{gene}.svg``` : Final collapsed tree in svg format. Can be edited in vector graphics programs, or in powerpoint (by ungroup)
128
+ * ```/Tree/{section}_{gene}_original.svg ``` : Uncollapsed tree for inspection
129
+
130
+ * Example output tree of FunVIP
131
+ ![image](https://github.com/user-attachments/assets/7291c990-62d0-4579-8ae7-adc5d39a7fed)
132
+
133
+
134
+
135
+ ## Scheduling
136
+ 1. ~~Beta release part 1 (2023 Feburary ~ As paper published, ver 0.3)
137
+ Will be tested by our lab memebers to fix bugs and advance features~~
138
+ 2. Beta release part 2 (As paper published ~ When pipeline gets stabled, ver 0.4)
139
+ Will be tested by peer taxonomists
140
+ 3. Stable release (ver 1.0)
141
+
142
+ ## License
143
+ [GPL 3.0](https://github.com/Changwanseo/FunVIP/blob/main/LICENSE)
144
+
145
+
146
+ <!--
147
+ ## Installation with conda (May not work with Linux or Mac)
148
+ 1. ```conda create -n FunVO{ python=3.10```
149
+ 2. ```conda activate FunVIP```
150
+ 3. ```conda install -c cwseo FunVIP```
151
+ 4. run ```FunVIP --test Terrei --email [your email] ``` to check installation
152
+ If this one fails, use next one
153
+ -->
154
+ <!--### GUI mode (\*Currently under development)
155
+ 1. Go to ~/FunID-dev
156
+ 2. ```streamlit run FunID_GUI.py```
157
+ * GUI run is on experimental
158
+ * If you want to edit GUI options, edit ```Option_manager.xlsx``` and variables in ```FunID_GUI.py```
159
+ ### Server mode (\* Currently under development)-->
@@ -2,7 +2,7 @@ biopython==1.84
2
2
  ete3==3.1.3
3
3
  Cython
4
4
  dendropy
5
- GenMine<1.2.0,>=1.1.0
5
+ GenMine<1.4.0,>=1.3.0
6
6
  lxml
7
7
  matplotlib
8
8
  numpy<2.0.0
funvip-0.5.1/PKG-INFO ADDED
@@ -0,0 +1,159 @@
1
+ Metadata-Version: 2.4
2
+ Name: FunVIP
3
+ Version: 0.5.1
4
+ Summary: Fungal Validation & Identification Pipeline
5
+ Author-email: Changwan Seo <wan101010@snu.ac.kr>
6
+ License: GPL-3.0
7
+ Project-URL: Homepage, https://github.com/Changwanseo/FunVIP
8
+ Requires-Python: <3.13,>=3.9
9
+ Description-Content-Type: text/markdown
10
+ License-File: LICENSE
11
+ Requires-Dist: biopython==1.84
12
+ Requires-Dist: ete3==3.1.3
13
+ Requires-Dist: Cython
14
+ Requires-Dist: dendropy
15
+ Requires-Dist: GenMine<1.4.0,>=1.3.0
16
+ Requires-Dist: lxml
17
+ Requires-Dist: matplotlib
18
+ Requires-Dist: numpy<2.0.0
19
+ Requires-Dist: openpyxl==3.1.0
20
+ Requires-Dist: pandas==2.2.2
21
+ Requires-Dist: psutil
22
+ Requires-Dist: pyyaml
23
+ Requires-Dist: sip>=4.19.4
24
+ Requires-Dist: scikit-learn
25
+ Requires-Dist: scipy
26
+ Requires-Dist: tabulate
27
+ Requires-Dist: unidecode==1.2.0
28
+ Requires-Dist: xlrd==2.0.1
29
+ Requires-Dist: xlsxwriter
30
+ Requires-Dist: xmltodict==0.12.0
31
+ Requires-Dist: PyQt5>=5.15.0; sys_platform != "darwin"
32
+ Dynamic: license-file
33
+
34
+
35
+ # FunVIP [![DOI](https://zenodo.org/badge/588465720.svg)](https://zenodo.org/doi/10.5281/zenodo.10714946)
36
+
37
+
38
+ FunVIP is now published please cite:
39
+ #### Seo CW, Yoo S, Cho Y, Kim JS, Steinegger M, Lim YW. FunVIP: Fungal Validation and Identification Pipeline based on phylogenetic analysis. J. Microbiol. 2025;63(4):e2411017.
40
+ <br><br/>
41
+
42
+
43
+
44
+
45
+ ### **Fun**gal **V**alidation & **I**dentification **P**ipeline
46
+ #### An automatic tree-based sequence identification and validation pipeline for fungal (or maybe other) species
47
+
48
+
49
+
50
+ - Automatic tree-based identification
51
+ - Works with multiple genetic marker
52
+ - Database sequence validation algorithm implemented
53
+
54
+ ![figure1 - ver17A](https://github.com/user-attachments/assets/22a50a62-14e8-41a7-87a0-8f5a1f9c3f62)
55
+
56
+ Bug reports are always welcomed
57
+ <br><br/>
58
+
59
+
60
+
61
+ #### IMPORTANT NOTICE: The python dependency for Linux platform has changed from 3.12 to 3.11 for TCS inclusion. Please remake conda environment for FunVIP 0.3.25 update
62
+
63
+ ## Tutorial
64
+ * [Part 1 - Getting started!](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/tutorial.md)
65
+ * [Part 2 - Preparing database and query](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/tutorial2.md)
66
+ * [Advanced tips](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/advanced.md)
67
+ <br><br/>
68
+ ## Documentation
69
+ * See [Documentation](https://github.com/Changwanseo/FunVIP/blob/main/Documentation.md) for advanced usage !
70
+ <br><br/>
71
+ ## Requirements
72
+ - Conda or Mamba environment
73
+
74
+ \* See [here](https://conda.io/projects/conda/en/latest/user-guide/install/index.html) for how to install conda environment
75
+
76
+ \* Recently, Mamba is a lot faster than conda. See [here](https://github.com/conda-forge/miniforge?tab=readme-ov-file) to how to install mamba environment
77
+ <br><br/>
78
+ ## Installation
79
+ * [Windows](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/installation.md##Windows)
80
+ * [Mac - apple silicon](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/installation.md##Apple )
81
+ * [Linux](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/installation.md##Linux)
82
+ * [from source](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/installation.md##Installation)
83
+ <br><br/>
84
+ ## Usage
85
+ ```FunVIP --db {Your database file} --query {Your query file} --email {Your email} --gene {Your genes} --preset {fast or accurate}```
86
+ <br><br/>
87
+ ### Example
88
+ ```FunVIP --db Penicillium.xlsx --query Query.xlsx --email {Your email} --thread 8 --gene ITS BenA RPB2 CaM --preset fast```
89
+
90
+ \* See documentation for detailed usage
91
+ <br><br/>
92
+
93
+
94
+
95
+
96
+
97
+
98
+ ## How to make database?
99
+ ![figure1 - ver17B](https://github.com/user-attachments/assets/0043e6f6-7470-4c2b-bc96-b51f41c43ee4)
100
+
101
+
102
+
103
+
104
+ [See example database here](https://github.com/Changwanseo/FunVIP/blob/main/funvip/test_dataset/penicillium/DB/DB_Penicillium.xlsx)
105
+
106
+
107
+ <!--##
108
+ ## What query formats can be used?
109
+ #### Query formats can be either
110
+ fasta (```.fa```, ```.fna```, ```.fas```, ```.fasta```, ```.txt```) or
111
+ tabular (```.xlsx```, ```.csv```, ```.parquet```, ```.ftr```) form
112
+
113
+ - fasta form : Do not use ambiguous accessions in your fasta name. For example, accessions "A1234" and "A123" can be confused in pipeline. Section and genus name of the sequences will be automatically assigned according to your database. So if you want to fix it, use tabular form
114
+ - tabular form : your table should include ```ID```, and ```{gene names}``` (highly recommended for multigene analysis)-->
115
+
116
+ <!--## Tips for method selection
117
+ * SEARCH_METHOD : blast is faster for smaller dataset, while mmseqs are faster in huge dataset, but consumes a lot of memory
118
+ * ALIGNMENT_METHOD : currently mafft is only available.
119
+ * TRIMMING_METHOD : use trimal or gblocks, in your favor. gblocks usally cuts more, but can be differ by advanced option. Use none if you have enough time and resource for calculation
120
+ * MODEL_METHOD : model method is currently not working good enough please wait
121
+ * TREE_METHOD : fasttree is fastest, but least accurate (However, still a lot accurate than NJ tree). It is treated that iqtree is faster but slightly less accurate than raxml, but iqtree requires at least 1000 bootstrap. So in case of speed, raxml could be a little bit faster when low bootstrap selected-->
122
+
123
+ ## Results
124
+ * ```Section Assignment.xlsx``` : Your clustering result is here. You can find which of your sequences are clustered to which section
125
+ * ```Identification_result.xlsx``` : Your final identification result. Shows how your sequences were assigned to species level through tree-based identification
126
+ * ```report.xlsx``` : overall statistics about the tree. If your find taxon ends with numbers, these taxon are found to be paraphyletic, so should be checked
127
+ * ```/Tree/{section}_{gene}.svg``` : Final collapsed tree in svg format. Can be edited in vector graphics programs, or in powerpoint (by ungroup)
128
+ * ```/Tree/{section}_{gene}_original.svg ``` : Uncollapsed tree for inspection
129
+
130
+ * Example output tree of FunVIP
131
+ ![image](https://github.com/user-attachments/assets/7291c990-62d0-4579-8ae7-adc5d39a7fed)
132
+
133
+
134
+
135
+ ## Scheduling
136
+ 1. ~~Beta release part 1 (2023 Feburary ~ As paper published, ver 0.3)
137
+ Will be tested by our lab memebers to fix bugs and advance features~~
138
+ 2. Beta release part 2 (As paper published ~ When pipeline gets stabled, ver 0.4)
139
+ Will be tested by peer taxonomists
140
+ 3. Stable release (ver 1.0)
141
+
142
+ ## License
143
+ [GPL 3.0](https://github.com/Changwanseo/FunVIP/blob/main/LICENSE)
144
+
145
+
146
+ <!--
147
+ ## Installation with conda (May not work with Linux or Mac)
148
+ 1. ```conda create -n FunVO{ python=3.10```
149
+ 2. ```conda activate FunVIP```
150
+ 3. ```conda install -c cwseo FunVIP```
151
+ 4. run ```FunVIP --test Terrei --email [your email] ``` to check installation
152
+ If this one fails, use next one
153
+ -->
154
+ <!--### GUI mode (\*Currently under development)
155
+ 1. Go to ~/FunID-dev
156
+ 2. ```streamlit run FunID_GUI.py```
157
+ * GUI run is on experimental
158
+ * If you want to edit GUI options, edit ```Option_manager.xlsx``` and variables in ```FunID_GUI.py```
159
+ ### Server mode (\* Currently under development)-->
@@ -1,18 +1,31 @@
1
1
 
2
2
  # FunVIP [![DOI](https://zenodo.org/badge/588465720.svg)](https://zenodo.org/doi/10.5281/zenodo.10714946)
3
+
4
+
5
+ FunVIP is now published please cite:
6
+ #### Seo CW, Yoo S, Cho Y, Kim JS, Steinegger M, Lim YW. FunVIP: Fungal Validation and Identification Pipeline based on phylogenetic analysis. J. Microbiol. 2025;63(4):e2411017.
7
+ <br><br/>
8
+
9
+
10
+
11
+
3
12
  ### **Fun**gal **V**alidation & **I**dentification **P**ipeline
4
13
  #### An automatic tree-based sequence identification and validation pipeline for fungal (or maybe other) species
5
14
 
15
+
16
+
6
17
  - Automatic tree-based identification
7
18
  - Works with multiple genetic marker
8
19
  - Database sequence validation algorithm implemented
9
20
 
10
21
  ![figure1 - ver17A](https://github.com/user-attachments/assets/22a50a62-14e8-41a7-87a0-8f5a1f9c3f62)
11
22
 
12
- This is Beta release. Bug reports are welcomed
23
+ Bug reports are always welcomed
13
24
  <br><br/>
14
25
 
15
- ### IMPORTANT NOTICE: The python dependency for Linux platform has changed from 3.12 to 3.11 for TCS inclusion. Please remake conda environment for FunVIP 0.3.25 update
26
+
27
+
28
+ #### IMPORTANT NOTICE: The python dependency for Linux platform has changed from 3.12 to 3.11 for TCS inclusion. Please remake conda environment for FunVIP 0.3.25 update
16
29
 
17
30
  ## Tutorial
18
31
  * [Part 1 - Getting started!](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/tutorial.md)
@@ -88,7 +101,7 @@ tabular (```.xlsx```, ```.csv```, ```.parquet```, ```.ftr```) form
88
101
 
89
102
  ## Scheduling
90
103
  1. ~~Beta release part 1 (2023 Feburary ~ As paper published, ver 0.3)
91
- Will be tested by our lab memebers to fix bugs and advance features~~ FunVIP article is currently accepted. Will be published soon.
104
+ Will be tested by our lab memebers to fix bugs and advance features~~
92
105
  2. Beta release part 2 (As paper published ~ When pipeline gets stabled, ver 0.4)
93
106
  Will be tested by peer taxonomists
94
107
  3. Stable release (ver 1.0)
@@ -410,3 +410,24 @@ def main():
410
410
  logging.info(f"Time report generation: {round(time_end-time_visualize,3)}s")
411
411
  except:
412
412
  logging.warning(f"Failed logging reoprt generation time")
413
+
414
+ # At the end of the run, print critical messages once again to be noticed
415
+ with open(path.criticallog, "r") as frclog:
416
+ critical_log_lines = frclog.readlines()
417
+
418
+ critical_logs = []
419
+ flag_critical = 0
420
+ for line in critical_log_lines:
421
+ if "[CRITICAL]" in line:
422
+ flag_critical = 1
423
+ elif "[WARNING]" in line or "[ERROR]" in line:
424
+ flag_critical = 0
425
+
426
+ if flag_critical == 1:
427
+ critical_logs.append(line)
428
+
429
+ if len(critical_logs) > 0:
430
+ print("\n!!!<<<IMPORTANT NOTICE FROM FUNVIP RUN>>>!!!")
431
+
432
+ for line in critical_logs:
433
+ print(line)
@@ -114,6 +114,7 @@ def assign_gene(result_dict, V, cutoff=0.99):
114
114
  return V
115
115
 
116
116
 
117
+ # This function assigns group to each FI
117
118
  def cluster(FI, V_list_group, V_cSR, path, opt):
118
119
  # Reduce memory by focusing on relevant rows
119
120
  df_search = V_cSR[V_cSR["qseqid"] == FI.hash]
@@ -222,23 +223,23 @@ def append_outgroup(V_list_FI, df_search, gene, group, path, opt):
222
223
  # split that same group to include all to alignment, and leave other groups for outgroup selection
223
224
  cutoff_df = cutoff_df[cutoff_df["subject_group"] != group]
224
225
 
225
- ## For ambiugous database, mostly because of contaminated database
226
+ ## Add suspicious database, mostly because of contaminated database
227
+ # Use term "ambiguous" instead of "suspicious" because of previous compatibility
226
228
  # For each of the input, should use different cutoff
227
229
  ambiguous_db = set()
228
- for qseqid, _df in cutoff_set_df.groupby(["qseqid"]):
229
- # Select dataframe corresponding to current qseqid
230
- df_qseqid = df_search[df_search["qseqid"] == qseqid]
231
- """
232
- print(
233
- f"Ambiguous ingroup cutoff selected for query {qseqid} group {group} gene {gene} cutoff {min(list(_df['bitscore']))}"
234
- )
235
- """
236
- # Get the list of subjects, which is closer than furtest ingroup
237
- ambiguous_df = df_qseqid[df_qseqid["bitscore"] >= min(list(_df["bitscore"]))]
238
- # Within the furthest match, get possible ingroups with ambiguous group
239
- ambiguous_df = ambiguous_df[ambiguous_df["subject_group"] != group]
240
- # Add inner ambiugities to ambiguous db
241
- ambiguous_db.update([FI_dict[i] for i in list(ambiguous_df["sseqid"])])
230
+ if opt.suspicious is True:
231
+ for qseqid, _df in cutoff_set_df.groupby(["qseqid"]):
232
+ # Select dataframe corresponding to current qseqid
233
+ df_qseqid = df_search[df_search["qseqid"] == qseqid[0]]
234
+
235
+ # Get the list of subjects, which is closer than furtest ingroup
236
+ ambiguous_df = df_qseqid[
237
+ df_qseqid["bitscore"] >= min(list(_df["bitscore"]))
238
+ ]
239
+ # Within the furthest match, get possible ingroups with ambiguous group
240
+ ambiguous_df = ambiguous_df[ambiguous_df["subject_group"] != group]
241
+ # Add inner ambiugities to ambiguous db
242
+ ambiguous_db.update([FI_dict[i] for i in list(ambiguous_df["sseqid"])])
242
243
 
243
244
  ambiguous_db = list(ambiguous_db)
244
245
 
@@ -308,12 +309,20 @@ def append_outgroup(V_list_FI, df_search, gene, group, path, opt):
308
309
  f"Outgroup [{subject_group}] selected to [{group}]\n {text_outgroup_list}"
309
310
  )
310
311
 
312
+ # Move outgroup within ambiguous db to outgroup
313
+ for FI in ambiguous_db:
314
+ if FI.group == subject_group:
315
+ ambiguous_db.remove(FI)
316
+ outgroup_dict[subject_group].append(FI)
317
+
311
318
  return (
312
319
  group,
313
320
  gene,
314
321
  outgroup_dict[subject_group],
315
322
  ambiguous_db,
316
323
  )
324
+
325
+ # If not use the outgroup sequences with the maximum number
317
326
  else:
318
327
  if len(outgroup_dict[subject_group]) > max_cnt:
319
328
  max_cnt = len(outgroup_dict[subject_group])
@@ -330,6 +339,12 @@ def append_outgroup(V_list_FI, df_search, gene, group, path, opt):
330
339
  f"Final outgroup selection for group {group} : {outgroup_dict[max_group]}"
331
340
  )
332
341
 
342
+ # Move outgroup within ambiguous db to outgroup
343
+ for FI in ambiguous_db:
344
+ if FI.group == max_group:
345
+ ambiguous_db.remove(FI)
346
+ outgroup_dict[max_group].append(FI)
347
+
333
348
  return (group, gene, outgroup_dict[max_group], ambiguous_db)
334
349
 
335
350
  # If outgroup cannot be selected
@@ -507,6 +522,7 @@ def pipe_append_outgroup(V, path, opt):
507
522
 
508
523
  # append outgroup by running result
509
524
  # (group, gene, outgroup, ambiguous_group)
525
+ critical_flag = 0
510
526
  for result in result_append_outgroup:
511
527
  # Parsing result
512
528
  group = result[0]
@@ -524,9 +540,10 @@ def pipe_append_outgroup(V, path, opt):
524
540
  print(f"query: {len(V.dict_dataset[group][gene].list_qr_FI)}")
525
541
 
526
542
  if len(outgroup) == 0 and len(ambiguous_group) == 0:
527
- logging.warning(
543
+ logging.critical(
528
544
  f"Removing {group} {gene} from analysis because outgroup cannot be selected"
529
545
  )
546
+ critical_flag = 1
530
547
  V.dict_dataset[group].pop(gene, None)
531
548
  elif (
532
549
  len(outgroup)
@@ -535,15 +552,17 @@ def pipe_append_outgroup(V, path, opt):
535
552
  + len(V.dict_dataset[group][gene].list_qr_FI)
536
553
  < 4
537
554
  ):
538
- logging.warning(
555
+ logging.critical(
539
556
  f"Removing {group} {gene} from analysis because not enough sequences are provided to infer phylogenetic tree"
540
557
  )
558
+ critical_flag = 1
541
559
  V.dict_dataset[group].pop(gene, None)
542
560
 
543
561
  else:
544
562
  V.dict_dataset[group][gene].list_og_FI = outgroup
563
+
545
564
  # Add ambiguous group to FI
546
- if opt.ambiguous is True:
565
+ if opt.suspicious is True:
547
566
  V.dict_dataset[group][gene].list_db_FI += ambiguous_group
548
567
  # Add outgroup and db in to dict_hash_FI
549
568
 
@@ -552,11 +571,16 @@ def pipe_append_outgroup(V, path, opt):
552
571
  for group in groups:
553
572
  try:
554
573
  if len(V.dict_dataset[group]) == 0:
555
- logging.warning(
574
+ logging.critical(
556
575
  f"Removing {group} from analysis because outgroup cannot be selected to all genes"
557
576
  )
577
+ critical_flag = 1
558
578
  V.dict_dataset.pop(group, None)
559
579
  except:
560
580
  pass
561
581
 
582
+ # Terminate if terminate option is given, and critical error occurs
583
+ if critical_flag == 1 and opt.terminate is True:
584
+ raise Exception
585
+
562
586
  return V, path, opt
@@ -309,9 +309,14 @@ class CommandParser:
309
309
  type=int,
310
310
  )
311
311
  group_advanced.add_argument(
312
- "--noambiguous",
312
+ "--nosuspicious",
313
313
  action="store_true",
314
- help="Do not include ambiguous samples for sequence-set. Mostly for metabarcoding analysis. It may result wrong result with problematic database.",
314
+ help="Do not include suspicious samples for sequence-set. Mostly for metabarcoding analysis. May deduce inaccurate result with problematic database.",
315
+ )
316
+ group_advanced.add_argument(
317
+ "--terminate",
318
+ action="store_true",
319
+ help="Terminate FunVIP run when critical error detected",
315
320
  )
316
321
 
317
322
  # Cache
@@ -462,6 +462,8 @@ class FunVIP_var:
462
462
  fail_list = []
463
463
  remove_dict = {}
464
464
  tree_hash_dict = hasher.encode(self.list_FI, newick=True)
465
+
466
+ critical_flag = 0
465
467
  for group in self.dict_dataset:
466
468
  remove_dict[group] = {}
467
469
  for gene in self.dict_dataset[group]:
@@ -545,9 +547,38 @@ class FunVIP_var:
545
547
  ## If all value of vectors are zero, it means that all regions have at least one gap
546
548
  ## Raise warning for this
547
549
  if np.all((vector_products == 0)):
548
- logging.warning(
550
+ logging.critical(
549
551
  f"Alignment for {group} {gene} does not have any overlapping regions! Removing from analysis"
550
552
  )
553
+
554
+ critical_flag = 1
555
+
556
+ # Report one non_overlapping pair
557
+ for i in range(len(seq_list) - 1):
558
+ seq1 = seq_list[i]
559
+ seq1_hash = seq1.id
560
+ seq1_str = str(seq.seq)
561
+
562
+ for j in range(i + 1, len(seq_list)):
563
+ seq2 = seq_list[j]
564
+ seq2_hash = seq2.id
565
+ seq2_str = str(seq.seq)
566
+
567
+ has_overlap = False
568
+
569
+ for k in range(len(seq1_str)):
570
+ if seq1_str[k] != "-" and seq2_str[k] != "-":
571
+ has_overlap = True
572
+ break
573
+
574
+ seq1_id = self.dict_hash_FI[seq1_hash]
575
+ seq2_id = self.dict_hash_FI[seq2_hash]
576
+
577
+ logging.critical(
578
+ f"At least one pair of sequence does not overlap, such as {seq1_id} and {seq2_id}"
579
+ )
580
+ critical_flag = 1
581
+
551
582
  fail_list.append((group, gene))
552
583
  # for tree, use hash dict with genus and species information
553
584
  # Decoding process in done in tree building processes, so these alignments cannot be decoded. So decode them here
@@ -575,6 +606,10 @@ class FunVIP_var:
575
606
  # If alignment corresponding to dataset does not exists, raise warning or error
576
607
  pass
577
608
 
609
+ # Terminate if terminate option is given, and critical error occurs
610
+ if critical_flag == 1 and opt.terminate is True:
611
+ raise Exception
612
+
578
613
  # Remove bad datasets
579
614
  for fail in fail_list:
580
615
  group = fail[0]
@@ -18,6 +18,11 @@ def newick_legal(string: str) -> str:
18
18
  return str(string)
19
19
 
20
20
 
21
+ # Fix "&" sign appropriate for svg
22
+ def svg_legal(string: str) -> str:
23
+ return string.replace("&", "&amp;")
24
+
25
+
21
26
  # Encode funinfo_list and return hash dict
22
27
  def encode(funinfo_list: list, newick: bool = False) -> dict:
23
28
  hash_dict = {}
@@ -53,13 +58,28 @@ def encode(funinfo_list: list, newick: bool = False) -> dict:
53
58
  # Decode given file with given hash_dict
54
59
 
55
60
 
56
- def decode(hash_dict: dict, file: str, out: str, newick: bool = True) -> None:
61
+ def decode(
62
+ hash_dict: dict, file: str, out: str, newick: bool = True, svg: bool = False
63
+ ) -> None:
57
64
  with open(file, "rt") as fp:
58
65
  content = fp.read()
59
66
 
67
+ if newick and svg:
68
+ hash_dict = {
69
+ re.escape(k): svg_legal(newick_legal(v)) for k, v in hash_dict.items()
70
+ }
71
+ elif newick:
72
+ hash_dict = {re.escape(k): newick_legal(v) for k, v in hash_dict.items()}
73
+ elif svg:
74
+ hash_dict = {re.escape(k): svg_legal(v) for k, v in hash_dict.items()}
75
+ else:
76
+ hash_dict = {re.escape(k): v for k, v in hash_dict.items()}
77
+
78
+ """
60
79
  hash_dict = {
61
80
  re.escape(k): (newick_legal(v) if newick else v) for k, v in hash_dict.items()
62
81
  }
82
+ """
63
83
  pattern = re.compile("|".join(hash_dict.keys()))
64
84
 
65
85
  # Perform the substitution