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.
- {funvip-0.3.22 → funvip-0.3.22.2}/FunVIP.egg-info/PKG-INFO +1 -1
- {funvip-0.3.22 → funvip-0.3.22.2}/PKG-INFO +1 -1
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/main.py +2 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/dataset.py +4 -4
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/reporter.py +12 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/save.py +1 -1
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/validate_input.py +179 -86
- {funvip-0.3.22 → funvip-0.3.22.2}/pyproject.toml +1 -1
- {funvip-0.3.22 → funvip-0.3.22.2}/FunVIP.egg-info/SOURCES.txt +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/FunVIP.egg-info/dependency_links.txt +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/FunVIP.egg-info/entry_points.txt +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/FunVIP.egg-info/requires.txt +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/FunVIP.egg-info/top_level.txt +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/LICENSE +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/MANIFEST.in +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/README.md +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/FunVIP_GUI.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/__init__.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/data/Option_manager.xlsx +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/data/__init__.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/data/genus_line.txt +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/BLAST_Windows/Uninstall-ncbi-blast-2.12.0+.exe +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/BLAST_Windows/bin/blastn.exe +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/BLAST_Windows/bin/cleanup-blastdb-volumes.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/BLAST_Windows/bin/get_species_taxids.sh +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/BLAST_Windows/bin/legacy_blast.pl +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/BLAST_Windows/bin/makeblastdb.exe +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/BLAST_Windows/bin/nghttp2.dll +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/BLAST_Windows/bin/update_blastdb.pl +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/BLAST_Windows/doc/README.txt +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/FastTree_Windows/FastTree.exe +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/Documentation/Gblocks_documentation.html +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/Gblocks.exe +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/cox2.pir +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/cytb.pir +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/nad3.pir +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/nad5.pir +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/nad3.pir +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/paths +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/MAFFT_LICENSE +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/MAFFT_Windows.zip +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/RAxML_Windows/GPL-3.0.txt +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/RAxML_Windows/README +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/RAxML_Windows/raxmlHPC-PTHREADS-AVX2.exe +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/__init__.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/iqtree/bin/iqtree2-click.exe +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/iqtree/bin/iqtree2.exe +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/iqtree/bin/libiomp5md.dll +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/iqtree/example.cf +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/iqtree/example.nex +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/iqtree/example.phy +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/iqtree/models.nex +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/LICENSE.md +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/README.md +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/bin/busybox.exe +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/bin/cygbz2-1.dll +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/bin/cyggcc_s-seh-1.dll +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/bin/cyggomp-1.dll +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/bin/cygstdc++-6.dll +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/bin/cygwin1.dll +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/bin/cygz.dll +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/bin/mmseqs.exe +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/examples/QUERY.fasta +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM10.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM100.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM110.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM120.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM130.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM140.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM150.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM160.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM170.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM180.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM190.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM20.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM30.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM40.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM50.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM60.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM70.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM80.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/PAM90.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/VTML10.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/VTML120.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/VTML160.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/VTML20.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/VTML40.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/VTML80.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum100.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum30.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum35.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum40.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum45.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum50.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum55.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum60.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum62.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum65.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum70.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum75.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum80.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum85.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum90.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/blosum95.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/matrices/nucleotide.out +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/mmseqs.bat +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/mmseqs_Windows/util/bash-completion.sh +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/AUTHORS +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/CHANGELOG +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/LICENSE +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/README +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/bin/libgcc_s_dw2-1.dll +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/bin/libstdc++-6.dll +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/bin/trimal.exe +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/scripts/check_codon_alignments.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/scripts/compare_trimmed_msas.sh +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/scripts/generateRandomAlignmentsUsingAsSeedRealAlignments.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/scripts/generate_trimmed_msas.sh +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/scripts/get_sequence_representative_from_alignment.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/scripts/get_sequences_gaps_ratio.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/scripts/remove_shorter_sequences.py +0 -0
- {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
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/scripts/set_manual_boundaries.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/alignment.cpp +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/alignment.h +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/alignment.o +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/autAlignment.cpp +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/autAlignment.o +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.cpp +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.h +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.o +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/defines.h +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/main.cpp +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/makefile +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/makefile.MacOS +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/readAl.cpp +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/readal.exe +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/rwAlignment.cpp +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/rwAlignment.o +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.cpp +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.h +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.o +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.cpp +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.h +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.o +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/statAl.cpp +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/statal.exe +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.cpp +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.h +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.o +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/statisticsFiles.cpp +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/statisticsFiles.h +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.cpp +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.h +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.o +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/utils.cpp +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/utils.h +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/utils.o +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/external/trimal.v1.4/trimAl/source/values.h +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/preset/.gitignore +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/preset/accurate.yaml +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/preset/fast.yaml +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/.gitignore +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__init__.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/CATV_pipe.cpython-310.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/CAT_V.cpython-310.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/CAT_V.cpython-39.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/CAT_V_pipe.cpython-39.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/__init__.cpython-310.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/__init__.cpython-39.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/align.cpython-310.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/cluster.cpython-39.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/dataset.cpython-39.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/ext.cpython-310.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/ext.cpython-39.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/hasher.cpython-39.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/initialize.cpython-39.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/io.cpython-310.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/io.cpython-39.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/logger.cpython-39.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/modeltest.cpython-39.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/multigene.cpython-39.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/ncbi.cpython-39.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/opt_generator.cpython-39.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/reporter.cpython-39.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/search.cpython-39.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/tool.cpython-39.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/validation.cpython-39.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/__pycache__/visualize.cpython-39.pyc +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/align.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/cluster.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/command.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/concatenate.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/ext.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/hasher.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/initialize.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/logger.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/logics.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/modeltest.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/ncbi.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/opt_generator.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/search.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/templates/template.html +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/tool.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/tree.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/tree_interpretation.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/tree_interpretation_pipe.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/trim.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/validate_option.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/validation.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/src/version.py +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/test_dataset/penicillium/DB/DB_Penicillium.xlsx +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/test_dataset/penicillium/Options.config +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/test_dataset/penicillium/Query/Query.xlsx +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/test_dataset/penicillium/preset.yaml +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/test_dataset/terrei/DB/FunVIP_Aspergillus_db.xlsx +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/test_dataset/terrei/Query/FunVIP_Aspergillus_query.xlsx +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/funvip/test_dataset/terrei/preset.yaml +0 -0
- {funvip-0.3.22 → funvip-0.3.22.2}/setup.cfg +0 -0
|
@@ -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
|
|
575
|
-
FI.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
79
|
+
return error
|
|
78
80
|
|
|
79
81
|
def update_seq(self, gene, seq): # get input as Entrez seqrecord! Important!
|
|
80
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
125
|
+
return error
|
|
130
126
|
|
|
131
127
|
def update_ori_species(self, species):
|
|
132
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
321
|
-
|
|
322
|
-
|
|
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
|
-
|
|
325
|
-
|
|
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
|
-
|
|
330
|
-
|
|
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
|
-
|
|
337
|
-
|
|
338
|
-
|
|
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
|
-
|
|
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
|
-
|
|
350
|
-
|
|
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
|
-
|
|
410
|
+
errors.append(f"{file} does not seems to be valid fasta file")
|
|
411
|
+
"""
|
|
357
412
|
|
|
358
413
|
if len(seq_list) == 0:
|
|
359
|
-
|
|
360
|
-
raise Exception
|
|
414
|
+
errors.append(f"Fasta file {file} seems to be empty please check")
|
|
415
|
+
# raise Exception
|
|
361
416
|
|
|
362
|
-
if
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
696
|
-
|
|
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
|
-
|
|
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
|
-
|
|
713
|
-
funinfo_dict
|
|
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
|
-
|
|
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]
|
|
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,
|
|
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
|
-
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|