Repository: Noble-Lab/casanovo (language: python)

Issue:
Add Casanovo-DB Functionality
Added functionality of Casanovo-DB that builds on top of Tide (Phase 1).

This is accomplished through two new commands, `annotate` and `db-search`.

Most of the functionality is created through subclassing existing classes as only minor modifications are needed to get the data flow to work.


Discussion / hints:
Can you make sure the unit tests succeed?

On a quick glance, without looking at the content of the code, please also adhere to the maximum line length for strings (both within code and docstrings). Black doesn't do this automatically.
> Can you make sure the unit tests succeed?
> 
> On a quick glance, without looking at the content of the code, please also adhere to the maximum line length for strings (both within code and docstrings). Black doesn't do this automatically.

I will definitely take a look at the line lengths and fix them if they are over the maximum.

As for the unit tests, the only one failing is the `test_initialize_model` test, which seems to be the issue we are waiting on in PR #301 .

```
FAILED tests/unit_tests/test_runner.py::test_initialize_model - RuntimeError: MPS backend out of memory (MPS allocated: 0 bytes, other allocations: 0 bytes, max allowed: 7.93 GB). Tried to allocate 1024 bytes on private pool. Use PYTORCH_MPS_HIGH_WATERMARK_RATIO=0.0 to disable upper limit for memory allocations (may cause system failure).
```
No, I don't think that this is the same problem. #301 tries to do tests on the Mac M1 chips, which indeed doesn't work. The current tests on `dev` only use the old Mac architectures though, and should run successfully (as with the previous state of this branch).
@VarunAnanth2003 To avoid running on MPS-supported macOS versions, in the GitHub test action, change `macos-latest` to `macos-13`.
The macOS version has been fixed in #327, so just merge `dev` into your PR.

Fix patch:
diff --git a/casanovo/casanovo.py b/casanovo/casanovo.py
index 7db5faa8..b153512d 100644
--- a/casanovo/casanovo.py
+++ b/casanovo/casanovo.py
@@ -42,7 +42,6 @@
 from . import utils
 from .denovo import ModelRunner
 from .config import Config
-from .data.annotate_db import annotate_mgf
 
 logger = logging.getLogger("casanovo")
 click.rich_click.USE_MARKDOWN = True
@@ -131,7 +130,7 @@ def sequence(
 ) -> None:
     """De novo sequence peptides from tandem mass spectra.
 
-    PEAK_PATH must be one or more mzMl, mzXML, or MGF files from which
+    PEAK_PATH must be one or more mzML, mzXML, or MGF files from which
     to sequence peptides.
     """
     output = setup_logging(output, verbosity)
