Six tools in this comparison simulate or evaluate proteolytic digests. The analysis records peptide overlap for one BSA trypsin configuration, then describes scoring, filtering, ranking, structural context, and programmatic access.
This vignette is package documentation, not paper evidence, an experimental validation, or a performance benchmark. It compares retained outputs and documented interfaces. The local artifacts do not retain service versions or retrieval dates for MS-Digest and PeptideMass, and the assessed Protein Cleaver source revision was not recorded. The capability entries therefore do not certify current-release equivalence.
The overlap analysis records agreement and disagreement among three retained outputs before the capability review separates the tools by purpose and interface.
The first analysis compares peptide sets from MS-Digest, ExPASy PeptideMass, and pepVet for BSA with trypsin and one missed cleavage.
| Tool | N_unique | Common_with_pepVet | Shared_all_three | Pct_overlap |
|---|---|---|---|---|
| MS-Digest | 130 | 121 | 116 | 93.1 |
| ExPASy PeptideMass | 151 | 141 | 116 | 93.4 |
| pepVet | 154 | 154 | 116 | 100.0 |
ggplot2::ggplot(overlap, ggplot2::aes(x = Tool)) +
ggplot2::geom_col(
ggplot2::aes(y = N_unique),
fill = "#AFC6D5", color = "black", width = 0.65
) +
ggplot2::geom_col(
ggplot2::aes(y = Shared_all_three),
fill = "#3B7A9E", color = "black", width = 0.65
) +
ggplot2::geom_text(
ggplot2::aes(y = N_unique, label = N_unique),
vjust = -0.35
) +
ggplot2::scale_y_continuous(
limits = c(0, max(overlap$N_unique) * 1.12),
expand = c(0, 0)
) +
ggplot2::labs(
title = "Peptide overlap: BSA trypsin MC=1",
subtitle = "Dark bars show the 116 peptides shared by all three tools",
x = NULL, y = "Number of peptides"
) +
ggplot2::theme_minimal(base_size = 10) +
ggplot2::theme(panel.grid.major.x = ggplot2::element_blank())Peptide overlap among MS-Digest, ExPASy PeptideMass, and pepVet for BSA trypsin MC=1. The lighter segment marks peptides outside the 116 shared by all three tools.
The three outputs share 116 peptides. pepVet returns 154 because it reports all fragments from the cleavage engine before scoring filters. The assessed MS-Digest and ExPASy outputs contain 130 and 151 peptides. On peptides shared by each pair, the mass correlations are 0.999983 for MS-Digest and ExPASy, 0.999821 for pepVet and MS-Digest, and 1.000000 for pepVet and ExPASy. These values describe the assessed configuration and do not establish equivalence across other inputs or tool versions.
The capability matrix records the assessed interfaces and outputs.
| Capability | pepVet | MS_Digest | ExPASy | Protein_Cleaver | ProteaseGuru | PeptideRanger |
|---|---|---|---|---|---|---|
| Peptide list + masses | Yes | Yes | Yes | Yes | Yes | No digest output |
| pI output | Peptide | No | Protein | No | No | No |
| Hydrophobicity metric | GRAVY | Bull-Breese / HPLC index | No | No | SSRCalc | Not an output |
| Composite digest score | Weighted model score | No | No | No | No | No |
| Score-band label | Heuristic bands | No | No | No | No | No |
| Multi-enzyme comparison | Yes | One rule per run | One rule per run | Yes | Yes | No |
| Enzyme ranking | Highest model score | No | No | Application ranking | Comparison output | No |
| Workflow presets | 6 presets | No | No | No | No | No |
| Batch input | Yes | Multiple proteins | Single protein | Yes | Protein database | Peptide vectors |
| Sensitivity analysis | Weight perturbation | Not assessed | Not assessed | Not assessed | Not assessed | Not assessed |
| Peptide-level ML score | No | No | No | No (rules-based flag) | No | RF score (0-1) |
| 3D structure mapping | No | No | No | Yes | No | No |
| Retention time prediction | No | No | No | No documented output | No | No |
| Skyline/FASTA export | Yes | No | No | No | No | No |
| Non-GUI interface | Yes | Command line / XML | No | No documented API | No | Yes |
| R package | Yes | No | No | No | No | Yes |
MS-Digest (Baker, Clauser, and Burlingame, UCSF) returns peptide masses and coordinates for a selected digest rule. Its official instructions describe multiple-protein input and hydrophobicity indices, and the automation documentation describes command-line and XML interfaces. The retained output does not establish which service version produced it. MS-Digest does not supply a pepVet-style composite digest score or score-band label.
PeptideMass (Wilkins et al. 1997) accepts a UniProt accession and returns neutral average peptide masses together with the source protein’s pI. It can use signal-peptide and PTM annotations from UniProt. It does not score or rank digests.
Protein Cleaver (Koulouras and Xu 2025) is an R Shiny application
built with cleaver. It flags peptides as identifiable or
non-identifiable using configurable length and mass windows, ranks
proteases using maximum coverage and identifiable-peptide count, and
includes sequence and 3D structure mapping. Its official paper and
repository
documentation, checked 2026-07-14, do not document retention-time
prediction. The unrecorded source revision assessed for this comparison
used the same cleavage engine as pepVet and a different mass table,
including 71.079 Da for alanine compared with pepVet’s 71.037 Da. The
assessed revision had no GRAVY filter, composite score, verdict, or
workflow presets.
ProteaseGuru (Miller et al. 2021) is a desktop application for comparing multiple proteases. It reports SSRCalc hydrophobicity, coverage maps, and shared or exclusive peptides. The assessed documentation did not provide a pepVet-style composite score, workflow presets, or an R API.
PeptideRanger (Riley et al. 2023) is an R package that uses a random forest to prioritize peptides for MS analysis. It produces an RF score from 0 to 1 per peptide. In this comparison, pepVet summarizes digest-level criteria and PeptideRanger supplies a peptide-level suitability score. We do not treat either score as a calibrated probability.
The following analyses compare digest-level scores, workflow settings, and peptide-level classifications without treating the tools as interchangeable.
The benchmark contains five proteins and five enzymes. The pepVet composite combines five components: length, sequence coverage, peptide count, hydrophobicity, and charge richness.
ggplot2::ggplot(
scores,
ggplot2::aes(x = protein, y = composite, fill = enzyme)
) +
ggplot2::geom_col(
position = "dodge", color = "black", alpha = 0.85
) +
ggplot2::geom_hline(
yintercept = c(0.40, 0.65),
linetype = "dashed", linewidth = 0.5,
color = c("#D4A76A", "#3A8C5F")
) +
ggplot2::scale_fill_manual(
values = enzyme_fill,
labels = enzyme_labels[names(enzyme_fill)]
) +
ggplot2::scale_y_continuous(
limits = c(0, 1), expand = c(0, 0.02)
) +
ggplot2::labs(
title = "Enzyme comparison across proteins",
y = "Composite score", x = NULL, fill = "Enzyme"
) +
ggplot2::theme_minimal(base_size = 11) +
ggplot2::theme(legend.position = "bottom")Enzyme comparison across five proteins. Dashed lines mark the Moderate and Good verdict thresholds. Each bar is one enzyme. pepVet’s composite score is a weighted sum of 5 components.
Highest composite score within the five-enzyme grid:
Good).Good).Good).Good).Good).Two pairs receive Poor: BACE1 with Lys-C at 0.389 and
Lysozyme C with Glu-C at 0.269. These labels follow the current pepVet
settings and are not experimental outcomes.
Six presets record a length range, GRAVY range, weight vector, and pI
flag. Each artifact row applies the complete preset. Because some
presets weight S_unique, all rows use the same supplied
background made from the BSA, H3.1, and BACE1 tryptic digests.
Uniqueness in this comparison means absence from those three supplied
digests, not uniqueness in a species or search database. The figure
reports length-valid counts only. GRAVY affects S_hydro,
not the definition of a length-valid peptide.
ggplot2::ggplot(presets, ggplot2::aes(x = preset)) +
ggplot2::geom_col(
ggplot2::aes(y = n_total),
fill = "#D8DDE6", alpha = 0.7, width = 0.85
) +
ggplot2::geom_col(
ggplot2::aes(y = n_length_valid, fill = verdict),
color = "black", alpha = 0.85, width = 0.85
) +
ggplot2::geom_text(
ggplot2::aes(y = n_length_valid, label = n_length_valid),
vjust = -0.3, size = 3.2
) +
ggplot2::facet_wrap(~protein, nrow = 1) +
ggplot2::scale_fill_manual(values = verdict_fill) +
ggplot2::labs(
title = "Preset effects on length-valid peptide count",
x = NULL, y = "Number of peptides", fill = "Verdict"
) +
ggplot2::theme_minimal(base_size = 10) +
ggplot2::theme(
axis.text.x = ggplot2::element_text(
angle = 35, hjust = 1, size = 8
),
legend.position = "bottom",
strip.background = ggplot2::element_rect(
fill = "#F0F0F0", color = NA
),
strip.text = ggplot2::element_text(face = "bold")
)Workflow preset effects on length-valid peptide count. Grey bars show all theoretical digest products and coloured bars show peptides inside each preset’s length range.
Within these rows, the targeted preset has the narrowest length range and the FFPE preset has the broadest. Composite differences reflect the complete configurations, not only the displayed length-valid counts. Verdicts are heuristic score bands under those configurations, not validated outcomes.
pepVet ranks enzyme-digest combinations under an explicit scoring model. PeptideRanger supplies a peptide-level random-forest score. The comparison below groups peptides by a combined length-and-GRAVY window. That grouping is narrower than pepVet’s definition of a valid peptide, which depends on the active length range.
The analysis calculates the difference between mean PeptideRanger scores inside and outside the selected window across 25 protein-enzyme combinations. A positive value means that the inside-window group has the higher mean score in that combination. It does not validate either model.
pr_plot <- pr_data[!is.na(pr_data$mean_score_difference), ]
pr_plot$sign <- ifelse(
pr_plot$mean_score_difference >= 0, "positive", "negative"
)
pr_plot$enzyme_label <- enzyme_labels[pr_plot$enzyme]
enzyme_order <- tapply(
pr_plot$mean_score_difference, pr_plot$enzyme_label, mean, na.rm = TRUE
)
pr_plot$enzyme_label <- factor(
pr_plot$enzyme_label, levels = names(sort(enzyme_order))
)
ggplot2::ggplot(
pr_plot,
ggplot2::aes(x = mean_score_difference, y = enzyme_label, fill = sign)
) +
ggplot2::geom_col(color = "black", alpha = 0.85, width = 0.7) +
ggplot2::geom_vline(
xintercept = 0, linewidth = 0.5, color = "grey50"
) +
ggplot2::scale_fill_manual(values = c(
"positive" = "#3A8C5F", "negative" = "#C46A6A"
)) +
ggplot2::facet_grid(protein ~ ., scales = "free_y", space = "free_y") +
ggplot2::labs(
title = "PeptideRanger score difference by selected window",
x = "Mean score difference", y = NULL, fill = NULL
) +
ggplot2::theme_minimal(base_size = 10) +
ggplot2::theme(
legend.position = "none",
panel.grid.major.y = ggplot2::element_blank(),
strip.text.y = ggplot2::element_text(
angle = 0, hjust = 1, face = "bold", size = 9
),
strip.background = ggplot2::element_rect(
fill = "#F0F0F0", color = NA
)
)PeptideRanger mean-score difference for peptides inside versus outside the selected length-and-GRAVY window. Positive values mean that the inside-window group has the higher mean score.
The score difference is positive in 17 of 24 computable combinations. A missing value means that one comparison group is empty. Small window-pass groups can make the difference unstable, so this descriptive contrast is not evidence of improved experimental detection.
A two-stage pipeline run looks like this:
This code passes pepVet’s length-valid peptides to PeptideRanger. It does not reproduce the narrower combined length-and-GRAVY grouping used in the descriptive artifact above.
preset <- pepvet_preset("standard")
ev <- do.call(
evaluate_digest,
c(
list(
sequence = system.file("extdata", "P02769.fasta", package = "pepVet"),
enzyme = "trypsin",
missed_cleavages = 1L
),
preset
)
)
length_valid <- ev$peptides
length_valid <- length_valid[
length_valid$length >= preset$length_range[1] &
length_valid$length <= preset$length_range[2],
]
pr_predict <- getExportedValue("PeptideRanger", "peptide_predictions")
pr_model <- getExportedValue("PeptideRanger", "RFmodel_ProteomicsDB")
pr_res <- pr_predict(
length_valid$peptide,
prediction_model = pr_model
)
head(pr_res)The comparison applies a simulated Protein Cleaver length-and-mass rule to the same peptides used by pepVet. Protein Cleaver uses a binary flag, while pepVet calculates digest-level components and a composite score.
| protein | n_peptides | pc_identifiable | pepvet_window_pass | both_pass | pc_only | pepvet_window_only |
|---|---|---|---|---|---|---|
| BSA | 157 | 113 | 83 | 83 | 30 | 0 |
| H3 | 59 | 20 | 15 | 15 | 5 | 0 |
| BACE1 | 79 | 42 | 25 | 25 | 17 | 0 |
pc_plot <- rbind(
data.frame(
protein = pc_data$protein,
classifier = "Both filters",
count = pc_data$both_pass
),
data.frame(
protein = pc_data$protein,
classifier = "PC identifiable only",
count = pc_data$pc_only
)
)
ggplot2::ggplot(
pc_plot,
ggplot2::aes(x = protein, y = count, fill = classifier)
) +
ggplot2::geom_col(
position = "dodge", color = "black", alpha = 0.85, width = 0.6
) +
ggplot2::geom_text(
ggplot2::aes(label = count),
position = ggplot2::position_dodge(width = 0.6),
vjust = -0.3, size = 3.5
) +
ggplot2::scale_fill_manual(values = c(
"Both filters" = "#3A8C5F",
"PC identifiable only" = "#C46A6A"
)) +
ggplot2::labs(
title = "pepVet vs Protein Cleaver",
x = NULL, y = "Number of peptides", fill = "Classification"
) +
ggplot2::theme_minimal(base_size = 10) +
ggplot2::theme(legend.position = "bottom")Overlap between the selected pepVet length-and-GRAVY window and the simulated Protein Cleaver identifiability rule. ‘Both filters’ passes both definitions.
Under the simulated rule, every peptide inside the selected pepVet window is also PC-identifiable. The Protein Cleaver rule accepts additional peptides because it uses a different length range and a mass window rather than a GRAVY window. The exact result depends on the simulated settings and does not replace a run of the external application.
pepVet can be used for enzyme ranking and inspection of digest-level score components. PeptideRanger can add a peptide-level suitability score, while Protein Cleaver can add structural context when a PDB file is available. MS-Digest and ExPASy provide established peptide-mass calculations. The appropriate tool depends on the question and on whether the user needs a digest ranking, peptide prioritization, structural annotation, or mass calculation.
Koulouras G, Xu Y. Protein cleaver: an interactive web interface for in silico prediction and systematic annotation of protein digestion-derived peptides. Frontiers in Bioinformatics. 2025, 5:1576317. doi: 10.3389/fbinf.2025.1576317.
Miller RM, Ibrahim K, Smith LM. ProteaseGuru: A Tool for Protease Selection in Bottom-Up Proteomics. Journal of Proteome Research. 2021, 20(4):1936-1942. doi: 10.1021/acs.jproteome.0c00954.
Riley RM, Spencer Miko SE, Morin RD, Morin GB, Negri GL. PeptideRanger: An R Package to Optimize Synthetic Peptide Selection for Mass Spectrometry Applications. Journal of Proteome Research. 2023, 22(2):526-531. doi: 10.1021/acs.jproteome.2c00538.
Wilkins MR, Lindskog I, Gasteiger E, Bairoch A, Sanchez JC, Hochstrasser DF, Appel RD. Detailed peptide characterization using PEPTIDEMASS, a World-Wide-Web-accessible tool. Electrophoresis. 1997, 18(3-4):403-408. doi: 10.1002/elps.1150180314.
sessionInfo()
#> R version 4.6.1 (2026-06-24)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 26.04 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.32.so; LAPACK version 3.12.0
#>
#> locale:
#> [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
#> [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
#> [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
#> [7] LC_PAPER=en_US.UTF-8 LC_NAME=C
#> [9] LC_ADDRESS=C LC_TELEPHONE=C
#> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
#>
#> time zone: Etc/UTC
#> tzcode source: system (glibc)
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> other attached packages:
#> [1] pepVet_0.99.0 rmarkdown_2.31
#>
#> loaded via a namespace (and not attached):
#> [1] gtable_0.3.6 jsonlite_2.0.0 compiler_4.6.1
#> [4] crayon_1.5.3 Biostrings_2.81.3 jquerylib_0.1.4
#> [7] scales_1.4.0 IRanges_2.47.2 Seqinfo_1.3.0
#> [10] yaml_2.3.12 fastmap_1.2.0 ggplot2_4.0.3
#> [13] R6_2.6.1 XVector_0.53.0 cleaver_1.51.0
#> [16] labeling_0.4.3 generics_0.1.4 knitr_1.51
#> [19] BiocGenerics_0.59.10 tibble_3.3.1 maketools_1.3.2
#> [22] RColorBrewer_1.1-3 bslib_0.11.0 pillar_1.11.1
#> [25] rlang_1.3.0 utf8_1.2.6 cachem_1.1.0
#> [28] xfun_0.60 S7_0.2.2 sass_0.4.10
#> [31] sys_3.4.3 otel_0.2.0 cli_3.6.6
#> [34] withr_3.0.3 magrittr_2.0.5 digest_0.6.39
#> [37] grid_4.6.1 lifecycle_1.0.5 S4Vectors_0.51.5
#> [40] vctrs_0.7.3 evaluate_1.0.5 glue_1.8.1
#> [43] farver_2.1.2 buildtools_1.0.0 stats4_4.6.1
#> [46] tools_4.6.1 pkgconfig_2.0.3 htmltools_0.5.9