Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions DESCRIPTION
Original file line number Diff line number Diff line change
Expand Up @@ -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")),
Expand Down
3 changes: 3 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -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

Expand Down
76 changes: 38 additions & 38 deletions R/combinations-isobolograms.R
Original file line number Diff line number Diff line change
@@ -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,
Expand Down Expand Up @@ -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

Expand All @@ -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,
Expand Down Expand Up @@ -328,35 +328,35 @@ 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) {

# 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))
Expand All @@ -365,29 +365,29 @@ 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"
)

# Keep isobologram values within matrix values.
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)
Expand Down
44 changes: 22 additions & 22 deletions R/fit_SE.combinations.R
Original file line number Diff line number Diff line change
Expand Up @@ -151,71 +151,71 @@ 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
# (along secondary identifier for each value of the primary identifier)
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))
)
Expand Down Expand Up @@ -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
)
Expand Down Expand Up @@ -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

Expand Down
Loading