Skip to content
Snippets Groups Projects
Commit 16b8ca0e authored by Todor Kondić's avatar Todor Kondić
Browse files

app, tests, shiny-*: Add MetFrag panel logic.

* envopts (envopts): Update. Normalise MetFrag paths.

* resources (METFRAG_DATABASE_TYPE, METFRAG_REMOTE_DATABASE_TYPE,
METFRAG_LOCAL_DATABASE_TYPE): Updated. Rearranged for finer control.

* shiny-state (make_metfrag_panel): New function.

* shiny-ui-base (mf-database-type): New observer.
(cando_metfrag, metfrag_panel): New outputs.

* app (MetFrag): Update section header. Delete hardwired controls.
(metfrag_panel): New control which replaced the hardwired controls.

tests: Update with new functionality.
parent 89218c8f
No related branches found
No related tags found
No related merge requests found
Pipeline #67313 passed
......@@ -50,4 +50,8 @@ importFrom(MSnbase,filterMz)
importFrom(MSnbase,readMSData)
importFrom(promises,"%...>%")
importFrom(promises,future_promise)
importFrom(shiny,HTML)
importFrom(shiny,numericInput)
importFrom(shiny,selectInput)
importFrom(shiny,textInput)
importFrom(shiny,validate)
......@@ -38,10 +38,19 @@ envopts <- function(metfrag_db_dir="",metfrag_jar="") {
#object.
check_dir_absent(metfrag_db_dir,what="mf-db-dir")
res$metfrag$db_dir = metfrag_db_dir
res$metfrag$db_dir = norm_path(metfrag_db_dir)
check_file_absent(metfrag_jar,what="mf-jar")
res$metfrag$jar = metfrag_jar
res$metfrag$jar = norm_path(metfrag_jar)
res
}
is_metfrag_available <- function(e) {
nchar(e$metfrag$jar)>0L
}
is_metfrag_local_available <- function(e) {
is_metfrag_available(e) && nchar(e$metfrag$db_dir)>0L
}
......@@ -317,7 +317,10 @@ METFRAG_ADDUCTS = c("[M+H]+","[M+NH4]+","[M+Na]+","[M+K]+",
"[M-H]-","[M+Cl]-","[M+HCOO]-","[M+CH3COO]-","[M]+/-")
METFRAG_WRITER_CHOICES = c("CSV","PSV","XLS")
METFRAG_DEFAULT_WRITER = "CSV"
METFRAG_DATABASE_TYPE = c("KEGG","PubChem","ExtendedPubChem","LocalSDF","LocalPSV","LocalCSV")
METFRAG_LOCAL_DATABASE_TYPE = c("LocalSDF","LocalPSV","LocalCSV")
METFRAG_REMOTE_DATABASE_TYPE = c("KEGG","PubChem","ExtendedPubChem")
METFRAG_DATABASE_TYPE = c(METFRAG_REMOTE_DATABASE_TYPE, METFRAG_LOCAL_DATABASE_TYPE)
METFRAG_DEFAULT_REMOTE_DATABASE_TYPE = "PubChem"
METFRAG_DEFAULT_DATABASE_TYPE = "LocalCSV"
METFRAG_PREPFLT_CHOICES = c("UnconnectedCompoundFilter","IsotopeFilter")
METFRAG_PREPFLT_DEFAULT = c("UnconnectedCompoundFilter","IsotopeFilter")
......
## Managing the state of shiny application.
## Copyright (C) 2020,2021,2023 by University of Luxembourg
## Licensed under the Apache License, Version 2.0 (the "License");
## you may not use this file except in compliance with the License.
## You may obtain a copy of the License at
## http://www.apache.org/licenses/LICENSE-2.0
## Unless required by applicable law or agreed to in writing, software
## distributed under the License is distributed on an "AS IS" BASIS,
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
## See the License for the specific language governing permissions and
## limitations under the License.
## Description
##
## Helpers used in shiny server. Makes testing easier.
## Imports from shiny:
#' @importFrom shiny selectInput numericInput textInput HTML
GUI_SELECT_INPUTS <- c("proj_list",
......@@ -507,3 +528,61 @@ get_mprop_ms2_metadata <- function(ltab_entry) {
res
}
make_metfrag_panel <- function(envopts) {
ctrls = list(HTML("MetFrag submodule has been disabled, because no MetFrag runtime has been specified in `envopts'"))
if (is_metfrag_available(envopts)) {
if (is_metfrag_local_available(envopts)) {
dbtype = selectInput("mf_database_type", label="Database type",
choices=METFRAG_DATABASE_TYPE,
selected=METFRAG_DEFAULT_DATABASE_TYPE)
dbselect = selectInput("mf_local_database_path",
"Local Database Path",
choices=character(0))
} else {
dbtype = selectInput("mf_database_type", label="Database type",
choices=METFRAG_REMOTE_DATABASE_TYPE,
selected=METFRAG_DEFAULT_REMOTE_DATABASE_TYPE)
dbselect = HTML("No local MetFrag databases available.")
}
ctrls = list(numericInput("mf_database_search_relative_mass_deviation",
label="Database search relative mass deviation",
value=5),
numericInput("mf_fragment_peak_match_absolute_mass_deviation",
label="Fragment peak match absolute mass deviation",
value=5),
numericInput("mf_fragment_peak_match_relative_mass_deviation",
label="Fragment peak match relative mass deviation",
value=5),
numericInput("mf_maximum_tree_depth", label="MaximumTreeDepth",
value=2),
selectInput("mf_metfrag_candidate_writer",
label="MetFrag Candidate Writer",
choices=shinyscreen:::METFRAG_WRITER_CHOICES,
selected=shinyscreen:::METFRAG_DEFAULT_WRITER),
dbtype,
dbselect,
selectInput("mf_pre_processing_candidate_filter",
label="Preprocessing candidate filter",
choices=shinyscreen:::METFRAG_PREPFLT_CHOICES,
selected=shinyscreen:::METFRAG_PREPFLT_DEFAULT,
multiple=T),
selectInput("mf_post_processing_candidate_filter",
label="Postprocessing candidate filter",
choices=shinyscreen:::METFRAG_POSTPFLT_CHOICES,
selected=shinyscreen:::METFRAG_POSTPFLT_DEFAULT,
multiple=T),
textInput("mf_score_types",label="Score
Types",value=METFRAG_STANDARD_SCORES),
textInput("mf_score_weights",label="Score Weights",
value=METFRAG_STANDARD_WEIGHTS))
}
ctrls
}
......@@ -970,10 +970,7 @@ mk_shinyscreen_server <- function(projects,init) {
wd <- input$proj_list
req(!is.null(wd) && !is.na(wd) && nchar(wd)>0)
fullwd <- file.path(init$projects,wd)
fullwdq <- file.exists(fullwd)
if (!fullwdq) {
stop("The project path does not exist!?")
}
check_dir_absent(fullwd,what="project")
## Load saved state if existing, create if it does not.
fn_packed_state <- file.path(fullwd,FN_GUI_STATE)
fn_state <- file.path(fullwd,FN_STATE)
......@@ -1198,6 +1195,24 @@ mk_shinyscreen_server <- function(projects,init) {
})
})
## OBSERVERS: METFRAG
observeEvent(input$mf_database_type,{
dtype = input$mf_database_type
if (dtype %in% METFRAG_LOCAL_DATABASE_TYPE) {
if (dtype == "LocalCSV") patt = "(csv)|(CSV)$"
if (dtype == "LocalSDF") patt = "(sdf)|(SDF)$"
if (dtype == "LocalPSV") patt = "(psv)|(PSV)$"
updateSelectInput(session=session,
inputId="mf_local_database_path",
choices=list.files(path=init$envopts$metfrag$db_dir,
pattern=patt))
} else {
updateSelectInput(session=session,
inputId="mf_local_database_path",
choices=character(0))
}
}, label = "mf-database-type")
## OBSERVERS: VIEWER
......@@ -1519,6 +1534,18 @@ mk_shinyscreen_server <- function(projects,init) {
## scroller = T))
})
## RENDER: METFRAG
output$cando_metfrag = renderText({
if (is_metfrag_available(init$envopts))
"available" else "unavailable"
})
output$metfrag_panel = renderUI({
ctrls = make_metfrag_panel(envopts=init$envopts)
do.call(tagList,ctrls)
})
## RENDER: STATUS
output$is_extracted_stat <- renderText({
......
......@@ -493,48 +493,14 @@ shinyscreen::rt_input(input_rt = "ret_time_shift_tol",
def_unit = vu[['unit']])
```
### MetFrag (experimental, optional)
### MetFrag (`r htmlOutput("cando_metfrag", inline=T)`)
If `java` and `MetFragCL` are available, Shinyscreen can run
`MetFragCL`. The configuration is a subset of what a MetFrag config
file looks like.
```{r, echo=F}
numericInput("mf_database_search_relative_mass_deviation",
label="Database search relative mass deviation",
value=5)
numericInput("mf_fragment_peak_match_absolute_mass_deviation",
label="Fragment peak match absolute mass deviation",
value=5)
numericInput("mf_fragment_peak_match_relative_mass_deviation",
label="Fragment peak match relative mass deviation",
value=5)
numericInput("mf_maximum_tree_depth",
label="MaximumTreeDepth",
value=2)
selectInput("mf_metfrag_candidate_writer",
label="MetFrag Candidate Writer",
choices=shinyscreen:::METFRAG_WRITER_CHOICES,
selected=shinyscreen:::METFRAG_DEFAULT_WRITER)
selectInput("mf_database_type",
label="Database type",
choices=shinyscreen:::METFRAG_DATABASE_TYPE,
selected=shinyscreen:::METFRAG_DEFAULT_DATABASE_TYPE)
selectInput("mf_local_database_path","Local Database Path",
choices=NA_character_,
selected=NA_character_)
selectInput("mf_pre_processing_candidate_filter",
label="Preprocessing candidate filter",
choices=shinyscreen:::METFRAG_PREPFLT_CHOICES,
selected=shinyscreen:::METFRAG_PREPFLT_DEFAULT,
multiple=T)
selectInput("mf_post_processing_candidate_filter",
label="Postprocessing candidate filter",
choices=shinyscreen:::METFRAG_POSTPFLT_CHOICES,
selected=shinyscreen:::METFRAG_POSTPFLT_DEFAULT,
multiple=T)
textInput("mf_score_types",label="Score Types",value=METFRAG_STANDARD_SCORES)
textInput("mf_score_weights",label="Score Weights",value=METFRAG_STANDARD_WEIGHTS)
uiOutput('metfrag_panel')
```
### Report
......
test_that("Test make_metfrag_panel (local and remote)",{
withr::with_tempdir({
mfdb = "demodb.csv"
mfdbdir = "demodir"
dir.create(mfdbdir)
mfjar = "demomf.jar"
saveRDS("",file.path(mfdbdir,mfdb))
saveRDS("",mfjar)
eo = envopts(metfrag_db_dir = mfdbdir,
metfrag_jar = mfjar)
xx = make_metfrag_panel(eo)
res = sapply(METFRAG_DATABASE_TYPE,function (p) {grepl(p,xx[[6L]])})
expect_true(all(res))
})
})
test_that("Test make_metfrag_panel (remote)",{
withr::with_tempdir({
mfjar = "demomf.jar"
saveRDS("",mfjar)
eo = envopts(metfrag_jar = mfjar)
xx = make_metfrag_panel(eo)
res = sapply(METFRAG_REMOTE_DATABASE_TYPE,function (p) {grepl(p,xx[[6L]])})
expect_true(all(res))
res2 = sapply(METFRAG_LOCAL_DATABASE_TYPE,function (p) {grepl(p,xx[[6L]])})
expect_false(any(res2))
})
})
test_that("Test make_metfrage_panel (disabled)",{
eo = envopts()
xx = make_metfrag_panel(eo)
expect_true(length(xx)==1L)
})
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment