-
Notifications
You must be signed in to change notification settings - Fork 49
Added Metamorpheus Datasets - MBR+NoMBR wNormalization to benchmarking #163
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: devel
Are you sure you want to change the base?
Changes from all commits
d21a720
eaee20e
b09fae2
f5927d8
8bd37a9
71f62f4
d2275bd
7300bcc
79e0a2d
434c1c0
83958b8
bf4938d
6b784f1
959d271
138c802
1980ad9
331ba24
5c497f4
d78a1e9
4917efe
90ca387
09cacfa
e0472b9
2d8e3b3
73e6bcc
244d42f
462925f
1b962cf
f0ec621
ec9fe42
c7e7b60
d8bcb03
ba65d2d
423b485
7485d95
4fb9d06
9fc6a86
8518c44
8eefbff
a9fbe80
3be70e4
85a41cd
c4c0c86
f6ac63e
90cf018
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,93 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| library(MSstatsConvert) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| library(MSstats) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| library(parallel) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| library(stringr) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| library(jsonlite) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| library(dplyr) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| source("metamorpheus_Process.R") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| config <- fromJSON("scriptController.json", simplifyVector = FALSE) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| runBenchmarkForMetaMorpheusData <- function(datasetPath, config) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| dataset_config <- config$datasets[[datasetPath]] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| dataset_config <- as.list(dataset_config) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| cat("Processing Dataset:", dataset_config$name, "\n") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| filePath <- file.path(dataset_config$parent, dataset_config$data) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| annotPath <- dataset_config$parent | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| input = data.table::fread(file.path(filePath, "QuantifiedPeaks.tsv")) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| annot = data.table::fread(file.path(annotPath, "annotation.csv")) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| cat("Dataset File Path:", filePath, "\n") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| cat("Annotation File Path:", annotPath, "\n") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| input = input %>% filter(!str_detect(`Protein Group`, ";")) # remove multiple protein group in same cell | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| input = input %>% filter(!str_detect(`Protein Group`, "DECOY")) # remove decoys | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| protein_mappings = data.table::fread(file.path(filePath, "QuantifiedProteins.tsv")) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| protein_mappings = protein_mappings %>% filter(Organism %in% c("Escherichia coli (strain K12)", "Homo sapiens")) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| print(protein_mappings) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| input = input %>% filter(`Protein Group` %in% protein_mappings$`Protein Groups`) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| output = MetamorpheusToMSstatsFormat(input, annot) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The MetamorpheusToMSstatsFormat function also has these two parameters. By default, they're set to TRUE Could you double check there aren't major differences in empirical FDR when these two parameters are set to FALSE? I'm thinking due to the absence of PIP, certain proteins may be filtered out altogether, which could explain better empirical FDR with no PIP. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| data_process_tasks <- list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| label = "Data process with Normalized Data", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| result = function() dataProcess(output, featureSubset = "topN", n_top_feature = 20) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| label = "Data process with Normalization and MBImpute False", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| result = function() dataProcess(output, featureSubset = "topN", n_top_feature = 20, MBimpute = FALSE) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| label = "Data process without Normalization", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| result = function() dataProcess(output, featureSubset = "topN", normalization = "FALSE", n_top_feature = 20) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| label = "Data process without Normalization with MBImpute False", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| result = function() dataProcess(output, featureSubset = "topN", normalization = "FALSE", n_top_feature = 20, MBimpute = FALSE) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| label = "Data process without Normalization and Imputation On for all features", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| result = function() dataProcess(output, featureSubset = "all", normalization = "FALSE", MBimpute = FALSE) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| list( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| label = "Data process without Normalization and Imputation On for top3 features", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| result = function() dataProcess(output, featureSubset = "top3", normalization = "FALSE", MBimpute = FALSE) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+47
to
+65
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Correct MBimpute argument name and align “Imputation On” task behavior Two issues:
Apply this diff to fix both problems: list(
label = "Data process with Normalization and MBImpute False",
- result = function() dataProcess(output, featureSubset = "topN", n_top_feature = 20, MBimpute = FALSE)
+ result = function() dataProcess(output, featureSubset = "topN", n_top_feature = 20, MBimpute = FALSE)
),
@@
list(
label = "Data process without Normalization with MBImpute False",
- result = function() dataProcess(output, featureSubset = "topN", normalization = "FALSE", n_top_feature = 20, MBimpute = FALSE)
+ result = function() dataProcess(output, featureSubset = "topN", normalization = "FALSE", n_top_feature = 20, MBimpute = FALSE)
),
list(
label = "Data process without Normalization and Imputation On for all features",
- result = function() dataProcess(output, featureSubset = "all", normalization = "FALSE", MBImpute = FALSE)
+ result = function() dataProcess(output, featureSubset = "all", normalization = "FALSE", MBimpute = TRUE)
),
list(
label = "Data process without Normalization and Imputation On for top3 features",
- result = function() dataProcess(output, featureSubset = "top3", normalization = "FALSE", MBImpute = FALSE)
+ result = function() dataProcess(output, featureSubset = "top3", normalization = "FALSE", MBimpute = TRUE)
)Note: The first two blocks already use the correct argument spelling (MBimpute). The changes above fix the last two blocks to both correct the spelling and enable imputation. 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| start_time <- Sys.time() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| num_cores <- detectCores() - 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| summarized_results <- mclapply(data_process_tasks, function(task) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| list(label = task$label, summarized = task$result()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, mc.cores = num_cores) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| results_list <- mclapply(summarized_results, function(res) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| calculate_Metrics(res$summarized, protein_mappings, res$label) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| }, mc.cores = num_cores) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+70
to
+80
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Verification agent 🧩 Analysis chainGuard against mc.cores == 0 and provide a Windows-safe fallback detectCores() - 1 can be zero; mclapply will error. Also, mclapply with mc.cores > 1 is unavailable on Windows. Add a safe core calculation and fall back to lapply when needed. - num_cores <- detectCores() - 1
-
- summarized_results <- mclapply(data_process_tasks, function(task) {
- list(label = task$label, summarized = task$result())
- }, mc.cores = num_cores)
+ num_cores <- max(1L, as.integer(detectCores() - 1L))
+ if (.Platform$OS.type != "windows" && num_cores > 1L) {
+ summarized_results <- mclapply(
+ data_process_tasks,
+ function(task) list(label = task$label, summarized = task$result()),
+ mc.cores = num_cores
+ )
+ } else {
+ summarized_results <- lapply(
+ data_process_tasks,
+ function(task) list(label = task$label, summarized = task$result())
+ )
+ }
@@
- results_list <- mclapply(summarized_results, function(res) {
- calculate_Metrics(res$summarized, protein_mappings, res$label)
- }, mc.cores = num_cores)
+ if (.Platform$OS.type != "windows" && num_cores > 1L) {
+ results_list <- mclapply(
+ summarized_results,
+ function(res) calculate_Metrics(res$summarized, protein_mappings, res$label),
+ mc.cores = num_cores
+ )
+ } else {
+ results_list <- lapply(
+ summarized_results,
+ function(res) calculate_Metrics(res$summarized, protein_mappings, res$label)
+ )
+ }Optional verification: please run a small dataset on a 1-core environment to confirm no regression when num_cores == 1. 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "Checking for benchmark/benchmark_Metamorpheus.R..."
if [ -f benchmark/benchmark_Metamorpheus.R ]; then
echo "== File: benchmark/benchmark_Metamorpheus.R (first 220 lines) =="
sed -n '1,220p' benchmark/benchmark_Metamorpheus.R
else
echo "benchmark/benchmark_Metamorpheus.R not found"
fi
echo
echo "== Searching repo for parallel-related usages =="
rg -n --hidden -S 'detectCores|mclapply|library\\(parallel\\)|require\\(parallel\\)|\\.Platform' || true
echo
echo "== Showing matches in benchmark/ directory with context =="
rg -n --hidden -S --context 3 'detectCores|mclapply|\\.Platform' benchmark || trueLength of output: 8050 Guard against mc.cores == 0 and add a Windows-safe fallback (applies to multiple benchmark scripts) detectCores() - 1 can be 0 (causing mclapply to error) and mclapply’s multicore mode is not available on Windows — fall back to lapply when multicore isn’t usable. Files to update:
Suggested change (apply the same pattern to each file): - num_cores <- detectCores() - 1
-
- summarized_results <- mclapply(data_process_tasks, function(task) {
- list(label = task$label, summarized = task$result())
- }, mc.cores = num_cores)
+ num_cores <- max(1L, as.integer(detectCores() - 1L))
+ if (.Platform$OS.type != "windows" && num_cores > 1L) {
+ summarized_results <- mclapply(
+ data_process_tasks,
+ function(task) list(label = task$label, summarized = task$result()),
+ mc.cores = num_cores
+ )
+ } else {
+ summarized_results <- lapply(
+ data_process_tasks,
+ function(task) list(label = task$label, summarized = task$result())
+ )
+ }
@@
- results_list <- mclapply(summarized_results, function(res) {
- calculate_Metrics(res$summarized, protein_mappings, res$label)
- }, mc.cores = num_cores)
+ if (.Platform$OS.type != "windows" && num_cores > 1L) {
+ results_list <- mclapply(
+ summarized_results,
+ function(res) calculate_Metrics(res$summarized, protein_mappings, res$label),
+ mc.cores = num_cores
+ )
+ } else {
+ results_list <- lapply(
+ summarized_results,
+ function(res) calculate_Metrics(res$summarized, protein_mappings, res$label)
+ )
+ }Optional: verify on a 1-core / Windows-like environment to ensure no regressions. 📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| final_results <- do.call(rbind, results_list) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| end_time <- Sys.time() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| total_time <- end_time - start_time | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| print(final_results) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| print(paste("Total Execution Time:", total_time)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| runBenchmarkForMetaMorpheusData("DDA-Solivais2024-Metamorpheus_MBR_LFQ", config) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| runBenchmarkForMetaMorpheusData("DDA-Solivais2024-Metamorpheus_NoMBR_LFQ", config) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -1,38 +1,51 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #!/bin/bash | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #SBATCH --job-name=msstats_benchmark_job_updated | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #SBATCH --chdir=/work/VitekLab/Projects/Benchmarking/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #SBATCH --chdir=/projects/VitekLab/Projects/Benchmarking/benchmark | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #SBATCH --output=job_output.txt | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #SBATCH --error=job_error.txt | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #SBATCH --open-mode=append | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #SBATCH --time=01:00:00 # Set the maximum run time | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #SBATCH --ntasks=1 # Number of tasks (one process) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #SBATCH --cpus-per-task=8 # Use 8 CPU cores for the task | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #SBATCH --mem=256G # Request 256GB of memory | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #SBATCH --partition=short # Use the 'short' partition (or change as needed) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #SBATCH --time=01:00:00 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #SBATCH --ntasks=1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #SBATCH --cpus-per-task=8 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #SBATCH --mem=128G | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| #SBATCH --partition=short | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| module load R-geospatial | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| module load gcc/11.1.0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| module load cmake/3.23.2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| module load R | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| module load cmake/3.30.2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| export LC_ALL=C | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| export R_LIBS_USER=/home/raina.ans/R/x86_64-pc-linux-gnu-library/4.2-geospatial | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| export R_LIBS_USER=/home/raina.ans/R/x86_64-pc-linux-gnu-library/4.4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| mkdir -p $R_LIBS_USER | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| mkdir -p $HOME/lib_fix | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ln -sf /shared/EL9/explorer/R/4.4.1/lib64/R/lib/libRlapack.so $HOME/lib_fix/libRlapack.so.3 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| mkdir -p $R_LIBS_USER | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| export LD_LIBRARY_PATH=$HOME/lib_fix:/shared/EL9/explorer/R/4.4.1/lib64/R/lib:/usr/lib64:$LD_LIBRARY_PATH | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| module load R | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Rscript -e "if (!requireNamespace('remotes', quietly = TRUE)) install.packages('remotes', lib = Sys.getenv('R_LIBS_USER'), repos = 'https://cloud.r-project.org'); \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| remotes::install_github('Vitek-Lab/MSstats', ref = 'devel', lib = Sys.getenv('R_LIBS_USER')); \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| remotes::install_github('Vitek-Lab/MSstatsConvert', ref = 'master', lib = Sys.getenv('R_LIBS_USER')); \ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| install.packages(c('dplyr', 'stringr', 'ggplot2'), lib = Sys.getenv('R_LIBS_USER'), repos = 'https://cloud.r-project.org')" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Rscript -e ' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| .libPaths("/home/raina.ans/R/x86_64-pc-linux-gnu-library/4.4") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Sys.unsetenv("R_LIBS") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| cat(".libPaths():\n"); print(.libPaths()) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (!requireNamespace("remotes", quietly = TRUE)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| install.packages("remotes", repos = "https://cloud.r-project.org") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| install.packages("nloptr", type = "source", repos = "https://cloud.r-project.org") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for (pkg in c("dplyr", "stringr", "ggplot2")) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if (!requireNamespace(pkg, quietly = TRUE)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| install.packages(pkg, repos = "https://cloud.r-project.org") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| BiocManager::install(c("MSstatsConvert", "preprocessCore"), force = TRUE) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| remotes::install_github("Vitek-Lab/MSstats", ref = "devel", force = TRUE) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+24
to
+41
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This will fail if BiocManager is missing; install it before calling BiocManager::install
Apply this diff: Rscript -e '
.libPaths("/home/raina.ans/R/x86_64-pc-linux-gnu-library/4.4")
Sys.unsetenv("R_LIBS")
cat(".libPaths():\n"); print(.libPaths())
if (!requireNamespace("remotes", quietly = TRUE))
install.packages("remotes", repos = "https://cloud.r-project.org")
-install.packages("nloptr", type = "source", repos = "https://cloud.r-project.org")
+install.packages("nloptr", type = "source", repos = "https://cloud.r-project.org")
for (pkg in c("dplyr", "stringr", "ggplot2")) {
if (!requireNamespace(pkg, quietly = TRUE)) {
install.packages(pkg, repos = "https://cloud.r-project.org")
}
}
-BiocManager::install(c("MSstatsConvert", "preprocessCore"), force = TRUE)
+if (!requireNamespace("BiocManager", quietly = TRUE)) {
+ install.packages("BiocManager", repos = "https://cloud.r-project.org")
+}
+BiocManager::install(c("MSstatsConvert", "preprocessCore"), force = TRUE)
remotes::install_github("Vitek-Lab/MSstats", ref = "devel", force = TRUE)
'📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| R_SCRIPTS=("benchmark_Dowell2021-HEqe408_LFQ.R" "benchmark_Puyvelde2022-HYE5600735_LFQ.R") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| R_SCRIPTS=("benchmark_Dowell2021-HEqe408_LFQ.R" "benchmark_Puyvelde2022-HYE5600735_LFQ.R" "benchmark_Metamorpheus.R" ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| for script in "${R_SCRIPTS[@]}"; do | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "Executing script: $script" >> job_output.txt | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Rscript "$script" >> job_output.txt 2>> job_error.txt | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| wait | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "Finished executing script: $script" >> job_output.txt | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "Executing script: $script" >> job_output.txt | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| stdbuf -oL -eL Rscript "$script" >> job_output.txt 2>> job_error.txt | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| wait | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo "Finished executing script: $script" >> job_output.txt | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| echo -e "\n\n" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| done | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,47 @@ | ||||||||||||||||||
| calculate_Metrics <- function(QuantData, protein_mappings, task_label, alpha = 0.05) { | ||||||||||||||||||
| comparison <- matrix( | ||||||||||||||||||
| c(-1,0,0,0,1, # E-A | ||||||||||||||||||
| -1,0,0,1,0, # D-A | ||||||||||||||||||
| -1,0,1,0,0, # C-A | ||||||||||||||||||
| -1,1,0,0,0), # B-A | ||||||||||||||||||
| nrow = 4, byrow = TRUE | ||||||||||||||||||
| ) | ||||||||||||||||||
| rownames(comparison) <- c("E-A", "D-A", "C-A", "B-A") | ||||||||||||||||||
| groups <- levels(QuantData$ProteinLevelData$GROUP) | ||||||||||||||||||
| colnames(comparison) <- groups[order(as.numeric(groups))] | ||||||||||||||||||
|
|
||||||||||||||||||
|
Comment on lines
+10
to
+12
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Avoid fragile column ordering: stop coercing group labels to numeric
Apply this diff: - groups <- levels(QuantData$ProteinLevelData$GROUP)
- colnames(comparison) <- groups[order(as.numeric(groups))]
+ groups <- levels(QuantData$ProteinLevelData$GROUP)
+ if (length(groups) != ncol(comparison)) {
+ stop(sprintf("Contrast matrix expects %d groups but found %d in data: %s",
+ ncol(comparison), length(groups), paste(groups, collapse = ", ")))
+ }
+ colnames(comparison) <- groups📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||
| model <- groupComparison( | ||||||||||||||||||
| contrast.matrix = comparison, | ||||||||||||||||||
| data = QuantData, | ||||||||||||||||||
| use_log_file = FALSE | ||||||||||||||||||
| ) | ||||||||||||||||||
|
|
||||||||||||||||||
| ecoli_ids <- protein_mappings %>% | ||||||||||||||||||
| filter(Organism == "Escherichia coli (strain K12)") %>% | ||||||||||||||||||
| pull(`Protein Groups`) | ||||||||||||||||||
|
|
||||||||||||||||||
| filtered_comparison_result <- model$ComparisonResult %>% | ||||||||||||||||||
| mutate(ecoli = Protein %in% ecoli_ids) %>% | ||||||||||||||||||
| filter(is.na(issue)) | ||||||||||||||||||
|
|
||||||||||||||||||
| labels <- unique(filtered_comparison_result$Label) | ||||||||||||||||||
| result_rows <- lapply(labels, function(lbl) { | ||||||||||||||||||
| df <- filtered_comparison_result %>% filter(Label == lbl) | ||||||||||||||||||
| sig <- df %>% filter(adj.pvalue < alpha) | ||||||||||||||||||
|
|
||||||||||||||||||
| tp <- sig %>% filter(ecoli) %>% nrow() | ||||||||||||||||||
| fp <- sig %>% filter(!ecoli) %>% nrow() | ||||||||||||||||||
| tot <- tp + fp | ||||||||||||||||||
| fdr <- if (tot > 0) fp / tot else NA_real_ | ||||||||||||||||||
|
|
||||||||||||||||||
| data.frame( | ||||||||||||||||||
| Task = task_label, | ||||||||||||||||||
| Comparison = lbl, | ||||||||||||||||||
| FDR = fdr, | ||||||||||||||||||
| stringsAsFactors = FALSE | ||||||||||||||||||
| ) | ||||||||||||||||||
| }) | ||||||||||||||||||
|
|
||||||||||||||||||
| results <- do.call(rbind, result_rows) | ||||||||||||||||||
| return(results) | ||||||||||||||||||
| } | ||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -2,7 +2,7 @@ | |
| "datasets": { | ||
| "DDA-Puyvelde2022-HYE5600735_LFQ": { | ||
| "name": "DDA-Puyvelde2022-HYE5600735_LFQ", | ||
| "file": "/work/VitekLab/Data/MS/Benchmarking/DDA-Puyvelde2022/DDA-Puyvelde2022-HYE5600735_LFQ/FragPipe/TOP0/MSstats_fixed.csv", | ||
| "file": "/projects/VitekLab/Data/MS/Benchmarking/DDA-Puyvelde2022/DDA-Puyvelde2022-HYE5600735_LFQ/FragPipe/TOP0/MSstats_fixed.csv", | ||
| "samples": { | ||
| "Human": { | ||
| "pattern": "_HUMAN$", | ||
|
|
@@ -20,7 +20,37 @@ | |
| }, | ||
| "DDA-Dowell2021-HEqe408_LFQ": { | ||
| "name": "DDA-Dowell2021-HEqe408_LFQ", | ||
| "file": "/work/VitekLab/Data/MS/Benchmarking/DDA-Dowell2021-HEqe408_LFQ/FragPipe/TOP0/MSstats.csv", | ||
| "file": "/projects/VitekLab/Data/MS/Benchmarking/DDA-Dowell2021-HEqe408_LFQ/FragPipe/TOP0/MSstats.csv", | ||
| "samples": { | ||
| "Human": { | ||
| "pattern": "_HUMAN$", | ||
| "type": "insignificant" | ||
| }, | ||
| "Ecoli": { | ||
| "pattern": "_ECOLI$", | ||
| "type": "significant" | ||
| } | ||
| } | ||
|
Comment on lines
22
to
+33
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Verification agent 🧩 Analysis chainConfirm consumer code reads new fields ( Older datasets use a Run this to verify the harness reads 🏁 Script executed: #!/bin/bash
# Inspect benchmark scripts for usage of scriptController.json
rg -n -C3 'scriptController\.json|parent|data"|samples' --type=r benchmarkLength of output: 4202 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "Searching benchmark R scripts for dataset_config usage and path construction..."
rg -n -C3 'dataset_config|filePath|file.path\(|dataset_config\$file|dataset_config\$parent|dataset_config\$data' --type=r benchmark || true
echo
echo "----- Full contents of the three benchmark scripts referenced in previous output -----"
for f in benchmark/benchmark_Metamorpheus.R benchmark/benchmark_Dowell2021-HEqe408_LFQ.R benchmark/benchmark_Puyvelde2022-HYE5600735_LFQ.R; do
echo "=== $f ==="
sed -n '1,240p' "$f" || true
echo
doneLength of output: 14136 Action: Make benchmark scripts accept both Verified: benchmark/benchmark_Metamorpheus.R already constructs paths from dataset_config$parent + dataset_config$data; benchmark_Dowell2021-HEqe408_LFQ.R and benchmark_Puyvelde2022-HYE5600735_LFQ.R still assume dataset_config$file only. This will break if scriptController.json uses the new parent+data shape for non‑Metamorpheus datasets. Files to update:
Suggested minimal patches (apply the same pattern to both Dowell and Puyvelde): Before: cat("Processing Dataset:", dataset_config$name, "\n")
cat("Dataset File Path:", dataset_config$file, "\n")
...
fragpipe_raw <- data.table::fread(dataset_config$file)After: data_file <- if (!is.null(dataset_config$file)) {
dataset_config$file
} else if (!is.null(dataset_config$parent) && !is.null(dataset_config$data)) {
file.path(dataset_config$parent, dataset_config$data)
} else {
stop("Dataset path not specified in config (expected 'file' or 'parent' + 'data')")
}
cat("Processing Dataset:", dataset_config$name, "\n")
cat("Dataset File Path:", data_file, "\n")
...
fragpipe_raw <- data.table::fread(data_file)Suggested change for Metamorpheus (keep existing parent+data behavior, add fallback to file): Before: filePath <- file.path(dataset_config$parent, dataset_config$data)
annotPath <- dataset_config$parentAfter: if (!is.null(dataset_config$file)) {
# If a file path is supplied, use its directory as the dataset directory
filePath <- dirname(dataset_config$file)
annotPath <- dirname(filePath)
} else {
filePath <- file.path(dataset_config$parent, dataset_config$data)
annotPath <- dataset_config$parent
}Reasoning: This makes each script robust to either config shape (old Please apply these small changes to the three scripts (or ensure scriptController.json keeps the original 🤖 Prompt for AI Agents |
||
| }, | ||
| "DDA-Solivais2024-Metamorpheus_NoMBR_LFQ": { | ||
| "name": "DDA-Solivais2024-Metamorpheus_NoMBR_LFQ", | ||
| "parent": "/projects/VitekLab/Data/MS/Benchmarking/DDA-Solivais2024_Metamorpheus/Current", | ||
| "data":"FlashLFQ_NoNormalization_NoPIP", | ||
| "samples": { | ||
| "Human": { | ||
| "pattern": "_HUMAN$", | ||
| "type": "insignificant" | ||
| }, | ||
| "Ecoli": { | ||
| "pattern": "_ECOLI$", | ||
| "type": "significant" | ||
| } | ||
| } | ||
| }, | ||
| "DDA-Solivais2024-Metamorpheus_MBR_LFQ": { | ||
| "name": "DDA-Solivais2024-Metamorpheus_MBR_LFQ", | ||
| "parent": "/projects/VitekLab/Data/MS/Benchmarking/DDA-Solivais2024_Metamorpheus/Current", | ||
| "data":"FlashLFQ_v1.0_NoNormalization_wPIP", | ||
| "samples": { | ||
| "Human": { | ||
| "pattern": "_HUMAN$", | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Verification agent
🧩 Analysis chain
Fix: MetamorpheusToMSstatsFormat likely undefined; also make sources/paths robust to working directory
MetamorpheusToMSstatsFormat isn’t defined in this script and isn’t exported by MSstats/MSstatsConvert. It appears to live in metamorpheus_code.R, which isn’t sourced here. Also, both the source() and fromJSON() calls are relative to the current working directory and will break if the script isn’t launched from benchmark/.
Apply this diff to source both helper files and load the controller JSON robustly:
🏁 Script executed:
Length of output: 6452
Fix required: source metamorpheus_code.R and make file paths robust to working directory
MetamorpheusToMSstatsFormat is defined in metamorpheus_code.R at the repo root (rg matches). benchmark/benchmark_Metamorpheus.R currently only does source("metamorpheus_Process.R") and fromJSON("scriptController.json"), which will break if the script is run from a different working directory — source the helper that defines MetamorpheusToMSstatsFormat and resolve paths relative to the script.
Files to update:
Apply this diff to benchmark/benchmark_Metamorpheus.R:
📝 Committable suggestion
🤖 Prompt for AI Agents