diff --git a/R/data-model.R b/R/data-model.R index b85f2c3250bd9c17293faeffdb1b26d8bbb5de2e..dd5b1cf978cf38e399a78aba508ceb2a4db24f2b 100644 --- a/R/data-model.R +++ b/R/data-model.R @@ -95,7 +95,9 @@ make_db_precursors <- function(m) { by=precid] setindex(masses,isocoarse,precid) ## Add files. - filetab = m$input$tab$mzml[m$db$cat,.(catid=i.catid,file=file),on=c("set","tag"),nomatch=NULL] + filetab = m$input$tab$mzml[m$db$cat, + .(catid=i.catid,file=file), + on=c("set","tag"),nomatch=NULL] masses[filetab,file:=i.file,on="catid"] m$db$precursors = masses m diff --git a/R/plotting.R b/R/plotting.R index 2b83e5684389fa0376375d3638ed8f815050f90d..9a65c9e010593f2938181fbb3fa2758ee32ecbcc 100644 --- a/R/plotting.R +++ b/R/plotting.R @@ -194,11 +194,23 @@ mk_logic_exp <- function(rest,sofar=NULL) { } -get_data_from_key <- function(tab,key) { - skey <- mk_logic_exp(key) - tab <- eval(bquote(tab[.(skey)])) - setkeyv(tab,names(key)) - tab +get_data_from_key <- function(db,tab,kvals,outcols) { + + ## Ensure only names that exist in cat are used in selection. Or, + ## should we not do this? + valid_names = intersect(names(kvals),colnames(db$cat)) + + ## Turn list into a data.table. + dt = as.data.table(kvals[valid_names]) + + ## Get catids. + cattab = db$cat[dt,on=valid_names] + + ## Get precids. + mztab = db$precursors[cattab,on="catid"] + outnames = c(valid_names,outcols) + tab[mztab,on="precid"][,..outnames] + } @@ -270,12 +282,15 @@ get_data_4_eic_ms1 <- function(db,extr_ms1,summ_rows,kvals,labs) { ## Which of the selected keys are in the extr_ms1? This can be ## made more obvious to the user, but note necessary atm. - keys <- names(kvals) - actual_key <- intersect(keys,names(extr_ms1)) - actual_kvals <- kvals[actual_key] + keys = names(kvals) + actual_key = intersect(keys,names(extr_ms1)) + actual_kvals = kvals[actual_key] browser() ## Subset extr_ms1 by the actual key. - tab <-get_data_from_key(tab=extr_ms1,key=actual_kvals) + tab = get_data_from_key(db=db, + tab=extr_ms1, + kvals=kvals, + outcols = c("mz","rt","intensity")) ## Group the plot data per label group (ie tags, or adducts, or ## both). @@ -295,8 +310,8 @@ get_data_4_eic_ms1 <- function(db,extr_ms1,summ_rows,kvals,labs) { } ## Prepare MS2 eic data: rt and intensity + key made of splitby. -get_data_4_eic_ms2 <- function(summ,kvals,labs) { - tab <-get_data_from_key(tab=summ,key=kvals) +get_data_4_eic_ms2 <- function(db,summ,kvals,labs) { + tab = get_data_from_key(db=db,tab=summ,kvals=kvals,outcols=names(kvals)) nms <- names(kvals) byby <- unique(c(nms,labs,"scan")) pdata <- tab[,.(intensity=ms2_int,rt=ms2_rt),by=byby] @@ -308,18 +323,27 @@ get_data_4_eic_ms2 <- function(summ,kvals,labs) { } -get_rows_from_summ <- function(summ,kvals,...) { - summ_rows_cols <- union(names(kvals),c(...)) - get_data_from_key(summ,key=kvals)[,unique(.SD),.SDcol=summ_rows_cols] -} - -narrow_summ <- function(summ,kvals,labs,...) { - keys <- names(kvals) - ## keys <- keys[!is.na(keys)] - needed <- setdiff(labs,keys) - x <- as.list(c(needed,...)) - x <- c(list(summ,kvals),x) - do.call(get_rows_from_summ,x) +## get_rows_from_summ <- function(db,summ,kvals,...) { +## summ_rows_cols <- union(names(kvals),c(...)) +## get_data_from_key(db=db,tab=summ,kvals=kvals)[,unique(.SD),.SDcol=summ_rows_cols] +## } + +narrow_summ <- function(db,summ,kvals,labs,...) { + keys = names(kvals) + nms = union(names(kvals), + labs) + nms = union(nms,c(...)) + nsumm = get_data_from_key(db=db, + tab=summ, + kvals=kvals, + outcols=nms) + ## ## keys <- keys[!is.na(keys)] + ## needed <- setdiff(labs,keys) + ## x <- as.list(c(needed,...)) + + ## x <- c(list(db=db,tab=summ,kvals=kvals),x) + ## do.call(get_rows_from_summ,x) + nsumm } @@ -329,13 +353,14 @@ make_eic_ms1_plot <- function(db,extr_ms1,summ,kvals,labs,axis="linear",rt_range ## If nothing selected, just return NULL. if (is.null(kvals)) return(NULL) - key <- names(kvals) + key = names(kvals) ## Get metadata. ## TODO: FIXME: Somehow calculating representationve ms1_rt for ## plots is wrong. Horrible and wrong. Will remove those labels ## until we fix. - summ_rows <- narrow_summ(summ,kvals,labs,"mz","ms1_rt","ms1_int","Name","SMILES","qa_ms1_exists","scan","ms2_sel") + summ_rows = narrow_summ(db=db,summ,kvals,labs,"mz","ms1_rt","ms1_int","Name","SMILES","qa_ms1_exists","scan","ms2_sel") + browser() rows_key <- union(data.table::key(summ_rows),labs) summ_rows$sel_ms1_rt=NA_real_ summ_rows[ms2_sel==T,sel_ms1_rt:=ms1_rt[which.max(ms1_int)],by=rows_key] @@ -387,7 +412,7 @@ make_eic_ms2_plot <- function(summ,kvals,labs,axis="linear",rt_range=NULL,asp=1, if (is.null(kvals)) return(NULL) ## Get metadata. - summ_rows <- narrow_summ(summ,kvals,labs,"mz","ms2_rt","ms2_int","Name","SMILES") + summ_rows <- narrow_summ(db=db,summ,kvals,labs,"mz","ms2_rt","ms2_int","Name","SMILES") ## Get plotting data for the compound. pdata <- get_data_4_eic_ms2(summ, @@ -423,15 +448,19 @@ make_eic_ms2_plot <- function(summ,kvals,labs,axis="linear",rt_range=NULL,asp=1, } -make_spec_ms2_plot <- function(extr_ms2,summ,kvals,labs,axis="linear",asp=1, colrdata=NULL) { +make_spec_ms2_plot <- function(db,extr_ms2,summ,kvals,labs,axis="linear",asp=1, colrdata=NULL) { ## Only the chosen ones. - mdata <- get_data_from_key(summ,key=kvals)[ms2_sel==T] + mdata = get_data_from_key(db=db, + tab=summ, + kvals=kvals, + outcols=union(names(kvals), + colnames(summ)))[ms2_sel==T] common_key <- intersect(names(extr_ms2),names(kvals)) common_vals <- kvals[common_key] if (length(common_key) == 0L) return(NULL) - subxdata <- get_data_from_key(extr_ms2,key=common_vals) + subxdata <- get_data_from_key(db=db,tab=extr_ms2,kvals=common_vals) if (NROW(mdata)==0L) return(NULL) if (NROW(subxdata) == 0L) return(NULL) ans <- data.table(scan=mdata[,unique(scan)],key="scan")