From 65bd775b68bec20700659a428bd57daf5be43fb0 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 3 May 2021 13:44:51 +0200 Subject: [PATCH 01/23] first implementation of the copy number data tab --- R/global.R | 1 + R/shinyAppServer.R | 8 +- R/shinyAppUI.R | 4 + inst/apphelp/descriptionCnaTab.md | 22 ++++ inst/apphelp/tour_cna.txt | 8 ++ inst/reactives/reactivesCnaTab.R | 188 ++++++++++++++++++++++++++++++ inst/tabs/cnaTab.R | 71 +++++++++++ inst/www/cna-data.png | Bin 0 -> 83108 bytes 8 files changed, 299 insertions(+), 3 deletions(-) create mode 100644 inst/apphelp/descriptionCnaTab.md create mode 100644 inst/apphelp/tour_cna.txt create mode 100644 inst/reactives/reactivesCnaTab.R create mode 100644 inst/tabs/cnaTab.R create mode 100644 inst/www/cna-data.png diff --git a/R/global.R b/R/global.R index 7ef37ae..89b81e9 100644 --- a/R/global.R +++ b/R/global.R @@ -3,6 +3,7 @@ source(system.file("tabs", "studyTab.R", package = "cbpManager"), local = TRUE) source(system.file("tabs", "patientTab.R", package = "cbpManager"), local = TRUE) source(system.file("tabs", "sampleTab.R", package = "cbpManager"), local = TRUE) source(system.file("tabs", "mutationsTab.R", package = "cbpManager"), local = TRUE) +source(system.file("tabs", "cnaTab.R", package = "cbpManager"), local = TRUE) source(system.file("tabs", "timelineTab.R", package = "cbpManager"), local = TRUE) source(system.file("tabs", "resourceTab.R", package = "cbpManager"), local = TRUE) source(system.file("tabs", "validationTab.R", package = "cbpManager"), local = TRUE) diff --git a/R/shinyAppServer.R b/R/shinyAppServer.R index 79a385c..f46336d 100644 --- a/R/shinyAppServer.R +++ b/R/shinyAppServer.R @@ -112,10 +112,12 @@ shinyAppServer <- function(input, output, session) { source(system.file("reactives", "reactivesSampleTab.R", package = "cbpManager"), local = TRUE) # Tab 4 Mutations --------------------------------------------------------------- source(system.file("reactives", "reactivesMutationsTab.R", package = "cbpManager"), local = TRUE) - # Tab 5 Timelines --------------------------------------------------------------- + # Tab 5 Copy Number Data --------------------------------------------------------- + source(system.file("reactives", "reactivesCnaTab.R", package = "cbpManager"), local = TRUE) + # Tab 6 Timelines --------------------------------------------------------------- source(system.file("reactives", "reactivesTimelineTab.R", package = "cbpManager"), local = TRUE) - # Tab 6 Resource data --------------------------------------------------------------- + # Tab 7 Resource data --------------------------------------------------------------- source(system.file("reactives", "reactivesResourceTab.R", package = "cbpManager"), local=TRUE) - # Tab 7 Validation --------------------------------------------------------------- + # Tab 8 Validation --------------------------------------------------------------- source(system.file("reactives", "reactivesValidationTab.R", package = "cbpManager"), local=TRUE) } diff --git a/R/shinyAppUI.R b/R/shinyAppUI.R index 977860a..4d1bee9 100644 --- a/R/shinyAppUI.R +++ b/R/shinyAppUI.R @@ -60,6 +60,7 @@ shinyAppUI <- dashboardPage( menuItem("Patient", tabName = "patient"), menuItem("Sample", tabName = "sample"), menuItem("Mutations", tabName = "mutations"), + menuItem("Copy Number Data", tabName = "cna"), menuItem("Timelines", tabName = "timelines"), menuItem("Resources", tabName = "resource"), menuItem("Validation", tabName = "validation") @@ -98,6 +99,9 @@ shinyAppUI <- dashboardPage( # Tab 4 Mutations - mutationsTab.R mutationsTab, + + # Tab Copy Number Data - cnaTab.R + cnaTab, # Tab 5 Timelines - timelineTab.R timelineTab, diff --git a/inst/apphelp/descriptionCnaTab.md b/inst/apphelp/descriptionCnaTab.md new file mode 100644 index 0000000..4efbac1 --- /dev/null +++ b/inst/apphelp/descriptionCnaTab.md @@ -0,0 +1,22 @@ +**Load a valid Copy Number Data file.** This file is used in cBioPortal for the cna panel (see image on the right.) + +--- + +#### A minimal CNA file with only the columns required for cBioPortal: + +A minimal CNA file can contain just one obligatory column plus an additional column for each sample in the dataset using the sample id as the column header. From this minimal file, it is possible to create an extended version. + +- **Hugo_Symbol (Required)**: (CNA column) A HUGO gene symbol. + +Next to Hugo_Symbol, it is recommended to have the Entrez gene ID: + +- **Entrez_Gene_Id (Optional, but recommended)**: An Entrez Gene identifier. + +The following extra annotation columns are important for complementing or replacing default driver annotation resources OncoKB and HotSpots: + +- **SAMPLE_ID**: (annotation column) A sample ID. This field can only contain numbers, letters, points, underscores and hyphens. +- **cbp_driver (Optional)**: (annotation column) "Putative_Driver", "Putative_Passenger", "Unknown", "NA" or "" (empty value). This field must be present if the cbp_driver_annotation is also present in the MAF file. +- **cbp_driver_annotation (Optional)**: Description field for the cbp_driver value (limited to 80 characters) This field must be present if the cbp_driver is also present in the MAF file. This field is free text. Example values for this field are: "Pathogenic" or "VUS". +- **cbp_driver_tiers (Optional)**: Free label/category that marks the mutation as a putative driver such as "Driver", "Highly actionable", "Potential drug target". This field must be present if the cbp_driver_tiers_annotation is also present in the MAF file. In the OncoPrint view's Mutation Color dropdown menu, these tiers are ordered alphabetically. This field is free text and limited to 20 characters. For mutations without a custom annotation, leave the field blank or type "NA". +- **cbp_driver_tiers_annotation (Optional)**: Description field for the cbp_driver_tiers value (limited to 80 characters). This field must be present if the cbp_driver_tiers is also present on the MAF file. This field can not be present when the cbp_driver_tiers field is not present. + diff --git a/inst/apphelp/tour_cna.txt b/inst/apphelp/tour_cna.txt new file mode 100644 index 0000000..8898bd5 --- /dev/null +++ b/inst/apphelp/tour_cna.txt @@ -0,0 +1,8 @@ +element;intro +#Welcome;Welcome to the interactive tour for cbpManager!

In the Mutation tab, you can add sample data to existing patients and edit already existing samples. In the following you will learn how to do this in detail. +#cna_description;This box contains a description of the Copy Number Data tab. +#cna_img;Here you can see an example image how the copy number data will look later in cBioPortal. +#CNAdata;If the loaded study already has copy number data, it would be shown in this table. +#chooseCNADiv;Upload a CNA file to the study. This file will be concatenated to the existing copy number data. Please have a look at the description box for the correct CNA format! If the upload was successful, the new copy number data is added to the table on the right. +#saveCNA;Make the changes persistent by saving the file! +#Thanks;Thank you for taking the Copy Number Data tab tour of cbpManager! \ No newline at end of file diff --git a/inst/reactives/reactivesCnaTab.R b/inst/reactives/reactivesCnaTab.R new file mode 100644 index 0000000..f60e1fa --- /dev/null +++ b/inst/reactives/reactivesCnaTab.R @@ -0,0 +1,188 @@ +# image --------------------------------------------------------------- +output$CopyNumberDataImg <- renderImage( + { + return( + list( + src = system.file("www", "cna-data.PNG", package = "cbpManager"), + contentType = "image/png", + alt = "annotation-example", + width = "auto" + ) + ) + }, + deleteFile = FALSE +) + +# tour --------------------------------------------------------------- +observeEvent(input$tour_cna, { + tour <- read.delim(system.file("apphelp", "tour_cna.txt", package = "cbpManager"), + sep = ";", stringsAsFactors = FALSE, + row.names = NULL, quote = "") + rintrojs::introjs(session, options = list(steps = tour)) +}) + +# upload file --------------------------------------------------------------- +observeEvent(input$chooseCNA, { + if(!grepl("\\.[txt|tsv]", input$chooseCNA$name)){ + showNotification( + "The file format is not supported. + File should be '.txt', '.tsv'.", + type = "error", + duration = NULL + ) + } else { + uploaded_data <- + as.data.frame(vroom::vroom(input$chooseCNA$datapath, delim = "\t")) + requiredCols <- + "Hugo_Symbol" || "Entrez_Gene_Id" + if (any(!requiredCols %in% colnames(uploaded_data))) { + showNotification( + "One or more of the required columns are missing.", + type = "error", + duration = NULL + ) + } else { + loadedData$data_cna_extended <- + dplyr::bind_rows(uploaded_data, loadedData$data_cna_extended) + } + } + +}) + +# show table --------------------------------------------------------------- +output$CNAdata <- DT::renderDT({ + DT::datatable(loadedData$data_cna_extended, + options = list(scrollX = TRUE) + ) +}) + +# save data --------------------------------------------------------------- +observeEvent(input$saveCNA, { + if(is.null(loadedData$studyID)){ + showNotification( + "Please select and load a study in the 'Study' tab.", + type = "error", + duration = NULL + ) + } + req(loadedData$studyID, loadedData$data_cna_extended, loadedData$data_cna_filename) + write.table( + loadedData$data_cna_extended, + file.path(study_dir, loadedData$studyID, paste0(loadedData$data_cna_filename, ".temp")), + append = FALSE, + sep = "\t", + row.names = FALSE, + col.names = TRUE, + quote = FALSE + ) + file.rename( + file.path(study_dir, loadedData$studyID, paste0(loadedData$data_cna_filename, ".temp")), + file.path(study_dir, loadedData$studyID, loadedData$data_cna_filename) + ) + + # logging + if (!is.null(logDir)) { + writeLogfile( + outdir = logDir, + modified_file = file.path(loadedData$studyID, loadedData$data_cna_filename) + ) + } + + #??????????????? + + # add cases_sequenced + case_list_dir <- + file.path(study_dir, loadedData$studyID, "case_lists") + if (!dir.exists(case_list_dir)) dir.create(case_list_dir) + cases_samples <- + loadedData$data_clinical_sample[4:nrow(loadedData$data_clinical_sample), "SAMPLE_ID"] + cases_sequenced_df <- + data.frame( + V1 = c( + "cancer_study_identifier", + "stable_id", + "case_list_category", + "case_list_name", + "case_list_description", + "case_list_ids" + ), + V2 = c( + loadedData$studyID, + paste0(loadedData$studyID, "_sequenced"), + "all_cases_with_mutation_data", + "Sequenced Tumors", + paste0( + "All sequenced samples (", + nrow(loadedData$data_clinical_sample) - 3, + " samples)" + ), + paste(cases_samples, collapse = "\t") + ) + ) + write.table( + cases_sequenced_df, + file.path(case_list_dir, "cases_sequenced.txt.temp"), + append = FALSE, + sep = ": ", + row.names = FALSE, + col.names = FALSE, + quote = FALSE + ) + file.rename( + file.path(case_list_dir, "cases_sequenced.txt.temp"), + file.path(case_list_dir, "cases_sequenced.txt") + ) + + # cna_mutations_extended + if (!file.exists(file.path(study_dir, loadedData$studyID, "meta_cna_extended.txt"))) { + meta_cna_extended_df <- + data.frame( + V1 = c( + "cancer_study_identifier", + "stable_id", + "profile_name", + "profile_description", + "genetic_alteration_type", + "datatype", + "show_profile_in_analysis_tab", + "data_filename" + ), + V2 = c( + loadedData$studyID, + "mutations", + "Mutations", + "Extended MAF", + "MUTATION_EXTENDED", + "MAF", + "true", + loadedData$data_cna_filename + ) + ) + write.table( + meta_cna_extended_df, + file.path(study_dir, loadedData$studyID, "meta_cna_extended.txt.temp"), + append = FALSE, + sep = ": ", + row.names = FALSE, + col.names = FALSE, + quote = FALSE + ) + file.rename( + file.path(study_dir, loadedData$studyID, "meta_cna_extended.txt.temp"), + file.path(study_dir, loadedData$studyID, "meta_cna_extended.txt") + ) + } + + # logging + if (!is.null(logDir)) { + writeLogfile( + outdir = logDir, + modified_file = file.path(loadedData$studyID, "meta_cna_extended.txt") + ) + } + + showNotification("CNA file submitted successfully!", + type = "message", + duration = 10 + ) +}) \ No newline at end of file diff --git a/inst/tabs/cnaTab.R b/inst/tabs/cnaTab.R new file mode 100644 index 0000000..afb6415 --- /dev/null +++ b/inst/tabs/cnaTab.R @@ -0,0 +1,71 @@ +cnaTab <- tabItem( + tabName = "cna", + div(style="display:inline-block",h2("Copy Number Data")), + div(style="display:inline-block; padding-bottom:15px; margin-left:30px",bsButton( + "tour_cna", + label = "Tour", + icon = icon("question"), + style = "info", + size = "extra-small" + )), + fluidRow( + width = 12, + column( + width = 6, + id = "cna_description", + box( + title = "Description", + collapsible = TRUE, + collapsed = TRUE, + solidHeader = TRUE, + includeMarkdown(system.file("apphelp", "descriptionCnaTab.md", package = "cbpManager")), + width = NULL + ) + ), + column( + width = 6, + id = "cna_img", + box( + title = "Sample from cBioPortal", + collapsible = TRUE, + collapsed = FALSE, + solidHeader = TRUE, + tags$head( + tags$style( + type = "text/css", + "#CopyNumberDataImg img {max-width: 100%; width: 100%; height: auto}" + ) + ), + imageOutput( + "CopyNumberDataImg", + height = "auto" + ), + width = NULL + ) + ) + ), + fluidRow( + width = 12, + box( + column( + 3, + div(id = "chooseCNADiv", + fileInput("chooseCNA", "Choose CNA File", + multiple = FALSE, + accept = c( + "text/tsv", + "text/tab-separated-values,text/plain", + ".tsv", ".txt" + ) + ) + ), + actionButton("saveCNA", "Save CNA file", class = "btn-success") + ), + column( + 9, + DT::DTOutput("CNAdata") + ), + width = 12 + ) + ) +) \ No newline at end of file diff --git a/inst/www/cna-data.png b/inst/www/cna-data.png new file mode 100644 index 0000000000000000000000000000000000000000..9b3372e1177d9ee37bd4953ea319446b6c3cb614 GIT binary patch literal 83108 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 literal 0 HcmV?d00001 From a2f1c2cdc3634a614e701b7360d7a6a58293e08c Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 3 May 2021 14:09:30 +0200 Subject: [PATCH 02/23] add CNA data to testpatient --- inst/apphelp/tour_cna.txt | 2 +- inst/study/testpatient/case_lists/cases_cna.txt | 6 ++++++ inst/study/testpatient/data_CNA.txt | 4 ++++ inst/study/testpatient/meta_CNA.txt | 8 ++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 inst/study/testpatient/case_lists/cases_cna.txt create mode 100644 inst/study/testpatient/data_CNA.txt create mode 100644 inst/study/testpatient/meta_CNA.txt diff --git a/inst/apphelp/tour_cna.txt b/inst/apphelp/tour_cna.txt index 8898bd5..0848d7d 100644 --- a/inst/apphelp/tour_cna.txt +++ b/inst/apphelp/tour_cna.txt @@ -1,5 +1,5 @@ element;intro -#Welcome;Welcome to the interactive tour for cbpManager!

In the Mutation tab, you can add sample data to existing patients and edit already existing samples. In the following you will learn how to do this in detail. +#Welcome;Welcome to the interactive tour for cbpManager!

In the Copy Number Data tab, you can add sample data to existing patients and edit already existing samples. In the following you will learn how to do this in detail. #cna_description;This box contains a description of the Copy Number Data tab. #cna_img;Here you can see an example image how the copy number data will look later in cBioPortal. #CNAdata;If the loaded study already has copy number data, it would be shown in this table. diff --git a/inst/study/testpatient/case_lists/cases_cna.txt b/inst/study/testpatient/case_lists/cases_cna.txt new file mode 100644 index 0000000..9123546 --- /dev/null +++ b/inst/study/testpatient/case_lists/cases_cna.txt @@ -0,0 +1,6 @@ +cancer_study_identifier: testpatient +stable_id: testpatient_cna +case_list_category: all_cases_with_cna_data +case_list_name: Samples with CNA data +case_list_description: All samples with CNA data (2 samples) +case_list_ids: Testpatient_01 Testpatient_02 \ No newline at end of file diff --git a/inst/study/testpatient/data_CNA.txt b/inst/study/testpatient/data_CNA.txt new file mode 100644 index 0000000..14cfc3c --- /dev/null +++ b/inst/study/testpatient/data_CNA.txt @@ -0,0 +1,4 @@ +Hugo_Symbol Testpatient_01 Testpatient_02 +MET 0 1 +ATM -1 0 +ERBB2 2 0 \ No newline at end of file diff --git a/inst/study/testpatient/meta_CNA.txt b/inst/study/testpatient/meta_CNA.txt new file mode 100644 index 0000000..0f60c35 --- /dev/null +++ b/inst/study/testpatient/meta_CNA.txt @@ -0,0 +1,8 @@ +cancer_study_identifier: testpatient +genetic_alteration_type: COPY_NUMBER_ALTERATION +datatype: DISCRETE +stable_id: gistic +show_profile_in_analysis_tab: true +profile_name: Putative copy-number alterations from GISTIC +profile_description: Putative copy-number from GISTIC 2.0. Values: -2 = homozygous deletion; -1 = hemizygous deletion; 0 = neutral / no change; 1 = gain; 2 = high level amplification. +data_filename: data_CNA.txt \ No newline at end of file From 752176006b13f35708135d8d053925f6e15e6c72 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 3 May 2021 17:27:53 +0200 Subject: [PATCH 03/23] changes in reactives --- inst/reactives/reactivesCnaTab.R | 60 +++++++++++++++--------------- inst/reactives/reactivesStudyTab.R | 34 +++++++++++++++++ 2 files changed, 64 insertions(+), 30 deletions(-) diff --git a/inst/reactives/reactivesCnaTab.R b/inst/reactives/reactivesCnaTab.R index f60e1fa..87eecbe 100644 --- a/inst/reactives/reactivesCnaTab.R +++ b/inst/reactives/reactivesCnaTab.R @@ -42,8 +42,8 @@ observeEvent(input$chooseCNA, { duration = NULL ) } else { - loadedData$data_cna_extended <- - dplyr::bind_rows(uploaded_data, loadedData$data_cna_extended) + loadedData$data_cna <- + dplyr::bind_rows(uploaded_data, loadedData$data_cna) } } @@ -51,7 +51,7 @@ observeEvent(input$chooseCNA, { # show table --------------------------------------------------------------- output$CNAdata <- DT::renderDT({ - DT::datatable(loadedData$data_cna_extended, + DT::datatable(loadedData$data_cna, options = list(scrollX = TRUE) ) }) @@ -65,9 +65,9 @@ observeEvent(input$saveCNA, { duration = NULL ) } - req(loadedData$studyID, loadedData$data_cna_extended, loadedData$data_cna_filename) + req(loadedData$studyID, loadedData$data_cna, loadedData$data_cna_filename) write.table( - loadedData$data_cna_extended, + loadedData$data_cna, file.path(study_dir, loadedData$studyID, paste0(loadedData$data_cna_filename, ".temp")), append = FALSE, sep = "\t", @@ -90,7 +90,7 @@ observeEvent(input$saveCNA, { #??????????????? - # add cases_sequenced + # add cases_cna case_list_dir <- file.path(study_dir, loadedData$studyID, "case_lists") if (!dir.exists(case_list_dir)) dir.create(case_list_dir) @@ -108,11 +108,11 @@ observeEvent(input$saveCNA, { ), V2 = c( loadedData$studyID, - paste0(loadedData$studyID, "_sequenced"), - "all_cases_with_mutation_data", - "Sequenced Tumors", + paste0(loadedData$studyID, "_cna"), + "all_cases_with_cna_data", + "Samples with CNA data", paste0( - "All sequenced samples (", + "All samples with CNA data (", nrow(loadedData$data_clinical_sample) - 3, " samples)" ), @@ -120,8 +120,8 @@ observeEvent(input$saveCNA, { ) ) write.table( - cases_sequenced_df, - file.path(case_list_dir, "cases_sequenced.txt.temp"), + cases_cna_df, + file.path(case_list_dir, "cases_cna.txt.temp"), append = FALSE, sep = ": ", row.names = FALSE, @@ -129,38 +129,38 @@ observeEvent(input$saveCNA, { quote = FALSE ) file.rename( - file.path(case_list_dir, "cases_sequenced.txt.temp"), - file.path(case_list_dir, "cases_sequenced.txt") + file.path(case_list_dir, "cases_cna.txt.temp"), + file.path(case_list_dir, "cases_cna.txt") ) - # cna_mutations_extended - if (!file.exists(file.path(study_dir, loadedData$studyID, "meta_cna_extended.txt"))) { - meta_cna_extended_df <- + # meta_CNA + if (!file.exists(file.path(study_dir, loadedData$studyID, "meta_CNA.txt"))) { + meta_cna_df <- data.frame( V1 = c( "cancer_study_identifier", - "stable_id", - "profile_name", - "profile_description", "genetic_alteration_type", "datatype", + "stable_id", "show_profile_in_analysis_tab", + "profile_name", + "profile_description", "data_filename" ), V2 = c( loadedData$studyID, - "mutations", - "Mutations", - "Extended MAF", - "MUTATION_EXTENDED", - "MAF", + "COPY_NUMBER_ALTERATION", + "DISCRETE", + "gistic", "true", + "Putative copy-number alterations from GISTIC", + "Putative copy-number from GISTIC 2.0. Values: -2 = homozygous deletion; -1 = hemizygous deletion; 0 = neutral / no change; 1 = gain; 2 = high level amplification.", loadedData$data_cna_filename ) ) write.table( - meta_cna_extended_df, - file.path(study_dir, loadedData$studyID, "meta_cna_extended.txt.temp"), + meta_cna_df, + file.path(study_dir, loadedData$studyID, "meta_CNA.txt.temp"), append = FALSE, sep = ": ", row.names = FALSE, @@ -168,8 +168,8 @@ observeEvent(input$saveCNA, { quote = FALSE ) file.rename( - file.path(study_dir, loadedData$studyID, "meta_cna_extended.txt.temp"), - file.path(study_dir, loadedData$studyID, "meta_cna_extended.txt") + file.path(study_dir, loadedData$studyID, "meta_CNA.txt.temp"), + file.path(study_dir, loadedData$studyID, "meta_CNA.txt") ) } @@ -177,7 +177,7 @@ observeEvent(input$saveCNA, { if (!is.null(logDir)) { writeLogfile( outdir = logDir, - modified_file = file.path(loadedData$studyID, "meta_cna_extended.txt") + modified_file = file.path(loadedData$studyID, "meta_CNA.txt") ) } diff --git a/inst/reactives/reactivesStudyTab.R b/inst/reactives/reactivesStudyTab.R index 82fddcf..7af0c16 100644 --- a/inst/reactives/reactivesStudyTab.R +++ b/inst/reactives/reactivesStudyTab.R @@ -281,6 +281,12 @@ observeEvent(input$upload, { Variant_Classification = character(), HGVSp_Short = character() ) + loadedData$data_cna_filename <- "data_CNA.txt" + loadedData$data_cna_filename <- data.frame( + Hugo_Symbol = character(), + Testpatient_01 = numeric(), + Testpatient_01 = numeric() + ) loadedData$data_timeline_treatment <- data.frame( PATIENT_ID = character(), START_DATE = numeric(), @@ -413,6 +419,34 @@ observeEvent(input$upload, { ) loadedData$data_mutations_extended <- data_mutations_extended } + + # read data_cna --------------------------------------------------------------- + meta_cna <- + file.path(study_dir, loadedData$studyID, "meta_CNA.txt") + if (file.exists(meta_cna)) { + meta_cna <- read.table(meta_cna, sep = ":") + loadedData$data_cna_filename <- + gsub(" ", "", meta_cna[meta_cna$V1 == "data_filename", ]$V2) + } + + data_cna_file <- + file.path( + study_dir, + loadedData$studyID, + loadedData$data_cna_filename + ) + if (file.exists(data_cna_file)) { + data_cna <- + read.table(data_cna_file, + sep = "\t", + header = TRUE, + comment.char = "#", + stringsAsFactors = FALSE, + quote = "", + fill = FALSE + ) + loadedData$data_cna <- data_cna + } # read data_timeline_treatment --------------------------------------------------------------- data_timeline_treatment_file <- From fd8a20acccc56226db83136ba6f4e794a52bfc11 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 3 May 2021 18:55:21 +0200 Subject: [PATCH 04/23] improved descriptions --- inst/apphelp/descriptionCnaTab.md | 24 ++++++++++++++---------- inst/apphelp/tour_cna.txt | 2 +- inst/reactives/reactivesCnaTab.R | 2 -- inst/tabs/cnaTab.R | 4 ++-- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/inst/apphelp/descriptionCnaTab.md b/inst/apphelp/descriptionCnaTab.md index 4efbac1..95457dc 100644 --- a/inst/apphelp/descriptionCnaTab.md +++ b/inst/apphelp/descriptionCnaTab.md @@ -1,22 +1,26 @@ -**Load a valid Copy Number Data file.** This file is used in cBioPortal for the cna panel (see image on the right.) +**Load a valid copy number data file.** This file is used in cBioPortal for the copy number data panel (see image on the right.) --- -#### A minimal CNA file with only the columns required for cBioPortal: +#### A minimal copy number data file with only the columns required for cBioPortal: -A minimal CNA file can contain just one obligatory column plus an additional column for each sample in the dataset using the sample id as the column header. From this minimal file, it is possible to create an extended version. +The discrete copy number data file contain values that would be derived from copy-number analysis algorithms like GISTIC 2.0 or RAE. For each gene (row) in the data file, the following columns are required in the order specified: -- **Hugo_Symbol (Required)**: (CNA column) A HUGO gene symbol. +- **Hugo_Symbol (Required)**: A HUGO gene symbol. Next to Hugo_Symbol, it is recommended to have the Entrez gene ID: - **Entrez_Gene_Id (Optional, but recommended)**: An Entrez Gene identifier. -The following extra annotation columns are important for complementing or replacing default driver annotation resources OncoKB and HotSpots: +For each sample in the dataset an additional column is required using the sample id as the column header: -- **SAMPLE_ID**: (annotation column) A sample ID. This field can only contain numbers, letters, points, underscores and hyphens. -- **cbp_driver (Optional)**: (annotation column) "Putative_Driver", "Putative_Passenger", "Unknown", "NA" or "" (empty value). This field must be present if the cbp_driver_annotation is also present in the MAF file. -- **cbp_driver_annotation (Optional)**: Description field for the cbp_driver value (limited to 80 characters) This field must be present if the cbp_driver is also present in the MAF file. This field is free text. Example values for this field are: "Pathogenic" or "VUS". -- **cbp_driver_tiers (Optional)**: Free label/category that marks the mutation as a putative driver such as "Driver", "Highly actionable", "Potential drug target". This field must be present if the cbp_driver_tiers_annotation is also present in the MAF file. In the OncoPrint view's Mutation Color dropdown menu, these tiers are ordered alphabetically. This field is free text and limited to 20 characters. For mutations without a custom annotation, leave the field blank or type "NA". -- **cbp_driver_tiers_annotation (Optional)**: Description field for the cbp_driver_tiers value (limited to 80 characters). This field must be present if the cbp_driver_tiers is also present on the MAF file. This field can not be present when the cbp_driver_tiers field is not present. +- **SAMPLE_ID**: A sample ID. This field can only contain numbers, letters, points, underscores and hyphens. +For each gene-sample combination, a copy number level is specified. By default, the following applies: +- "-2" is a deep loss, possibly a homozygous deletion +- "-1" is a single-copy loss (heterozygous deletion) +- "0" is diploid +- "1" indicates a low-level gain +- "2" is a high-level amplification + +Standard settings can be changed by selecting "Change global description" below. \ No newline at end of file diff --git a/inst/apphelp/tour_cna.txt b/inst/apphelp/tour_cna.txt index 0848d7d..fad87e2 100644 --- a/inst/apphelp/tour_cna.txt +++ b/inst/apphelp/tour_cna.txt @@ -3,6 +3,6 @@ element;intro #cna_description;This box contains a description of the Copy Number Data tab. #cna_img;Here you can see an example image how the copy number data will look later in cBioPortal. #CNAdata;If the loaded study already has copy number data, it would be shown in this table. -#chooseCNADiv;Upload a CNA file to the study. This file will be concatenated to the existing copy number data. Please have a look at the description box for the correct CNA format! If the upload was successful, the new copy number data is added to the table on the right. +#chooseCNADiv;Upload a copy number data file to the study. This file will be concatenated to the existing copy number data. Please have a look at the description box for the correct file format! If the upload was successful, the new copy number data is added to the table on the right. #saveCNA;Make the changes persistent by saving the file! #Thanks;Thank you for taking the Copy Number Data tab tour of cbpManager! \ No newline at end of file diff --git a/inst/reactives/reactivesCnaTab.R b/inst/reactives/reactivesCnaTab.R index 87eecbe..a1d7aee 100644 --- a/inst/reactives/reactivesCnaTab.R +++ b/inst/reactives/reactivesCnaTab.R @@ -88,8 +88,6 @@ observeEvent(input$saveCNA, { ) } - #??????????????? - # add cases_cna case_list_dir <- file.path(study_dir, loadedData$studyID, "case_lists") diff --git a/inst/tabs/cnaTab.R b/inst/tabs/cnaTab.R index afb6415..8e56039 100644 --- a/inst/tabs/cnaTab.R +++ b/inst/tabs/cnaTab.R @@ -50,7 +50,7 @@ cnaTab <- tabItem( column( 3, div(id = "chooseCNADiv", - fileInput("chooseCNA", "Choose CNA File", + fileInput("chooseCNA", "Choose Copy Number Data File", multiple = FALSE, accept = c( "text/tsv", @@ -59,7 +59,7 @@ cnaTab <- tabItem( ) ) ), - actionButton("saveCNA", "Save CNA file", class = "btn-success") + actionButton("saveCNA", "Save file", class = "btn-success") ), column( 9, From a20afee4d5937f5f65cfea8dc9500d01de90cc6f Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 4 May 2021 14:13:59 +0200 Subject: [PATCH 05/23] adding possibility to change global description of cna data --- inst/reactives/reactivesCnaTab.R | 7 ++++++- inst/study/testpatient/meta_CNA.txt | 2 +- inst/tabs/cnaTab.R | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/inst/reactives/reactivesCnaTab.R b/inst/reactives/reactivesCnaTab.R index a1d7aee..375d9b2 100644 --- a/inst/reactives/reactivesCnaTab.R +++ b/inst/reactives/reactivesCnaTab.R @@ -49,6 +49,11 @@ observeEvent(input$chooseCNA, { }) +# show text field ----------------------------------------------------------- +output$value <- renderText({ + input$cna_description +}) + # show table --------------------------------------------------------------- output$CNAdata <- DT::renderDT({ DT::datatable(loadedData$data_cna, @@ -152,7 +157,7 @@ observeEvent(input$saveCNA, { "gistic", "true", "Putative copy-number alterations from GISTIC", - "Putative copy-number from GISTIC 2.0. Values: -2 = homozygous deletion; -1 = hemizygous deletion; 0 = neutral / no change; 1 = gain; 2 = high level amplification.", + "Putative copy-number from GISTIC 2.0. Values. -2 = homozygous deletion; -1 = hemizygous deletion; 0 = neutral / no change; 1 = gain; 2 = high level amplification.", loadedData$data_cna_filename ) ) diff --git a/inst/study/testpatient/meta_CNA.txt b/inst/study/testpatient/meta_CNA.txt index 0f60c35..dcf58d7 100644 --- a/inst/study/testpatient/meta_CNA.txt +++ b/inst/study/testpatient/meta_CNA.txt @@ -4,5 +4,5 @@ datatype: DISCRETE stable_id: gistic show_profile_in_analysis_tab: true profile_name: Putative copy-number alterations from GISTIC -profile_description: Putative copy-number from GISTIC 2.0. Values: -2 = homozygous deletion; -1 = hemizygous deletion; 0 = neutral / no change; 1 = gain; 2 = high level amplification. +profile_description: Putative copy-number from GISTIC 2.0. Values. -2 = homozygous deletion; -1 = hemizygous deletion; 0 = neutral / no change; 1 = gain; 2 = high level amplification. data_filename: data_CNA.txt \ No newline at end of file diff --git a/inst/tabs/cnaTab.R b/inst/tabs/cnaTab.R index 8e56039..30ad57f 100644 --- a/inst/tabs/cnaTab.R +++ b/inst/tabs/cnaTab.R @@ -44,6 +44,24 @@ cnaTab <- tabItem( ) ) ), + fluidRow( + width = 12, + box( + title = "Change default settings", + column( + 3, + checkboxInput("cna_checkbox", "Change global description", value = FALSE) + ), + column( + 9, + conditionalPanel( + condition = 'input.cna_checkbox == 1', + textInput(inputId = "cna_description", label = "Change global description") + ) + ), + width = 12 + ) + ), fluidRow( width = 12, box( From 230b9cfa28b5816fe33ce0f7997cb043ae13f80b Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 6 May 2021 12:37:13 +0200 Subject: [PATCH 06/23] box for changing cna description improved --- DESCRIPTION | 3 ++- R/cbpManager-pkg.R | 1 + inst/reactives/reactivesCnaTab.R | 23 +++++++++++++++++++---- inst/tabs/cnaTab.R | 13 ++++++++----- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index b97df0c..a695fd5 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -34,7 +34,8 @@ Imports: reticulate, shinyBS, shinycssloaders, - rintrojs + rintrojs, + stringi Suggests: knitr, BiocStyle, diff --git a/R/cbpManager-pkg.R b/R/cbpManager-pkg.R index fa50df2..55885ef 100644 --- a/R/cbpManager-pkg.R +++ b/R/cbpManager-pkg.R @@ -27,6 +27,7 @@ #' @importFrom basilisk BasiliskEnvironment basiliskStart basiliskRun basiliskStop #' @importFrom reticulate import source_python #' @importFrom shinycssloaders withSpinner +#' @improtFrom stringi stri_split #' #' @name cbpManager-pkg #' @docType package diff --git a/inst/reactives/reactivesCnaTab.R b/inst/reactives/reactivesCnaTab.R index 375d9b2..63983ae 100644 --- a/inst/reactives/reactivesCnaTab.R +++ b/inst/reactives/reactivesCnaTab.R @@ -46,12 +46,27 @@ observeEvent(input$chooseCNA, { dplyr::bind_rows(uploaded_data, loadedData$data_cna) } } - }) -# show text field ----------------------------------------------------------- -output$value <- renderText({ - input$cna_description +# cna description ----------------------------------------------------------- +observeEvent(input$saveDescription, { + if(is.null(loadedData$studyID)){ + showNotification( + "Please select and load a study in the 'Study' tab.", + type = "error", + duration = NULL + ) + } + req(loadedData$studyID, loadedData$data_cna) + str <- input$cna_description + write(x = str, file = file.path(study_dir, loadedData$studyID, "description_CNA.txt")) + + output$currDescrip <- renderUI({ + rawText <- readLines(file.path(study_dir, loadedData$studyID, "description_CNA.txt")) + splitText <- stringi::stri_split(str = rawText, regex = "\\n") + replacedText <- lapply(splitText, p) + return(replacedText) + }) }) # show table --------------------------------------------------------------- diff --git a/inst/tabs/cnaTab.R b/inst/tabs/cnaTab.R index 30ad57f..82c1e4e 100644 --- a/inst/tabs/cnaTab.R +++ b/inst/tabs/cnaTab.R @@ -48,15 +48,18 @@ cnaTab <- tabItem( width = 12, box( title = "Change default settings", - column( - 3, - checkboxInput("cna_checkbox", "Change global description", value = FALSE) - ), column( 9, + checkboxInput("cna_checkbox", "Change global description", value = FALSE), conditionalPanel( condition = 'input.cna_checkbox == 1', - textInput(inputId = "cna_description", label = "Change global description") + box( + title = "Current description", + uiOutput("currDescrip"), + width = NULL + ), + textInput(inputId = "cna_description", label = "Change global description", value = "Enter new description..."), + actionButton("saveDescription", "Save new description", class = "btn-success") ) ), width = 12 From b96cb695416b3bd5a90a560585640bdd402a86d1 Mon Sep 17 00:00:00 2001 From: Arsenij Ustjanzew Date: Fri, 7 May 2021 15:44:06 +0200 Subject: [PATCH 07/23] fixed metadata file reading and development of reactivesCnaTab --- R/functions.R | 27 +++++++++++++++++++++++++++ inst/reactives/reactivesCnaTab.R | 25 ++++++++++++++----------- inst/reactives/reactivesStudyTab.R | 22 +++++++++++++++++----- inst/study/testpatient/meta_CNA.txt | 2 +- inst/tabs/cnaTab.R | 8 ++++---- inst/www/cna-data.png | Bin 83108 -> 17226 bytes man/read_meta.Rd | 21 +++++++++++++++++++++ 7 files changed, 84 insertions(+), 21 deletions(-) create mode 100644 man/read_meta.Rd diff --git a/R/functions.R b/R/functions.R index 6461525..325c848 100644 --- a/R/functions.R +++ b/R/functions.R @@ -534,3 +534,30 @@ Please try reinstalling cbpManager and basilisk or contact the support at https: } }) } + +#' TODOTODO +#' +#' @param filepath TODOTODO +#' @return data.frame +#' @examples +#' TODOTODO +#' +read_meta <- function(filepath) { + meta_df <- data.frame(attribute = character(), value = character()) + con = file(filepath, "r") + while (TRUE) { + line = readLines(con, n = 1) + if (length(line) == 0) { + break + } + splited_line <- stringr::str_split(line, ": ", n = 2) + meta_df <- + rbind(meta_df, + list( + attribute = splited_line[[1]][1], + value = splited_line[[1]][2]) + ) + } + close(con) + return(meta_df) +} diff --git a/inst/reactives/reactivesCnaTab.R b/inst/reactives/reactivesCnaTab.R index 63983ae..cdd6c2d 100644 --- a/inst/reactives/reactivesCnaTab.R +++ b/inst/reactives/reactivesCnaTab.R @@ -49,7 +49,7 @@ observeEvent(input$chooseCNA, { }) # cna description ----------------------------------------------------------- -observeEvent(input$saveDescription, { +observeEvent(input$saveMetadata, { if(is.null(loadedData$studyID)){ showNotification( "Please select and load a study in the 'Study' tab.", @@ -57,16 +57,19 @@ observeEvent(input$saveDescription, { duration = NULL ) } - req(loadedData$studyID, loadedData$data_cna) - str <- input$cna_description - write(x = str, file = file.path(study_dir, loadedData$studyID, "description_CNA.txt")) - - output$currDescrip <- renderUI({ - rawText <- readLines(file.path(study_dir, loadedData$studyID, "description_CNA.txt")) - splitText <- stringi::stri_split(str = rawText, regex = "\\n") - replacedText <- lapply(splitText, p) - return(replacedText) - }) + req(input$cna_description) + loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_description"),]$value <- input$cna_description + # todo: write meta_CNA.txt +}) + +output$currDescrip <- renderUI({ + req(loadedData$meta_cna) + prof_desc <- loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_description"),]$value + if(!is.na(prof_desc)){ + htmltools::p(prof_desc) + } else { + htmltools::p("No profile description.") + } }) # show table --------------------------------------------------------------- diff --git a/inst/reactives/reactivesStudyTab.R b/inst/reactives/reactivesStudyTab.R index 7af0c16..d95ee38 100644 --- a/inst/reactives/reactivesStudyTab.R +++ b/inst/reactives/reactivesStudyTab.R @@ -282,10 +282,23 @@ observeEvent(input$upload, { HGVSp_Short = character() ) loadedData$data_cna_filename <- "data_CNA.txt" - loadedData$data_cna_filename <- data.frame( + loadedData$meta_cna <- loadedData$meta_cna <- data.frame( + attribute = c( + "cancer_study_identifier", + "genetic_alteration_type", + "datatype", + "stable_id", + "show_profile_in_analysis_tab", + "profile_name", + "profile_description", + "data_filename" + ), + value = rep(NA, 8) + ) + loadedData$data_cna <- data.frame( Hugo_Symbol = character(), Testpatient_01 = numeric(), - Testpatient_01 = numeric() + Testpatient_02 = numeric() ) loadedData$data_timeline_treatment <- data.frame( PATIENT_ID = character(), @@ -424,9 +437,8 @@ observeEvent(input$upload, { meta_cna <- file.path(study_dir, loadedData$studyID, "meta_CNA.txt") if (file.exists(meta_cna)) { - meta_cna <- read.table(meta_cna, sep = ":") - loadedData$data_cna_filename <- - gsub(" ", "", meta_cna[meta_cna$V1 == "data_filename", ]$V2) + loadedData$meta_cna <- read_meta(meta_cna) + loadedData$data_cna_filename <- loadedData$meta_cna[which(loadedData$meta_cna$attribute=="data_filename"),]$value } data_cna_file <- diff --git a/inst/study/testpatient/meta_CNA.txt b/inst/study/testpatient/meta_CNA.txt index dcf58d7..0f60c35 100644 --- a/inst/study/testpatient/meta_CNA.txt +++ b/inst/study/testpatient/meta_CNA.txt @@ -4,5 +4,5 @@ datatype: DISCRETE stable_id: gistic show_profile_in_analysis_tab: true profile_name: Putative copy-number alterations from GISTIC -profile_description: Putative copy-number from GISTIC 2.0. Values. -2 = homozygous deletion; -1 = hemizygous deletion; 0 = neutral / no change; 1 = gain; 2 = high level amplification. +profile_description: Putative copy-number from GISTIC 2.0. Values: -2 = homozygous deletion; -1 = hemizygous deletion; 0 = neutral / no change; 1 = gain; 2 = high level amplification. data_filename: data_CNA.txt \ No newline at end of file diff --git a/inst/tabs/cnaTab.R b/inst/tabs/cnaTab.R index 82c1e4e..8250037 100644 --- a/inst/tabs/cnaTab.R +++ b/inst/tabs/cnaTab.R @@ -47,19 +47,19 @@ cnaTab <- tabItem( fluidRow( width = 12, box( - title = "Change default settings", + title = "Change metadata of copy number alteration", column( 9, checkboxInput("cna_checkbox", "Change global description", value = FALSE), conditionalPanel( condition = 'input.cna_checkbox == 1', box( - title = "Current description", + title = "Current profile description:", uiOutput("currDescrip"), width = NULL ), - textInput(inputId = "cna_description", label = "Change global description", value = "Enter new description..."), - actionButton("saveDescription", "Save new description", class = "btn-success") + textInput(inputId = "cna_description", label = "Change global description:"), + actionButton("saveMetadata", "Save metadata", class = "btn-success") ) ), width = 12 diff --git a/inst/www/cna-data.png b/inst/www/cna-data.png index 9b3372e1177d9ee37bd4953ea319446b6c3cb614..5a9473bcc4f095bfff151f70c3e008c0997c4f43 100644 GIT binary patch literal 17226 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 diff --git a/man/read_meta.Rd b/man/read_meta.Rd new file mode 100644 index 0000000..8f28db6 --- /dev/null +++ b/man/read_meta.Rd @@ -0,0 +1,21 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/functions.R +\name{read_meta} +\alias{read_meta} +\title{TODOTODO} +\usage{ +read_meta(filepath) +} +\arguments{ +\item{filepath}{TODOTODO} +} +\value{ +data.frame +} +\description{ +TODOTODO +} +\examples{ +TODOTODO + +} From cdccdecf2dc55ceec3fd8afd9834489f8c28c357 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 17 May 2021 13:02:08 +0200 Subject: [PATCH 08/23] meta_CNA.txt can be updated now --- inst/reactives/reactivesCnaTab.R | 78 +++++++++++++++++++++++++++++--- inst/tabs/cnaTab.R | 72 +++++++++++++++++++++++------ 2 files changed, 128 insertions(+), 22 deletions(-) diff --git a/inst/reactives/reactivesCnaTab.R b/inst/reactives/reactivesCnaTab.R index cdd6c2d..5aaf2f4 100644 --- a/inst/reactives/reactivesCnaTab.R +++ b/inst/reactives/reactivesCnaTab.R @@ -48,7 +48,7 @@ observeEvent(input$chooseCNA, { } }) -# cna description ----------------------------------------------------------- +# profile_name and profile_description ----------------------------------------------------------- observeEvent(input$saveMetadata, { if(is.null(loadedData$studyID)){ showNotification( @@ -56,19 +56,83 @@ observeEvent(input$saveMetadata, { type = "error", duration = NULL ) + } else { + req(input$cna_profile_name, input$cna_profile_description) + loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_name"),]$value <- input$cna_profile_name + loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_description"),]$value <- input$cna_profile_description + + # create meta_cna data.frame + meta_cna_df <- data.frame( + V1 = c( + "cancer_study_identifier", + "genetic_alteration_type", + "datatype", + "stable_id", + "show_profile_in_analysis_tab", + "profile_name", + "profile_description", + "data_filename" + ), + V2 = c( + loadedData$studyID, + "COPY_NUMBER_ALTERATION", + "DISCRETE", + "gistic", + "true", + input$cna_profile_name, + input$cna_profile_description, + "data_CNA.txt" + ) + ) + + # write meta_CNA.txt + write.table( + meta_cna_df, + file.path(study_dir, loadedData$studyID, "meta_CNA.txt.temp"), + append = FALSE, + sep = ": ", + row.names = FALSE, + col.names = FALSE, + quote = FALSE + ) + file.rename( + file.path(study_dir, loadedData$studyID, "meta_CNA.txt.temp"), + file.path(study_dir, loadedData$studyID, "meta_CNA.txt") + ) + + # logging + if (!is.null(logDir)) { + writeLogfile( + outdir = logDir, + modified_file = file.path(loadedData$studyID, "meta_CNA.txt") + ) + } + + showNotification(paste0("File meta_CNA.txt of study ", loadedData$studyID, " updated successfully!"), + type = "message", + duration = 10 + ) + removeModal() + } +}) + +output$curr_profile_name <- renderText({ + req(loadedData$meta_cna) + prof_name <- loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_name"),]$value + if(!is.na(prof_name)){ + prof_name + } else { + "No profile name." } - req(input$cna_description) - loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_description"),]$value <- input$cna_description - # todo: write meta_CNA.txt }) -output$currDescrip <- renderUI({ +output$curr_profile_description <- renderText({ req(loadedData$meta_cna) prof_desc <- loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_description"),]$value if(!is.na(prof_desc)){ - htmltools::p(prof_desc) + prof_desc } else { - htmltools::p("No profile description.") + "No profile description." } }) diff --git a/inst/tabs/cnaTab.R b/inst/tabs/cnaTab.R index 8250037..1d83a2c 100644 --- a/inst/tabs/cnaTab.R +++ b/inst/tabs/cnaTab.R @@ -46,23 +46,65 @@ cnaTab <- tabItem( ), fluidRow( width = 12, - box( - title = "Change metadata of copy number alteration", - column( - 9, - checkboxInput("cna_checkbox", "Change global description", value = FALSE), - conditionalPanel( - condition = 'input.cna_checkbox == 1', - box( - title = "Current profile description:", - uiOutput("currDescrip"), - width = NULL - ), - textInput(inputId = "cna_description", label = "Change global description:"), + column( + width = 12, + id = "cna_metadata", + box( + title = "Change metadata of copy number alteration", + collapsible = TRUE, + collapsed = TRUE, + solidHeader = TRUE, + width = NULL, + column( + 6, + textInput(inputId = "cna_profile_name", label = "Change profile name:"), + textInput(inputId = "cna_profile_description", label = "Change profile description:"), actionButton("saveMetadata", "Save metadata", class = "btn-success") + ), + column( + 6, + div( + div( + h5(strong("Current profile name:")), + verbatimTextOutput("curr_profile_name") + ), + div( + style = "display: inline-block;vertical-align: middle;", + popify( + bsButton( + "q8", + label = "", + icon = icon("question"), + style = "info", + size = "extra-small" + ), + "curr_profile_name", + "Designation of the input data." + ) + ) + ), + div( + div( + h5(strong("Current profile description:")), + verbatimTextOutput("curr_profile_description") + ), + div( + style = "display: inline-block;vertical-align: middle;", + popify( + bsButton( + "q9", + label = "", + icon = icon("question"), + style = "info", + size = "extra-small" + ), + "curr_profile_description", + "Key for the copy number level specification used for each gene-sample combination." + ) + ) + ) ) - ), - width = 12 + ) ) ), fluidRow( From 36a940ec899efabc3d134d43cd91536d0a2b59de Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 18 May 2021 15:52:22 +0200 Subject: [PATCH 09/23] working on cna file upload --- inst/reactives/reactivesCnaTab.R | 134 +++++++++++++++++++++++-------- 1 file changed, 99 insertions(+), 35 deletions(-) diff --git a/inst/reactives/reactivesCnaTab.R b/inst/reactives/reactivesCnaTab.R index 5aaf2f4..396b1ee 100644 --- a/inst/reactives/reactivesCnaTab.R +++ b/inst/reactives/reactivesCnaTab.R @@ -21,31 +21,11 @@ observeEvent(input$tour_cna, { rintrojs::introjs(session, options = list(steps = tour)) }) -# upload file --------------------------------------------------------------- -observeEvent(input$chooseCNA, { - if(!grepl("\\.[txt|tsv]", input$chooseCNA$name)){ - showNotification( - "The file format is not supported. - File should be '.txt', '.tsv'.", - type = "error", - duration = NULL - ) - } else { - uploaded_data <- - as.data.frame(vroom::vroom(input$chooseCNA$datapath, delim = "\t")) - requiredCols <- - "Hugo_Symbol" || "Entrez_Gene_Id" - if (any(!requiredCols %in% colnames(uploaded_data))) { - showNotification( - "One or more of the required columns are missing.", - type = "error", - duration = NULL - ) - } else { - loadedData$data_cna <- - dplyr::bind_rows(uploaded_data, loadedData$data_cna) - } - } +# show table --------------------------------------------------------------- +output$CNAdata <- DT::renderDT({ + DT::datatable(loadedData$data_cna, + options = list(scrollX = TRUE) + ) }) # profile_name and profile_description ----------------------------------------------------------- @@ -79,8 +59,8 @@ observeEvent(input$saveMetadata, { "DISCRETE", "gistic", "true", - input$cna_profile_name, - input$cna_profile_description, + loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_name"),]$value, + loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_description"),]$value, "data_CNA.txt" ) ) @@ -136,11 +116,94 @@ output$curr_profile_description <- renderText({ } }) -# show table --------------------------------------------------------------- -output$CNAdata <- DT::renderDT({ - DT::datatable(loadedData$data_cna, - options = list(scrollX = TRUE) - ) +# upload file --------------------------------------------------------------- +observeEvent(input$chooseCNA, { + if(!grepl("\\.[txt|tsv]", input$chooseCNA$name)){ + showNotification( + "The file format is not supported. + File should be '.txt', '.tsv'.", + type = "error", + duration = NULL + ) + } else { + uploaded_data <- + as.data.frame(vroom::vroom(input$chooseCNA$datapath, delim = "\t")) + requiredCols <- + c( + "Gene Symbol", + "Locus ID" + ) + if (any(!requiredCols %in% colnames(uploaded_data))) { + showNotification( + "One or more of the required columns are missing.", + type = "error", + duration = NULL + ) + } else { + colnames(uploaded_data)[which(names(uploaded_data) == "Gene Symbol")] <- "Hugo_Symbol" + colnames(uploaded_data)[which(names(uploaded_data) == "Locus ID")] <- "Entrez_Gene_Id" + uploaded_data$Cytoband <- NULL + + cases_samples <- + loadedData$data_clinical_sample[4:nrow(loadedData$data_clinical_sample), "SAMPLE_ID"] + + if (any(!colnames(uploaded_data)[,3:ncol(uploaded_data)] %in% cases_samples)) { + showNotification( + "Please enter all sample IDs on the study tab before proceeding.", + type = "error", + duration = NULL + ) + } else { + + if (uploaded_data[uploaded_data$Entrez_Gene_Id < 0, ]){ + + dataModal <- function(failed = FALSE) { + modalDialog( + title = "Warning", + "Negative values in the Locus ID/Entrez_Gene_Id column will prevent the data from being + uploaded to cBioPortal. Choose one of the following options:", + radioButtons("options", label = "Choose an option to continue:", choices = list( + "Delete rows with negative values and merge data (recommended)" = 1, + "Keep all data and merge despite negative values" = 2, + "Cancel file upload" = 3), selected = 1), + + footer = tagList( + modalButton("Cancel"), + actionButton("ok", "OK") + ) + ) + } + + showModal(dataModal()) + + observeEvent(input$ok, { + if (input$options == "1") { + deleted_rows <- + rownames(uploaded_data[uploaded_data$Entrez_Gene_Id < 0,]) + uploaded_data[-c(deleted_rows),] + loadedData$data_cna <- + dplyr::bind_rows(uploaded_data, loadedData$data_cna) + } else if (input$options == "2") { + loadedData$data_cna <- + dplyr::bind_rows(uploaded_data, loadedData$data_cna) + } else if (input$options == "3") { + showNotification( + "The upload of a copy number data file was canceled.", + type = "message", + duration = NULL + ) + break + } + }) + + } else { + loadedData$data_cna <- + dplyr::bind_rows(uploaded_data, loadedData$data_cna) + } + + } + } + } }) # save data --------------------------------------------------------------- @@ -152,6 +215,7 @@ observeEvent(input$saveCNA, { duration = NULL ) } + req(loadedData$studyID, loadedData$data_cna, loadedData$data_cna_filename) write.table( loadedData$data_cna, @@ -181,7 +245,7 @@ observeEvent(input$saveCNA, { if (!dir.exists(case_list_dir)) dir.create(case_list_dir) cases_samples <- loadedData$data_clinical_sample[4:nrow(loadedData$data_clinical_sample), "SAMPLE_ID"] - cases_sequenced_df <- + cases_cna_df <- data.frame( V1 = c( "cancer_study_identifier", @@ -238,8 +302,8 @@ observeEvent(input$saveCNA, { "DISCRETE", "gistic", "true", - "Putative copy-number alterations from GISTIC", - "Putative copy-number from GISTIC 2.0. Values. -2 = homozygous deletion; -1 = hemizygous deletion; 0 = neutral / no change; 1 = gain; 2 = high level amplification.", + loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_name"),]$value, + loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_description"),]$value, loadedData$data_cna_filename ) ) From 99f270cc48cba5c57fb8d2971dedfc0da2074e07 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 21 May 2021 15:42:23 +0200 Subject: [PATCH 10/23] upload cna file --- inst/reactives/reactivesCnaTab.R | 79 ++++++++++++++++++++------------ inst/tabs/cnaTab.R | 32 +++++++------ 2 files changed, 67 insertions(+), 44 deletions(-) diff --git a/inst/reactives/reactivesCnaTab.R b/inst/reactives/reactivesCnaTab.R index 396b1ee..4964733 100644 --- a/inst/reactives/reactivesCnaTab.R +++ b/inst/reactives/reactivesCnaTab.R @@ -57,7 +57,7 @@ observeEvent(input$saveMetadata, { loadedData$studyID, "COPY_NUMBER_ALTERATION", "DISCRETE", - "gistic", + "cna", "true", loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_name"),]$value, loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_description"),]$value, @@ -118,9 +118,9 @@ output$curr_profile_description <- renderText({ # upload file --------------------------------------------------------------- observeEvent(input$chooseCNA, { - if(!grepl("\\.[txt|tsv]", input$chooseCNA$name)){ + if (!grepl("\\.[txt|tsv]", input$chooseCNA$name)) { showNotification( - "The file format is not supported. + "The file format is not supported. File should be '.txt', '.tsv'.", type = "error", duration = NULL @@ -129,10 +129,8 @@ observeEvent(input$chooseCNA, { uploaded_data <- as.data.frame(vroom::vroom(input$chooseCNA$datapath, delim = "\t")) requiredCols <- - c( - "Gene Symbol", - "Locus ID" - ) + c("Gene Symbol", + "Locus ID") if (any(!requiredCols %in% colnames(uploaded_data))) { showNotification( "One or more of the required columns are missing.", @@ -140,14 +138,23 @@ observeEvent(input$chooseCNA, { duration = NULL ) } else { - colnames(uploaded_data)[which(names(uploaded_data) == "Gene Symbol")] <- "Hugo_Symbol" - colnames(uploaded_data)[which(names(uploaded_data) == "Locus ID")] <- "Entrez_Gene_Id" - uploaded_data$Cytoband <- NULL - + colnames(uploaded_data)[which(names(uploaded_data) == "Gene Symbol")] <- + "Hugo_Symbol" + colnames(uploaded_data)[which(names(uploaded_data) == "Locus ID")] <- + "Entrez_Gene_Id" + uploaded_data$Cytoband <- NULL + + if (is.null(loadedData$studyID)) { + showNotification( + "Please select and load a study in the 'Study' tab.", + type = "error", + duration = NULL + ) + } else { cases_samples <- loadedData$data_clinical_sample[4:nrow(loadedData$data_clinical_sample), "SAMPLE_ID"] - if (any(!colnames(uploaded_data)[,3:ncol(uploaded_data)] %in% cases_samples)) { + if (any(!colnames(uploaded_data)[3:ncol(uploaded_data)] %in% cases_samples)) { showNotification( "Please enter all sample IDs on the study tab before proceeding.", type = "error", @@ -155,17 +162,30 @@ observeEvent(input$chooseCNA, { ) } else { - if (uploaded_data[uploaded_data$Entrez_Gene_Id < 0, ]){ - + neg = FALSE + for (i in 2:nrow(uploaded_data)) { + if (uploaded_data$Entrez_Gene_Id[i]<0) { + neg = TRUE + break + } + } + + if (neg == TRUE) { dataModal <- function(failed = FALSE) { modalDialog( title = "Warning", - "Negative values in the Locus ID/Entrez_Gene_Id column will prevent the data from being - uploaded to cBioPortal. Choose one of the following options:", - radioButtons("options", label = "Choose an option to continue:", choices = list( - "Delete rows with negative values and merge data (recommended)" = 1, - "Keep all data and merge despite negative values" = 2, - "Cancel file upload" = 3), selected = 1), + "Negative values in the Locus ID/Entrez_Gene_Id column will prevent the data from being + uploaded to cBioPortal. Choose one of the following options.", + radioButtons( + "options", + label = "Choose an option to continue:", + choices = list( + "Delete rows with negative values and merge data (recommended)" = 1, + "Keep all data and merge despite negative values" = 2, + "Cancel file upload" = 3 + ), + selected = 1 + ), footer = tagList( modalButton("Cancel"), @@ -178,21 +198,23 @@ observeEvent(input$chooseCNA, { observeEvent(input$ok, { if (input$options == "1") { - deleted_rows <- - rownames(uploaded_data[uploaded_data$Entrez_Gene_Id < 0,]) - uploaded_data[-c(deleted_rows),] + uploaded_data <- uploaded_data[uploaded_data$Entrez_Gene_Id>-1, ] loadedData$data_cna <- dplyr::bind_rows(uploaded_data, loadedData$data_cna) + removeModal() } else if (input$options == "2") { loadedData$data_cna <- dplyr::bind_rows(uploaded_data, loadedData$data_cna) + removeModal() + } else if (input$options == "3") { showNotification( "The upload of a copy number data file was canceled.", type = "message", duration = NULL ) - break + removeModal() + neg = FALSE } }) @@ -200,12 +222,12 @@ observeEvent(input$chooseCNA, { loadedData$data_cna <- dplyr::bind_rows(uploaded_data, loadedData$data_cna) } - } + } } } }) - + # save data --------------------------------------------------------------- observeEvent(input$saveCNA, { if(is.null(loadedData$studyID)){ @@ -214,8 +236,7 @@ observeEvent(input$saveCNA, { type = "error", duration = NULL ) - } - + } req(loadedData$studyID, loadedData$data_cna, loadedData$data_cna_filename) write.table( loadedData$data_cna, @@ -300,7 +321,7 @@ observeEvent(input$saveCNA, { loadedData$studyID, "COPY_NUMBER_ALTERATION", "DISCRETE", - "gistic", + "cna", "true", loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_name"),]$value, loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_description"),]$value, diff --git a/inst/tabs/cnaTab.R b/inst/tabs/cnaTab.R index 1d83a2c..b485cda 100644 --- a/inst/tabs/cnaTab.R +++ b/inst/tabs/cnaTab.R @@ -57,17 +57,10 @@ cnaTab <- tabItem( width = NULL, column( 6, - textInput(inputId = "cna_profile_name", label = "Change profile name:"), - textInput(inputId = "cna_profile_description", label = "Change profile description:"), - actionButton("saveMetadata", "Save metadata", class = "btn-success") - ), - column( - 6, - div( + div( div( - h5(strong("Current profile name:")), - verbatimTextOutput("curr_profile_name") - ), + textInput(inputId = "cna_profile_name", label = "Change profile name:") + ), div( style = "display: inline-block;vertical-align: middle;", popify( @@ -78,15 +71,14 @@ cnaTab <- tabItem( style = "info", size = "extra-small" ), - "curr_profile_name", + "Profile name", "Designation of the input data." ) ) ), div( div( - h5(strong("Current profile description:")), - verbatimTextOutput("curr_profile_description") + textInput(inputId = "cna_profile_description", label = "Change profile description:") ), div( style = "display: inline-block;vertical-align: middle;", @@ -98,15 +90,25 @@ cnaTab <- tabItem( style = "info", size = "extra-small" ), - "curr_profile_description", + "Profile description", "Key for the copy number level specification used for each gene-sample combination." ) ) - ) + ), + actionButton("saveMetadata", "Save metadata", class = "btn-success") + ), + column( + 6, + h5(strong("Current profile name:")), + verbatimTextOutput("curr_profile_name"), + + h5(strong("Current profile description:")), + verbatimTextOutput("curr_profile_description") ) ) ) ), + fluidRow( width = 12, box( From d915ef945a79a99c87b68b91318c8e14a01c4539 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 25 May 2021 20:03:07 +0200 Subject: [PATCH 11/23] Adjustments according to MR comments --- DESCRIPTION | 3 +-- R/cbpManager-pkg.R | 1 - R/functions.R | 6 +++--- inst/apphelp/descriptionCnaTab.md | 15 +++++++-------- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index a695fd5..b97df0c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -34,8 +34,7 @@ Imports: reticulate, shinyBS, shinycssloaders, - rintrojs, - stringi + rintrojs Suggests: knitr, BiocStyle, diff --git a/R/cbpManager-pkg.R b/R/cbpManager-pkg.R index 55885ef..fa50df2 100644 --- a/R/cbpManager-pkg.R +++ b/R/cbpManager-pkg.R @@ -27,7 +27,6 @@ #' @importFrom basilisk BasiliskEnvironment basiliskStart basiliskRun basiliskStop #' @importFrom reticulate import source_python #' @importFrom shinycssloaders withSpinner -#' @improtFrom stringi stri_split #' #' @name cbpManager-pkg #' @docType package diff --git a/R/functions.R b/R/functions.R index 325c848..f265d14 100644 --- a/R/functions.R +++ b/R/functions.R @@ -535,12 +535,12 @@ Please try reinstalling cbpManager and basilisk or contact the support at https: }) } -#' TODOTODO +#' Read a metafile line by line into a data frame and divide each line at its first colon and add the two parts respectively to the first and second column of the data frame. #' -#' @param filepath TODOTODO +#' @param filepath Filepath with filename of metafile. #' @return data.frame #' @examples -#' TODOTODO +#' read_meta(file.path(study_dir, loadedData$studyID, "meta_CNA.txt")) #' read_meta <- function(filepath) { meta_df <- data.frame(attribute = character(), value = character()) diff --git a/inst/apphelp/descriptionCnaTab.md b/inst/apphelp/descriptionCnaTab.md index 95457dc..60eaa32 100644 --- a/inst/apphelp/descriptionCnaTab.md +++ b/inst/apphelp/descriptionCnaTab.md @@ -2,25 +2,24 @@ --- -#### A minimal copy number data file with only the columns required for cBioPortal: +#### Description of a valid copy number alteration data file: -The discrete copy number data file contain values that would be derived from copy-number analysis algorithms like GISTIC 2.0 or RAE. For each gene (row) in the data file, the following columns are required in the order specified: +The user can currently upload the file "all_thresholded.by_genes.txt" derived from GISTIC 2.0 or a tab-separated file containing the following columns: -- **Hugo_Symbol (Required)**: A HUGO gene symbol. - -Next to Hugo_Symbol, it is recommended to have the Entrez gene ID: +One or both of: +- **Hugo_Symbol (Required)**: A HUGO gene symbol. - **Entrez_Gene_Id (Optional, but recommended)**: An Entrez Gene identifier. -For each sample in the dataset an additional column is required using the sample id as the column header: +For each sample in the dataset an additional column is required using the sample ID as column header. Please make sure that all of the sample IDs have been added to the loaded study via the sample tab before the file upload. - **SAMPLE_ID**: A sample ID. This field can only contain numbers, letters, points, underscores and hyphens. -For each gene-sample combination, a copy number level is specified. By default, the following applies: +The discrete copy number data file contains for each gene-sample combination a copy number level. By default the following applies: - "-2" is a deep loss, possibly a homozygous deletion - "-1" is a single-copy loss (heterozygous deletion) - "0" is diploid - "1" indicates a low-level gain - "2" is a high-level amplification -Standard settings can be changed by selecting "Change global description" below. \ No newline at end of file +The information "profile_name" and "profile_description" listed in the metafile can be adapted to the uploaded file. It is recommended to provide the source and a brief characterization of the data under "profile_name" and to define the interpretation of the copy number level in the "profile_description". \ No newline at end of file From 6f14593c45f4142e27dfbd9eb2f43c91d552e5a5 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 31 May 2021 14:41:16 +0200 Subject: [PATCH 12/23] Code restructuring --- inst/reactives/reactivesCnaTab.R | 186 +++++++++++++++++-------------- inst/tabs/cnaTab.R | 3 +- man/read_meta.Rd | 8 +- 3 files changed, 111 insertions(+), 86 deletions(-) diff --git a/inst/reactives/reactivesCnaTab.R b/inst/reactives/reactivesCnaTab.R index 4964733..92db293 100644 --- a/inst/reactives/reactivesCnaTab.R +++ b/inst/reactives/reactivesCnaTab.R @@ -117,7 +117,50 @@ output$curr_profile_description <- renderText({ }) # upload file --------------------------------------------------------------- + +dataModal <- function(failed = FALSE) { + modalDialog( + title = "Warning", + "Negative values in the Locus ID/Entrez_Gene_Id column will prevent the data from being + uploaded to cBioPortal. Choose one of the following options.", + radioButtons( + "options", + label = "Choose an option to continue:", + choices = list( + "Delete rows with negative values and merge data (recommended)" = 1, + "Keep all data and merge despite negative values" = 2, + "Cancel file upload" = 3 + ), + selected = 1 + ), + + footer = tagList(modalButton("Cancel"), + actionButton("ok", "OK") + ) + ) +} + observeEvent(input$chooseCNA, { + + # check if a study is loaded and access respective samples + loaded <- NULL + if (is.null(loadedData$studyID)) { + loaded = FALSE + showNotification( + "Please select and load a study in the 'Study' tab.", + type = "error", + duration = NULL + ) + } else { + loaded = TRUE + } + + if (loaded == TRUE) { + cases_samples <- + loadedData$data_clinical_sample[4:nrow(loadedData$data_clinical_sample), "SAMPLE_ID"] + } + + # check file format before upload if (!grepl("\\.[txt|tsv]", input$chooseCNA$name)) { showNotification( "The file format is not supported. @@ -131,6 +174,8 @@ observeEvent(input$chooseCNA, { requiredCols <- c("Gene Symbol", "Locus ID") + + # check presence of required columns before renaming/deleting columns if (any(!requiredCols %in% colnames(uploaded_data))) { showNotification( "One or more of the required columns are missing.", @@ -143,90 +188,69 @@ observeEvent(input$chooseCNA, { colnames(uploaded_data)[which(names(uploaded_data) == "Locus ID")] <- "Entrez_Gene_Id" uploaded_data$Cytoband <- NULL - - if (is.null(loadedData$studyID)) { - showNotification( - "Please select and load a study in the 'Study' tab.", - type = "error", - duration = NULL - ) - } else { - cases_samples <- - loadedData$data_clinical_sample[4:nrow(loadedData$data_clinical_sample), "SAMPLE_ID"] - - if (any(!colnames(uploaded_data)[3:ncol(uploaded_data)] %in% cases_samples)) { - showNotification( - "Please enter all sample IDs on the study tab before proceeding.", - type = "error", - duration = NULL - ) - } else { - - neg = FALSE - for (i in 2:nrow(uploaded_data)) { - if (uploaded_data$Entrez_Gene_Id[i]<0) { - neg = TRUE - break - } - } - - if (neg == TRUE) { - dataModal <- function(failed = FALSE) { - modalDialog( - title = "Warning", - "Negative values in the Locus ID/Entrez_Gene_Id column will prevent the data from being - uploaded to cBioPortal. Choose one of the following options.", - radioButtons( - "options", - label = "Choose an option to continue:", - choices = list( - "Delete rows with negative values and merge data (recommended)" = 1, - "Keep all data and merge despite negative values" = 2, - "Cancel file upload" = 3 - ), - selected = 1 - ), - - footer = tagList( - modalButton("Cancel"), - actionButton("ok", "OK") - ) - ) - } - - showModal(dataModal()) - - observeEvent(input$ok, { - if (input$options == "1") { - uploaded_data <- uploaded_data[uploaded_data$Entrez_Gene_Id>-1, ] - loadedData$data_cna <- - dplyr::bind_rows(uploaded_data, loadedData$data_cna) - removeModal() - } else if (input$options == "2") { - loadedData$data_cna <- - dplyr::bind_rows(uploaded_data, loadedData$data_cna) - removeModal() - - } else if (input$options == "3") { - showNotification( - "The upload of a copy number data file was canceled.", - type = "message", - duration = NULL - ) - removeModal() - neg = FALSE - } - }) - - } else { - loadedData$data_cna <- - dplyr::bind_rows(uploaded_data, loadedData$data_cna) - } - } - } } } + + # check if all sample IDs have been added to the loaded study + added <- NULL + if ((loaded == TRUE) && (any(!colnames(uploaded_data)[3:ncol(uploaded_data)] %in% cases_samples))) { + added = FALSE + showNotification( + "Please enter all sample IDs on the study tab before proceeding.", + type = "error", + duration = NULL + ) + } else if ((loaded == TRUE) && (any(colnames(uploaded_data)[3:ncol(uploaded_data)] %in% cases_samples))) { + added = TRUE + } + + # check if there is a negative value in the column "Entrez_Gene_Id" + neg <- NULL + for (i in 2:nrow(uploaded_data)) { + if (uploaded_data$Entrez_Gene_Id[i] < 0) { + neg = TRUE + break + } else { + neg = FALSE + } + } + + # in case of a negative value show a modalDialog with three options; otherwise merge data directly + if (loaded == TRUE && added == TRUE && neg == TRUE) { + showModal(dataModal()) + } }) + +# The following section doesn't work. +observeEvent(input$ok, { + if (input$options == "1") { + uploaded_data <- uploaded_data[uploaded_data$Entrez_Gene_Id > -1, ] + neg = FALSE + removeModal() + } else if (input$options == "2") { + neg = FALSE + removeModal() + } else if (input$options == "3") { + showNotification( + "The upload of a copy number data file was canceled.", + type = "message", + duration = NULL + ) + neg = TRUE + removeModal() + } +}) + +# The following section hasn't been tested yet. +' if (loaded == TRUE && added == TRUE && neg == FALSE) { + merged_df = merge(uploaded_data, loadedData$data_cna, by = "Hugo_Symbol") + new_rows = setdiff(uploaded_data, loadedData$data_cna) + if(!is.null(new_rows)) { + loadedData$data_cna <- dplyr::bind_rows(new_rows, merged_df) + } else { + loadedData$data_cna <- merged_df + } + }' # save data --------------------------------------------------------------- observeEvent(input$saveCNA, { diff --git a/inst/tabs/cnaTab.R b/inst/tabs/cnaTab.R index b485cda..08c2821 100644 --- a/inst/tabs/cnaTab.R +++ b/inst/tabs/cnaTab.R @@ -133,4 +133,5 @@ cnaTab <- tabItem( width = 12 ) ) -) \ No newline at end of file +) + diff --git a/man/read_meta.Rd b/man/read_meta.Rd index 8f28db6..0e29419 100644 --- a/man/read_meta.Rd +++ b/man/read_meta.Rd @@ -2,20 +2,20 @@ % Please edit documentation in R/functions.R \name{read_meta} \alias{read_meta} -\title{TODOTODO} +\title{Read a metafile line by line into a data frame and divide each line at its first colon and add the two parts respectively to the first and second column of the data frame.} \usage{ read_meta(filepath) } \arguments{ -\item{filepath}{TODOTODO} +\item{filepath}{Filepath with filename of metafile.} } \value{ data.frame } \description{ -TODOTODO +Read a metafile line by line into a data frame and divide each line at its first colon and add the two parts respectively to the first and second column of the data frame. } \examples{ -TODOTODO +read_meta(file.path(study_dir, loadedData$studyID, "meta_CNA.txt")) } From 2c7fbcdf52e458df021a00babb77d7d0ed61b08b Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 1 Jun 2021 19:35:47 +0200 Subject: [PATCH 13/23] bug fixing related to modal dialog, correction of the cna table display, completion of code restructuring, correction of the standard cna data frame --- inst/reactives/reactivesCnaTab.R | 106 +++++++++++++++++------------ inst/reactives/reactivesStudyTab.R | 4 +- 2 files changed, 62 insertions(+), 48 deletions(-) diff --git a/inst/reactives/reactivesCnaTab.R b/inst/reactives/reactivesCnaTab.R index 92db293..99480dc 100644 --- a/inst/reactives/reactivesCnaTab.R +++ b/inst/reactives/reactivesCnaTab.R @@ -23,9 +23,10 @@ observeEvent(input$tour_cna, { # show table --------------------------------------------------------------- output$CNAdata <- DT::renderDT({ - DT::datatable(loadedData$data_cna, - options = list(scrollX = TRUE) - ) + if (!is.null(loadedData$studyID)) { + DT::datatable(loadedData$data_cna, + options = list(scrollX = TRUE)) + } }) # profile_name and profile_description ----------------------------------------------------------- @@ -57,7 +58,7 @@ observeEvent(input$saveMetadata, { loadedData$studyID, "COPY_NUMBER_ALTERATION", "DISCRETE", - "cna", + paste0(loadedData$studyID, "_cna"), "true", loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_name"),]$value, loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_description"),]$value, @@ -116,8 +117,9 @@ output$curr_profile_description <- renderText({ } }) -# upload file --------------------------------------------------------------- +# upload file --------------------------------------------------------------------------------- +# ui of modal dialog in case of negative values in Entrez_Gene_Id column dataModal <- function(failed = FALSE) { modalDialog( title = "Warning", @@ -134,15 +136,18 @@ dataModal <- function(failed = FALSE) { selected = 1 ), - footer = tagList(modalButton("Cancel"), - actionButton("ok", "OK") + footer = tagList(actionButton("ok", "OK") ) ) } +# initiate a reactive object +uploaded_data <- reactiveValues(df = NULL) + +# management of file upload observeEvent(input$chooseCNA, { - # check if a study is loaded and access respective samples + # check if a study is loaded loaded <- NULL if (is.null(loadedData$studyID)) { loaded = FALSE @@ -155,7 +160,10 @@ observeEvent(input$chooseCNA, { loaded = TRUE } + # if a study is loaded, access respective samples and cna data if (loaded == TRUE) { + uploaded_data$df <- loadedData$data_cna + cases_samples <- loadedData$data_clinical_sample[4:nrow(loadedData$data_clinical_sample), "SAMPLE_ID"] } @@ -169,62 +177,72 @@ observeEvent(input$chooseCNA, { duration = NULL ) } else { - uploaded_data <- + uploaded_data$df <- as.data.frame(vroom::vroom(input$chooseCNA$datapath, delim = "\t")) requiredCols <- c("Gene Symbol", "Locus ID") # check presence of required columns before renaming/deleting columns - if (any(!requiredCols %in% colnames(uploaded_data))) { + if (any(!requiredCols %in% colnames(uploaded_data$df))) { showNotification( "One or more of the required columns are missing.", type = "error", duration = NULL ) } else { - colnames(uploaded_data)[which(names(uploaded_data) == "Gene Symbol")] <- + colnames(uploaded_data$df)[which(names(uploaded_data$df) == "Gene Symbol")] <- "Hugo_Symbol" - colnames(uploaded_data)[which(names(uploaded_data) == "Locus ID")] <- + colnames(uploaded_data$df)[which(names(uploaded_data$df) == "Locus ID")] <- "Entrez_Gene_Id" - uploaded_data$Cytoband <- NULL + uploaded_data$df$Cytoband <- NULL } } # check if all sample IDs have been added to the loaded study added <- NULL - if ((loaded == TRUE) && (any(!colnames(uploaded_data)[3:ncol(uploaded_data)] %in% cases_samples))) { - added = FALSE - showNotification( - "Please enter all sample IDs on the study tab before proceeding.", - type = "error", - duration = NULL - ) - } else if ((loaded == TRUE) && (any(colnames(uploaded_data)[3:ncol(uploaded_data)] %in% cases_samples))) { - added = TRUE + if (loaded == TRUE) { + if (any(!colnames(uploaded_data$df)[3:ncol(uploaded_data$df)] %in% cases_samples)) { + added = FALSE + showNotification( + "Please enter all sample IDs on the study tab before proceeding.", + type = "error", + duration = NULL + ) + } else { + added = TRUE + } } - # check if there is a negative value in the column "Entrez_Gene_Id" - neg <- NULL - for (i in 2:nrow(uploaded_data)) { - if (uploaded_data$Entrez_Gene_Id[i] < 0) { - neg = TRUE - break - } else { - neg = FALSE + # if study is loaded and all samples are added, show data of uploaded file in table + if (loaded == TRUE && added == TRUE) { + output$CNAdata <- DT::renderDT({ + DT::datatable(uploaded_data$df, + options = list(scrollX = TRUE)) + }) + + # check if there is a negative value in the column "Entrez_Gene_Id" + neg <- NULL + for (i in 2:nrow(uploaded_data$df)) { + if (uploaded_data$df$Entrez_Gene_Id[i] < 0) { + neg = TRUE + break + } else { + neg = FALSE + } } } - # in case of a negative value show a modalDialog with three options; otherwise merge data directly + # in case of a negative value show a modal dialog with three options if (loaded == TRUE && added == TRUE && neg == TRUE) { showModal(dataModal()) } }) -# The following section doesn't work. +# completion of the file upload depending on the option selected observeEvent(input$ok, { if (input$options == "1") { - uploaded_data <- uploaded_data[uploaded_data$Entrez_Gene_Id > -1, ] + uploaded_data$df <- uploaded_data$df[uploaded_data$df$Entrez_Gene_Id > -1,] neg = FALSE removeModal() } else if (input$options == "2") { @@ -236,22 +254,19 @@ observeEvent(input$ok, { type = "message", duration = NULL ) + output$CNAdata <- DT::renderDT({ + DT::datatable(loadedData$data_cna, + options = list(scrollX = TRUE)) + }) neg = TRUE removeModal() } + + if (neg == FALSE) { + uploaded_data$df <- merge(uploaded_data$df, loadedData$data_cna, by = "Hugo_Symbol", all = TRUE) + } }) -# The following section hasn't been tested yet. -' if (loaded == TRUE && added == TRUE && neg == FALSE) { - merged_df = merge(uploaded_data, loadedData$data_cna, by = "Hugo_Symbol") - new_rows = setdiff(uploaded_data, loadedData$data_cna) - if(!is.null(new_rows)) { - loadedData$data_cna <- dplyr::bind_rows(new_rows, merged_df) - } else { - loadedData$data_cna <- merged_df - } - }' - # save data --------------------------------------------------------------- observeEvent(input$saveCNA, { if(is.null(loadedData$studyID)){ @@ -261,6 +276,7 @@ observeEvent(input$saveCNA, { duration = NULL ) } + loadedData$data_cna <- uploaded_data$df req(loadedData$studyID, loadedData$data_cna, loadedData$data_cna_filename) write.table( loadedData$data_cna, @@ -345,7 +361,7 @@ observeEvent(input$saveCNA, { loadedData$studyID, "COPY_NUMBER_ALTERATION", "DISCRETE", - "cna", + paste0(loadedData$studyID, "_cna"), "true", loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_name"),]$value, loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_description"),]$value, diff --git a/inst/reactives/reactivesStudyTab.R b/inst/reactives/reactivesStudyTab.R index d95ee38..f02edba 100644 --- a/inst/reactives/reactivesStudyTab.R +++ b/inst/reactives/reactivesStudyTab.R @@ -296,9 +296,7 @@ observeEvent(input$upload, { value = rep(NA, 8) ) loadedData$data_cna <- data.frame( - Hugo_Symbol = character(), - Testpatient_01 = numeric(), - Testpatient_02 = numeric() + Hugo_Symbol = character() ) loadedData$data_timeline_treatment <- data.frame( PATIENT_ID = character(), From 0736778e3237670bd30fcdd4b1342789dd9fa4e2 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 4 Jun 2021 10:25:56 +0200 Subject: [PATCH 14/23] minor correction --- inst/reactives/reactivesCnaTab.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inst/reactives/reactivesCnaTab.R b/inst/reactives/reactivesCnaTab.R index 99480dc..33d144d 100644 --- a/inst/reactives/reactivesCnaTab.R +++ b/inst/reactives/reactivesCnaTab.R @@ -263,7 +263,7 @@ observeEvent(input$ok, { } if (neg == FALSE) { - uploaded_data$df <- merge(uploaded_data$df, loadedData$data_cna, by = "Hugo_Symbol", all = TRUE) + uploaded_data$df <- merge(uploaded_data$df, loadedData$data_cna, all = TRUE) } }) From df4152e8119d1928227d2fb67032bfe91a0eb97e Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 7 Jun 2021 17:18:10 +0200 Subject: [PATCH 15/23] improvement of the user guidance --- inst/reactives/reactivesCnaTab.R | 99 ++++++++++++++++++++++++-------- 1 file changed, 76 insertions(+), 23 deletions(-) diff --git a/inst/reactives/reactivesCnaTab.R b/inst/reactives/reactivesCnaTab.R index 33d144d..d8c18fe 100644 --- a/inst/reactives/reactivesCnaTab.R +++ b/inst/reactives/reactivesCnaTab.R @@ -38,9 +38,12 @@ observeEvent(input$saveMetadata, { duration = NULL ) } else { - req(input$cna_profile_name, input$cna_profile_description) - loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_name"),]$value <- input$cna_profile_name - loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_description"),]$value <- input$cna_profile_description + if (!is.null(input$cna_profile_name)) { + loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_name"),]$value <- input$cna_profile_name + } + if (!is.null(input$cna_profile_description)) { + loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_description"),]$value <- input$cna_profile_description + } # create meta_cna data.frame meta_cna_df <- data.frame( @@ -143,10 +146,18 @@ dataModal <- function(failed = FALSE) { # initiate a reactive object uploaded_data <- reactiveValues(df = NULL) +validated_data <- reactiveValues(df = NULL) # management of file upload observeEvent(input$chooseCNA, { + output$CNAdata <- DT::renderDT({ + if (!is.null(loadedData$studyID)) { + DT::datatable(loadedData$data_cna, + options = list(scrollX = TRUE)) + } + }) + # check if a study is loaded loaded <- NULL if (is.null(loadedData$studyID)) { @@ -179,9 +190,12 @@ observeEvent(input$chooseCNA, { } else { uploaded_data$df <- as.data.frame(vroom::vroom(input$chooseCNA$datapath, delim = "\t")) - requiredCols <- - c("Gene Symbol", - "Locus ID") + + if ("Hugo_Symbol" %in% colnames(uploaded_data$df)) { + requiredCols <- "Hugo_Symbol" # upload of any .txt file + } else { + requiredCols <- "Gene Symbol" # upload of GISTIC output + } # check presence of required columns before renaming/deleting columns if (any(!requiredCols %in% colnames(uploaded_data$df))) { @@ -191,6 +205,7 @@ observeEvent(input$chooseCNA, { duration = NULL ) } else { + # adjustments when GISTIC output is uploaded colnames(uploaded_data$df)[which(names(uploaded_data$df) == "Gene Symbol")] <- "Hugo_Symbol" colnames(uploaded_data$df)[which(names(uploaded_data$df) == "Locus ID")] <- @@ -214,28 +229,42 @@ observeEvent(input$chooseCNA, { } } - # if study is loaded and all samples are added, show data of uploaded file in table if (loaded == TRUE && added == TRUE) { + validated_data$df <- loadedData$data_cna + + # if study is loaded and all samples are added, show data of uploaded file in table output$CNAdata <- DT::renderDT({ DT::datatable(uploaded_data$df, options = list(scrollX = TRUE)) }) - + } + # check if there is a negative value in the column "Entrez_Gene_Id" neg <- NULL - for (i in 2:nrow(uploaded_data$df)) { - if (uploaded_data$df$Entrez_Gene_Id[i] < 0) { - neg = TRUE - break - } else { - neg = FALSE + if ("Entrez_Gene_Id" %in% colnames(uploaded_data$df)) { + for (i in 2:nrow(uploaded_data$df)) { + if (uploaded_data$df$Entrez_Gene_Id[i] < 0) { + neg = TRUE + break + } else { + neg = FALSE + } } + } else { + neg = FALSE } - } # in case of a negative value show a modal dialog with three options if (loaded == TRUE && added == TRUE && neg == TRUE) { showModal(dataModal()) + } else if (loaded == TRUE && added == TRUE && neg == FALSE) { + uploaded_data$df <- merge(uploaded_data$df, loadedData$data_cna, all = TRUE) + validated_data$df <- uploaded_data$df + + # reset + loaded <- NULL + added <- NULL + neg <- NULL } }) @@ -258,25 +287,54 @@ observeEvent(input$ok, { DT::datatable(loadedData$data_cna, options = list(scrollX = TRUE)) }) + validated_data$df <- NULL neg = TRUE removeModal() } if (neg == FALSE) { uploaded_data$df <- merge(uploaded_data$df, loadedData$data_cna, all = TRUE) + validated_data$df <- uploaded_data$df + + # reset + loaded <- NULL + added <- NULL + neg <- NULL } }) # save data --------------------------------------------------------------- observeEvent(input$saveCNA, { - if(is.null(loadedData$studyID)){ + if(is.null(loadedData$studyID)) { showNotification( "Please select and load a study in the 'Study' tab.", type = "error", duration = NULL ) - } - loadedData$data_cna <- uploaded_data$df + } + + if (!is.null(validated_data$df)) { + loadedData$data_cna <- validated_data$df + showNotification("CNA file submitted successfully!", + type = "message", + duration = 10 + ) + output$CNAdata <- DT::renderDT({ + if (!is.null(loadedData$studyID)) { + DT::datatable(loadedData$data_cna, + options = list(scrollX = TRUE)) + } + }) + # reset + validated_data$df <- NULL + } else { + showNotification( + "Please upload a file.", + type = "error", + duration = NULL + ) + } + req(loadedData$studyID, loadedData$data_cna, loadedData$data_cna_filename) write.table( loadedData$data_cna, @@ -390,9 +448,4 @@ observeEvent(input$saveCNA, { modified_file = file.path(loadedData$studyID, "meta_CNA.txt") ) } - - showNotification("CNA file submitted successfully!", - type = "message", - duration = 10 - ) }) \ No newline at end of file From ae2447ee525b09b38a4871320b1f34b829de1a80 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 8 Jun 2021 15:16:49 +0200 Subject: [PATCH 16/23] updating documentation --- inst/apphelp/descriptionCnaTab.md | 2 +- inst/apphelp/tour_cna.txt | 1 + vignettes/images/20.png | Bin 0 -> 78957 bytes vignettes/intro.rmd | 10 +++++++++- 4 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 vignettes/images/20.png diff --git a/inst/apphelp/descriptionCnaTab.md b/inst/apphelp/descriptionCnaTab.md index 60eaa32..ca6bb0a 100644 --- a/inst/apphelp/descriptionCnaTab.md +++ b/inst/apphelp/descriptionCnaTab.md @@ -22,4 +22,4 @@ The discrete copy number data file contains for each gene-sample combination a c - "1" indicates a low-level gain - "2" is a high-level amplification -The information "profile_name" and "profile_description" listed in the metafile can be adapted to the uploaded file. It is recommended to provide the source and a brief characterization of the data under "profile_name" and to define the interpretation of the copy number level in the "profile_description". \ No newline at end of file +The information "profile_name" and "profile_description" listed in the metafile can be adapted to the uploaded file (see "Change metadata of copy number alteration" below). It is recommended to provide the source and a brief characterization of the data under "profile_name" and to define the interpretation of the copy number level in the "profile_description". \ No newline at end of file diff --git a/inst/apphelp/tour_cna.txt b/inst/apphelp/tour_cna.txt index fad87e2..fde0e77 100644 --- a/inst/apphelp/tour_cna.txt +++ b/inst/apphelp/tour_cna.txt @@ -2,6 +2,7 @@ element;intro #Welcome;Welcome to the interactive tour for cbpManager!

In the Copy Number Data tab, you can add sample data to existing patients and edit already existing samples. In the following you will learn how to do this in detail. #cna_description;This box contains a description of the Copy Number Data tab. #cna_img;Here you can see an example image how the copy number data will look later in cBioPortal. +#cna_metadata; Here you have the opportunity of changing the information that is saved in the metafile of the copy number data under "profile_name" and "profile_description". Please refer to the description above for more information. #CNAdata;If the loaded study already has copy number data, it would be shown in this table. #chooseCNADiv;Upload a copy number data file to the study. This file will be concatenated to the existing copy number data. Please have a look at the description box for the correct file format! If the upload was successful, the new copy number data is added to the table on the right. #saveCNA;Make the changes persistent by saving the file! diff --git a/vignettes/images/20.png b/vignettes/images/20.png new file mode 100644 index 0000000000000000000000000000000000000000..71a9df6d61d24a5f8077da297e46aa8a1fd3c940 GIT binary patch literal 78957 zcmdRWRa9Kr)-D7B1b4SU65OS5cY+0X3lQAhAwc0FxVw9BcXyXU3U_zEbf5n}oj!dY z?#q3+dkh9uHDKc4$`|IS82-5vr0x$BP~$Uf_WuMiL~xsoD+ zN-jEw%dmQwMk_F<6qW#^DU3;BeAJN3JT-YiCHamO4!P;76u7hklLomlxBT5qwF(?s zN@`NlH)Ps57*cRKs6PeVRzGM)TdyoEe8pf#n!I>C?j3Gs;pS#(dY8!a;H?`}Ip(Pf zMP|kp8{ft(F7n$o&Bj5k8w~vYDo8ej`25?Sh=@!JGeUeK`~BK~j|+i;_WN~(iscV_U_p@H|EuME@0#CfEmqiePv28D z*s)>AA-N^4qg7oT?YRxUJsRXYjWNDb7q>m@3!*(j`Ytinq~)g5?$gpn-zV&?u~_J? z;Ce@6|N9oT17HkcUD`3kQg~FpW9HVF+w`2OS>JLeD)G)5P*OUAD;U z;ie^HzHyYoPg~K34#N$T3vv}wRsh~fN81W4lw`j}*$v8PKwr;YOcmLul;DS z#*{ia`L3HS89y}iQ7c0w>1!kW;b$J-yJWklY*xn*rtCA2=<&D;hmfKzyt7yA5>+1t zk1cI0{+?-rSffGn(+VGL>|8Z66xa#QCzGXpYUW)~-4oE=OL12HF08}ZJ{!$|S@_7p z7-A_rRR+RiIShf3TPT;7EjtSufuGX{Ymn@>vvw>4X9}NPcME*y2>rF`S& zw;xAY-Pnz9x`&pm`~df3rfaWE%Q54@%-_VHI-OG)gF;$B8*C%DKd?&h}AwAAj+%?)>VBtz1l8cyoA5)42na&i0#Y^if%? z%Z$-n@P^9qH{Y~VYHe=35f&tV{!Am7nGI|3aI610g&W-|Rm{nQ@EAd*i=v$*bKF4u z3;nMmZL}2%2#g@;EDuet2%zTxsG*C0o&+sI#sY^ppsm{#;$vT>HjdxLJ%>=u7PM2S z<1Yao2T|{CGdaWH4uqWthy^N1wbYNLA;~^H05Q_R37_g}i$mU0(co-^dlyqi(od*q zuv4e`w_eqpaeOmI^PW7qT-aDb9^FpQj1pt`HLwU;!yBX;ezxkADN~GfiCiJR}HtQif>)QTHj^!Bw0m)+`%&gGv3JV~Z5gj&07<4nsvl#&PB0CkZZHZs2VP1YLI?oJ*pYZ1&{zN~=^tTv;iEIa$xIC3Ul z9Db>}Z^=696H=2{Cy8RR`;iKh$xjZG*q_}@Fw$=IxryCOh+6w!9mGZ?-q~QF&;Zr& z-B@|TLsxo2)3=Xl5=9VN58(T~D=5AiDimvaF8d};Yec2mf(s)RCh(!ZLUatwdunW9 z51&g~PWm#F{cj|Pr=>;eNE^j(tQXfD3?{dI>8#rz7*T#<-BpuQ%I9e zX}J6=zglx2lDX(~8fA@hNaiDoaV&e<;w(DpLaz@&T;9goOzfGVy|g9$4!P(@f
;(G)phdd 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 T#mf46(B`_a`4#kK*Zcns$TPf_ literal 0 HcmV?d00001 diff --git a/vignettes/intro.rmd b/vignettes/intro.rmd index 1562050..d95e38d 100644 --- a/vignettes/intro.rmd +++ b/vignettes/intro.rmd @@ -239,7 +239,15 @@ knitr::include_graphics(file.path("images/13.PNG")) ### Mutation data (MAF): -The "Mutations" page offers the user the possibility to upload MAF files. If mutation data is already available, the content of the MAF file will be concatinated to the already existing data, taking into account the columns. The MAF file must meet certain requirements, i.e. contain specific columns (see [link](https://docs.cbioportal.org/5.1-data-loading/data-loading/file-formats#data-file-5)). Similarly, the changes must be finalized by saving. +The "Mutations" page offers the user the possibility to upload MAF files. If mutation data is already available, the content of the MAF file will be concatenated to the already existing data, taking into account the columns. The MAF file must meet certain requirements, i.e. contain specific columns (see [link](https://docs.cbioportal.org/5.1-data-loading/data-loading/file-formats#data-file-5)). Similarly, the changes must be finalized by saving. + +```{r, out.width="100%", echo=FALSE} +knitr::include_graphics(file.path("images/20.PNG")) +``` + +### Copy number alteration (CNA): + +The "Copy Number Data" page offers the user the possibility to upload a file containing information about copy number alterations (CNA) of genes. If CNA data is already available, the content of the uploaded file will be concatenated to the already existing data, taking into account the rows and columns. The uploaded file must meet certain requirements, i.e. contain specific columns (see [link](https://docs.cbioportal.org/5.1-data-loading/data-loading/file-formats#data-file-1)). In addition to a tab-separated file that meets these requirements, the output file "all_thresholded.by_genes.txt" derived from GISTIC 2.0 can be uploaded directly. As soon as the validation of the uploaded file has been successfully completed (without any error message), the changes to the CNA data of the loaded study must be finalized by saving. ```{r, out.width="100%", echo=FALSE} knitr::include_graphics(file.path("images/14.PNG")) From 5df63132772c82a27d5f83db7435190d9013e0b7 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 8 Jun 2021 19:41:39 +0200 Subject: [PATCH 17/23] code fixes according to MR comments --- R/functions.R | 22 ++-------------------- inst/reactives/reactivesCnaTab.R | 23 +---------------------- inst/tabs/cnaTab.R | 5 ++--- 3 files changed, 5 insertions(+), 45 deletions(-) diff --git a/R/functions.R b/R/functions.R index f265d14..c9ebd32 100644 --- a/R/functions.R +++ b/R/functions.R @@ -535,29 +535,11 @@ Please try reinstalling cbpManager and basilisk or contact the support at https: }) } -#' Read a metafile line by line into a data frame and divide each line at its first colon and add the two parts respectively to the first and second column of the data frame. +#' Read a metafile line by line into a data frame. #' #' @param filepath Filepath with filename of metafile. #' @return data.frame #' @examples #' read_meta(file.path(study_dir, loadedData$studyID, "meta_CNA.txt")) #' -read_meta <- function(filepath) { - meta_df <- data.frame(attribute = character(), value = character()) - con = file(filepath, "r") - while (TRUE) { - line = readLines(con, n = 1) - if (length(line) == 0) { - break - } - splited_line <- stringr::str_split(line, ": ", n = 2) - meta_df <- - rbind(meta_df, - list( - attribute = splited_line[[1]][1], - value = splited_line[[1]][2]) - ) - } - close(con) - return(meta_df) -} +read_meta(system.file("study", "testpatient", "meta_CNA.txt", package = "cbpManager")) diff --git a/inst/reactives/reactivesCnaTab.R b/inst/reactives/reactivesCnaTab.R index d8c18fe..5f6ff41 100644 --- a/inst/reactives/reactivesCnaTab.R +++ b/inst/reactives/reactivesCnaTab.R @@ -46,28 +46,7 @@ observeEvent(input$saveMetadata, { } # create meta_cna data.frame - meta_cna_df <- data.frame( - V1 = c( - "cancer_study_identifier", - "genetic_alteration_type", - "datatype", - "stable_id", - "show_profile_in_analysis_tab", - "profile_name", - "profile_description", - "data_filename" - ), - V2 = c( - loadedData$studyID, - "COPY_NUMBER_ALTERATION", - "DISCRETE", - paste0(loadedData$studyID, "_cna"), - "true", - loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_name"),]$value, - loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_description"),]$value, - "data_CNA.txt" - ) - ) + meta_cna_df <- loadedData$meta_cna # write meta_CNA.txt write.table( diff --git a/inst/tabs/cnaTab.R b/inst/tabs/cnaTab.R index 08c2821..cfc884a 100644 --- a/inst/tabs/cnaTab.R +++ b/inst/tabs/cnaTab.R @@ -72,7 +72,7 @@ cnaTab <- tabItem( size = "extra-small" ), "Profile name", - "Designation of the input data." + "A name for the discrete copy number data, e.g. 'Putative copy-number alterations from GISTIC'." ) ) ), @@ -91,7 +91,7 @@ cnaTab <- tabItem( size = "extra-small" ), "Profile description", - "Key for the copy number level specification used for each gene-sample combination." + "A description of the copy number data." ) ) ), @@ -134,4 +134,3 @@ cnaTab <- tabItem( ) ) ) - From af10acd96a547b33d80b08889c2c94e048ff39b0 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 8 Jun 2021 20:26:51 +0200 Subject: [PATCH 18/23] read_meta correction --- R/functions.R | 22 ++++++++++++++++++++-- man/read_meta.Rd | 6 +++--- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/R/functions.R b/R/functions.R index c9ebd32..b7aa59e 100644 --- a/R/functions.R +++ b/R/functions.R @@ -540,6 +540,24 @@ Please try reinstalling cbpManager and basilisk or contact the support at https: #' @param filepath Filepath with filename of metafile. #' @return data.frame #' @examples -#' read_meta(file.path(study_dir, loadedData$studyID, "meta_CNA.txt")) +#' read_meta(system.file("study", "testpatient", "meta_CNA.txt", package = "cbpManager")) #' -read_meta(system.file("study", "testpatient", "meta_CNA.txt", package = "cbpManager")) +read_meta <- function(filepath) { + meta_df <- data.frame(attribute = character(), value = character()) + con = file(filepath, "r") + while (TRUE) { + line = readLines(con, n = 1) + if (length(line) == 0) { + break + } + splited_line <- stringr::str_split(line, ": ", n = 2) + meta_df <- + rbind(meta_df, + list( + attribute = splited_line[[1]][1], + value = splited_line[[1]][2]) + ) + } + close(con) + return(meta_df) +} diff --git a/man/read_meta.Rd b/man/read_meta.Rd index 0e29419..504ce6e 100644 --- a/man/read_meta.Rd +++ b/man/read_meta.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/functions.R \name{read_meta} \alias{read_meta} -\title{Read a metafile line by line into a data frame and divide each line at its first colon and add the two parts respectively to the first and second column of the data frame.} +\title{Read a metafile line by line into a data frame.} \usage{ read_meta(filepath) } @@ -13,9 +13,9 @@ read_meta(filepath) data.frame } \description{ -Read a metafile line by line into a data frame and divide each line at its first colon and add the two parts respectively to the first and second column of the data frame. +Read a metafile line by line into a data frame. } \examples{ -read_meta(file.path(study_dir, loadedData$studyID, "meta_CNA.txt")) +read_meta(system.file("study", "testpatient", "meta_CNA.txt", package = "cbpManager")) } From 41ab60061549198148b24e1e5e6fb16436a19b1f Mon Sep 17 00:00:00 2001 From: Ustjanzew Date: Fri, 11 Jun 2021 11:00:36 +0200 Subject: [PATCH 19/23] small changes in code and text --- R/functions.R | 2 +- inst/apphelp/descriptionCnaTab.md | 6 ++---- inst/apphelp/tour_cna.txt | 2 +- inst/reactives/reactivesCnaTab.R | 20 +++++++++++--------- inst/reactives/reactivesStudyTab.R | 3 ++- man/read_meta.Rd | 2 +- vignettes/intro.rmd | 2 +- 7 files changed, 19 insertions(+), 18 deletions(-) diff --git a/R/functions.R b/R/functions.R index b7aa59e..81649bf 100644 --- a/R/functions.R +++ b/R/functions.R @@ -540,7 +540,7 @@ Please try reinstalling cbpManager and basilisk or contact the support at https: #' @param filepath Filepath with filename of metafile. #' @return data.frame #' @examples -#' read_meta(system.file("study", "testpatient", "meta_CNA.txt", package = "cbpManager")) +#' cbpManager:::read_meta(system.file("study", "testpatient", "meta_CNA.txt", package = "cbpManager")) #' read_meta <- function(filepath) { meta_df <- data.frame(attribute = character(), value = character()) diff --git a/inst/apphelp/descriptionCnaTab.md b/inst/apphelp/descriptionCnaTab.md index ca6bb0a..cba10fa 100644 --- a/inst/apphelp/descriptionCnaTab.md +++ b/inst/apphelp/descriptionCnaTab.md @@ -4,16 +4,14 @@ #### Description of a valid copy number alteration data file: -The user can currently upload the file "all_thresholded.by_genes.txt" derived from GISTIC 2.0 or a tab-separated file containing the following columns: +The user can currently upload the file **"all_thresholded.by_genes.txt"** derived from GISTIC 2.0 or a **tab-separated file** containing the following columns: One or both of: - **Hugo_Symbol (Required)**: A HUGO gene symbol. - **Entrez_Gene_Id (Optional, but recommended)**: An Entrez Gene identifier. -For each sample in the dataset an additional column is required using the sample ID as column header. Please make sure that all of the sample IDs have been added to the loaded study via the sample tab before the file upload. - -- **SAMPLE_ID**: A sample ID. This field can only contain numbers, letters, points, underscores and hyphens. +**For each sample in the dataset an additional column is required using the sample ID as column header.** Please make sure that all of the sample IDs have been added to the loaded study via the Sample tab before upload the file. The discrete copy number data file contains for each gene-sample combination a copy number level. By default the following applies: - "-2" is a deep loss, possibly a homozygous deletion diff --git a/inst/apphelp/tour_cna.txt b/inst/apphelp/tour_cna.txt index fde0e77..2098958 100644 --- a/inst/apphelp/tour_cna.txt +++ b/inst/apphelp/tour_cna.txt @@ -1,5 +1,5 @@ element;intro -#Welcome;Welcome to the interactive tour for cbpManager!

In the Copy Number Data tab, you can add sample data to existing patients and edit already existing samples. In the following you will learn how to do this in detail. +#Welcome;Welcome to the interactive tour for cbpManager!

In the Copy Number Data tab, you can add copy number alteration data to samples by uploading a file in the appropriate format. In the following you will learn how to do this in detail. #cna_description;This box contains a description of the Copy Number Data tab. #cna_img;Here you can see an example image how the copy number data will look later in cBioPortal. #cna_metadata; Here you have the opportunity of changing the information that is saved in the metafile of the copy number data under "profile_name" and "profile_description". Please refer to the description above for more information. diff --git a/inst/reactives/reactivesCnaTab.R b/inst/reactives/reactivesCnaTab.R index 5f6ff41..fb68848 100644 --- a/inst/reactives/reactivesCnaTab.R +++ b/inst/reactives/reactivesCnaTab.R @@ -38,19 +38,19 @@ observeEvent(input$saveMetadata, { duration = NULL ) } else { - if (!is.null(input$cna_profile_name)) { + if (!rapportools::is.empty(input$cna_profile_name)) { loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_name"),]$value <- input$cna_profile_name } - if (!is.null(input$cna_profile_description)) { + if (!rapportools::is.empty(input$cna_profile_description)) { loadedData$meta_cna[which(loadedData$meta_cna$attribute=="profile_description"),]$value <- input$cna_profile_description } # create meta_cna data.frame - meta_cna_df <- loadedData$meta_cna + #meta_cna_df <- loadedData$meta_cna # write meta_CNA.txt write.table( - meta_cna_df, + loadedData$meta_cna, file.path(study_dir, loadedData$studyID, "meta_CNA.txt.temp"), append = FALSE, sep = ": ", @@ -123,7 +123,7 @@ dataModal <- function(failed = FALSE) { ) } -# initiate a reactive object +# initiate reactive objects uploaded_data <- reactiveValues(df = NULL) validated_data <- reactiveValues(df = NULL) @@ -146,9 +146,11 @@ observeEvent(input$chooseCNA, { type = "error", duration = NULL ) - } else { - loaded = TRUE - } + return(NULL) + } + # else { + # loaded = TRUE + # } # if a study is loaded, access respective samples and cna data if (loaded == TRUE) { @@ -381,7 +383,7 @@ observeEvent(input$saveCNA, { ) # meta_CNA - if (!file.exists(file.path(study_dir, loadedData$studyID, "meta_CNA.txt"))) { + if (file.path(study_dir, loadedData$studyID, "meta_CNA.txt")) { meta_cna_df <- data.frame( V1 = c( diff --git a/inst/reactives/reactivesStudyTab.R b/inst/reactives/reactivesStudyTab.R index f02edba..f249c32 100644 --- a/inst/reactives/reactivesStudyTab.R +++ b/inst/reactives/reactivesStudyTab.R @@ -453,7 +453,8 @@ observeEvent(input$upload, { comment.char = "#", stringsAsFactors = FALSE, quote = "", - fill = FALSE + fill = FALSE, + check.names = FALSE ) loadedData$data_cna <- data_cna } diff --git a/man/read_meta.Rd b/man/read_meta.Rd index 504ce6e..8533cd2 100644 --- a/man/read_meta.Rd +++ b/man/read_meta.Rd @@ -16,6 +16,6 @@ data.frame Read a metafile line by line into a data frame. } \examples{ -read_meta(system.file("study", "testpatient", "meta_CNA.txt", package = "cbpManager")) +cbpManager:::read_meta(system.file("study", "testpatient", "meta_CNA.txt", package = "cbpManager")) } diff --git a/vignettes/intro.rmd b/vignettes/intro.rmd index d95e38d..972850f 100644 --- a/vignettes/intro.rmd +++ b/vignettes/intro.rmd @@ -247,7 +247,7 @@ knitr::include_graphics(file.path("images/20.PNG")) ### Copy number alteration (CNA): -The "Copy Number Data" page offers the user the possibility to upload a file containing information about copy number alterations (CNA) of genes. If CNA data is already available, the content of the uploaded file will be concatenated to the already existing data, taking into account the rows and columns. The uploaded file must meet certain requirements, i.e. contain specific columns (see [link](https://docs.cbioportal.org/5.1-data-loading/data-loading/file-formats#data-file-1)). In addition to a tab-separated file that meets these requirements, the output file "all_thresholded.by_genes.txt" derived from GISTIC 2.0 can be uploaded directly. As soon as the validation of the uploaded file has been successfully completed (without any error message), the changes to the CNA data of the loaded study must be finalized by saving. +The "Copy Number Data" page offers the user the possibility to upload a file containing information about copy number alterations (CNA) of genes. If CNA data is already available, the content of the uploaded file will be concatenated to the already existing data, taking into account the rows and columns. The uploaded file must meet certain requirements, i.e. contain specific columns (see the example described [here](https://docs.cbioportal.org/5.1-data-loading/data-loading/file-formats#data-file-1)). Alternatively to a tab-separated file, meeting these requirements, the output file "all_thresholded.by_genes.txt" derived from GISTIC 2.0 can be uploaded directly. If the file upload was successful (without any error messages), you can see the preview of the resulting file in the table on the right. In the preview table the content of the file is combined with already existing data. **To generate the required study files and make the changes permanent, you need to click on the "Save file" button.** ```{r, out.width="100%", echo=FALSE} knitr::include_graphics(file.path("images/14.PNG")) From b896017ccd95e1a7b47997a84b1b48bb6f9f54f9 Mon Sep 17 00:00:00 2001 From: Ustjanzew Date: Mon, 14 Jun 2021 14:38:30 +0200 Subject: [PATCH 20/23] Fix for mouse hover box is not visible --- inst/tabs/cnaTab.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inst/tabs/cnaTab.R b/inst/tabs/cnaTab.R index cfc884a..d06da83 100644 --- a/inst/tabs/cnaTab.R +++ b/inst/tabs/cnaTab.R @@ -72,7 +72,7 @@ cnaTab <- tabItem( size = "extra-small" ), "Profile name", - "A name for the discrete copy number data, e.g. 'Putative copy-number alterations from GISTIC'." + "A name for the discrete copy number data, e.g. Putative copy-number alterations from GISTIC." ) ) ), From 2cc801ec03f4bf378116298eeea6b0de386fb558 Mon Sep 17 00:00:00 2001 From: Ustjanzew Date: Tue, 15 Jun 2021 08:48:29 +0200 Subject: [PATCH 21/23] fixed layout in the CNA-Tab --- NAMESPACE | 2 ++ R/cbpManager-pkg.R | 4 +-- inst/tabs/cnaTab.R | 67 +++++++++++++++++++++------------------------- 3 files changed, 35 insertions(+), 38 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 0d70b5a..23cc1cb 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -14,6 +14,7 @@ importFrom(basilisk,basiliskStart) importFrom(basilisk,basiliskStop) importFrom(dplyr,bind_rows) importFrom(dplyr,mutate) +importFrom(htmltools,HTML) importFrom(htmltools,tagList) importFrom(jsonlite,fromJSON) importFrom(magrittr,"%<>%") @@ -52,6 +53,7 @@ importFrom(shiny,selectInput) importFrom(shiny,shinyApp) importFrom(shiny,showModal) importFrom(shiny,showNotification) +importFrom(shiny,splitLayout) importFrom(shiny,tags) importFrom(shiny,textInput) importFrom(shiny,uiOutput) diff --git a/R/cbpManager-pkg.R b/R/cbpManager-pkg.R index fa50df2..38c5347 100644 --- a/R/cbpManager-pkg.R +++ b/R/cbpManager-pkg.R @@ -6,7 +6,7 @@ #' @author Arsenij Ustjanzew \email{arsenij.ustjanzew@@gmail.com} #' #' @importFrom magrittr %>% %<>% -#' @importFrom shiny actionButton column dateInput fluidRow icon invalidateLater +#' @importFrom shiny actionButton column dateInput fluidRow icon invalidateLater splitLayout #' modalButton modalDialog NS numericInput observeEvent reactive reactiveValues #' reactiveValuesToList removeModal renderText renderUI runApp selectInput #' shinyApp showModal showNotification textInput uiOutput updateSelectInput @@ -17,7 +17,7 @@ #' @importFrom dplyr bind_rows mutate #' @importFrom jsonlite fromJSON #' @importFrom vroom vroom -#' @importFrom htmltools tagList +#' @importFrom htmltools tagList HTML #' @importFrom shinydashboard box dashboardBody dashboardHeader dashboardPage #' dashboardSidebar menuItem sidebarMenu tabBox tabItem tabItems #' @importFrom DT renderDT styleEqual DTOutput datatable formatStyle renderDataTable diff --git a/inst/tabs/cnaTab.R b/inst/tabs/cnaTab.R index d06da83..a8b72f6 100644 --- a/inst/tabs/cnaTab.R +++ b/inst/tabs/cnaTab.R @@ -45,6 +45,9 @@ cnaTab <- tabItem( ) ), fluidRow( + tags$head( + tags$style(HTML('#q8, #q9{margin-top: 24px}')) + ), width = 12, column( width = 12, @@ -57,52 +60,44 @@ cnaTab <- tabItem( width = NULL, column( 6, - div( - div( - textInput(inputId = "cna_profile_name", label = "Change profile name:") - ), - div( - style = "display: inline-block;vertical-align: middle;", - popify( - bsButton( - "q8", - label = "", - icon = icon("question"), - style = "info", - size = "extra-small" - ), - "Profile name", - "A name for the discrete copy number data, e.g. Putative copy-number alterations from GISTIC." - ) + splitLayout( + cellWidths = c("93%", "7%"), + textInput(inputId = "cna_profile_name", label = "Change profile name:"), + popify( + bsButton( + "q8", + label = "", + icon = icon("question"), + style = "info", + size = "extra-small" + ), + "Profile name", + "A name for the discrete copy number data, e.g. Putative copy-number alterations from GISTIC." ) ), - div( - div( - textInput(inputId = "cna_profile_description", label = "Change profile description:") - ), - div( - style = "display: inline-block;vertical-align: middle;", - popify( - bsButton( - "q9", - label = "", - icon = icon("question"), - style = "info", - size = "extra-small" - ), - "Profile description", - "A description of the copy number data." - ) + splitLayout( + cellWidths = c("93%", "7%"), + textInput(inputId = "cna_profile_description", label = "Change profile description:"), + popify( + bsButton( + "q9", + label = "", + icon = icon("question"), + style = "info", + size = "extra-small" + ), + "Profile description", + "A description of the copy number data." ) ), actionButton("saveMetadata", "Save metadata", class = "btn-success") ), column( 6, - h5(strong("Current profile name:")), + htmltools::HTML(""), verbatimTextOutput("curr_profile_name"), - h5(strong("Current profile description:")), + htmltools::HTML(""), verbatimTextOutput("curr_profile_description") ) ) From b354cc04ad872ee15195d553c68019ba4f7d0563 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 30 Jun 2021 15:30:42 +0200 Subject: [PATCH 22/23] Replace NA with blank in Entrez_Gene_Id column and move Entrez_Gene_Id column always to second position (after Hugo_Symbol) --- inst/reactives/reactivesCnaTab.R | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/inst/reactives/reactivesCnaTab.R b/inst/reactives/reactivesCnaTab.R index fb68848..5d16d23 100644 --- a/inst/reactives/reactivesCnaTab.R +++ b/inst/reactives/reactivesCnaTab.R @@ -146,11 +146,10 @@ observeEvent(input$chooseCNA, { type = "error", duration = NULL ) - return(NULL) - } - # else { - # loaded = TRUE - # } + # return(NULL) + } else { + loaded = TRUE + } # if a study is loaded, access respective samples and cna data if (loaded == TRUE) { @@ -201,7 +200,7 @@ observeEvent(input$chooseCNA, { if (any(!colnames(uploaded_data$df)[3:ncol(uploaded_data$df)] %in% cases_samples)) { added = FALSE showNotification( - "Please enter all sample IDs on the study tab before proceeding.", + "Please enter all sample IDs in the 'Sample' tab before proceeding.", type = "error", duration = NULL ) @@ -295,8 +294,15 @@ observeEvent(input$saveCNA, { } if (!is.null(validated_data$df)) { + validated_data$df$Entrez_Gene_Id[is.na(validated_data$df$Entrez_Gene_Id)] <- "" + + if ("Entrez_Gene_Id" %in% colnames(validated_data$df)) { + validated_data$df <- + validated_data$df %>% dplyr::select(Hugo_Symbol, Entrez_Gene_Id, everything()) + } + loadedData$data_cna <- validated_data$df - showNotification("CNA file submitted successfully!", + showNotification("Copy number data file submitted successfully!", type = "message", duration = 10 ) @@ -383,7 +389,7 @@ observeEvent(input$saveCNA, { ) # meta_CNA - if (file.path(study_dir, loadedData$studyID, "meta_CNA.txt")) { + if (!file.exists(file.path(study_dir, loadedData$studyID, "meta_CNA.txt"))) { meta_cna_df <- data.frame( V1 = c( From a73d9e215a61ef54d4661084f1f18da1b75ebd13 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 30 Jun 2021 19:19:22 +0200 Subject: [PATCH 23/23] Added as a co-author in the description --- DESCRIPTION | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index b97df0c..e28eace 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -5,7 +5,8 @@ Version: 0.99.3 Date: 2021-03-16 Authors@R: c( person(given = "Arsenij", family = "Ustjanzew", email = "arsenij.ustjanzew@gmail.com", role = c("aut", "cre", "cph"), comment = c(ORCID = "0000-0002-1014-4521")), - person("Federico", "Marini", role = "aut", email = "marinif@uni-mainz.de", comment = c(ORCID = '0000-0003-3252-7758'))) + person("Federico", "Marini", role = "aut", email = "marinif@uni-mainz.de", comment = c(ORCID = '0000-0003-3252-7758')), + person(given = "Charlotte", family = "Reuschel", email = "charlotte.reuschel@gmx.de", role = "aut", comment = c(ORCID = "0000-0003-2722-279X"))) Description: This R package provides an R Shiny application that enables the user to generate, manage, and edit data and metadata files suitable for the import in cBioPortal for Cancer Genomics. Create cancer studies and edit its metadata. Upload mutation data of a patient that will be concatenated to the data_mutation_extended.txt file of the study.