FunVIP 0.3.24.7__tar.gz → 0.4.0__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.24.7 → funvip-0.4.0}/FunVIP.egg-info/PKG-INFO +2 -3
- {funvip-0.3.24.7 → funvip-0.4.0}/FunVIP.egg-info/requires.txt +0 -1
- {funvip-0.3.24.7 → funvip-0.4.0}/PKG-INFO +2 -3
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/main.py +1 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/preset/accurate.yaml +1 -3
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/preset/fast.yaml +0 -1
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/cluster.py +20 -2
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/command.py +15 -10
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/concatenate.py +10 -3
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/dataset.py +60 -18
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/ext.py +30 -5
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/initialize.py +34 -12
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/logger.py +6 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/opt_generator.py +16 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/reporter.py +4 -3
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/search.py +5 -4
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/tool.py +5 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/tree.py +2 -2
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/validate_input.py +25 -8
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/validate_option.py +66 -36
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/test_dataset/penicillium/preset.yaml +1 -4
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/test_dataset/sanghuangporus/preset.yaml +1 -2
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/test_dataset/terrei/preset.yaml +1 -3
- {funvip-0.3.24.7 → funvip-0.4.0}/pyproject.toml +2 -3
- {funvip-0.3.24.7 → funvip-0.4.0}/FunVIP.egg-info/SOURCES.txt +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/FunVIP.egg-info/dependency_links.txt +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/FunVIP.egg-info/entry_points.txt +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/FunVIP.egg-info/top_level.txt +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/LICENSE +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/MANIFEST.in +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/README.md +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/FunVIP_GUI.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/__init__.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/data/Option_manager.xlsx +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/data/__init__.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/data/genus_line.txt +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/BLAST_Windows/Uninstall-ncbi-blast-2.12.0+.exe +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/BLAST_Windows/bin/blastn.exe +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/BLAST_Windows/bin/cleanup-blastdb-volumes.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/BLAST_Windows/bin/get_species_taxids.sh +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/BLAST_Windows/bin/legacy_blast.pl +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/BLAST_Windows/bin/makeblastdb.exe +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/BLAST_Windows/bin/nghttp2.dll +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/BLAST_Windows/bin/update_blastdb.pl +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/BLAST_Windows/doc/README.txt +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/FastTree_Windows/FastTree.exe +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/Documentation/Gblocks_documentation.html +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/Gblocks.exe +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/cox2.pir +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/cytb.pir +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/nad3.pir +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/nad5.pir +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/nad3.pir +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/paths +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/MAFFT_LICENSE +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/MAFFT_Windows.zip +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/RAxML_Windows/GPL-3.0.txt +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/RAxML_Windows/README +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/RAxML_Windows/raxmlHPC-PTHREADS-AVX2.exe +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/__init__.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/iqtree/bin/iqtree2-click.exe +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/iqtree/bin/iqtree2.exe +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/iqtree/bin/libiomp5md.dll +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/iqtree/example.cf +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/iqtree/example.nex +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/iqtree/example.phy +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/iqtree/models.nex +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/LICENSE.md +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/README.md +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/bin/busybox.exe +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/bin/cygbz2-1.dll +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/bin/cyggcc_s-seh-1.dll +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/bin/cyggomp-1.dll +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/bin/cygstdc++-6.dll +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/bin/cygwin1.dll +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/bin/cygz.dll +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/bin/mmseqs.exe +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/examples/QUERY.fasta +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/PAM10.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/PAM100.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/PAM110.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/PAM120.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/PAM130.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/PAM140.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/PAM150.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/PAM160.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/PAM170.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/PAM180.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/PAM190.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/PAM20.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/PAM30.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/PAM40.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/PAM50.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/PAM60.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/PAM70.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/PAM80.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/PAM90.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/VTML10.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/VTML120.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/VTML160.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/VTML20.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/VTML40.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/VTML80.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/blosum100.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/blosum30.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/blosum35.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/blosum40.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/blosum45.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/blosum50.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/blosum55.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/blosum60.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/blosum62.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/blosum65.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/blosum70.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/blosum75.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/blosum80.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/blosum85.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/blosum90.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/blosum95.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/matrices/nucleotide.out +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/mmseqs.bat +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/mmseqs_Windows/util/bash-completion.sh +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/AUTHORS +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/CHANGELOG +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/LICENSE +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/README +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/bin/libgcc_s_dw2-1.dll +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/bin/libstdc++-6.dll +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/bin/trimal.exe +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/scripts/check_codon_alignments.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/scripts/compare_trimmed_msas.sh +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/scripts/generateRandomAlignmentsUsingAsSeedRealAlignments.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/scripts/generate_trimmed_msas.sh +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/scripts/get_sequence_representative_from_alignment.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/scripts/get_sequences_gaps_ratio.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/scripts/remove_shorter_sequences.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/scripts/selective_trimming_for_dNdS_analyses.based_neighbours.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/scripts/set_manual_boundaries.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/alignment.cpp +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/alignment.h +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/alignment.o +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/autAlignment.cpp +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/autAlignment.o +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.cpp +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.h +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.o +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/defines.h +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/main.cpp +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/makefile +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/makefile.MacOS +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/readAl.cpp +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/readal.exe +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/rwAlignment.cpp +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/rwAlignment.o +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.cpp +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.h +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.o +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.cpp +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.h +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.o +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/statAl.cpp +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/statal.exe +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.cpp +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.h +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.o +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/statisticsFiles.cpp +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/statisticsFiles.h +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.cpp +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.h +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.o +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/utils.cpp +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/utils.h +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/utils.o +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/external/trimal.v1.4/trimAl/source/values.h +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/preset/.gitignore +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/.gitignore +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__init__.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/CATV_pipe.cpython-310.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/CAT_V.cpython-310.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/CAT_V.cpython-39.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/CAT_V_pipe.cpython-39.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/__init__.cpython-310.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/__init__.cpython-39.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/align.cpython-310.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/cluster.cpython-39.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/dataset.cpython-39.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/ext.cpython-310.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/ext.cpython-39.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/hasher.cpython-39.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/initialize.cpython-39.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/io.cpython-310.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/io.cpython-39.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/logger.cpython-39.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/modeltest.cpython-39.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/multigene.cpython-39.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/ncbi.cpython-39.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/opt_generator.cpython-39.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/reporter.cpython-39.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/search.cpython-39.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/tool.cpython-39.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/validation.cpython-39.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/__pycache__/visualize.cpython-39.pyc +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/align.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/hasher.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/logics.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/modeltest.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/ncbi.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/save.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/templates/template.html +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/tree_interpretation.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/tree_interpretation_pipe.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/trim.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/validation.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/version.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/src/visualize.py +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/test_dataset/penicillium/DB/DB_Penicillium.xlsx +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/test_dataset/penicillium/Options.config +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/test_dataset/penicillium/Query/Query.xlsx +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/test_dataset/sanghuangporus/DB/FunVIP_Sanghuangporus_db.xlsx +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/test_dataset/sanghuangporus/Query/FunVIP_Sanghuangporus_query.xlsx +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/test_dataset/terrei/DB/FunVIP_Aspergillus_db.xlsx +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/funvip/test_dataset/terrei/Query/FunVIP_Aspergillus_query.xlsx +0 -0
- {funvip-0.3.24.7 → funvip-0.4.0}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: FunVIP
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: Fungal Validation & Identification Pipeline
|
|
5
5
|
Author-email: Changwan Seo <wan101010@snu.ac.kr>
|
|
6
6
|
License: GPL-3.0
|
|
@@ -17,7 +17,6 @@ Requires-Dist: matplotlib
|
|
|
17
17
|
Requires-Dist: numpy<2.0.0
|
|
18
18
|
Requires-Dist: openpyxl==3.1.0
|
|
19
19
|
Requires-Dist: pandas==2.2.2
|
|
20
|
-
Requires-Dist: plotly==5.9.0
|
|
21
20
|
Requires-Dist: psutil
|
|
22
21
|
Requires-Dist: pyyaml
|
|
23
22
|
Requires-Dist: sip>=4.19.4
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: FunVIP
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.0
|
|
4
4
|
Summary: Fungal Validation & Identification Pipeline
|
|
5
5
|
Author-email: Changwan Seo <wan101010@snu.ac.kr>
|
|
6
6
|
License: GPL-3.0
|
|
@@ -17,7 +17,6 @@ Requires-Dist: matplotlib
|
|
|
17
17
|
Requires-Dist: numpy<2.0.0
|
|
18
18
|
Requires-Dist: openpyxl==3.1.0
|
|
19
19
|
Requires-Dist: pandas==2.2.2
|
|
20
|
-
Requires-Dist: plotly==5.9.0
|
|
21
20
|
Requires-Dist: psutil
|
|
22
21
|
Requires-Dist: pyyaml
|
|
23
22
|
Requires-Dist: sip>=4.19.4
|
|
@@ -223,6 +223,7 @@ def main():
|
|
|
223
223
|
logging.info("TRIMMING")
|
|
224
224
|
V, path, opt = trim.pipe_trimming(V, path, opt)
|
|
225
225
|
# Alignment validations - whether some of the sequences does not have overlapping regions
|
|
226
|
+
# Calculate TCS score if speicified by option
|
|
226
227
|
V.validate_alignments(path=path, opt=opt)
|
|
227
228
|
R.update_report(
|
|
228
229
|
V=V,
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
MODE: identification
|
|
2
2
|
CONTINUE: false
|
|
3
3
|
QUERYONLY: true
|
|
4
|
-
CONFIDENT:
|
|
5
|
-
CONCATENATE: true
|
|
4
|
+
CONFIDENT: fale
|
|
6
5
|
MAXOUTGROUP: 3
|
|
7
6
|
SEARCH: blast
|
|
8
7
|
ALIGNMENT: mafft
|
|
@@ -26,5 +25,4 @@ MAFFT-ep: 0.1
|
|
|
26
25
|
AVX: true
|
|
27
26
|
CACHEDB: true
|
|
28
27
|
USECACHE: true
|
|
29
|
-
FULLGENUS: true
|
|
30
28
|
|
|
@@ -245,14 +245,14 @@ def append_outgroup(V_list_FI, df_search, gene, group, path, opt):
|
|
|
245
245
|
# If no or fewer than designated number of outgroup matches to condition, use flexible criteria
|
|
246
246
|
if cutoff_df.groupby(["subject_group"]).count().empty:
|
|
247
247
|
logging.warning(
|
|
248
|
-
f"Not enough outgroup sequences matched for
|
|
248
|
+
f"Not enough outgroup sequences matched for {opt.level} {group} | gene {gene}. There might be outlier sequence that does not matches to group. Trying flexible cutoff"
|
|
249
249
|
)
|
|
250
250
|
cutoff_df = df_search[df_search["bitscore"] > 0]
|
|
251
251
|
cutoff_df = cutoff_df[cutoff_df["subject_group"] != group]
|
|
252
252
|
|
|
253
253
|
elif cutoff_df.groupby(["subject_group"]).count()["sseqid"].max() < opt.maxoutgroup:
|
|
254
254
|
logging.warning(
|
|
255
|
-
f"Not enough outgroup sequences matched for
|
|
255
|
+
f"Not enough outgroup sequences matched for {opt.level} {group} | gene {gene}. There might be outlier sequence that does not matches to group. Trying flexible cutoff"
|
|
256
256
|
)
|
|
257
257
|
cutoff_df = df_search[df_search["bitscore"] > 0]
|
|
258
258
|
cutoff_df = cutoff_df[cutoff_df["subject_group"] != group]
|
|
@@ -516,11 +516,29 @@ def pipe_append_outgroup(V, path, opt):
|
|
|
516
516
|
|
|
517
517
|
# Add outgroup and ambiguous groups to dataset
|
|
518
518
|
# Ambiguous groups are strains locating between outgroup and ingroups, so cannot be decided
|
|
519
|
+
|
|
520
|
+
print(f"{group} {gene}")
|
|
521
|
+
print(f"outgroup {len(outgroup)}")
|
|
522
|
+
print(f"ambiguous_group {len(ambiguous_group)}")
|
|
523
|
+
print(f"db: {len(V.dict_dataset[group][gene].list_db_FI)}")
|
|
524
|
+
print(f"query: {len(V.dict_dataset[group][gene].list_qr_FI)}")
|
|
525
|
+
|
|
519
526
|
if len(outgroup) == 0 and len(ambiguous_group) == 0:
|
|
520
527
|
logging.warning(
|
|
521
528
|
f"Removing {group} {gene} from analysis because outgroup cannot be selected"
|
|
522
529
|
)
|
|
523
530
|
V.dict_dataset[group].pop(gene, None)
|
|
531
|
+
elif (
|
|
532
|
+
len(outgroup)
|
|
533
|
+
+ len(ambiguous_group)
|
|
534
|
+
+ len(V.dict_dataset[group][gene].list_db_FI)
|
|
535
|
+
+ len(V.dict_dataset[group][gene].list_qr_FI)
|
|
536
|
+
< 4
|
|
537
|
+
):
|
|
538
|
+
logging.warning(
|
|
539
|
+
f"Removing {group} {gene} from analysis because not enough sequences are provided to infer phylogenetic tree"
|
|
540
|
+
)
|
|
541
|
+
V.dict_dataset[group].pop(gene, None)
|
|
524
542
|
|
|
525
543
|
else:
|
|
526
544
|
V.dict_dataset[group][gene].list_og_FI = outgroup
|
|
@@ -91,7 +91,7 @@ class CommandParser:
|
|
|
91
91
|
"--continue",
|
|
92
92
|
dest="continue_from_previous",
|
|
93
93
|
action="store_true",
|
|
94
|
-
help="Continue from previous run",
|
|
94
|
+
help="Continue from previous run, default: False",
|
|
95
95
|
)
|
|
96
96
|
group_run.add_argument(
|
|
97
97
|
"--step",
|
|
@@ -106,7 +106,7 @@ class CommandParser:
|
|
|
106
106
|
group_run.add_argument(
|
|
107
107
|
"--all",
|
|
108
108
|
action="store_true",
|
|
109
|
-
help="Run FunVIP for all database sequences, regardless of
|
|
109
|
+
help="Run FunVIP for all database sequences, regardless of corresponding sequences exists in query, default : False",
|
|
110
110
|
)
|
|
111
111
|
group_run.add_argument(
|
|
112
112
|
"--confident",
|
|
@@ -127,6 +127,11 @@ class CommandParser:
|
|
|
127
127
|
help="Multiple sequence alignment methods, [mafft], default : mafft",
|
|
128
128
|
type=str,
|
|
129
129
|
)
|
|
130
|
+
group_method.add_argument(
|
|
131
|
+
"--notcs",
|
|
132
|
+
action="store_true",
|
|
133
|
+
help="Skip T-COFFEE TCS(Transitive Consistency Score) for alignment validation. default: False",
|
|
134
|
+
)
|
|
130
135
|
group_method.add_argument(
|
|
131
136
|
"--trim",
|
|
132
137
|
help="Trimming methods, [trimal, gblocks, none], default : trimal",
|
|
@@ -227,9 +232,9 @@ class CommandParser:
|
|
|
227
232
|
type=int,
|
|
228
233
|
)
|
|
229
234
|
group_advanced.add_argument(
|
|
230
|
-
"--
|
|
235
|
+
"--nosolveflat",
|
|
231
236
|
action="store_true",
|
|
232
|
-
help="
|
|
237
|
+
help="Do not detect 0 length branch and automatically solve them, default : False",
|
|
233
238
|
)
|
|
234
239
|
group_advanced.add_argument(
|
|
235
240
|
"--regex",
|
|
@@ -284,7 +289,7 @@ class CommandParser:
|
|
|
284
289
|
group_advanced.add_argument(
|
|
285
290
|
"--allow-innertrimming",
|
|
286
291
|
dest="allow_innertrimming",
|
|
287
|
-
help="Turn off FunVIP adjustment to not to trim inner alignment columns",
|
|
292
|
+
help="Turn off FunVIP adjustment to not to trim inner alignment columns, default: False",
|
|
288
293
|
action="store_true",
|
|
289
294
|
)
|
|
290
295
|
group_advanced.add_argument(
|
|
@@ -296,7 +301,7 @@ class CommandParser:
|
|
|
296
301
|
group_advanced.add_argument(
|
|
297
302
|
"--noavx",
|
|
298
303
|
action="store_true",
|
|
299
|
-
help="
|
|
304
|
+
help="Do not use AVX for RAxML, default: False",
|
|
300
305
|
)
|
|
301
306
|
group_advanced.add_argument(
|
|
302
307
|
"--outgroupoffset",
|
|
@@ -306,7 +311,7 @@ class CommandParser:
|
|
|
306
311
|
group_advanced.add_argument(
|
|
307
312
|
"--noambiguous",
|
|
308
313
|
action="store_true",
|
|
309
|
-
help="
|
|
314
|
+
help="Do not include ambiguous samples for sequence-set. Mostly for metabarcoding analysis. It may result wrong result with problematic database.",
|
|
310
315
|
)
|
|
311
316
|
|
|
312
317
|
# Cache
|
|
@@ -315,9 +320,9 @@ class CommandParser:
|
|
|
315
320
|
description="Save search database for faster run in next time",
|
|
316
321
|
)
|
|
317
322
|
group_cache.add_argument(
|
|
318
|
-
"--
|
|
323
|
+
"--nocachedb",
|
|
319
324
|
action="store_true",
|
|
320
|
-
help="
|
|
325
|
+
help="Disable caching current search database. Use it if your database is too big for system directory, default : True",
|
|
321
326
|
)
|
|
322
327
|
group_cache.add_argument(
|
|
323
328
|
"--usecache",
|
|
@@ -344,7 +349,7 @@ class CommandParser:
|
|
|
344
349
|
group_save.add_argument(
|
|
345
350
|
"--nosearchresult",
|
|
346
351
|
action="store_true",
|
|
347
|
-
help="Do not save blast/mmseqs search matrix, use when dataset gets too big and generates IO bottleneck",
|
|
352
|
+
help="Do not save blast/mmseqs search matrix, use when dataset gets too big and generates IO bottleneck, default: False",
|
|
348
353
|
)
|
|
349
354
|
|
|
350
355
|
# Preset
|
|
@@ -57,10 +57,10 @@ def combine_alignment(V, opt, path):
|
|
|
57
57
|
|
|
58
58
|
# Generate partition file
|
|
59
59
|
with open(
|
|
60
|
-
f"{path.out_alignment}/{opt.runname}_{group}.partition",
|
|
60
|
+
f"{path.out_alignment}/partition/{opt.runname}_{group}.partition",
|
|
61
|
+
"w",
|
|
61
62
|
) as fw:
|
|
62
63
|
tot_len = 0
|
|
63
|
-
print(gene_list)
|
|
64
64
|
for gene in gene_list:
|
|
65
65
|
# gene_list.append(gene)
|
|
66
66
|
fw.write(f"DNA, {gene}= {tot_len+1}-{tot_len+len_dict[gene]}\n")
|
|
@@ -109,7 +109,8 @@ def combine_alignment(V, opt, path):
|
|
|
109
109
|
)
|
|
110
110
|
)
|
|
111
111
|
with open(
|
|
112
|
-
f"{path.out_alignment}/{opt.runname}_{group}.partition",
|
|
112
|
+
f"{path.out_alignment}/partition/{opt.runname}_{group}.partition",
|
|
113
|
+
"w",
|
|
113
114
|
) as fw:
|
|
114
115
|
fw.write(f"DNA, {singlegene}= 1-{gene_length}\n")
|
|
115
116
|
|
|
@@ -273,9 +274,15 @@ def concatenate_df(V, path, opt):
|
|
|
273
274
|
mean_linear_constant = linear_constant.mean()
|
|
274
275
|
|
|
275
276
|
# Fill missing bitscores
|
|
277
|
+
"""
|
|
276
278
|
df[f"{gene}_bitscore"].fillna(
|
|
277
279
|
coeff[k] - mean_linear_constant * grad[k], inplace=True
|
|
278
280
|
)
|
|
281
|
+
"""
|
|
282
|
+
df.fillna(
|
|
283
|
+
{f"{gene}_bitscore": coeff[k] - mean_linear_constant * grad[k]},
|
|
284
|
+
inplace=True,
|
|
285
|
+
)
|
|
279
286
|
return df
|
|
280
287
|
|
|
281
288
|
# Change to numpy for faster cazlculation
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
from funvip.src import save
|
|
2
2
|
from funvip.src import hasher
|
|
3
|
+
from funvip.src import ext
|
|
4
|
+
from funvip.src.opt_generator import opt_generator
|
|
3
5
|
from Bio import SeqIO
|
|
4
6
|
import os
|
|
5
7
|
import sys
|
|
6
8
|
import shutil
|
|
7
9
|
import numpy as np
|
|
10
|
+
import multiprocessing as mp
|
|
8
11
|
import logging
|
|
9
12
|
import re
|
|
10
13
|
import json
|
|
@@ -207,7 +210,7 @@ class FunVIP_var:
|
|
|
207
210
|
for group in self.list_group:
|
|
208
211
|
logging.info(f"Generating dataset for {group}")
|
|
209
212
|
|
|
210
|
-
print(f"opt.queryonly: {opt.queryonly}")
|
|
213
|
+
# print(f"opt.queryonly: {opt.queryonly}")
|
|
211
214
|
|
|
212
215
|
dict_funinfo[group] = {}
|
|
213
216
|
|
|
@@ -455,6 +458,7 @@ class FunVIP_var:
|
|
|
455
458
|
|
|
456
459
|
# Validate if any multiple sequence alignment has no overlapping region
|
|
457
460
|
def validate_alignments(self, path, opt):
|
|
461
|
+
# 1. Manual validation for illegal alignments
|
|
458
462
|
fail_list = []
|
|
459
463
|
remove_dict = {}
|
|
460
464
|
tree_hash_dict = hasher.encode(self.list_FI, newick=True)
|
|
@@ -510,16 +514,6 @@ class FunVIP_var:
|
|
|
510
514
|
|
|
511
515
|
remove_dict[group][gene] = remove_hash
|
|
512
516
|
|
|
513
|
-
"""
|
|
514
|
-
for _hash in remove_hash:
|
|
515
|
-
if _hash in self.dict_dataset[group][gene].list_db_FI:
|
|
516
|
-
self.dict_dataset[group][gene].list_db_FI.pop(_hash)
|
|
517
|
-
if _hash in self.dict_dataset[group][gene].list_query_FI:
|
|
518
|
-
self.dict_dataset[group][gene].list_query_FI.pop(_hash)
|
|
519
|
-
if _hash in self.dict_dataset[group][gene].list_og_FI:
|
|
520
|
-
self.dict_dataset[group][gene].list_og_FI.pop(_hash)
|
|
521
|
-
"""
|
|
522
|
-
|
|
523
517
|
# Remove unusable sequence and re-read it
|
|
524
518
|
## db_list, query_list, outgroup_list might has to be changed
|
|
525
519
|
seq_list = [
|
|
@@ -591,12 +585,12 @@ class FunVIP_var:
|
|
|
591
585
|
# Add issue
|
|
592
586
|
for fail in fail_list:
|
|
593
587
|
for FI in self.list_FI:
|
|
594
|
-
if
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
588
|
+
if (
|
|
589
|
+
FI.adjusted_group == fail[0]
|
|
590
|
+
and fail[1] in FI.seq
|
|
591
|
+
and FI.seq[fail[1]] != ""
|
|
592
|
+
):
|
|
593
|
+
FI.issues.add(f"alignfail:{fail[1]}")
|
|
600
594
|
|
|
601
595
|
logging.debug("Remove dict")
|
|
602
596
|
logging.debug(remove_dict)
|
|
@@ -701,7 +695,55 @@ class FunVIP_var:
|
|
|
701
695
|
if FI.seq[fail[1]] != "":
|
|
702
696
|
FI.issues.add(f"lackseq")
|
|
703
697
|
|
|
704
|
-
#
|
|
698
|
+
# Validate multiple sequence alignment with TCS score from T-COFFEE
|
|
699
|
+
# As T-COFFEE build is only available in Mac and Linux, should check if it is available
|
|
700
|
+
if opt.method.tcs is True:
|
|
701
|
+
bad_cnt = 0
|
|
702
|
+
|
|
703
|
+
if opt.verbose < 3:
|
|
704
|
+
tcs_opt = opt_generator(
|
|
705
|
+
V=self, opt=opt, path=path, step="tcs", thread=1
|
|
706
|
+
)
|
|
707
|
+
p = mp.Pool(opt.thread)
|
|
708
|
+
p.starmap(ext.TCS, tcs_opt)
|
|
709
|
+
p.close()
|
|
710
|
+
p.join()
|
|
711
|
+
|
|
712
|
+
else:
|
|
713
|
+
tcs_opt = opt_generator(V=self, opt=opt, path=path, step="tcs")
|
|
714
|
+
for option in tcs_opt:
|
|
715
|
+
ext.TCS(*option)
|
|
716
|
+
|
|
717
|
+
# non-multithreading mode for debugging
|
|
718
|
+
for group in self.dict_dataset:
|
|
719
|
+
for gene in self.dict_dataset[group]:
|
|
720
|
+
# Running TCS for concatenated alignment is duplicate
|
|
721
|
+
if gene != "concatenated":
|
|
722
|
+
tcs_out = f"{path.out_alignment}/alignment/{opt.runname}_{group}_{gene}.tcs"
|
|
723
|
+
# Parse tcs result
|
|
724
|
+
with open(tcs_out, "r") as f_tcs:
|
|
725
|
+
tcs_result_raw = f_tcs.read()
|
|
726
|
+
tcs_result = tcs_result_raw.split("*")[2].split("cons")[
|
|
727
|
+
0
|
|
728
|
+
]
|
|
729
|
+
for line in tcs_result.split("\n")[1:-1]:
|
|
730
|
+
_hash = line.split(":")[0].strip()
|
|
731
|
+
tcs_score = int(line.split(":")[1].strip())
|
|
732
|
+
if (
|
|
733
|
+
tcs_score < 50
|
|
734
|
+
): # cutoff 50 comes from TCS documentation
|
|
735
|
+
FI_id = self.dict_hash_FI[_hash].id
|
|
736
|
+
logging.warning(
|
|
737
|
+
f"{FI_id} has poor alignment score in {group} {gene}"
|
|
738
|
+
)
|
|
739
|
+
bad_cnt += 1
|
|
740
|
+
|
|
741
|
+
if bad_cnt == 0:
|
|
742
|
+
logging.info(f"All sequences in alignment passed TCS validation")
|
|
743
|
+
else:
|
|
744
|
+
logging.warning(
|
|
745
|
+
f"{bad_cnt} sequences in alignment failed TCS validation. Please check sequneces"
|
|
746
|
+
)
|
|
705
747
|
|
|
706
748
|
# check inconsistency exists along identification result of each genes
|
|
707
749
|
def check_inconsistent(self):
|
|
@@ -80,7 +80,8 @@ def makeblastdb(fasta, db, path):
|
|
|
80
80
|
# run make blast db
|
|
81
81
|
CMD = f"{path_makeblastdb} -in {fasta_tmp} -blastdb_version 4 -title {db_tmp} -dbtype nucl"
|
|
82
82
|
logging.info(CMD)
|
|
83
|
-
|
|
83
|
+
# I cannot find any "quiet" options for makeblastdb
|
|
84
|
+
Run = subprocess.call(CMD, stdout=open(os.devnull, "wb"), shell=True)
|
|
84
85
|
# Change db names
|
|
85
86
|
shutil.move(fasta_tmp + ".nsq", db + ".nsq")
|
|
86
87
|
shutil.move(fasta_tmp + ".nin", db + ".nin")
|
|
@@ -93,7 +94,8 @@ def makeblastdb(fasta, db, path):
|
|
|
93
94
|
else:
|
|
94
95
|
CMD = f"makeblastdb -in '{fasta}' -blastdb_version 4 -title '{db}' -dbtype nucl"
|
|
95
96
|
logging.info(CMD)
|
|
96
|
-
|
|
97
|
+
# I cannot find any "quiet" options for makeblastdb
|
|
98
|
+
return_code = subprocess.call(CMD, stdout=open(os.devnull, "wb"), shell=True)
|
|
97
99
|
|
|
98
100
|
if return_code != 0:
|
|
99
101
|
logging.error(f"Make blast_db failed!!")
|
|
@@ -325,14 +327,14 @@ def RAxML(
|
|
|
325
327
|
if " " in out:
|
|
326
328
|
out = f'"{out}"'
|
|
327
329
|
|
|
328
|
-
CMD = f"{path.sys_path}/external/RAxML_Windows/raxmlHPC-PTHREADS-AVX2.exe -s {fasta} -n {out} -p 1 -T {thread} -f a -# {bootstrap} -x 1 {model}"
|
|
330
|
+
CMD = f"{path.sys_path}/external/RAxML_Windows/raxmlHPC-PTHREADS-AVX2.exe -s {fasta} -n {out} -p 1 -T {thread} -f a -# {bootstrap} -x 1 {model} --silent"
|
|
329
331
|
elif platform == "darwin":
|
|
330
332
|
CMD = f"raxmlHPC-PTHREADS -s '{fasta}' -n '{out}' -p 1 -T {thread} -f a -# {bootstrap} -x 1 {model}"
|
|
331
333
|
else:
|
|
332
334
|
if version == "old":
|
|
333
|
-
CMD = f"raxmlHPC-PTHREADS-AVX -s '{fasta}' -n '{out}' -p 1 -T {thread} -f a -# {bootstrap} -x 1 {model}"
|
|
335
|
+
CMD = f"raxmlHPC-PTHREADS-AVX -s '{fasta}' -n '{out}' -p 1 -T {thread} -f a -# {bootstrap} -x 1 {model} --silent"
|
|
334
336
|
elif version == "new":
|
|
335
|
-
CMD = f"raxmlHPC-PTHREADS-AVX2 -s '{fasta}' -n '{out}' -p 1 -T {thread} -f a -# {bootstrap} -x 1 {model}"
|
|
337
|
+
CMD = f"raxmlHPC-PTHREADS-AVX2 -s '{fasta}' -n '{out}' -p 1 -T {thread} -f a -# {bootstrap} -x 1 {model} --silent"
|
|
336
338
|
else:
|
|
337
339
|
logging.error(
|
|
338
340
|
f"DEVELOPMENTAL ERROR - unexpected RAxML version, {version} in ext.py"
|
|
@@ -455,3 +457,26 @@ def IQTREE(
|
|
|
455
457
|
hash_file_path=f"{path.out_tree}/hash_{file}",
|
|
456
458
|
decoded_file_path=f"{path.out_tree}/{file}",
|
|
457
459
|
)
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
# TCS calculation from T-COFFEE
|
|
463
|
+
def TCS(fasta, thread, out):
|
|
464
|
+
if platform == "win32":
|
|
465
|
+
logging.error("TCS(From T-COFFEE) is only available in Linux")
|
|
466
|
+
raise Exception
|
|
467
|
+
else:
|
|
468
|
+
# T_COFFEE env variable MAX_N_PID_4_TCOFFEE should be changed for 64bit machine
|
|
469
|
+
# should be already done in installation check process
|
|
470
|
+
# subprocess.call("export MAX_N_PID_4_TCOFFEE=4194304", shell=True)
|
|
471
|
+
CMD = f"t_coffee -infile {fasta} -cpu {thread} -method fast_pair -type DNA -evaluate -output score_ascii -outfile {out} -quiet"
|
|
472
|
+
|
|
473
|
+
logging.info(CMD)
|
|
474
|
+
# Even though "quiet" option exists, TCS show some blank lines
|
|
475
|
+
# Run = subprocess.call(CMD, stdout=open(os.devnull, "wb"), shell=True)
|
|
476
|
+
Run = subprocess.run(
|
|
477
|
+
CMD, stdout=open(os.devnull, "wb"), stderr=subprocess.STDOUT, shell=True
|
|
478
|
+
).returncode
|
|
479
|
+
|
|
480
|
+
if Run != 0:
|
|
481
|
+
logging.error(f"TCS Failed!")
|
|
482
|
+
raise Exception
|
|
@@ -31,10 +31,10 @@ def check(
|
|
|
31
31
|
obj,
|
|
32
32
|
type_,
|
|
33
33
|
criterion,
|
|
34
|
-
value=np.
|
|
35
|
-
min_=np.
|
|
36
|
-
max_=np.
|
|
37
|
-
default=np.
|
|
34
|
+
value=np.nan,
|
|
35
|
+
min_=np.nan,
|
|
36
|
+
max_=np.nan,
|
|
37
|
+
default=np.nan,
|
|
38
38
|
solve=False,
|
|
39
39
|
):
|
|
40
40
|
# obj : option things that should be checked
|
|
@@ -187,9 +187,17 @@ class Path:
|
|
|
187
187
|
for program in check_commands:
|
|
188
188
|
cmd = check_commands[program]
|
|
189
189
|
# Quietly call each programs
|
|
190
|
+
"""
|
|
190
191
|
return_code = subprocess.call(
|
|
191
192
|
cmd, shell=True, stdout=open(os.devnull, "wb")
|
|
192
193
|
)
|
|
194
|
+
"""
|
|
195
|
+
return_code = subprocess.run(
|
|
196
|
+
cmd,
|
|
197
|
+
shell=True,
|
|
198
|
+
stdout=open(os.devnull, "wb"),
|
|
199
|
+
stderr=subprocess.STDOUT,
|
|
200
|
+
).returncode
|
|
193
201
|
if return_code != 0:
|
|
194
202
|
print(f"[ERROR] {program} not installed!")
|
|
195
203
|
install_flag = 1
|
|
@@ -198,12 +206,18 @@ class Path:
|
|
|
198
206
|
# I don't know why, but apt install RAxML can use raxmlHPC-PTHREADS-AVX,
|
|
199
207
|
# while conda install RAxML can use raxmlHPC -PTHREADS-AVX / raxmlHPC-PTHREADS-AVX2 (blank between raxmlHPC and -PTHREADS-AVX)
|
|
200
208
|
# However, if using 'raxmlHPC -PTHREADS-AVX', the computer cannot utilize full threads
|
|
201
|
-
return_code_1 = subprocess.
|
|
202
|
-
"raxmlHPC-PTHREADS-AVX -h",
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
)
|
|
209
|
+
return_code_1 = subprocess.run(
|
|
210
|
+
"raxmlHPC-PTHREADS-AVX -h",
|
|
211
|
+
shell=True,
|
|
212
|
+
stdout=open(os.devnull, "wb"),
|
|
213
|
+
stderr=subprocess.STDOUT,
|
|
214
|
+
).returncode
|
|
215
|
+
return_code_2 = subprocess.run(
|
|
216
|
+
"raxmlHPC-PTHREADS-AVX2 -h",
|
|
217
|
+
shell=True,
|
|
218
|
+
stdout=open(os.devnull, "wb"),
|
|
219
|
+
stderr=subprocess.STDOUT,
|
|
220
|
+
).returncode
|
|
207
221
|
|
|
208
222
|
if return_code_1 != 0 and return_code_2 != 0:
|
|
209
223
|
print(f"[ERROR] RAxML not installed!")
|
|
@@ -224,6 +238,9 @@ class Path:
|
|
|
224
238
|
)
|
|
225
239
|
raise Exception
|
|
226
240
|
|
|
241
|
+
# For t-coffee, check it and just turn off it tcs is not installed
|
|
242
|
+
# it should be done in validation_option.py so moved
|
|
243
|
+
|
|
227
244
|
# Location for list of genus file
|
|
228
245
|
self.genusdb = f"{self.sys_path}/data/genus_line.txt"
|
|
229
246
|
|
|
@@ -247,7 +264,8 @@ class Path:
|
|
|
247
264
|
self.root = os.path.abspath(self.root)
|
|
248
265
|
|
|
249
266
|
# Logging directory
|
|
250
|
-
self.log = f"{self.root}/log.txt"
|
|
267
|
+
self.log = f"{self.root}/log.txt" # for overall logging
|
|
268
|
+
self.criticallog = f"{self.root}/log_critical.txt" # for warnings and errors
|
|
251
269
|
self.extlog = f"{self.root}/log" # for saving external program logs
|
|
252
270
|
mkdir(self.extlog)
|
|
253
271
|
|
|
@@ -288,6 +306,10 @@ class Path:
|
|
|
288
306
|
mkdir(f"{self.out_alignment}/hash")
|
|
289
307
|
# For failed alignments
|
|
290
308
|
mkdir(f"{self.out_alignment}/failed")
|
|
309
|
+
# For partition file
|
|
310
|
+
mkdir(f"{self.out_alignment}/partition")
|
|
311
|
+
# For tcs results
|
|
312
|
+
mkdir(f"{self.out_alignment}/tcs")
|
|
291
313
|
|
|
292
314
|
# modeltest result directory
|
|
293
315
|
self.out_modeltest = f"{self.root}/06_Modeltest"
|
|
@@ -311,7 +333,7 @@ def initialize(path_run, parser):
|
|
|
311
333
|
|
|
312
334
|
# Move option loading as independent class or function
|
|
313
335
|
# Generate path class
|
|
314
|
-
print(f"Output location: {path_run}")
|
|
336
|
+
print(f"[INFO] Output location: {path_run}")
|
|
315
337
|
path = Path(path_run)
|
|
316
338
|
|
|
317
339
|
# Parsing options
|
|
@@ -54,6 +54,12 @@ def setup_logging(list_info, list_warning, list_error, path, opt, tool):
|
|
|
54
54
|
for handler in logging.root.handlers:
|
|
55
55
|
handler.setFormatter(formatter)
|
|
56
56
|
|
|
57
|
+
# Add a new FileHandler for warnings, errors, and critical messages
|
|
58
|
+
warning_error_critical_handler = logging.FileHandler(path.criticallog)
|
|
59
|
+
warning_error_critical_handler.setLevel(logging.WARNING)
|
|
60
|
+
warning_error_critical_handler.setFormatter(formatter)
|
|
61
|
+
logging.getLogger().addHandler(warning_error_critical_handler)
|
|
62
|
+
|
|
57
63
|
# Delayed logging for option parsing
|
|
58
64
|
|
|
59
65
|
# I don't know why, but in some environment, ANSI color works only after first subprocess.call was done
|
|
@@ -65,6 +65,22 @@ def opt_generator(V, opt, path, step, thread=None):
|
|
|
65
65
|
)
|
|
66
66
|
)
|
|
67
67
|
|
|
68
|
+
# For tcs alignment validation
|
|
69
|
+
elif step == "tcs":
|
|
70
|
+
for group in V.dict_dataset:
|
|
71
|
+
for gene in V.dict_dataset[group]:
|
|
72
|
+
if gene != "concatenated":
|
|
73
|
+
tcs_out = (
|
|
74
|
+
f"{path.out_alignment}/tcs/{opt.runname}_{group}_{gene}.tcs"
|
|
75
|
+
)
|
|
76
|
+
list_opt.append(
|
|
77
|
+
(
|
|
78
|
+
f"{path.out_alignment}/{opt.runname}_trimmed_{group}_{gene}.fasta",
|
|
79
|
+
thread,
|
|
80
|
+
tcs_out,
|
|
81
|
+
)
|
|
82
|
+
)
|
|
83
|
+
|
|
68
84
|
else:
|
|
69
85
|
logging.error(f"[Error] Unexpected step {step} given for opt_generator")
|
|
70
86
|
raise Exception
|
|
@@ -3,7 +3,8 @@ import pandas as pd
|
|
|
3
3
|
import matplotlib.pyplot as plt
|
|
4
4
|
import io
|
|
5
5
|
import logging
|
|
6
|
-
|
|
6
|
+
|
|
7
|
+
# import plotly.express as px
|
|
7
8
|
import sys
|
|
8
9
|
from tabulate import tabulate
|
|
9
10
|
from funvip.src.tool import index_step
|
|
@@ -298,7 +299,7 @@ class Report:
|
|
|
298
299
|
|
|
299
300
|
# Count groups
|
|
300
301
|
for group in sorted(list(set(self.query_result["GROUP_ASSIGNED"]))):
|
|
301
|
-
df_group = df_result_group.get_group(group)
|
|
302
|
+
df_group = df_result_group.get_group((group,))
|
|
302
303
|
|
|
303
304
|
# Collect statistics
|
|
304
305
|
"""
|
|
@@ -828,7 +829,7 @@ class Report:
|
|
|
828
829
|
dict_citation = {
|
|
829
830
|
"FunVIP": "https://github.com/Changwanseo/FunVIP",
|
|
830
831
|
"GenMine": "Seo, C. W., Kim, S. H., Lim, Y. W., & Park, M. S. (2022). Re-identification on Korean Penicillium sequences in GenBank collected by software GenMine. Mycobiology, 50(4), 231-237.",
|
|
831
|
-
"BLASTn": "
|
|
832
|
+
"BLASTn": "Camacho, C., Coulouris, G., Avagyan, V., Ma, N., Papadopoulos, J., Bealer, K., & Madden, T. L. (2009). BLAST+: architecture and applications. BMC bioinformatics, 10, 1-9.",
|
|
832
833
|
"MMseqs2": "Steinegger, M., & Söding, J. (2017). MMseqs2 enables sensitive protein sequence searching for the analysis of massive data sets. Nature biotechnology, 35(11), 1026-1028.",
|
|
833
834
|
"MAFFT": "Katoh, K., & Standley, D. M. (2013). MAFFT multiple sequence alignment software version 7: improvements in performance and usability. Molecular biology and evolution, 30(4), 772-780.",
|
|
834
835
|
"Gblocks": "Talavera, G., & Castresana, J. (2007). Improvement of phylogenies after removing divergent and ambiguously aligned blocks from protein sequence alignments. Systematic biology, 56(4), 564-577.",
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from funvip.src import cluster, tool, hasher, validate_input, save
|
|
2
2
|
from funvip.src.ext import blast, makeblastdb, mmseqs, makemmseqsdb
|
|
3
3
|
from funvip.src.save import save_df
|
|
4
|
+
from funvip.src.tool import mkdir
|
|
4
5
|
import copy
|
|
5
6
|
import pandas as pd
|
|
6
7
|
import numpy as np
|
|
@@ -156,7 +157,7 @@ def search(query_fasta, db_fasta, path, opt) -> pd.DataFrame():
|
|
|
156
157
|
os.path.isdir(f"{path.in_db}/{opt.method.search.lower()}/{_hash}")
|
|
157
158
|
is True
|
|
158
159
|
):
|
|
159
|
-
logging.info("
|
|
160
|
+
logging.info("Found existing database! Skipping database build")
|
|
160
161
|
db = f"{path.in_db}/{opt.method.search.lower()}/{_hash}/{_hash}"
|
|
161
162
|
|
|
162
163
|
# When parsing existing DB failed
|
|
@@ -170,7 +171,7 @@ def search(query_fasta, db_fasta, path, opt) -> pd.DataFrame():
|
|
|
170
171
|
)
|
|
171
172
|
|
|
172
173
|
# Create DB saving directory
|
|
173
|
-
|
|
174
|
+
mkdir(f"{path.in_db}/{opt.method.search.lower()}/{_hash}")
|
|
174
175
|
db = f"{path.in_db}/{opt.method.search.lower()}/{_hash}/{_hash}"
|
|
175
176
|
|
|
176
177
|
# DB saving starts
|
|
@@ -184,14 +185,14 @@ def search(query_fasta, db_fasta, path, opt) -> pd.DataFrame():
|
|
|
184
185
|
logging.info(
|
|
185
186
|
"--cachedb not selected, saving database will be passed"
|
|
186
187
|
)
|
|
187
|
-
|
|
188
|
+
mkdir(f"{path.tmp}/{opt.runname}/{_hash}")
|
|
188
189
|
db = f"{path.tmp}/{opt.runname}/{_hash}/{_hash}"
|
|
189
190
|
|
|
190
191
|
# Create search database
|
|
191
192
|
create_search_db(opt, db_fasta, db, path)
|
|
192
193
|
|
|
193
194
|
else:
|
|
194
|
-
|
|
195
|
+
mkdir(f"{path.tmp}/{opt.runname}/{_hash}")
|
|
195
196
|
db = f"{path.tmp}/{opt.runname}/{_hash}/{_hash}"
|
|
196
197
|
# Create search database
|
|
197
198
|
create_search_db(opt, db_fasta, db, path)
|
|
@@ -26,9 +26,14 @@ def initialize_path(path):
|
|
|
26
26
|
genus_file = path.genusdb
|
|
27
27
|
|
|
28
28
|
|
|
29
|
+
# Check if directory exists and make if not
|
|
30
|
+
# If intermediate directory does not exists, also do it
|
|
29
31
|
def mkdir(path):
|
|
32
|
+
os.makedirs(path, exist_ok=True)
|
|
33
|
+
"""
|
|
30
34
|
if os.path.exists(path) == False:
|
|
31
35
|
os.makedirs(path)
|
|
36
|
+
"""
|
|
32
37
|
|
|
33
38
|
|
|
34
39
|
def union_funinfo_list(funinfo_list1, funinfo_list2):
|