From 72b30e961aae78e08b88f0e0d57dab5a7115ed5b Mon Sep 17 00:00:00 2001 From: Philip Cheung Date: Thu, 20 Apr 2023 20:11:58 -0700 Subject: [PATCH 1/5] Added support for Experiment Status to generic_data_parser.R --- .../src/server/generic_data_parser.R | 75 +++++++++++++++++-- 1 file changed, 68 insertions(+), 7 deletions(-) diff --git a/modules/GenericDataParser/src/server/generic_data_parser.R b/modules/GenericDataParser/src/server/generic_data_parser.R index 911fd7402..62a1a85f4 100644 --- a/modules/GenericDataParser/src/server/generic_data_parser.R +++ b/modules/GenericDataParser/src/server/generic_data_parser.R @@ -108,9 +108,9 @@ validateMetaData <- function(metaData, configList, username, formatSettings = li } else { expectedDataFormat <- data.frame( headers = c("Format",paste0(racas::applicationSettings$client.protocol.label," Name"),"Assay Tree Rule",paste0(racas::applicationSettings$client.experiment.label, " Name"),paste0(racas::applicationSettings$client.experiment.label," Details"),"Scientist","Notebook","In Life Notebook", - "Short Description", paste0(racas::applicationSettings$client.experiment.label," Keywords"), "Page","Assay Date"), - class = c("Text", "Text", "Text", "Text", "Text","Text","Text", "Text", "Text", "Text", "Text", "Date"), - isNullable = c(FALSE, FALSE, TRUE,FALSE, TRUE,FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE) + "Short Description", paste0(racas::applicationSettings$client.experiment.label," Keywords"), "Page","Assay Date","Experiment Status"), + class = c("Text", "Text", "Text", "Text", "Text","Text","Text", "Text", "Text", "Text", "Text", "Date", "Text"), + isNullable = c(FALSE, FALSE, TRUE,FALSE, TRUE,FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE) ) projectRequired <- !is.null(configList$client.include.project) && configList$client.include.project shouldSaveProject <- !is.null(configList$client.save.project) && configList$client.save.project @@ -203,6 +203,10 @@ validateMetaData <- function(metaData, configList, username, formatSettings = li validatedMetaData$Scientist <- validateScientist(validatedMetaData$Scientist, configList, testMode) } + if (!is.null(validatedMetaData["Experiment Status"])) { + validatedMetaData["Experiment Status CodeValue"] = validateExperimentStatus(validatedMetaData["Experiment Status"], configList, testMode) + } + projectRequired <- !is.null(configList$client.include.project) && configList$client.include.project shouldSaveProject <- !is.null(configList$client.save.project) && configList$client.save.project projectRowSupplied <- !is.null(metaData$Project) @@ -2111,7 +2115,7 @@ createNewExperiment <- function(metaData, protocol, lsTransaction, pathToGeneric # creates an experiment using the metaData # # Args: - # metaData: A data.frame including "Experiment Name", "Scientist", "Notebook", "Page", and "Assay Date" + # metaData: A data.frame including "Experiment Name", "Experiment Status", "Scientist", "Notebook", "Page", and "Assay Date" # protocol: A list that is a protocol # lsTransaction: A list that is a lsTransaction tag # pathToGenericDataFormatExcelFile: Currently unused; the file path to the uploaded Excel file @@ -2163,7 +2167,8 @@ createNewExperiment <- function(metaData, protocol, lsTransaction, pathToGeneric codeType = "assay", codeKind = "scientist", lsTransaction= lsTransaction) - experimentStatus <- racas::applicationSettings$server.sel.experimentStatus + # experimentStatus <- racas::applicationSettings$server.sel.experimentStatus + experimentStatus <- metdata["Experiment Status CodeValue"] if (is.null(experimentStatus) || experimentStatus == "") { experimentStatus <- "approved" } @@ -2372,6 +2377,61 @@ validateProject <- function(projectName, configList, username, protocolName = NU return("") } } + +validateExperimentStatus <- function(experimentStatusToValidate, configList, testMode = FALSE) { + # validates that the supplied experiment status is in the code values + + # Args: + # experimentStatusToValidate: A string belonging to the experiment(type) status(kind) codetable + # configList: Also known as racas::applicationSettings + # testMode: If true, the function bypasses Roo services and gives a database-independent answer + # + # Returns: + # The scientist's name if they are registered, and the empty string if they are not + require('utils') + require('RCurl') + require('rjson') + + response <- NULL + # username <- "username" + + if (!testMode) { + response <- tryCatch({ + url <- paste0(racas::applicationSettings$server.nodeapi.path, "/api/codetables/experiment/status") + getURL(URLencode(url)) + }, error = function(e) { + addError( paste("There was an error in validating the experiment status", experimentStatusToValidate)) + return("") + }) + } else { # In test mode, provide the three possible answers + if (experimentStatusToValidate == "unknownStatus") { + response <- "" + } else if (experimentStatusToValidate == "") { + response <- "Cannot GET /api/codetables/experiment/status" + } else { + response <- toJSON(list(experimentStatus = experimentStatusToValidate)) + } + } + + experimentStatus <- tryCatch({ + response <- jsonlite::fromJSON(response) + matchingStatus <- response[tolower(response$code) == tolower(experimentStatusToValidate), ] + print("matching status") + print(matchingStatus) + if (nrow(response) == 0 || nrow(matchingStatus) == 0) { + addError( paste0("The experiment status you supplied, '", experimentStatusToValidate, "', is not a valid experiment status. Please select a valid experiment status")) + return("") + } else { + return(matchingStatus[1,]$code) + } + }, error = function(e) { + addError( paste("There was an error in validating the experiment status name:", experimentStatusToValidate)) + return("") + }) + + return(experimentStatus) +} + validateScientist <- function(scientistName, configList, testMode = FALSE) { # validates that the supplied scientist's name is on file with Roo services # @@ -3446,7 +3506,7 @@ runMain <- function(pathToGenericDataFormatExcelFile, reportFilePath=NULL, validatedMetaData <- validatedMetaDataList$validatedMetaData duplicateExperimentNamesAllowed <- validatedMetaDataList$duplicateExperimentNamesAllowed useExisting <- validatedMetaDataList$useExisting - + inputFormat <- as.character(validatedMetaData$Format) rawOnlyFormat <- inputFormat %in% names(customFormatSettings) @@ -3862,7 +3922,8 @@ parseGenericData <- function(request) { # This is used for development: outputs the JSON rather than sending it to the # server and does not wrap everything in tryCatch so debug will keep printing developmentMode <- messenger()$devMode - + developmentMode<-TRUE + # Collect the information from the request request <- as.list(request) pathToGenericDataFormatExcelFile <- request$fileToParse From 6b42862490944f2a51da0a762351e57763ca98e1 Mon Sep 17 00:00:00 2001 From: Philip Cheung Date: Mon, 1 May 2023 10:37:37 -0700 Subject: [PATCH 2/5] Added Support for experiment status to SEL loader --- .../src/server/generic_data_parser.R | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/modules/GenericDataParser/src/server/generic_data_parser.R b/modules/GenericDataParser/src/server/generic_data_parser.R index 62a1a85f4..6ac147ab2 100644 --- a/modules/GenericDataParser/src/server/generic_data_parser.R +++ b/modules/GenericDataParser/src/server/generic_data_parser.R @@ -203,9 +203,13 @@ validateMetaData <- function(metaData, configList, username, formatSettings = li validatedMetaData$Scientist <- validateScientist(validatedMetaData$Scientist, configList, testMode) } - if (!is.null(validatedMetaData["Experiment Status"])) { - validatedMetaData["Experiment Status CodeValue"] = validateExperimentStatus(validatedMetaData["Experiment Status"], configList, testMode) - } + + if ("Experiment Status" %in% names(validatedMetaData)) { + if (!is.null(validatedMetaData$"Experiment Status")) { + validatedMetaData$"Experiment Status" = validateExperimentStatus(validatedMetaData$"Experiment Status", configList, testMode) + } + } + projectRequired <- !is.null(configList$client.include.project) && configList$client.include.project shouldSaveProject <- !is.null(configList$client.save.project) && configList$client.save.project @@ -217,7 +221,6 @@ validateMetaData <- function(metaData, configList, username, formatSettings = li if (shouldSaveProject & projectRowSupplied & !projectRowSuppliedButEmpty) { validatedMetaData$Project <- validateProject(validatedMetaData$Project, configList, username, validatedMetaData[,paste0(racas::applicationSettings$client.protocol.label," Name")], errorEnv) } - if(!is.null(validatedMetaData[paste0(racas::applicationSettings$client.experiment.label," Name")]) && grepl("CREATETHISEXPERIMENT$", validatedMetaData[paste0(racas::applicationSettings$client.experiment.label," Name")])) { validatedMetaData[paste0(racas::applicationSettings$client.experiment.label," Name")] <- trim(gsub("CREATETHISEXPERIMENT$", "", validatedMetaData[paste0(racas::applicationSettings$client.experiment.label," Name")])) duplicateExperimentNamesAllowed <- TRUE @@ -2168,7 +2171,7 @@ createNewExperiment <- function(metaData, protocol, lsTransaction, pathToGeneric codeKind = "scientist", lsTransaction= lsTransaction) # experimentStatus <- racas::applicationSettings$server.sel.experimentStatus - experimentStatus <- metdata["Experiment Status CodeValue"] + experimentStatus <- metaData$"Experiment Status" if (is.null(experimentStatus) || experimentStatus == "") { experimentStatus <- "approved" } @@ -3770,6 +3773,9 @@ runMain <- function(pathToGenericDataFormatExcelFile, reportFilePath=NULL, summaryInfo$info$"Format" <- as.character(validatedMetaData$Format) summaryInfo$info[configList$client.protocol.label] <- as.character(validatedMetaData[,paste0(racas::applicationSettings$client.protocol.label," Name")]) summaryInfo$info[configList$client.experiment.label] <- as.character(validatedMetaData[,paste0(racas::applicationSettings$client.experiment.label," Name")]) + if (!is.null(validatedMetaData$"Experiment Status")) { + summaryInfo$info$"Experiment Status" <- as.character(validatedMetaData$"Experiment Status") + } summaryInfo$info$"Scientist" <- validatedMetaData$Scientist summaryInfo$info$"Notebook" <- validatedMetaData$Notebook if(!is.null(validatedMetaData$Page)) { @@ -3922,7 +3928,7 @@ parseGenericData <- function(request) { # This is used for development: outputs the JSON rather than sending it to the # server and does not wrap everything in tryCatch so debug will keep printing developmentMode <- messenger()$devMode - developmentMode<-TRUE + # developmentMode<-TRUE # Collect the information from the request request <- as.list(request) @@ -4724,6 +4730,3 @@ createColumnOrderStates <- function(exptDataColumns=selColumnOrderInfo, errorEnv } return(experimentStates) } - - - From 0c67983b7c9aa80772cf435d57ec790f49fe9896 Mon Sep 17 00:00:00 2001 From: Philip Cheung Date: Mon, 1 May 2023 10:43:02 -0700 Subject: [PATCH 3/5] Update generic_data_parser.R Fixed comment --- modules/GenericDataParser/src/server/generic_data_parser.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/GenericDataParser/src/server/generic_data_parser.R b/modules/GenericDataParser/src/server/generic_data_parser.R index 6ac147ab2..ae37baa79 100644 --- a/modules/GenericDataParser/src/server/generic_data_parser.R +++ b/modules/GenericDataParser/src/server/generic_data_parser.R @@ -2390,7 +2390,7 @@ validateExperimentStatus <- function(experimentStatusToValidate, configList, tes # testMode: If true, the function bypasses Roo services and gives a database-independent answer # # Returns: - # The scientist's name if they are registered, and the empty string if they are not + # The experiment status code value, and the empty string if they are not require('utils') require('RCurl') require('rjson') From df1c4abaf096f4cc8058dcc672f92ac6b5d610b6 Mon Sep 17 00:00:00 2001 From: Philip Cheung Date: Wed, 3 May 2023 21:20:42 -0700 Subject: [PATCH 4/5] Made recommended changes by Brian Frost in Pull request --- .../src/server/generic_data_parser.R | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/GenericDataParser/src/server/generic_data_parser.R b/modules/GenericDataParser/src/server/generic_data_parser.R index 6ac147ab2..56e1b359e 100644 --- a/modules/GenericDataParser/src/server/generic_data_parser.R +++ b/modules/GenericDataParser/src/server/generic_data_parser.R @@ -2170,11 +2170,13 @@ createNewExperiment <- function(metaData, protocol, lsTransaction, pathToGeneric codeType = "assay", codeKind = "scientist", lsTransaction= lsTransaction) - # experimentStatus <- racas::applicationSettings$server.sel.experimentStatus experimentStatus <- metaData$"Experiment Status" if (is.null(experimentStatus) || experimentStatus == "") { - experimentStatus <- "approved" + experimentStatus <- racas::applicationSettings$server.sel.experimentStatus } + if (is.null(experimentStatus) || experimentStatus == "") { + experimentStatus <- "approved" + } experimentValues[[length(experimentValues)+1]] <- createStateValue( recordedBy = recordedBy, lsType = "codeValue", @@ -2396,7 +2398,6 @@ validateExperimentStatus <- function(experimentStatusToValidate, configList, tes require('rjson') response <- NULL - # username <- "username" if (!testMode) { response <- tryCatch({ @@ -3928,7 +3929,6 @@ parseGenericData <- function(request) { # This is used for development: outputs the JSON rather than sending it to the # server and does not wrap everything in tryCatch so debug will keep printing developmentMode <- messenger()$devMode - # developmentMode<-TRUE # Collect the information from the request request <- as.list(request) @@ -4730,3 +4730,7 @@ createColumnOrderStates <- function(exptDataColumns=selColumnOrderInfo, errorEnv } return(experimentStates) } + + + + From fe77f997a10d4e54f6bb7458bd023e41d2ad1718 Mon Sep 17 00:00:00 2001 From: Philip Cheung Date: Wed, 3 May 2023 21:21:01 -0700 Subject: [PATCH 5/5] Made recommended changes by Brian Frost in Pull request --- modules/GenericDataParser/src/server/generic_data_parser.R | 4 ---- 1 file changed, 4 deletions(-) diff --git a/modules/GenericDataParser/src/server/generic_data_parser.R b/modules/GenericDataParser/src/server/generic_data_parser.R index 56e1b359e..d253ac701 100644 --- a/modules/GenericDataParser/src/server/generic_data_parser.R +++ b/modules/GenericDataParser/src/server/generic_data_parser.R @@ -4730,7 +4730,3 @@ createColumnOrderStates <- function(exptDataColumns=selColumnOrderInfo, errorEnv } return(experimentStates) } - - - -