diff --git a/DESCRIPTION b/DESCRIPTION index d6506913..c35fd9a4 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,8 +2,8 @@ Type: Package Package: gDRcore Title: Processing functions and interface to process and analyze drug dose-response data -Version: 1.7.6 -Date: 2025-07-15 +Version: 1.7.7 +Date: 2025-07-28 Authors@R: c( person("Bartosz", "Czech", , "bartosz.czech@contractors.roche.com", role = "aut", comment = c(ORCID = "0000-0002-9908-3007")), diff --git a/NEWS.md b/NEWS.md index 927e3d2e..473c82a5 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,6 @@ +## gDRcore 1.7.7 - 2025-07-28 +* replace `row/col_fittings` in source for matrix Metrics assay + ## gDRcore 1.7.6 - 2025-07-15 * swap drugs to unify combination order diff --git a/R/combinations-isobolograms.R b/R/combinations-isobolograms.R index 8cca38f5..bd529a16 100644 --- a/R/combinations-isobolograms.R +++ b/R/combinations-isobolograms.R @@ -1,9 +1,9 @@ #' @keywords combinations calculate_Loewe <- function( df_mean, - row_fittings, - col_fittings, - codilution_fittings, + drug_2, + drug_1, + codilution, series_identifiers, normalization_type, conc_margin = 10 ^ 0.5, @@ -34,22 +34,22 @@ calculate_Loewe <- function( max1_cap <- gDRutils::round_concentration(max(axis_1$conc_1) * conc_margin) max2_cap <- gDRutils::round_concentration(max(axis_2$conc_2) * conc_margin) - data.table::setorder(row_fittings, -cotrt_value) - data.table::setorder(col_fittings, cotrt_value) - if (!is.null(codilution_fittings)) { - data.table::setorder(codilution_fittings, -ratio) - codilution_fittings <- - codilution_fittings[codilution_fittings$fit_type %in% + data.table::setorder(drug_2, -cotrt_value) + data.table::setorder(drug_1, cotrt_value) + if (!is.null(codilution)) { + data.table::setorder(codilution, -ratio) + codilution <- + codilution[codilution$fit_type %in% "DRC3pHillFitModelFixS0", ] # more restrictive to be sure that it adds fit quality - codilution_fittings <- - codilution_fittings[codilution_fittings$N_conc >= min_n_conc & - codilution_fittings$r2 > min_r2, ] + codilution <- + codilution[codilution$N_conc >= min_n_conc & + codilution$r2 > min_r2, ] } futile.logger::flog.debug( "codilution fittings after transformation/filtering:" ) - futile.logger::flog.debug(knitr::kable(codilution_fittings)) + futile.logger::flog.debug(knitr::kable(codilution)) for (isobol_value in iso_cutoffs) { # run through the different isobolograms @@ -58,11 +58,11 @@ calculate_Loewe <- function( # filtered_cf can be empty (i.e. no rows) - this edge case is handled in # calculate_isobolograms filtered_cf <- - codilution_fittings[codilution_fittings$x_inf < (isobol_value - .1), ] + codilution[codilution$x_inf < (isobol_value - .1), ] df_iso <- calculate_isobolograms( - row_fittings, - col_fittings, + drug_2, + drug_1, filtered_cf, isobol_value, max1_cap, @@ -328,9 +328,9 @@ get_isocutoffs <- function(df_mean, normalization_type) { #' @keywords combinations -calculate_isobolograms <- function(row_fittings, - col_fittings, - codilution_fittings, +calculate_isobolograms <- function(drug_2, + drug_1, + codilution, isobol_value, max1_cap, max2_cap) { @@ -338,25 +338,25 @@ calculate_isobolograms <- function(row_fittings, # cutoff point by row conc2 <- gDRutils::predict_conc_from_efficacy( efficacy = isobol_value, - x_inf = row_fittings$x_inf, - x_0 = row_fittings$x_0, - ec50 = row_fittings$ec50, - h = row_fittings$h + x_inf = drug_2$x_inf, + x_0 = drug_2$x_0, + ec50 = drug_2$ec50, + h = drug_2$h ) - row_iso <- data.table::data.table(conc_1 = row_fittings[, cotrt_value], + row_iso <- data.table::data.table(conc_1 = drug_2[, cotrt_value], conc_2 = conc2, fit_type = "by_row") # cutoff point by columns conc1 <- gDRutils::predict_conc_from_efficacy( efficacy = isobol_value, - x_inf = col_fittings$x_inf, - x_0 = col_fittings$x_0, - ec50 = col_fittings$ec50, - h = col_fittings$h + x_inf = drug_1$x_inf, + x_0 = drug_1$x_0, + ec50 = drug_1$ec50, + h = drug_1$h ) col_iso <- data.table::data.table(conc_1 = conc1, - conc_2 = col_fittings[, cotrt_value], + conc_2 = drug_1[, cotrt_value], fit_type = "by_col") xy_iso <- data.table::rbindlist(list(row_iso, col_iso)) @@ -365,17 +365,17 @@ calculate_isobolograms <- function(row_fittings, # cutoff point by diagonal (co-dilution) # co-dil is given as concentration of drug 1 - if (!is.null(codilution_fittings) && NROW(codilution_fittings) > 1) { + if (!is.null(codilution) && NROW(codilution) > 1) { conc_mix <- gDRutils::predict_conc_from_efficacy( efficacy = isobol_value, - x_inf = codilution_fittings$x_inf, - x_0 = codilution_fittings$x_0, - ec50 = codilution_fittings$ec50, - h = codilution_fittings$h + x_inf = codilution$x_inf, + x_0 = codilution$x_0, + ec50 = codilution$ec50, + h = codilution$h ) codil_iso <- data.table::data.table( - conc_1 = conc_mix / (1 + codilution_fittings$ratio), - conc_2 = conc_mix / (1 + (1 / codilution_fittings$ratio)), + conc_1 = conc_mix / (1 + codilution$ratio), + conc_2 = conc_mix / (1 + (1 / codilution$ratio)), fit_type = "by_codil" ) @@ -383,11 +383,11 @@ calculate_isobolograms <- function(row_fittings, capped_idx <- codil_iso$conc_1 > max1_cap | codil_iso$conc_2 > max2_cap codil_iso$conc_1[capped_idx] <- pmin( max1_cap, - codilution_fittings$conc_ratio * max2_cap + codilution$conc_ratio * max2_cap )[capped_idx] codil_iso$conc_2[capped_idx] <- pmin( max2_cap, - max1_cap / codilution_fittings$conc_ratio + max1_cap / codilution$conc_ratio )[capped_idx] isobologram_values <- data.table::rbindlist(list(xy_iso, codil_iso), fill = TRUE) diff --git a/R/fit_SE.combinations.R b/R/fit_SE.combinations.R index 22799eee..603faa0d 100644 --- a/R/fit_SE.combinations.R +++ b/R/fit_SE.combinations.R @@ -151,45 +151,45 @@ fit_SE.combinations <- function(se, # fit by column: the series in the primary identifier, the cotrt is the # secondary one - col_fittings <- fit_combo_cotreatments( + drug_1 <- fit_combo_cotreatments( avg_subset, series_id = id, cotrt_id = id2, norm_type ) - col_fittings <- if (all(is.na(col_fittings$fit_type))) { - x <- col_fittings[1, ] + drug_1 <- if (all(is.na(drug_1$fit_type))) { + x <- drug_1[1, ] x[, "cotrt_value"] <- NA x } else { - na.omit(col_fittings, col = "fit_type") + na.omit(drug_1, col = "fit_type") } # fit by row (flipped): the series in the secondary identifier, the # cotrt is the primary one - row_fittings <- fit_combo_cotreatments( + drug_2 <- fit_combo_cotreatments( avg_subset, series_id = id2, cotrt_id = id, norm_type ) - row_fittings <- na.omit(row_fittings, col = "fit_type") + drug_2 <- na.omit(drug_2, col = "fit_type") # fit by codilution (diagonal) - codilution_fittings <- fit_combo_codilutions( + codilution <- fit_combo_codilutions( avg_subset, series_identifiers, norm_type ) - codilution_fittings <- na.omit(codilution_fittings, col = "fit_type") + codilution <- na.omit(codilution, col = "fit_type") # apply the fit to get smoothed data: results per column # (along primary identifier for each value of the secondary identifier) complete_subset$col_values <- map_ids_to_fits( pred = complete_subset[[id]], match_col = complete_subset[[id2]], - col_fittings, + drug_1, "cotrt_value" ) # apply the fit the get smoothed data: results per row @@ -197,25 +197,25 @@ fit_SE.combinations <- function(se, complete_subset$row_values <- map_ids_to_fits( pred = complete_subset[[id2]], match_col = complete_subset[[id]], - row_fittings, "cotrt_value" + drug_2, "cotrt_value" ) - metrics_names <- c("col_fittings", "row_fittings") - if (!is.null(codilution_fittings)) { + metrics_names <- c("drug_1", "drug_2") + if (!is.null(codilution)) { # apply the fit the get smoothed data: codilution results (along sum # of identifiers for each ratio) complete_subset$codil_values <- map_ids_to_fits( pred = complete_subset[[id2]] + complete_subset[[id]], match_col = gDRutils::round_concentration(complete_subset[[id2]] / complete_subset[[id]], 1), - codilution_fittings, + codilution, "ratio" ) - metrics_names <- c(metrics_names, "codilution_fittings") + metrics_names <- c(metrics_names, "codilution") } metrics_merged <- data.table::rbindlist(mget(metrics_names), fill = TRUE) - # we need it to distinguish which rows are col_fittings/row_fittings + # we need it to distinguish which rows are drug_1/drug_2 # and codilution_fitting - metrics_merged$source <- rep( + metrics_merged$dilution_drug <- rep( metrics_names, vapply(mget(metrics_names), nrow, numeric(1)) ) @@ -288,13 +288,13 @@ fit_SE.combinations <- function(se, ] isobologram_out <- if ( sum((av_matrix_dense[[id]] * av_matrix_dense[[id2]]) > 0) > 9 && - min(row_fittings$cotrt_value) == 0 + min(drug_2$cotrt_value) == 0 ) { calculate_Loewe( av_matrix, - row_fittings, - col_fittings, - codilution_fittings, + drug_2, + drug_1, + codilution, series_identifiers = c(id, id2), normalization_type = norm_type ) @@ -337,13 +337,13 @@ fit_SE.combinations <- function(se, excess$row_id <- isobologram_out$df_all_iso_points$row_id <- isobologram_out$df_all_iso_curves$row_id <- - col_fittings$row_id <- + drug_1$row_id <- scores$row_id <- metrics_merged$row_id <- i excess$col_id <- isobologram_out$df_all_iso_points$col_id <- isobologram_out$df_all_iso_curves$col_id <- - col_fittings$col_id <- + drug_1$col_id <- scores$col_id <- metrics_merged$col_id <- j