From ccba714fc040ece7b7e66f5e1741e01a242bb873 Mon Sep 17 00:00:00 2001 From: Stu Field Date: Thu, 15 Feb 2024 12:46:36 -0700 Subject: [PATCH] Restructure of lift_adat() functionality - `lift_adat()` now takes a `bridge =` argument, replacing the `anno.tbl =` argument. Lifting is now performed internally for a better (and safer) user experience, without the necessity of an external annotations file. - the majority of this refactoring was internal and the user should not experience a major disruption to the API. - fixes #81, fixes #78 --- NAMESPACE | 3 + R/adat-helpers.R | 8 +- R/lift-adat.R | 142 ++++++++++++-------------------- R/s3-print-soma-adat.R | 2 +- R/sysdata.rda | Bin 0 -> 56088 bytes R/utils-lift.R | 79 ++++++++++++++++++ man/lift_adat.Rd | 24 +++++- tests/testthat/test-lift-adat.R | 73 ++++++---------- 8 files changed, 180 insertions(+), 151 deletions(-) create mode 100644 R/sysdata.rda create mode 100644 R/utils-lift.R diff --git a/NAMESPACE b/NAMESPACE index 41635b1..dff3e3b 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -93,6 +93,7 @@ export(is.apt) export(is.intact.attributes) export(is.soma_adat) export(is_intact_attr) +export(is_lifted) export(is_seqFormat) export(left_join) export(lift_adat) @@ -144,6 +145,8 @@ importFrom(dplyr,ungroup) importFrom(lifecycle,deprecate_soft) importFrom(lifecycle,deprecate_stop) importFrom(lifecycle,deprecate_warn) +importFrom(lifecycle,deprecated) +importFrom(lifecycle,is_present) importFrom(magrittr,"%>%") importFrom(methods,new) importFrom(methods,setGeneric) diff --git a/R/adat-helpers.R b/R/adat-helpers.R index d944f1d..13812d0 100644 --- a/R/adat-helpers.R +++ b/R/adat-helpers.R @@ -62,12 +62,6 @@ getAdatVersion <- function(atts) { } -.ss_ver_map <- c(v3 = "1129", v3.0 = "1129", - v4 = "5k", v4.0 = "5k", - v4.1 = "7k", - v5 = "11k", v5.0 = "11k") - - #' Gets the SomaScan version #' #' @rdname adat-helpers @@ -92,7 +86,7 @@ getSomaScanVersion <- function(adat) { #' is.null(checkSomaScanVersion(ver)) #' @export checkSomaScanVersion <- function(ver) { - allowed <- c("v3.0", "v4", "v4.0", "v4.1", "v5", "v5.0") + allowed <- c("v4", "v4.0", "v4.1", "v5", "v5.0") if ( !tolower(ver) %in% allowed ) { stop("Unsupported assay version: ", .value(ver), ". Supported versions: ", .value(allowed), call. = FALSE) diff --git a/R/lift-adat.R b/R/lift-adat.R index 8b15dca..daabd46 100644 --- a/R/lift-adat.R +++ b/R/lift-adat.R @@ -17,9 +17,9 @@ #' Likewise, "lifting" from `v4.0` -> `v4.1` requires #' a separate annotations file and a `soma_adat` from SomaScan `v4.0`. #' -#' @param adat A `soma_adat` class object. -#' @param anno.tbl A table of annotations, typically the result of a call -#' to [read_annotations()]. +#' @inheritParams params +#' @param bridge The direction of the lift (i.e. bridge). +#' @param anno.tbl Deprecated. #' @return A "lifted" `soma_adat` object corresponding to the scaling #' reference in the `anno.tbl`. RFU values are rounded to 1 decimal to #' match standard SomaScan delivery format. @@ -50,19 +50,43 @@ #' attr(lifted, "Header")$HEADER$ProcessSteps #' attr(lifted, "Header")$HEADER$SignalSpace #' @importFrom tibble enframe deframe +#' @importFrom lifecycle deprecated is_present #' @export -lift_adat <- function(adat, anno.tbl) { +lift_adat <- function(adat, + bridge = c("11k_to_7k", "11k_to_5k", + "7k_to_11k", "7k_to_5k", + "5k_to_11k", "5k_to_7k"), + anno.tbl = deprecated()) { - stopifnot(inherits(adat, "soma_adat")) + stopifnot( + "`adat` must be a `soma_adat` class object." = inherits(adat, "soma_adat"), + "`adat` must have intact attributes." = is_intact_attr(adat) + ) + + if ( is_present() ) { + deprecate_warn( + "6.1.0", + "SomaDataIO::lift_adat(anno.tbl =)", + "SomaDataIO::lift_adat(bridge =)", + details = "Passing 'anno.tbl =' is now unnecessary." + ) + } + + bridge <- match.arg(bridge) # does a syntax check for allowed params atts <- attr(adat, "Header.Meta")$HEADER - anno_ver <- attr(anno.tbl, "version") - .check_anno(anno_ver) .check_anml(atts) + # the 'space' refers to the SomaScan assay version signal space + # prefer SignalSpace if present; NULL if absent + from_space <- getSomaScanVersion(adat) + checkSomaScanVersion(from_space) + from_space <- map_ver2k[[from_space]] # map ver to k and strip names + new_space <- .check_direction(from_space, bridge) # check and return new space + if ( grepl("Plasma", atts$StudyMatrix, ignore.case = TRUE) ) { - scalar_col <- ver_dict[[anno_ver]]$col_plasma + ref_vec <- .get_lift_ref(matrx = "plasma", bridge = bridge) } else if ( grepl("Serum", atts$StudyMatrix, ignore.case = TRUE) ) { - scalar_col <- ver_dict[[anno_ver]]$col_serum + ref_vec <- .get_lift_ref(matrx = "serum", bridge = bridge) } else { stop( "Unsupported matrix: ", .value(atts$StudyMatrix), ".\n", @@ -71,92 +95,28 @@ lift_adat <- function(adat, anno.tbl) { ) } - if ( scalar_col %in% names(anno.tbl) ) { - anno.tbl <- anno.tbl[, c("SeqId", scalar_col)] - } else { - stop( - "Unable to find the required 'Scalar' column in the annotations file.\n", - "Do you have the correct annotations file?", - call. = FALSE - ) - } - - # the 'space' refers to the assay version signal space - from_space <- atts$SignalSpace # prefer this; NULL if absent - if ( is.null(from_space) ) { - from_space <- atts$AssayVersion # if missing; use this - } - - .check_ver(from_space) - .check_direction(scalar_col, from_space) - - new_space <- gsub(".*(v[0-9]\\.[0-9])$", "\\1", scalar_col) - attr(adat, "Header.Meta")$HEADER$SignalSpace <- new_space - new_step <- sprintf("Annotation Lift (%s to %s)", tolower(from_space), new_space) + # update attrs with new SignalSpace information + attr(adat, "Header.Meta")$HEADER$SignalSpace <- map_k2ver[[new_space]] + attr(adat, "Header.Meta")$HEADER$AssayVersion <- map_k2ver[[new_space]] + new_step <- sprintf("Lifting Bridge (%s to %s)", + tolower(from_space), new_space) steps <- attr(adat, "Header.Meta")$HEADER$ProcessSteps attr(adat, "Header.Meta")$HEADER$ProcessSteps <- paste0(steps, ", ", new_step) - ref_vec <- deframe(anno.tbl) scaleAnalytes(adat, ref_vec) |> round(1L) } - -# Checks ---- -# check attributes of annotations tbl for a version -# x = annotations version from annotations tbl -.check_anno <- function(x) { - if ( is.null(x) ) { - stop("Unable to determine the Annotations file version in `anno.tbl`.\n", - "Please check the attributes via `attr(anno.tbl, 'version')`.", - call. = FALSE) - } - if ( !x %in% names(ver_dict) ) { - stop("Unknown Annotations file version from `anno.tbl`: ", .value(x), - "\nUnable to proceed without knowing annotations table specs.", - call. = FALSE) - } - invisible(NULL) -} - -# check that SomaScan data has been ANML normalized -# x = Header attributes -.check_anml <- function(x) { - steps <- x$ProcessSteps - if ( is.null(steps) | !grepl("ANML", steps, ignore.case = TRUE) ) { - stop("ANML normalized SOMAscan data is required for lifting.", - call. = FALSE) - } - invisible(NULL) -} - -# check supported versions: v4, v4.0, v4.1 -.check_ver <- function(ver) { - allowed <- c("v4", "v4.0", "v4.1") - if ( !tolower(ver) %in% allowed ) { - stop( - "Unsupported assay version: ", .value(ver), - ". Supported versions: ", .value(allowed), call. = FALSE - ) - } - invisible(NULL) -} - -#' @param x the name of the scalar column from the annotations table. -#' @param y the assay version from the adat header information. -#' @noRd -.check_direction <- function(x, y) { - y <- tolower(y) - if ( grepl("4\\.1.*4\\.0", x) & y == "v4" ) { - stop( - "Annotations table indicates v4.1 -> v4.0, however the ADAT object ", - "already appears to be in version ", y, " space.", call. = FALSE - ) - } - if ( grepl("4\\.0.*4\\.1", x) & y == "v4.1" ) { - stop( - "Annotations table indicates v4.0 -> v4.1, however the ADAT object ", - "already appears to be in version ", y, " space.", call. = FALSE - ) - } - invisible(NULL) +#' Test for lifted objects +#' +#' [is_lifted()] checks whether an object +#' has been lifted (bridged) by the presence +#' (or absence) of the `SignalSpace` entry +#' in the `soma_adat` attributes. +#' +#' @rdname lift_adat +#' @return Logical. Whether `adat` has been lifted. +#' @export +is_lifted <- function(adat) { + x <- attr(adat, "Header.Meta")$HEADER + !is.null(x$SignalSpace) } diff --git a/R/s3-print-soma-adat.R b/R/s3-print-soma-adat.R index 15f6c58..0c11705 100644 --- a/R/s3-print-soma-adat.R +++ b/R/s3-print-soma-adat.R @@ -24,7 +24,7 @@ print.soma_adat <- function(x, show_header = FALSE, ...) { atts_symbol <- if ( attsTRUE ) symb_tick else symb_cross meta <- getMeta(x) ver <- getSomaScanVersion(x) %||% "unknown" - ver <- sprintf("%s (%s)", ver, .ss_ver_map[tolower(ver)]) + ver <- sprintf("%s (%s)", ver, map_ver2k[tolower(ver)]) n_apts <- getAnalytes(x, n = TRUE) pad <- strrep(" ", 5L) dim_vars <- c("SomaScan version", "Attributes intact", "Rows", diff --git a/R/sysdata.rda b/R/sysdata.rda new file mode 100644 index 0000000000000000000000000000000000000000..829a19b7962f62393d21b48ef32865508ce63838 GIT binary patch literal 56088 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

