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