@@ -146,91 +145,46 @@ def sequence(
     logger.info("DONE!")
 
 
-@main.command()
+@main.command(cls=_SharedParams)
 @click.argument(
     "peak_path",
     required=True,
-    nargs=1,
+    nargs=-1,
     type=click.Path(exists=True, dir_okay=False),
 )
 @click.argument(
-    "tide_path",
+    "fasta_path",
     required=True,
     nargs=1,
-    type=click.Path(exists=True, dir_okay=True),
-)
-@click.option(
-    "-o",
-    "--output",
-    help="The output annotated MGF file.",
-    type=click.Path(dir_okay=False),
-)
-@click.option(
-    "-v",
-    "--verbosity",
-    help="""
-    Set the verbosity of console logging messages. Log files are
-    always set to 'debug'.
-    """,
-    type=click.Choice(
-        ["debug", "info", "warning", "error"],
-        case_sensitive=False,
-    ),
-    default="info",
-)
-def annotate(
-    peak_path: str,
-    tide_path: str,
-    output: Optional[str],
-    verbosity: str,
-) -> None:
-    """Annotate a given .mgf with candidates as selected by a Tide search for Casanovo-DB.
-
-    PEAK_PATH must be one MGF file from which to annotate spectra.
-
-    TIDE_PATH must be one directory containing the Tide search results of the <PEAK_PATH> .mgf.
-    This directory must contain tide-search.decoy.txt and tide-search.target.txt
-    """
-    if output is None:
-        output = setup_logging(output, verbosity)
-        logger.info(
-            "Output file not specified. \
-            Annotated MGF will be saved in the same directory \
-            as the input MGF."
-        )
-        output = peak_path.replace(".mgf", "_annotated.mgf")
-    else:
-        output = setup_logging(output, verbosity)
-
-    annotate_mgf(peak_path, tide_path, output)
-
-    logger.info("DONE!")
-
-
-@main.command(cls=_SharedParams)
-@click.argument(
-    "peak_path",
-    required=True,
-    nargs=-1,
     type=click.Path(exists=True, dir_okay=False),
 )
 def db_search(
     peak_path: Tuple[str],
+    fasta_path: str,
     model: Optional[str],
     config: Optional[str],
     output: Optional[str],
     verbosity: str,
 ) -> None:
-    """Perform a search using Casanovo-DB.
+    """Perform a database search on MS/MS data using Casanovo-DB.
 
-    PEAK_PATH must be one MGF file that has ANNOTATED spectra,
-    as output by annotate mode.
+    PEAK_PATH must be one or more mzML, mzXML, or MGF files.
+    FASTA_PATH must be one FASTA file.
     """
     output = setup_logging(output, verbosity)
     config, model = setup_model(model, config, output, False)
     with ModelRunner(config, model) as runner:
-        logger.info("DB-searching peptides from: %s", peak_path)
-        runner.db_search(peak_path, output)
+        logger.info("Performing database search on:")
+        for peak_file in peak_path:
+            logger.info("  %s", peak_file)
+        logger.info("Using the following FASTA file:")
+        logger.info("  %s", fasta_path)
+
+        runner.db_search(
+            peak_path,
+            fasta_path,
+            output,
+        )
 
     logger.info("DONE!")
 
diff --git a/casanovo/config.py b/casanovo/config.py
index 792da35a..dc2a3d2c 100644
--- a/casanovo/config.py
+++ b/casanovo/config.py
@@ -18,6 +18,7 @@
 _config_deprecated = dict(
     every_n_train_steps="val_check_interval",
     max_iters="cosine_schedule_period_iters",
+    max_length="max_peptide_len",
 )
 
 
@@ -59,7 +60,7 @@ class Config:
         n_layers=int,
         dropout=float,
         dim_intensity=int,
-        max_length=int,
+        max_peptide_len=int,
         residues=dict,
         n_log=int,
         tb_summarywriter=str,
diff --git a/casanovo/config.yaml b/casanovo/config.yaml
index c7186ff7..df6fa8bb 100644
--- a/casanovo/config.yaml
+++ b/casanovo/config.yaml
@@ -5,18 +5,28 @@
 
 ###
 # The following parameters can be modified when running inference or when
-# fine-tuning an existing Casanovo model.
+# fine-tuning an existing Casanovo model. They also affect database search
+# parameters when running Casanovo in DB-search mode.
 ###
 
 # Max absolute difference allowed with respect to observed precursor m/z.
-# Predictions outside the tolerance range are assigned a negative peptide score.
+# denovo: Predictions outside the tolerance range are assigned a negative peptide score.
+# db-search: Select candidate peptides within the specified precursor m/z tolerance.
 precursor_mass_tol: 50  # ppm
 # Isotopes to consider when comparing predicted and observed precursor m/z's.
 isotope_error_range: [0, 1]
-# The minimum length of predicted peptides.
+# The minimum length of considered peptides.
 min_peptide_len: 6
+# The maximum length of considered peptides.
+max_peptide_len: 100
 # Number of spectra in one inference batch.
 predict_batch_size: 1024
+
+
+###
+# The following parameters are unique to Casanovo's inference/finetuning mode.
+###
+
 # Number of beams used in beam search.
 n_beams: 1
 # Number of PSMs for each spectrum.
@@ -29,6 +39,34 @@ accelerator: "auto"
 # number will be automatically selected for based on the chosen accelerator.
 devices:
 
+
+###
+# The following parameters are unique to Casanovo's database search mode.
+###
+
+# Enzyme for in silico digestion, used to generate candidate peptides.
+# See pyteomics.parser.expasy_rules for valid enzymes.
+# Can also take a regex expression to specify custom digestion rules.
+enzyme: "trypsin"
+# Digestion type for candidate peptide generation.
+# full: standard digestion. 
+# semi: Include products of semi-specific cleavage.
+# non-specific: Include products of non-specific cleavage.
+digestion: "full"
+# Number of allowed missed cleavages when digesting protein.
+missed_cleavages: 0
+# Maximum number of variable amino acid modifications per peptide,
+# None generates all possible isoforms as candidates.
+max_mods: 1
+# Select which modifications from the vocabulary can be used in candidate creation.
+# Format: Comma-separated list of "aa:mod_residue", 
+# where aa is a standard amino acid or "nterm" for an N-terminal mod
+# and mod_residue is a key from the "residues" dictionary.
+# Example: "M:M+15.995,X:+43.006-17.027"
+allowed_fixed_mods: "C:C+57.021"
+allowed_var_mods: "M:M+15.995,N:N+0.984,Q:Q+0.984,nterm:+42.011,nterm:+43.006,nterm:-17.027,nterm:+43.006-17.027"
+
+
 ###
 # The following parameters should only be modified if you are training a new
 # Casanovo model from scratch.
@@ -78,8 +116,6 @@ dropout: 0.0
 # Number of dimensions to use for encoding peak intensity.
 # Projected up to `dim_model` by default and summed with the peak m/z encoding.
 dim_intensity:
-# Max decoded peptide length.
-max_length: 100
 # The number of iterations for the linear warm-up of the learning rate.
 warmup_iters: 100_000
 # The number of iterations for the cosine half period of the learning rate.
diff --git a/casanovo/data/annotate_db.py b/casanovo/data/annotate_db.py
deleted file mode 100644
index dd2e6c64..00000000
--- a/casanovo/data/annotate_db.py
+++ /dev/null
@@ -1,138 +0,0 @@
-"""Methods used to annotate an .mgf so that it can be used by Casanovo-DB"""
-
-from pathlib import Path
-from typing import Optional, Tuple
-import os
-import re
-import logging
-
-import pandas as pd
-import pyteomics.mgf as mgf
-
-
-def _normalize_mods(seq: str) -> str:
-    """
-    Turns tide-style modifications into the format used by Casanovo-DB.
-
-        Parameters
-        ----------
-        seq : str
-            The peptide sequence with tide-style modifications.
-
-        Returns
-        -------
-        str
-            The peptide sequence with Casanovo-DB-style modifications.
-    """
-    logger = logging.getLogger("casanovo")
-    seq = seq.replace("C", "C+57.021")
-    seq = re.sub(r"M\[15\.[0-9]*\]", r"M+15.995", seq)
-    seq = re.sub(r"N\[0\.9[0-9]*\]", r"N+0.984", seq)
-    seq = re.sub(r"Q\[0\.9[0-9]*\]", r"Q+0.984", seq)
-    seq = re.sub(r"(.*)\[42\.[0-9]*\]", r"+42.011\1", seq)
-    seq = re.sub(r"(.*)\[43\.[0-9]*\]", r"+43.006\1", seq)
-    seq = re.sub(r"(.*)\[\-17\.[0-9]*\]", r"-17.027\1", seq)
-    seq = re.sub(r"(.*)\[25\.[0-9]*\]", r"+43.006-17.027\1", seq)
-    return seq
-
-
-def annotate_mgf(peak_path: str, tide_path: str, output: Optional[str]):
-    """
-    Accepts a directory containing the results of a successful tide search,
-    and an .mgf file containing MS/MS spectra.
-    The .mgf file is then annotated in the SEQ field with
-    all of the candidate peptides for each spectrum, as well as their target/decoy status.
-    This annotated .mgf can be given directly to Casanovo-DB to perfrom a database search.
-
-        Parameters
-        ----------
-        tide_dir_path : str
-            Path to the directory containing the results of a successful tide search.
-        mgf_file : str
-            Path to the .mgf file containing MS/MS spectra.
-        output_file : str
-            Path to where the annotated .mgf will be written.
-
-    """
-    logger = logging.getLogger("casanovo")
-    # Get paths to tide search text files
-    tdf_path = os.path.join(tide_path, "tide-search.target.txt")
-    ddf_path = os.path.join(tide_path, "tide-search.decoy.txt")
-    try:
-        target_df = pd.read_csv(
-            tdf_path, sep="\t", usecols=["scan", "sequence", "target/decoy"]
-        )
-        decoy_df = pd.read_csv(
-            ddf_path, sep="\t", usecols=["scan", "sequence", "target/decoy"]
-        )
-    except FileNotFoundError as e:
-        logger.error(
-            "Could not find tide search results in the specified directory. "
-            "Please ensure that the directory contains the following files: "
-            "tide-search.target.txt and tide-search.decoy.txt"
-        )
-        raise e
-
-    logger.info("Successfully read tide search results from %s.", tide_path)
-
-    df = pd.concat([target_df, decoy_df])
-    scan_groups = df.groupby("scan")[["sequence", "target/decoy"]]
-
-    scan_map = {}
-
-    for scan, item in scan_groups:
-        td_group = item.groupby("target/decoy")["sequence"].apply(list)
-        if "target" in td_group.index:
-            target_candidate_list = list(
-                map(
-                    _normalize_mods,
-                    td_group["target"],
-                )
-            )
-        else:
-            target_candidate_list = []
-            logger.warn(f"No target peptides found for scan {scan}.")
-        if "decoy" in td_group.index:
-            decoy_candidate_list = list(
-                map(
-                    _normalize_mods,
-                    td_group["decoy"],
-                )
-            )
-            decoy_candidate_list = list(
-                map(lambda x: "decoy_" + str(x), decoy_candidate_list)
-            )
-        else:
-            decoy_candidate_list = []
-            logger.warn(f"No decoy peptides found for scan {scan}.")
-
-        pep_list = target_candidate_list + decoy_candidate_list
-        if len(pep_list) == 0:
-            logger.warn(f"No peptides found for scan {scan}.")
-        else:
-            scan_map[scan] = target_candidate_list + decoy_candidate_list
-
-    all_spec = []
-    for idx, spec_dict in enumerate(mgf.read(peak_path)):
-        try:
-            scan = int(spec_dict["params"]["scans"])
-        except KeyError as e:
-            logger.error(
-                "Could not find the scan number in the .mgf file."
-                "Please ensure that the .mgf file contains the scan number in the 'SCANS' field."
-            )
-            raise e
-        try:
-            spec_dict["params"]["seq"] = ",".join(list(scan_map[scan]))
-            all_spec.append(spec_dict)
-        except KeyError as e:
-            # No need to do anything if the scan is not found in the scan map
-            pass
-    try:
-        output = str(output)
-        mgf.write(all_spec, output, file_mode="w")
-        logger.info("Annotated .mgf file written to %s.", output)
-    except Exception as e:
-        logger.error(
-            "Write to %s failed. Check if the file path is correct.", output
-        )
diff --git a/casanovo/data/datasets.py b/casanovo/data/datasets.py
index aff6af85..3f05811f 100644
--- a/casanovo/data/datasets.py
+++ b/casanovo/data/datasets.py
@@ -1,6 +1,6 @@
 """A PyTorch Dataset class for annotated spectra."""
 
-from typing import Optional, Tuple
+from typing import List, Optional, Tuple
 
 import depthcharge
 import numpy as np
@@ -212,8 +212,6 @@ class AnnotatedSpectrumDataset(SpectrumDataset):
     random_state : Optional[int]
         The NumPy random state. ``None`` leaves mass spectra in the order they
         were parsed.
-    track_spectrum_id : Optional[bool]
-        Whether to keep track of the identifier of the MS/MS spectra.
     """
 
     def __init__(
@@ -225,7 +223,6 @@ def __init__(
         min_intensity: float = 0.01,
         remove_precursor_tol: float = 2.0,
         random_state: Optional[int] = None,
-        track_spectrum_id: Optional[bool] = False,
     ):
         super().__init__(
             annotated_spectrum_index,
@@ -236,7 +233,6 @@ def __init__(
             remove_precursor_tol=remove_precursor_tol,
             random_state=random_state,
         )
-        self.track_spectrum_id = track_spectrum_id
 
     def __getitem__(self, idx: int) -> Tuple[torch.Tensor, float, int, str]:
         """
@@ -268,12 +264,4 @@ def __getitem__(self, idx: int) -> Tuple[torch.Tensor, float, int, str]:
         spectrum = self._process_peaks(
             mz_array, int_array, precursor_mz, precursor_charge
         )
-        if self.track_spectrum_id:
-            return (
-                spectrum,
-                precursor_mz,
-                precursor_charge,
-                peptide,
-                self.get_spectrum_id(idx),
-            )
         return spectrum, precursor_mz, precursor_charge, peptide
diff --git a/casanovo/data/db_utils.py b/casanovo/data/db_utils.py
new file mode 100644
index 00000000..34671eb1
--- /dev/null
+++ b/casanovo/data/db_utils.py
@@ -0,0 +1,423 @@
+"""Unique methods used within db-search mode"""
+
+import functools
+import logging
+import os
+import re
+import string
+from collections import defaultdict
+from typing import List, Tuple, Iterator
+
+import depthcharge.masses
+import pandas as pd
+import pyteomics.fasta as fasta
+import pyteomics.parser as parser
+from numba import njit
+
+
+logger = logging.getLogger("casanovo")
+
+# CONSTANTS
+PROTON = 1.00727646677
+ISOTOPE_SPACING = 1.003355
+
+
+class ProteinDatabase:
+    """
+    Store digested .fasta data and return candidate peptides for a given precursor mass.
+
+    Parameters
+    ----------
+    fasta_path : str
+        Path to the FASTA file.
+    enzyme : str
+        The enzyme to use for digestion.
+        See pyteomics.parser.expasy_rules for valid enzymes.
+    digestion : str
+        The type of digestion to perform. Either 'full' or 'partial'.
+    missed_cleavages : int
+        The number of missed cleavages to allow.
+    min_peptide_len : int
+        The minimum length of peptides to consider.
+    max_peptide_len : int
+        The maximum length of peptides to consider.
+    max_mods : int
+        The maximum number of modifications to allow per peptide.
+    precursor_tolerance : float
+        The precursor mass tolerance in ppm.
+    isotope_error : Tuple[int, int]
+        Isotope range [min, max] to consider when comparing predicted and observed precursor m/z's.
+    allowed_fixed_mods : str
+        A comma separated string of fixed modifications to consider.
+    allowed_var_mods : str
+        A comma separated string of variable modifications to consider.
+    residues : dict
+        A dictionary of amino acid masses.
+    """
+
+    def __init__(
+        self,
+        fasta_path: str,
+        enzyme: str,
+        digestion: str,
+        missed_cleavages: int,
+        min_peptide_len: int,
+        max_peptide_len: int,
+        max_mods: int,
+        precursor_tolerance: float,
+        isotope_error: Tuple[int, int],
+        allowed_fixed_mods: str,
+        allowed_var_mods: str,
+        residues: dict,
+    ):
+        self.fixed_mods, self.var_mods, self.swap_map = _construct_mods_dict(
+            allowed_fixed_mods, allowed_var_mods
+        )
+        self.max_mods = max_mods
+        self.swap_regex = re.compile(
+            "(%s)" % "|".join(map(re.escape, self.swap_map.keys()))
+        )
+        peptide_generator = _peptide_generator(
+            fasta_path,
+            enzyme,
+            digestion,
+            missed_cleavages,
+            min_peptide_len,
+            max_peptide_len,
+            set(list(residues.keys()) + ["C"]),
+        )
+        self.db_peptides, self.prot_map = self._digest_fasta(peptide_generator)
+        self.precursor_tolerance = precursor_tolerance
+        self.isotope_error = isotope_error
+
+    def get_candidates(
+        self,
+        precursor_mz: float,
+        charge: int,
+    ) -> List[Tuple[str, str]]:
+        """
+        Returns a list of candidate peptides that fall within the specified mass range.
+
+        Parameters
+        ----------
+        precursor_mz : float
+            The precursor mass-to-charge ratio.
+        charge : int
+            The precursor charge.
+
+        Returns
+        -------
+        candidates : pd.Series
+            A series of candidate peptides.
+        """
+        candidates = []
+
+        for e in range(self.isotope_error[0], self.isotope_error[1] + 1):
+            iso_shift = ISOTOPE_SPACING * e
+            shift_raw_mass = float(
+                _to_raw_mass(precursor_mz, charge) - iso_shift
+            )
+            upper_bound = shift_raw_mass * (
+                1 + (self.precursor_tolerance / 1e6)
+            )
+            lower_bound = shift_raw_mass * (
+                1 - (self.precursor_tolerance / 1e6)
+            )
+
+            window = self.db_peptides[
+                (self.db_peptides["calc_mass"] >= lower_bound)
+                & (self.db_peptides["calc_mass"] <= upper_bound)
+            ]
+            candidates.append(window[["peptide", "calc_mass"]])
+
+        candidates = pd.concat(candidates)
+        candidates.drop_duplicates(inplace=True)
+        candidates.sort_values(by=["calc_mass", "peptide"], inplace=True)
+        return candidates["peptide"]
+
+    def get_associated_protein(self, peptide: str) -> str:
+        """
+        Returns the associated protein for a given peptide.
+
+        Parameters
+        ----------
+        peptide : str
+            The peptide sequence.
+
+        Returns
+        -------
+        protein : str
+            The associated protein(s).
+        """
+        return ",".join(self.prot_map[peptide])
+
+    def _digest_fasta(
+        self,
+        peptide_generator: Iterator[Tuple[str, str]],
+    ) -> Tuple[pd.DataFrame, dict]:
+        """
+        Digests a FASTA file and returns the peptides, their masses, and associated protein.
+
+        Parameters
+        ----------
+        peptide_generator : Iterator[Tuple[str, str]]
+            An iterator that yields peptides and associated proteins.
+
+        Returns
+        -------
+        pep_table : pd.DataFrame
+            A Pandas DataFrame with peptide and mass columns.
+            Sorted by neutral mass in ascending order.
+        prot_map : dict
+            A dictionary mapping peptides to associated proteins.
+        """
+        peptide_list = []
+        for pep, prot in peptide_generator:
+            peptide_list.append((pep, prot))
+
+        # Generate modified peptides
+        mass_calculator = depthcharge.masses.PeptideMass(residues="massivekb")
+        peptide_isoforms = [
+            (
+                parser.isoforms(
+                    pep,
+                    variable_mods=self.var_mods,
+                    fixed_mods=self.fixed_mods,
+                    max_mods=self.max_mods,
+                ),
+                prot,
+            )
+            for pep, prot in peptide_list
+        ]
+        mod_peptide_list = [
+            (mod_pep, mass_calculator.mass(mod_pep), prot)
+            for isos, prot in peptide_isoforms
+            for mod_pep in map(
+                functools.partial(
+                    _convert_from_modx,
+                    swap_map=self.swap_map,
+                    swap_regex=self.swap_regex,
+                ),
+                isos,
+            )
+        ]
+
+        # Create a dictionary mapping for easy accession of associated proteins
+        prot_map = defaultdict(list)
+        for pep, _, prot in mod_peptide_list:
+            prot_map[pep].append(prot)
+
+        # Create a DataFrame for easy sorting and filtering
+        pep_table = pd.DataFrame(
+            [(pep, mass) for pep, mass, _ in mod_peptide_list],
+            columns=["peptide", "calc_mass"],
+        )
+        pep_table.sort_values(by=["calc_mass", "peptide"], inplace=True)
+
+        logger.info(
+            "Digestion complete. %d peptides generated.", len(pep_table)
+        )
+        return pep_table, prot_map
+
+
+def _peptide_generator(
+    fasta_filename: str,
+    enzyme: str,
+    digestion: str,
+    missed_cleavages: int,
+    min_peptide_length: int,
+    max_peptide_length: int,
+    valid_aa: set[str],
+) -> Iterator[str]:
+    """
+    Create a generator the yields peptides from a FASTA file
+    depending on the type of digestion specified.
+
+    Parameters
+    ----------
+    fasta_filename : str
+        Path to the FASTA file.
+    enzyme : str
+        The enzyme to use for digestion.
+        See pyteomics.parser.expasy_rules for valid enzymes.
+        Can also be a regex pattern.
+    digestion : str
+        The type of digestion to perform. Either 'full', 'partial' or 'non-specific'.
+    missed_cleavages : int
+        The number of missed cleavages to allow.
+    min_peptide_length : int
+        The minimum length of peptides to consider.
+    max_peptide_length : int
+        The maximum length of peptides to consider.
+    valid_aa : set[str]
+        A set of valid amino acids.
+
+    Yields
+    ------
+    pep : str
+        A peptide sequence, unmodified.
+    protein : str
+        The associated protein.
+    """
+    # Verify the existence of the file:
+    if not os.path.isfile(fasta_filename):
+        logger.error("File %s does not exist.", fasta_filename)
+        raise FileNotFoundError(f"File {fasta_filename} does not exist.")
+    if digestion not in ["full", "partial", "non-specific"]:
+        logger.error("Digestion type %s not recognized.", digestion)
+        raise ValueError(f"Digestion type {digestion} not recognized.")
+    if enzyme not in parser.expasy_rules:
+        logger.info(
+            "Enzyme %s not recognized. Interpreting as cleavage rule.",
+            enzyme,
+        )
+
+    # Verify the existence of the file:
+    if not os.path.isfile(fasta_filename):
+        logger.error("File %s does not exist.", fasta_filename)
+        raise FileNotFoundError(f"File {fasta_filename} does not exist.")
+    if digestion not in ["full", "partial", "non-specific"]:
+        logger.error("Digestion type %s not recognized.", digestion)
+        raise ValueError(f"Digestion type {digestion} not recognized.")
+    if enzyme not in parser.expasy_rules:
+        logger.info(
+            "Enzyme %s not recognized. Interpreting as cleavage rule.",
+            enzyme,
+        )
+    if digestion == "non-specific":
+        for header, seq in fasta.read(fasta_filename):
+            protein = header.split()[0]
+            # Generate all possible peptides
+            for i in range(len(seq)):
+                for j in range(
+                    i + min_peptide_length,
+                    min(i + max_peptide_length + 1, len(seq) + 1),
+                ):
+                    pep = seq[i:j]
+                    if any(aa not in valid_aa for aa in pep):
+                        logger.warn(
+                            "Skipping peptide with unknown amino acids: %s",
+                            pep,
+                        )
+                    else:
+                        yield pep, protein
+    else:
+        semi = digestion == "partial"
+        for header, seq in fasta.read(fasta_filename):
+            pep_set = parser.cleave(
+                seq,
+                rule=enzyme,
+                missed_cleavages=missed_cleavages,
+                semi=semi,
+            )
+            protein = header.split()[0]
+            for pep in pep_set:
+                if (
+                    len(pep) >= min_peptide_length
+                    and len(pep) <= max_peptide_length
+                ):
+                    if any(aa not in valid_aa for aa in pep):
+                        logger.warn(
+                            "Skipping peptide with unknown amino acids: %s",
+                            pep,
+                        )
+                    else:
+                        yield pep, protein
+
+
+@njit
+def _to_mz(precursor_mass: float, charge: int) -> float:
+    """
+    Convert precursor neutral mass to m/z value.
+
+    Parameters
+    ----------
+    precursor_mass : float
+        The precursor neutral mass.
+    charge : int
+        The precursor charge.
+
+    Returns
+    -------
+    mz : float
+        The calculated precursor mass-to-charge ratio.
+    """
+    return (precursor_mass + (charge * PROTON)) / charge
+
+
+@njit
+def _to_raw_mass(mz_mass: float, charge: int) -> float:
+    """
+    Convert precursor m/z value to neutral mass.
+
+    Parameters
+    ----------
+    mz_mass : float
+        The precursor mass-to-charge ratio.
+    charge : int
+        The precursor charge.
+
+    Returns
+    -------
+    mass : float
+        The calculated precursor neutral mass.
+    """
+    return charge * (mz_mass - PROTON)
+
+
+def _convert_from_modx(seq: str, swap_map: dict, swap_regex: str) -> str:
+    """Converts peptide sequence from modX format to Casanovo-acceptable modifications.
+
+    Args:
+        seq : str
+            Peptide in modX format
+        swap_map : dict
+            Dictionary that allows for swapping of modX to Casanovo-acceptable modifications.
+        swap_regex : str
+            Regular expression to match modX format.
+    """
+    return swap_regex.sub(lambda x: swap_map[x.group()], seq)
+
+
+def _construct_mods_dict(
+    allowed_fixed_mods: str, allowed_var_mods: str
+) -> Tuple[dict, dict, dict]:
+    """
+    Constructs dictionaries of fixed and variable modifications.
+
+    Parameters
+    ----------
+    allowed_fixed_mods : str
+        A comma separated string of fixed modifications to consider.
+    allowed_var_mods : str
+        A comma separated string of variable modifications to consider.
+
+    Returns
+    -------
+    fixed_mods : dict
+        A dictionary of fixed modifications.
+    var_mods : dict
+        A dictionary of variable modifications.
+    swap_map : dict
+        A dictionary that allows for swapping of modX to Casanovo-acceptable modifications.
+    """
+    swap_map = {}
+    fixed_mods = {}
+    for idx, mod in enumerate(allowed_fixed_mods.split(",")):
+        aa, mod_aa = mod.split(":")
+        mod_id = string.ascii_lowercase[idx]
+        fixed_mods[mod_id] = [aa]
+        swap_map[f"{mod_id}{aa}"] = f"{mod_aa}"
+
+    var_mods = {}
+    for idx, mod in enumerate(allowed_var_mods.split(",")):
+        aa, mod_aa = mod.split(":")
+        mod_id = string.ascii_lowercase[idx]
+        if aa == "nterm":
+            var_mods[f"{mod_id}-"] = True
+            swap_map[f"{mod_id}-"] = f"{mod_aa}"
+        else:
+            var_mods[mod_id] = [aa]
+            swap_map[f"{mod_id}{aa}"] = f"{mod_aa}"
+
+    return fixed_mods, var_mods, swap_map
diff --git a/casanovo/data/ms_io.py b/casanovo/data/ms_io.py
index c4cfc7cb..b27f083b 100644
--- a/casanovo/data/ms_io.py
+++ b/casanovo/data/ms_io.py
@@ -22,13 +22,10 @@ class MztabWriter:
     ----------
     filename : str
         The name of the mzTab file.
-    is_db_variant : bool
-        Whether the mzTab file is for a Casanovo-DB search.
     """
 
-    def __init__(self, filename: str, is_db_variant: bool = False):
+    def __init__(self, filename: str):
         self.filename = filename
-        self.is_db_variant = is_db_variant
         self.metadata = [
             ("mzTab-version", "1.0.0"),
             ("mzTab-mode", "Summary"),
@@ -150,9 +147,6 @@ def save(self) -> None:
         """
         Export the spectrum identifications to the mzTab file.
         """
-        if self.is_db_variant:
-            self.save_db_variant()
-            return
         with open(self.filename, "w", newline="") as f:
             writer = csv.writer(f, delimiter="\t", lineterminator=os.linesep)
             # Write metadata.
@@ -192,7 +186,7 @@ def save(self) -> None:
                         "PSM",
                         psm[0],  # sequence
                         i,  # PSM_ID
-                        "null",  # accession
+                        "null" if len(psm) < 8 else psm[7],  # accession
                         "null",  # unique
                         "null",  # database
                         "null",  # database_version
@@ -215,75 +209,3 @@ def save(self) -> None:
                         psm[6],  # opt_ms_run[1]_aa_scores
                     ]
                 )
-
-    def save_db_variant(self) -> None:
-        """
-        Export the Casanovo-DB search results to the mzTab file.
-
-        Outputs PSMs in the order they were scored
-        (i.e. the order in the annotated .mgf file).
-        """
-        with open(self.filename, "w", newline="") as f:
-            writer = csv.writer(f, delimiter="\t", lineterminator=os.linesep)
-            # Write metadata.
-            for row in self.metadata:
-                writer.writerow(["MTD", *row])
-            # Write PSMs.
-            writer.writerow(
-                [
-                    "PSH",
-                    "sequence",
-                    "PSM_ID",
-                    "accession",
-                    "unique",
-                    "database",
-                    "database_version",
-                    "search_engine",
-                    "search_engine_score[1]",
-                    "modifications",
-                    "retention_time",
-                    "charge",
-                    "exp_mass_to_charge",
-                    "calc_mass_to_charge",
-                    "spectra_ref",
-                    "pre",
-                    "post",
-                    "start",
-                    "end",
-                    "opt_ms_run[1]_aa_scores",
-                    "opt_cv_MS:1002217_decoy_peptide",
-                ]
-            )
-            for i, psm in enumerate(self.psms):
-                writer.writerow(
-                    [
-                        "PSM",
-                        psm[0],  # sequence
-                        f"{psm[5]}:{i}",  # spectra_ref
-                        "null",  # accession
-                        "null",  # unique
-                        "null",  # database
-                        "null",  # database_version
-                        "null",  # search_engine
-                        psm[1],  # search_engine_score[1]
-                        "null",  # modifications
-                        "null",  # retention_time
-                        int(psm[2]),  # charge
-                        psm[3],  # exp_mass_to_charge
-                        psm[4],  # calc_mass_to_charge
-                        psm[5],  # spectra_ref
-                        "null",  # pre
-                        "null",  # post
-                        "null",  # start
-                        "null",  # end
-                        ",".join(
-                            list(
-                                map(
-                                    "{:.5f}".format,
-                                    psm[6][psm[6] != 0],
-                                )
-                            )
-                        ),  # opt_ms_run[1]_aa_scores
-                        bool(psm[7]),  # opt_cv_MS:1002217_decoy_peptide
-                    ]
-                )
diff --git a/casanovo/denovo/dataloaders.py b/casanovo/denovo/dataloaders.py
index aff860a1..2646329d 100644
--- a/casanovo/denovo/dataloaders.py
+++ b/casanovo/denovo/dataloaders.py
@@ -1,6 +1,7 @@
 """Data loaders for the de novo sequencing task."""
 
 import functools
+import logging
 import os
 from typing import List, Optional, Tuple
 
@@ -9,12 +10,16 @@
 import torch
 from depthcharge.data import AnnotatedSpectrumIndex
 
+from ..data import db_utils
 from ..data.datasets import (
     AnnotatedSpectrumDataset,
     SpectrumDataset,
 )
 
 
+logger = logging.getLogger("casanovo")
+
+
 class DeNovoDataModule(pl.LightningDataModule):
     """
     Data loader to prepare MS/MS spectra for a Spec2Pep predictor.
@@ -84,6 +89,7 @@ def __init__(
         self.train_dataset = None
         self.valid_dataset = None
         self.test_dataset = None
+        self.protein_database = None
 
     def setup(self, stage: str = None, annotated: bool = True) -> None:
         """
@@ -91,7 +97,7 @@ def setup(self, stage: str = None, annotated: bool = True) -> None:
 
         Parameters
         ----------
-        stage : str {"fit", "validate", "test", "db"}
+        stage : str {"fit", "validate", "test"}
             The stage indicating which Datasets to prepare. All are prepared by
             default.
         annotated: bool
@@ -125,25 +131,12 @@ def setup(self, stage: str = None, annotated: bool = True) -> None:
             )
             if self.test_index is not None:
                 self.test_dataset = make_dataset(self.test_index)
-        if stage == "db":
-            make_dataset = functools.partial(
-                AnnotatedSpectrumDataset,
-                n_peaks=self.n_peaks,
-                min_mz=self.min_mz,
-                max_mz=self.max_mz,
-                min_intensity=self.min_intensity,
-                remove_precursor_tol=self.remove_precursor_tol,
-                track_spectrum_id=True,
-            )
-            if self.test_index is not None:
-                self.test_dataset = make_dataset(self.test_index)
 
     def _make_loader(
         self,
         dataset: torch.utils.data.Dataset,
         batch_size: int,
         shuffle: bool = False,
-        db_mode: bool = False,
     ) -> torch.utils.data.DataLoader:
         """
         Create a PyTorch DataLoader.
@@ -156,8 +149,6 @@ def _make_loader(
             The batch size to use.
         shuffle : bool
             Option to shuffle the batches.
-        db_mode : bool
-            Option to use the DataLoader for Casanovo-DB.
 
         Returns
         -------
@@ -167,7 +158,7 @@ def _make_loader(
         return torch.utils.data.DataLoader(
             dataset,
             batch_size=batch_size,
-            collate_fn=prepare_batch if not db_mode else prepare_db_batch,
+            collate_fn=prepare_batch,
             pin_memory=True,
             num_workers=self.n_workers,
             shuffle=shuffle,
@@ -192,9 +183,16 @@ def predict_dataloader(self) -> torch.utils.data.DataLoader:
         return self._make_loader(self.test_dataset, self.eval_batch_size)
 
     def db_dataloader(self) -> torch.utils.data.DataLoader:
-        """Get the predict DataLoader."""
-        return self._make_loader(
-            self.test_dataset, self.eval_batch_size, db_mode=True
+        """Get a special dataloader for DB search"""
+        return torch.utils.data.DataLoader(
+            self.test_dataset,
+            batch_size=self.eval_batch_size,
+            collate_fn=functools.partial(
+                prepare_psm_batch, protein_database=self.protein_database
+            ),
+            pin_memory=True,
+            num_workers=self.n_workers,
+            shuffle=False,
         )
 
 
@@ -237,46 +235,74 @@ def prepare_batch(
     return spectra, precursors, np.asarray(spectrum_ids)
 
 
-def prepare_db_batch(
-    batch: List[Tuple[torch.Tensor, float, int, str, Tuple[str, str]]]
-) -> Tuple[torch.Tensor, torch.Tensor, np.ndarray, Tuple[str, str]]:
+def prepare_psm_batch(
+    batch: List[Tuple[torch.Tensor, float, int, str]],
+    protein_database: db_utils.ProteinDatabase,
+) -> Tuple[torch.Tensor, torch.Tensor, np.ndarray, List[str], List[str]]:
     """
-    Collate MS/MS spectra into a batch meant for Casanovo-DB.
+    Collate MS/MS spectra into a batch for DB search.
+
+    The MS/MS spectra will be padded so that they fit nicely as a tensor.
+    However, the padded elements are ignored during the subsequent steps.
 
     Parameters
     ----------
-    batch : List[Tuple[torch.Tensor, Tuple[float, int, float], str, Tuple[str, str]]]
+    batch : List[Tuple[torch.Tensor, float, int, str]]
         A batch of data from an AnnotatedSpectrumDataset, consisting of for each
-        spectrum (i) a tensor with the m/z and intensity peak values,
-        (ii) the precursor information [mass, charge, m/z], (iii) the
-        peptide sequence, the precursor m/z, (iv) spectrum identifiers
-        (file and scan).
+        spectrum (i) a tensor with the m/z and intensity peak values, (ii), the
+        precursor m/z, (iii) the precursor charge, (iv) the spectrum identifier.
+    protein_database : db_utils.ProteinDatabase
+        The protein database to use for candidate peptide retrieval.
 
     Returns
     -------
-    spectra : torch.Tensor of shape (batch_size, n_peaks, 2)
+    all_spectra : torch.Tensor of shape (batch_size, n_peaks, 2)
         The padded mass spectra tensor with the m/z and intensity peak values
         for each spectrum.
-    precursors : torch.Tensor of shape (batch_size, 3)
+    all_precursors : torch.Tensor of shape (batch_size, 3)
         A tensor with the precursor neutral mass, precursor charge, and
         precursor m/z.
-    spectrum_peps : np.ndarray
-        Peptide sequences
-    spectrum_ids : Tuple[str, str]
-        Peak file and spectrum identifier
+    all_spectrum_ids : np.ndarray
+        The spectrum identifiers.
+    all_peptides : List[str]
+        The candidate peptides for each spectrum.
     """
-    (
-        spectra,
-        precursor_mzs,
-        precursor_charges,
-        spectrum_peps,
-        spectrum_ids,
-    ) = list(zip(*batch))
+    spectra, precursor_mzs, precursor_charges, spectrum_ids = list(zip(*batch))
     spectra = torch.nn.utils.rnn.pad_sequence(spectra, batch_first=True)
-    precursor_mzs = torch.tensor(precursor_mzs)
-    precursor_charges = torch.tensor(precursor_charges)
-    precursor_masses = (precursor_mzs - 1.007276) * precursor_charges
+
+    precursor_mzs_t = torch.tensor(precursor_mzs)
+    precursor_charges_t = torch.tensor(precursor_charges)
+    precursor_masses_t = (precursor_mzs_t - 1.007276) * precursor_charges_t
     precursors = torch.vstack(
-        [precursor_masses, precursor_charges, precursor_mzs]
+        [precursor_masses_t, precursor_charges_t, precursor_mzs_t]
     ).T.float()
-    return spectra, precursors, np.asarray(spectrum_peps), spectrum_ids
+
+    all_spectra = []
+    all_precursors = []
+    all_spectrum_ids = []
+    all_peptides = []
+    for idx in range(len(batch)):
+        spec_peptides = protein_database.get_candidates(
+            precursor_mzs[idx],
+            precursor_charges[idx],
+        )
+        try:
+            all_spectra.append(
+                spectra[idx].unsqueeze(0).repeat(len(spec_peptides), 1, 1)
+            )
+            all_precursors.append(
+                precursors[idx].unsqueeze(0).repeat(len(spec_peptides), 1)
+            )
+            all_spectrum_ids.extend([spectrum_ids[idx]] * len(spec_peptides))
+            all_peptides.extend(spec_peptides)
+        except ValueError:
+            logger.warning(
+                "No candidates found for spectrum %s", spectrum_ids[idx]
+            )
+
+    return (
+        torch.cat(all_spectra, dim=0),
+        torch.cat(all_precursors, dim=0),
+        all_spectrum_ids,
+        all_peptides,
+    )
diff --git a/casanovo/denovo/model.py b/casanovo/denovo/model.py
index 71f4a6fa..ca5557fc 100644
--- a/casanovo/denovo/model.py
+++ b/casanovo/denovo/model.py
@@ -12,7 +12,6 @@
 import numpy as np
 import lightning.pytorch as pl
 from torch.utils.tensorboard import SummaryWriter
-from pyteomics import mass
 from depthcharge.components import ModelMixin, PeptideDecoder, SpectrumEncoder
 
 from . import evaluate
@@ -47,7 +46,7 @@ class Spec2Pep(pl.LightningModule, ModelMixin):
         (``dim_model - dim_intensity``) are reserved for encoding the m/z value.
         If ``None``, the intensity will be projected up to ``dim_model`` using a
         linear layer, then summed with the m/z encoding for each peak.
-    max_length : int
+    max_peptide_len : int
         The maximum peptide length to decode.
     residues : Union[Dict[str, float], str]
         The amino acid dictionary and their masses. By default ("canonical) this
@@ -100,7 +99,7 @@ def __init__(
         n_layers: int = 9,
         dropout: float = 0.0,
         dim_intensity: Optional[int] = None,
-        max_length: int = 100,
+        max_peptide_len: int = 100,
         residues: Union[Dict[str, float], str] = "canonical",
         max_charge: int = 5,
         precursor_mass_tol: float = 50,
@@ -159,7 +158,7 @@ def __init__(
         self.opt_kwargs = kwargs
 
         # Data properties.
-        self.max_length = max_length
+        self.max_peptide_len = max_peptide_len
         self.residues = residues
         self.precursor_mass_tol = precursor_mass_tol
         self.isotope_error_range = isotope_error_range
@@ -242,7 +241,7 @@ def beam_search_decode(
 
         # Sizes.
         batch = spectra.shape[0]  # B
-        length = self.max_length + 1  # L
+        length = self.max_peptide_len + 1  # L
         vocab = self.decoder.vocab_size + 1  # V
         beam = self.n_beams  # S
 
@@ -270,7 +269,7 @@ def beam_search_decode(
         scores = einops.rearrange(scores, "B L V S -> (B S) L V")
 
         # The main decoding loop.
-        for step in range(0, self.max_length):
+        for step in range(0, self.max_peptide_len):
             # Terminate beams exceeding the precursor m/z tolerance and track
             # all finished beams (either terminated or stop token predicted).
             (
@@ -324,10 +323,10 @@ def _finish_beams(
 
         Parameters
         ----------
-        tokens : torch.Tensor of shape (n_spectra * n_beams, max_length)
+        tokens : torch.Tensor of shape (n_spectra * n_beams, max_peptide_len)
             Predicted amino acid tokens for all beams and all spectra.
          scores : torch.Tensor of shape
-         (n_spectra *  n_beams, max_length, n_amino_acids)
+         (n_spectra *  n_beams, max_peptide_len, n_amino_acids)
             Scores for the predicted amino acid tokens for all beams and all
             spectra.
         step : int
@@ -492,10 +491,10 @@ def _cache_finished_beams(
 
         Parameters
         ----------
-        tokens : torch.Tensor of shape (n_spectra * n_beams, max_length)
+        tokens : torch.Tensor of shape (n_spectra * n_beams, max_peptide_len)
             Predicted amino acid tokens for all beams and all spectra.
          scores : torch.Tensor of shape
-         (n_spectra *  n_beams, max_length, n_amino_acids)
+         (n_spectra *  n_beams, max_peptide_len, n_amino_acids)
             Scores for the predicted amino acid tokens for all beams and all
             spectra.
         step : int
@@ -577,10 +576,10 @@ def _get_topk_beams(
 
         Parameters
         ----------
-        tokens : torch.Tensor of shape (n_spectra * n_beams, max_length)
+        tokens : torch.Tensor of shape (n_spectra * n_beams, max_peptide_len)
             Predicted amino acid tokens for all beams and all spectra.
          scores : torch.Tensor of shape
-         (n_spectra *  n_beams, max_length, n_amino_acids)
+         (n_spectra *  n_beams, max_peptide_len, n_amino_acids)
             Scores for the predicted amino acid tokens for all beams and all
             spectra.
         finished_beams : torch.Tensor of shape (n_spectra * n_beams)
@@ -593,10 +592,10 @@ def _get_topk_beams(
 
         Returns
         -------
-        tokens : torch.Tensor of shape (n_spectra * n_beams, max_length)
+        tokens : torch.Tensor of shape (n_spectra * n_beams, max_peptide_len)
             Predicted amino acid tokens for all beams and all spectra.
          scores : torch.Tensor of shape
-         (n_spectra *  n_beams, max_length, n_amino_acids)
+         (n_spectra *  n_beams, max_peptide_len, n_amino_acids)
             Scores for the predicted amino acid tokens for all beams and all
             spectra.
         """
@@ -992,14 +991,25 @@ def configure_optimizers(
 
 class DbSpec2Pep(Spec2Pep):
     """
-    Inherits Spec2Pep
+    Subclass of Spec2Pep for the use of Casanovo as an
+    MS/MS database search score function.
 
-    Hijacks teacher-forcing implemented in Spec2Pep and
-    uses it to predict scores between a spectra and associated peptide.
+    Uses teacher forcing to 'query' Casanovo for its score for each AA
+    within a candidate peptide, and takes the geometric average of these scores
+    and reports this as the score for the spectrum-peptide pair. Note that the
+    geometric mean of the AA scores is actually calculated by a
+    summation and average of the log of the scores, to preserve numerical
+    stability. This does not affect PSM ranking.
+
+    Also note that although teacher-forcing is used within this method,
+    there is *no training* involved. This is a prediction-only method.
+
+    Output is provided in .mztab format.
     """
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
+        self.psm_batch_size = None
 
     def predict_step(self, batch, *args):
         """
@@ -1007,132 +1017,95 @@ def predict_step(self, batch, *args):
 
         Parameters
         ----------
-        batch : Tuple[torch.Tensor, torch.Tensor, torch.Tensor]
+        batch : Tuple[torch.Tensor, torch.Tensor, np.array, List[str]]
             A batch of (i) MS/MS spectra, (ii) precursor information, (iii)
-            spectrum identifiers as torch Tensors, (iv) scan numbers.
+            spectrum identifiers, (iv) candidate peptides
 
         Returns
         -------
-        predictions: List[Tuple[int, bool, str, float, np.ndarray, np.ndarray]]
+        predictions: List[Tuple[int, int, float, str, np.ndarray, np.ndarray, str]]
             Model predictions for the given batch of spectra containing spectrum
-            scan number, decoy flag, peptide sequence, Casanovo-DB score,
-            amino acid-level confidence scores, and precursor information.
+            ids, precursor charge and m/z, candidate peptide sequences, peptide
+            scores, amino acid-level scores, and associated proteins.
         """
-        batch_res = []
-        for (
-            indexes,
-            is_decoy,
-            peptides,
-            precursors,
-            encoded_ms,
-        ) in self.smart_batch_gen(batch):
-            pred, truth = self.decoder(peptides, precursors, *encoded_ms)
+        predictions = []
+        for start_idx in range(0, len(batch[0]), self.psm_batch_size):
+            current_batch = [
+                b[start_idx : start_idx + self.psm_batch_size] for b in batch
+            ]
+            pred, truth = self.decoder(
+                current_batch[3],
+                current_batch[1],
+                *self.encoder(current_batch[0]),
+            )
             pred = self.softmax(pred)
-            score_result, per_aa_score = _calc_match_score(
+            all_scores, per_aa_scores = _calc_match_score(
                 pred, truth, self.decoder.reverse
             )
-            batch_res.append(
-                (
-                    indexes,
-                    is_decoy,
-                    peptides,
-                    score_result.cpu().detach().numpy(),
-                    per_aa_score.cpu().detach().numpy(),
-                    precursors.cpu().detach().numpy(),
-                )
-            )
-        return batch_res
-
-    def smart_batch_gen(self, batch):
-        all_psm = []
-        batch_size = len(batch[0])
-        enc = self.encoder(batch[0])
-        precursors = batch[1]
-        indexes = batch[3]
-        enc = list(zip(*enc))
-        for idx in range(batch_size):
-            spec_peptides = batch[2][idx].split(",")
-            # Check for decoy prefixes and create a bit-vector indicating targets (1) or decoys (0)
-            decoy_prefix = "decoy_"  # Decoy prefix
-            id_decoys = np.array(
-                [
-                    (0, p.removeprefix(decoy_prefix))
-                    if p.startswith(decoy_prefix)
-                    else (1, p)
-                    for p in spec_peptides
-                ]
-            )
-            decoy_mask = np.array(id_decoys[:, 0], dtype=bool)
-            spec_peptides = list(id_decoys[:, 1])
-            spec_precursors = [precursors[idx]] * len(spec_peptides)
-            spec_enc = [enc[idx]] * len(spec_peptides)
-            spec_idx = [indexes[idx]] * len(spec_peptides)
-            all_psm.extend(
-                list(
-                    zip(
-                        spec_enc,
-                        spec_precursors,
-                        spec_peptides,
-                        spec_idx,
-                        decoy_mask,
+            for (
+                precursor_charge,
+                precursor_mz,
+                spectrum_i,
+                peptide_score,
+                aa_scores,
+                peptide,
+            ) in zip(
+                current_batch[1][:, 1].cpu().detach().numpy(),
+                current_batch[1][:, 2].cpu().detach().numpy(),
+                current_batch[2],
+                all_scores.cpu().detach().numpy(),
+                per_aa_scores.cpu().detach().numpy(),
+                current_batch[3],
+            ):
+                predictions.append(
+                    (
+                        spectrum_i,
+                        precursor_charge,
+                        precursor_mz,
+                        peptide,
+                        peptide_score,
+                        aa_scores,
+                        self.protein_database.get_associated_protein(peptide),
                     )
                 )
-            )
-        # Continually grab num_pairs items from all_psm until list is exhausted
-        while len(all_psm) > 0:
-            batch = all_psm[:batch_size]
-            all_psm = all_psm[batch_size:]
-            batch = list(zip(*batch))
-            encoded_ms = (
-                torch.stack([a[0] for a in batch[0]]),
-                torch.stack([a[1] for a in batch[0]]),
-            )
-            prec_data = torch.stack(batch[1])
-            pep_str = list(batch[2])
-            indexes = [a[1] for a in batch[3]]
-            is_decoy = batch[4]
-            yield (indexes, is_decoy, pep_str, prec_data, encoded_ms)
+        return predictions
 
     def on_predict_batch_end(
         self,
         outputs: List[Tuple[np.ndarray, List[str], torch.Tensor]],
         *args,
     ) -> None:
-        if self.out_writer is None:
-            return
+        """
+        Write the database search results to the output file.
+        """
         for (
-            indexes,
-            t_or_d,
-            peptides,
-            score_result,
-            per_aa_score,
-            precursors,
+            spectrum_i,
+            charge,
+            precursor_mz,
+            peptide,
+            peptide_score,
+            aa_scores,
+            protein,
         ) in outputs:
-            prec_mass = precursors[:, 0]
-            prec_charge = precursors[:, 1]
-            prec_mz = precursors[:, 2]
-            calc_mz = [
-                self.peptide_mass_calculator.mass(peptide, charge)
-                for peptide, charge in zip(peptides, prec_charge)
-            ]
-            for row in zip(
-                peptides,
-                score_result,
-                prec_charge,
-                prec_mz,
-                calc_mz,
-                indexes,
-                per_aa_score,
-                t_or_d,
-            ):
-                self.out_writer.psms.append(row)
+            self.out_writer.psms.append(
+                (
+                    peptide,
+                    tuple(spectrum_i),
+                    peptide_score,
+                    charge,
+                    precursor_mz,
+                    self.peptide_mass_calculator.mass(peptide, charge),
+                    ",".join(list(map("{:.5f}".format, aa_scores))),
+                    protein,
+                ),
+            )
 
 
 def _calc_match_score(
     batch_all_aa_scores: torch.Tensor,
-    truth_aa_indicies: torch.Tensor,
+    truth_aa_indices: torch.Tensor,
     decoder_reverse: bool = False,
-) -> List[float]:
+) -> Tuple[torch.Tensor, torch.Tensor]:
     """
     Calculate the score between the input spectra and associated peptide.
 
@@ -1148,7 +1121,7 @@ def _calc_match_score(
         Amino acid scores for all amino acids in
         the vocabulary for every prediction made to generate
         the associated peptide (for an entire batch)
-    truth_aa_indicies : torch.Tensor
+    truth_aa_indices : torch.Tensor
         Indicies of the score for each actual amino acid
         in the peptide (for an entire batch)
     decoder_reverse : bool
@@ -1156,7 +1129,7 @@ def _calc_match_score(
 
     Returns
     -------
-    score : list[float], list[list[float]]
+    (all_scores, per_aa_scores) : Tuple[torch.Tensor, torch.Tensor]
         The score between the input spectra and associated peptide
         (for an entire batch)
         a list of lists of per amino acid scores
@@ -1165,7 +1138,7 @@ def _calc_match_score(
     # Remove trailing tokens from predictions based on decoder reversal
     if decoder_reverse:
         batch_all_aa_scores = batch_all_aa_scores[:, 1:]
-    elif not decoder_reverse:
+    else:
         batch_all_aa_scores = batch_all_aa_scores[:, :-1]
 
     # Vectorized scoring using efficient indexing.
@@ -1176,10 +1149,10 @@ def _calc_match_score(
     )
     cols = torch.arange(0, batch_all_aa_scores.shape[1]).expand_as(rows)
 
-    per_aa_scores = batch_all_aa_scores[rows, cols, truth_aa_indicies]
+    per_aa_scores = batch_all_aa_scores[rows, cols, truth_aa_indices]
 
     per_aa_scores[per_aa_scores == 0] += 1e-10
-    score_mask = truth_aa_indicies != 0
+    score_mask = truth_aa_indices != 0
     per_aa_scores[~score_mask] = 0
     log_per_aa_scores = torch.log(per_aa_scores)
     all_scores = torch.where(
diff --git a/casanovo/denovo/model_runner.py b/casanovo/denovo/model_runner.py
index e150ab2d..efb380cb 100644
--- a/casanovo/denovo/model_runner.py
+++ b/casanovo/denovo/model_runner.py
@@ -18,7 +18,7 @@
 from lightning.pytorch.callbacks import ModelCheckpoint
 
 from ..config import Config
-from ..data import ms_io
+from ..data import db_utils, ms_io
 from ..denovo.dataloaders import DeNovoDataModule
 from ..denovo.model import Spec2Pep, DbSpec2Pep
 
@@ -79,13 +79,20 @@ def __exit__(self, exc_type, exc_value, traceback):
         if self.writer is not None:
             self.writer.save()
 
-    def db_search(self, peak_path: Iterable[str], output: str) -> None:
+    def db_search(
+        self,
+        peak_path: Iterable[str],
+        fasta_path: str,
+        output: str,
+    ) -> None:
         """Perform database search with Casanovo.
 
         Parameters
         ----------
-        peak_path : iterable of str
-            The path to the annotated .mgf data files for database search.
+        peak_path : Iterable[str]
+            The paths to the .mgf data files for database search.
+        fasta_path : str
+            The path to the FASTA file for database search.
         output : str
             Where should the output be saved?
 
@@ -93,23 +100,36 @@ def db_search(self, peak_path: Iterable[str], output: str) -> None:
         -------
         self
         """
-        self.writer = ms_io.MztabWriter(
-            Path(output).with_suffix(".mztab"), is_db_variant=True
-        )
+        self.writer = ms_io.MztabWriter(Path(output).with_suffix(".mztab"))
         self.writer.set_metadata(
             self.config,
             model=str(self.model_filename),
             config_filename=self.config.file,
         )
-
         self.initialize_trainer(train=True)
         self.initialize_model(train=False, db_search=True)
         self.model.out_writer = self.writer
-
-        test_index = self._get_index(peak_path, True, "db search")
+        self.model.psm_batch_size = self.config.predict_batch_size
+        self.model.protein_database = db_utils.ProteinDatabase(
+            fasta_path,
+            self.config.enzyme,
+            self.config.digestion,
+            self.config.missed_cleavages,
+            self.config.min_peptide_len,
+            self.config.max_peptide_len,
+            self.config.max_mods,
+            self.config.precursor_mass_tol,
+            self.config.isotope_error_range,
+            self.config.allowed_fixed_mods,
+            self.config.allowed_var_mods,
+            self.config.residues,
+        )
+        test_index = self._get_index(peak_path, False, "db search")
         self.writer.set_ms_run(test_index.ms_files)
+
         self.initialize_data_module(test_index=test_index)
-        self.loaders.setup(stage="db")
+        self.loaders.protein_database = self.model.protein_database
+        self.loaders.setup(stage="test", annotated=False)
         self.trainer.predict(self.model, self.loaders.db_dataloader())
 
     def train(
@@ -251,7 +271,7 @@ def initialize_model(
             n_layers=self.config.n_layers,
             dropout=self.config.dropout,
             dim_intensity=self.config.dim_intensity,
-            max_length=self.config.max_length,
+            max_peptide_len=self.config.max_peptide_len,
             residues=self.config.residues,
             max_charge=self.config.max_charge,
             precursor_mass_tol=self.config.precursor_mass_tol,
@@ -272,7 +292,7 @@ def initialize_model(
 
         # Reconfigurable non-architecture related parameters for a loaded model.
         loaded_model_params = dict(
-            max_length=self.config.max_length,
+            max_peptide_len=self.config.max_peptide_len,
             precursor_mass_tol=self.config.precursor_mass_tol,
             isotope_error_range=self.config.isotope_error_range,
             n_beams=self.config.n_beams,
@@ -291,12 +311,12 @@ def initialize_model(
 
         if self.model_filename is None:
             # Train a model from scratch if no model file is provided.
+            if db_search:
+                logger.error("DB search mode requires a model file")
+                raise ValueError(
+                    "A model file must be provided for DB search mode"
+                )
             if train:
-                if db_search:
-                    logger.error("Db search mode requires a model file.")
-                    raise ValueError(
-                        "A model file must be provided for DB search mode"
-                    )
                 self.model = Spec2Pep(**model_params)
                 return
             # Else we're not training, so a model file must be provided.
diff --git a/docs/images/configure-help.svg b/docs/images/configure-help.svg
index 0822927a..b1fcce10 100644
--- a/docs/images/configure-help.svg
+++ b/docs/images/configure-help.svg
@@ -19,57 +19,63 @@
         font-weight: 700;
     }
 
-    .terminal-3936755216-matrix {
+    .terminal-2766440694-matrix {
         font-family: Fira Code, monospace;
         font-size: 20px;
         line-height: 24.4px;
         font-variant-east-asian: full-width;
     }
 
-    .terminal-3936755216-title {
+    .terminal-2766440694-title {
         font-size: 18px;
         font-weight: bold;
         font-family: arial;
     }
 
-    .terminal-3936755216-r1 { fill: #c5c8c6 }
+    .terminal-2766440694-r1 { fill: #c5c8c6 }
+.terminal-2766440694-r2 { fill: #d0b344 }
+.terminal-2766440694-r3 { fill: #c5c8c6;font-weight: bold }
+.terminal-2766440694-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-2766440694-r5 { fill: #868887 }
+.terminal-2766440694-r6 { fill: #98a84b;font-weight: bold }
+.terminal-2766440694-r7 { fill: #d0b344;font-weight: bold }
     </style>
 
     <defs>
-    <clipPath id="terminal-3936755216-clip-terminal">
+    <clipPath id="terminal-2766440694-clip-terminal">
       <rect x="0" y="0" width="975.0" height="291.79999999999995" />
     </clipPath>
-    <clipPath id="terminal-3936755216-line-0">
+    <clipPath id="terminal-2766440694-line-0">
     <rect x="0" y="1.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3936755216-line-1">
+<clipPath id="terminal-2766440694-line-1">
     <rect x="0" y="25.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3936755216-line-2">
+<clipPath id="terminal-2766440694-line-2">
     <rect x="0" y="50.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3936755216-line-3">
+<clipPath id="terminal-2766440694-line-3">
     <rect x="0" y="74.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3936755216-line-4">
+<clipPath id="terminal-2766440694-line-4">
     <rect x="0" y="99.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3936755216-line-5">
+<clipPath id="terminal-2766440694-line-5">
     <rect x="0" y="123.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3936755216-line-6">
+<clipPath id="terminal-2766440694-line-6">
     <rect x="0" y="147.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3936755216-line-7">
+<clipPath id="terminal-2766440694-line-7">
     <rect x="0" y="172.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3936755216-line-8">
+<clipPath id="terminal-2766440694-line-8">
     <rect x="0" y="196.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3936755216-line-9">
+<clipPath id="terminal-2766440694-line-9">
     <rect x="0" y="221.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-3936755216-line-10">
+<clipPath id="terminal-2766440694-line-10">
     <rect x="0" y="245.5" width="976" height="24.65"/>
             </clipPath>
     </defs>
@@ -81,21 +87,21 @@
             <circle cx="44" cy="0" r="7" fill="#28c840"/>
             </g>
         
-    <g transform="translate(9, 41)" clip-path="url(#terminal-3936755216-clip-terminal)">
+    <g transform="translate(9, 41)" clip-path="url(#terminal-2766440694-clip-terminal)">
     
-    <g class="terminal-3936755216-matrix">
-    <text class="terminal-3936755216-r1" x="0" y="20" textLength="329.4" clip-path="url(#terminal-3936755216-line-0)">$&#160;casanovo&#160;configure&#160;--help</text><text class="terminal-3936755216-r1" x="976" y="20" textLength="12.2" clip-path="url(#terminal-3936755216-line-0)">
-</text><text class="terminal-3936755216-r1" x="976" y="44.4" textLength="12.2" clip-path="url(#terminal-3936755216-line-1)">
-</text><text class="terminal-3936755216-r1" x="0" y="68.8" textLength="976" clip-path="url(#terminal-3936755216-line-2)">&#160;Usage:&#160;casanovo&#160;configure&#160;[OPTIONS]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3936755216-r1" x="976" y="68.8" textLength="12.2" clip-path="url(#terminal-3936755216-line-2)">
-</text><text class="terminal-3936755216-r1" x="976" y="93.2" textLength="12.2" clip-path="url(#terminal-3936755216-line-3)">
-</text><text class="terminal-3936755216-r1" x="0" y="117.6" textLength="976" clip-path="url(#terminal-3936755216-line-4)">&#160;Generate&#160;a&#160;Casanovo&#160;configuration&#160;file&#160;to&#160;customize.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3936755216-r1" x="976" y="117.6" textLength="12.2" clip-path="url(#terminal-3936755216-line-4)">
-</text><text class="terminal-3936755216-r1" x="0" y="142" textLength="976" clip-path="url(#terminal-3936755216-line-5)">&#160;The&#160;casanovo&#160;configuration&#160;file&#160;is&#160;in&#160;the&#160;YAML&#160;format.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3936755216-r1" x="976" y="142" textLength="12.2" clip-path="url(#terminal-3936755216-line-5)">
-</text><text class="terminal-3936755216-r1" x="976" y="166.4" textLength="12.2" clip-path="url(#terminal-3936755216-line-6)">
-</text><text class="terminal-3936755216-r1" x="0" y="190.8" textLength="976" clip-path="url(#terminal-3936755216-line-7)">╭─&#160;Options&#160;────────────────────────────────────────────────────────────────────╮</text><text class="terminal-3936755216-r1" x="976" y="190.8" textLength="12.2" clip-path="url(#terminal-3936755216-line-7)">
-</text><text class="terminal-3936755216-r1" x="0" y="215.2" textLength="976" clip-path="url(#terminal-3936755216-line-8)">│&#160;--output&#160;&#160;-o&#160;&#160;FILE&#160;&#160;The&#160;output&#160;configuration&#160;file.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-3936755216-r1" x="976" y="215.2" textLength="12.2" clip-path="url(#terminal-3936755216-line-8)">
-</text><text class="terminal-3936755216-r1" x="0" y="239.6" textLength="976" clip-path="url(#terminal-3936755216-line-9)">│&#160;--help&#160;&#160;&#160;&#160;-h&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Show&#160;this&#160;message&#160;and&#160;exit.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-3936755216-r1" x="976" y="239.6" textLength="12.2" clip-path="url(#terminal-3936755216-line-9)">
-</text><text class="terminal-3936755216-r1" x="0" y="264" textLength="976" clip-path="url(#terminal-3936755216-line-10)">╰──────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3936755216-r1" x="976" y="264" textLength="12.2" clip-path="url(#terminal-3936755216-line-10)">
-</text><text class="terminal-3936755216-r1" x="976" y="288.4" textLength="12.2" clip-path="url(#terminal-3936755216-line-11)">
+    <g class="terminal-2766440694-matrix">
+    <text class="terminal-2766440694-r1" x="0" y="20" textLength="329.4" clip-path="url(#terminal-2766440694-line-0)">$&#160;casanovo&#160;configure&#160;--help</text><text class="terminal-2766440694-r1" x="976" y="20" textLength="12.2" clip-path="url(#terminal-2766440694-line-0)">
+</text><text class="terminal-2766440694-r1" x="976" y="44.4" textLength="12.2" clip-path="url(#terminal-2766440694-line-1)">
+</text><text class="terminal-2766440694-r2" x="12.2" y="68.8" textLength="73.2" clip-path="url(#terminal-2766440694-line-2)">Usage:</text><text class="terminal-2766440694-r3" x="97.6" y="68.8" textLength="219.6" clip-path="url(#terminal-2766440694-line-2)">casanovo&#160;configure</text><text class="terminal-2766440694-r1" x="317.2" y="68.8" textLength="24.4" clip-path="url(#terminal-2766440694-line-2)">&#160;[</text><text class="terminal-2766440694-r4" x="341.6" y="68.8" textLength="85.4" clip-path="url(#terminal-2766440694-line-2)">OPTIONS</text><text class="terminal-2766440694-r1" x="427" y="68.8" textLength="549" clip-path="url(#terminal-2766440694-line-2)">]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2766440694-r1" x="976" y="68.8" textLength="12.2" clip-path="url(#terminal-2766440694-line-2)">
+</text><text class="terminal-2766440694-r1" x="976" y="93.2" textLength="12.2" clip-path="url(#terminal-2766440694-line-3)">
+</text><text class="terminal-2766440694-r1" x="0" y="117.6" textLength="976" clip-path="url(#terminal-2766440694-line-4)">&#160;Generate&#160;a&#160;Casanovo&#160;configuration&#160;file&#160;to&#160;customize.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2766440694-r1" x="976" y="117.6" textLength="12.2" clip-path="url(#terminal-2766440694-line-4)">
+</text><text class="terminal-2766440694-r1" x="0" y="142" textLength="976" clip-path="url(#terminal-2766440694-line-5)">&#160;The&#160;casanovo&#160;configuration&#160;file&#160;is&#160;in&#160;the&#160;YAML&#160;format.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2766440694-r1" x="976" y="142" textLength="12.2" clip-path="url(#terminal-2766440694-line-5)">
+</text><text class="terminal-2766440694-r1" x="976" y="166.4" textLength="12.2" clip-path="url(#terminal-2766440694-line-6)">
+</text><text class="terminal-2766440694-r5" x="0" y="190.8" textLength="24.4" clip-path="url(#terminal-2766440694-line-7)">╭─</text><text class="terminal-2766440694-r5" x="24.4" y="190.8" textLength="109.8" clip-path="url(#terminal-2766440694-line-7)">&#160;Options&#160;</text><text class="terminal-2766440694-r5" x="134.2" y="190.8" textLength="817.4" clip-path="url(#terminal-2766440694-line-7)">───────────────────────────────────────────────────────────────────</text><text class="terminal-2766440694-r5" x="951.6" y="190.8" textLength="24.4" clip-path="url(#terminal-2766440694-line-7)">─╮</text><text class="terminal-2766440694-r1" x="976" y="190.8" textLength="12.2" clip-path="url(#terminal-2766440694-line-7)">
+</text><text class="terminal-2766440694-r5" x="0" y="215.2" textLength="12.2" clip-path="url(#terminal-2766440694-line-8)">│</text><text class="terminal-2766440694-r4" x="24.4" y="215.2" textLength="97.6" clip-path="url(#terminal-2766440694-line-8)">--output</text><text class="terminal-2766440694-r6" x="146.4" y="215.2" textLength="24.4" clip-path="url(#terminal-2766440694-line-8)">-o</text><text class="terminal-2766440694-r7" x="195.2" y="215.2" textLength="48.8" clip-path="url(#terminal-2766440694-line-8)">FILE</text><text class="terminal-2766440694-r1" x="244" y="215.2" textLength="719.8" clip-path="url(#terminal-2766440694-line-8)">&#160;&#160;The&#160;output&#160;configuration&#160;file.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2766440694-r5" x="963.8" y="215.2" textLength="12.2" clip-path="url(#terminal-2766440694-line-8)">│</text><text class="terminal-2766440694-r1" x="976" y="215.2" textLength="12.2" clip-path="url(#terminal-2766440694-line-8)">
+</text><text class="terminal-2766440694-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-2766440694-line-9)">│</text><text class="terminal-2766440694-r4" x="24.4" y="239.6" textLength="73.2" clip-path="url(#terminal-2766440694-line-9)">--help</text><text class="terminal-2766440694-r6" x="146.4" y="239.6" textLength="24.4" clip-path="url(#terminal-2766440694-line-9)">-h</text><text class="terminal-2766440694-r1" x="244" y="239.6" textLength="719.8" clip-path="url(#terminal-2766440694-line-9)">&#160;&#160;Show&#160;this&#160;message&#160;and&#160;exit.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2766440694-r5" x="963.8" y="239.6" textLength="12.2" clip-path="url(#terminal-2766440694-line-9)">│</text><text class="terminal-2766440694-r1" x="976" y="239.6" textLength="12.2" clip-path="url(#terminal-2766440694-line-9)">
+</text><text class="terminal-2766440694-r5" x="0" y="264" textLength="976" clip-path="url(#terminal-2766440694-line-10)">╰──────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2766440694-r1" x="976" y="264" textLength="12.2" clip-path="url(#terminal-2766440694-line-10)">
+</text><text class="terminal-2766440694-r1" x="976" y="288.4" textLength="12.2" clip-path="url(#terminal-2766440694-line-11)">
 </text>
     </g>
     </g>
diff --git a/docs/images/evaluate-help.svg b/docs/images/evaluate-help.svg
index b16c4ffd..2f770e2e 100644
--- a/docs/images/evaluate-help.svg
+++ b/docs/images/evaluate-help.svg
@@ -19,99 +19,108 @@
         font-weight: 700;
     }
 
-    .terminal-1284026435-matrix {
+    .terminal-2215953096-matrix {
         font-family: Fira Code, monospace;
         font-size: 20px;
         line-height: 24.4px;
         font-variant-east-asian: full-width;
     }
 
-    .terminal-1284026435-title {
+    .terminal-2215953096-title {
         font-size: 18px;
         font-weight: bold;
         font-family: arial;
     }
 
-    .terminal-1284026435-r1 { fill: #c5c8c6 }
+    .terminal-2215953096-r1 { fill: #c5c8c6 }
+.terminal-2215953096-r2 { fill: #d0b344 }
+.terminal-2215953096-r3 { fill: #c5c8c6;font-weight: bold }
+.terminal-2215953096-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-2215953096-r5 { fill: #868887 }
+.terminal-2215953096-r6 { fill: #cc555a }
+.terminal-2215953096-r7 { fill: #d0b344;font-weight: bold }
+.terminal-2215953096-r8 { fill: #8a4346 }
+.terminal-2215953096-r9 { fill: #98a84b;font-weight: bold }
+.terminal-2215953096-r10 { fill: #8d7b39;font-weight: bold }
     </style>
 
     <defs>
-    <clipPath id="terminal-1284026435-clip-terminal">
+    <clipPath id="terminal-2215953096-clip-terminal">
       <rect x="0" y="0" width="975.0" height="633.4" />
     </clipPath>
-    <clipPath id="terminal-1284026435-line-0">
+    <clipPath id="terminal-2215953096-line-0">
     <rect x="0" y="1.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-1">
+<clipPath id="terminal-2215953096-line-1">
     <rect x="0" y="25.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-2">
+<clipPath id="terminal-2215953096-line-2">
     <rect x="0" y="50.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-3">
+<clipPath id="terminal-2215953096-line-3">
     <rect x="0" y="74.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-4">
+<clipPath id="terminal-2215953096-line-4">
     <rect x="0" y="99.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-5">
+<clipPath id="terminal-2215953096-line-5">
     <rect x="0" y="123.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-6">
+<clipPath id="terminal-2215953096-line-6">
     <rect x="0" y="147.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-7">
+<clipPath id="terminal-2215953096-line-7">
     <rect x="0" y="172.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-8">
+<clipPath id="terminal-2215953096-line-8">
     <rect x="0" y="196.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-9">
+<clipPath id="terminal-2215953096-line-9">
     <rect x="0" y="221.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-10">
+<clipPath id="terminal-2215953096-line-10">
     <rect x="0" y="245.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-11">
+<clipPath id="terminal-2215953096-line-11">
     <rect x="0" y="269.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-12">
+<clipPath id="terminal-2215953096-line-12">
     <rect x="0" y="294.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-13">
+<clipPath id="terminal-2215953096-line-13">
     <rect x="0" y="318.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-14">
+<clipPath id="terminal-2215953096-line-14">
     <rect x="0" y="343.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-15">
+<clipPath id="terminal-2215953096-line-15">
     <rect x="0" y="367.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-16">
+<clipPath id="terminal-2215953096-line-16">
     <rect x="0" y="391.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-17">
+<clipPath id="terminal-2215953096-line-17">
     <rect x="0" y="416.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-18">
+<clipPath id="terminal-2215953096-line-18">
     <rect x="0" y="440.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-19">
+<clipPath id="terminal-2215953096-line-19">
     <rect x="0" y="465.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-20">
+<clipPath id="terminal-2215953096-line-20">
     <rect x="0" y="489.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-21">
+<clipPath id="terminal-2215953096-line-21">
     <rect x="0" y="513.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-22">
+<clipPath id="terminal-2215953096-line-22">
     <rect x="0" y="538.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-23">
+<clipPath id="terminal-2215953096-line-23">
     <rect x="0" y="562.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-1284026435-line-24">
+<clipPath id="terminal-2215953096-line-24">
     <rect x="0" y="587.1" width="976" height="24.65"/>
             </clipPath>
     </defs>
@@ -123,35 +132,35 @@
             <circle cx="44" cy="0" r="7" fill="#28c840"/>
             </g>
         
-    <g transform="translate(9, 41)" clip-path="url(#terminal-1284026435-clip-terminal)">
+    <g transform="translate(9, 41)" clip-path="url(#terminal-2215953096-clip-terminal)">
     
-    <g class="terminal-1284026435-matrix">
-    <text class="terminal-1284026435-r1" x="0" y="20" textLength="317.2" clip-path="url(#terminal-1284026435-line-0)">$&#160;casanovo&#160;evaluate&#160;--help</text><text class="terminal-1284026435-r1" x="976" y="20" textLength="12.2" clip-path="url(#terminal-1284026435-line-0)">
-</text><text class="terminal-1284026435-r1" x="976" y="44.4" textLength="12.2" clip-path="url(#terminal-1284026435-line-1)">
-</text><text class="terminal-1284026435-r1" x="0" y="68.8" textLength="976" clip-path="url(#terminal-1284026435-line-2)">&#160;Usage:&#160;casanovo&#160;evaluate&#160;[OPTIONS]&#160;ANNOTATED_PEAK_PATH...&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1284026435-r1" x="976" y="68.8" textLength="12.2" clip-path="url(#terminal-1284026435-line-2)">
-</text><text class="terminal-1284026435-r1" x="976" y="93.2" textLength="12.2" clip-path="url(#terminal-1284026435-line-3)">
-</text><text class="terminal-1284026435-r1" x="0" y="117.6" textLength="976" clip-path="url(#terminal-1284026435-line-4)">&#160;Evaluate&#160;de&#160;novo&#160;peptide&#160;sequencing&#160;performance.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1284026435-r1" x="976" y="117.6" textLength="12.2" clip-path="url(#terminal-1284026435-line-4)">
-</text><text class="terminal-1284026435-r1" x="0" y="142" textLength="976" clip-path="url(#terminal-1284026435-line-5)">&#160;ANNOTATED_PEAK_PATH&#160;must&#160;be&#160;one&#160;or&#160;more&#160;annoated&#160;MGF&#160;files,&#160;such&#160;as&#160;those&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1284026435-r1" x="976" y="142" textLength="12.2" clip-path="url(#terminal-1284026435-line-5)">
-</text><text class="terminal-1284026435-r1" x="0" y="166.4" textLength="976" clip-path="url(#terminal-1284026435-line-6)">&#160;provided&#160;by&#160;MassIVE-KB.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-1284026435-r1" x="976" y="166.4" textLength="12.2" clip-path="url(#terminal-1284026435-line-6)">
-</text><text class="terminal-1284026435-r1" x="976" y="190.8" textLength="12.2" clip-path="url(#terminal-1284026435-line-7)">
-</text><text class="terminal-1284026435-r1" x="0" y="215.2" textLength="976" clip-path="url(#terminal-1284026435-line-8)">╭─&#160;Arguments&#160;──────────────────────────────────────────────────────────────────╮</text><text class="terminal-1284026435-r1" x="976" y="215.2" textLength="12.2" clip-path="url(#terminal-1284026435-line-8)">
-</text><text class="terminal-1284026435-r1" x="0" y="239.6" textLength="976" clip-path="url(#terminal-1284026435-line-9)">│&#160;*&#160;&#160;ANNOTATED_PEAK_PATH&#160;&#160;&#160;&#160;FILE&#160;&#160;[required]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-1284026435-r1" x="976" y="239.6" textLength="12.2" clip-path="url(#terminal-1284026435-line-9)">
-</text><text class="terminal-1284026435-r1" x="0" y="264" textLength="976" clip-path="url(#terminal-1284026435-line-10)">╰──────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1284026435-r1" x="976" y="264" textLength="12.2" clip-path="url(#terminal-1284026435-line-10)">
-</text><text class="terminal-1284026435-r1" x="0" y="288.4" textLength="976" clip-path="url(#terminal-1284026435-line-11)">╭─&#160;Options&#160;────────────────────────────────────────────────────────────────────╮</text><text class="terminal-1284026435-r1" x="976" y="288.4" textLength="12.2" clip-path="url(#terminal-1284026435-line-11)">
-</text><text class="terminal-1284026435-r1" x="0" y="312.8" textLength="976" clip-path="url(#terminal-1284026435-line-12)">│&#160;--model&#160;&#160;&#160;&#160;&#160;&#160;-m&#160;&#160;FILE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;The&#160;model&#160;weights&#160;(.ckpt&#160;file).&#160;│</text><text class="terminal-1284026435-r1" x="976" y="312.8" textLength="12.2" clip-path="url(#terminal-1284026435-line-12)">
-</text><text class="terminal-1284026435-r1" x="0" y="337.2" textLength="976" clip-path="url(#terminal-1284026435-line-13)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If&#160;not&#160;provided,&#160;Casanovo&#160;will&#160;&#160;│</text><text class="terminal-1284026435-r1" x="976" y="337.2" textLength="12.2" clip-path="url(#terminal-1284026435-line-13)">
-</text><text class="terminal-1284026435-r1" x="0" y="361.6" textLength="976" clip-path="url(#terminal-1284026435-line-14)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;try&#160;to&#160;download&#160;the&#160;latest&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-1284026435-r1" x="976" y="361.6" textLength="12.2" clip-path="url(#terminal-1284026435-line-14)">
-</text><text class="terminal-1284026435-r1" x="0" y="386" textLength="976" clip-path="url(#terminal-1284026435-line-15)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;release.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-1284026435-r1" x="976" y="386" textLength="12.2" clip-path="url(#terminal-1284026435-line-15)">
-</text><text class="terminal-1284026435-r1" x="0" y="410.4" textLength="976" clip-path="url(#terminal-1284026435-line-16)">│&#160;--output&#160;&#160;&#160;&#160;&#160;-o&#160;&#160;FILE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;The&#160;mzTab&#160;file&#160;to&#160;which&#160;results&#160;│</text><text class="terminal-1284026435-r1" x="976" y="410.4" textLength="12.2" clip-path="url(#terminal-1284026435-line-16)">
-</text><text class="terminal-1284026435-r1" x="0" y="434.8" textLength="976" clip-path="url(#terminal-1284026435-line-17)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;will&#160;be&#160;written.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-1284026435-r1" x="976" y="434.8" textLength="12.2" clip-path="url(#terminal-1284026435-line-17)">
-</text><text class="terminal-1284026435-r1" x="0" y="459.2" textLength="976" clip-path="url(#terminal-1284026435-line-18)">│&#160;--config&#160;&#160;&#160;&#160;&#160;-c&#160;&#160;FILE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;The&#160;YAML&#160;configuration&#160;file&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-1284026435-r1" x="976" y="459.2" textLength="12.2" clip-path="url(#terminal-1284026435-line-18)">
-</text><text class="terminal-1284026435-r1" x="0" y="483.6" textLength="976" clip-path="url(#terminal-1284026435-line-19)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;overriding&#160;the&#160;default&#160;options.&#160;│</text><text class="terminal-1284026435-r1" x="976" y="483.6" textLength="12.2" clip-path="url(#terminal-1284026435-line-19)">
-</text><text class="terminal-1284026435-r1" x="0" y="508" textLength="976" clip-path="url(#terminal-1284026435-line-20)">│&#160;--verbosity&#160;&#160;-v&#160;&#160;[debug|info|warning|error]&#160;&#160;Set&#160;the&#160;verbosity&#160;of&#160;console&#160;&#160;&#160;&#160;│</text><text class="terminal-1284026435-r1" x="976" y="508" textLength="12.2" clip-path="url(#terminal-1284026435-line-20)">
-</text><text class="terminal-1284026435-r1" x="0" y="532.4" textLength="976" clip-path="url(#terminal-1284026435-line-21)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;logging&#160;messages.&#160;Log&#160;files&#160;are&#160;│</text><text class="terminal-1284026435-r1" x="976" y="532.4" textLength="12.2" clip-path="url(#terminal-1284026435-line-21)">
-</text><text class="terminal-1284026435-r1" x="0" y="556.8" textLength="976" clip-path="url(#terminal-1284026435-line-22)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;always&#160;set&#160;to&#160;&#x27;debug&#x27;.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-1284026435-r1" x="976" y="556.8" textLength="12.2" clip-path="url(#terminal-1284026435-line-22)">
-</text><text class="terminal-1284026435-r1" x="0" y="581.2" textLength="976" clip-path="url(#terminal-1284026435-line-23)">│&#160;--help&#160;&#160;&#160;&#160;&#160;&#160;&#160;-h&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Show&#160;this&#160;message&#160;and&#160;exit.&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-1284026435-r1" x="976" y="581.2" textLength="12.2" clip-path="url(#terminal-1284026435-line-23)">
-</text><text class="terminal-1284026435-r1" x="0" y="605.6" textLength="976" clip-path="url(#terminal-1284026435-line-24)">╰──────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-1284026435-r1" x="976" y="605.6" textLength="12.2" clip-path="url(#terminal-1284026435-line-24)">
-</text><text class="terminal-1284026435-r1" x="976" y="630" textLength="12.2" clip-path="url(#terminal-1284026435-line-25)">
+    <g class="terminal-2215953096-matrix">
+    <text class="terminal-2215953096-r1" x="0" y="20" textLength="317.2" clip-path="url(#terminal-2215953096-line-0)">$&#160;casanovo&#160;evaluate&#160;--help</text><text class="terminal-2215953096-r1" x="976" y="20" textLength="12.2" clip-path="url(#terminal-2215953096-line-0)">
+</text><text class="terminal-2215953096-r1" x="976" y="44.4" textLength="12.2" clip-path="url(#terminal-2215953096-line-1)">
+</text><text class="terminal-2215953096-r2" x="12.2" y="68.8" textLength="73.2" clip-path="url(#terminal-2215953096-line-2)">Usage:</text><text class="terminal-2215953096-r3" x="97.6" y="68.8" textLength="207.4" clip-path="url(#terminal-2215953096-line-2)">casanovo&#160;evaluate</text><text class="terminal-2215953096-r1" x="305" y="68.8" textLength="24.4" clip-path="url(#terminal-2215953096-line-2)">&#160;[</text><text class="terminal-2215953096-r4" x="329.4" y="68.8" textLength="85.4" clip-path="url(#terminal-2215953096-line-2)">OPTIONS</text><text class="terminal-2215953096-r1" x="414.8" y="68.8" textLength="24.4" clip-path="url(#terminal-2215953096-line-2)">]&#160;</text><text class="terminal-2215953096-r4" x="439.2" y="68.8" textLength="231.8" clip-path="url(#terminal-2215953096-line-2)">ANNOTATED_PEAK_PATH</text><text class="terminal-2215953096-r1" x="671" y="68.8" textLength="305" clip-path="url(#terminal-2215953096-line-2)">...&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2215953096-r1" x="976" y="68.8" textLength="12.2" clip-path="url(#terminal-2215953096-line-2)">
+</text><text class="terminal-2215953096-r1" x="976" y="93.2" textLength="12.2" clip-path="url(#terminal-2215953096-line-3)">
+</text><text class="terminal-2215953096-r1" x="0" y="117.6" textLength="976" clip-path="url(#terminal-2215953096-line-4)">&#160;Evaluate&#160;de&#160;novo&#160;peptide&#160;sequencing&#160;performance.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2215953096-r1" x="976" y="117.6" textLength="12.2" clip-path="url(#terminal-2215953096-line-4)">
+</text><text class="terminal-2215953096-r1" x="0" y="142" textLength="976" clip-path="url(#terminal-2215953096-line-5)">&#160;ANNOTATED_PEAK_PATH&#160;must&#160;be&#160;one&#160;or&#160;more&#160;annoated&#160;MGF&#160;files,&#160;such&#160;as&#160;those&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2215953096-r1" x="976" y="142" textLength="12.2" clip-path="url(#terminal-2215953096-line-5)">
+</text><text class="terminal-2215953096-r1" x="0" y="166.4" textLength="976" clip-path="url(#terminal-2215953096-line-6)">&#160;provided&#160;by&#160;MassIVE-KB.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2215953096-r1" x="976" y="166.4" textLength="12.2" clip-path="url(#terminal-2215953096-line-6)">
+</text><text class="terminal-2215953096-r1" x="976" y="190.8" textLength="12.2" clip-path="url(#terminal-2215953096-line-7)">
+</text><text class="terminal-2215953096-r5" x="0" y="215.2" textLength="24.4" clip-path="url(#terminal-2215953096-line-8)">╭─</text><text class="terminal-2215953096-r5" x="24.4" y="215.2" textLength="134.2" clip-path="url(#terminal-2215953096-line-8)">&#160;Arguments&#160;</text><text class="terminal-2215953096-r5" x="158.6" y="215.2" textLength="793" clip-path="url(#terminal-2215953096-line-8)">─────────────────────────────────────────────────────────────────</text><text class="terminal-2215953096-r5" x="951.6" y="215.2" textLength="24.4" clip-path="url(#terminal-2215953096-line-8)">─╮</text><text class="terminal-2215953096-r1" x="976" y="215.2" textLength="12.2" clip-path="url(#terminal-2215953096-line-8)">
+</text><text class="terminal-2215953096-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-2215953096-line-9)">│</text><text class="terminal-2215953096-r6" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-2215953096-line-9)">*</text><text class="terminal-2215953096-r1" x="36.6" y="239.6" textLength="305" clip-path="url(#terminal-2215953096-line-9)">&#160;&#160;ANNOTATED_PEAK_PATH&#160;&#160;&#160;&#160;</text><text class="terminal-2215953096-r7" x="341.6" y="239.6" textLength="48.8" clip-path="url(#terminal-2215953096-line-9)">FILE</text><text class="terminal-2215953096-r8" x="414.8" y="239.6" textLength="122" clip-path="url(#terminal-2215953096-line-9)">[required]</text><text class="terminal-2215953096-r5" x="963.8" y="239.6" textLength="12.2" clip-path="url(#terminal-2215953096-line-9)">│</text><text class="terminal-2215953096-r1" x="976" y="239.6" textLength="12.2" clip-path="url(#terminal-2215953096-line-9)">
+</text><text class="terminal-2215953096-r5" x="0" y="264" textLength="976" clip-path="url(#terminal-2215953096-line-10)">╰──────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2215953096-r1" x="976" y="264" textLength="12.2" clip-path="url(#terminal-2215953096-line-10)">
+</text><text class="terminal-2215953096-r5" x="0" y="288.4" textLength="24.4" clip-path="url(#terminal-2215953096-line-11)">╭─</text><text class="terminal-2215953096-r5" x="24.4" y="288.4" textLength="109.8" clip-path="url(#terminal-2215953096-line-11)">&#160;Options&#160;</text><text class="terminal-2215953096-r5" x="134.2" y="288.4" textLength="817.4" clip-path="url(#terminal-2215953096-line-11)">───────────────────────────────────────────────────────────────────</text><text class="terminal-2215953096-r5" x="951.6" y="288.4" textLength="24.4" clip-path="url(#terminal-2215953096-line-11)">─╮</text><text class="terminal-2215953096-r1" x="976" y="288.4" textLength="12.2" clip-path="url(#terminal-2215953096-line-11)">
+</text><text class="terminal-2215953096-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-2215953096-line-12)">│</text><text class="terminal-2215953096-r4" x="24.4" y="312.8" textLength="85.4" clip-path="url(#terminal-2215953096-line-12)">--model</text><text class="terminal-2215953096-r9" x="183" y="312.8" textLength="24.4" clip-path="url(#terminal-2215953096-line-12)">-m</text><text class="terminal-2215953096-r7" x="231.8" y="312.8" textLength="317.2" clip-path="url(#terminal-2215953096-line-12)">FILE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2215953096-r1" x="549" y="312.8" textLength="414.8" clip-path="url(#terminal-2215953096-line-12)">&#160;&#160;The&#160;model&#160;weights&#160;(.ckpt&#160;file).&#160;</text><text class="terminal-2215953096-r5" x="963.8" y="312.8" textLength="12.2" clip-path="url(#terminal-2215953096-line-12)">│</text><text class="terminal-2215953096-r1" x="976" y="312.8" textLength="12.2" clip-path="url(#terminal-2215953096-line-12)">
+</text><text class="terminal-2215953096-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-2215953096-line-13)">│</text><text class="terminal-2215953096-r1" x="12.2" y="337.2" textLength="951.6" clip-path="url(#terminal-2215953096-line-13)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If&#160;not&#160;provided,&#160;Casanovo&#160;will&#160;&#160;</text><text class="terminal-2215953096-r5" x="963.8" y="337.2" textLength="12.2" clip-path="url(#terminal-2215953096-line-13)">│</text><text class="terminal-2215953096-r1" x="976" y="337.2" textLength="12.2" clip-path="url(#terminal-2215953096-line-13)">
+</text><text class="terminal-2215953096-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-2215953096-line-14)">│</text><text class="terminal-2215953096-r1" x="12.2" y="361.6" textLength="951.6" clip-path="url(#terminal-2215953096-line-14)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;try&#160;to&#160;download&#160;the&#160;latest&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2215953096-r5" x="963.8" y="361.6" textLength="12.2" clip-path="url(#terminal-2215953096-line-14)">│</text><text class="terminal-2215953096-r1" x="976" y="361.6" textLength="12.2" clip-path="url(#terminal-2215953096-line-14)">
+</text><text class="terminal-2215953096-r5" x="0" y="386" textLength="12.2" clip-path="url(#terminal-2215953096-line-15)">│</text><text class="terminal-2215953096-r1" x="12.2" y="386" textLength="951.6" clip-path="url(#terminal-2215953096-line-15)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;release.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2215953096-r5" x="963.8" y="386" textLength="12.2" clip-path="url(#terminal-2215953096-line-15)">│</text><text class="terminal-2215953096-r1" x="976" y="386" textLength="12.2" clip-path="url(#terminal-2215953096-line-15)">
+</text><text class="terminal-2215953096-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-2215953096-line-16)">│</text><text class="terminal-2215953096-r4" x="24.4" y="410.4" textLength="97.6" clip-path="url(#terminal-2215953096-line-16)">--output</text><text class="terminal-2215953096-r9" x="183" y="410.4" textLength="24.4" clip-path="url(#terminal-2215953096-line-16)">-o</text><text class="terminal-2215953096-r7" x="231.8" y="410.4" textLength="317.2" clip-path="url(#terminal-2215953096-line-16)">FILE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2215953096-r1" x="549" y="410.4" textLength="414.8" clip-path="url(#terminal-2215953096-line-16)">&#160;&#160;The&#160;mzTab&#160;file&#160;to&#160;which&#160;results&#160;</text><text class="terminal-2215953096-r5" x="963.8" y="410.4" textLength="12.2" clip-path="url(#terminal-2215953096-line-16)">│</text><text class="terminal-2215953096-r1" x="976" y="410.4" textLength="12.2" clip-path="url(#terminal-2215953096-line-16)">
+</text><text class="terminal-2215953096-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-2215953096-line-17)">│</text><text class="terminal-2215953096-r1" x="12.2" y="434.8" textLength="951.6" clip-path="url(#terminal-2215953096-line-17)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;will&#160;be&#160;written.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2215953096-r5" x="963.8" y="434.8" textLength="12.2" clip-path="url(#terminal-2215953096-line-17)">│</text><text class="terminal-2215953096-r1" x="976" y="434.8" textLength="12.2" clip-path="url(#terminal-2215953096-line-17)">
+</text><text class="terminal-2215953096-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-2215953096-line-18)">│</text><text class="terminal-2215953096-r4" x="24.4" y="459.2" textLength="97.6" clip-path="url(#terminal-2215953096-line-18)">--config</text><text class="terminal-2215953096-r9" x="183" y="459.2" textLength="24.4" clip-path="url(#terminal-2215953096-line-18)">-c</text><text class="terminal-2215953096-r7" x="231.8" y="459.2" textLength="317.2" clip-path="url(#terminal-2215953096-line-18)">FILE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2215953096-r1" x="549" y="459.2" textLength="414.8" clip-path="url(#terminal-2215953096-line-18)">&#160;&#160;The&#160;YAML&#160;configuration&#160;file&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2215953096-r5" x="963.8" y="459.2" textLength="12.2" clip-path="url(#terminal-2215953096-line-18)">│</text><text class="terminal-2215953096-r1" x="976" y="459.2" textLength="12.2" clip-path="url(#terminal-2215953096-line-18)">
+</text><text class="terminal-2215953096-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-2215953096-line-19)">│</text><text class="terminal-2215953096-r1" x="12.2" y="483.6" textLength="951.6" clip-path="url(#terminal-2215953096-line-19)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;overriding&#160;the&#160;default&#160;options.&#160;</text><text class="terminal-2215953096-r5" x="963.8" y="483.6" textLength="12.2" clip-path="url(#terminal-2215953096-line-19)">│</text><text class="terminal-2215953096-r1" x="976" y="483.6" textLength="12.2" clip-path="url(#terminal-2215953096-line-19)">
+</text><text class="terminal-2215953096-r5" x="0" y="508" textLength="12.2" clip-path="url(#terminal-2215953096-line-20)">│</text><text class="terminal-2215953096-r4" x="24.4" y="508" textLength="134.2" clip-path="url(#terminal-2215953096-line-20)">--verbosity</text><text class="terminal-2215953096-r9" x="183" y="508" textLength="24.4" clip-path="url(#terminal-2215953096-line-20)">-v</text><text class="terminal-2215953096-r10" x="231.8" y="508" textLength="12.2" clip-path="url(#terminal-2215953096-line-20)">[</text><text class="terminal-2215953096-r7" x="244" y="508" textLength="61" clip-path="url(#terminal-2215953096-line-20)">debug</text><text class="terminal-2215953096-r10" x="305" y="508" textLength="12.2" clip-path="url(#terminal-2215953096-line-20)">|</text><text class="terminal-2215953096-r7" x="317.2" y="508" textLength="48.8" clip-path="url(#terminal-2215953096-line-20)">info</text><text class="terminal-2215953096-r10" x="366" y="508" textLength="12.2" clip-path="url(#terminal-2215953096-line-20)">|</text><text class="terminal-2215953096-r7" x="378.2" y="508" textLength="85.4" clip-path="url(#terminal-2215953096-line-20)">warning</text><text class="terminal-2215953096-r10" x="463.6" y="508" textLength="12.2" clip-path="url(#terminal-2215953096-line-20)">|</text><text class="terminal-2215953096-r7" x="475.8" y="508" textLength="61" clip-path="url(#terminal-2215953096-line-20)">error</text><text class="terminal-2215953096-r10" x="536.8" y="508" textLength="12.2" clip-path="url(#terminal-2215953096-line-20)">]</text><text class="terminal-2215953096-r1" x="549" y="508" textLength="414.8" clip-path="url(#terminal-2215953096-line-20)">&#160;&#160;Set&#160;the&#160;verbosity&#160;of&#160;console&#160;&#160;&#160;&#160;</text><text class="terminal-2215953096-r5" x="963.8" y="508" textLength="12.2" clip-path="url(#terminal-2215953096-line-20)">│</text><text class="terminal-2215953096-r1" x="976" y="508" textLength="12.2" clip-path="url(#terminal-2215953096-line-20)">
+</text><text class="terminal-2215953096-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-2215953096-line-21)">│</text><text class="terminal-2215953096-r1" x="12.2" y="532.4" textLength="951.6" clip-path="url(#terminal-2215953096-line-21)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;logging&#160;messages.&#160;Log&#160;files&#160;are&#160;</text><text class="terminal-2215953096-r5" x="963.8" y="532.4" textLength="12.2" clip-path="url(#terminal-2215953096-line-21)">│</text><text class="terminal-2215953096-r1" x="976" y="532.4" textLength="12.2" clip-path="url(#terminal-2215953096-line-21)">
+</text><text class="terminal-2215953096-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-2215953096-line-22)">│</text><text class="terminal-2215953096-r1" x="12.2" y="556.8" textLength="951.6" clip-path="url(#terminal-2215953096-line-22)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;always&#160;set&#160;to&#160;&#x27;debug&#x27;.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2215953096-r5" x="963.8" y="556.8" textLength="12.2" clip-path="url(#terminal-2215953096-line-22)">│</text><text class="terminal-2215953096-r1" x="976" y="556.8" textLength="12.2" clip-path="url(#terminal-2215953096-line-22)">
+</text><text class="terminal-2215953096-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-2215953096-line-23)">│</text><text class="terminal-2215953096-r4" x="24.4" y="581.2" textLength="73.2" clip-path="url(#terminal-2215953096-line-23)">--help</text><text class="terminal-2215953096-r9" x="183" y="581.2" textLength="24.4" clip-path="url(#terminal-2215953096-line-23)">-h</text><text class="terminal-2215953096-r1" x="549" y="581.2" textLength="414.8" clip-path="url(#terminal-2215953096-line-23)">&#160;&#160;Show&#160;this&#160;message&#160;and&#160;exit.&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2215953096-r5" x="963.8" y="581.2" textLength="12.2" clip-path="url(#terminal-2215953096-line-23)">│</text><text class="terminal-2215953096-r1" x="976" y="581.2" textLength="12.2" clip-path="url(#terminal-2215953096-line-23)">
+</text><text class="terminal-2215953096-r5" x="0" y="605.6" textLength="976" clip-path="url(#terminal-2215953096-line-24)">╰──────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2215953096-r1" x="976" y="605.6" textLength="12.2" clip-path="url(#terminal-2215953096-line-24)">
+</text><text class="terminal-2215953096-r1" x="976" y="630" textLength="12.2" clip-path="url(#terminal-2215953096-line-25)">
 </text>
     </g>
     </g>
diff --git a/docs/images/help.svg b/docs/images/help.svg
index 67dca83e..6243538a 100644
--- a/docs/images/help.svg
+++ b/docs/images/help.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 994 977.1999999999999" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 994 928.4" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -19,187 +19,186 @@
         font-weight: 700;
     }
 
-    .terminal-2658734560-matrix {
+    .terminal-3065326850-matrix {
         font-family: Fira Code, monospace;
         font-size: 20px;
         line-height: 24.4px;
         font-variant-east-asian: full-width;
     }
 
-    .terminal-2658734560-title {
+    .terminal-3065326850-title {
         font-size: 18px;
         font-weight: bold;
         font-family: arial;
     }
 
-    .terminal-2658734560-r1 { fill: #c5c8c6 }
+    .terminal-3065326850-r1 { fill: #c5c8c6 }
+.terminal-3065326850-r2 { fill: #d0b344 }
+.terminal-3065326850-r3 { fill: #c5c8c6;font-weight: bold }
+.terminal-3065326850-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-3065326850-r5 { fill: #d0b344;font-weight: bold }
+.terminal-3065326850-r6 { fill: #608ab1;text-decoration: underline; }
+.terminal-3065326850-r7 { fill: #868887 }
+.terminal-3065326850-r8 { fill: #98a84b;font-weight: bold }
     </style>
 
     <defs>
-    <clipPath id="terminal-2658734560-clip-terminal">
-      <rect x="0" y="0" width="975.0" height="926.1999999999999" />
+    <clipPath id="terminal-3065326850-clip-terminal">
+      <rect x="0" y="0" width="975.0" height="877.4" />
     </clipPath>
-    <clipPath id="terminal-2658734560-line-0">
+    <clipPath id="terminal-3065326850-line-0">
     <rect x="0" y="1.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-1">
+<clipPath id="terminal-3065326850-line-1">
     <rect x="0" y="25.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-2">
+<clipPath id="terminal-3065326850-line-2">
     <rect x="0" y="50.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-3">
+<clipPath id="terminal-3065326850-line-3">
     <rect x="0" y="74.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-4">
+<clipPath id="terminal-3065326850-line-4">
     <rect x="0" y="99.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-5">
+<clipPath id="terminal-3065326850-line-5">
     <rect x="0" y="123.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-6">
+<clipPath id="terminal-3065326850-line-6">
     <rect x="0" y="147.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-7">
+<clipPath id="terminal-3065326850-line-7">
     <rect x="0" y="172.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-8">
+<clipPath id="terminal-3065326850-line-8">
     <rect x="0" y="196.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-9">
+<clipPath id="terminal-3065326850-line-9">
     <rect x="0" y="221.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-10">
+<clipPath id="terminal-3065326850-line-10">
     <rect x="0" y="245.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-11">
+<clipPath id="terminal-3065326850-line-11">
     <rect x="0" y="269.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-12">
+<clipPath id="terminal-3065326850-line-12">
     <rect x="0" y="294.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-13">
+<clipPath id="terminal-3065326850-line-13">
     <rect x="0" y="318.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-14">
+<clipPath id="terminal-3065326850-line-14">
     <rect x="0" y="343.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-15">
+<clipPath id="terminal-3065326850-line-15">
     <rect x="0" y="367.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-16">
+<clipPath id="terminal-3065326850-line-16">
     <rect x="0" y="391.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-17">
+<clipPath id="terminal-3065326850-line-17">
     <rect x="0" y="416.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-18">
+<clipPath id="terminal-3065326850-line-18">
     <rect x="0" y="440.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-19">
+<clipPath id="terminal-3065326850-line-19">
     <rect x="0" y="465.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-20">
+<clipPath id="terminal-3065326850-line-20">
     <rect x="0" y="489.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-21">
+<clipPath id="terminal-3065326850-line-21">
     <rect x="0" y="513.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-22">
+<clipPath id="terminal-3065326850-line-22">
     <rect x="0" y="538.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-23">
+<clipPath id="terminal-3065326850-line-23">
     <rect x="0" y="562.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-24">
+<clipPath id="terminal-3065326850-line-24">
     <rect x="0" y="587.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-25">
+<clipPath id="terminal-3065326850-line-25">
     <rect x="0" y="611.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-26">
+<clipPath id="terminal-3065326850-line-26">
     <rect x="0" y="635.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-27">
+<clipPath id="terminal-3065326850-line-27">
     <rect x="0" y="660.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-28">
+<clipPath id="terminal-3065326850-line-28">
     <rect x="0" y="684.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-29">
+<clipPath id="terminal-3065326850-line-29">
     <rect x="0" y="709.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-30">
+<clipPath id="terminal-3065326850-line-30">
     <rect x="0" y="733.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-31">
+<clipPath id="terminal-3065326850-line-31">
     <rect x="0" y="757.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-32">
+<clipPath id="terminal-3065326850-line-32">
     <rect x="0" y="782.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-33">
+<clipPath id="terminal-3065326850-line-33">
     <rect x="0" y="806.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-34">
+<clipPath id="terminal-3065326850-line-34">
     <rect x="0" y="831.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2658734560-line-35">
-    <rect x="0" y="855.5" width="976" height="24.65"/>
-            </clipPath>
-<clipPath id="terminal-2658734560-line-36">
-    <rect x="0" y="879.9" width="976" height="24.65"/>
-            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="992" height="975.2" rx="8"/>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="992" height="926.4" rx="8"/>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
             <circle cx="44" cy="0" r="7" fill="#28c840"/>
             </g>
         
-    <g transform="translate(9, 41)" clip-path="url(#terminal-2658734560-clip-terminal)">
+    <g transform="translate(9, 41)" clip-path="url(#terminal-3065326850-clip-terminal)">
     
-    <g class="terminal-2658734560-matrix">
-    <text class="terminal-2658734560-r1" x="0" y="20" textLength="207.4" clip-path="url(#terminal-2658734560-line-0)">$&#160;casanovo&#160;--help</text><text class="terminal-2658734560-r1" x="976" y="20" textLength="12.2" clip-path="url(#terminal-2658734560-line-0)">
-</text><text class="terminal-2658734560-r1" x="976" y="44.4" textLength="12.2" clip-path="url(#terminal-2658734560-line-1)">
-</text><text class="terminal-2658734560-r1" x="0" y="68.8" textLength="976" clip-path="url(#terminal-2658734560-line-2)">&#160;Usage:&#160;casanovo&#160;[OPTIONS]&#160;COMMAND&#160;[ARGS]...&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2658734560-r1" x="976" y="68.8" textLength="12.2" clip-path="url(#terminal-2658734560-line-2)">
-</text><text class="terminal-2658734560-r1" x="976" y="93.2" textLength="12.2" clip-path="url(#terminal-2658734560-line-3)">
-</text><text class="terminal-2658734560-r1" x="0" y="117.6" textLength="976" clip-path="url(#terminal-2658734560-line-4)">&#160;┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓&#160;</text><text class="terminal-2658734560-r1" x="976" y="117.6" textLength="12.2" clip-path="url(#terminal-2658734560-line-4)">
-</text><text class="terminal-2658734560-r1" x="0" y="142" textLength="976" clip-path="url(#terminal-2658734560-line-5)">&#160;┃&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Casanovo&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;┃&#160;</text><text class="terminal-2658734560-r1" x="976" y="142" textLength="12.2" clip-path="url(#terminal-2658734560-line-5)">
-</text><text class="terminal-2658734560-r1" x="0" y="166.4" textLength="976" clip-path="url(#terminal-2658734560-line-6)">&#160;┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛&#160;</text><text class="terminal-2658734560-r1" x="976" y="166.4" textLength="12.2" clip-path="url(#terminal-2658734560-line-6)">
-</text><text class="terminal-2658734560-r1" x="0" y="190.8" textLength="976" clip-path="url(#terminal-2658734560-line-7)">&#160;Casanovo&#160;de&#160;novo&#160;sequences&#160;peptides&#160;from&#160;tandem&#160;mass&#160;spectra&#160;using&#160;a&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2658734560-r1" x="976" y="190.8" textLength="12.2" clip-path="url(#terminal-2658734560-line-7)">
-</text><text class="terminal-2658734560-r1" x="0" y="215.2" textLength="976" clip-path="url(#terminal-2658734560-line-8)">&#160;Transformer&#160;model.&#160;Casanovo&#160;currently&#160;supports&#160;mzML,&#160;mzXML,&#160;and&#160;MGF&#160;files&#160;for&#160;&#160;</text><text class="terminal-2658734560-r1" x="976" y="215.2" textLength="12.2" clip-path="url(#terminal-2658734560-line-8)">
-</text><text class="terminal-2658734560-r1" x="0" y="239.6" textLength="976" clip-path="url(#terminal-2658734560-line-9)">&#160;de&#160;novo&#160;sequencing&#160;and&#160;annotated&#160;MGF&#160;files,&#160;such&#160;as&#160;those&#160;from&#160;MassIVE-KB,&#160;for&#160;</text><text class="terminal-2658734560-r1" x="976" y="239.6" textLength="12.2" clip-path="url(#terminal-2658734560-line-9)">
-</text><text class="terminal-2658734560-r1" x="0" y="264" textLength="976" clip-path="url(#terminal-2658734560-line-10)">&#160;training&#160;new&#160;models.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2658734560-r1" x="976" y="264" textLength="12.2" clip-path="url(#terminal-2658734560-line-10)">
-</text><text class="terminal-2658734560-r1" x="976" y="288.4" textLength="12.2" clip-path="url(#terminal-2658734560-line-11)">
-</text><text class="terminal-2658734560-r1" x="0" y="312.8" textLength="976" clip-path="url(#terminal-2658734560-line-12)">&#160;Links:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2658734560-r1" x="976" y="312.8" textLength="12.2" clip-path="url(#terminal-2658734560-line-12)">
-</text><text class="terminal-2658734560-r1" x="976" y="337.2" textLength="12.2" clip-path="url(#terminal-2658734560-line-13)">
-</text><text class="terminal-2658734560-r1" x="0" y="361.6" textLength="976" clip-path="url(#terminal-2658734560-line-14)">&#160;&#160;•&#160;Documentation:&#160;https://casanovo.readthedocs.io&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2658734560-r1" x="976" y="361.6" textLength="12.2" clip-path="url(#terminal-2658734560-line-14)">
-</text><text class="terminal-2658734560-r1" x="0" y="386" textLength="976" clip-path="url(#terminal-2658734560-line-15)">&#160;&#160;•&#160;Official&#160;code&#160;repository:&#160;https://github.com/Noble-Lab/casanovo&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2658734560-r1" x="976" y="386" textLength="12.2" clip-path="url(#terminal-2658734560-line-15)">
-</text><text class="terminal-2658734560-r1" x="976" y="410.4" textLength="12.2" clip-path="url(#terminal-2658734560-line-16)">
-</text><text class="terminal-2658734560-r1" x="0" y="434.8" textLength="976" clip-path="url(#terminal-2658734560-line-17)">&#160;If&#160;you&#160;use&#160;Casanovo&#160;in&#160;your&#160;work,&#160;please&#160;cite:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2658734560-r1" x="976" y="434.8" textLength="12.2" clip-path="url(#terminal-2658734560-line-17)">
-</text><text class="terminal-2658734560-r1" x="976" y="459.2" textLength="12.2" clip-path="url(#terminal-2658734560-line-18)">
-</text><text class="terminal-2658734560-r1" x="0" y="483.6" textLength="976" clip-path="url(#terminal-2658734560-line-19)">&#160;&#160;•&#160;Yilmaz,&#160;M.,&#160;Fondrie,&#160;W.&#160;E.,&#160;Bittremieux,&#160;W.,&#160;Oh,&#160;S.&#160;&amp;&#160;Noble,&#160;W.&#160;S.&#160;De&#160;novo&#160;&#160;</text><text class="terminal-2658734560-r1" x="976" y="483.6" textLength="12.2" clip-path="url(#terminal-2658734560-line-19)">
-</text><text class="terminal-2658734560-r1" x="0" y="508" textLength="976" clip-path="url(#terminal-2658734560-line-20)">&#160;&#160;&#160;&#160;mass&#160;spectrometry&#160;peptide&#160;sequencing&#160;with&#160;a&#160;transformer&#160;model.&#160;Proceedings&#160;&#160;</text><text class="terminal-2658734560-r1" x="976" y="508" textLength="12.2" clip-path="url(#terminal-2658734560-line-20)">
-</text><text class="terminal-2658734560-r1" x="0" y="532.4" textLength="976" clip-path="url(#terminal-2658734560-line-21)">&#160;&#160;&#160;&#160;of&#160;the&#160;39th&#160;International&#160;Conference&#160;on&#160;Machine&#160;Learning&#160;-&#160;ICML&#160;&#x27;22&#160;(2022)&#160;&#160;</text><text class="terminal-2658734560-r1" x="976" y="532.4" textLength="12.2" clip-path="url(#terminal-2658734560-line-21)">
-</text><text class="terminal-2658734560-r1" x="0" y="556.8" textLength="976" clip-path="url(#terminal-2658734560-line-22)">&#160;&#160;&#160;&#160;doi:10.1101/2022.02.07.479481.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2658734560-r1" x="976" y="556.8" textLength="12.2" clip-path="url(#terminal-2658734560-line-22)">
-</text><text class="terminal-2658734560-r1" x="976" y="581.2" textLength="12.2" clip-path="url(#terminal-2658734560-line-23)">
-</text><text class="terminal-2658734560-r1" x="0" y="605.6" textLength="976" clip-path="url(#terminal-2658734560-line-24)">╭─&#160;Options&#160;────────────────────────────────────────────────────────────────────╮</text><text class="terminal-2658734560-r1" x="976" y="605.6" textLength="12.2" clip-path="url(#terminal-2658734560-line-24)">
-</text><text class="terminal-2658734560-r1" x="0" y="630" textLength="976" clip-path="url(#terminal-2658734560-line-25)">│&#160;--help&#160;&#160;-h&#160;&#160;&#160;&#160;Show&#160;this&#160;message&#160;and&#160;exit.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2658734560-r1" x="976" y="630" textLength="12.2" clip-path="url(#terminal-2658734560-line-25)">
-</text><text class="terminal-2658734560-r1" x="0" y="654.4" textLength="976" clip-path="url(#terminal-2658734560-line-26)">╰──────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2658734560-r1" x="976" y="654.4" textLength="12.2" clip-path="url(#terminal-2658734560-line-26)">
-</text><text class="terminal-2658734560-r1" x="0" y="678.8" textLength="976" clip-path="url(#terminal-2658734560-line-27)">╭─&#160;Commands&#160;───────────────────────────────────────────────────────────────────╮</text><text class="terminal-2658734560-r1" x="976" y="678.8" textLength="12.2" clip-path="url(#terminal-2658734560-line-27)">
-</text><text class="terminal-2658734560-r1" x="0" y="703.2" textLength="976" clip-path="url(#terminal-2658734560-line-28)">│&#160;annotate&#160;&#160;&#160;Annotate&#160;a&#160;given&#160;.mgf&#160;with&#160;candidates&#160;as&#160;selected&#160;by&#160;a&#160;Tide&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2658734560-r1" x="976" y="703.2" textLength="12.2" clip-path="url(#terminal-2658734560-line-28)">
-</text><text class="terminal-2658734560-r1" x="0" y="727.6" textLength="976" clip-path="url(#terminal-2658734560-line-29)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;search&#160;for&#160;Casanovo-DB.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2658734560-r1" x="976" y="727.6" textLength="12.2" clip-path="url(#terminal-2658734560-line-29)">
-</text><text class="terminal-2658734560-r1" x="0" y="752" textLength="976" clip-path="url(#terminal-2658734560-line-30)">│&#160;configure&#160;&#160;Generate&#160;a&#160;Casanovo&#160;configuration&#160;file&#160;to&#160;customize.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2658734560-r1" x="976" y="752" textLength="12.2" clip-path="url(#terminal-2658734560-line-30)">
-</text><text class="terminal-2658734560-r1" x="0" y="776.4" textLength="976" clip-path="url(#terminal-2658734560-line-31)">│&#160;db-search&#160;&#160;Perform&#160;a&#160;search&#160;using&#160;Casanovo-DB.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2658734560-r1" x="976" y="776.4" textLength="12.2" clip-path="url(#terminal-2658734560-line-31)">
-</text><text class="terminal-2658734560-r1" x="0" y="800.8" textLength="976" clip-path="url(#terminal-2658734560-line-32)">│&#160;evaluate&#160;&#160;&#160;Evaluate&#160;de&#160;novo&#160;peptide&#160;sequencing&#160;performance.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2658734560-r1" x="976" y="800.8" textLength="12.2" clip-path="url(#terminal-2658734560-line-32)">
-</text><text class="terminal-2658734560-r1" x="0" y="825.2" textLength="976" clip-path="url(#terminal-2658734560-line-33)">│&#160;sequence&#160;&#160;&#160;De&#160;novo&#160;sequence&#160;peptides&#160;from&#160;tandem&#160;mass&#160;spectra.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2658734560-r1" x="976" y="825.2" textLength="12.2" clip-path="url(#terminal-2658734560-line-33)">
-</text><text class="terminal-2658734560-r1" x="0" y="849.6" textLength="976" clip-path="url(#terminal-2658734560-line-34)">│&#160;train&#160;&#160;&#160;&#160;&#160;&#160;Train&#160;a&#160;Casanovo&#160;model&#160;on&#160;your&#160;own&#160;data.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2658734560-r1" x="976" y="849.6" textLength="12.2" clip-path="url(#terminal-2658734560-line-34)">
-</text><text class="terminal-2658734560-r1" x="0" y="874" textLength="976" clip-path="url(#terminal-2658734560-line-35)">│&#160;version&#160;&#160;&#160;&#160;Get&#160;the&#160;Casanovo&#160;version&#160;information&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2658734560-r1" x="976" y="874" textLength="12.2" clip-path="url(#terminal-2658734560-line-35)">
-</text><text class="terminal-2658734560-r1" x="0" y="898.4" textLength="976" clip-path="url(#terminal-2658734560-line-36)">╰──────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2658734560-r1" x="976" y="898.4" textLength="12.2" clip-path="url(#terminal-2658734560-line-36)">
-</text><text class="terminal-2658734560-r1" x="976" y="922.8" textLength="12.2" clip-path="url(#terminal-2658734560-line-37)">
+    <g class="terminal-3065326850-matrix">
+    <text class="terminal-3065326850-r1" x="0" y="20" textLength="207.4" clip-path="url(#terminal-3065326850-line-0)">$&#160;casanovo&#160;--help</text><text class="terminal-3065326850-r1" x="976" y="20" textLength="12.2" clip-path="url(#terminal-3065326850-line-0)">
+</text><text class="terminal-3065326850-r1" x="976" y="44.4" textLength="12.2" clip-path="url(#terminal-3065326850-line-1)">
+</text><text class="terminal-3065326850-r2" x="12.2" y="68.8" textLength="73.2" clip-path="url(#terminal-3065326850-line-2)">Usage:</text><text class="terminal-3065326850-r3" x="97.6" y="68.8" textLength="97.6" clip-path="url(#terminal-3065326850-line-2)">casanovo</text><text class="terminal-3065326850-r1" x="195.2" y="68.8" textLength="24.4" clip-path="url(#terminal-3065326850-line-2)">&#160;[</text><text class="terminal-3065326850-r4" x="219.6" y="68.8" textLength="85.4" clip-path="url(#terminal-3065326850-line-2)">OPTIONS</text><text class="terminal-3065326850-r1" x="305" y="68.8" textLength="24.4" clip-path="url(#terminal-3065326850-line-2)">]&#160;</text><text class="terminal-3065326850-r4" x="329.4" y="68.8" textLength="85.4" clip-path="url(#terminal-3065326850-line-2)">COMMAND</text><text class="terminal-3065326850-r1" x="414.8" y="68.8" textLength="24.4" clip-path="url(#terminal-3065326850-line-2)">&#160;[</text><text class="terminal-3065326850-r4" x="439.2" y="68.8" textLength="48.8" clip-path="url(#terminal-3065326850-line-2)">ARGS</text><text class="terminal-3065326850-r1" x="488" y="68.8" textLength="488" clip-path="url(#terminal-3065326850-line-2)">]...&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3065326850-r1" x="976" y="68.8" textLength="12.2" clip-path="url(#terminal-3065326850-line-2)">
+</text><text class="terminal-3065326850-r1" x="976" y="93.2" textLength="12.2" clip-path="url(#terminal-3065326850-line-3)">
+</text><text class="terminal-3065326850-r1" x="0" y="117.6" textLength="976" clip-path="url(#terminal-3065326850-line-4)">&#160;┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓&#160;</text><text class="terminal-3065326850-r1" x="976" y="117.6" textLength="12.2" clip-path="url(#terminal-3065326850-line-4)">
+</text><text class="terminal-3065326850-r1" x="0" y="142" textLength="439.2" clip-path="url(#terminal-3065326850-line-5)">&#160;┃&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3065326850-r3" x="439.2" y="142" textLength="97.6" clip-path="url(#terminal-3065326850-line-5)">Casanovo</text><text class="terminal-3065326850-r1" x="536.8" y="142" textLength="439.2" clip-path="url(#terminal-3065326850-line-5)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;┃&#160;</text><text class="terminal-3065326850-r1" x="976" y="142" textLength="12.2" clip-path="url(#terminal-3065326850-line-5)">
+</text><text class="terminal-3065326850-r1" x="0" y="166.4" textLength="976" clip-path="url(#terminal-3065326850-line-6)">&#160;┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛&#160;</text><text class="terminal-3065326850-r1" x="976" y="166.4" textLength="12.2" clip-path="url(#terminal-3065326850-line-6)">
+</text><text class="terminal-3065326850-r1" x="0" y="190.8" textLength="976" clip-path="url(#terminal-3065326850-line-7)">&#160;Casanovo&#160;de&#160;novo&#160;sequences&#160;peptides&#160;from&#160;tandem&#160;mass&#160;spectra&#160;using&#160;a&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3065326850-r1" x="976" y="190.8" textLength="12.2" clip-path="url(#terminal-3065326850-line-7)">
+</text><text class="terminal-3065326850-r1" x="0" y="215.2" textLength="976" clip-path="url(#terminal-3065326850-line-8)">&#160;Transformer&#160;model.&#160;Casanovo&#160;currently&#160;supports&#160;mzML,&#160;mzXML,&#160;and&#160;MGF&#160;files&#160;for&#160;&#160;</text><text class="terminal-3065326850-r1" x="976" y="215.2" textLength="12.2" clip-path="url(#terminal-3065326850-line-8)">
+</text><text class="terminal-3065326850-r1" x="0" y="239.6" textLength="976" clip-path="url(#terminal-3065326850-line-9)">&#160;de&#160;novo&#160;sequencing&#160;and&#160;annotated&#160;MGF&#160;files,&#160;such&#160;as&#160;those&#160;from&#160;MassIVE-KB,&#160;for&#160;</text><text class="terminal-3065326850-r1" x="976" y="239.6" textLength="12.2" clip-path="url(#terminal-3065326850-line-9)">
+</text><text class="terminal-3065326850-r1" x="0" y="264" textLength="976" clip-path="url(#terminal-3065326850-line-10)">&#160;training&#160;new&#160;models.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3065326850-r1" x="976" y="264" textLength="12.2" clip-path="url(#terminal-3065326850-line-10)">
+</text><text class="terminal-3065326850-r1" x="976" y="288.4" textLength="12.2" clip-path="url(#terminal-3065326850-line-11)">
+</text><text class="terminal-3065326850-r1" x="0" y="312.8" textLength="976" clip-path="url(#terminal-3065326850-line-12)">&#160;Links:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3065326850-r1" x="976" y="312.8" textLength="12.2" clip-path="url(#terminal-3065326850-line-12)">
+</text><text class="terminal-3065326850-r1" x="976" y="337.2" textLength="12.2" clip-path="url(#terminal-3065326850-line-13)">
+</text><text class="terminal-3065326850-r5" x="12.2" y="361.6" textLength="36.6" clip-path="url(#terminal-3065326850-line-14)">&#160;•&#160;</text><text class="terminal-3065326850-r1" x="48.8" y="361.6" textLength="183" clip-path="url(#terminal-3065326850-line-14)">Documentation:&#160;</text><text class="terminal-3065326850-r6" x="231.8" y="361.6" textLength="378.2" clip-path="url(#terminal-3065326850-line-14)">https://casanovo.readthedocs.io</text><text class="terminal-3065326850-r1" x="976" y="361.6" textLength="12.2" clip-path="url(#terminal-3065326850-line-14)">
+</text><text class="terminal-3065326850-r5" x="12.2" y="386" textLength="36.6" clip-path="url(#terminal-3065326850-line-15)">&#160;•&#160;</text><text class="terminal-3065326850-r1" x="48.8" y="386" textLength="317.2" clip-path="url(#terminal-3065326850-line-15)">Official&#160;code&#160;repository:&#160;</text><text class="terminal-3065326850-r6" x="366" y="386" textLength="451.4" clip-path="url(#terminal-3065326850-line-15)">https://github.com/Noble-Lab/casanovo</text><text class="terminal-3065326850-r1" x="976" y="386" textLength="12.2" clip-path="url(#terminal-3065326850-line-15)">
+</text><text class="terminal-3065326850-r1" x="976" y="410.4" textLength="12.2" clip-path="url(#terminal-3065326850-line-16)">
+</text><text class="terminal-3065326850-r1" x="0" y="434.8" textLength="976" clip-path="url(#terminal-3065326850-line-17)">&#160;If&#160;you&#160;use&#160;Casanovo&#160;in&#160;your&#160;work,&#160;please&#160;cite:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3065326850-r1" x="976" y="434.8" textLength="12.2" clip-path="url(#terminal-3065326850-line-17)">
+</text><text class="terminal-3065326850-r1" x="976" y="459.2" textLength="12.2" clip-path="url(#terminal-3065326850-line-18)">
+</text><text class="terminal-3065326850-r5" x="12.2" y="483.6" textLength="36.6" clip-path="url(#terminal-3065326850-line-19)">&#160;•&#160;</text><text class="terminal-3065326850-r1" x="48.8" y="483.6" textLength="927.2" clip-path="url(#terminal-3065326850-line-19)">Yilmaz,&#160;M.,&#160;Fondrie,&#160;W.&#160;E.,&#160;Bittremieux,&#160;W.,&#160;Oh,&#160;S.&#160;&amp;&#160;Noble,&#160;W.&#160;S.&#160;De&#160;novo&#160;&#160;</text><text class="terminal-3065326850-r1" x="976" y="483.6" textLength="12.2" clip-path="url(#terminal-3065326850-line-19)">
+</text><text class="terminal-3065326850-r1" x="48.8" y="508" textLength="927.2" clip-path="url(#terminal-3065326850-line-20)">mass&#160;spectrometry&#160;peptide&#160;sequencing&#160;with&#160;a&#160;transformer&#160;model.&#160;Proceedings&#160;&#160;</text><text class="terminal-3065326850-r1" x="976" y="508" textLength="12.2" clip-path="url(#terminal-3065326850-line-20)">
+</text><text class="terminal-3065326850-r1" x="48.8" y="532.4" textLength="927.2" clip-path="url(#terminal-3065326850-line-21)">of&#160;the&#160;39th&#160;International&#160;Conference&#160;on&#160;Machine&#160;Learning&#160;-&#160;ICML&#160;&#x27;22&#160;(2022)&#160;&#160;</text><text class="terminal-3065326850-r1" x="976" y="532.4" textLength="12.2" clip-path="url(#terminal-3065326850-line-21)">
+</text><text class="terminal-3065326850-r1" x="48.8" y="556.8" textLength="927.2" clip-path="url(#terminal-3065326850-line-22)">doi:10.1101/2022.02.07.479481.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3065326850-r1" x="976" y="556.8" textLength="12.2" clip-path="url(#terminal-3065326850-line-22)">
+</text><text class="terminal-3065326850-r1" x="976" y="581.2" textLength="12.2" clip-path="url(#terminal-3065326850-line-23)">
+</text><text class="terminal-3065326850-r7" x="0" y="605.6" textLength="24.4" clip-path="url(#terminal-3065326850-line-24)">╭─</text><text class="terminal-3065326850-r7" x="24.4" y="605.6" textLength="109.8" clip-path="url(#terminal-3065326850-line-24)">&#160;Options&#160;</text><text class="terminal-3065326850-r7" x="134.2" y="605.6" textLength="817.4" clip-path="url(#terminal-3065326850-line-24)">───────────────────────────────────────────────────────────────────</text><text class="terminal-3065326850-r7" x="951.6" y="605.6" textLength="24.4" clip-path="url(#terminal-3065326850-line-24)">─╮</text><text class="terminal-3065326850-r1" x="976" y="605.6" textLength="12.2" clip-path="url(#terminal-3065326850-line-24)">
+</text><text class="terminal-3065326850-r7" x="0" y="630" textLength="12.2" clip-path="url(#terminal-3065326850-line-25)">│</text><text class="terminal-3065326850-r4" x="24.4" y="630" textLength="73.2" clip-path="url(#terminal-3065326850-line-25)">--help</text><text class="terminal-3065326850-r8" x="122" y="630" textLength="24.4" clip-path="url(#terminal-3065326850-line-25)">-h</text><text class="terminal-3065326850-r1" x="146.4" y="630" textLength="817.4" clip-path="url(#terminal-3065326850-line-25)">&#160;&#160;&#160;&#160;Show&#160;this&#160;message&#160;and&#160;exit.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3065326850-r7" x="963.8" y="630" textLength="12.2" clip-path="url(#terminal-3065326850-line-25)">│</text><text class="terminal-3065326850-r1" x="976" y="630" textLength="12.2" clip-path="url(#terminal-3065326850-line-25)">
+</text><text class="terminal-3065326850-r7" x="0" y="654.4" textLength="976" clip-path="url(#terminal-3065326850-line-26)">╰──────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3065326850-r1" x="976" y="654.4" textLength="12.2" clip-path="url(#terminal-3065326850-line-26)">
+</text><text class="terminal-3065326850-r7" x="0" y="678.8" textLength="24.4" clip-path="url(#terminal-3065326850-line-27)">╭─</text><text class="terminal-3065326850-r7" x="24.4" y="678.8" textLength="122" clip-path="url(#terminal-3065326850-line-27)">&#160;Commands&#160;</text><text class="terminal-3065326850-r7" x="146.4" y="678.8" textLength="805.2" clip-path="url(#terminal-3065326850-line-27)">──────────────────────────────────────────────────────────────────</text><text class="terminal-3065326850-r7" x="951.6" y="678.8" textLength="24.4" clip-path="url(#terminal-3065326850-line-27)">─╮</text><text class="terminal-3065326850-r1" x="976" y="678.8" textLength="12.2" clip-path="url(#terminal-3065326850-line-27)">
+</text><text class="terminal-3065326850-r7" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-3065326850-line-28)">│</text><text class="terminal-3065326850-r4" x="24.4" y="703.2" textLength="109.8" clip-path="url(#terminal-3065326850-line-28)">configure</text><text class="terminal-3065326850-r1" x="146.4" y="703.2" textLength="817.4" clip-path="url(#terminal-3065326850-line-28)">&#160;Generate&#160;a&#160;Casanovo&#160;configuration&#160;file&#160;to&#160;customize.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3065326850-r7" x="963.8" y="703.2" textLength="12.2" clip-path="url(#terminal-3065326850-line-28)">│</text><text class="terminal-3065326850-r1" x="976" y="703.2" textLength="12.2" clip-path="url(#terminal-3065326850-line-28)">
+</text><text class="terminal-3065326850-r7" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-3065326850-line-29)">│</text><text class="terminal-3065326850-r4" x="24.4" y="727.6" textLength="109.8" clip-path="url(#terminal-3065326850-line-29)">db-search</text><text class="terminal-3065326850-r1" x="146.4" y="727.6" textLength="817.4" clip-path="url(#terminal-3065326850-line-29)">&#160;Perform&#160;a&#160;database&#160;search&#160;on&#160;MS/MS&#160;data&#160;using&#160;Casanovo-DB.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3065326850-r7" x="963.8" y="727.6" textLength="12.2" clip-path="url(#terminal-3065326850-line-29)">│</text><text class="terminal-3065326850-r1" x="976" y="727.6" textLength="12.2" clip-path="url(#terminal-3065326850-line-29)">
+</text><text class="terminal-3065326850-r7" x="0" y="752" textLength="12.2" clip-path="url(#terminal-3065326850-line-30)">│</text><text class="terminal-3065326850-r4" x="24.4" y="752" textLength="109.8" clip-path="url(#terminal-3065326850-line-30)">evaluate&#160;</text><text class="terminal-3065326850-r1" x="146.4" y="752" textLength="817.4" clip-path="url(#terminal-3065326850-line-30)">&#160;Evaluate&#160;de&#160;novo&#160;peptide&#160;sequencing&#160;performance.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3065326850-r7" x="963.8" y="752" textLength="12.2" clip-path="url(#terminal-3065326850-line-30)">│</text><text class="terminal-3065326850-r1" x="976" y="752" textLength="12.2" clip-path="url(#terminal-3065326850-line-30)">
+</text><text class="terminal-3065326850-r7" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-3065326850-line-31)">│</text><text class="terminal-3065326850-r4" x="24.4" y="776.4" textLength="109.8" clip-path="url(#terminal-3065326850-line-31)">sequence&#160;</text><text class="terminal-3065326850-r1" x="146.4" y="776.4" textLength="817.4" clip-path="url(#terminal-3065326850-line-31)">&#160;De&#160;novo&#160;sequence&#160;peptides&#160;from&#160;tandem&#160;mass&#160;spectra.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3065326850-r7" x="963.8" y="776.4" textLength="12.2" clip-path="url(#terminal-3065326850-line-31)">│</text><text class="terminal-3065326850-r1" x="976" y="776.4" textLength="12.2" clip-path="url(#terminal-3065326850-line-31)">
+</text><text class="terminal-3065326850-r7" x="0" y="800.8" textLength="12.2" clip-path="url(#terminal-3065326850-line-32)">│</text><text class="terminal-3065326850-r4" x="24.4" y="800.8" textLength="109.8" clip-path="url(#terminal-3065326850-line-32)">train&#160;&#160;&#160;&#160;</text><text class="terminal-3065326850-r1" x="146.4" y="800.8" textLength="817.4" clip-path="url(#terminal-3065326850-line-32)">&#160;Train&#160;a&#160;Casanovo&#160;model&#160;on&#160;your&#160;own&#160;data.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3065326850-r7" x="963.8" y="800.8" textLength="12.2" clip-path="url(#terminal-3065326850-line-32)">│</text><text class="terminal-3065326850-r1" x="976" y="800.8" textLength="12.2" clip-path="url(#terminal-3065326850-line-32)">
+</text><text class="terminal-3065326850-r7" x="0" y="825.2" textLength="12.2" clip-path="url(#terminal-3065326850-line-33)">│</text><text class="terminal-3065326850-r4" x="24.4" y="825.2" textLength="109.8" clip-path="url(#terminal-3065326850-line-33)">version&#160;&#160;</text><text class="terminal-3065326850-r1" x="146.4" y="825.2" textLength="817.4" clip-path="url(#terminal-3065326850-line-33)">&#160;Get&#160;the&#160;Casanovo&#160;version&#160;information&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-3065326850-r7" x="963.8" y="825.2" textLength="12.2" clip-path="url(#terminal-3065326850-line-33)">│</text><text class="terminal-3065326850-r1" x="976" y="825.2" textLength="12.2" clip-path="url(#terminal-3065326850-line-33)">
+</text><text class="terminal-3065326850-r7" x="0" y="849.6" textLength="976" clip-path="url(#terminal-3065326850-line-34)">╰──────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-3065326850-r1" x="976" y="849.6" textLength="12.2" clip-path="url(#terminal-3065326850-line-34)">
+</text><text class="terminal-3065326850-r1" x="976" y="874" textLength="12.2" clip-path="url(#terminal-3065326850-line-35)">
 </text>
     </g>
     </g>
diff --git a/docs/images/sequence-help.svg b/docs/images/sequence-help.svg
index f5799766..7a1bbff6 100644
--- a/docs/images/sequence-help.svg
+++ b/docs/images/sequence-help.svg
@@ -19,99 +19,108 @@
         font-weight: 700;
     }
 
-    .terminal-2359602172-matrix {
+    .terminal-2416557665-matrix {
         font-family: Fira Code, monospace;
         font-size: 20px;
         line-height: 24.4px;
         font-variant-east-asian: full-width;
     }
 
-    .terminal-2359602172-title {
+    .terminal-2416557665-title {
         font-size: 18px;
         font-weight: bold;
         font-family: arial;
     }
 
-    .terminal-2359602172-r1 { fill: #c5c8c6 }
+    .terminal-2416557665-r1 { fill: #c5c8c6 }
+.terminal-2416557665-r2 { fill: #d0b344 }
+.terminal-2416557665-r3 { fill: #c5c8c6;font-weight: bold }
+.terminal-2416557665-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-2416557665-r5 { fill: #868887 }
+.terminal-2416557665-r6 { fill: #cc555a }
+.terminal-2416557665-r7 { fill: #d0b344;font-weight: bold }
+.terminal-2416557665-r8 { fill: #8a4346 }
+.terminal-2416557665-r9 { fill: #98a84b;font-weight: bold }
+.terminal-2416557665-r10 { fill: #8d7b39;font-weight: bold }
     </style>
 
     <defs>
-    <clipPath id="terminal-2359602172-clip-terminal">
+    <clipPath id="terminal-2416557665-clip-terminal">
       <rect x="0" y="0" width="975.0" height="633.4" />
     </clipPath>
-    <clipPath id="terminal-2359602172-line-0">
+    <clipPath id="terminal-2416557665-line-0">
     <rect x="0" y="1.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-1">
+<clipPath id="terminal-2416557665-line-1">
     <rect x="0" y="25.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-2">
+<clipPath id="terminal-2416557665-line-2">
     <rect x="0" y="50.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-3">
+<clipPath id="terminal-2416557665-line-3">
     <rect x="0" y="74.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-4">
+<clipPath id="terminal-2416557665-line-4">
     <rect x="0" y="99.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-5">
+<clipPath id="terminal-2416557665-line-5">
     <rect x="0" y="123.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-6">
+<clipPath id="terminal-2416557665-line-6">
     <rect x="0" y="147.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-7">
+<clipPath id="terminal-2416557665-line-7">
     <rect x="0" y="172.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-8">
+<clipPath id="terminal-2416557665-line-8">
     <rect x="0" y="196.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-9">
+<clipPath id="terminal-2416557665-line-9">
     <rect x="0" y="221.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-10">
+<clipPath id="terminal-2416557665-line-10">
     <rect x="0" y="245.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-11">
+<clipPath id="terminal-2416557665-line-11">
     <rect x="0" y="269.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-12">
+<clipPath id="terminal-2416557665-line-12">
     <rect x="0" y="294.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-13">
+<clipPath id="terminal-2416557665-line-13">
     <rect x="0" y="318.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-14">
+<clipPath id="terminal-2416557665-line-14">
     <rect x="0" y="343.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-15">
+<clipPath id="terminal-2416557665-line-15">
     <rect x="0" y="367.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-16">
+<clipPath id="terminal-2416557665-line-16">
     <rect x="0" y="391.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-17">
+<clipPath id="terminal-2416557665-line-17">
     <rect x="0" y="416.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-18">
+<clipPath id="terminal-2416557665-line-18">
     <rect x="0" y="440.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-19">
+<clipPath id="terminal-2416557665-line-19">
     <rect x="0" y="465.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-20">
+<clipPath id="terminal-2416557665-line-20">
     <rect x="0" y="489.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-21">
+<clipPath id="terminal-2416557665-line-21">
     <rect x="0" y="513.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-22">
+<clipPath id="terminal-2416557665-line-22">
     <rect x="0" y="538.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-23">
+<clipPath id="terminal-2416557665-line-23">
     <rect x="0" y="562.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2359602172-line-24">
+<clipPath id="terminal-2416557665-line-24">
     <rect x="0" y="587.1" width="976" height="24.65"/>
             </clipPath>
     </defs>
@@ -123,35 +132,35 @@
             <circle cx="44" cy="0" r="7" fill="#28c840"/>
             </g>
         
-    <g transform="translate(9, 41)" clip-path="url(#terminal-2359602172-clip-terminal)">
+    <g transform="translate(9, 41)" clip-path="url(#terminal-2416557665-clip-terminal)">
     
-    <g class="terminal-2359602172-matrix">
-    <text class="terminal-2359602172-r1" x="0" y="20" textLength="317.2" clip-path="url(#terminal-2359602172-line-0)">$&#160;casanovo&#160;sequence&#160;--help</text><text class="terminal-2359602172-r1" x="976" y="20" textLength="12.2" clip-path="url(#terminal-2359602172-line-0)">
-</text><text class="terminal-2359602172-r1" x="976" y="44.4" textLength="12.2" clip-path="url(#terminal-2359602172-line-1)">
-</text><text class="terminal-2359602172-r1" x="0" y="68.8" textLength="976" clip-path="url(#terminal-2359602172-line-2)">&#160;Usage:&#160;casanovo&#160;sequence&#160;[OPTIONS]&#160;PEAK_PATH...&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2359602172-r1" x="976" y="68.8" textLength="12.2" clip-path="url(#terminal-2359602172-line-2)">
-</text><text class="terminal-2359602172-r1" x="976" y="93.2" textLength="12.2" clip-path="url(#terminal-2359602172-line-3)">
-</text><text class="terminal-2359602172-r1" x="0" y="117.6" textLength="976" clip-path="url(#terminal-2359602172-line-4)">&#160;De&#160;novo&#160;sequence&#160;peptides&#160;from&#160;tandem&#160;mass&#160;spectra.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2359602172-r1" x="976" y="117.6" textLength="12.2" clip-path="url(#terminal-2359602172-line-4)">
-</text><text class="terminal-2359602172-r1" x="0" y="142" textLength="976" clip-path="url(#terminal-2359602172-line-5)">&#160;PEAK_PATH&#160;must&#160;be&#160;one&#160;or&#160;more&#160;mzMl,&#160;mzXML,&#160;or&#160;MGF&#160;files&#160;from&#160;which&#160;to&#160;sequence&#160;</text><text class="terminal-2359602172-r1" x="976" y="142" textLength="12.2" clip-path="url(#terminal-2359602172-line-5)">
-</text><text class="terminal-2359602172-r1" x="0" y="166.4" textLength="976" clip-path="url(#terminal-2359602172-line-6)">&#160;peptides.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2359602172-r1" x="976" y="166.4" textLength="12.2" clip-path="url(#terminal-2359602172-line-6)">
-</text><text class="terminal-2359602172-r1" x="976" y="190.8" textLength="12.2" clip-path="url(#terminal-2359602172-line-7)">
-</text><text class="terminal-2359602172-r1" x="0" y="215.2" textLength="976" clip-path="url(#terminal-2359602172-line-8)">╭─&#160;Arguments&#160;──────────────────────────────────────────────────────────────────╮</text><text class="terminal-2359602172-r1" x="976" y="215.2" textLength="12.2" clip-path="url(#terminal-2359602172-line-8)">
-</text><text class="terminal-2359602172-r1" x="0" y="239.6" textLength="976" clip-path="url(#terminal-2359602172-line-9)">│&#160;*&#160;&#160;PEAK_PATH&#160;&#160;&#160;&#160;FILE&#160;&#160;[required]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2359602172-r1" x="976" y="239.6" textLength="12.2" clip-path="url(#terminal-2359602172-line-9)">
-</text><text class="terminal-2359602172-r1" x="0" y="264" textLength="976" clip-path="url(#terminal-2359602172-line-10)">╰──────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2359602172-r1" x="976" y="264" textLength="12.2" clip-path="url(#terminal-2359602172-line-10)">
-</text><text class="terminal-2359602172-r1" x="0" y="288.4" textLength="976" clip-path="url(#terminal-2359602172-line-11)">╭─&#160;Options&#160;────────────────────────────────────────────────────────────────────╮</text><text class="terminal-2359602172-r1" x="976" y="288.4" textLength="12.2" clip-path="url(#terminal-2359602172-line-11)">
-</text><text class="terminal-2359602172-r1" x="0" y="312.8" textLength="976" clip-path="url(#terminal-2359602172-line-12)">│&#160;--model&#160;&#160;&#160;&#160;&#160;&#160;-m&#160;&#160;FILE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;The&#160;model&#160;weights&#160;(.ckpt&#160;file).&#160;│</text><text class="terminal-2359602172-r1" x="976" y="312.8" textLength="12.2" clip-path="url(#terminal-2359602172-line-12)">
-</text><text class="terminal-2359602172-r1" x="0" y="337.2" textLength="976" clip-path="url(#terminal-2359602172-line-13)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If&#160;not&#160;provided,&#160;Casanovo&#160;will&#160;&#160;│</text><text class="terminal-2359602172-r1" x="976" y="337.2" textLength="12.2" clip-path="url(#terminal-2359602172-line-13)">
-</text><text class="terminal-2359602172-r1" x="0" y="361.6" textLength="976" clip-path="url(#terminal-2359602172-line-14)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;try&#160;to&#160;download&#160;the&#160;latest&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2359602172-r1" x="976" y="361.6" textLength="12.2" clip-path="url(#terminal-2359602172-line-14)">
-</text><text class="terminal-2359602172-r1" x="0" y="386" textLength="976" clip-path="url(#terminal-2359602172-line-15)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;release.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2359602172-r1" x="976" y="386" textLength="12.2" clip-path="url(#terminal-2359602172-line-15)">
-</text><text class="terminal-2359602172-r1" x="0" y="410.4" textLength="976" clip-path="url(#terminal-2359602172-line-16)">│&#160;--output&#160;&#160;&#160;&#160;&#160;-o&#160;&#160;FILE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;The&#160;mzTab&#160;file&#160;to&#160;which&#160;results&#160;│</text><text class="terminal-2359602172-r1" x="976" y="410.4" textLength="12.2" clip-path="url(#terminal-2359602172-line-16)">
-</text><text class="terminal-2359602172-r1" x="0" y="434.8" textLength="976" clip-path="url(#terminal-2359602172-line-17)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;will&#160;be&#160;written.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2359602172-r1" x="976" y="434.8" textLength="12.2" clip-path="url(#terminal-2359602172-line-17)">
-</text><text class="terminal-2359602172-r1" x="0" y="459.2" textLength="976" clip-path="url(#terminal-2359602172-line-18)">│&#160;--config&#160;&#160;&#160;&#160;&#160;-c&#160;&#160;FILE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;The&#160;YAML&#160;configuration&#160;file&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2359602172-r1" x="976" y="459.2" textLength="12.2" clip-path="url(#terminal-2359602172-line-18)">
-</text><text class="terminal-2359602172-r1" x="0" y="483.6" textLength="976" clip-path="url(#terminal-2359602172-line-19)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;overriding&#160;the&#160;default&#160;options.&#160;│</text><text class="terminal-2359602172-r1" x="976" y="483.6" textLength="12.2" clip-path="url(#terminal-2359602172-line-19)">
-</text><text class="terminal-2359602172-r1" x="0" y="508" textLength="976" clip-path="url(#terminal-2359602172-line-20)">│&#160;--verbosity&#160;&#160;-v&#160;&#160;[debug|info|warning|error]&#160;&#160;Set&#160;the&#160;verbosity&#160;of&#160;console&#160;&#160;&#160;&#160;│</text><text class="terminal-2359602172-r1" x="976" y="508" textLength="12.2" clip-path="url(#terminal-2359602172-line-20)">
-</text><text class="terminal-2359602172-r1" x="0" y="532.4" textLength="976" clip-path="url(#terminal-2359602172-line-21)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;logging&#160;messages.&#160;Log&#160;files&#160;are&#160;│</text><text class="terminal-2359602172-r1" x="976" y="532.4" textLength="12.2" clip-path="url(#terminal-2359602172-line-21)">
-</text><text class="terminal-2359602172-r1" x="0" y="556.8" textLength="976" clip-path="url(#terminal-2359602172-line-22)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;always&#160;set&#160;to&#160;&#x27;debug&#x27;.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2359602172-r1" x="976" y="556.8" textLength="12.2" clip-path="url(#terminal-2359602172-line-22)">
-</text><text class="terminal-2359602172-r1" x="0" y="581.2" textLength="976" clip-path="url(#terminal-2359602172-line-23)">│&#160;--help&#160;&#160;&#160;&#160;&#160;&#160;&#160;-h&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Show&#160;this&#160;message&#160;and&#160;exit.&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2359602172-r1" x="976" y="581.2" textLength="12.2" clip-path="url(#terminal-2359602172-line-23)">
-</text><text class="terminal-2359602172-r1" x="0" y="605.6" textLength="976" clip-path="url(#terminal-2359602172-line-24)">╰──────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2359602172-r1" x="976" y="605.6" textLength="12.2" clip-path="url(#terminal-2359602172-line-24)">
-</text><text class="terminal-2359602172-r1" x="976" y="630" textLength="12.2" clip-path="url(#terminal-2359602172-line-25)">
+    <g class="terminal-2416557665-matrix">
+    <text class="terminal-2416557665-r1" x="0" y="20" textLength="317.2" clip-path="url(#terminal-2416557665-line-0)">$&#160;casanovo&#160;sequence&#160;--help</text><text class="terminal-2416557665-r1" x="976" y="20" textLength="12.2" clip-path="url(#terminal-2416557665-line-0)">
+</text><text class="terminal-2416557665-r1" x="976" y="44.4" textLength="12.2" clip-path="url(#terminal-2416557665-line-1)">
+</text><text class="terminal-2416557665-r2" x="12.2" y="68.8" textLength="73.2" clip-path="url(#terminal-2416557665-line-2)">Usage:</text><text class="terminal-2416557665-r3" x="97.6" y="68.8" textLength="207.4" clip-path="url(#terminal-2416557665-line-2)">casanovo&#160;sequence</text><text class="terminal-2416557665-r1" x="305" y="68.8" textLength="24.4" clip-path="url(#terminal-2416557665-line-2)">&#160;[</text><text class="terminal-2416557665-r4" x="329.4" y="68.8" textLength="85.4" clip-path="url(#terminal-2416557665-line-2)">OPTIONS</text><text class="terminal-2416557665-r1" x="414.8" y="68.8" textLength="24.4" clip-path="url(#terminal-2416557665-line-2)">]&#160;</text><text class="terminal-2416557665-r4" x="439.2" y="68.8" textLength="109.8" clip-path="url(#terminal-2416557665-line-2)">PEAK_PATH</text><text class="terminal-2416557665-r1" x="549" y="68.8" textLength="427" clip-path="url(#terminal-2416557665-line-2)">...&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2416557665-r1" x="976" y="68.8" textLength="12.2" clip-path="url(#terminal-2416557665-line-2)">
+</text><text class="terminal-2416557665-r1" x="976" y="93.2" textLength="12.2" clip-path="url(#terminal-2416557665-line-3)">
+</text><text class="terminal-2416557665-r1" x="0" y="117.6" textLength="976" clip-path="url(#terminal-2416557665-line-4)">&#160;De&#160;novo&#160;sequence&#160;peptides&#160;from&#160;tandem&#160;mass&#160;spectra.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2416557665-r1" x="976" y="117.6" textLength="12.2" clip-path="url(#terminal-2416557665-line-4)">
+</text><text class="terminal-2416557665-r1" x="0" y="142" textLength="976" clip-path="url(#terminal-2416557665-line-5)">&#160;PEAK_PATH&#160;must&#160;be&#160;one&#160;or&#160;more&#160;mzML,&#160;mzXML,&#160;or&#160;MGF&#160;files&#160;from&#160;which&#160;to&#160;sequence&#160;</text><text class="terminal-2416557665-r1" x="976" y="142" textLength="12.2" clip-path="url(#terminal-2416557665-line-5)">
+</text><text class="terminal-2416557665-r1" x="0" y="166.4" textLength="976" clip-path="url(#terminal-2416557665-line-6)">&#160;peptides.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2416557665-r1" x="976" y="166.4" textLength="12.2" clip-path="url(#terminal-2416557665-line-6)">
+</text><text class="terminal-2416557665-r1" x="976" y="190.8" textLength="12.2" clip-path="url(#terminal-2416557665-line-7)">
+</text><text class="terminal-2416557665-r5" x="0" y="215.2" textLength="24.4" clip-path="url(#terminal-2416557665-line-8)">╭─</text><text class="terminal-2416557665-r5" x="24.4" y="215.2" textLength="134.2" clip-path="url(#terminal-2416557665-line-8)">&#160;Arguments&#160;</text><text class="terminal-2416557665-r5" x="158.6" y="215.2" textLength="793" clip-path="url(#terminal-2416557665-line-8)">─────────────────────────────────────────────────────────────────</text><text class="terminal-2416557665-r5" x="951.6" y="215.2" textLength="24.4" clip-path="url(#terminal-2416557665-line-8)">─╮</text><text class="terminal-2416557665-r1" x="976" y="215.2" textLength="12.2" clip-path="url(#terminal-2416557665-line-8)">
+</text><text class="terminal-2416557665-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-2416557665-line-9)">│</text><text class="terminal-2416557665-r6" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-2416557665-line-9)">*</text><text class="terminal-2416557665-r1" x="36.6" y="239.6" textLength="183" clip-path="url(#terminal-2416557665-line-9)">&#160;&#160;PEAK_PATH&#160;&#160;&#160;&#160;</text><text class="terminal-2416557665-r7" x="219.6" y="239.6" textLength="48.8" clip-path="url(#terminal-2416557665-line-9)">FILE</text><text class="terminal-2416557665-r8" x="292.8" y="239.6" textLength="122" clip-path="url(#terminal-2416557665-line-9)">[required]</text><text class="terminal-2416557665-r5" x="963.8" y="239.6" textLength="12.2" clip-path="url(#terminal-2416557665-line-9)">│</text><text class="terminal-2416557665-r1" x="976" y="239.6" textLength="12.2" clip-path="url(#terminal-2416557665-line-9)">
+</text><text class="terminal-2416557665-r5" x="0" y="264" textLength="976" clip-path="url(#terminal-2416557665-line-10)">╰──────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2416557665-r1" x="976" y="264" textLength="12.2" clip-path="url(#terminal-2416557665-line-10)">
+</text><text class="terminal-2416557665-r5" x="0" y="288.4" textLength="24.4" clip-path="url(#terminal-2416557665-line-11)">╭─</text><text class="terminal-2416557665-r5" x="24.4" y="288.4" textLength="109.8" clip-path="url(#terminal-2416557665-line-11)">&#160;Options&#160;</text><text class="terminal-2416557665-r5" x="134.2" y="288.4" textLength="817.4" clip-path="url(#terminal-2416557665-line-11)">───────────────────────────────────────────────────────────────────</text><text class="terminal-2416557665-r5" x="951.6" y="288.4" textLength="24.4" clip-path="url(#terminal-2416557665-line-11)">─╮</text><text class="terminal-2416557665-r1" x="976" y="288.4" textLength="12.2" clip-path="url(#terminal-2416557665-line-11)">
+</text><text class="terminal-2416557665-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-2416557665-line-12)">│</text><text class="terminal-2416557665-r4" x="24.4" y="312.8" textLength="85.4" clip-path="url(#terminal-2416557665-line-12)">--model</text><text class="terminal-2416557665-r9" x="183" y="312.8" textLength="24.4" clip-path="url(#terminal-2416557665-line-12)">-m</text><text class="terminal-2416557665-r7" x="231.8" y="312.8" textLength="317.2" clip-path="url(#terminal-2416557665-line-12)">FILE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2416557665-r1" x="549" y="312.8" textLength="414.8" clip-path="url(#terminal-2416557665-line-12)">&#160;&#160;The&#160;model&#160;weights&#160;(.ckpt&#160;file).&#160;</text><text class="terminal-2416557665-r5" x="963.8" y="312.8" textLength="12.2" clip-path="url(#terminal-2416557665-line-12)">│</text><text class="terminal-2416557665-r1" x="976" y="312.8" textLength="12.2" clip-path="url(#terminal-2416557665-line-12)">
+</text><text class="terminal-2416557665-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-2416557665-line-13)">│</text><text class="terminal-2416557665-r1" x="12.2" y="337.2" textLength="951.6" clip-path="url(#terminal-2416557665-line-13)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;If&#160;not&#160;provided,&#160;Casanovo&#160;will&#160;&#160;</text><text class="terminal-2416557665-r5" x="963.8" y="337.2" textLength="12.2" clip-path="url(#terminal-2416557665-line-13)">│</text><text class="terminal-2416557665-r1" x="976" y="337.2" textLength="12.2" clip-path="url(#terminal-2416557665-line-13)">
+</text><text class="terminal-2416557665-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-2416557665-line-14)">│</text><text class="terminal-2416557665-r1" x="12.2" y="361.6" textLength="951.6" clip-path="url(#terminal-2416557665-line-14)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;try&#160;to&#160;download&#160;the&#160;latest&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2416557665-r5" x="963.8" y="361.6" textLength="12.2" clip-path="url(#terminal-2416557665-line-14)">│</text><text class="terminal-2416557665-r1" x="976" y="361.6" textLength="12.2" clip-path="url(#terminal-2416557665-line-14)">
+</text><text class="terminal-2416557665-r5" x="0" y="386" textLength="12.2" clip-path="url(#terminal-2416557665-line-15)">│</text><text class="terminal-2416557665-r1" x="12.2" y="386" textLength="951.6" clip-path="url(#terminal-2416557665-line-15)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;release.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2416557665-r5" x="963.8" y="386" textLength="12.2" clip-path="url(#terminal-2416557665-line-15)">│</text><text class="terminal-2416557665-r1" x="976" y="386" textLength="12.2" clip-path="url(#terminal-2416557665-line-15)">
+</text><text class="terminal-2416557665-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-2416557665-line-16)">│</text><text class="terminal-2416557665-r4" x="24.4" y="410.4" textLength="97.6" clip-path="url(#terminal-2416557665-line-16)">--output</text><text class="terminal-2416557665-r9" x="183" y="410.4" textLength="24.4" clip-path="url(#terminal-2416557665-line-16)">-o</text><text class="terminal-2416557665-r7" x="231.8" y="410.4" textLength="317.2" clip-path="url(#terminal-2416557665-line-16)">FILE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2416557665-r1" x="549" y="410.4" textLength="414.8" clip-path="url(#terminal-2416557665-line-16)">&#160;&#160;The&#160;mzTab&#160;file&#160;to&#160;which&#160;results&#160;</text><text class="terminal-2416557665-r5" x="963.8" y="410.4" textLength="12.2" clip-path="url(#terminal-2416557665-line-16)">│</text><text class="terminal-2416557665-r1" x="976" y="410.4" textLength="12.2" clip-path="url(#terminal-2416557665-line-16)">
+</text><text class="terminal-2416557665-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-2416557665-line-17)">│</text><text class="terminal-2416557665-r1" x="12.2" y="434.8" textLength="951.6" clip-path="url(#terminal-2416557665-line-17)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;will&#160;be&#160;written.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2416557665-r5" x="963.8" y="434.8" textLength="12.2" clip-path="url(#terminal-2416557665-line-17)">│</text><text class="terminal-2416557665-r1" x="976" y="434.8" textLength="12.2" clip-path="url(#terminal-2416557665-line-17)">
+</text><text class="terminal-2416557665-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-2416557665-line-18)">│</text><text class="terminal-2416557665-r4" x="24.4" y="459.2" textLength="97.6" clip-path="url(#terminal-2416557665-line-18)">--config</text><text class="terminal-2416557665-r9" x="183" y="459.2" textLength="24.4" clip-path="url(#terminal-2416557665-line-18)">-c</text><text class="terminal-2416557665-r7" x="231.8" y="459.2" textLength="317.2" clip-path="url(#terminal-2416557665-line-18)">FILE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2416557665-r1" x="549" y="459.2" textLength="414.8" clip-path="url(#terminal-2416557665-line-18)">&#160;&#160;The&#160;YAML&#160;configuration&#160;file&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2416557665-r5" x="963.8" y="459.2" textLength="12.2" clip-path="url(#terminal-2416557665-line-18)">│</text><text class="terminal-2416557665-r1" x="976" y="459.2" textLength="12.2" clip-path="url(#terminal-2416557665-line-18)">
+</text><text class="terminal-2416557665-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-2416557665-line-19)">│</text><text class="terminal-2416557665-r1" x="12.2" y="483.6" textLength="951.6" clip-path="url(#terminal-2416557665-line-19)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;overriding&#160;the&#160;default&#160;options.&#160;</text><text class="terminal-2416557665-r5" x="963.8" y="483.6" textLength="12.2" clip-path="url(#terminal-2416557665-line-19)">│</text><text class="terminal-2416557665-r1" x="976" y="483.6" textLength="12.2" clip-path="url(#terminal-2416557665-line-19)">
+</text><text class="terminal-2416557665-r5" x="0" y="508" textLength="12.2" clip-path="url(#terminal-2416557665-line-20)">│</text><text class="terminal-2416557665-r4" x="24.4" y="508" textLength="134.2" clip-path="url(#terminal-2416557665-line-20)">--verbosity</text><text class="terminal-2416557665-r9" x="183" y="508" textLength="24.4" clip-path="url(#terminal-2416557665-line-20)">-v</text><text class="terminal-2416557665-r10" x="231.8" y="508" textLength="12.2" clip-path="url(#terminal-2416557665-line-20)">[</text><text class="terminal-2416557665-r7" x="244" y="508" textLength="61" clip-path="url(#terminal-2416557665-line-20)">debug</text><text class="terminal-2416557665-r10" x="305" y="508" textLength="12.2" clip-path="url(#terminal-2416557665-line-20)">|</text><text class="terminal-2416557665-r7" x="317.2" y="508" textLength="48.8" clip-path="url(#terminal-2416557665-line-20)">info</text><text class="terminal-2416557665-r10" x="366" y="508" textLength="12.2" clip-path="url(#terminal-2416557665-line-20)">|</text><text class="terminal-2416557665-r7" x="378.2" y="508" textLength="85.4" clip-path="url(#terminal-2416557665-line-20)">warning</text><text class="terminal-2416557665-r10" x="463.6" y="508" textLength="12.2" clip-path="url(#terminal-2416557665-line-20)">|</text><text class="terminal-2416557665-r7" x="475.8" y="508" textLength="61" clip-path="url(#terminal-2416557665-line-20)">error</text><text class="terminal-2416557665-r10" x="536.8" y="508" textLength="12.2" clip-path="url(#terminal-2416557665-line-20)">]</text><text class="terminal-2416557665-r1" x="549" y="508" textLength="414.8" clip-path="url(#terminal-2416557665-line-20)">&#160;&#160;Set&#160;the&#160;verbosity&#160;of&#160;console&#160;&#160;&#160;&#160;</text><text class="terminal-2416557665-r5" x="963.8" y="508" textLength="12.2" clip-path="url(#terminal-2416557665-line-20)">│</text><text class="terminal-2416557665-r1" x="976" y="508" textLength="12.2" clip-path="url(#terminal-2416557665-line-20)">
+</text><text class="terminal-2416557665-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-2416557665-line-21)">│</text><text class="terminal-2416557665-r1" x="12.2" y="532.4" textLength="951.6" clip-path="url(#terminal-2416557665-line-21)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;logging&#160;messages.&#160;Log&#160;files&#160;are&#160;</text><text class="terminal-2416557665-r5" x="963.8" y="532.4" textLength="12.2" clip-path="url(#terminal-2416557665-line-21)">│</text><text class="terminal-2416557665-r1" x="976" y="532.4" textLength="12.2" clip-path="url(#terminal-2416557665-line-21)">
+</text><text class="terminal-2416557665-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-2416557665-line-22)">│</text><text class="terminal-2416557665-r1" x="12.2" y="556.8" textLength="951.6" clip-path="url(#terminal-2416557665-line-22)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;always&#160;set&#160;to&#160;&#x27;debug&#x27;.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2416557665-r5" x="963.8" y="556.8" textLength="12.2" clip-path="url(#terminal-2416557665-line-22)">│</text><text class="terminal-2416557665-r1" x="976" y="556.8" textLength="12.2" clip-path="url(#terminal-2416557665-line-22)">
+</text><text class="terminal-2416557665-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-2416557665-line-23)">│</text><text class="terminal-2416557665-r4" x="24.4" y="581.2" textLength="73.2" clip-path="url(#terminal-2416557665-line-23)">--help</text><text class="terminal-2416557665-r9" x="183" y="581.2" textLength="24.4" clip-path="url(#terminal-2416557665-line-23)">-h</text><text class="terminal-2416557665-r1" x="549" y="581.2" textLength="414.8" clip-path="url(#terminal-2416557665-line-23)">&#160;&#160;Show&#160;this&#160;message&#160;and&#160;exit.&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2416557665-r5" x="963.8" y="581.2" textLength="12.2" clip-path="url(#terminal-2416557665-line-23)">│</text><text class="terminal-2416557665-r1" x="976" y="581.2" textLength="12.2" clip-path="url(#terminal-2416557665-line-23)">
+</text><text class="terminal-2416557665-r5" x="0" y="605.6" textLength="976" clip-path="url(#terminal-2416557665-line-24)">╰──────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2416557665-r1" x="976" y="605.6" textLength="12.2" clip-path="url(#terminal-2416557665-line-24)">
+</text><text class="terminal-2416557665-r1" x="976" y="630" textLength="12.2" clip-path="url(#terminal-2416557665-line-25)">
 </text>
     </g>
     </g>
diff --git a/docs/images/train-help.svg b/docs/images/train-help.svg
index fccd4140..58251215 100644
--- a/docs/images/train-help.svg
+++ b/docs/images/train-help.svg
@@ -19,138 +19,147 @@
         font-weight: 700;
     }
 
-    .terminal-2430201580-matrix {
+    .terminal-2982408974-matrix {
         font-family: Fira Code, monospace;
         font-size: 20px;
         line-height: 24.4px;
         font-variant-east-asian: full-width;
     }
 
-    .terminal-2430201580-title {
+    .terminal-2982408974-title {
         font-size: 18px;
         font-weight: bold;
         font-family: arial;
     }
 
-    .terminal-2430201580-r1 { fill: #c5c8c6 }
+    .terminal-2982408974-r1 { fill: #c5c8c6 }
+.terminal-2982408974-r2 { fill: #d0b344 }
+.terminal-2982408974-r3 { fill: #c5c8c6;font-weight: bold }
+.terminal-2982408974-r4 { fill: #68a0b3;font-weight: bold }
+.terminal-2982408974-r5 { fill: #868887 }
+.terminal-2982408974-r6 { fill: #cc555a }
+.terminal-2982408974-r7 { fill: #d0b344;font-weight: bold }
+.terminal-2982408974-r8 { fill: #8a4346 }
+.terminal-2982408974-r9 { fill: #98a84b;font-weight: bold }
+.terminal-2982408974-r10 { fill: #8d7b39;font-weight: bold }
     </style>
 
     <defs>
-    <clipPath id="terminal-2430201580-clip-terminal">
+    <clipPath id="terminal-2982408974-clip-terminal">
       <rect x="0" y="0" width="975.0" height="950.5999999999999" />
     </clipPath>
-    <clipPath id="terminal-2430201580-line-0">
+    <clipPath id="terminal-2982408974-line-0">
     <rect x="0" y="1.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-1">
+<clipPath id="terminal-2982408974-line-1">
     <rect x="0" y="25.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-2">
+<clipPath id="terminal-2982408974-line-2">
     <rect x="0" y="50.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-3">
+<clipPath id="terminal-2982408974-line-3">
     <rect x="0" y="74.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-4">
+<clipPath id="terminal-2982408974-line-4">
     <rect x="0" y="99.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-5">
+<clipPath id="terminal-2982408974-line-5">
     <rect x="0" y="123.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-6">
+<clipPath id="terminal-2982408974-line-6">
     <rect x="0" y="147.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-7">
+<clipPath id="terminal-2982408974-line-7">
     <rect x="0" y="172.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-8">
+<clipPath id="terminal-2982408974-line-8">
     <rect x="0" y="196.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-9">
+<clipPath id="terminal-2982408974-line-9">
     <rect x="0" y="221.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-10">
+<clipPath id="terminal-2982408974-line-10">
     <rect x="0" y="245.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-11">
+<clipPath id="terminal-2982408974-line-11">
     <rect x="0" y="269.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-12">
+<clipPath id="terminal-2982408974-line-12">
     <rect x="0" y="294.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-13">
+<clipPath id="terminal-2982408974-line-13">
     <rect x="0" y="318.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-14">
+<clipPath id="terminal-2982408974-line-14">
     <rect x="0" y="343.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-15">
+<clipPath id="terminal-2982408974-line-15">
     <rect x="0" y="367.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-16">
+<clipPath id="terminal-2982408974-line-16">
     <rect x="0" y="391.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-17">
+<clipPath id="terminal-2982408974-line-17">
     <rect x="0" y="416.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-18">
+<clipPath id="terminal-2982408974-line-18">
     <rect x="0" y="440.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-19">
+<clipPath id="terminal-2982408974-line-19">
     <rect x="0" y="465.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-20">
+<clipPath id="terminal-2982408974-line-20">
     <rect x="0" y="489.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-21">
+<clipPath id="terminal-2982408974-line-21">
     <rect x="0" y="513.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-22">
+<clipPath id="terminal-2982408974-line-22">
     <rect x="0" y="538.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-23">
+<clipPath id="terminal-2982408974-line-23">
     <rect x="0" y="562.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-24">
+<clipPath id="terminal-2982408974-line-24">
     <rect x="0" y="587.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-25">
+<clipPath id="terminal-2982408974-line-25">
     <rect x="0" y="611.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-26">
+<clipPath id="terminal-2982408974-line-26">
     <rect x="0" y="635.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-27">
+<clipPath id="terminal-2982408974-line-27">
     <rect x="0" y="660.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-28">
+<clipPath id="terminal-2982408974-line-28">
     <rect x="0" y="684.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-29">
+<clipPath id="terminal-2982408974-line-29">
     <rect x="0" y="709.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-30">
+<clipPath id="terminal-2982408974-line-30">
     <rect x="0" y="733.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-31">
+<clipPath id="terminal-2982408974-line-31">
     <rect x="0" y="757.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-32">
+<clipPath id="terminal-2982408974-line-32">
     <rect x="0" y="782.3" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-33">
+<clipPath id="terminal-2982408974-line-33">
     <rect x="0" y="806.7" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-34">
+<clipPath id="terminal-2982408974-line-34">
     <rect x="0" y="831.1" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-35">
+<clipPath id="terminal-2982408974-line-35">
     <rect x="0" y="855.5" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-36">
+<clipPath id="terminal-2982408974-line-36">
     <rect x="0" y="879.9" width="976" height="24.65"/>
             </clipPath>
-<clipPath id="terminal-2430201580-line-37">
+<clipPath id="terminal-2982408974-line-37">
     <rect x="0" y="904.3" width="976" height="24.65"/>
             </clipPath>
     </defs>
@@ -162,48 +171,48 @@
             <circle cx="44" cy="0" r="7" fill="#28c840"/>
             </g>
         
-    <g transform="translate(9, 41)" clip-path="url(#terminal-2430201580-clip-terminal)">
+    <g transform="translate(9, 41)" clip-path="url(#terminal-2982408974-clip-terminal)">
     
-    <g class="terminal-2430201580-matrix">
-    <text class="terminal-2430201580-r1" x="0" y="20" textLength="280.6" clip-path="url(#terminal-2430201580-line-0)">$&#160;casanovo&#160;train&#160;--help</text><text class="terminal-2430201580-r1" x="976" y="20" textLength="12.2" clip-path="url(#terminal-2430201580-line-0)">
-</text><text class="terminal-2430201580-r1" x="976" y="44.4" textLength="12.2" clip-path="url(#terminal-2430201580-line-1)">
-</text><text class="terminal-2430201580-r1" x="0" y="68.8" textLength="976" clip-path="url(#terminal-2430201580-line-2)">&#160;Usage:&#160;casanovo&#160;train&#160;[OPTIONS]&#160;TRAIN_PEAK_PATH...&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2430201580-r1" x="976" y="68.8" textLength="12.2" clip-path="url(#terminal-2430201580-line-2)">
-</text><text class="terminal-2430201580-r1" x="976" y="93.2" textLength="12.2" clip-path="url(#terminal-2430201580-line-3)">
-</text><text class="terminal-2430201580-r1" x="0" y="117.6" textLength="976" clip-path="url(#terminal-2430201580-line-4)">&#160;Train&#160;a&#160;Casanovo&#160;model&#160;on&#160;your&#160;own&#160;data.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2430201580-r1" x="976" y="117.6" textLength="12.2" clip-path="url(#terminal-2430201580-line-4)">
-</text><text class="terminal-2430201580-r1" x="0" y="142" textLength="976" clip-path="url(#terminal-2430201580-line-5)">&#160;TRAIN_PEAK_PATH&#160;must&#160;be&#160;one&#160;or&#160;more&#160;annoated&#160;MGF&#160;files,&#160;such&#160;as&#160;those&#160;provided&#160;</text><text class="terminal-2430201580-r1" x="976" y="142" textLength="12.2" clip-path="url(#terminal-2430201580-line-5)">
-</text><text class="terminal-2430201580-r1" x="0" y="166.4" textLength="976" clip-path="url(#terminal-2430201580-line-6)">&#160;by&#160;MassIVE-KB,&#160;from&#160;which&#160;to&#160;train&#160;a&#160;new&#160;Casnovo&#160;model.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2430201580-r1" x="976" y="166.4" textLength="12.2" clip-path="url(#terminal-2430201580-line-6)">
-</text><text class="terminal-2430201580-r1" x="976" y="190.8" textLength="12.2" clip-path="url(#terminal-2430201580-line-7)">
-</text><text class="terminal-2430201580-r1" x="0" y="215.2" textLength="976" clip-path="url(#terminal-2430201580-line-8)">╭─&#160;Arguments&#160;──────────────────────────────────────────────────────────────────╮</text><text class="terminal-2430201580-r1" x="976" y="215.2" textLength="12.2" clip-path="url(#terminal-2430201580-line-8)">
-</text><text class="terminal-2430201580-r1" x="0" y="239.6" textLength="976" clip-path="url(#terminal-2430201580-line-9)">│&#160;*&#160;&#160;TRAIN_PEAK_PATH&#160;&#160;&#160;&#160;FILE&#160;&#160;[required]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="239.6" textLength="12.2" clip-path="url(#terminal-2430201580-line-9)">
-</text><text class="terminal-2430201580-r1" x="0" y="264" textLength="976" clip-path="url(#terminal-2430201580-line-10)">╰──────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2430201580-r1" x="976" y="264" textLength="12.2" clip-path="url(#terminal-2430201580-line-10)">
-</text><text class="terminal-2430201580-r1" x="0" y="288.4" textLength="976" clip-path="url(#terminal-2430201580-line-11)">╭─&#160;Options&#160;────────────────────────────────────────────────────────────────────╮</text><text class="terminal-2430201580-r1" x="976" y="288.4" textLength="12.2" clip-path="url(#terminal-2430201580-line-11)">
-</text><text class="terminal-2430201580-r1" x="0" y="312.8" textLength="976" clip-path="url(#terminal-2430201580-line-12)">│&#160;*&#160;&#160;--validation_peak_pa…&#160;&#160;-p&#160;&#160;FILE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;An&#160;annotated&#160;MGF&#160;file&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="312.8" textLength="12.2" clip-path="url(#terminal-2430201580-line-12)">
-</text><text class="terminal-2430201580-r1" x="0" y="337.2" textLength="976" clip-path="url(#terminal-2430201580-line-13)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for&#160;validation,&#160;like&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="337.2" textLength="12.2" clip-path="url(#terminal-2430201580-line-13)">
-</text><text class="terminal-2430201580-r1" x="0" y="361.6" textLength="976" clip-path="url(#terminal-2430201580-line-14)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;from&#160;MassIVE-KB.&#160;Use&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="361.6" textLength="12.2" clip-path="url(#terminal-2430201580-line-14)">
-</text><text class="terminal-2430201580-r1" x="0" y="386" textLength="976" clip-path="url(#terminal-2430201580-line-15)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this&#160;option&#160;multiple&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="386" textLength="12.2" clip-path="url(#terminal-2430201580-line-15)">
-</text><text class="terminal-2430201580-r1" x="0" y="410.4" textLength="976" clip-path="url(#terminal-2430201580-line-16)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;times&#160;to&#160;specify&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="410.4" textLength="12.2" clip-path="url(#terminal-2430201580-line-16)">
-</text><text class="terminal-2430201580-r1" x="0" y="434.8" textLength="976" clip-path="url(#terminal-2430201580-line-17)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;multiple&#160;files.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="434.8" textLength="12.2" clip-path="url(#terminal-2430201580-line-17)">
-</text><text class="terminal-2430201580-r1" x="0" y="459.2" textLength="976" clip-path="url(#terminal-2430201580-line-18)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[required]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="459.2" textLength="12.2" clip-path="url(#terminal-2430201580-line-18)">
-</text><text class="terminal-2430201580-r1" x="0" y="483.6" textLength="976" clip-path="url(#terminal-2430201580-line-19)">│&#160;&#160;&#160;&#160;--model&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;-m&#160;&#160;FILE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;The&#160;model&#160;weights&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="483.6" textLength="12.2" clip-path="url(#terminal-2430201580-line-19)">
-</text><text class="terminal-2430201580-r1" x="0" y="508" textLength="976" clip-path="url(#terminal-2430201580-line-20)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;(.ckpt&#160;file).&#160;If&#160;not&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="508" textLength="12.2" clip-path="url(#terminal-2430201580-line-20)">
-</text><text class="terminal-2430201580-r1" x="0" y="532.4" textLength="976" clip-path="url(#terminal-2430201580-line-21)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;provided,&#160;Casanovo&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="532.4" textLength="12.2" clip-path="url(#terminal-2430201580-line-21)">
-</text><text class="terminal-2430201580-r1" x="0" y="556.8" textLength="976" clip-path="url(#terminal-2430201580-line-22)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;will&#160;try&#160;to&#160;download&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="556.8" textLength="12.2" clip-path="url(#terminal-2430201580-line-22)">
-</text><text class="terminal-2430201580-r1" x="0" y="581.2" textLength="976" clip-path="url(#terminal-2430201580-line-23)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;the&#160;latest&#160;release.&#160;&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="581.2" textLength="12.2" clip-path="url(#terminal-2430201580-line-23)">
-</text><text class="terminal-2430201580-r1" x="0" y="605.6" textLength="976" clip-path="url(#terminal-2430201580-line-24)">│&#160;&#160;&#160;&#160;--output&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;-o&#160;&#160;FILE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;The&#160;mzTab&#160;file&#160;to&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="605.6" textLength="12.2" clip-path="url(#terminal-2430201580-line-24)">
-</text><text class="terminal-2430201580-r1" x="0" y="630" textLength="976" clip-path="url(#terminal-2430201580-line-25)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;which&#160;results&#160;will&#160;be&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="630" textLength="12.2" clip-path="url(#terminal-2430201580-line-25)">
-</text><text class="terminal-2430201580-r1" x="0" y="654.4" textLength="976" clip-path="url(#terminal-2430201580-line-26)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;written.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="654.4" textLength="12.2" clip-path="url(#terminal-2430201580-line-26)">
-</text><text class="terminal-2430201580-r1" x="0" y="678.8" textLength="976" clip-path="url(#terminal-2430201580-line-27)">│&#160;&#160;&#160;&#160;--config&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;-c&#160;&#160;FILE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;The&#160;YAML&#160;configuration&#160;│</text><text class="terminal-2430201580-r1" x="976" y="678.8" textLength="12.2" clip-path="url(#terminal-2430201580-line-27)">
-</text><text class="terminal-2430201580-r1" x="0" y="703.2" textLength="976" clip-path="url(#terminal-2430201580-line-28)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;file&#160;overriding&#160;the&#160;&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="703.2" textLength="12.2" clip-path="url(#terminal-2430201580-line-28)">
-</text><text class="terminal-2430201580-r1" x="0" y="727.6" textLength="976" clip-path="url(#terminal-2430201580-line-29)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;default&#160;options.&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="727.6" textLength="12.2" clip-path="url(#terminal-2430201580-line-29)">
-</text><text class="terminal-2430201580-r1" x="0" y="752" textLength="976" clip-path="url(#terminal-2430201580-line-30)">│&#160;&#160;&#160;&#160;--verbosity&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;-v&#160;&#160;[debug|info|warning|er&#160;&#160;Set&#160;the&#160;verbosity&#160;of&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="752" textLength="12.2" clip-path="url(#terminal-2430201580-line-30)">
-</text><text class="terminal-2430201580-r1" x="0" y="776.4" textLength="976" clip-path="url(#terminal-2430201580-line-31)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ror]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;console&#160;logging&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="776.4" textLength="12.2" clip-path="url(#terminal-2430201580-line-31)">
-</text><text class="terminal-2430201580-r1" x="0" y="800.8" textLength="976" clip-path="url(#terminal-2430201580-line-32)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;messages.&#160;Log&#160;files&#160;&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="800.8" textLength="12.2" clip-path="url(#terminal-2430201580-line-32)">
-</text><text class="terminal-2430201580-r1" x="0" y="825.2" textLength="976" clip-path="url(#terminal-2430201580-line-33)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;are&#160;always&#160;set&#160;to&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="825.2" textLength="12.2" clip-path="url(#terminal-2430201580-line-33)">
-</text><text class="terminal-2430201580-r1" x="0" y="849.6" textLength="976" clip-path="url(#terminal-2430201580-line-34)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#x27;debug&#x27;.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="849.6" textLength="12.2" clip-path="url(#terminal-2430201580-line-34)">
-</text><text class="terminal-2430201580-r1" x="0" y="874" textLength="976" clip-path="url(#terminal-2430201580-line-35)">│&#160;&#160;&#160;&#160;--help&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;-h&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Show&#160;this&#160;message&#160;and&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="874" textLength="12.2" clip-path="url(#terminal-2430201580-line-35)">
-</text><text class="terminal-2430201580-r1" x="0" y="898.4" textLength="976" clip-path="url(#terminal-2430201580-line-36)">│&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;exit.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;│</text><text class="terminal-2430201580-r1" x="976" y="898.4" textLength="12.2" clip-path="url(#terminal-2430201580-line-36)">
-</text><text class="terminal-2430201580-r1" x="0" y="922.8" textLength="976" clip-path="url(#terminal-2430201580-line-37)">╰──────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2430201580-r1" x="976" y="922.8" textLength="12.2" clip-path="url(#terminal-2430201580-line-37)">
-</text><text class="terminal-2430201580-r1" x="976" y="947.2" textLength="12.2" clip-path="url(#terminal-2430201580-line-38)">
+    <g class="terminal-2982408974-matrix">
+    <text class="terminal-2982408974-r1" x="0" y="20" textLength="280.6" clip-path="url(#terminal-2982408974-line-0)">$&#160;casanovo&#160;train&#160;--help</text><text class="terminal-2982408974-r1" x="976" y="20" textLength="12.2" clip-path="url(#terminal-2982408974-line-0)">
+</text><text class="terminal-2982408974-r1" x="976" y="44.4" textLength="12.2" clip-path="url(#terminal-2982408974-line-1)">
+</text><text class="terminal-2982408974-r2" x="12.2" y="68.8" textLength="73.2" clip-path="url(#terminal-2982408974-line-2)">Usage:</text><text class="terminal-2982408974-r3" x="97.6" y="68.8" textLength="170.8" clip-path="url(#terminal-2982408974-line-2)">casanovo&#160;train</text><text class="terminal-2982408974-r1" x="268.4" y="68.8" textLength="24.4" clip-path="url(#terminal-2982408974-line-2)">&#160;[</text><text class="terminal-2982408974-r4" x="292.8" y="68.8" textLength="85.4" clip-path="url(#terminal-2982408974-line-2)">OPTIONS</text><text class="terminal-2982408974-r1" x="378.2" y="68.8" textLength="24.4" clip-path="url(#terminal-2982408974-line-2)">]&#160;</text><text class="terminal-2982408974-r4" x="402.6" y="68.8" textLength="183" clip-path="url(#terminal-2982408974-line-2)">TRAIN_PEAK_PATH</text><text class="terminal-2982408974-r1" x="585.6" y="68.8" textLength="390.4" clip-path="url(#terminal-2982408974-line-2)">...&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r1" x="976" y="68.8" textLength="12.2" clip-path="url(#terminal-2982408974-line-2)">
+</text><text class="terminal-2982408974-r1" x="976" y="93.2" textLength="12.2" clip-path="url(#terminal-2982408974-line-3)">
+</text><text class="terminal-2982408974-r1" x="0" y="117.6" textLength="976" clip-path="url(#terminal-2982408974-line-4)">&#160;Train&#160;a&#160;Casanovo&#160;model&#160;on&#160;your&#160;own&#160;data.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r1" x="976" y="117.6" textLength="12.2" clip-path="url(#terminal-2982408974-line-4)">
+</text><text class="terminal-2982408974-r1" x="0" y="142" textLength="976" clip-path="url(#terminal-2982408974-line-5)">&#160;TRAIN_PEAK_PATH&#160;must&#160;be&#160;one&#160;or&#160;more&#160;annoated&#160;MGF&#160;files,&#160;such&#160;as&#160;those&#160;provided&#160;</text><text class="terminal-2982408974-r1" x="976" y="142" textLength="12.2" clip-path="url(#terminal-2982408974-line-5)">
+</text><text class="terminal-2982408974-r1" x="0" y="166.4" textLength="976" clip-path="url(#terminal-2982408974-line-6)">&#160;by&#160;MassIVE-KB,&#160;from&#160;which&#160;to&#160;train&#160;a&#160;new&#160;Casnovo&#160;model.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r1" x="976" y="166.4" textLength="12.2" clip-path="url(#terminal-2982408974-line-6)">
+</text><text class="terminal-2982408974-r1" x="976" y="190.8" textLength="12.2" clip-path="url(#terminal-2982408974-line-7)">
+</text><text class="terminal-2982408974-r5" x="0" y="215.2" textLength="24.4" clip-path="url(#terminal-2982408974-line-8)">╭─</text><text class="terminal-2982408974-r5" x="24.4" y="215.2" textLength="134.2" clip-path="url(#terminal-2982408974-line-8)">&#160;Arguments&#160;</text><text class="terminal-2982408974-r5" x="158.6" y="215.2" textLength="793" clip-path="url(#terminal-2982408974-line-8)">─────────────────────────────────────────────────────────────────</text><text class="terminal-2982408974-r5" x="951.6" y="215.2" textLength="24.4" clip-path="url(#terminal-2982408974-line-8)">─╮</text><text class="terminal-2982408974-r1" x="976" y="215.2" textLength="12.2" clip-path="url(#terminal-2982408974-line-8)">
+</text><text class="terminal-2982408974-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#terminal-2982408974-line-9)">│</text><text class="terminal-2982408974-r6" x="24.4" y="239.6" textLength="12.2" clip-path="url(#terminal-2982408974-line-9)">*</text><text class="terminal-2982408974-r1" x="36.6" y="239.6" textLength="256.2" clip-path="url(#terminal-2982408974-line-9)">&#160;&#160;TRAIN_PEAK_PATH&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r7" x="292.8" y="239.6" textLength="48.8" clip-path="url(#terminal-2982408974-line-9)">FILE</text><text class="terminal-2982408974-r8" x="366" y="239.6" textLength="122" clip-path="url(#terminal-2982408974-line-9)">[required]</text><text class="terminal-2982408974-r5" x="963.8" y="239.6" textLength="12.2" clip-path="url(#terminal-2982408974-line-9)">│</text><text class="terminal-2982408974-r1" x="976" y="239.6" textLength="12.2" clip-path="url(#terminal-2982408974-line-9)">
+</text><text class="terminal-2982408974-r5" x="0" y="264" textLength="976" clip-path="url(#terminal-2982408974-line-10)">╰──────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2982408974-r1" x="976" y="264" textLength="12.2" clip-path="url(#terminal-2982408974-line-10)">
+</text><text class="terminal-2982408974-r5" x="0" y="288.4" textLength="24.4" clip-path="url(#terminal-2982408974-line-11)">╭─</text><text class="terminal-2982408974-r5" x="24.4" y="288.4" textLength="109.8" clip-path="url(#terminal-2982408974-line-11)">&#160;Options&#160;</text><text class="terminal-2982408974-r5" x="134.2" y="288.4" textLength="817.4" clip-path="url(#terminal-2982408974-line-11)">───────────────────────────────────────────────────────────────────</text><text class="terminal-2982408974-r5" x="951.6" y="288.4" textLength="24.4" clip-path="url(#terminal-2982408974-line-11)">─╮</text><text class="terminal-2982408974-r1" x="976" y="288.4" textLength="12.2" clip-path="url(#terminal-2982408974-line-11)">
+</text><text class="terminal-2982408974-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#terminal-2982408974-line-12)">│</text><text class="terminal-2982408974-r6" x="24.4" y="312.8" textLength="12.2" clip-path="url(#terminal-2982408974-line-12)">*</text><text class="terminal-2982408974-r4" x="61" y="312.8" textLength="256.2" clip-path="url(#terminal-2982408974-line-12)">--validation_peak_pa…</text><text class="terminal-2982408974-r9" x="341.6" y="312.8" textLength="24.4" clip-path="url(#terminal-2982408974-line-12)">-p</text><text class="terminal-2982408974-r7" x="390.4" y="312.8" textLength="268.4" clip-path="url(#terminal-2982408974-line-12)">FILE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r1" x="658.8" y="312.8" textLength="305" clip-path="url(#terminal-2982408974-line-12)">&#160;&#160;An&#160;annotated&#160;MGF&#160;file&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="312.8" textLength="12.2" clip-path="url(#terminal-2982408974-line-12)">│</text><text class="terminal-2982408974-r1" x="976" y="312.8" textLength="12.2" clip-path="url(#terminal-2982408974-line-12)">
+</text><text class="terminal-2982408974-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#terminal-2982408974-line-13)">│</text><text class="terminal-2982408974-r1" x="12.2" y="337.2" textLength="951.6" clip-path="url(#terminal-2982408974-line-13)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for&#160;validation,&#160;like&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="337.2" textLength="12.2" clip-path="url(#terminal-2982408974-line-13)">│</text><text class="terminal-2982408974-r1" x="976" y="337.2" textLength="12.2" clip-path="url(#terminal-2982408974-line-13)">
+</text><text class="terminal-2982408974-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#terminal-2982408974-line-14)">│</text><text class="terminal-2982408974-r1" x="12.2" y="361.6" textLength="951.6" clip-path="url(#terminal-2982408974-line-14)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;from&#160;MassIVE-KB.&#160;Use&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="361.6" textLength="12.2" clip-path="url(#terminal-2982408974-line-14)">│</text><text class="terminal-2982408974-r1" x="976" y="361.6" textLength="12.2" clip-path="url(#terminal-2982408974-line-14)">
+</text><text class="terminal-2982408974-r5" x="0" y="386" textLength="12.2" clip-path="url(#terminal-2982408974-line-15)">│</text><text class="terminal-2982408974-r1" x="12.2" y="386" textLength="951.6" clip-path="url(#terminal-2982408974-line-15)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;this&#160;option&#160;multiple&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="386" textLength="12.2" clip-path="url(#terminal-2982408974-line-15)">│</text><text class="terminal-2982408974-r1" x="976" y="386" textLength="12.2" clip-path="url(#terminal-2982408974-line-15)">
+</text><text class="terminal-2982408974-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#terminal-2982408974-line-16)">│</text><text class="terminal-2982408974-r1" x="12.2" y="410.4" textLength="951.6" clip-path="url(#terminal-2982408974-line-16)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;times&#160;to&#160;specify&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="410.4" textLength="12.2" clip-path="url(#terminal-2982408974-line-16)">│</text><text class="terminal-2982408974-r1" x="976" y="410.4" textLength="12.2" clip-path="url(#terminal-2982408974-line-16)">
+</text><text class="terminal-2982408974-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#terminal-2982408974-line-17)">│</text><text class="terminal-2982408974-r1" x="12.2" y="434.8" textLength="951.6" clip-path="url(#terminal-2982408974-line-17)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;multiple&#160;files.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="434.8" textLength="12.2" clip-path="url(#terminal-2982408974-line-17)">│</text><text class="terminal-2982408974-r1" x="976" y="434.8" textLength="12.2" clip-path="url(#terminal-2982408974-line-17)">
+</text><text class="terminal-2982408974-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#terminal-2982408974-line-18)">│</text><text class="terminal-2982408974-r8" x="683.2" y="459.2" textLength="268.4" clip-path="url(#terminal-2982408974-line-18)">[required]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="459.2" textLength="12.2" clip-path="url(#terminal-2982408974-line-18)">│</text><text class="terminal-2982408974-r1" x="976" y="459.2" textLength="12.2" clip-path="url(#terminal-2982408974-line-18)">
+</text><text class="terminal-2982408974-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#terminal-2982408974-line-19)">│</text><text class="terminal-2982408974-r4" x="61" y="483.6" textLength="85.4" clip-path="url(#terminal-2982408974-line-19)">--model</text><text class="terminal-2982408974-r9" x="341.6" y="483.6" textLength="24.4" clip-path="url(#terminal-2982408974-line-19)">-m</text><text class="terminal-2982408974-r7" x="390.4" y="483.6" textLength="268.4" clip-path="url(#terminal-2982408974-line-19)">FILE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r1" x="658.8" y="483.6" textLength="305" clip-path="url(#terminal-2982408974-line-19)">&#160;&#160;The&#160;model&#160;weights&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="483.6" textLength="12.2" clip-path="url(#terminal-2982408974-line-19)">│</text><text class="terminal-2982408974-r1" x="976" y="483.6" textLength="12.2" clip-path="url(#terminal-2982408974-line-19)">
+</text><text class="terminal-2982408974-r5" x="0" y="508" textLength="12.2" clip-path="url(#terminal-2982408974-line-20)">│</text><text class="terminal-2982408974-r1" x="12.2" y="508" textLength="951.6" clip-path="url(#terminal-2982408974-line-20)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;(.ckpt&#160;file).&#160;If&#160;not&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="508" textLength="12.2" clip-path="url(#terminal-2982408974-line-20)">│</text><text class="terminal-2982408974-r1" x="976" y="508" textLength="12.2" clip-path="url(#terminal-2982408974-line-20)">
+</text><text class="terminal-2982408974-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#terminal-2982408974-line-21)">│</text><text class="terminal-2982408974-r1" x="12.2" y="532.4" textLength="951.6" clip-path="url(#terminal-2982408974-line-21)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;provided,&#160;Casanovo&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="532.4" textLength="12.2" clip-path="url(#terminal-2982408974-line-21)">│</text><text class="terminal-2982408974-r1" x="976" y="532.4" textLength="12.2" clip-path="url(#terminal-2982408974-line-21)">
+</text><text class="terminal-2982408974-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#terminal-2982408974-line-22)">│</text><text class="terminal-2982408974-r1" x="12.2" y="556.8" textLength="951.6" clip-path="url(#terminal-2982408974-line-22)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;will&#160;try&#160;to&#160;download&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="556.8" textLength="12.2" clip-path="url(#terminal-2982408974-line-22)">│</text><text class="terminal-2982408974-r1" x="976" y="556.8" textLength="12.2" clip-path="url(#terminal-2982408974-line-22)">
+</text><text class="terminal-2982408974-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#terminal-2982408974-line-23)">│</text><text class="terminal-2982408974-r1" x="12.2" y="581.2" textLength="951.6" clip-path="url(#terminal-2982408974-line-23)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;the&#160;latest&#160;release.&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="581.2" textLength="12.2" clip-path="url(#terminal-2982408974-line-23)">│</text><text class="terminal-2982408974-r1" x="976" y="581.2" textLength="12.2" clip-path="url(#terminal-2982408974-line-23)">
+</text><text class="terminal-2982408974-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#terminal-2982408974-line-24)">│</text><text class="terminal-2982408974-r4" x="61" y="605.6" textLength="97.6" clip-path="url(#terminal-2982408974-line-24)">--output</text><text class="terminal-2982408974-r9" x="341.6" y="605.6" textLength="24.4" clip-path="url(#terminal-2982408974-line-24)">-o</text><text class="terminal-2982408974-r7" x="390.4" y="605.6" textLength="268.4" clip-path="url(#terminal-2982408974-line-24)">FILE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r1" x="658.8" y="605.6" textLength="305" clip-path="url(#terminal-2982408974-line-24)">&#160;&#160;The&#160;mzTab&#160;file&#160;to&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="605.6" textLength="12.2" clip-path="url(#terminal-2982408974-line-24)">│</text><text class="terminal-2982408974-r1" x="976" y="605.6" textLength="12.2" clip-path="url(#terminal-2982408974-line-24)">
+</text><text class="terminal-2982408974-r5" x="0" y="630" textLength="12.2" clip-path="url(#terminal-2982408974-line-25)">│</text><text class="terminal-2982408974-r1" x="12.2" y="630" textLength="951.6" clip-path="url(#terminal-2982408974-line-25)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;which&#160;results&#160;will&#160;be&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="630" textLength="12.2" clip-path="url(#terminal-2982408974-line-25)">│</text><text class="terminal-2982408974-r1" x="976" y="630" textLength="12.2" clip-path="url(#terminal-2982408974-line-25)">
+</text><text class="terminal-2982408974-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#terminal-2982408974-line-26)">│</text><text class="terminal-2982408974-r1" x="12.2" y="654.4" textLength="951.6" clip-path="url(#terminal-2982408974-line-26)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;written.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="654.4" textLength="12.2" clip-path="url(#terminal-2982408974-line-26)">│</text><text class="terminal-2982408974-r1" x="976" y="654.4" textLength="12.2" clip-path="url(#terminal-2982408974-line-26)">
+</text><text class="terminal-2982408974-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#terminal-2982408974-line-27)">│</text><text class="terminal-2982408974-r4" x="61" y="678.8" textLength="97.6" clip-path="url(#terminal-2982408974-line-27)">--config</text><text class="terminal-2982408974-r9" x="341.6" y="678.8" textLength="24.4" clip-path="url(#terminal-2982408974-line-27)">-c</text><text class="terminal-2982408974-r7" x="390.4" y="678.8" textLength="268.4" clip-path="url(#terminal-2982408974-line-27)">FILE&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r1" x="658.8" y="678.8" textLength="305" clip-path="url(#terminal-2982408974-line-27)">&#160;&#160;The&#160;YAML&#160;configuration&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="678.8" textLength="12.2" clip-path="url(#terminal-2982408974-line-27)">│</text><text class="terminal-2982408974-r1" x="976" y="678.8" textLength="12.2" clip-path="url(#terminal-2982408974-line-27)">
+</text><text class="terminal-2982408974-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#terminal-2982408974-line-28)">│</text><text class="terminal-2982408974-r1" x="12.2" y="703.2" textLength="951.6" clip-path="url(#terminal-2982408974-line-28)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;file&#160;overriding&#160;the&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="703.2" textLength="12.2" clip-path="url(#terminal-2982408974-line-28)">│</text><text class="terminal-2982408974-r1" x="976" y="703.2" textLength="12.2" clip-path="url(#terminal-2982408974-line-28)">
+</text><text class="terminal-2982408974-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#terminal-2982408974-line-29)">│</text><text class="terminal-2982408974-r1" x="12.2" y="727.6" textLength="951.6" clip-path="url(#terminal-2982408974-line-29)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;default&#160;options.&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="727.6" textLength="12.2" clip-path="url(#terminal-2982408974-line-29)">│</text><text class="terminal-2982408974-r1" x="976" y="727.6" textLength="12.2" clip-path="url(#terminal-2982408974-line-29)">
+</text><text class="terminal-2982408974-r5" x="0" y="752" textLength="12.2" clip-path="url(#terminal-2982408974-line-30)">│</text><text class="terminal-2982408974-r4" x="61" y="752" textLength="134.2" clip-path="url(#terminal-2982408974-line-30)">--verbosity</text><text class="terminal-2982408974-r9" x="341.6" y="752" textLength="24.4" clip-path="url(#terminal-2982408974-line-30)">-v</text><text class="terminal-2982408974-r10" x="390.4" y="752" textLength="12.2" clip-path="url(#terminal-2982408974-line-30)">[</text><text class="terminal-2982408974-r7" x="402.6" y="752" textLength="61" clip-path="url(#terminal-2982408974-line-30)">debug</text><text class="terminal-2982408974-r10" x="463.6" y="752" textLength="12.2" clip-path="url(#terminal-2982408974-line-30)">|</text><text class="terminal-2982408974-r7" x="475.8" y="752" textLength="48.8" clip-path="url(#terminal-2982408974-line-30)">info</text><text class="terminal-2982408974-r10" x="524.6" y="752" textLength="12.2" clip-path="url(#terminal-2982408974-line-30)">|</text><text class="terminal-2982408974-r7" x="536.8" y="752" textLength="85.4" clip-path="url(#terminal-2982408974-line-30)">warning</text><text class="terminal-2982408974-r10" x="622.2" y="752" textLength="12.2" clip-path="url(#terminal-2982408974-line-30)">|</text><text class="terminal-2982408974-r7" x="634.4" y="752" textLength="24.4" clip-path="url(#terminal-2982408974-line-30)">er</text><text class="terminal-2982408974-r1" x="658.8" y="752" textLength="305" clip-path="url(#terminal-2982408974-line-30)">&#160;&#160;Set&#160;the&#160;verbosity&#160;of&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="752" textLength="12.2" clip-path="url(#terminal-2982408974-line-30)">│</text><text class="terminal-2982408974-r1" x="976" y="752" textLength="12.2" clip-path="url(#terminal-2982408974-line-30)">
+</text><text class="terminal-2982408974-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#terminal-2982408974-line-31)">│</text><text class="terminal-2982408974-r7" x="390.4" y="776.4" textLength="36.6" clip-path="url(#terminal-2982408974-line-31)">ror</text><text class="terminal-2982408974-r10" x="427" y="776.4" textLength="12.2" clip-path="url(#terminal-2982408974-line-31)">]</text><text class="terminal-2982408974-r1" x="658.8" y="776.4" textLength="305" clip-path="url(#terminal-2982408974-line-31)">&#160;&#160;console&#160;logging&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="776.4" textLength="12.2" clip-path="url(#terminal-2982408974-line-31)">│</text><text class="terminal-2982408974-r1" x="976" y="776.4" textLength="12.2" clip-path="url(#terminal-2982408974-line-31)">
+</text><text class="terminal-2982408974-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#terminal-2982408974-line-32)">│</text><text class="terminal-2982408974-r1" x="12.2" y="800.8" textLength="951.6" clip-path="url(#terminal-2982408974-line-32)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;messages.&#160;Log&#160;files&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="800.8" textLength="12.2" clip-path="url(#terminal-2982408974-line-32)">│</text><text class="terminal-2982408974-r1" x="976" y="800.8" textLength="12.2" clip-path="url(#terminal-2982408974-line-32)">
+</text><text class="terminal-2982408974-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#terminal-2982408974-line-33)">│</text><text class="terminal-2982408974-r1" x="12.2" y="825.2" textLength="951.6" clip-path="url(#terminal-2982408974-line-33)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;are&#160;always&#160;set&#160;to&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="825.2" textLength="12.2" clip-path="url(#terminal-2982408974-line-33)">│</text><text class="terminal-2982408974-r1" x="976" y="825.2" textLength="12.2" clip-path="url(#terminal-2982408974-line-33)">
+</text><text class="terminal-2982408974-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#terminal-2982408974-line-34)">│</text><text class="terminal-2982408974-r1" x="12.2" y="849.6" textLength="951.6" clip-path="url(#terminal-2982408974-line-34)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#x27;debug&#x27;.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="849.6" textLength="12.2" clip-path="url(#terminal-2982408974-line-34)">│</text><text class="terminal-2982408974-r1" x="976" y="849.6" textLength="12.2" clip-path="url(#terminal-2982408974-line-34)">
+</text><text class="terminal-2982408974-r5" x="0" y="874" textLength="12.2" clip-path="url(#terminal-2982408974-line-35)">│</text><text class="terminal-2982408974-r4" x="61" y="874" textLength="73.2" clip-path="url(#terminal-2982408974-line-35)">--help</text><text class="terminal-2982408974-r9" x="341.6" y="874" textLength="24.4" clip-path="url(#terminal-2982408974-line-35)">-h</text><text class="terminal-2982408974-r1" x="658.8" y="874" textLength="305" clip-path="url(#terminal-2982408974-line-35)">&#160;&#160;Show&#160;this&#160;message&#160;and&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="874" textLength="12.2" clip-path="url(#terminal-2982408974-line-35)">│</text><text class="terminal-2982408974-r1" x="976" y="874" textLength="12.2" clip-path="url(#terminal-2982408974-line-35)">
+</text><text class="terminal-2982408974-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#terminal-2982408974-line-36)">│</text><text class="terminal-2982408974-r1" x="12.2" y="898.4" textLength="951.6" clip-path="url(#terminal-2982408974-line-36)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;exit.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="terminal-2982408974-r5" x="963.8" y="898.4" textLength="12.2" clip-path="url(#terminal-2982408974-line-36)">│</text><text class="terminal-2982408974-r1" x="976" y="898.4" textLength="12.2" clip-path="url(#terminal-2982408974-line-36)">
+</text><text class="terminal-2982408974-r5" x="0" y="922.8" textLength="976" clip-path="url(#terminal-2982408974-line-37)">╰──────────────────────────────────────────────────────────────────────────────╯</text><text class="terminal-2982408974-r1" x="976" y="922.8" textLength="12.2" clip-path="url(#terminal-2982408974-line-37)">
+</text><text class="terminal-2982408974-r1" x="976" y="947.2" textLength="12.2" clip-path="url(#terminal-2982408974-line-38)">
 </text>
     </g>
     </g>


Test patch:
diff --git a/tests/conftest.py b/tests/conftest.py
index eed4f39a..95ef2d02 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -5,7 +5,7 @@
 import psims
 import pytest
 import yaml
-from pyteomics.mass import calculate_mass
+from pyteomics.mass import calculate_mass, fast_mass, std_aa_mass
 
 
 @pytest.fixture
@@ -16,7 +16,34 @@ def mgf_small(tmp_path):
     return _create_mgf(peptides, mgf_file)
 
 
-def _create_mgf(peptides, mgf_file, random_state=42):
+@pytest.fixture
+def tiny_fasta_file(tmp_path):
+    fasta_file = tmp_path / "tiny_fasta.fasta"
+    with fasta_file.open("w+") as fasta_ref:
+        fasta_ref.write(
+            ">foo\nMEAPAQLLFLLLLWLPDTTREIVMTQSPPTLSLSPGERVTLSCRASQSVSSSYLTWYQQKPGQAPRLLIYGASTRATSIPARFSGSGSGTDFTLTISSLQPEDFAVYYCQQDYNLP"
+        )
+
+    return fasta_file
+
+
+@pytest.fixture
+def mgf_medium(tmp_path):
+    """An MGF file with 7 spectra and scan numbers, C+57.021 mass modification considered"""
+    peptides = [
+        "ATSIPAR",
+        "VTLSCR",
+        "LLIYGASTR",
+        "EIVMTQSPPTLSLSPGER",
+        "MEAPAQLLFLLLLWLPDTTR",
+        "ASQSVSSSYLTWYQQKPGQAPR",
+        "FSGSGSGTDFTLTISSLQPEDFAVYYCQQDYNLP",
+    ]
+    mgf_file = tmp_path / "db_search.mgf"
+    return _create_mgf(peptides, mgf_file, mod_aa_mass={"C": 160.030649})
+
+
+def _create_mgf(peptides, mgf_file, random_state=42, mod_aa_mass=None):
     """
     Create a fake MGF file from one or more peptides.
 
@@ -28,20 +55,25 @@ def _create_mgf(peptides, mgf_file, random_state=42):
         The MGF file to create.
     random_state : int or numpy.random.Generator, optional
         The random seed. The charge states are chosen to be 2 or 3 randomly.
+    mod_aa_mass : dict, optional
+        A dictionary that specifies the modified masses of amino acids.
+        e.g. {"C": 160.030649} for carbamidomethylated C.
 
     Returns
     -------
     mgf_file : Path
     """
     rng = np.random.default_rng(random_state)
-    entries = [_create_mgf_entry(p, rng.choice([2, 3])) for p in peptides]
+    entries = [
+        _create_mgf_entry(p, rng.choice([2, 3]), mod_aa_mass) for p in peptides
+    ]
     with mgf_file.open("w+") as mgf_ref:
         mgf_ref.write("\n".join(entries))
 
     return mgf_file
 
 
-def _create_mgf_entry(peptide, charge=2):
+def _create_mgf_entry(peptide, charge=2, mod_aa_mass=None):
     """
     Create a MassIVE-KB style MGF entry for a single PSM.
 
@@ -51,13 +83,20 @@ def _create_mgf_entry(peptide, charge=2):
         A peptide sequence.
     charge : int, optional
         The peptide charge state.
+    mod_aa_mass : dict, optional
+        A dictionary that specifies the modified masses of amino acids.
 
     Returns
     -------
     str
         The PSM entry in an MGF file format.
     """
-    precursor_mz = calculate_mass(peptide, charge=int(charge))
+    if mod_aa_mass is None:
+        precursor_mz = calculate_mass(peptide, charge=int(charge))
+    else:
+        aa_mass = std_aa_mass
+        aa_mass.update(mod_aa_mass)
+        precursor_mz = fast_mass(peptide, charge=int(charge), aa_mass=aa_mass)
     mzs, intensities = _peptide_to_peaks(peptide, charge)
     frags = "\n".join([f"{m} {i}" for m, i in zip(mzs, intensities)])
 
@@ -202,6 +241,11 @@ def tiny_config(tmp_path):
         "precursor_mass_tol": 5,
         "isotope_error_range": [0, 1],
         "min_peptide_len": 6,
+        "max_peptide_len": 100,
+        "enzyme": "trypsin",
+        "digestion": "full",
+        "missed_cleavages": 0,
+        "max_mods": None,
         "predict_batch_size": 1024,
         "n_beams": 1,
         "top_match": 1,
@@ -219,7 +263,6 @@ def tiny_config(tmp_path):
         "dim_model": 512,
         "dropout": 0.0,
         "dim_intensity": None,
-        "max_length": 100,
         "learning_rate": 5e-4,
         "weight_decay": 1e-5,
         "train_batch_size": 32,
@@ -254,6 +297,11 @@ def tiny_config(tmp_path):
             "-17.027": -17.026549,
             "+43.006-17.027": 25.980265,
         },
+        "allowed_fixed_mods": "C:C+57.021",
+        "allowed_var_mods": (
+            "M:M+15.995,N:N+0.984,Q:Q+0.984,"
+            "nterm:+42.011,nterm:+43.006,nterm:-17.027,nterm:+43.006-17.027"
+        ),
     }
 
     cfg_file = tmp_path / "config.yml"
@@ -264,75 +312,36 @@ def tiny_config(tmp_path):
 
 
 @pytest.fixture
-def mgf_small_unannotated(tmp_path):
-    """An MGF file with 2 unannotated spectra and scan numbers."""
-    peptides = ["LESLIEK", "PEPTIDEK", "LESTIEK"]
-    mgf_file = tmp_path / "small_unannotated.mgf"
-    return _create_unannotated_mgf(peptides, mgf_file)
-
-
-def _create_unannotated_mgf(peptides, mgf_file, random_state=999):
-    """
-    Create a fake MGF file from one or more peptides.
-    This file will have no SEQ= parameter, but will have a SCANS= parameter.
-
-    Parameters
-    ----------
-    peptides : str or list of str
-        The peptides for which to create spectra.
-    mgf_file : Path
-        The MGF file to create.
-    random_state : int or numpy.random.Generator, optional
-        The random seed. The charge states are chosen to be 2 or 3 randomly.
-
-    Returns
-    -------
-    mgf_file : Path
-    """
-    rng = np.random.default_rng(random_state)
-    entries = [
-        _create_unannotated_mgf_entry(p, idx, rng.choice([2, 3]))
-        for idx, p in enumerate(peptides)
-    ]
-    with mgf_file.open("w+") as mgf_ref:
-        mgf_ref.write("\n".join(entries))
-
-    return mgf_file
-
-
-def _create_unannotated_mgf_entry(peptide, scan_num, charge):
-    """
-    Create a MassIVE-KB style MGF entry for a single PSM.
-    Each entry will have no SEQ= parameter, but will have a SCANS= parameter.
-
-    Parameters
-    ----------
-    peptide : str
-        A peptide sequence.
-    scan_num : int
-        The scan number.
-    charge : int, optional
-        The peptide charge state.
-
-    Returns
-    -------
-    str
-        The PSM entry in an MGF file format.
-    """
-    precursor_mz = calculate_mass(peptide, charge=int(charge))
-    mzs, intensities = _peptide_to_peaks(peptide, charge)
-    frags = "\n".join([f"{m} {i}" for m, i in zip(mzs, intensities)])
-
-    mgf = [
-        "BEGIN IONS",
-        f"TITLE=title::{scan_num}",
-        f"PEPMASS={precursor_mz}",
-        f"CHARGE={charge}+",
-        f"SCANS={scan_num}",
-        f"{frags}",
-        "END IONS",
-    ]
-    return "\n".join(mgf)
+def residues_dict():
+    return {
+        "G": 57.021464,
+        "A": 71.037114,
+        "S": 87.032028,
+        "P": 97.052764,
+        "V": 99.068414,
+        "T": 101.047670,
+        "C+57.021": 160.030649,
+        "L": 113.084064,
+        "I": 113.084064,
+        "N": 114.042927,
+        "D": 115.026943,
+        "Q": 128.058578,
+        "K": 128.094963,
+        "E": 129.042593,
+        "M": 131.040485,
+        "H": 137.058912,
+        "F": 147.068414,
+        "R": 156.101111,
+        "Y": 163.063329,
+        "W": 186.079313,
+        "M+15.995": 147.035400,
+        "N+0.984": 115.026943,
+        "Q+0.984": 129.042594,
+        "+42.011": 42.010565,
+        "+43.006": 43.005814,
+        "-17.027": -17.026549,
+        "+43.006-17.027": 25.980265,
+    }
 
 
 @pytest.fixture
diff --git a/tests/test_integration.py b/tests/test_integration.py
index 60e3977b..4275d792 100644
--- a/tests/test_integration.py
+++ b/tests/test_integration.py
@@ -7,50 +7,8 @@
 from casanovo import casanovo
 
 
-def test_annotate(mgf_small_unannotated, tide_dir_small, tmp_path):
-
-    # Run a command:
-    run = functools.partial(
-        CliRunner().invoke, casanovo.main, catch_exceptions=False
-    )
-
-    annotate_args = [
-        "annotate",
-        str(mgf_small_unannotated),
-        str(tide_dir_small),
-        "--output",
-        str(tmp_path / "annotated_mgf.mgf"),
-    ]
-
-    result = run(annotate_args)
-
-    assert result.exit_code == 0
-    assert (tmp_path / "annotated_mgf.mgf").exists()
-
-    # Read in the annotated file
-    with open(tmp_path / "annotated_mgf.mgf") as f:
-        annotated_lines = f.readlines()
-
-    # Get each SEQ= line
-    seq_lines = [line for line in annotated_lines if line.startswith("SEQ=")]
-    assert len(seq_lines) == 3
-    assert (
-        seq_lines[0].strip()
-        == "SEQ=LESLIEK,PEPTIDEK,decoy_KEILSEL,decoy_KEDITEPP"
-    )
-    assert (
-        seq_lines[1].strip()
-        == "SEQ=LESLIEK,PEPTIDEK,decoy_KEILSEL,decoy_KEDITEPP"
-    )
-    assert (
-        seq_lines[2].strip() == "SEQ=+42.011LEM+15.995SLIM+15.995EK,"
-        "+43.006PEN+0.984PTIQ+0.984DEK,decoy_-17.027KM+15.995EILSEL,"
-        "decoy_+43.006-17.027KEDITEPP,decoy_KEDIQ+0.984TEPPQ+0.984"
-    )
-
-
 def test_db_search(
-    mgf_small_unannotated, tide_dir_small, tiny_config, tmp_path, monkeypatch
+    mgf_medium, tiny_fasta_file, tiny_config, tmp_path, monkeypatch
 ):
     # Run a command:
     monkeypatch.setattr(casanovo, "__version__", "4.1.0")
@@ -58,30 +16,16 @@ def test_db_search(
         CliRunner().invoke, casanovo.main, catch_exceptions=False
     )
 
-    annotate_args = [
-        "annotate",
-        str(mgf_small_unannotated),
-        str(tide_dir_small),
-        "--output",
-        str(tmp_path / "annotated_mgf.mgf"),
-    ]
-
-    result = run(annotate_args)
-
-    assert result.exit_code == 0
-    assert (tmp_path / "annotated_mgf.mgf").exists()
-
-    # Follow up annotate run with db search
-
     output_path = tmp_path / "db_search.mztab"
 
     search_args = [
         "db-search",
-        str(tmp_path / "annotated_mgf.mgf"),
         "--config",
         tiny_config,
         "--output",
         str(output_path),
+        str(mgf_medium),
+        str(tiny_fasta_file),
     ]
 
     result = run(search_args)
@@ -94,34 +38,13 @@ def test_db_search(
 
     psms = mztab.spectrum_match_table
     assert list(psms.sequence) == [
-        "LESLIEK",
-        "PEPTIDEK",
-        "KEILSEL",
-        "KEDITEPP",
-        "LESLIEK",
-        "PEPTIDEK",
-        "KEILSEL",
-        "KEDITEPP",
-        "+42.011LEM+15.995SLIM+15.995EK",
-        "+43.006PEN+0.984PTIQ+0.984DEK",
-        "-17.027KM+15.995EILSEL",
-        "+43.006-17.027KEDITEPP",
-        "KEDIQ+0.984TEPPQ+0.984",
-    ]
-    assert list(psms["opt_cv_MS:1002217_decoy_peptide"]) == [
-        "True",
-        "True",
-        "False",
-        "False",
-        "True",
-        "True",
-        "False",
-        "False",
-        "True",
-        "True",
-        "False",
-        "False",
-        "False",
+        "ATSIPAR",
+        "VTLSC+57.021R",
+        "LLIYGASTR",
+        "EIVMTQSPPTLSLSPGER",
+        "MEAPAQLLFLLLLWLPDTTR",
+        "ASQSVSSSYLTWYQQKPGQAPR",
+        "FSGSGSGTDFTLTISSLQPEDFAVYYC+57.021QQDYNLP",
     ]
 
 
diff --git a/tests/unit_tests/test_unit.py b/tests/unit_tests/test_unit.py
index ec9085c0..a0b0935d 100644
--- a/tests/unit_tests/test_unit.py
+++ b/tests/unit_tests/test_unit.py
@@ -2,18 +2,20 @@
 import heapq
 import os
 import platform
+import re
 import shutil
 import tempfile
 
 import einops
 import github
 import numpy as np
+import pandas as pd
 import pytest
 import torch
 
 from casanovo import casanovo
 from casanovo import utils
-from casanovo.data import ms_io
+from casanovo.data import db_utils, ms_io
 from casanovo.data.datasets import SpectrumDataset, AnnotatedSpectrumDataset
 from casanovo.denovo.evaluate import aa_match_batch, aa_match_metrics
 from casanovo.denovo.model import Spec2Pep, _aa_pep_score, _calc_match_score
@@ -219,6 +221,666 @@ def test_calc_match_score():
     assert np.sum(masked_per_aa_scores.numpy()[3]) == 3
 
 
+def test_digest_fasta_cleave(tiny_fasta_file, residues_dict):
+
+    # No missed cleavages
+    expected_normal = [
+        "ATSIPAR",
+        "VTLSC+57.021R",
+        "LLIYGASTR",
+        "EIVMTQSPPTLSLSPGER",
+        "MEAPAQLLFLLLLWLPDTTR",
+        "ASQSVSSSYLTWYQQKPGQAPR",
+        "FSGSGSGTDFTLTISSLQPEDFAVYYC+57.021QQDYNLP",
+    ]
+
+    # 1 missed cleavage
+    expected_1missedcleavage = [
+        "ATSIPAR",
+        "VTLSC+57.021R",
+        "LLIYGASTR",
+        "LLIYGASTRATSIPAR",
+        "EIVMTQSPPTLSLSPGER",
+        "MEAPAQLLFLLLLWLPDTTR",
+        "ASQSVSSSYLTWYQQKPGQAPR",
+        "EIVMTQSPPTLSLSPGERVTLSC+57.021R",
+        "VTLSC+57.021RASQSVSSSYLTWYQQKPGQAPR",
+        "ASQSVSSSYLTWYQQKPGQAPRLLIYGASTR",
+        "FSGSGSGTDFTLTISSLQPEDFAVYYC+57.021QQDYNLP",
+        "MEAPAQLLFLLLLWLPDTTREIVMTQSPPTLSLSPGER",
+        "ATSIPARFSGSGSGTDFTLTISSLQPEDFAVYYC+57.021QQDYNLP",
+    ]
+
+    # 3 missed cleavages
+    expected_3missedcleavage = [
+        "ATSIPAR",
+        "VTLSC+57.021R",
+        "LLIYGASTR",
+        "LLIYGASTRATSIPAR",
+        "EIVMTQSPPTLSLSPGER",
+        "MEAPAQLLFLLLLWLPDTTR",
+        "ASQSVSSSYLTWYQQKPGQAPR",
+        "EIVMTQSPPTLSLSPGERVTLSC+57.021R",
+        "VTLSC+57.021RASQSVSSSYLTWYQQKPGQAPR",
+        "ASQSVSSSYLTWYQQKPGQAPRLLIYGASTR",
+        "FSGSGSGTDFTLTISSLQPEDFAVYYC+57.021QQDYNLP",
+        "ASQSVSSSYLTWYQQKPGQAPRLLIYGASTRATSIPAR",
+        "VTLSC+57.021RASQSVSSSYLTWYQQKPGQAPRLLIYGASTR",
+        "MEAPAQLLFLLLLWLPDTTREIVMTQSPPTLSLSPGER",
+        "ATSIPARFSGSGSGTDFTLTISSLQPEDFAVYYC+57.021QQDYNLP",
+        "VTLSC+57.021RASQSVSSSYLTWYQQKPGQAPRLLIYGASTRATSIPAR",
+        "MEAPAQLLFLLLLWLPDTTREIVMTQSPPTLSLSPGERVTLSC+57.021R",
+        "EIVMTQSPPTLSLSPGERVTLSC+57.021RASQSVSSSYLTWYQQKPGQAPR",
+        "LLIYGASTRATSIPARFSGSGSGTDFTLTISSLQPEDFAVYYC+57.021QQDYNLP",
+    ]
+    for missed_cleavages, expected in zip(
+        (0, 1, 3),
+        (expected_normal, expected_1missedcleavage, expected_3missedcleavage),
+    ):
+        pdb = db_utils.ProteinDatabase(
+            fasta_path=str(tiny_fasta_file),
+            enzyme="trypsin",
+            digestion="full",
+            missed_cleavages=missed_cleavages,
+            min_peptide_len=6,
+            max_peptide_len=50,
+            max_mods=0,
+            precursor_tolerance=20,
+            isotope_error=[0, 0],
+            allowed_fixed_mods="C:C+57.021",
+            allowed_var_mods=(
+                "M:M+15.995,N:N+0.984,Q:Q+0.984,"
+                "nterm:+42.011,nterm:+43.006,nterm:-17.027,nterm:+43.006-17.027"
+            ),
+            residues=residues_dict,
+        )
+        peptide_list = list(pdb.db_peptides["peptide"])
+        assert peptide_list == expected
+
+
+def test_digest_fasta_mods(tiny_fasta_file, residues_dict):
+    # 1 modification allowed
+    # fixed: C+57.02146
+    # variable: 1M+15.994915,1N+0.984016,1Q+0.984016
+    # nterm: 1X+42.010565,1X+43.005814,1X-17.026549,1X+25.980265
+    expected_1mod = [
+        "-17.027ATSIPAR",
+        "ATSIPAR",
+        "-17.027VTLSC+57.021R",
+        "VTLSC+57.021R",
+        "+43.006-17.027ATSIPAR",
+        "+42.011ATSIPAR",
+        "+43.006ATSIPAR",
+        "+43.006-17.027VTLSC+57.021R",
+        "+42.011VTLSC+57.021R",
+        "+43.006VTLSC+57.021R",
+        "-17.027LLIYGASTR",
+        "LLIYGASTR",
+        "+43.006-17.027LLIYGASTR",
+        "+42.011LLIYGASTR",
+        "+43.006LLIYGASTR",
+        "-17.027EIVMTQSPPTLSLSPGER",
+        "EIVMTQSPPTLSLSPGER",
+        "EIVMTQ+0.984SPPTLSLSPGER",
+        "EIVM+15.995TQSPPTLSLSPGER",
+        "+43.006-17.027EIVMTQSPPTLSLSPGER",
+        "+42.011EIVMTQSPPTLSLSPGER",
+        "+43.006EIVMTQSPPTLSLSPGER",
+        "-17.027MEAPAQLLFLLLLWLPDTTR",
+        "-17.027M+15.995EAPAQLLFLLLLWLPDTTR",  #
+        "MEAPAQLLFLLLLWLPDTTR",
+        "MEAPAQ+0.984LLFLLLLWLPDTTR",
+        "M+15.995EAPAQLLFLLLLWLPDTTR",
+        "+43.006-17.027MEAPAQLLFLLLLWLPDTTR",
+        "+43.006-17.027M+15.995EAPAQLLFLLLLWLPDTTR",  #
+        "+42.011MEAPAQLLFLLLLWLPDTTR",
+        "+43.006MEAPAQLLFLLLLWLPDTTR",
+        "+42.011M+15.995EAPAQLLFLLLLWLPDTTR",  #
+        "+43.006M+15.995EAPAQLLFLLLLWLPDTTR",  #
+        "-17.027ASQSVSSSYLTWYQQKPGQAPR",
+        "ASQSVSSSYLTWYQQKPGQAPR",
+        "ASQ+0.984SVSSSYLTWYQQKPGQAPR",
+        "ASQSVSSSYLTWYQ+0.984QKPGQAPR",
+        "ASQSVSSSYLTWYQQ+0.984KPGQAPR",
+        "ASQSVSSSYLTWYQQKPGQ+0.984APR",
+        "+43.006-17.027ASQSVSSSYLTWYQQKPGQAPR",
+        "+42.011ASQSVSSSYLTWYQQKPGQAPR",
+        "+43.006ASQSVSSSYLTWYQQKPGQAPR",
+        "-17.027FSGSGSGTDFTLTISSLQPEDFAVYYC+57.021QQDYNLP",
+        "FSGSGSGTDFTLTISSLQPEDFAVYYC+57.021QQDYNLP",
+        "FSGSGSGTDFTLTISSLQ+0.984PEDFAVYYC+57.021QQDYNLP",
+        "FSGSGSGTDFTLTISSLQPEDFAVYYC+57.021Q+0.984QDYNLP",
+        "FSGSGSGTDFTLTISSLQPEDFAVYYC+57.021QQ+0.984DYNLP",
+        "FSGSGSGTDFTLTISSLQPEDFAVYYC+57.021QQDYN+0.984LP",
+        "+43.006-17.027FSGSGSGTDFTLTISSLQPEDFAVYYC+57.021QQDYNLP",
+        "+42.011FSGSGSGTDFTLTISSLQPEDFAVYYC+57.021QQDYNLP",
+        "+43.006FSGSGSGTDFTLTISSLQPEDFAVYYC+57.021QQDYNLP",
+    ]
+    pdb = db_utils.ProteinDatabase(
+        fasta_path=str(tiny_fasta_file),
+        enzyme="trypsin",
+        digestion="full",
+        missed_cleavages=0,
+        min_peptide_len=6,
+        max_peptide_len=50,
+        max_mods=1,
+        precursor_tolerance=20,
+        isotope_error=[0, 0],
+        allowed_fixed_mods="C:C+57.021",
+        allowed_var_mods=(
+            "M:M+15.995,N:N+0.984,Q:Q+0.984,"
+            "nterm:+42.011,nterm:+43.006,nterm:-17.027,nterm:+43.006-17.027"
+        ),
+        residues=residues_dict,
+    )
+    peptide_list = list(pdb.db_peptides["peptide"])
+    assert peptide_list == expected_1mod
+
+
+def test_length_restrictions(tiny_fasta_file, residues_dict):
+    # length between 20 and 50
+    expected_long = [
+        "MEAPAQLLFLLLLWLPDTTR",
+        "ASQSVSSSYLTWYQQKPGQAPR",
+        "FSGSGSGTDFTLTISSLQPEDFAVYYC+57.021QQDYNLP",
+    ]
+
+    # length between 6 and 8
+    expected_short = ["ATSIPAR", "VTLSC+57.021R"]
+
+    pdb = db_utils.ProteinDatabase(
+        fasta_path=str(tiny_fasta_file),
+        enzyme="trypsin",
+        digestion="full",
+        missed_cleavages=0,
+        min_peptide_len=20,
+        max_peptide_len=50,
+        max_mods=0,
+        precursor_tolerance=20,
+        isotope_error=[0, 0],
+        allowed_fixed_mods="C:C+57.021",
+        allowed_var_mods=(
+            "M:M+15.995,N:N+0.984,Q:Q+0.984,"
+            "nterm:+42.011,nterm:+43.006,nterm:-17.027,nterm:+43.006-17.027"
+        ),
+        residues=residues_dict,
+    )
+    peptide_list = list(pdb.db_peptides["peptide"])
+    assert peptide_list == expected_long
+
+    pdb = db_utils.ProteinDatabase(
+        fasta_path=str(tiny_fasta_file),
+        enzyme="trypsin",
+        digestion="full",
+        missed_cleavages=0,
+        min_peptide_len=6,
+        max_peptide_len=8,
+        max_mods=0,
+        precursor_tolerance=20,
+        isotope_error=[0, 0],
+        allowed_fixed_mods="C:C+57.021",
+        allowed_var_mods=(
+            "M:M+15.995,N:N+0.984,Q:Q+0.984,"
+            "nterm:+42.011,nterm:+43.006,nterm:-17.027,nterm:+43.006-17.027"
+        ),
+        residues=residues_dict,
+    )
+    peptide_list = list(pdb.db_peptides["peptide"])
+    assert peptide_list == expected_short
+
+
+def test_digest_fasta_enzyme(tiny_fasta_file, residues_dict):
+    # arg-c enzyme
+    expected_argc = [
+        "ATSIPAR",
+        "VTLSC+57.021R",
+        "LLIYGASTR",
+        "EIVMTQSPPTLSLSPGER",
+        "MEAPAQLLFLLLLWLPDTTR",
+        "ASQSVSSSYLTWYQQKPGQAPR",
+        "FSGSGSGTDFTLTISSLQPEDFAVYYC+57.021QQDYNLP",
+    ]
+
+    # asp-n enzyme
+    expected_aspn = ["DFAVYYC+57.021QQ", "DFTLTISSLQPE", "MEAPAQLLFLLLLWLP"]
+
+    expected_semispecific = [
+        "FSGSGS",
+        "ATSIPA",
+        "ASQSVS",
+        "PGQAPR",
+        "TSIPAR",
+        "MEAPAQ",
+        "LLIYGA",
+        "YGASTR",
+        "LSPGER",
+        "LPDTTR",
+        "EIVMTQ",
+        "VTLSC+57.021R",
+        "QDYNLP",
+    ]
+
+    expected_nonspecific = [
+        "SGSGSG",
+        "GSGSGT",
+        "SGSGTD",
+        "FSGSGS",
+        "ATSIPA",
+        "GASTRA",
+        "LSLSPG",
+        "ASQSVS",
+        "GSGTDF",
+        "SLSPGE",
+        "QSVSSS",
+        "SQSVSS",
+        "KPGQAP",
+        "SPPTLS",
+        "ASTRAT",
+        "RFSGSG",
+        "IYGAST",
+        "APAQLL",
+        "PTLSLS",
+        "TLSLSP",
+        "TLTISS",
+        "STRATS",
+        "LIYGAS",
+        "ARFSGS",
+        "PGQAPR",
+        "SGTDFT",
+        "PPTLSL",
+        "EAPAQL",
+        "QKPGQA",
+        "SVSSSY",
+        "TQSPPT",
+        "LTISSL",
+        "PARFSG",
+        "GQAPRL",
+        "QSPPTL",
+        "SPGERV",
+        "ISSLQP",
+        "RATSIP",
+        "TSIPAR",
+        "MEAPAQ",
+        "RASQSV",
+        "TISSLQ",
+        "TRATSI",
+        "LLIYGA",
+        "GTDFTL",
+        "YGASTR",
+        "VSSSYL",
+        "SSSYLT",
+        "LSPGER",
+        "PGERVT",
+        "MTQSPP",
+        "SSLQPE",
+        "VMTQSP",
+        "GERVTL",
+        "PEDFAV",
+        "IVMTQS",
+        "FTLTIS",
+        "APRLLI",
+        "QQKPGQ",
+        "SLQPED",
+        "PAQLLF",
+        "IPARFS",
+        "SIPARF",
+        "LSC+57.021RAS",
+        "TDFTLT",
+        "QAPRLL",
+        "LPDTTR",
+        "ERVTLS",
+        "AQLLFL",
+        "QPEDFA",
+        "TLSC+57.021RA",
+        "C+57.021RASQS",
+        "SC+57.021RASQ",
+        "DFTLTI",
+        "PDTTRE",
+        "TTREIV",
+        "EIVMTQ",
+        "YQQKPG",
+        "LFLLLL",
+        "LLFLLL",
+        "WLPDTT",
+        "DTTREI",
+        "RLLIYG",
+        "RVTLSC+57.021",
+        "VTLSC+57.021R",
+        "EDFAVY",
+        "LWLPDT",
+        "QLLFLL",
+        "LQPEDF",
+        "REIVMT",
+        "TREIVM",
+        "QDYNLP",
+        "LLLWLP",
+        "SSYLTW",
+        "LLWLPD",
+        "LLLLWL",
+        "PRLLIY",
+        "DFAVYY",
+        "QQDYNL",
+        "AVYYC+57.021Q",
+        "FLLLLW",
+        "FAVYYC+57.021",
+        "C+57.021QQDYN",
+        "SYLTWY",
+        "LTWYQQ",
+        "WYQQKP",
+        "TWYQQK",
+        "VYYC+57.021QQ",
+        "YLTWYQ",
+        "YC+57.021QQDY",
+        "YYC+57.021QQD",
+    ]
+
+    pdb = db_utils.ProteinDatabase(
+        fasta_path=str(tiny_fasta_file),
+        enzyme="arg-c",
+        digestion="full",
+        missed_cleavages=0,
+        min_peptide_len=6,
+        max_peptide_len=50,
+        max_mods=0,
+        precursor_tolerance=20,
+        isotope_error=[0, 0],
+        allowed_fixed_mods="C:C+57.021",
+        allowed_var_mods=(
+            "M:M+15.995,N:N+0.984,Q:Q+0.984,"
+            "nterm:+42.011,nterm:+43.006,nterm:-17.027,nterm:+43.006-17.027"
+        ),
+        residues=residues_dict,
+    )
+    peptide_list = list(pdb.db_peptides["peptide"])
+    assert peptide_list == expected_argc
+
+    pdb = db_utils.ProteinDatabase(
+        fasta_path=str(tiny_fasta_file),
+        enzyme="asp-n",
+        digestion="full",
+        missed_cleavages=0,
+        min_peptide_len=6,
+        max_peptide_len=50,
+        max_mods=0,
+        precursor_tolerance=20,
+        isotope_error=[0, 0],
+        allowed_fixed_mods="C:C+57.021",
+        allowed_var_mods=(
+            "M:M+15.995,N:N+0.984,Q:Q+0.984,"
+            "nterm:+42.011,nterm:+43.006,nterm:-17.027,nterm:+43.006-17.027"
+        ),
+        residues=residues_dict,
+    )
+    peptide_list = list(pdb.db_peptides["peptide"])
+    assert peptide_list == expected_aspn
+
+    # Test regex rule instead of named enzyme
+    pdb = db_utils.ProteinDatabase(
+        fasta_path=str(tiny_fasta_file),
+        enzyme="R",
+        digestion="full",
+        missed_cleavages=0,
+        min_peptide_len=6,
+        max_peptide_len=50,
+        max_mods=0,
+        precursor_tolerance=20,
+        isotope_error=[0, 0],
+        allowed_fixed_mods="C:C+57.021",
+        allowed_var_mods=(
+            "M:M+15.995,N:N+0.984,Q:Q+0.984,"
+            "nterm:+42.011,nterm:+43.006,nterm:-17.027,nterm:+43.006-17.027"
+        ),
+        residues=residues_dict,
+    )
+    peptide_list = list(pdb.db_peptides["peptide"])
+    assert peptide_list == expected_argc
+
+    # Test semispecific digest
+    pdb = db_utils.ProteinDatabase(
+        fasta_path=str(tiny_fasta_file),
+        enzyme="trypsin",
+        digestion="partial",
+        missed_cleavages=0,
+        min_peptide_len=6,
+        max_peptide_len=6,
+        max_mods=0,
+        precursor_tolerance=10000,
+        isotope_error=[0, 0],
+        allowed_fixed_mods="C:C+57.021",
+        allowed_var_mods=(
+            "M:M+15.995,N:N+0.984,Q:Q+0.984,"
+            "nterm:+42.011,nterm:+43.006,nterm:-17.027,nterm:+43.006-17.027"
+        ),
+        residues=residues_dict,
+    )
+    peptide_list = list(pdb.db_peptides["peptide"])
+    assert peptide_list == expected_semispecific
+
+    # Test nonspecific digest
+    pdb = db_utils.ProteinDatabase(
+        fasta_path=str(tiny_fasta_file),
+        enzyme="trypsin",
+        digestion="non-specific",
+        missed_cleavages=0,
+        min_peptide_len=6,
+        max_peptide_len=6,
+        max_mods=0,
+        precursor_tolerance=10000,
+        isotope_error=[0, 0],
+        allowed_fixed_mods="C:C+57.021",
+        allowed_var_mods=(
+            "M:M+15.995,N:N+0.984,Q:Q+0.984,"
+            "nterm:+42.011,nterm:+43.006,nterm:-17.027,nterm:+43.006-17.027"
+        ),
+        residues=residues_dict,
+    )
+    peptide_list = list(pdb.db_peptides["peptide"])
+    assert peptide_list == expected_nonspecific
+
+
+def test_get_candidates(tiny_fasta_file, residues_dict):
+    # precursor_window is 10000
+    expected_smallwindow = ["LLIYGASTR"]
+
+    # precursor window is 150000
+    expected_midwindow = ["LLIYGASTR"]
+
+    # precursor window is 600000
+    expected_widewindow = ["ATSIPAR", "VTLSC+57.021R", "LLIYGASTR"]
+
+    pdb = db_utils.ProteinDatabase(
+        fasta_path=str(tiny_fasta_file),
+        enzyme="trypsin",
+        digestion="full",
+        missed_cleavages=1,
+        min_peptide_len=6,
+        max_peptide_len=50,
+        max_mods=0,
+        precursor_tolerance=10000,
+        isotope_error=[0, 0],
+        allowed_fixed_mods="C:C+57.021",
+        allowed_var_mods=(
+            "M:M+15.995,N:N+0.984,Q:Q+0.984,"
+            "nterm:+42.011,nterm:+43.006,nterm:-17.027,nterm:+43.006-17.027"
+        ),
+        residues=residues_dict,
+    )
+    candidates = pdb.get_candidates(precursor_mz=496.2, charge=2)
+    assert expected_smallwindow == list(candidates)
+
+    pdb = db_utils.ProteinDatabase(
+        fasta_path=str(tiny_fasta_file),
+        enzyme="trypsin",
+        digestion="full",
+        missed_cleavages=1,
+        min_peptide_len=6,
+        max_peptide_len=50,
+        max_mods=0,
+        precursor_tolerance=150000,
+        isotope_error=[0, 0],
+        allowed_fixed_mods="C:C+57.021",
+        allowed_var_mods=(
+            "M:M+15.995,N:N+0.984,Q:Q+0.984,"
+            "nterm:+42.011,nterm:+43.006,nterm:-17.027,nterm:+43.006-17.027"
+        ),
+        residues=residues_dict,
+    )
+    candidates = pdb.get_candidates(precursor_mz=496.2, charge=2)
+    assert expected_midwindow == list(candidates)
+
+    pdb = db_utils.ProteinDatabase(
+        fasta_path=str(tiny_fasta_file),
+        enzyme="trypsin",
+        digestion="full",
+        missed_cleavages=1,
+        min_peptide_len=6,
+        max_peptide_len=50,
+        max_mods=0,
+        precursor_tolerance=600000,
+        isotope_error=[0, 0],
+        allowed_fixed_mods="C:C+57.021",
+        allowed_var_mods=(
+            "M:M+15.995,N:N+0.984,Q:Q+0.984,"
+            "nterm:+42.011,nterm:+43.006,nterm:-17.027,nterm:+43.006-17.027"
+        ),
+        residues=residues_dict,
+    )
+    candidates = pdb.get_candidates(precursor_mz=496.2, charge=2)
+    assert expected_widewindow == list(candidates)
+
+
+def test_get_candidates_isotope_error(tiny_fasta_file, residues_dict):
+
+    # Tide isotope error windows for 496.2, 2+:
+    # 0: [980.481617, 1000.289326]
+    # 1: [979.491114, 999.278813]
+    # 2: [978.500611, 998.268300]
+    # 3: [977.510108, 997.257787]
+
+    peptide_list = [
+        ("A", 1001, "foo"),
+        ("B", 1000, "foo"),
+        ("C", 999, "foo"),
+        ("D", 998, "foo"),
+        ("E", 997, "foo"),
+        ("F", 996, "foo"),
+        ("G", 995, "foo"),
+        ("H", 994, "foo"),
+        ("I", 993, "foo"),
+        ("J", 992, "foo"),
+        ("K", 991, "foo"),
+        ("L", 990, "foo"),
+        ("M", 989, "foo"),
+        ("N", 988, "foo"),
+        ("O", 987, "foo"),
+        ("P", 986, "foo"),
+        ("Q", 985, "foo"),
+        ("R", 984, "foo"),
+        ("S", 983, "foo"),
+        ("T", 982, "foo"),
+        ("U", 981, "foo"),
+        ("V", 980, "foo"),
+        ("W", 979, "foo"),
+        ("X", 978, "foo"),
+        ("Y", 977, "foo"),
+        ("Z", 976, "foo"),
+    ]
+
+    peptide_list = pd.DataFrame(
+        peptide_list, columns=["peptide", "calc_mass", "protein"]
+    )
+    peptide_list.sort_values("calc_mass", inplace=True)
+
+    expected_isotope0 = list("UTSRQPONMLKJIHGFEDCB")
+    expected_isotope01 = list("VUTSRQPONMLKJIHGFEDCB")
+    expected_isotope012 = list("WVUTSRQPONMLKJIHGFEDCB")
+    expected_isotope0123 = list("XWVUTSRQPONMLKJIHGFEDCB")
+
+    pdb = db_utils.ProteinDatabase(
+        fasta_path=str(tiny_fasta_file),
+        enzyme="trypsin",
+        digestion="full",
+        missed_cleavages=0,
+        min_peptide_len=0,
+        max_peptide_len=0,
+        max_mods=0,
+        precursor_tolerance=10000,
+        isotope_error=[0, 0],
+        allowed_fixed_mods="C:C+57.021",
+        allowed_var_mods=(
+            "M:M+15.995,N:N+0.984,Q:Q+0.984,"
+            "nterm:+42.011,nterm:+43.006,nterm:-17.027,nterm:+43.006-17.027"
+        ),
+        residues=residues_dict,
+    )
+    pdb.db_peptides = peptide_list
+    candidates = pdb.get_candidates(precursor_mz=496.2, charge=2)
+    assert expected_isotope0 == list(candidates)
+
+    pdb = db_utils.ProteinDatabase(
+        fasta_path=str(tiny_fasta_file),
+        enzyme="trypsin",
+        digestion="full",
+        missed_cleavages=0,
+        min_peptide_len=0,
+        max_peptide_len=0,
+        max_mods=0,
+        precursor_tolerance=10000,
+        isotope_error=[0, 1],
+        allowed_fixed_mods="C:C+57.021",
+        allowed_var_mods=(
+            "M:M+15.995,N:N+0.984,Q:Q+0.984,"
+            "nterm:+42.011,nterm:+43.006,nterm:-17.027,nterm:+43.006-17.027"
+        ),
+        residues=residues_dict,
+    )
+    pdb.db_peptides = peptide_list
+    candidates = pdb.get_candidates(precursor_mz=496.2, charge=2)
+    assert expected_isotope01 == list(candidates)
+
+    pdb = db_utils.ProteinDatabase(
+        fasta_path=str(tiny_fasta_file),
+        enzyme="trypsin",
+        digestion="full",
+        missed_cleavages=0,
+        min_peptide_len=0,
+        max_peptide_len=0,
+        max_mods=0,
+        precursor_tolerance=10000,
+        isotope_error=[0, 2],
+        allowed_fixed_mods="C:C+57.021",
+        allowed_var_mods=(
+            "M:M+15.995,N:N+0.984,Q:Q+0.984,"
+            "nterm:+42.011,nterm:+43.006,nterm:-17.027,nterm:+43.006-17.027"
+        ),
+        residues=residues_dict,
+    )
+    pdb.db_peptides = peptide_list
+    candidates = pdb.get_candidates(precursor_mz=496.2, charge=2)
+    assert expected_isotope012 == list(candidates)
+
+    pdb = db_utils.ProteinDatabase(
+        fasta_path=str(tiny_fasta_file),
+        enzyme="trypsin",
+        digestion="full",
+        missed_cleavages=0,
+        min_peptide_len=0,
+        max_peptide_len=0,
+        max_mods=0,
+        precursor_tolerance=10000,
+        isotope_error=[0, 3],
+        allowed_fixed_mods="C:C+57.021",
+        allowed_var_mods=(
+            "M:M+15.995,N:N+0.984,Q:Q+0.984,"
+            "nterm:+42.011,nterm:+43.006,nterm:-17.027,nterm:+43.006-17.027"
+        ),
+        residues=residues_dict,
+    )
+    pdb.db_peptides = peptide_list
+    candidates = pdb.get_candidates(precursor_mz=496.2, charge=2)
+    assert expected_isotope0123 == list(candidates)
+
+
 def test_beam_search_decode():
     """
     Test beam search decoding and its sub-functions.
@@ -229,7 +891,7 @@ def test_beam_search_decode():
 
     # Sizes.
     batch = 1  # B
-    length = model.max_length + 1  # L
+    length = model.max_peptide_len + 1  # L
     vocab = model.decoder.vocab_size + 1  # V
     beam = model.n_beams  # S
     step = 3
@@ -346,12 +1008,12 @@ def test_beam_search_decode():
     assert torch.equal(new_scores[:, step, :], expected_scores)
 
     # Test output if decoding loop isn't stopped with termination of all beams.
-    model.max_length = 0
+    model.max_peptide_len = 0
     # 1 spectrum with 5 peaks (2 values: m/z and intensity).
     spectra = torch.zeros(1, 5, 2)
     precursors = torch.tensor([[469.25364, 2.0, 235.63410]])
     assert len(list(model.beam_search_decode(spectra, precursors))[0]) == 0
-    model.max_length = 100
+    model.max_peptide_len = 100
 
     # Re-initialize scores and tokens to further test caching functionality.
     scores = torch.full(
@@ -511,7 +1173,7 @@ def test_beam_search_decode():
     batch = 2  # B
     beam = model.n_beams  # S
     model.decoder.reverse = True
-    length = model.max_length + 1  # L
+    length = model.max_peptide_len + 1  # L
     vocab = model.decoder.vocab_size + 1  # V
     step = 4
 
@@ -552,7 +1214,7 @@ def test_beam_search_decode():
     batch = 2  # B
     beam = model.n_beams  # S
     model.decoder.reverse = True
-    length = model.max_length + 1  # L
+    length = model.max_peptide_len + 1  # L
     vocab = model.decoder.vocab_size + 1  # V
     step = 4