From 289760d67cd355cdbb0ef9f2ad1a4614620bba77 Mon Sep 17 00:00:00 2001 From: Bo Burla Date: Sat, 18 Jan 2025 11:31:43 +0800 Subject: [PATCH] isotope correction updates --- R/correct-isotope.R | 30 +++++---- tests/testthat/test-correct-isotope.R | 61 +++++++++++++++++- tests/testthat/test-metadata-import.R | 2 + ..._TestData_MHQuant_S1P_metadata_tables.xlsx | Bin 35486 -> 38252 bytes ..._Template_191_20240226_MHQuant_S1P_V1.xlsm | Bin 165 -> 0 bytes 5 files changed, 79 insertions(+), 14 deletions(-) delete mode 100644 tests/testthat/testdata/~$MiDAR_Metadata_Template_191_20240226_MHQuant_S1P_V1.xlsm diff --git a/R/correct-isotope.R b/R/correct-isotope.R index f148257..b7df8c5 100644 --- a/R/correct-isotope.R +++ b/R/correct-isotope.R @@ -1,7 +1,7 @@ -#' Manual correction for interference contributed by another feature +#' Manual interference correction #' #' @description -#' The interference is substracted using following formula: +#' The interference is subtracted using following formula: #' \deqn{Value_{Corrected} = Value_{Feature} - Factor_{Contribution} * Value_{Interfering Feature}} #' #' @param data MidarExperiment object @@ -15,20 +15,24 @@ # Example: mexp <- correct_interference_manually(mexp, "feature_intensity", "PC 32:0 | SM 36:1 M+3", "SM 36:1", 0.0106924, "PC 32:0") -correct_interference_manually <- function(data = NULL, variable, feature, interfering_feature, relative_contribution, updated_feature_id = NULL) { +correct_interference_manually <- function(data = NULL, variable, feature, interfering_feature, relative_contribution, updated_feature_id = NA) { check_data(data) - variable_var <- rlang::ensym(variable) - updated_feature_id <- ifelse(is.null(updated_feature_id) | is.na(updated_feature_id), "", updated_feature_id) + updated_feature_id <- ifelse(is.null(updated_feature_id) | is.na(updated_feature_id), NA_character_, updated_feature_id) # Validate input - if (!feature %in% data@annot_features$feature_id) cli::cli_abort("Feature is not present in the dataset") - if (!interfering_feature %in% data@annot_features$feature_id) cli::cli_abort("Interfering feature is not present in the dataset") - if (!variable %in% names(data@dataset)) stop(glue::glue("Variable `{variable` is not defined in the dataset")) - if (relative_contribution < 0 | relative_contribution >= 1) cli::cli_abort("`relative_contribution` must be between 0 and 1") - if (updated_feature_id %in% data@annot_features$feature_id) cli::cli_abort("Mew fFeature name must not present already be present in the dataset") + if (!feature %in% data@annot_features$feature_id) cli::cli_abort(col_red("Feature is not present in the dataset")) + if (!interfering_feature %in% data@annot_features$feature_id) cli::cli_abort(col_red("Interfering feature is not present in the dataset")) + if (!variable %in% names(data@dataset)) cli::cli_abort(col_red("Variable `{variable}` is not defined in the dataset")) + if (is.numeric(relative_contribution) & relative_contribution < 0 ) cli::cli_abort(col_red("col_red(`relative_contribution` must be between larger than 0")) + if (!is.na(updated_feature_id) & updated_feature_id %in% data@annot_features$feature_id) cli::cli_abort(col_red("New feature id must not present in the dataset")) + + if (!"interference_corrected" %in% names(data@dataset)) { + data@dataset <- data@dataset |> + mutate(interference_corrected = FALSE) + } # Correction data@dataset <- data@dataset |> @@ -41,8 +45,10 @@ correct_interference_manually <- function(data = NULL, variable, feature, interf interference_corrected = if_else(.data$feature_id == feature, TRUE, .data$interference_corrected) ) - data@dataset <- data@dataset |> - mutate(feature_id = if_else(.data$feature_id == feature & nchar(stringr::str_squish(.data$updated_feature_id)) > 0, updated_feature_id, .data$feature_id)) + if(!is.na(updated_feature_id)) { + data@dataset <- data@dataset |> + mutate(feature_id = if_else(.data$feature_id == feature & .data$interference_corrected, updated_feature_id, .data$feature_id)) + } data } diff --git a/tests/testthat/test-correct-isotope.R b/tests/testthat/test-correct-isotope.R index 365d36d..62e56e4 100644 --- a/tests/testthat/test-correct-isotope.R +++ b/tests/testthat/test-correct-isotope.R @@ -1,6 +1,6 @@ -mexp <- readRDS(file = testthat::test_path("testdata/MHQuant_demo.rds")) -mexp_proc <- mexp +mexp_orig <- readRDS(file = testthat::test_path("testdata/MHQuant_demo.rds")) +mexp <- mexp_orig test_that("correct_interferences corrects overlapping interferences", { @@ -47,3 +47,60 @@ test_that("correct_interferences corrects overlapping interferences", { 7256.0500353124) }) + + + + + +test_that("correct_interferences corrects overlapping interferences", { + + # d18:2 is interfering with d18:1, which in turn is interfering with d18:0 + # the code does not correct for M+4 isotope interference + + + mexp2 <- mexp_orig + + + expect_equal(mexp2@dataset |> + filter(feature_id == "S1P d18:1 [M>60]", + analysis_id == "008_LTR_LTR01") |> + pull(feature_intensity), + 85299) + + + mexp2 <- correct_interference_manually(mexp2, + variable = "feature_intensity", + feature = "S1P d18:1 [M>60]", + interfering_feature = "S1P d18:2 [M>60]", + relative_contribution = 0.0315385) + + + + expect_equal(mexp2@dataset |> + filter(feature_id == "S1P d18:1 [M>60]", + analysis_id == "008_LTR_LTR01") |> + pull(feature_intensity), + 84304.7172490) + + # test renaming of feature and additional correction + mexp2 <- correct_interference_manually(mexp2, + variable = "feature_intensity", + feature = "S1P d18:0 [M>60]", + interfering_feature = "S1P d18:1 [M>60]", + relative_contribution = 0.0315872, updated_feature_id = "S1P d18:0 [M>60] corrected") + + expect_equal(mexp2@dataset |> + filter(feature_id == "S1P d18:0 [M>60] corrected", + analysis_id == "008_LTR_LTR01") |> + pull(feature_intensity), + 7256.0500353124) + + + expect_error( mexp2 <- correct_interference_manually(mexp2, + variable = "feature_intensity", + feature = "S1P d18:0 [M>601]", + interfering_feature = "S1P d18:1 [M>60]", + relative_contribution = 0.0315872, updated_feature_id = "S1P d18:0 [M>60] corrected"), + "Feature is not present in the dataset, please adjust `feature` argument" + ) +}) diff --git a/tests/testthat/test-metadata-import.R b/tests/testthat/test-metadata-import.R index 6197caa..259e5be 100644 --- a/tests/testthat/test-metadata-import.R +++ b/tests/testthat/test-metadata-import.R @@ -216,6 +216,8 @@ test_that("Check import of inconsitent metadata", { "`is_quantifier` is inconsistently defined, i.e., not for one or more features. Please") expect_error(mexp <- midar:::import_metadata_features(mexp, path = path, sheet = "Features_Inconsist_val"), "`valid_feature` is inconsistently defined, i.e., not for one or more features. Please") + expect_error(mexp <- midar:::import_metadata_features(mexp, path = path, sheet = "Features_inval_interf")) + expect_error(mexp <- midar:::import_metadata_features(mexp, path = path, sheet = "Features_miss_interf")) }) test_that("Replacing specific undefined metadata", { diff --git a/tests/testthat/testdata/MIDAR_TestData_MHQuant_S1P_metadata_tables.xlsx b/tests/testthat/testdata/MIDAR_TestData_MHQuant_S1P_metadata_tables.xlsx index a72f0d5019c894c190d4edceabc76cf4eb56cae4..64207df954512373ed5a696896c452ca0f3ad861 100644 GIT binary patch delta 8762 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

LZ)C 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 F^gmq+XrKT9 delta 6288 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 diff --git a/tests/testthat/testdata/~$MiDAR_Metadata_Template_191_20240226_MHQuant_S1P_V1.xlsm b/tests/testthat/testdata/~$MiDAR_Metadata_Template_191_20240226_MHQuant_S1P_V1.xlsm deleted file mode 100644 index 8dc6b6961f60c095b945e4f4eafbe4e82e11189f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 mcmd;Z%2#kIEy_t$API0VI5FfiC;-V)h9ZU>hD0Enb`SvS(Ged2