FunVIP 0.4.1__tar.gz → 0.5.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- funvip-0.5.1/FunVIP.egg-info/PKG-INFO +159 -0
- {funvip-0.4.1 → funvip-0.5.1}/FunVIP.egg-info/requires.txt +1 -1
- funvip-0.5.1/PKG-INFO +159 -0
- {funvip-0.4.1 → funvip-0.5.1}/README.md +16 -3
- {funvip-0.4.1 → funvip-0.5.1}/funvip/main.py +21 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/cluster.py +43 -19
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/command.py +7 -2
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/dataset.py +36 -1
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/hasher.py +21 -1
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/tree_interpretation.py +25 -139
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/tree_interpretation_pipe.py +1 -12
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/validate_option.py +27 -13
- funvip-0.5.1/funvip/test_dataset/penicillium/DB/DB_Penicillium.xlsx +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/pyproject.toml +7 -2
- funvip-0.4.1/FunVIP.egg-info/PKG-INFO +0 -30
- funvip-0.4.1/PKG-INFO +0 -30
- funvip-0.4.1/funvip/test_dataset/penicillium/DB/DB_Penicillium.xlsx +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/FunVIP.egg-info/SOURCES.txt +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/FunVIP.egg-info/dependency_links.txt +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/FunVIP.egg-info/entry_points.txt +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/FunVIP.egg-info/top_level.txt +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/LICENSE +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/MANIFEST.in +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/FunVIP_GUI.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/__init__.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/data/Option_manager.xlsx +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/data/__init__.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/data/genus_line.txt +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/BLAST_Windows/Uninstall-ncbi-blast-2.12.0+.exe +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/BLAST_Windows/bin/blastn.exe +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/BLAST_Windows/bin/cleanup-blastdb-volumes.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/BLAST_Windows/bin/get_species_taxids.sh +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/BLAST_Windows/bin/legacy_blast.pl +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/BLAST_Windows/bin/makeblastdb.exe +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/BLAST_Windows/bin/nghttp2.dll +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/BLAST_Windows/bin/update_blastdb.pl +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/BLAST_Windows/doc/README.txt +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/FastTree_Windows/FastTree.exe +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/Documentation/Gblocks_documentation.html +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/Gblocks.exe +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/cox2.pir +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/cytb.pir +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/nad3.pir +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/nad5.pir +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/nad3.pir +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/paths +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/MAFFT_LICENSE +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/MAFFT_Windows.zip +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/RAxML_Windows/GPL-3.0.txt +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/RAxML_Windows/README +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/RAxML_Windows/raxmlHPC-PTHREADS-AVX2.exe +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/__init__.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/iqtree/bin/iqtree2-click.exe +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/iqtree/bin/iqtree2.exe +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/iqtree/bin/libiomp5md.dll +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/iqtree/example.cf +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/iqtree/example.nex +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/iqtree/example.phy +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/iqtree/models.nex +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/LICENSE.md +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/README.md +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/bin/busybox.exe +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/bin/cygbz2-1.dll +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/bin/cyggcc_s-seh-1.dll +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/bin/cyggomp-1.dll +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/bin/cygstdc++-6.dll +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/bin/cygwin1.dll +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/bin/cygz.dll +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/bin/mmseqs.exe +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/examples/QUERY.fasta +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM10.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM100.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM110.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM120.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM130.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM140.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM150.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM160.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM170.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM180.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM190.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM20.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM30.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM40.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM50.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM60.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM70.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM80.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/PAM90.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/VTML10.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/VTML120.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/VTML160.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/VTML20.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/VTML40.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/VTML80.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum100.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum30.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum35.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum40.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum45.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum50.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum55.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum60.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum62.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum65.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum70.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum75.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum80.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum85.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum90.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/blosum95.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/matrices/nucleotide.out +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/mmseqs.bat +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/mmseqs_Windows/util/bash-completion.sh +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/modeltest-ng_Windows/cyggcc_s-seh-1.dll +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/modeltest-ng_Windows/cygstdc++-6.dll +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/modeltest-ng_Windows/cygwin1.dll +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/modeltest-ng_Windows/modeltest-ng.exe +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/AUTHORS +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/CHANGELOG +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/LICENSE +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/README +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/bin/libgcc_s_dw2-1.dll +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/bin/libstdc++-6.dll +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/bin/trimal.exe +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/scripts/check_codon_alignments.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/scripts/compare_trimmed_msas.sh +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/scripts/generateRandomAlignmentsUsingAsSeedRealAlignments.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/scripts/generate_trimmed_msas.sh +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/scripts/get_sequence_representative_from_alignment.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/scripts/get_sequences_gaps_ratio.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/scripts/remove_shorter_sequences.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/scripts/selective_trimming_for_dNdS_analyses.based_neighbours.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/scripts/set_manual_boundaries.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/alignment.cpp +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/alignment.h +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/alignment.o +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/autAlignment.cpp +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/autAlignment.o +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.cpp +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.h +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.o +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/defines.h +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/main.cpp +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/makefile +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/makefile.MacOS +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/readAl.cpp +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/readal.exe +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/rwAlignment.cpp +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/rwAlignment.o +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.cpp +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.h +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.o +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.cpp +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.h +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.o +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/statAl.cpp +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/statal.exe +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.cpp +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.h +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.o +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/statisticsFiles.cpp +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/statisticsFiles.h +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.cpp +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.h +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.o +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/utils.cpp +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/utils.h +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/utils.o +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/external/trimal.v1.4/trimAl/source/values.h +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/preset/.gitignore +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/preset/accurate.yaml +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/preset/fast.yaml +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/.gitignore +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__init__.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/CATV_pipe.cpython-310.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/CAT_V.cpython-310.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/CAT_V.cpython-39.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/CAT_V_pipe.cpython-39.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/__init__.cpython-310.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/__init__.cpython-39.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/align.cpython-310.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/cluster.cpython-39.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/dataset.cpython-39.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/ext.cpython-310.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/ext.cpython-39.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/hasher.cpython-39.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/initialize.cpython-39.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/io.cpython-310.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/io.cpython-39.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/logger.cpython-39.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/modeltest.cpython-39.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/multigene.cpython-39.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/ncbi.cpython-39.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/opt_generator.cpython-39.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/reporter.cpython-39.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/search.cpython-39.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/tool.cpython-39.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/validation.cpython-39.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/__pycache__/visualize.cpython-39.pyc +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/align.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/concatenate.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/ext.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/initialize.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/logger.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/logics.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/modeltest.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/ncbi.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/opt_generator.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/reporter.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/save.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/search.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/templates/template.html +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/tool.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/tree.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/trim.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/validate_input.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/validation.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/version.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/src/visualize.py +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/test_dataset/penicillium/Options.config +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/test_dataset/penicillium/Query/Query.xlsx +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/test_dataset/penicillium/preset.yaml +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/test_dataset/sanghuangporus/DB/FunVIP_Sanghuangporus_db.xlsx +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/test_dataset/sanghuangporus/Query/FunVIP_Sanghuangporus_query.xlsx +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/test_dataset/sanghuangporus/preset.yaml +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/test_dataset/terrei/DB/FunVIP_Aspergillus_db.xlsx +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/test_dataset/terrei/Query/FunVIP_Aspergillus_query.xlsx +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/funvip/test_dataset/terrei/preset.yaml +0 -0
- {funvip-0.4.1 → funvip-0.5.1}/setup.cfg +0 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: FunVIP
|
|
3
|
+
Version: 0.5.1
|
|
4
|
+
Summary: Fungal Validation & Identification Pipeline
|
|
5
|
+
Author-email: Changwan Seo <wan101010@snu.ac.kr>
|
|
6
|
+
License: GPL-3.0
|
|
7
|
+
Project-URL: Homepage, https://github.com/Changwanseo/FunVIP
|
|
8
|
+
Requires-Python: <3.13,>=3.9
|
|
9
|
+
Description-Content-Type: text/markdown
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Requires-Dist: biopython==1.84
|
|
12
|
+
Requires-Dist: ete3==3.1.3
|
|
13
|
+
Requires-Dist: Cython
|
|
14
|
+
Requires-Dist: dendropy
|
|
15
|
+
Requires-Dist: GenMine<1.4.0,>=1.3.0
|
|
16
|
+
Requires-Dist: lxml
|
|
17
|
+
Requires-Dist: matplotlib
|
|
18
|
+
Requires-Dist: numpy<2.0.0
|
|
19
|
+
Requires-Dist: openpyxl==3.1.0
|
|
20
|
+
Requires-Dist: pandas==2.2.2
|
|
21
|
+
Requires-Dist: psutil
|
|
22
|
+
Requires-Dist: pyyaml
|
|
23
|
+
Requires-Dist: sip>=4.19.4
|
|
24
|
+
Requires-Dist: scikit-learn
|
|
25
|
+
Requires-Dist: scipy
|
|
26
|
+
Requires-Dist: tabulate
|
|
27
|
+
Requires-Dist: unidecode==1.2.0
|
|
28
|
+
Requires-Dist: xlrd==2.0.1
|
|
29
|
+
Requires-Dist: xlsxwriter
|
|
30
|
+
Requires-Dist: xmltodict==0.12.0
|
|
31
|
+
Requires-Dist: PyQt5>=5.15.0; sys_platform != "darwin"
|
|
32
|
+
Dynamic: license-file
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
# FunVIP [](https://zenodo.org/doi/10.5281/zenodo.10714946)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
FunVIP is now published please cite:
|
|
39
|
+
#### Seo CW, Yoo S, Cho Y, Kim JS, Steinegger M, Lim YW. FunVIP: Fungal Validation and Identification Pipeline based on phylogenetic analysis. J. Microbiol. 2025;63(4):e2411017.
|
|
40
|
+
<br><br/>
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
### **Fun**gal **V**alidation & **I**dentification **P**ipeline
|
|
46
|
+
#### An automatic tree-based sequence identification and validation pipeline for fungal (or maybe other) species
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
- Automatic tree-based identification
|
|
51
|
+
- Works with multiple genetic marker
|
|
52
|
+
- Database sequence validation algorithm implemented
|
|
53
|
+
|
|
54
|
+

