Licensed and external tools¶
Three tools are not installed by conda: InterProScan, which every run needs, and the optional GeneMark-ES and SignalP 6. You obtain them yourself, and FunFlux calls them from its own environments. Install InterProScan before the first run. For each tool, this page explains how to obtain and install it, how FunFlux runs it and what happens without it.
| Tool | Needed | Licence | Config keys | Without it |
|---|---|---|---|---|
| GeneMark-ES | optional | free for academic, non-profit and US government users; the key expires one year after download | directories.genemark_dir, parameters.genemark.mode |
funannotate predict runs without GeneMark-ES |
| SignalP 6 | optional, off by default | DTU: download page for academic users, others contact DTU | files.signalp6_archive, parameters.signalp6.* |
no secretome annotation |
| InterProScan 5.78-109.0 | required | Apache-2.0 | files.iprscan |
the run stops: InterProScan cannot be switched off |
The licences of GeneMark-ES and SignalP 6 limit who may use them freely, and so do two of the databases InterProScan searches in every run: commercial users of PROSITE pay a yearly licence fee, and SMART is free for academic users only. The licence terms in full are on Licensing.
The optional AMR screen, also called the resistance-mutation screen, runs ChroQueTas. ChroQueTas
is not installed by conda either, and its licence allows non-commercial use only. You do not
download it yourself. With parameters.amr.chroquetas: on, the workflow downloads it at run time,
as described in ChroQueTas and the FungAMR database.
Terms used on this page
| self-training gene finder | a gene finder that learns its parameters from the genome it annotates, with no stored model; GeneMark-ES works this way |
| licence key | the file ~/.gm_key that GeneMark-ES needs; it expires one year after download, and an expired key stops the run at genemark_check, before gene prediction |
| secretome | the predicted secreted proteins, which funannotate annotate lists from the SignalP 6 result in annotations.secretome.txt; none without SignalP 6 |
| model weights | the trained numbers that make up a model, such as a SignalP 6 model |
| Sec/SPI | signal peptides of the Sec pathway, cleaved by signal peptidase I; with --organism eukarya, SignalP 6 predicts only these |
| pin file | the file <name>.linux-64.pin.txt beside each environment file: the exact package builds FunFlux v2 was tested with, installed without solving dependencies |
--conda-prefix |
the Snakemake option naming the folder the conda environments are built in, instead of .snakemake/conda/ in the launch folder; several clones or users can share it |
| lookup service | the EBI online service that returns InterProScan matches already computed for known proteins; it receives checksums, not sequences. It did not answer InterProScan 5 in November 2026, and FunFlux does not ask it |
GeneMark-ES¶
GeneMark-ES is a self-training gene finder that funannotate predict adds to AUGUSTUS, SNAP and GlimmerHMM. It is optional, and FunFlux uses it only when you name an installation.
Licence and installation¶
GeneMark-ES is free ("royalty free") for academic and non-profit institutions and US government agencies. Other users must contact the GeneMark team for a licence. Download the program and the licence key from https://genemark.bme.gatech.edu/license_download.cgi. In October 2026, the download for 64-bit Linux was GeneMark-ES/ET/EP+ 4.73.
The licence is valid for one year from the date of download, and the date of the key file does not tell when it expires. A key file dated January 2026 worked in July and had expired in October.
Unpack the program, for example into /path/to/gmes_linux_64_4, and follow its INSTALL file:
gunzip gm_key.gz
cp gm_key ~/.gm_key
cd /path/to/gmes_linux_64_4
perl change_path_in_perl_scripts.pl "/usr/bin/env perl"
The last command makes GeneMark's Perl scripts start the first perl on the PATH instead of
/usr/bin/perl. This matters because funannotate predict starts gmes_petap.pl as a program, so
the first line of the script chooses the Perl. Once the command has run, FunFlux runs GeneMark-ES
with the Perl 5.32.1 of its funannotate environment. That environment contains the Perl modules
the INSTALL file lists, so nothing has to be installed from CPAN. Without the command,
GeneMark-ES runs with the computer's /usr/bin/perl, which often lacks those modules.
The key must be ~/.gm_key in the home folder of the account that runs Snakemake and its jobs. On
a cluster, it must be in the home folder that the compute nodes see, as described in
The GeneMark-ES key. Do not commit or share the key
file.
directories:
genemark_dir: /path/to/gmes_linux_64_4 # absolute path, holds gmes_petap.pl
parameters:
genemark:
mode: auto # auto: use GeneMark-ES when genemark_dir is set; off: never
With GeneMark-ES enabled, the run stops before any job starts when genemark_dir is not an
absolute path, when gmes_petap.pl is missing from it or not executable, or when ~/.gm_key does
not exist. Whether the key has expired is checked later, before gene prediction starts, as the
next section describes.
The licence check before gene prediction¶
GeneMark-ES itself checks only that the key file exists. An expired key is found inside GeneMark's
programs, partway through funannotate predict, which then fails with
Your license period has ended. Rule genemark_check makes this failure show within a minute
instead. It runs once per sample, after repeat masking. It starts GeneMark-ES the way funannotate
does, with the options funannotate uses, on the first 200,000 bytes of the masked genome
(04.annotation/{sample}/contigs_mask.fasta). funannotate predict waits for its result.
What FunFlux does next depends on what GeneMark-ES prints on this slice:
| GeneMark-ES output on the slice | FunFlux |
|---|---|
| mentions "license" | stops: [FunFlux] GeneMark-ES refused to run because of its licence (key file <home>/.gm_key). The key has probably expired: request a new one from the GeneMark site, or set parameters.genemark.mode: off. See <log>. |
| contains "can't locate" or "bad interpreter" | stops: [FunFlux] GeneMark-ES could not start from <genemark_dir>: the Perl named in the first line of gmes_petap.pl (GeneMark ships it as /usr/bin/perl, the computer's own) is missing or lacks a Perl module GeneMark needs. ...; the message names change_path_in_perl_scripts.pl as the fix |
| contains "command not found" or "no such file" | stops: [FunFlux] GeneMark-ES could not start from <genemark_dir> (a program or a file is missing). See <log>. |
| another error | continues, because the slice may be too short to train on; genemark_check.txt records the exit status |
| no error | continues; genemark_check.txt reads GeneMark-ES ran on the test slice. |
The check therefore stops the run only for an expired key or for a GeneMark-ES that cannot start.
genemark_check.txt is written to 04.annotation/{sample}/, and the GeneMark-ES output to
logs/genemark_check_{sample}.log. After a stop, put the new key in ~/.gm_key and start the same
command again. The check then runs again, because a failed check leaves no result.
Without GeneMark-ES¶
With genemark_dir empty or mode: off, there is no genemark_check job, and funannotate predict
runs without GeneMark-ES. Rule funannotate_prediction clears GENEMARK_PATH and limits PATH to
the funannotate environment plus /usr/bin and /bin, so a GeneMark-ES installed elsewhere is not
picked up. FunFlux v2 was tested with GeneMark-ES on, and with mode: off on one public genome, as
reported in Validation on public genomes.
SignalP 6¶
SignalP 6 finds signal peptides in the predicted proteins, and funannotate annotate turns its
result into the secretome annotation,
04.annotation/{sample}/funannotate/annotate_misc/annotations.secretome.txt. SignalP 6 is
optional and off by default.
Licence and download¶
The SignalP 6 page of DTU, https://services.healthtech.dtu.dk/services/SignalP-6.0/, states:
"There is a download page for academic users; other users are requested to contact DTU Health
Technology Software Package Manager". DTU offers version 6.0i as two packages, fast and
slow_sequential. FunFlux never downloads SignalP and contains no DTU address. It installs the
archive you name.
parameters.signalp6.mode chooses the model that SignalP 6 runs, and so the model that the
archive must hold:
parameters.signalp6.mode |
Model the archive must hold | Notes; speed and memory from the SignalP README |
|---|---|---|
off (default) |
none | |
fast |
distilled_model_signalp6.pt |
a smaller model that approximates the full one; the DTU package fast holds only this model; the mode FunFlux v2 was tested with |
slow |
ensemble_model_signalp6.pt |
the full model, run in parallel; needs more than 14 GB of RAM |
slow-sequential |
sequential_models_signalp6 |
the full model, run sequentially: the memory of fast, 6 times slower |
FunFlux looks for the model in models/ and in signalp/model_weights/ of the archive.
files:
signalp6_archive: /path/to/signalp-6.0i.fast.tar.gz # absolute path
parameters:
signalp6:
mode: fast
archive_sha256: # optional: the 64-character checksum, the first field sha256sum <archive> prints
torch_num_threads: 8 # threads of each signalp6_annotation job, at most resources.threads
batch_size: 10 # proteins per batch (--bsize)
With a mode other than off, the run stops before any job starts when signalp6_archive is empty,
not an absolute path, or not a readable file.
How FunFlux installs it¶
FunFlux installs SignalP 6 from your archive once per output folder, and then runs it once per sample. The two steps appear in the log under these names:
install_signalp6runs once per output folder, before the first SignalP job. It checks the archive againstarchive_sha256when that is set, and refuses an archive with absolute paths,..or links in it. It then checks that the model of the chosen mode is there. It installs SignalP 6 into thesignalp6conda environment (Python 3.10, PyTorch 1.13.1 for CPU), with nothing fetched from PyPI. It keeps the unpacked package, model weights included, in00.resources/signalp6/package/(1.6 GB with the fast model), and records what it installed in00.resources/signalp6/installation.json.signalp6_annotationruns once per sample. It runs SignalP 6 on the predicted proteins with--organism eukarya, the chosen--mode,torch_num_threadsandbatch_size(--bsize), and writes the result to04.annotation/{sample}/signalp6/prediction_results.txt.--organism eukaryalimits the prediction to the Sec/SPI signal peptides of eukaryotes.
The installation log is logs/install_signalp6.log, and its errors start with
SignalP 6 installation failed:. The package inside the 6.0i fast archive reports version
6.0h, and that is what installation.json records.
When the conda environment is rebuilt¶
SignalP 6 is installed inside the signalp6 conda environment, and a new environment does not
have it. Snakemake builds a new one when a FunFlux update changes signalp6.yaml or its pin file,
when --conda-prefix points elsewhere, or when .snakemake/conda is deleted. The next SignalP job
then stops with a message that names 00.resources/signalp6/installation.json. Delete that file
and start the same command again, with the environment folder writable, and SignalP 6 is installed
again. See Troubleshooting.
The SignalP 6 archive and its model weights must not be passed on
Both are licensed. Do not commit, upload or pass on the archive or the model weights.
00.resources/signalp6/package/ holds the weights, so remove it before you share an output
folder. pip also keeps a built copy of the SignalP package in the pip cache (~/.cache/pip)
of the account that ran the installation. pip cache remove signalp6 deletes that copy. With
the fast archive, whose weights sit in models/, that copy holds no weights. With an archive
whose weights sit in signalp/model_weights/, pip puts the weights into the pip cache and
into the signalp6 conda environment as well, and so into a shared --conda-prefix.
Without SignalP 6¶
With mode: off, no SignalP job runs and funannotate annotate gets no SignalP result. The log of
funannotate annotate then reads Skipping secretome: neither SignalP nor Phobius searches were run.
Rule funannotate_annotation limits PATH to the funannotate environment plus /usr/bin and
/bin, so a SignalP installed elsewhere is not picked up.
InterProScan¶
InterProScan assigns protein families, domains and GO terms to every predicted protein, and
funannotate annotate builds the domain and GO annotation from its XML. Every run needs it.
InterProScan 5 is not on bioconda, so FunFlux runs the interproscan.sh of your installation
inside its interproscan environment. That environment supplies Java (OpenJDK 11.0.30) and the
Python 3 (3.11.15) that InterProScan runs for seven of its analyses: Gene3D, FunFam, HAMAP,
MobiDB-lite, PANTHER, PIRSR and the PROSITE profiles.
FunFlux v2 runs InterProScan 5, not InterProScan 6
FunFlux v2 was tested with InterProScan 5.78-109.0, the final release of InterProScan 5. Later InterPro releases need InterProScan 6, a different program that FunFlux v2 does not use.
Installation¶
The InterProScan documentation gives these steps for 5.78-109.0, a 7.0 GB download that takes 50 GB once installed:
mkdir -p /path/to/software && cd /path/to/software
wget https://ftp.ebi.ac.uk/pub/software/unix/iprscan/5/5.78-109.0/interproscan-5.78-109.0-64-bit.tar.gz
wget https://ftp.ebi.ac.uk/pub/software/unix/iprscan/5/5.78-109.0/interproscan-5.78-109.0-64-bit.tar.gz.md5
md5sum -c interproscan-5.78-109.0-64-bit.tar.gz.md5
tar -pxvzf interproscan-5.78-109.0-64-bit.tar.gz
cd interproscan-5.78-109.0
python3 setup.py -f interproscan.properties
setup.py indexes the HMM databases, and -f re-indexes all of them. The InterProScan
documentation also requires Perl 5 and Python 3.8 or newer on the machine. In a FunFlux run, both
come from the interproscan environment (Python 3.11, Perl 5.32 with thread support), together
with Java 11.
To test the installation by hand, use the environment FunFlux runs InterProScan in. It is built
from the pinned package list in the FunFlux repository and holds the same Java, Python and Perl,
so the test runs as it would in FunFlux on any Linux system. On a system without Python 3.8 or
newer, run setup.py in this environment too:
conda create -n interproscan_test --file /path/to/FunFlux/workflow/envs/interproscan.linux-64.pin.txt
conda activate interproscan_test
The InterProScan documentation gives two test commands, run in the installation folder:
./interproscan.sh -i test_all_appl.fasta -f tsv -dp # every analysis computed locally
./interproscan.sh -i test_all_appl.fasta -f tsv # also contacts EBI's lookup service
FunFlux runs InterProScan as in the first command, with -dp. The second command also asks EBI's
lookup service, which did not answer InterProScan 5 in November 2026; InterProScan then printed an
error before it computed every match itself.
Then point files.iprscan at the interproscan.sh of the installation:
What FunFlux runs¶
Rule iprscan_annotation runs InterProScan once per sample, on the protein FASTA of funannotate
predict:
interproscan.sh -i <proteins> -f XML -goterms -pa -dp -cpu <threads>
-T 04.annotation/{sample}/iprscan/tmp
-o 04.annotation/{sample}/iprscan/interproscan_out.xml
- Threads and run time. InterProScan is capped at 10 threads (
-cpu), because it gains little from more. Snakemake reserves the 10 threads for the whole job, and with--cores 24eggNOG-mapper (12 threads) runs beside it. InterProScan takes several hours for a fungal proteome, because it computes every match itself: 4.0 to 6.6 hours for about 11,800 proteins of B. cinerea B05.10 in the validation runs made with FunFlux 2.1.0. The XML can be a few GB. - The XML check. FunFlux calls InterProScan directly, not through
funannotate iprscan. Before funannotate annotate reads the XML, FunFlux checks that it parses and has the root elementprotein-matches. If it does not, the rule stops withInterProScan XML validation failed for .... - The lookup service. FunFlux passes
-dp, so InterProScan does not ask EBI's lookup service for matches already computed for known proteins. The service did not answer InterProScan 5 in November 2026: run without-dp, InterProScan failed its version check and wrote an error into its log. With-dp, InterProScan needs no internet, andprecalculated.match.lookup.service.urlininterproscan.propertiesdoes not matter to FunFlux. See Functional annotation. - Licensed analyses. Phobius, SignalP and TMHMM are switched off in the InterProScan download because they contain licensed components. FunFlux does not switch them on, and SignalP 6 is its own optional step.
Missing InterProScan¶
InterProScan cannot be switched off, because funannotate annotate needs its result. What happens
without it depends on files.iprscan:
files.iprscan |
What happens |
|---|---|
| empty | the run stops before any job starts with [FunFlux] files.iprscan: required, but it is missing or empty in the config. |
| a path that does not exist | a NOTE before any job starts, [FunFlux] NOTE: files.iprscan '<path>' does not exist on this machine; the InterProScan step will fail without it.; then iprscan_annotation fails when it starts, after gene prediction |
A files.iprscan path that does not exist only prints a NOTE, and the run fails after gene prediction
A NOTE does not stop the run, so a missing InterProScan shows only when iprscan_annotation
starts. Read the NOTEs of the dry run.