FunVIP 0.3.22__tar.gz → 0.3.22.2__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 (219) hide show
  1. {funvip-0.3.22 → funvip-0.3.22.2}/FunVIP.egg-info/PKG-INFO +1 -1
  2. {funvip-0.3.22 → funvip-0.3.22.2}/PKG-INFO +1 -1
  3. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/main.py +2 -0
  4. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/dataset.py +4 -4
  5. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/reporter.py +12 -0
  6. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/save.py +1 -1
  7. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/validate_input.py +179 -86
  8. {funvip-0.3.22 → funvip-0.3.22.2}/pyproject.toml +1 -1
  9. {funvip-0.3.22 → funvip-0.3.22.2}/FunVIP.egg-info/SOURCES.txt +0 -0
  10. {funvip-0.3.22 → funvip-0.3.22.2}/FunVIP.egg-info/dependency_links.txt +0 -0
  11. {funvip-0.3.22 → funvip-0.3.22.2}/FunVIP.egg-info/entry_points.txt +0 -0
  12. {funvip-0.3.22 → funvip-0.3.22.2}/FunVIP.egg-info/requires.txt +0 -0
  13. {funvip-0.3.22 → funvip-0.3.22.2}/FunVIP.egg-info/top_level.txt +0 -0
  14. {funvip-0.3.22 → funvip-0.3.22.2}/LICENSE +0 -0
  15. {funvip-0.3.22 → funvip-0.3.22.2}/MANIFEST.in +0 -0
  16. {funvip-0.3.22 → funvip-0.3.22.2}/README.md +0 -0
  17. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/FunVIP_GUI.py +0 -0
  18. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/__init__.py +0 -0
  19. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/data/Option_manager.xlsx +0 -0
  20. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/data/__init__.py +0 -0
  21. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/data/genus_line.txt +0 -0
  22. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/BLAST_Windows/Uninstall-ncbi-blast-2.12.0+.exe +0 -0
  23. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/BLAST_Windows/bin/blastn.exe +0 -0
  24. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/BLAST_Windows/bin/cleanup-blastdb-volumes.py +0 -0
  25. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/BLAST_Windows/bin/get_species_taxids.sh +0 -0
  26. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/BLAST_Windows/bin/legacy_blast.pl +0 -0
  27. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/BLAST_Windows/bin/makeblastdb.exe +0 -0
  28. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/BLAST_Windows/bin/nghttp2.dll +0 -0
  29. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/BLAST_Windows/bin/update_blastdb.pl +0 -0
  30. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/BLAST_Windows/doc/README.txt +0 -0
  31. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/FastTree_Windows/FastTree.exe +0 -0
  32. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/Documentation/Gblocks_documentation.html +0 -0
  33. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/Gblocks.exe +0 -0
  34. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/cox2.pir +0 -0
  35. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/cytb.pir +0 -0
  36. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/nad3.pir +0 -0
  37. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/nad5.pir +0 -0
  38. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/nad3.pir +0 -0
  39. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/paths +0 -0
  40. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/MAFFT_LICENSE +0 -0
  41. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/MAFFT_Windows.zip +0 -0
  42. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/RAxML_Windows/GPL-3.0.txt +0 -0
  43. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/RAxML_Windows/README +0 -0
  44. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/RAxML_Windows/raxmlHPC-PTHREADS-AVX2.exe +0 -0
  45. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/__init__.py +0 -0
  46. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/iqtree/bin/iqtree2-click.exe +0 -0
  47. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/iqtree/bin/iqtree2.exe +0 -0
  48. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/iqtree/bin/libiomp5md.dll +0 -0
  49. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/iqtree/example.cf +0 -0
  50. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/iqtree/example.nex +0 -0
  51. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/iqtree/example.phy +0 -0
  52. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/iqtree/models.nex +0 -0
  53. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/LICENSE.md +0 -0
  54. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/README.md +0 -0
  55. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/bin/busybox.exe +0 -0
  56. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/bin/cygbz2-1.dll +0 -0
  57. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/bin/cyggcc_s-seh-1.dll +0 -0
  58. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/bin/cyggomp-1.dll +0 -0
  59. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/bin/cygstdc++-6.dll +0 -0
  60. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/bin/cygwin1.dll +0 -0
  61. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/bin/cygz.dll +0 -0
  62. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/bin/mmseqs.exe +0 -0
  63. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/examples/QUERY.fasta +0 -0
  64. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM10.out +0 -0
  65. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM100.out +0 -0
  66. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM110.out +0 -0
  67. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM120.out +0 -0
  68. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM130.out +0 -0
  69. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM140.out +0 -0
  70. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM150.out +0 -0
  71. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM160.out +0 -0
  72. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM170.out +0 -0
  73. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM180.out +0 -0
  74. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM190.out +0 -0
  75. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM20.out +0 -0
  76. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM30.out +0 -0
  77. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM40.out +0 -0
  78. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM50.out +0 -0
  79. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM60.out +0 -0
  80. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM70.out +0 -0
  81. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM80.out +0 -0
  82. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM90.out +0 -0
  83. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/VTML10.out +0 -0
  84. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/VTML120.out +0 -0
  85. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/VTML160.out +0 -0
  86. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/VTML20.out +0 -0
  87. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/VTML40.out +0 -0
  88. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/VTML80.out +0 -0
  89. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum100.out +0 -0
  90. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum30.out +0 -0
  91. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum35.out +0 -0
  92. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum40.out +0 -0
  93. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum45.out +0 -0
  94. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum50.out +0 -0
  95. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum55.out +0 -0
  96. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum60.out +0 -0
  97. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum62.out +0 -0
  98. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum65.out +0 -0
  99. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum70.out +0 -0
  100. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum75.out +0 -0
  101. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum80.out +0 -0
  102. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum85.out +0 -0
  103. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum90.out +0 -0
  104. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum95.out +0 -0
  105. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/nucleotide.out +0 -0
  106. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/mmseqs.bat +0 -0
  107. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/util/bash-completion.sh +0 -0
  108. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/AUTHORS +0 -0
  109. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/CHANGELOG +0 -0
  110. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/LICENSE +0 -0
  111. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/README +0 -0
  112. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/bin/libgcc_s_dw2-1.dll +0 -0
  113. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/bin/libstdc++-6.dll +0 -0
  114. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/bin/trimal.exe +0 -0
  115. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/scripts/check_codon_alignments.py +0 -0
  116. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/scripts/compare_trimmed_msas.sh +0 -0
  117. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/scripts/generateRandomAlignmentsUsingAsSeedRealAlignments.py +0 -0
  118. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/scripts/generate_trimmed_msas.sh +0 -0
  119. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/scripts/get_sequence_representative_from_alignment.py +0 -0
  120. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/scripts/get_sequences_gaps_ratio.py +0 -0
  121. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/scripts/remove_shorter_sequences.py +0 -0
  122. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/scripts/selective_trimming_for_dNdS_analyses.based_neighbours.py +0 -0
  123. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/scripts/set_manual_boundaries.py +0 -0
  124. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/alignment.cpp +0 -0
  125. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/alignment.h +0 -0
  126. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/alignment.o +0 -0
  127. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/autAlignment.cpp +0 -0
  128. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/autAlignment.o +0 -0
  129. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.cpp +0 -0
  130. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.h +0 -0
  131. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.o +0 -0
  132. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/defines.h +0 -0
  133. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/main.cpp +0 -0
  134. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/makefile +0 -0
  135. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/makefile.MacOS +0 -0
  136. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/readAl.cpp +0 -0
  137. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/readal.exe +0 -0
  138. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/rwAlignment.cpp +0 -0
  139. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/rwAlignment.o +0 -0
  140. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.cpp +0 -0
  141. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.h +0 -0
  142. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.o +0 -0
  143. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.cpp +0 -0
  144. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.h +0 -0
  145. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.o +0 -0
  146. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/statAl.cpp +0 -0
  147. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/statal.exe +0 -0
  148. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.cpp +0 -0
  149. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.h +0 -0
  150. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.o +0 -0
  151. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/statisticsFiles.cpp +0 -0
  152. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/statisticsFiles.h +0 -0
  153. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.cpp +0 -0
  154. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.h +0 -0
  155. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.o +0 -0
  156. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/utils.cpp +0 -0
  157. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/utils.h +0 -0
  158. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/utils.o +0 -0
  159. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/values.h +0 -0
  160. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/preset/.gitignore +0 -0
  161. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/preset/accurate.yaml +0 -0
  162. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/preset/fast.yaml +0 -0
  163. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/.gitignore +0 -0
  164. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__init__.py +0 -0
  165. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/CATV_pipe.cpython-310.pyc +0 -0
  166. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/CAT_V.cpython-310.pyc +0 -0
  167. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/CAT_V.cpython-39.pyc +0 -0
  168. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/CAT_V_pipe.cpython-39.pyc +0 -0
  169. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/__init__.cpython-310.pyc +0 -0
  170. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/__init__.cpython-39.pyc +0 -0
  171. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/align.cpython-310.pyc +0 -0
  172. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/cluster.cpython-39.pyc +0 -0
  173. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/dataset.cpython-39.pyc +0 -0
  174. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/ext.cpython-310.pyc +0 -0
  175. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/ext.cpython-39.pyc +0 -0
  176. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/hasher.cpython-39.pyc +0 -0
  177. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/initialize.cpython-39.pyc +0 -0
  178. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/io.cpython-310.pyc +0 -0
  179. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/io.cpython-39.pyc +0 -0
  180. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/logger.cpython-39.pyc +0 -0
  181. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/modeltest.cpython-39.pyc +0 -0
  182. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/multigene.cpython-39.pyc +0 -0
  183. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/ncbi.cpython-39.pyc +0 -0
  184. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/opt_generator.cpython-39.pyc +0 -0
  185. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/reporter.cpython-39.pyc +0 -0
  186. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/search.cpython-39.pyc +0 -0
  187. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/tool.cpython-39.pyc +0 -0
  188. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/validation.cpython-39.pyc +0 -0
  189. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/visualize.cpython-39.pyc +0 -0
  190. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/align.py +0 -0
  191. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/cluster.py +0 -0
  192. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/command.py +0 -0
  193. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/concatenate.py +0 -0
  194. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/ext.py +0 -0
  195. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/hasher.py +0 -0
  196. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/initialize.py +0 -0
  197. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/logger.py +0 -0
  198. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/logics.py +0 -0
  199. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/modeltest.py +0 -0
  200. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/ncbi.py +0 -0
  201. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/opt_generator.py +0 -0
  202. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/search.py +0 -0
  203. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/templates/template.html +0 -0
  204. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/tool.py +0 -0
  205. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/tree.py +0 -0
  206. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/tree_interpretation.py +0 -0
  207. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/tree_interpretation_pipe.py +0 -0
  208. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/trim.py +0 -0
  209. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/validate_option.py +0 -0
  210. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/validation.py +0 -0
  211. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/version.py +0 -0
  212. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/test_dataset/penicillium/DB/DB_Penicillium.xlsx +0 -0
  213. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/test_dataset/penicillium/Options.config +0 -0
  214. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/test_dataset/penicillium/Query/Query.xlsx +0 -0
  215. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/test_dataset/penicillium/preset.yaml +0 -0
  216. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/test_dataset/terrei/DB/FunVIP_Aspergillus_db.xlsx +0 -0
  217. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/test_dataset/terrei/Query/FunVIP_Aspergillus_query.xlsx +0 -0
  218. {funvip-0.3.22 → funvip-0.3.22.2}/funvip/test_dataset/terrei/preset.yaml +0 -0
  219. {funvip-0.3.22 → funvip-0.3.22.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: FunVIP
3
- Version: 0.3.22
3
+ Version: 0.3.22.2
4
4
  Summary: Fungal Validation & Identification Pipeline
5
5
  Author-email: Changwan Seo <wan101010@snu.ac.kr>
6
6
  License: GPL-3.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: FunVIP
3
- Version: 0.3.22
3
+ Version: 0.3.22.2
4
4
  Summary: Fungal Validation & Identification Pipeline
5
5
  Author-email: Changwan Seo <wan101010@snu.ac.kr>
6
6
  License: GPL-3.0
@@ -83,6 +83,8 @@ def main():
83
83
  path = var["path"]
84
84
  if "model_dict" in var:
85
85
  model_dict = var["model_dict"]
86
+ if "GenMine_flag" in var:
87
+ GenMine_flag = var["GenMine_flag"]
86
88
 
87
89
  # To deal with location changes when rerun
88
90
  path_root = f"{os.getcwd()}/{opt.runname}"
@@ -434,7 +434,6 @@ class FunVIP_var:
434
434
  # Validate if any multiple sequence alignment has no overlapping region
435
435
  def validate_alignments(self, path, opt):
436
436
  fail_list = []
437
-
438
437
  remove_dict = {}
439
438
  tree_hash_dict = hasher.encode(self.list_FI, newick=True)
440
439
  for group in self.dict_dataset:
@@ -571,10 +570,11 @@ class FunVIP_var:
571
570
  for fail in fail_list:
572
571
  for FI in self.list_FI:
573
572
  if FI.adjusted_group == fail[0]:
574
- if FI.seq[fail[1]] != "":
575
- FI.issues.add(f"alignfail:{fail[1]}")
573
+ if fail[1] in FI.seq:
574
+ if FI.seq[fail[1]] != "":
575
+ FI.issues.add(f"alignfail:{fail[1]}")
576
576
 
577
- print(fail_list)
577
+ # print(fail_list)
578
578
 
579
579
  logging.debug("Remove dict")
580
580
  logging.debug(remove_dict)
@@ -258,6 +258,7 @@ class Report:
258
258
  # For unused FI
259
259
  else:
260
260
  self.result["DATATYPE"].append("unused")
261
+ self.result["GROUP_ASSIGNED"].append("-")
261
262
 
262
263
  for gene in set_gene:
263
264
  # Check if data analysis had performed for specific FI, group, gene combination
@@ -272,6 +273,17 @@ class Report:
272
273
  self.result["STATUS"].append("unused")
273
274
 
274
275
  ## update query only result on report.txt
276
+
277
+ logging.debug(f"ID: {len(self.result['ID'])}")
278
+ logging.debug(f"HASH: {len(self.result['HASH'])}")
279
+ logging.debug(f"DATATYPE: {len(self.result['DATATYPE'])}")
280
+ logging.debug(f"ISSUES: {len(self.result['ISSUES'])}")
281
+ logging.debug(f"GROUP_ORIGINAL: {len(self.result['GROUP_ORIGINAL'])}")
282
+ logging.debug(f"GROUP_ASSIGNED: {len(self.result['GROUP_ASSIGNED'])}")
283
+ logging.debug(f"SPECIES_ORIGINAL: {len(self.result['SPECIES_ORIGINAL'])}")
284
+ logging.debug(f"SPECIES_ASSIGNED: {len(self.result['SPECIES_ASSIGNED'])}")
285
+ logging.debug(f"STATUS: {len(self.result['STATUS'])}")
286
+
275
287
  self.query_result = pd.DataFrame(self.result)
276
288
  # Filter if queryonly is True
277
289
  if opt.queryonly is True:
@@ -26,7 +26,7 @@ import shelve
26
26
  # In future, try selectively save to reduce datasize
27
27
  # Session saving function
28
28
  def save_session(opt, path, global_var: dict, var: dict) -> None:
29
- managed_keys = ("V", "R", "opt", "path", "model_dict")
29
+ managed_keys = ("V", "R", "opt", "path", "model_dict", "GenMine_flag")
30
30
 
31
31
  # if opt.save_run is True:
32
32
  save = shelve.open(path.save, "n")
@@ -20,6 +20,7 @@ from funvip.src.tool import (
20
20
  mkdir,
21
21
  )
22
22
  from pathlib import Path
23
+ from time import sleep
23
24
 
24
25
  from funvip.src import save
25
26
  from funvip.src.logics import isnewicklegal, isuniquecolumn, isvalidcolor
@@ -56,17 +57,18 @@ class Funinfo:
56
57
  self.color = None # color for highlighting in phylogenetic tree
57
58
  self.flat = [] # list of flat species in concatenated tree
58
59
  self.issues = set() # list of issues to this FI
60
+ self.source = set() # source which FI was from
61
+
62
+ def update_source(self, source):
63
+ self.source.add(source)
59
64
 
60
65
  def update_seqrecord(self, seq, gene=None):
61
- flag = 0
66
+ error = None
62
67
  self.description = seq.description
63
68
  self.genus, self.ori_species = get_genus_species(seq.description)
64
69
 
65
70
  if gene in self.seq:
66
- logging.error(
67
- f"More than 1 sequence for {gene} found for {self.id} during update_seqrecord"
68
- )
69
- flag = -1
71
+ error = f"In {self.source}, More than 1 sequence for {gene} found for {self.id} during update_seqrecord"
70
72
  elif gene is None:
71
73
  self.unclassified_seq.append(str(seq.seq.ungap("-")))
72
74
  else:
@@ -74,18 +76,15 @@ class Funinfo:
74
76
 
75
77
  self.bygene_species[gene] = self.ori_species
76
78
 
77
- return flag
79
+ return error
78
80
 
79
81
  def update_seq(self, gene, seq): # get input as Entrez seqrecord! Important!
80
- flag = 0
82
+ error = None
81
83
  if gene in self.seq:
82
84
  if (
83
85
  self.seq[gene] != seq
84
86
  ): # if more than 1 sequence per gene gets in, and if they are different
85
- logging.error(
86
- f"More than 1 sequence for {gene} found for {self.id} during update_seq"
87
- )
88
- flag = -1
87
+ error = f"In {self.source}, More than 1 sequence for {gene} found for {self.id} during update_seq"
89
88
  else:
90
89
  pass
91
90
  else:
@@ -96,13 +95,13 @@ class Funinfo:
96
95
  # Update concatenated
97
96
  self.bygene_species["concatenated"] = self.ori_species
98
97
 
99
- return flag
98
+ return error
100
99
 
101
100
  def update_description(self, description):
102
101
  self.description = description
103
102
 
104
103
  def update_genus(self, genus):
105
- flag = 0
104
+ error = None
106
105
  # Try to solve illegal unicode characters
107
106
  if pd.isnull(genus):
108
107
  genus = ""
@@ -114,10 +113,7 @@ class Funinfo:
114
113
 
115
114
  # Check ambiguity
116
115
  if self.genus != "" and self.genus != genus:
117
- flag = -1
118
- logging.error(
119
- f"Colliding genus info found for {self.original_id}, {self.genus} and {genus}"
120
- )
116
+ error = f"In {self.source}, Colliding genus info found for {self.original_id}, {self.genus} and {genus}"
121
117
 
122
118
  # Update original if should
123
119
  if self.ori_genus == "":
@@ -126,10 +122,10 @@ class Funinfo:
126
122
  # Update genus
127
123
  self.genus = genus
128
124
 
129
- return flag
125
+ return error
130
126
 
131
127
  def update_ori_species(self, species):
132
- flag = 0
128
+ error = None
133
129
  # Try to solve illegal unicode characters
134
130
  if pd.isnull(species):
135
131
  species = ""
@@ -141,22 +137,19 @@ class Funinfo:
141
137
 
142
138
  # Check ambiguity
143
139
  if self.ori_species != "" and self.ori_species != species:
144
- flag = -1
145
- logging.error(
146
- f"Colliding species info found for {self.original_id}, {self.ori_species} and {species}"
147
- )
140
+ error = f"In {self.source}, Colliding species info found for {self.original_id}, {self.ori_species} and {species}"
148
141
 
149
142
  # Update original if should
150
143
  if self.ori_species == "":
151
144
  self.ori_species = species
152
145
 
153
- return flag
146
+ return error
154
147
 
155
148
  def update_species(self, gene, species):
156
149
  self.bygene_species[gene] = species
157
150
 
158
151
  def update_group(self, group):
159
- flag = 0
152
+ error = None
160
153
  # Try to solve illegal unicode characters
161
154
  if pd.isnull(group):
162
155
  group = ""
@@ -167,15 +160,12 @@ class Funinfo:
167
160
 
168
161
  # Check ambiguity
169
162
  if self.group != "" and self.group != group:
170
- logging.error(
171
- f"Colliding group info found for {self.original_id}, {self.group} and {group}"
172
- )
173
- flag = -1
163
+ error = f"In {self.source}, Colliding group info found for {self.original_id}, {self.group} and {group}"
174
164
 
175
165
  # Update group
176
166
  self.group = group
177
167
 
178
- return flag
168
+ return error
179
169
 
180
170
  def update_color(self, color):
181
171
  if pd.isnull(color):
@@ -186,13 +176,14 @@ class Funinfo:
186
176
  if isvalidcolor(color) is True:
187
177
  self.color = color
188
178
  else:
189
- logging.error(
190
- f"Color {color} does not seems to be valid svg color nor hex code"
179
+ logging.warning(
180
+ f"Color {color} does not seems to be valid svg color nor hex code. Using default color"
191
181
  )
192
- raise Exception
182
+ self.color = None
193
183
 
194
184
  def update_datatype(self, datatype):
195
185
  flag = 0
186
+ error = None
196
187
  # Available datatypes : db, query
197
188
  if not (datatype in ("db", "query", "outgroup")):
198
189
  logging.error(f"DEVELOPMENTAL ERROR: {datatype} is not available datatype")
@@ -200,14 +191,11 @@ class Funinfo:
200
191
 
201
192
  # Check ambiguity
202
193
  if self.datatype != "" and self.datatype != datatype:
203
- flag = -1
204
- logging.error(
205
- f"Colliding datatype found for {self.original_id}, {self.datatype} and {datatype}"
206
- )
194
+ error = f"In {self.source}, Colliding datatype found for {self.original_id}, {self.datatype} and {datatype}"
207
195
 
208
196
  self.datatype = datatype
209
197
 
210
- return flag
198
+ return error
211
199
 
212
200
  def update_id(self, id_, regexs=None):
213
201
  if not regexs == None:
@@ -286,9 +274,15 @@ class Funinfo:
286
274
 
287
275
  # getting data input from fasta file
288
276
  def input_fasta(path, opt, fasta_list, funinfo_dict, datatype):
277
+ warnings = []
278
+ errors = []
279
+
289
280
  # initialize path to use function "get_genus_species"
290
281
  initialize_path(path)
291
282
 
283
+ errors = []
284
+ warnings = []
285
+
292
286
  # Fasta files only
293
287
  for file in fasta_list:
294
288
  # Copy input files to designation
@@ -304,8 +298,60 @@ def input_fasta(path, opt, fasta_list, funinfo_dict, datatype):
304
298
 
305
299
  logging.info(f"{file}: Fasta file")
306
300
 
307
- error_flag = 0
301
+ seq_list = list(SeqIO.parse(file, "fasta"))
302
+ for seq in seq_list:
303
+ if not opt.regex == None:
304
+ id_ = get_id(seq.description, tuple(opt.regex))
305
+ else:
306
+ id_ = seq.description
307
+
308
+ id_ = newick_legal(id_)
309
+
310
+ if id_ in funinfo_dict:
311
+ funinfo_dict[id_].update_source(file)
312
+ errors.append(funinfo_dict[id_].update_seqrecord(seq))
313
+ errors.append(funinfo_dict[id_].update_datatype(datatype))
314
+ errors.append(funinfo_dict[id_].update_group(""))
315
+ if get_genus_species(seq.description)[0] != "":
316
+ errors.append(
317
+ funinfo_dict[id_].update_genus(
318
+ get_genus_species(seq.description)[0]
319
+ )
320
+ )
321
+
322
+ if get_genus_species(seq.description)[1] != "":
323
+ errors.append(
324
+ funinfo_dict[id_].update_ori_species(
325
+ get_genus_species(seq.description)[1]
326
+ )
327
+ )
328
+
329
+ # For new Funinfo
330
+ else:
331
+ newinfo = Funinfo()
332
+ newinfo.update_source(file)
333
+ errors.append(newinfo.update_seqrecord(seq))
334
+ errors.append(newinfo.update_datatype(datatype))
335
+ errors.append(
336
+ newinfo.update_group("")
337
+ ) # because group not designated yet
338
+ # id by regex match
339
+ newinfo.update_id(seq.description, regexs=opt.regex)
340
+ if get_genus_species(seq.description)[0] != "":
341
+ errors.append(
342
+ newinfo.update_genus(get_genus_species(seq.description)[0])
343
+ )
308
344
 
345
+ if get_genus_species(seq.description)[1] != "":
346
+ errors.append(
347
+ newinfo.update_ori_species(
348
+ get_genus_species(seq.description)[1]
349
+ )
350
+ )
351
+
352
+ funinfo_dict[id_] = deepcopy(newinfo)
353
+
354
+ """
309
355
  try:
310
356
  seq_list = list(SeqIO.parse(file, "fasta"))
311
357
  for seq in seq_list:
@@ -317,52 +363,60 @@ def input_fasta(path, opt, fasta_list, funinfo_dict, datatype):
317
363
  id_ = newick_legal(id_)
318
364
 
319
365
  if id_ in funinfo_dict:
320
- error_flag += funinfo_dict[id_].update_seqrecord(seq)
321
- error_flag += funinfo_dict[id_].update_datatype(datatype)
322
- error_flag += funinfo_dict[id_].update_group("")
366
+ funinfo_dict[id_].update_source(file)
367
+ errors.append(funinfo_dict[id_].update_seqrecord(seq))
368
+ errors.append(funinfo_dict[id_].update_datatype(datatype))
369
+ errors.append(funinfo_dict[id_].update_group(""))
323
370
  if get_genus_species(seq.description)[0] != "":
324
- error_flag += funinfo_dict[id_].update_genus(
325
- get_genus_species(seq.description)[0]
371
+ errors.append(
372
+ funinfo_dict[id_].update_genus(
373
+ get_genus_species(seq.description)[0]
374
+ )
326
375
  )
327
376
 
328
377
  if get_genus_species(seq.description)[1] != "":
329
- error_flag += funinfo_dict[id_].update_ori_species(
330
- get_genus_species(seq.description)[1]
378
+ errors.append(
379
+ funinfo_dict[id_].update_ori_species(
380
+ get_genus_species(seq.description)[1]
381
+ )
331
382
  )
332
383
 
333
384
  # For new Funinfo
334
385
  else:
335
386
  newinfo = Funinfo()
336
- error_flag += newinfo.update_seqrecord(seq)
337
- error_flag += newinfo.update_datatype(datatype)
338
- error_flag += newinfo.update_group(
339
- ""
387
+ newinfo[id_].update_source(file)
388
+ errors.append(newinfo.update_seqrecord(seq))
389
+ errors.append(newinfo.update_datatype(datatype))
390
+ errors.append(
391
+ newinfo.update_group("")
340
392
  ) # because group not designated yet
341
393
  # id by regex match
342
394
  newinfo.update_id(seq.description, regexs=opt.regex)
343
395
  if get_genus_species(seq.description)[0] != "":
344
- error_flag += newinfo.update_genus(
345
- get_genus_species(seq.description)[0]
396
+ errors.append(
397
+ newinfo.update_genus(get_genus_species(seq.description)[0])
346
398
  )
347
399
 
348
400
  if get_genus_species(seq.description)[1] != "":
349
- error_flag += newinfo.update_ori_species(
350
- get_genus_species(seq.description)[1]
401
+ errors.append(
402
+ newinfo.update_ori_species(
403
+ get_genus_species(seq.description)[1]
404
+ )
351
405
  )
352
406
 
353
407
  funinfo_dict[id_] = deepcopy(newinfo)
354
408
 
355
409
  except:
356
- logging.warning(f"{file} does not seems to be valid fasta file skipping")
410
+ errors.append(f"{file} does not seems to be valid fasta file")
411
+ """
357
412
 
358
413
  if len(seq_list) == 0:
359
- logging.error(f"Fasta file {file} seems to be empty please check")
360
- raise Exception
414
+ errors.append(f"Fasta file {file} seems to be empty please check")
415
+ # raise Exception
361
416
 
362
- if error_flag < 0:
363
- raise Exception
417
+ errors = [err for err in errors if not (err is None)]
364
418
 
365
- return funinfo_dict
419
+ return funinfo_dict, warnings, errors
366
420
 
367
421
 
368
422
  # getting datafile from excel or tabular file
@@ -370,11 +424,13 @@ def input_table(funinfo_dict, path, opt, table_list, datatype):
370
424
  # Whether to check if GenMine has run
371
425
  GenMine_flag = 0
372
426
  string_error = 0
373
- error_flag = 0
374
427
 
375
428
  initialize_path(path) # this one is ugly
376
429
  df_list = []
377
430
 
431
+ warnings = []
432
+ errors = []
433
+
378
434
  # extensionto filetype translation
379
435
  dict_extension = {
380
436
  ".csv": "csv",
@@ -389,6 +445,7 @@ def input_table(funinfo_dict, path, opt, table_list, datatype):
389
445
  # Running table by table operations
390
446
  for table in table_list:
391
447
  # Read each of the table by each of the extensions
448
+ # This is part is double validation after options
392
449
  flag_read_table = 0
393
450
  for extension in dict_extension:
394
451
  if table.endswith(extension):
@@ -510,7 +567,6 @@ def input_table(funinfo_dict, path, opt, table_list, datatype):
510
567
  logging.info(
511
568
  f"Running GenMine to download {len(download_set)} sequences from GenBank"
512
569
  )
513
- # logging.info(download_set)
514
570
 
515
571
  # Write GenMine input file
516
572
  with open(f"{path.GenMine}/Accessions.txt", "w") as fg:
@@ -529,6 +585,7 @@ def input_table(funinfo_dict, path, opt, table_list, datatype):
529
585
  cmd = f"GenMine -c {accession_path} -o {GenMine_path} -e {opt.email}"
530
586
  logging.info(cmd)
531
587
 
588
+ sleep(5) # To run GenMine safetly between run and run
532
589
  return_code = subprocess.call(cmd, shell=True)
533
590
 
534
591
  if return_code != 0:
@@ -572,7 +629,7 @@ def input_table(funinfo_dict, path, opt, table_list, datatype):
572
629
  elif not (accession_wo_version in download_dict) and (
573
630
  accession_w_version in download_set
574
631
  ):
575
- logging.warning(f"Failed updating {string}")
632
+ logging.warning(f"Failed updating {string} using GenMine")
576
633
  return ""
577
634
 
578
635
  # For sequence input
@@ -588,9 +645,10 @@ def input_table(funinfo_dict, path, opt, table_list, datatype):
588
645
  shutil.rmtree(f"{path.GenMine}/{directory}")
589
646
 
590
647
  elif len(GenMine_df_list) == 0:
591
- logging.warning(
592
- f"None of the GenMine results were succesfully parsed"
648
+ warnings.append(
649
+ f"In table {table}, None of the GenMine results were succesfully parsed"
593
650
  )
651
+
594
652
  else:
595
653
  logging.error(
596
654
  f"DEVELOPMENTAL ERROR: Multiple GenMine result colliding!"
@@ -618,8 +676,7 @@ def input_table(funinfo_dict, path, opt, table_list, datatype):
618
676
  empty_error.append(n)
619
677
 
620
678
  if len(empty_error) > 0:
621
- logging.error(f"Empty id found in {table}, line {empty_error}!")
622
- raise Exception
679
+ errors.append(f"In table {table}, Empty id found, line {empty_error}!")
623
680
 
624
681
  # Generate funinfo by each row
625
682
  for n, acc in enumerate(df["id"]):
@@ -631,31 +688,37 @@ def input_table(funinfo_dict, path, opt, table_list, datatype):
631
688
  # Duplicate id check
632
689
  if df["id"][n] in funinfo_dict:
633
690
  newinfo = funinfo_dict[df["id"][n]]
691
+ # Update source
692
+ newinfo.update_source(table)
634
693
  new_acc = False
635
- logging.warning(f"Duplicate id {df['id'][n]} found!")
694
+ warnings.append(
695
+ f"Among table {newinfo.source}, Duplicate id {df['id'][n]} found!"
696
+ )
636
697
  else:
637
698
  funinfo_dict[df["id"][n]] = Funinfo()
638
699
  newinfo = funinfo_dict[df["id"][n]]
639
700
  newinfo.update_id(df["id"][n])
701
+ # Update source
702
+ newinfo.update_source(table)
640
703
 
641
704
  # if flag_genus is true, try to parse genus
642
705
  if not (flag_genus is None or flag_genus is False):
643
- error_flag += newinfo.update_genus(df["genus"][n])
706
+ errors.append(newinfo.update_genus(df["genus"][n]))
644
707
 
645
708
  # if flag_species is true, try to parse species
646
709
  if not (flag_species is None or flag_species is False):
647
- error_flag += newinfo.update_ori_species(df["species"][n])
710
+ errors.append(newinfo.update_ori_species(df["species"][n]))
648
711
 
649
712
  # if flag_level is true, try to parse the optimal taxonomic group
650
713
  if not (flag_level is None or flag_level is False):
651
- error_flag += newinfo.update_group(df[flag_level][n])
714
+ errors.append(newinfo.update_group(df[flag_level][n]))
652
715
 
653
716
  # if flag_color is true, try to parse color for taxon
654
717
  if not (flag_color is None or flag_color is False):
655
718
  newinfo.update_color(df[flag_color][n])
656
719
 
657
720
  # update datatype
658
- error_flag += newinfo.update_datatype(datatype)
721
+ errors.append(newinfo.update_datatype(datatype))
659
722
 
660
723
  # parse each of the genes
661
724
  for gene in opt.gene:
@@ -683,17 +746,19 @@ def input_table(funinfo_dict, path, opt, table_list, datatype):
683
746
  seq_error_list.append(x)
684
747
 
685
748
  if seq_error_cnt > 0:
686
- logging.warning(
687
- f"Illegal DNA character {seq_error_list} found in {gene} of {datatype} {df['id'][n]}"
749
+ warnings.append(
750
+ f"In table {table}, Illegal DNA character {seq_error_list} found in {gene} of {datatype} {df['id'][n]}"
688
751
  )
689
752
  elif seq_string.lower().strip() in ("nan", "na"):
690
- logging.warning(
691
- f"Sequence {df['id'][n]} {seq_string} detected as nan, removing it"
753
+ warnings.append(
754
+ f"In table {table}, Sequence {df['id'][n]} {seq_string} detected as nan, removing it"
692
755
  )
693
756
  elif seq_error_cnt == 0:
694
757
  # remove gaps for preventing BLAST error
695
- error_flag += newinfo.update_seq(
696
- gene, seq_string.replace("-", "").replace(".", "")
758
+ errors.append(
759
+ newinfo.update_seq(
760
+ gene, seq_string.replace("-", "").replace(".", "")
761
+ )
697
762
  )
698
763
 
699
764
  # After successfully parsed this table, save it
@@ -702,20 +767,39 @@ def input_table(funinfo_dict, path, opt, table_list, datatype):
702
767
  f"{path.out_db}/Saved_{'.'.join(table.split('/')[-1].split('.')[:-1])}.{opt.tableformat}",
703
768
  fmt=opt.tableformat,
704
769
  )
705
- return funinfo_dict, GenMine_flag, error_flag
770
+
771
+ # Remove non-errors from errors
772
+ errors = [err for err in errors if not (err is None)]
773
+
774
+ return funinfo_dict, GenMine_flag, warnings, errors
706
775
 
707
776
 
708
777
  def db_input(funinfo_dict, opt, path) -> list:
709
778
  # Get DB input
710
779
  logging.info(f"Input DB list: {opt.db}")
711
780
 
712
- funinfo_dict, GenMine_flag, error_flag = input_table(
713
- funinfo_dict=funinfo_dict, path=path, opt=opt, table_list=opt.db, datatype="db"
781
+ (
782
+ funinfo_dict,
783
+ GenMine_flag,
784
+ warnings,
785
+ errors,
786
+ ) = input_table(
787
+ funinfo_dict=funinfo_dict,
788
+ path=path,
789
+ opt=opt,
790
+ table_list=opt.db,
791
+ datatype="db",
714
792
  )
715
793
 
716
- if error_flag < 0:
794
+ for warning in sorted(list(warnings)):
795
+ logging.warning(warning)
796
+
797
+ if len(errors) > 0:
798
+ for error in sorted(list(set(errors))):
799
+ logging.error(error)
800
+
717
801
  logging.error(
718
- f"FunVIP terminated because error found during input validation. Please check [ERROR] list in log.txt"
802
+ f"FunVIP terminated because error found during input validation. Please check [ERROR] in log.txt"
719
803
  )
720
804
  raise Exception
721
805
  # validate dataset
@@ -758,14 +842,14 @@ def query_input(funinfo_dict, opt, path):
758
842
  )
759
843
  ]
760
844
 
761
- funinfo_dict, GenMine_flag, error_flag = input_table(
845
+ funinfo_dict, GenMine_flag, table_warnings, table_errors = input_table(
762
846
  funinfo_dict=funinfo_dict,
763
847
  path=path,
764
848
  opt=opt,
765
849
  table_list=query_table,
766
850
  datatype="query",
767
851
  )
768
- funinfo_dict = input_fasta(
852
+ funinfo_dict, fasta_warnings, fasta_errors = input_fasta(
769
853
  path=path,
770
854
  opt=opt,
771
855
  fasta_list=query_fasta,
@@ -773,7 +857,16 @@ def query_input(funinfo_dict, opt, path):
773
857
  datatype="query",
774
858
  )
775
859
 
776
- if error_flag < 0:
860
+ warnings = table_warnings + fasta_warnings
861
+ errors = table_errors + fasta_errors
862
+
863
+ for warning in sorted(list(warnings)):
864
+ logging.warning(warning)
865
+
866
+ if len(errors) > 0:
867
+ for error in sorted(list(set(errors))):
868
+ logging.error(error)
869
+
777
870
  logging.error(
778
871
  f"FunVIP terminated because error found during input validation. Please check [ERROR] in log.txt"
779
872
  )
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "FunVIP"
3
- version = "0.3.22"
3
+ version = "0.3.22.2"
4
4
  description = "Fungal Validation & Identification Pipeline"
5
5
  authors = [{name = "Changwan Seo", email = "wan101010@snu.ac.kr"}]
6
6
  urls = { "Homepage" = "https://github.com/Changwanseo/FunVIP" }
File without changes
File without changes
File without changes
File without changes
File without changes