vcur6k(9i1bLx>XfS<3G8lEAbjH zNB81C+vbRk_ondA?Wp31F5>9<276$6C0amD#i6kukY5G)82j*H7feF*YA4u63$mjb zhY(a_RBkp2z&1+%@k(Nk&#FEAiM3s*1?ieVDySMNa$5yw)46ong-Cl6b?V#0p9NpS zMImguO1sXE(|_Q^OpDAk8ordtr3nMrpdBCL;Tw8>G;6zz8+mbFl}-PTXr+p9qm{n@ zY0D3v1$bZ9JPlE@P87OQB`~3j)Zk+g)aO&|Rd&L0hK?Qn`HUS$W=}{SiAS#2K`Oxs zr5mGXB*G2a7;Idia04O1J_cIpJR3Ne7_h_4DcDme z_i6s8Xhb=$moXfnUo!A_=P%ebD_C8E`Jpi2bL2CxKW1H1bY_bOukUKV5RLip9Xe>& zi1%q`3pqXDEs^y>8q}@eVJh#Uif+`oz$Ez-&VQ3ju+R(4c4xo6`rHnFzO%8+yR0(Ue<{0}t4*=<-&dj~!{5+QPj2vq2)fWihHA#r z*o0&q`sO9^z%{3{3{bbz(sG;7_i$5e&eIu(CXV%nr%n_y{`g4maZ*r^{C?Lo@-Qsm z4n#Z8KCmiTUp6l`u$LNHB+HnTTwA+YgH-Y}$Ec*>wx0;34-16Kq&5f3iWDGW%01mf zubfTLC(BsjUt(5xl*S5{fmhi(VxGinQrIiYo>)H34=s!)D7O1WmiL{q;3%0(|K4YI zie385!?7zT{Y*ju#S9FNJHTt(HM(aRX~RN>a)-a#DZD z{BZxwPUPg|kU6diJ8(#WY5r$)CdtUiVaINt>UM&c@q0sb3RRC8N)V_TH54f*^zN|9 z^Yd5XI`nqOg@uBd>?lK&2w9T&IS_NjIiEXje4@cWE-Pt58gh~}C@ek-oKmjEC)_d0 zn>dJQ$!u+4I$Er>tq|7H`Qn`m#`(1Q^UdL0d{>IDiuS>r6uV5h<(f+6c=sMLE$&iek(&;i1TSutpFhyuemr_4Bd*;~(B(T_8!guW57>s7en z5tS?9JOx-xb5O79*`3Q#lds3KK-?#0Q!$qGBetPi2yr*Wjs#J{0#_x|$)p`Mr zqHUirI`YYn;n(}Q8(86s2)u@uuw+pXf4(4T>rv|Rd2GzqA>93br|A3E?X7`n^dM>0Uf(3!W6VbRK}c8&~VkLA<3piJ4Okm%ezrt zo7SW8yhgrSwaq~T<1+W~UnzxflEejkXbTwQD3@n)t>hrK%X3y8I&RU?1)0p}T82_Z zvWbVOXbpiJGCRQx~AHL zL~c>zmnjrO0TE*R!MClijIp?N)4toC2~1|jF0y}(7DpJ~)91P5O$Jygqz&b#`TQ-k z#Zq2>Anfn!#&S71ME<2h|FFspJ|jc6&q zpka&u5kIW`7+p6DU9|wfw(g9oW zZ9y+loD2O1b9mv88RaniJD=Im<%UX1`SdHmjD(z=U?ot)p|as-fLsSA|NYw?;=-eg z2Sd8I9W75TudvCFH^-m>g#eM5tgwa0PXrE1SQs_|A<()am8*WeHTu2I5&v$QnHPA4 zO7KtR)>)Fn3flFL4%9^^^1G5|o;F`QE|uy- v4.1 -tbl <- tibble::tibble( - SeqId = getSeqId(apts), "Plasma Scalar v4.0 to v4.1" = c(0.5, 1.1, 1.5) -) -attr(tbl, "version") <- "SL-99999999-rev99-1999-01" # lookup test from `ver_dict` - - +adat <- example_data[1:3L, c("SampleId", apts)] # Testing ---- test_that("a mock table of scalars transforms to correct, rounded values", { - a <- lift_adat(adat, tbl) - expect_equal(a$seq.10000.28, round(adat$seq.10000.28 * 0.5, 1L)) - expect_equal(a$seq.10001.7, round(adat$seq.10001.7 * 1.1, 1L)) - expect_equal(a$seq.10003.15, round(adat$seq.10003.15 * 1.5, 1L)) -}) - -test_that("a reference vector of 1.0 scalars returns identical adat", { - tbl$`Plasma Scalar v4.0 to v4.1` <- 1.0 - a <- lift_adat(adat, tbl) - expect_equal(a, adat, ignore_attr = TRUE) # Header.Meta modified - # check that header entries were added correctly + expect_equal(getSomaScanVersion(adat), "V4") # orig; 5k + expect_warning( a <- lift_adat(adat, bridge = "5k_to_7k") ) + expect_true(is_lifted(a)) + expect_equal(getSomaScanVersion(a), "v4.1") # updated; 7k expect_equal(attr(a, "Header")$HEADER$SignalSpace, "v4.1") - expect_match(attr(a, "Header")$HEADER$ProcessSteps, "Annotation Lift") + expect_match(attr(a, "Header")$HEADER$ProcessSteps, "Lifting Bridge") + expect_equal(a$seq.10000.28, round(adat$seq.10000.28 * 1.054, 1L)) + expect_equal(a$seq.10001.7, round(adat$seq.10001.7 * 1.300, 1L)) + expect_equal(a$seq.10003.15, round(adat$seq.10003.15 * 1.508, 1L)) }) -test_that("an error occurs if analytes are missing from anno.tbl", { - t2 <- head(tbl, 2) +test_that("lifting wrong direction triggers error; .check_direction()", { expect_error( - lift_adat(adat, t2), - paste0("Missing scalar value for 1 analytes. Cannot continue.\n", - "Please check the reference scalars, their names, or the ", - "annotations file to proceed."), fixed = TRUE + lift_adat(adat, "5k_to_5k"), + "'arg' should be one of" ) -}) - -test_that("lifting wrong direction triggers error", { - attributes(adat)$Header.Meta$HEADER$AssayVersion <- "v4.1" expect_error( - lift_adat(adat, tbl), - "Annotations table indicates v4.0 -> v4.1, .* v4.1 space" + lift_adat(adat, "7k_to_5k"), + "You have indicated a bridge from '7k' space" ) -}) - -test_that("error is tripped if Scalar is not found in annotations table", { - names(tbl) <- c("SeqId", "ReferenceScalars") + attr(adat, "Header.Meta")$HEADER$AssayVersion <- "v5.0" # 11k expect_error( - lift_adat(adat, tbl), - "Unable to find the required 'Scalar' column in the annotations file" + lift_adat(adat, "5k_to_7k"), + "You have indicated a bridge from '5k' space" ) }) test_that("un-supported matrices are trapped", { - attributes(adat)$Header.Meta$HEADER$StudyMatrix <- "Cell Lysate" + attr(adat, "Header.Meta")$HEADER$StudyMatrix <- "Cell Lysate" expect_error( - lift_adat(adat, tbl), + lift_adat(adat, "5k_to_7k"), "Unsupported matrix: .*'Cell Lysate'.*\\.\nCurrent supported matrices:" ) }) test_that("only supported assay versions are allowed", { - attributes(adat)$Header.Meta$HEADER$AssayVersion <- "V3" + attr(adat, "Header.Meta")$HEADER$AssayVersion <- "V3" expect_error( - lift_adat(adat, tbl), - "Unsupported assay version: .*V3.*\\. Supported versions:" + lift_adat(adat), + "Unsupported assay version: 'V3'\\. Supported versions:" ) }) test_that("only ANML normalized data can be lifted", { - attributes(adat)$Header.Meta$HEADER$ProcessSteps <- # trim off ANML step - strtrim(attributes(adat)$Header.Meta$HEADER$ProcessSteps, 74) + attr(adat, "Header.Meta")$HEADER$ProcessSteps <- # trim off ANML step + strtrim(attr(adat, "Header.Meta")$HEADER$ProcessSteps, 74L) expect_error( - lift_adat(adat, tbl), + lift_adat(adat), "ANML normalized SOMAscan data is required for lifting." ) })