FunVIP 0.3.24.6__tar.gz → 0.3.25__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.6 → funvip-0.3.25}/FunVIP.egg-info/PKG-INFO +2 -3
- {funvip-0.3.24.6 → funvip-0.3.25}/FunVIP.egg-info/requires.txt +0 -1
- {funvip-0.3.24.6 → funvip-0.3.25}/PKG-INFO +2 -3
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/main.py +1 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/preset/accurate.yaml +1 -3
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/preset/fast.yaml +0 -1
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/cluster.py +2 -2
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/command.py +15 -10
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/concatenate.py +10 -3
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/dataset.py +86 -33
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/ext.py +30 -5
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/initialize.py +34 -12
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/logger.py +6 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/opt_generator.py +16 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/reporter.py +4 -3
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/search.py +5 -4
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/tool.py +5 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/tree.py +2 -2
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/validate_input.py +1 -1
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/validate_option.py +65 -36
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/test_dataset/penicillium/preset.yaml +1 -4
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/test_dataset/sanghuangporus/preset.yaml +1 -2
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/test_dataset/terrei/preset.yaml +1 -3
- {funvip-0.3.24.6 → funvip-0.3.25}/pyproject.toml +2 -3
- {funvip-0.3.24.6 → funvip-0.3.25}/FunVIP.egg-info/SOURCES.txt +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/FunVIP.egg-info/dependency_links.txt +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/FunVIP.egg-info/entry_points.txt +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/FunVIP.egg-info/top_level.txt +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/LICENSE +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/MANIFEST.in +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/README.md +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/FunVIP_GUI.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/__init__.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/data/Option_manager.xlsx +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/data/__init__.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/data/genus_line.txt +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/BLAST_Windows/Uninstall-ncbi-blast-2.12.0+.exe +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/blastn.exe +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/cleanup-blastdb-volumes.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/get_species_taxids.sh +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/legacy_blast.pl +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/makeblastdb.exe +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/nghttp2.dll +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/BLAST_Windows/bin/update_blastdb.pl +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/BLAST_Windows/doc/README.txt +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/FastTree_Windows/FastTree.exe +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/Documentation/Gblocks_documentation.html +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/Gblocks.exe +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/cox2.pir +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/cytb.pir +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/nad3.pir +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/more_alignments/nad5.pir +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/nad3.pir +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/Gblocks_Windows_0.91b/Gblocks_0.91b/paths +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/MAFFT_LICENSE +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/MAFFT_Windows.zip +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/RAxML_Windows/GPL-3.0.txt +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/RAxML_Windows/README +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/RAxML_Windows/raxmlHPC-PTHREADS-AVX2.exe +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/__init__.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/iqtree/bin/iqtree2-click.exe +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/iqtree/bin/iqtree2.exe +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/iqtree/bin/libiomp5md.dll +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/iqtree/example.cf +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/iqtree/example.nex +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/iqtree/example.phy +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/iqtree/models.nex +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/LICENSE.md +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/README.md +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/busybox.exe +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/cygbz2-1.dll +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/cyggcc_s-seh-1.dll +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/cyggomp-1.dll +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/cygstdc++-6.dll +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/cygwin1.dll +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/cygz.dll +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/bin/mmseqs.exe +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/examples/QUERY.fasta +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM10.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM100.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM110.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM120.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM130.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM140.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM150.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM160.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM170.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM180.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM190.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM20.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM30.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM40.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM50.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM60.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM70.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM80.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/PAM90.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/VTML10.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/VTML120.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/VTML160.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/VTML20.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/VTML40.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/VTML80.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum100.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum30.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum35.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum40.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum45.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum50.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum55.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum60.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum62.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum65.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum70.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum75.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum80.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum85.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum90.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/blosum95.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/matrices/nucleotide.out +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/mmseqs.bat +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/mmseqs_Windows/util/bash-completion.sh +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/AUTHORS +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/CHANGELOG +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/LICENSE +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/README +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/bin/libgcc_s_dw2-1.dll +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/bin/libstdc++-6.dll +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/bin/trimal.exe +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/check_codon_alignments.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/compare_trimmed_msas.sh +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/generateRandomAlignmentsUsingAsSeedRealAlignments.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/generate_trimmed_msas.sh +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/get_sequence_representative_from_alignment.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/get_sequences_gaps_ratio.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/remove_shorter_sequences.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/selective_trimming_for_dNdS_analyses.based_neighbours.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/scripts/set_manual_boundaries.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/alignment.cpp +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/alignment.h +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/alignment.o +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/autAlignment.cpp +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/autAlignment.o +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.cpp +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.h +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/compareFiles.o +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/defines.h +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/main.cpp +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/makefile +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/makefile.MacOS +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/readAl.cpp +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/readal.exe +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/rwAlignment.cpp +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/rwAlignment.o +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.cpp +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.h +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/sequencesMatrix.o +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.cpp +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.h +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/similarityMatrix.o +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statAl.cpp +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statal.exe +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.cpp +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.h +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsConservation.o +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsFiles.cpp +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsFiles.h +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.cpp +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.h +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/statisticsGaps.o +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/utils.cpp +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/utils.h +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/utils.o +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/external/trimal.v1.4/trimAl/source/values.h +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/preset/.gitignore +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/.gitignore +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__init__.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/CATV_pipe.cpython-310.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/CAT_V.cpython-310.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/CAT_V.cpython-39.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/CAT_V_pipe.cpython-39.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/__init__.cpython-310.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/__init__.cpython-39.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/align.cpython-310.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/cluster.cpython-39.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/dataset.cpython-39.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/ext.cpython-310.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/ext.cpython-39.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/hasher.cpython-39.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/initialize.cpython-39.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/io.cpython-310.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/io.cpython-39.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/logger.cpython-39.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/modeltest.cpython-39.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/multigene.cpython-39.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/ncbi.cpython-39.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/opt_generator.cpython-39.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/reporter.cpython-39.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/search.cpython-39.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/tool.cpython-39.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/validation.cpython-39.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/__pycache__/visualize.cpython-39.pyc +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/align.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/hasher.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/logics.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/modeltest.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/ncbi.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/save.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/templates/template.html +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/tree_interpretation.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/tree_interpretation_pipe.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/trim.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/validation.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/version.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/src/visualize.py +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/test_dataset/penicillium/DB/DB_Penicillium.xlsx +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/test_dataset/penicillium/Options.config +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/test_dataset/penicillium/Query/Query.xlsx +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/test_dataset/sanghuangporus/DB/FunVIP_Sanghuangporus_db.xlsx +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/test_dataset/sanghuangporus/Query/FunVIP_Sanghuangporus_query.xlsx +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/test_dataset/terrei/DB/FunVIP_Aspergillus_db.xlsx +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/funvip/test_dataset/terrei/Query/FunVIP_Aspergillus_query.xlsx +0 -0
- {funvip-0.3.24.6 → funvip-0.3.25}/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.
|
|
3
|
+
Version: 0.3.25
|
|
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.
|
|
3
|
+
Version: 0.3.25
|
|
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]
|
|
@@ -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
|
|
@@ -206,6 +209,9 @@ class FunVIP_var:
|
|
|
206
209
|
|
|
207
210
|
for group in self.list_group:
|
|
208
211
|
logging.info(f"Generating dataset for {group}")
|
|
212
|
+
|
|
213
|
+
# print(f"opt.queryonly: {opt.queryonly}")
|
|
214
|
+
|
|
209
215
|
dict_funinfo[group] = {}
|
|
210
216
|
|
|
211
217
|
# For queryonly case
|
|
@@ -277,28 +283,36 @@ class FunVIP_var:
|
|
|
277
283
|
]
|
|
278
284
|
self.add_dataset(group, "concatenated", list_qr, list_db, [])
|
|
279
285
|
|
|
280
|
-
# For opt.queryonly is False -> run all dataset in database
|
|
286
|
+
# For opt.queryonly is False -> run all dataset in database if possible
|
|
281
287
|
else:
|
|
282
288
|
for gene in self.list_db_gene:
|
|
283
|
-
list_qr = [
|
|
284
|
-
|
|
285
|
-
for FI in self.list_FI
|
|
289
|
+
list_qr = []
|
|
290
|
+
for FI in self.list_FI:
|
|
286
291
|
if (
|
|
287
|
-
|
|
288
|
-
and FI.datatype == "query"
|
|
292
|
+
FI.datatype == "query"
|
|
289
293
|
and FI.adjusted_group == group
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
294
|
+
and gene in FI.seq
|
|
295
|
+
):
|
|
296
|
+
if FI.seq[gene] != "":
|
|
297
|
+
list_db.append(FI)
|
|
298
|
+
|
|
299
|
+
list_db = []
|
|
300
|
+
for FI in self.list_FI:
|
|
295
301
|
if (
|
|
296
|
-
|
|
297
|
-
and FI.datatype == "db"
|
|
302
|
+
FI.datatype == "db"
|
|
298
303
|
and FI.adjusted_group == group
|
|
304
|
+
and gene in FI.seq
|
|
305
|
+
):
|
|
306
|
+
if FI.seq[gene] != "":
|
|
307
|
+
list_db.append(FI)
|
|
308
|
+
|
|
309
|
+
# If none of the database is possible for this group and gene pair, it should be excluded
|
|
310
|
+
if len(list_db) > 0:
|
|
311
|
+
self.add_dataset(group, gene, list_qr, list_db, [])
|
|
312
|
+
else:
|
|
313
|
+
logging.warning(
|
|
314
|
+
f"dataset {group} {gene} did not passed dataset construction due to lack of sequences"
|
|
299
315
|
)
|
|
300
|
-
]
|
|
301
|
-
self.add_dataset(group, gene, list_qr, list_db, [])
|
|
302
316
|
|
|
303
317
|
# for concatenated
|
|
304
318
|
list_qr = [
|
|
@@ -444,6 +458,7 @@ class FunVIP_var:
|
|
|
444
458
|
|
|
445
459
|
# Validate if any multiple sequence alignment has no overlapping region
|
|
446
460
|
def validate_alignments(self, path, opt):
|
|
461
|
+
# 1. Manual validation for illegal alignments
|
|
447
462
|
fail_list = []
|
|
448
463
|
remove_dict = {}
|
|
449
464
|
tree_hash_dict = hasher.encode(self.list_FI, newick=True)
|
|
@@ -499,16 +514,6 @@ class FunVIP_var:
|
|
|
499
514
|
|
|
500
515
|
remove_dict[group][gene] = remove_hash
|
|
501
516
|
|
|
502
|
-
"""
|
|
503
|
-
for _hash in remove_hash:
|
|
504
|
-
if _hash in self.dict_dataset[group][gene].list_db_FI:
|
|
505
|
-
self.dict_dataset[group][gene].list_db_FI.pop(_hash)
|
|
506
|
-
if _hash in self.dict_dataset[group][gene].list_query_FI:
|
|
507
|
-
self.dict_dataset[group][gene].list_query_FI.pop(_hash)
|
|
508
|
-
if _hash in self.dict_dataset[group][gene].list_og_FI:
|
|
509
|
-
self.dict_dataset[group][gene].list_og_FI.pop(_hash)
|
|
510
|
-
"""
|
|
511
|
-
|
|
512
517
|
# Remove unusable sequence and re-read it
|
|
513
518
|
## db_list, query_list, outgroup_list might has to be changed
|
|
514
519
|
seq_list = [
|
|
@@ -580,12 +585,12 @@ class FunVIP_var:
|
|
|
580
585
|
# Add issue
|
|
581
586
|
for fail in fail_list:
|
|
582
587
|
for FI in self.list_FI:
|
|
583
|
-
if
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
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]}")
|
|
589
594
|
|
|
590
595
|
logging.debug("Remove dict")
|
|
591
596
|
logging.debug(remove_dict)
|
|
@@ -685,12 +690,60 @@ class FunVIP_var:
|
|
|
685
690
|
|
|
686
691
|
# Add issue: the number of sequences are insufficient
|
|
687
692
|
for fail in final_fail_list:
|
|
688
|
-
for FI in
|
|
693
|
+
for FI in self.list_FI:
|
|
689
694
|
if FI.adjusted_group == fail[0]:
|
|
690
695
|
if FI.seq[fail[1]] != "":
|
|
691
696
|
FI.issues.add(f"lackseq")
|
|
692
697
|
|
|
693
|
-
#
|
|
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
|
+
)
|
|
694
747
|
|
|
695
748
|
# check inconsistency exists along identification result of each genes
|
|
696
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.",
|