|
|
55
|
+
|
|
56
|
+
Bug reports are always welcomed
|
|
57
|
+
<br><br/>
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
#### IMPORTANT NOTICE: The python dependency for Linux platform has changed from 3.12 to 3.11 for TCS inclusion. Please remake conda environment for FunVIP 0.3.25 update
|
|
62
|
+
|
|
63
|
+
## Tutorial
|
|
64
|
+
* [Part 1 - Getting started!](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/tutorial.md)
|
|
65
|
+
* [Part 2 - Preparing database and query](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/tutorial2.md)
|
|
66
|
+
* [Advanced tips](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/advanced.md)
|
|
67
|
+
<br><br/>
|
|
68
|
+
## Documentation
|
|
69
|
+
* See [Documentation](https://github.com/Changwanseo/FunVIP/blob/main/Documentation.md) for advanced usage !
|
|
70
|
+
<br><br/>
|
|
71
|
+
## Requirements
|
|
72
|
+
- Conda or Mamba environment
|
|
73
|
+
|
|
74
|
+
\* See [here](https://conda.io/projects/conda/en/latest/user-guide/install/index.html) for how to install conda environment
|
|
75
|
+
|
|
76
|
+
\* Recently, Mamba is a lot faster than conda. See [here](https://github.com/conda-forge/miniforge?tab=readme-ov-file) to how to install mamba environment
|
|
77
|
+
<br><br/>
|
|
78
|
+
## Installation
|
|
79
|
+
* [Windows](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/installation.md##Windows)
|
|
80
|
+
* [Mac - apple silicon](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/installation.md##Apple )
|
|
81
|
+
* [Linux](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/installation.md##Linux)
|
|
82
|
+
* [from source](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/installation.md##Installation)
|
|
83
|
+
<br><br/>
|
|
84
|
+
## Usage
|
|
85
|
+
```FunVIP --db {Your database file} --query {Your query file} --email {Your email} --gene {Your genes} --preset {fast or accurate}```
|
|
86
|
+
<br><br/>
|
|
87
|
+
### Example
|
|
88
|
+
```FunVIP --db Penicillium.xlsx --query Query.xlsx --email {Your email} --thread 8 --gene ITS BenA RPB2 CaM --preset fast```
|
|
89
|
+
|
|
90
|
+
\* See documentation for detailed usage
|
|
91
|
+
<br><br/>
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
## How to make database?
|
|
99
|
+

|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
[See example database here](https://github.com/Changwanseo/FunVIP/blob/main/funvip/test_dataset/penicillium/DB/DB_Penicillium.xlsx)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
<!--##
|
|
108
|
+
## What query formats can be used?
|
|
109
|
+
#### Query formats can be either
|
|
110
|
+
fasta (```.fa```, ```.fna```, ```.fas```, ```.fasta```, ```.txt```) or
|
|
111
|
+
tabular (```.xlsx```, ```.csv```, ```.parquet```, ```.ftr```) form
|
|
112
|
+
|
|
113
|
+
- fasta form : Do not use ambiguous accessions in your fasta name. For example, accessions "A1234" and "A123" can be confused in pipeline. Section and genus name of the sequences will be automatically assigned according to your database. So if you want to fix it, use tabular form
|
|
114
|
+
- tabular form : your table should include ```ID```, and ```{gene names}``` (highly recommended for multigene analysis)-->
|
|
115
|
+
|
|
116
|
+
<!--## Tips for method selection
|
|
117
|
+
* SEARCH_METHOD : blast is faster for smaller dataset, while mmseqs are faster in huge dataset, but consumes a lot of memory
|
|
118
|
+
* ALIGNMENT_METHOD : currently mafft is only available.
|
|
119
|
+
* TRIMMING_METHOD : use trimal or gblocks, in your favor. gblocks usally cuts more, but can be differ by advanced option. Use none if you have enough time and resource for calculation
|
|
120
|
+
* MODEL_METHOD : model method is currently not working good enough please wait
|
|
121
|
+
* TREE_METHOD : fasttree is fastest, but least accurate (However, still a lot accurate than NJ tree). It is treated that iqtree is faster but slightly less accurate than raxml, but iqtree requires at least 1000 bootstrap. So in case of speed, raxml could be a little bit faster when low bootstrap selected-->
|
|
122
|
+
|
|
123
|
+
## Results
|
|
124
|
+
* ```Section Assignment.xlsx``` : Your clustering result is here. You can find which of your sequences are clustered to which section
|
|
125
|
+
* ```Identification_result.xlsx``` : Your final identification result. Shows how your sequences were assigned to species level through tree-based identification
|
|
126
|
+
* ```report.xlsx``` : overall statistics about the tree. If your find taxon ends with numbers, these taxon are found to be paraphyletic, so should be checked
|
|
127
|
+
* ```/Tree/{section}_{gene}.svg``` : Final collapsed tree in svg format. Can be edited in vector graphics programs, or in powerpoint (by ungroup)
|
|
128
|
+
* ```/Tree/{section}_{gene}_original.svg ``` : Uncollapsed tree for inspection
|
|
129
|
+
|
|
130
|
+
* Example output tree of FunVIP
|
|
131
|
+

|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
## Scheduling
|
|
136
|
+
1. ~~Beta release part 1 (2023 Feburary ~ As paper published, ver 0.3)
|
|
137
|
+
Will be tested by our lab memebers to fix bugs and advance features~~
|
|
138
|
+
2. Beta release part 2 (As paper published ~ When pipeline gets stabled, ver 0.4)
|
|
139
|
+
Will be tested by peer taxonomists
|
|
140
|
+
3. Stable release (ver 1.0)
|
|
141
|
+
|
|
142
|
+
## License
|
|
143
|
+
[GPL 3.0](https://github.com/Changwanseo/FunVIP/blob/main/LICENSE)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
<!--
|
|
147
|
+
## Installation with conda (May not work with Linux or Mac)
|
|
148
|
+
1. ```conda create -n FunVO{ python=3.10```
|
|
149
|
+
2. ```conda activate FunVIP```
|
|
150
|
+
3. ```conda install -c cwseo FunVIP```
|
|
151
|
+
4. run ```FunVIP --test Terrei --email [your email] ``` to check installation
|
|
152
|
+
If this one fails, use next one
|
|
153
|
+
-->
|
|
154
|
+
<!--### GUI mode (\*Currently under development)
|
|
155
|
+
1. Go to ~/FunID-dev
|
|
156
|
+
2. ```streamlit run FunID_GUI.py```
|
|
157
|
+
* GUI run is on experimental
|
|
158
|
+
* If you want to edit GUI options, edit ```Option_manager.xlsx``` and variables in ```FunID_GUI.py```
|
|
159
|
+
### Server mode (\* Currently under development)-->
|
funvip-0.5.1/PKG-INFO
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: FunVIP
|
|
3
|
+
Version: 0.5.1
|
|
4
|
+
Summary: Fungal Validation & Identification Pipeline
|
|
5
|
+
Author-email: Changwan Seo <wan101010@snu.ac.kr>
|
|
6
|
+
License: GPL-3.0
|
|
7
|
+
Project-URL: Homepage, https://github.com/Changwanseo/FunVIP
|
|
8
|
+
Requires-Python: <3.13,>=3.9
|
|
9
|
+
Description-Content-Type: text/markdown
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Requires-Dist: biopython==1.84
|
|
12
|
+
Requires-Dist: ete3==3.1.3
|
|
13
|
+
Requires-Dist: Cython
|
|
14
|
+
Requires-Dist: dendropy
|
|
15
|
+
Requires-Dist: GenMine<1.4.0,>=1.3.0
|
|
16
|
+
Requires-Dist: lxml
|
|
17
|
+
Requires-Dist: matplotlib
|
|
18
|
+
Requires-Dist: numpy<2.0.0
|
|
19
|
+
Requires-Dist: openpyxl==3.1.0
|
|
20
|
+
Requires-Dist: pandas==2.2.2
|
|
21
|
+
Requires-Dist: psutil
|
|
22
|
+
Requires-Dist: pyyaml
|
|
23
|
+
Requires-Dist: sip>=4.19.4
|
|
24
|
+
Requires-Dist: scikit-learn
|
|
25
|
+
Requires-Dist: scipy
|
|
26
|
+
Requires-Dist: tabulate
|
|
27
|
+
Requires-Dist: unidecode==1.2.0
|
|
28
|
+
Requires-Dist: xlrd==2.0.1
|
|
29
|
+
Requires-Dist: xlsxwriter
|
|
30
|
+
Requires-Dist: xmltodict==0.12.0
|
|
31
|
+
Requires-Dist: PyQt5>=5.15.0; sys_platform != "darwin"
|
|
32
|
+
Dynamic: license-file
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
# FunVIP [](https://zenodo.org/doi/10.5281/zenodo.10714946)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
FunVIP is now published please cite:
|
|
39
|
+
#### Seo CW, Yoo S, Cho Y, Kim JS, Steinegger M, Lim YW. FunVIP: Fungal Validation and Identification Pipeline based on phylogenetic analysis. J. Microbiol. 2025;63(4):e2411017.
|
|
40
|
+
<br><br/>
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
### **Fun**gal **V**alidation & **I**dentification **P**ipeline
|
|
46
|
+
#### An automatic tree-based sequence identification and validation pipeline for fungal (or maybe other) species
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
- Automatic tree-based identification
|
|
51
|
+
- Works with multiple genetic marker
|
|
52
|
+
- Database sequence validation algorithm implemented
|
|
53
|
+
|
|
54
|
+

|
|
55
|
+
|
|
56
|
+
Bug reports are always welcomed
|
|
57
|
+
<br><br/>
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
#### IMPORTANT NOTICE: The python dependency for Linux platform has changed from 3.12 to 3.11 for TCS inclusion. Please remake conda environment for FunVIP 0.3.25 update
|
|
62
|
+
|
|
63
|
+
## Tutorial
|
|
64
|
+
* [Part 1 - Getting started!](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/tutorial.md)
|
|
65
|
+
* [Part 2 - Preparing database and query](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/tutorial2.md)
|
|
66
|
+
* [Advanced tips](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/advanced.md)
|
|
67
|
+
<br><br/>
|
|
68
|
+
## Documentation
|
|
69
|
+
* See [Documentation](https://github.com/Changwanseo/FunVIP/blob/main/Documentation.md) for advanced usage !
|
|
70
|
+
<br><br/>
|
|
71
|
+
## Requirements
|
|
72
|
+
- Conda or Mamba environment
|
|
73
|
+
|
|
74
|
+
\* See [here](https://conda.io/projects/conda/en/latest/user-guide/install/index.html) for how to install conda environment
|
|
75
|
+
|
|
76
|
+
\* Recently, Mamba is a lot faster than conda. See [here](https://github.com/conda-forge/miniforge?tab=readme-ov-file) to how to install mamba environment
|
|
77
|
+
<br><br/>
|
|
78
|
+
## Installation
|
|
79
|
+
* [Windows](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/installation.md##Windows)
|
|
80
|
+
* [Mac - apple silicon](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/installation.md##Apple )
|
|
81
|
+
* [Linux](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/installation.md##Linux)
|
|
82
|
+
* [from source](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/installation.md##Installation)
|
|
83
|
+
<br><br/>
|
|
84
|
+
## Usage
|
|
85
|
+
```FunVIP --db {Your database file} --query {Your query file} --email {Your email} --gene {Your genes} --preset {fast or accurate}```
|
|
86
|
+
<br><br/>
|
|
87
|
+
### Example
|
|
88
|
+
```FunVIP --db Penicillium.xlsx --query Query.xlsx --email {Your email} --thread 8 --gene ITS BenA RPB2 CaM --preset fast```
|
|
89
|
+
|
|
90
|
+
\* See documentation for detailed usage
|
|
91
|
+
<br><br/>
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
## How to make database?
|
|
99
|
+

|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
[See example database here](https://github.com/Changwanseo/FunVIP/blob/main/funvip/test_dataset/penicillium/DB/DB_Penicillium.xlsx)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
<!--##
|
|
108
|
+
## What query formats can be used?
|
|
109
|
+
#### Query formats can be either
|
|
110
|
+
fasta (```.fa```, ```.fna```, ```.fas```, ```.fasta```, ```.txt```) or
|
|
111
|
+
tabular (```.xlsx```, ```.csv```, ```.parquet```, ```.ftr```) form
|
|
112
|
+
|
|
113
|
+
- fasta form : Do not use ambiguous accessions in your fasta name. For example, accessions "A1234" and "A123" can be confused in pipeline. Section and genus name of the sequences will be automatically assigned according to your database. So if you want to fix it, use tabular form
|
|
114
|
+
- tabular form : your table should include ```ID```, and ```{gene names}``` (highly recommended for multigene analysis)-->
|
|
115
|
+
|
|
116
|
+
<!--## Tips for method selection
|
|
117
|
+
* SEARCH_METHOD : blast is faster for smaller dataset, while mmseqs are faster in huge dataset, but consumes a lot of memory
|
|
118
|
+
* ALIGNMENT_METHOD : currently mafft is only available.
|
|
119
|
+
* TRIMMING_METHOD : use trimal or gblocks, in your favor. gblocks usally cuts more, but can be differ by advanced option. Use none if you have enough time and resource for calculation
|
|
120
|
+
* MODEL_METHOD : model method is currently not working good enough please wait
|
|
121
|
+
* TREE_METHOD : fasttree is fastest, but least accurate (However, still a lot accurate than NJ tree). It is treated that iqtree is faster but slightly less accurate than raxml, but iqtree requires at least 1000 bootstrap. So in case of speed, raxml could be a little bit faster when low bootstrap selected-->
|
|
122
|
+
|
|
123
|
+
## Results
|
|
124
|
+
* ```Section Assignment.xlsx``` : Your clustering result is here. You can find which of your sequences are clustered to which section
|
|
125
|
+
* ```Identification_result.xlsx``` : Your final identification result. Shows how your sequences were assigned to species level through tree-based identification
|
|
126
|
+
* ```report.xlsx``` : overall statistics about the tree. If your find taxon ends with numbers, these taxon are found to be paraphyletic, so should be checked
|
|
127
|
+
* ```/Tree/{section}_{gene}.svg``` : Final collapsed tree in svg format. Can be edited in vector graphics programs, or in powerpoint (by ungroup)
|
|
128
|
+
* ```/Tree/{section}_{gene}_original.svg ``` : Uncollapsed tree for inspection
|
|
129
|
+
|
|
130
|
+
* Example output tree of FunVIP
|
|
131
|
+

|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
## Scheduling
|
|
136
|
+
1. ~~Beta release part 1 (2023 Feburary ~ As paper published, ver 0.3)
|
|
137
|
+
Will be tested by our lab memebers to fix bugs and advance features~~
|
|
138
|
+
2. Beta release part 2 (As paper published ~ When pipeline gets stabled, ver 0.4)
|
|
139
|
+
Will be tested by peer taxonomists
|
|
140
|
+
3. Stable release (ver 1.0)
|
|
141
|
+
|
|
142
|
+
## License
|
|
143
|
+
[GPL 3.0](https://github.com/Changwanseo/FunVIP/blob/main/LICENSE)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
<!--
|
|
147
|
+
## Installation with conda (May not work with Linux or Mac)
|
|
148
|
+
1. ```conda create -n FunVO{ python=3.10```
|
|
149
|
+
2. ```conda activate FunVIP```
|
|
150
|
+
3. ```conda install -c cwseo FunVIP```
|
|
151
|
+
4. run ```FunVIP --test Terrei --email [your email] ``` to check installation
|
|
152
|
+
If this one fails, use next one
|
|
153
|
+
-->
|
|
154
|
+
<!--### GUI mode (\*Currently under development)
|
|
155
|
+
1. Go to ~/FunID-dev
|
|
156
|
+
2. ```streamlit run FunID_GUI.py```
|
|
157
|
+
* GUI run is on experimental
|
|
158
|
+
* If you want to edit GUI options, edit ```Option_manager.xlsx``` and variables in ```FunID_GUI.py```
|
|
159
|
+
### Server mode (\* Currently under development)-->
|
|
@@ -1,18 +1,31 @@
|
|
|
1
1
|
|
|
2
2
|
# FunVIP [](https://zenodo.org/doi/10.5281/zenodo.10714946)
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
FunVIP is now published please cite:
|
|
6
|
+
#### Seo CW, Yoo S, Cho Y, Kim JS, Steinegger M, Lim YW. FunVIP: Fungal Validation and Identification Pipeline based on phylogenetic analysis. J. Microbiol. 2025;63(4):e2411017.
|
|
7
|
+
<br><br/>
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
3
12
|
### **Fun**gal **V**alidation & **I**dentification **P**ipeline
|
|
4
13
|
#### An automatic tree-based sequence identification and validation pipeline for fungal (or maybe other) species
|
|
5
14
|
|
|
15
|
+
|
|
16
|
+
|
|
6
17
|
- Automatic tree-based identification
|
|
7
18
|
- Works with multiple genetic marker
|
|
8
19
|
- Database sequence validation algorithm implemented
|
|
9
20
|
|
|
10
21
|

|
|
11
22
|
|
|
12
|
-
|
|
23
|
+
Bug reports are always welcomed
|
|
13
24
|
<br><br/>
|
|
14
25
|
|
|
15
|
-
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
#### IMPORTANT NOTICE: The python dependency for Linux platform has changed from 3.12 to 3.11 for TCS inclusion. Please remake conda environment for FunVIP 0.3.25 update
|
|
16
29
|
|
|
17
30
|
## Tutorial
|
|
18
31
|
* [Part 1 - Getting started!](https://github.com/Changwanseo/FunVIP/blob/main/tutorial/tutorial.md)
|
|
@@ -88,7 +101,7 @@ tabular (```.xlsx```, ```.csv```, ```.parquet```, ```.ftr```) form
|
|
|
88
101
|
|
|
89
102
|
## Scheduling
|
|
90
103
|
1. ~~Beta release part 1 (2023 Feburary ~ As paper published, ver 0.3)
|
|
91
|
-
Will be tested by our lab memebers to fix bugs and advance features~~
|
|
104
|
+
Will be tested by our lab memebers to fix bugs and advance features~~
|
|
92
105
|
2. Beta release part 2 (As paper published ~ When pipeline gets stabled, ver 0.4)
|
|
93
106
|
Will be tested by peer taxonomists
|
|
94
107
|
3. Stable release (ver 1.0)
|
|
@@ -410,3 +410,24 @@ def main():
|
|
|
410
410
|
logging.info(f"Time report generation: {round(time_end-time_visualize,3)}s")
|
|
411
411
|
except:
|
|
412
412
|
logging.warning(f"Failed logging reoprt generation time")
|
|
413
|
+
|
|
414
|
+
# At the end of the run, print critical messages once again to be noticed
|
|
415
|
+
with open(path.criticallog, "r") as frclog:
|
|
416
|
+
critical_log_lines = frclog.readlines()
|
|
417
|
+
|
|
418
|
+
critical_logs = []
|
|
419
|
+
flag_critical = 0
|
|
420
|
+
for line in critical_log_lines:
|
|
421
|
+
if "[CRITICAL]" in line:
|
|
422
|
+
flag_critical = 1
|
|
423
|
+
elif "[WARNING]" in line or "[ERROR]" in line:
|
|
424
|
+
flag_critical = 0
|
|
425
|
+
|
|
426
|
+
if flag_critical == 1:
|
|
427
|
+
critical_logs.append(line)
|
|
428
|
+
|
|
429
|
+
if len(critical_logs) > 0:
|
|
430
|
+
print("\n!!!<<<IMPORTANT NOTICE FROM FUNVIP RUN>>>!!!")
|
|
431
|
+
|
|
432
|
+
for line in critical_logs:
|
|
433
|
+
print(line)
|
|
@@ -114,6 +114,7 @@ def assign_gene(result_dict, V, cutoff=0.99):
|
|
|
114
114
|
return V
|
|
115
115
|
|
|
116
116
|
|
|
117
|
+
# This function assigns group to each FI
|
|
117
118
|
def cluster(FI, V_list_group, V_cSR, path, opt):
|
|
118
119
|
# Reduce memory by focusing on relevant rows
|
|
119
120
|
df_search = V_cSR[V_cSR["qseqid"] == FI.hash]
|
|
@@ -222,23 +223,23 @@ def append_outgroup(V_list_FI, df_search, gene, group, path, opt):
|
|
|
222
223
|
# split that same group to include all to alignment, and leave other groups for outgroup selection
|
|
223
224
|
cutoff_df = cutoff_df[cutoff_df["subject_group"] != group]
|
|
224
225
|
|
|
225
|
-
##
|
|
226
|
+
## Add suspicious database, mostly because of contaminated database
|
|
227
|
+
# Use term "ambiguous" instead of "suspicious" because of previous compatibility
|
|
226
228
|
# For each of the input, should use different cutoff
|
|
227
229
|
ambiguous_db = set()
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
ambiguous_db.update([FI_dict[i] for i in list(ambiguous_df["sseqid"])])
|
|
230
|
+
if opt.suspicious is True:
|
|
231
|
+
for qseqid, _df in cutoff_set_df.groupby(["qseqid"]):
|
|
232
|
+
# Select dataframe corresponding to current qseqid
|
|
233
|
+
df_qseqid = df_search[df_search["qseqid"] == qseqid[0]]
|
|
234
|
+
|
|
235
|
+
# Get the list of subjects, which is closer than furtest ingroup
|
|
236
|
+
ambiguous_df = df_qseqid[
|
|
237
|
+
df_qseqid["bitscore"] >= min(list(_df["bitscore"]))
|
|
238
|
+
]
|
|
239
|
+
# Within the furthest match, get possible ingroups with ambiguous group
|
|
240
|
+
ambiguous_df = ambiguous_df[ambiguous_df["subject_group"] != group]
|
|
241
|
+
# Add inner ambiugities to ambiguous db
|
|
242
|
+
ambiguous_db.update([FI_dict[i] for i in list(ambiguous_df["sseqid"])])
|
|
242
243
|
|
|
243
244
|
ambiguous_db = list(ambiguous_db)
|
|
244
245
|
|
|
@@ -308,12 +309,20 @@ def append_outgroup(V_list_FI, df_search, gene, group, path, opt):
|
|
|
308
309
|
f"Outgroup [{subject_group}] selected to [{group}]\n {text_outgroup_list}"
|
|
309
310
|
)
|
|
310
311
|
|
|
312
|
+
# Move outgroup within ambiguous db to outgroup
|
|
313
|
+
for FI in ambiguous_db:
|
|
314
|
+
if FI.group == subject_group:
|
|
315
|
+
ambiguous_db.remove(FI)
|
|
316
|
+
outgroup_dict[subject_group].append(FI)
|
|
317
|
+
|
|
311
318
|
return (
|
|
312
319
|
group,
|
|
313
320
|
gene,
|
|
314
321
|
outgroup_dict[subject_group],
|
|
315
322
|
ambiguous_db,
|
|
316
323
|
)
|
|
324
|
+
|
|
325
|
+
# If not use the outgroup sequences with the maximum number
|
|
317
326
|
else:
|
|
318
327
|
if len(outgroup_dict[subject_group]) > max_cnt:
|
|
319
328
|
max_cnt = len(outgroup_dict[subject_group])
|
|
@@ -330,6 +339,12 @@ def append_outgroup(V_list_FI, df_search, gene, group, path, opt):
|
|
|
330
339
|
f"Final outgroup selection for group {group} : {outgroup_dict[max_group]}"
|
|
331
340
|
)
|
|
332
341
|
|
|
342
|
+
# Move outgroup within ambiguous db to outgroup
|
|
343
|
+
for FI in ambiguous_db:
|
|
344
|
+
if FI.group == max_group:
|
|
345
|
+
ambiguous_db.remove(FI)
|
|
346
|
+
outgroup_dict[max_group].append(FI)
|
|
347
|
+
|
|
333
348
|
return (group, gene, outgroup_dict[max_group], ambiguous_db)
|
|
334
349
|
|
|
335
350
|
# If outgroup cannot be selected
|
|
@@ -507,6 +522,7 @@ def pipe_append_outgroup(V, path, opt):
|
|
|
507
522
|
|
|
508
523
|
# append outgroup by running result
|
|
509
524
|
# (group, gene, outgroup, ambiguous_group)
|
|
525
|
+
critical_flag = 0
|
|
510
526
|
for result in result_append_outgroup:
|
|
511
527
|
# Parsing result
|
|
512
528
|
group = result[0]
|
|
@@ -524,9 +540,10 @@ def pipe_append_outgroup(V, path, opt):
|
|
|
524
540
|
print(f"query: {len(V.dict_dataset[group][gene].list_qr_FI)}")
|
|
525
541
|
|
|
526
542
|
if len(outgroup) == 0 and len(ambiguous_group) == 0:
|
|
527
|
-
logging.
|
|
543
|
+
logging.critical(
|
|
528
544
|
f"Removing {group} {gene} from analysis because outgroup cannot be selected"
|
|
529
545
|
)
|
|
546
|
+
critical_flag = 1
|
|
530
547
|
V.dict_dataset[group].pop(gene, None)
|
|
531
548
|
elif (
|
|
532
549
|
len(outgroup)
|
|
@@ -535,15 +552,17 @@ def pipe_append_outgroup(V, path, opt):
|
|
|
535
552
|
+ len(V.dict_dataset[group][gene].list_qr_FI)
|
|
536
553
|
< 4
|
|
537
554
|
):
|
|
538
|
-
logging.
|
|
555
|
+
logging.critical(
|
|
539
556
|
f"Removing {group} {gene} from analysis because not enough sequences are provided to infer phylogenetic tree"
|
|
540
557
|
)
|
|
558
|
+
critical_flag = 1
|
|
541
559
|
V.dict_dataset[group].pop(gene, None)
|
|
542
560
|
|
|
543
561
|
else:
|
|
544
562
|
V.dict_dataset[group][gene].list_og_FI = outgroup
|
|
563
|
+
|
|
545
564
|
# Add ambiguous group to FI
|
|
546
|
-
if opt.
|
|
565
|
+
if opt.suspicious is True:
|
|
547
566
|
V.dict_dataset[group][gene].list_db_FI += ambiguous_group
|
|
548
567
|
# Add outgroup and db in to dict_hash_FI
|
|
549
568
|
|
|
@@ -552,11 +571,16 @@ def pipe_append_outgroup(V, path, opt):
|
|
|
552
571
|
for group in groups:
|
|
553
572
|
try:
|
|
554
573
|
if len(V.dict_dataset[group]) == 0:
|
|
555
|
-
logging.
|
|
574
|
+
logging.critical(
|
|
556
575
|
f"Removing {group} from analysis because outgroup cannot be selected to all genes"
|
|
557
576
|
)
|
|
577
|
+
critical_flag = 1
|
|
558
578
|
V.dict_dataset.pop(group, None)
|
|
559
579
|
except:
|
|
560
580
|
pass
|
|
561
581
|
|
|
582
|
+
# Terminate if terminate option is given, and critical error occurs
|
|
583
|
+
if critical_flag == 1 and opt.terminate is True:
|
|
584
|
+
raise Exception
|
|
585
|
+
|
|
562
586
|
return V, path, opt
|
|
@@ -309,9 +309,14 @@ class CommandParser:
|
|
|
309
309
|
type=int,
|
|
310
310
|
)
|
|
311
311
|
group_advanced.add_argument(
|
|
312
|
-
"--
|
|
312
|
+
"--nosuspicious",
|
|
313
313
|
action="store_true",
|
|
314
|
-
help="Do not include
|
|
314
|
+
help="Do not include suspicious samples for sequence-set. Mostly for metabarcoding analysis. May deduce inaccurate result with problematic database.",
|
|
315
|
+
)
|
|
316
|
+
group_advanced.add_argument(
|
|
317
|
+
"--terminate",
|
|
318
|
+
action="store_true",
|
|
319
|
+
help="Terminate FunVIP run when critical error detected",
|
|
315
320
|
)
|
|
316
321
|
|
|
317
322
|
# Cache
|
|
@@ -462,6 +462,8 @@ class FunVIP_var:
|
|
|
462
462
|
fail_list = []
|
|
463
463
|
remove_dict = {}
|
|
464
464
|
tree_hash_dict = hasher.encode(self.list_FI, newick=True)
|
|
465
|
+
|
|
466
|
+
critical_flag = 0
|
|
465
467
|
for group in self.dict_dataset:
|
|
466
468
|
remove_dict[group] = {}
|
|
467
469
|
for gene in self.dict_dataset[group]:
|
|
@@ -545,9 +547,38 @@ class FunVIP_var:
|
|
|
545
547
|
## If all value of vectors are zero, it means that all regions have at least one gap
|
|
546
548
|
## Raise warning for this
|
|
547
549
|
if np.all((vector_products == 0)):
|
|
548
|
-
logging.
|
|
550
|
+
logging.critical(
|
|
549
551
|
f"Alignment for {group} {gene} does not have any overlapping regions! Removing from analysis"
|
|
550
552
|
)
|
|
553
|
+
|
|
554
|
+
critical_flag = 1
|
|
555
|
+
|
|
556
|
+
# Report one non_overlapping pair
|
|
557
|
+
for i in range(len(seq_list) - 1):
|
|
558
|
+
seq1 = seq_list[i]
|
|
559
|
+
seq1_hash = seq1.id
|
|
560
|
+
seq1_str = str(seq.seq)
|
|
561
|
+
|
|
562
|
+
for j in range(i + 1, len(seq_list)):
|
|
563
|
+
seq2 = seq_list[j]
|
|
564
|
+
seq2_hash = seq2.id
|
|
565
|
+
seq2_str = str(seq.seq)
|
|
566
|
+
|
|
567
|
+
has_overlap = False
|
|
568
|
+
|
|
569
|
+
for k in range(len(seq1_str)):
|
|
570
|
+
if seq1_str[k] != "-" and seq2_str[k] != "-":
|
|
571
|
+
has_overlap = True
|
|
572
|
+
break
|
|
573
|
+
|
|
574
|
+
seq1_id = self.dict_hash_FI[seq1_hash]
|
|
575
|
+
seq2_id = self.dict_hash_FI[seq2_hash]
|
|
576
|
+
|
|
577
|
+
logging.critical(
|
|
578
|
+
f"At least one pair of sequence does not overlap, such as {seq1_id} and {seq2_id}"
|
|
579
|
+
)
|
|
580
|
+
critical_flag = 1
|
|
581
|
+
|
|
551
582
|
fail_list.append((group, gene))
|
|
552
583
|
# for tree, use hash dict with genus and species information
|
|
553
584
|
# Decoding process in done in tree building processes, so these alignments cannot be decoded. So decode them here
|
|
@@ -575,6 +606,10 @@ class FunVIP_var:
|
|
|
575
606
|
# If alignment corresponding to dataset does not exists, raise warning or error
|
|
576
607
|
pass
|
|
577
608
|
|
|
609
|
+
# Terminate if terminate option is given, and critical error occurs
|
|
610
|
+
if critical_flag == 1 and opt.terminate is True:
|
|
611
|
+
raise Exception
|
|
612
|
+
|
|
578
613
|
# Remove bad datasets
|
|
579
614
|
for fail in fail_list:
|
|
580
615
|
group = fail[0]
|
|
@@ -18,6 +18,11 @@ def newick_legal(string: str) -> str:
|
|
|
18
18
|
return str(string)
|
|
19
19
|
|
|
20
20
|
|
|
21
|
+
# Fix "&" sign appropriate for svg
|
|
22
|
+
def svg_legal(string: str) -> str:
|
|
23
|
+
return string.replace("&", "&")
|
|
24
|
+
|
|
25
|
+
|
|
21
26
|
# Encode funinfo_list and return hash dict
|
|
22
27
|
def encode(funinfo_list: list, newick: bool = False) -> dict:
|
|
23
28
|
hash_dict = {}
|
|
@@ -53,13 +58,28 @@ def encode(funinfo_list: list, newick: bool = False) -> dict:
|
|
|
53
58
|
# Decode given file with given hash_dict
|
|
54
59
|
|
|
55
60
|
|
|
56
|
-
def decode(
|
|
61
|
+
def decode(
|
|
62
|
+
hash_dict: dict, file: str, out: str, newick: bool = True, svg: bool = False
|
|
63
|
+
) -> None:
|
|
57
64
|
with open(file, "rt") as fp:
|
|
58
65
|
content = fp.read()
|
|
59
66
|
|
|
67
|
+
if newick and svg:
|
|
68
|
+
hash_dict = {
|
|
69
|
+
re.escape(k): svg_legal(newick_legal(v)) for k, v in hash_dict.items()
|
|
70
|
+
}
|
|
71
|
+
elif newick:
|
|
72
|
+
hash_dict = {re.escape(k): newick_legal(v) for k, v in hash_dict.items()}
|
|
73
|
+
elif svg:
|
|
74
|
+
hash_dict = {re.escape(k): svg_legal(v) for k, v in hash_dict.items()}
|
|
75
|
+
else:
|
|
76
|
+
hash_dict = {re.escape(k): v for k, v in hash_dict.items()}
|
|
77
|
+
|
|
78
|
+
"""
|
|
60
79
|
hash_dict = {
|
|
61
80
|
re.escape(k): (newick_legal(v) if newick else v) for k, v in hash_dict.items()
|
|
62
81
|
}
|
|
82
|
+
"""
|
|
63
83
|
pattern = re.compile("|".join(hash_dict.keys()))
|
|
64
84
|
|
|
65
85
|
# Perform the substitution
|