
Choosing a Proteolytic Enzyme with pepVet
Source:vignettes/articles/enzyme-selection.Rmd
enzyme-selection.RmdWhy enzyme choice is not a formality
Enzyme selection affects which peptides are available to a bottom-up LC-MS/MS workflow. Experimental comparisons have found that using different proteases can change protein identifications and sequence coverage, although the result depends on the sample and method (Swaney et al. 2010).
- It can cut often and produce many peptides below pepVet’s active length window.
- It can cut rarely and leave large regions in long peptides.
- It can shift the digest toward peptide properties that are less suitable for the intended workflow.
pepVet represents those tradeoffs as score components for direct comparison. It does not predict identification. It ranks enzyme options under an explicit set of digest-level assumptions.
A fast comparison workflow
A direct workflow uses a side-by-side enzyme comparison.
enzymes_standard <- c(
"trypsin",
"lysc",
"glutamyl endopeptidase",
"asp-n endopeptidase",
"chymotrypsin-high"
)
comp_bsa <- compare_digests(
bsa_path,
enzymes = enzymes_standard,
missed_cleavages = 1L
)
comp_bsa
#> # A tibble: 5 × 13
#> enzyme protein_id S_length S_coverage S_count S_hydro S_charge composite_score
#> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 tryps… sp|P02769… 0.688 0.997 1 0.769 0.778 0.885
#> 2 gluta… sp|P02769… 0.681 0.936 1 0.802 0.975 0.884
#> 3 lysc sp|P02769… 0.628 0.857 1 0.763 0.776 0.823
#> 4 asp-n… sp|P02769… 0.494 0.529 0.923 0.725 0.925 0.673
#> 5 chymo… sp|P02769… 0.477 0.590 0.840 0.549 0.863 0.642
#> # ℹ 5 more variables: verdict <chr>, median_peptide_length <dbl>,
#> # preset_used <chr>, n_high_efficiency_sites <int>,
#> # n_low_efficiency_sites <int>
digest_report(comp_bsa)
#> pepVet enzyme comparison
#> ------------------------
#> Protein sp|P02769|ALBU_BOVIN Albumin OS=Bos taurus OX=9913 GN=ALB
#> PE=1 SV=4
#> Best score trypsin (0.885, Good)
#> Rank Enzyme S_len S_cov S_cnt S_hyd S_chg Score Verdict
#> -----------------------------------------------------------------------
#> 1 trypsin 0.688 0.997 1.000 0.769 0.778 0.885 Good
#> 2 glutamyl endopeptidase 0.681 0.936 1.000 0.802 0.975 0.884 Good
#> 3 lysc 0.628 0.857 1.000 0.763 0.776 0.823 Good
#> 4 asp-n endopeptidase 0.494 0.529 0.923 0.725 0.925 0.673 Good
#> 5 chymotrypsin-high 0.477 0.590 0.840 0.549 0.863 0.642 ModerateThe comparison table reports each score component alongside the composite.
-
S_lengthshows how much of the digest lands inside the active peptide-length window. -
S_coveragereports the fraction of the parent protein covered by valid peptides. -
S_countuses an enzyme-aware expected peptide length, so trypsin and GluC are not forced into the same denominator. -
S_hydroandS_chargereport the active GRAVY-window fraction and internal basic-residue fraction.
When two enzymes have similar composite scores, inspect the components. One enzyme can have higher coverage while another has a higher length- or GRAVY-window fraction.
Worked examples
Three fixed examples show how the same comparison workflow behaves for a reference protein, a basic protein, and a small isoform set.
Worked example 1: BSA
BSA provides a fixed example for comparing several enzyme rules under one scoring configuration.
comp_bsa[, c("enzyme", "S_length", "S_coverage", "S_count", "composite_score", "verdict")]
#> # A tibble: 5 × 6
#> enzyme S_length S_coverage S_count composite_score verdict
#> <chr> <dbl> <dbl> <dbl> <dbl> <chr>
#> 1 trypsin 0.688 0.997 1 0.885 Good
#> 2 glutamyl endopeptidase 0.681 0.936 1 0.884 Good
#> 3 lysc 0.628 0.857 1 0.823 Good
#> 4 asp-n endopeptidase 0.494 0.529 0.923 0.673 Good
#> 5 chymotrypsin-high 0.477 0.590 0.840 0.642 ModerateThe BSA readout does not identify a universally correct enzyme. It
shows how enzyme choice changes peptide density and the package’s
suitability components under the active settings. In the current
release, S_count uses the observed digest structure instead
of a fixed tryptic expectation.
Cleavage efficiency is not uniform
pepVet also reports sequence-local cleavage-efficiency classes for supported trypsin-family rules.
bsa_sites <- annotate_cleavage_sites(bsa_path, enzyme = "trypsin")
bsa_sites[bsa_sites$position %in% c(140L, 155L, 167L), ]
#> # A tibble: 3 × 5
#> position residue flanking_context efficiency rule_applied
#> <int> <chr> <chr> <chr> <chr>
#> 1 140 K KLKPD low proline_block
#> 2 155 K DEKKF medium adjacent_basic_residues
#> 3 167 R IARRH medium adjacent_basic_residuesOn the shipped BSA fixture, pepVet labels the KP motif at position
140 as low and the adjacent-basic motifs KK at 155 and RR
at 167 as medium. The labels come from local motif rules.
They are not cleavage probabilities.
The current annotation rules use local P1-P1’ sequence context only. They do not model structural accessibility or PTMs and do not replace the digest score.
Missed cleavages change the ranking
comp_mc0 <- compare_digests(
bsa_path,
enzymes = c("trypsin", "lysc"),
missed_cleavages = 0L
)
comp_mc1 <- compare_digests(
bsa_path,
enzymes = c("trypsin", "lysc"),
missed_cleavages = 1L
)
comp_mc0[, c("enzyme", "composite_score", "S_length", "median_peptide_length")]
#> # A tibble: 2 × 4
#> enzyme composite_score S_length median_peptide_length
#> <chr> <dbl> <dbl> <dbl>
#> 1 lysc 0.653 0.623 8
#> 2 trypsin 0.632 0.532 7
comp_mc1[, c("enzyme", "composite_score", "S_length", "median_peptide_length")]
#> # A tibble: 2 × 4
#> enzyme composite_score S_length median_peptide_length
#> <chr> <dbl> <dbl> <dbl>
#> 1 trypsin 0.885 0.688 10
#> 2 lysc 0.823 0.628 13The two tables show how allowing one missed cleavage changes peptide length and the component scores for this BSA example. They do not estimate an experimental missed-cleavage distribution.
Worked example 2: Histone H3.1
Histone H3.1 is a basic protein with a lysine- and arginine-rich N-terminal tail. Trypsin often over-cuts this class of target.
comp_h3 <- compare_digests(
h3_path,
enzymes = c("trypsin", "lysc", "glutamyl endopeptidase", "asp-n endopeptidase")
)
comp_h3
#> # A tibble: 4 × 13
#> enzyme protein_id S_length S_coverage S_count S_hydro S_charge composite_score
#> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 lysc sp|P68431… 0.593 0.735 1 0.625 0.938 0.769
#> 2 tryps… sp|P68431… 0.305 0.632 0.662 0.833 0.833 0.619
#> 3 gluta… sp|P68431… 0.467 0.404 1 0.571 0.714 0.602
#> 4 asp-n… sp|P68431… 0.333 0.404 0.640 1 1 0.578
#> # ℹ 5 more variables: verdict <chr>, median_peptide_length <dbl>,
#> # preset_used <chr>, n_high_efficiency_sites <int>,
#> # n_low_efficiency_sites <int>
digest_report(comp_h3)
#> pepVet enzyme comparison
#> ------------------------
#> Protein sp|P68431|H31_HUMAN Histone H3.1 OS=Homo sapiens OX=9606
#> GN=H3C1 PE=1 SV=2
#> Best score lysc (0.769, Good)
#> Rank Enzyme S_len S_cov S_cnt S_hyd S_chg Score Verdict
#> -----------------------------------------------------------------------
#> 1 lysc 0.593 0.735 1.000 0.625 0.938 0.769 Good
#> 2 trypsin 0.305 0.632 0.662 0.833 0.833 0.619 Moderate
#> 3 glutamyl endopeptidase 0.467 0.404 1.000 0.571 0.714 0.602 Moderate
#> 4 asp-n endopeptidase 0.333 0.404 0.640 1.000 1.000 0.578 ModerateIn this in-silico example, trypsin has weak S_length and
S_coverage, while LysC and the acidic-side enzymes have
higher values for one or both components. This result is specific to the
H3.1 sequence and the active pepVet settings. It does not establish a
preferred enzyme for histone experiments.
Histone workflows often require special digestion strategies because lysine- and arginine-rich sequences can yield many short tryptic products. One established bottom-up method blocks lysine residues before trypsin digestion so that cleavage occurs at arginine (Garcia et al. 2007). Middle-down methods retain longer histone-tail analytes and address a different experimental question (Sidoli et al. 2015).
Worked example 3: Isoform-aware scoring
Alpha-synuclein isoforms are a compact example of when uniqueness matters as much as length and coverage.
syn_proteome <- digest_protein(syn_path, enzyme = "trypsin")
ev_syn <- evaluate_digest(
syn_path,
enzyme = "trypsin",
proteome = syn_proteome,
weights = pepvet_preset("targeted")$weights
)
ev_syn$scores
#> # A tibble: 3 × 13
#> protein_id S_length S_coverage S_count S_hydro S_charge S_unique
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 sp|P37840|SYUA_HUMAN Al… 0.548 0.693 1 0.941 0.706 0
#> 2 sp|P37840-2|SYUA_HUMAN … 0.613 1 1 0.842 0.684 0.105
#> 3 sp|P37840-3|SYUA_HUMAN … 0.519 0.659 1 0.929 0.643 0.214
#> # ℹ 6 more variables: composite_score <dbl>, verdict <chr>,
#> # median_peptide_length <dbl>, preset_used <chr>,
#> # n_high_efficiency_sites <int>, n_low_efficiency_sites <int>For isoform-level work, inspect S_unique against a
relevant comparison proteome rather than relying on a protein-only
composite score.
A practical reading guide
The table maps component patterns to follow-up checks.
| Pattern | Likely issue | Next action |
|---|---|---|
Low S_length, low S_count
|
Few products inside the active length window | Inspect the length distribution, then compare a missed-cleavage setting or another enzyme |
Low S_coverage, moderate S_count
|
Valid peptides leave uncovered regions | Compare an enzyme with different cleavage specificity |
Strong S_length, weak S_hydro
|
Many valid-length peptides fall outside the active GRAVY window | Inspect the GRAVY distribution before changing the window |
Strong core scores, weak S_unique
|
Shared peptides across homologs or isoforms | Supply a proteome digest and use a uniqueness-aware preset |
Special cases
Membrane proteins
For a membrane target, inspect whether hydrophobic regions remain
uncovered under the selected enzyme. Compare other cleavage rules and
the membrane preset only when their resolved assumptions
match the workflow.
Using recommend_enzyme in scripts
recommend_enzyme(
h3_path,
enzymes = c("trypsin", "lysc", "glutamyl endopeptidase")
)
#> [1] "lysc"recommend_enzyme() returns the top enzyme name. If
scores tie within floating-point tolerance, it returns all tied names.
Scripts can use the return value, but it contains no component-level
explanation.
References
Garcia BA, Mollah S, Ueberheide BM, et al. Chemical derivatization of histones for facilitated analysis by mass spectrometry. Nature Protocols. 2007;2:933-938. doi: 10.1038/nprot.2007.106.
Sidoli S, Lin S, Karch KR, Garcia BA. Bottom-Up and Middle-Down Proteomics Have Comparable Accuracies in Defining Histone Post-Translational Modification Relative Abundance and Stoichiometry. Analytical Chemistry. 2015;87(6):3129-3133. doi: 10.1021/acs.analchem.5b00072.
Swaney DL, Wenger CD, Coon JJ. Value of Using Multiple Proteases for Large-Scale Mass Spectrometry-Based Proteomics. Journal of Proteome Research. 2010;9(3):1323-1329. doi: 10.1021/pr900863u.
Session info
sessionInfo()
#> R version 4.6.1 (2026-06-24)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 24.04.4 LTS
#>
#> Matrix products: default
#> BLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
#> LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so; LAPACK version 3.12.0
#>
#> locale:
#> [1] LC_CTYPE=C.UTF-8 LC_NUMERIC=C LC_TIME=C.UTF-8
#> [4] LC_COLLATE=C.UTF-8 LC_MONETARY=C.UTF-8 LC_MESSAGES=C.UTF-8
#> [7] LC_PAPER=C.UTF-8 LC_NAME=C LC_ADDRESS=C
#> [10] LC_TELEPHONE=C LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C
#>
#> time zone: UTC
#> tzcode source: system (glibc)
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> other attached packages:
#> [1] pepVet_0.99.1
#>
#> loaded via a namespace (and not attached):
#> [1] vctrs_0.7.3 crayon_1.5.3 cli_3.6.6
#> [4] knitr_1.51 rlang_1.3.0 xfun_0.60
#> [7] otel_0.2.0 generics_0.1.4 textshaping_1.0.5
#> [10] jsonlite_2.0.0 glue_1.8.1 S4Vectors_0.51.5
#> [13] Biostrings_2.81.5 htmltools_0.5.9 stats4_4.6.1
#> [16] ragg_1.5.2 sass_0.4.10 cleaver_1.51.0
#> [19] rmarkdown_2.31 Seqinfo_1.3.0 tibble_3.3.1
#> [22] evaluate_1.0.5 jquerylib_0.1.4 fastmap_1.2.0
#> [25] IRanges_2.47.2 yaml_2.3.12 lifecycle_1.0.5
#> [28] compiler_4.6.1 fs_2.1.0 pkgconfig_2.0.3
#> [31] XVector_0.53.0 systemfonts_1.3.2 digest_0.6.39
#> [34] R6_2.6.1 utf8_1.2.6 pillar_1.11.1
#> [37] magrittr_2.0.5 bslib_0.11.0 tools_4.6.1
#> [40] pkgdown_2.2.1 BiocGenerics_0.59.10 cachem_1.1.0
#> [43] desc_1.4.3