From 38d4e194ed4f9bec52220712c86d7b60585ebbd0 Mon Sep 17 00:00:00 2001 From: Alexander Sandercock <39815775+alex-sandercock@users.noreply.github.com> Date: Fri, 13 Mar 2026 12:25:53 -0400 Subject: [PATCH 1/6] UI updates --- DESCRIPTION | 4 +-- R/app_server.R | 2 +- R/app_ui.R | 7 +++-- README.md | 2 +- inst/app/www/IFAS.jpg | Bin 0 -> 300322 bytes man/polyRAD2vcf.Rd | 71 ++++++++++++++++++++++++++++++++++++------ 6 files changed, 71 insertions(+), 15 deletions(-) create mode 100644 inst/app/www/IFAS.jpg diff --git a/DESCRIPTION b/DESCRIPTION index 13190fc..c31024c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: BIGapp Title: Breeding Insight Genomics Shiny Application -Version: 1.6.0 +Version: 1.7.0 Authors@R: c( person(c("Alexander", "M."), "Sandercock", @@ -26,7 +26,7 @@ Description: This R shiny app provides a web-based user friendly way for researc License: Apache License (== 2.0) Encoding: UTF-8 Roxygen: list(markdown = TRUE) -RoxygenNote: 7.3.2 +RoxygenNote: 7.3.3 Depends: R (>= 4.4.0) biocViews: Imports: diff --git a/R/app_server.R b/R/app_server.R index 50c4b7d..07b7663 100644 --- a/R/app_server.R +++ b/R/app_server.R @@ -10,7 +10,7 @@ app_server <- function(input, output, session) { # Your application server logic ##Add server configurations - options(shiny.maxRequestSize = 1000000 * 1024^2) # Set maximum upload size to 1000GB + options(shiny.maxRequestSize = 100000 * 1024^2) # Set maximum upload size to 100GB #shiny.maxRequestSize = 10000 * 1024^2; # 10 GB <- This is for a future limit when using BI's server remotely callModule(mod_DosageCall_server, diff --git a/R/app_ui.R b/R/app_ui.R index 55d43cb..b6605f8 100644 --- a/R/app_ui.R +++ b/R/app_ui.R @@ -89,8 +89,8 @@ app_ui <- function(request) { style = "display: flex; align-items: center;", # Align text and images horizontally div( style = "display: flex; flex-direction: column; margin-right: 15px; text-align: right;", - div("2025 Breeding Insight"), - div("Funded by USDA through Cornell University") + div("2026 Breeding Insight"), + div("Funded by USDA through UF|IFAS") ), div( a( @@ -99,6 +99,9 @@ app_ui <- function(request) { ), a( img(src = "www/cornell_seal_simple_web_b31b1b.png", height = "45px") + ), + a( + img(src = "www/IFAS.jpg", height = "45px") ) ) ), diff --git a/README.md b/README.md index 90199ef..76a3e6f 100644 --- a/README.md +++ b/README.md @@ -139,4 +139,4 @@ BIGapp development is supported by [Breeding Insight](https://www.breedinginsigh If you use BIGapp in your research, please cite: -Sandercock A.M., Peel M.D., Tanigut C.H., Chinchilla-Vargas J., Chen S., Sapkota M., Lin M., Zhao D., Ackerman A.J., Basnet B.R., Beil C.T., Sheehan M.J. (2025). BIGapp: A User-Friendly Genomic Tool Kit Identified Quantitative Trait Loci for Creeping Rootedness in Alfalfa (_Medicago sativa_ L.)., The Plant Genome. doi:https://doi.org/10.1002/tpg2.70067 +Sandercock A.M., Peel M.D., Taniguti C.H., Chinchilla-Vargas J., Chen S., Sapkota M., Lin M., Zhao D., Ackerman A.J., Basnet B.R., Beil C.T., Sheehan M.J. (2025). BIGapp: A User-Friendly Genomic Tool Kit Identified Quantitative Trait Loci for Creeping Rootedness in Alfalfa (_Medicago sativa_ L.)., The Plant Genome. doi:https://doi.org/10.1002/tpg2.70067 diff --git a/inst/app/www/IFAS.jpg b/inst/app/www/IFAS.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d108a43a4361c8d0d7e5bfee247243e4fdbe7c5b GIT binary patch literal 300322 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 for Hind/He per locus. +\item \code{##FORMAT=} for polyRAD-estimated genotypes +(in allele-count space). +\item \code{##FORMAT=} for the dosage count of reference +alleles. +\item Version tags for \code{polyRAD} and \code{BIGapp}. +} +\item Converts dosage values to genotype strings (\code{GT}-like, +\code{"0/0"}, \code{"0/1"}, \code{"1/1"}, etc.) given the specified +\code{ploidy}. +\item Builds a new FORMAT field for each variant combining: +\code{GTP}, \code{UD}, and the original FORMAT fields from the template. +\item Writes the updated header and variant table to a VCF file. +} + +Missing dosages are converted to a missing genotype string (e.g. +\code{"./."} for diploids) and represented as \code{"."} in the dosage +field. Variants are sorted by chromosome and numeric position before +writing. } From 4dbffb110af46e3f41ea4425a3fa3270f83c9ae3 Mon Sep 17 00:00:00 2001 From: Cristianetaniguti Date: Thu, 2 Apr 2026 17:14:01 -0400 Subject: [PATCH 2/6] madc2vcf updates --- DESCRIPTION | 2 +- R/mod_GS.R | 2 - R/mod_dosage2vcf.R | 480 ++++++++++++++---------- inst/help_files/DArT_Report2VCF_par.Rmd | 302 +++++++++++++-- 4 files changed, 559 insertions(+), 227 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index c31024c..91766e4 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: BIGapp Title: Breeding Insight Genomics Shiny Application -Version: 1.7.0 +Version: 1.8.0 Authors@R: c( person(c("Alexander", "M."), "Sandercock", diff --git a/R/mod_GS.R b/R/mod_GS.R index 7367186..99750c5 100644 --- a/R/mod_GS.R +++ b/R/mod_GS.R @@ -388,8 +388,6 @@ mod_GS_server <- function(input, output, session, parent_session) { )) }) - - # Close popup window when user "saves options" observeEvent(input$save_advanced_options_pred, { advanced_options_pred$pred_model <- input$pred_model diff --git a/R/mod_dosage2vcf.R b/R/mod_dosage2vcf.R index b168d4f..18f02cb 100644 --- a/R/mod_dosage2vcf.R +++ b/R/mod_dosage2vcf.R @@ -29,14 +29,8 @@ mod_dosage2vcf_ui <- function(id){ title = "Inputs", width=12, status = "info", solidHeader = TRUE, collapsible = FALSE, collapsed = FALSE, selectInput(ns('file_type'), label = 'Select File Format', - choices = c("DArT MADC file","DArT Dosage Reports", "Dosage Matrix"), + choices = c("DArT MADC file", "Dosage Matrix"), selected = "DArT MADC file"), - conditionalPanel(condition = "input.file_type == 'DArT Dosage Reports'", - ns = ns, - fileInput(ns("report_file"), "Choose DArT Dose Report File", accept = c(".csv")), - fileInput(ns("counts_file"), "Choose DArT Counts File", accept = c(".csv")), - numericInput(ns("dosage2vcf_ploidy"), "Species Ploidy", min = 1, value = NULL) - ), conditionalPanel(condition = "input.file_type == 'Dosage Matrix'", ns = ns, fileInput(ns("matrix_file"), "Choose Dosage Matrix File", accept = c(".csv")), @@ -49,47 +43,60 @@ mod_dosage2vcf_ui <- function(id){ hr(), radioButtons(ns("snp_type"), label = "Select Marker Type", - choices = list("Target"= "target", "Target + Off-Target" = "target_off"), + choices = list("Target"= "target", "Target + Off-Target" = "target_off", "Microhaplotypes" = "multiallelic"), selected = "target"), selectInput(ns('species'), label = 'Species', - choices = c("alfalfa","blueberry", "cranberry", "cucumber", "lettuce", "pecan", "sweetpotato", "other"), + choices = c("alfalfa", "blueberry", "cranberry", "cucumber", "pecan", "potato", "strawberry", "sweetpotato", "other"), selected = "alfalfa"), conditionalPanel(condition = "input.snp_type == 'target_off'", ns = ns, conditionalPanel(condition = "input.species == 'other'", ns = ns, fileInput(ns("botloci_file"), "Upload bottom strand probes file (.botloci)"), + fileInput(ns("hapDB_file"), "Upload haplotype database file (fasta) (optional)"), + fileInput(ns("markers_info_file"), "Upload markers information (_lut.csv from HapApp) (optional)"), ), - fileInput(ns("hapDB_file"), "Upload haplotype database file (fasta) (optional)"), - sliderInput(ns("cores"), "Number of CPU Cores", min = 1, max = (availableCores() - 1), value = 1, step = 1) + sliderInput(ns("cores"), "Number of CPU Cores", min = 1, max = (availableCores() - 1), value = 1, step = 1), br(), + div( + style = "text-align: left; margin-top: 10px;", + actionButton(ns("advanced_options_all"), + label = HTML(paste(icon("cog", style = "color: #007bff;"), "Advanced Options")), + style = "background-color: transparent; border: none; color: #007bff; font-size: smaller; text-decoration: underline; padding: 0;" + ) + ) ), conditionalPanel(condition = "input.snp_type == 'target'", ns = ns, + radioButtons(ns("collapse_matches_counts"), + label = "Collapse Matches Counts:", + choices = list("Yes"= TRUE, "No" = FALSE), + selected = FALSE), conditionalPanel(condition = "input.species == 'other'", ns = ns, radioButtons(ns("ref_alt"), label = "Extract REF and ALT info:", - choices = list("Yes"= "TRUE", "No" = "FALSE"), - selected = "TRUE"), + choices = list("Yes"= TRUE, "No" = FALSE), + selected = TRUE), conditionalPanel(condition = "input.ref_alt == 'TRUE'", ns = ns, fileInput(ns("botloci_file"), "Upload bottom strand probes file (.botloci)"), + fileInput(ns("hapDB_file"), "Upload haplotype database file (fasta) (optional)"), + fileInput(ns("markers_info_file"), "Upload markers information (_lut.csv from HapApp) (optional)"), ) ) ) ), hr(), - textInput(ns("d2v_output_name"), "Output File Name"), + textInput(ns("d2v_output_name"), "Output File Name", placeholder = "e.g. my_output"), hr(), - actionButton(ns("run_analysis"), "Convert File"), + actionButton(ns("run_analysis"), "Convert File", width = "100%"), br(), br(), uiOutput(ns('mybutton')), div(style="display:inline-block; float:right",dropdownButton( HTML("Input files"), - p(downloadButton(ns('download_dose'), ""), "Dose Report Example File"), - p(downloadButton(ns('download_counts'), ""), "Counts Example File"), - p(downloadButton(ns('download_madc'), ""), "MADC Example File"),hr(), + p(downloadButton(ns('download_madc_fixed'), ""), "Fixed Allele MADC Example File"), + p(downloadButton(ns('download_madc'), ""), "Raw MADC Example File"),hr(), p(HTML("Parameters description:"), actionButton(ns("goPar"), icon("arrow-up-right-from-square", verify_fa = FALSE) )), hr(), p(HTML("Results description:"), actionButton(ns("goRes"), icon("arrow-up-right-from-square", verify_fa = FALSE) )), hr(), p(HTML("How to cite:"), actionButton(ns("goCite"), icon("arrow-up-right-from-square", verify_fa = FALSE) )), hr(), @@ -101,12 +108,17 @@ mod_dosage2vcf_ui <- function(id){ )) ) ), - column(width = 4, - box(title = "Status", width = 12, collapsible = TRUE, status = "info", - progressBar(id = ns("dosage2vcf_pb"), value = 0, status = "info", display_pct = TRUE, striped = TRUE, title = " ") + column(width = 5, + box(title = "Status & Log", width = 12, collapsible = TRUE, status = "info", + progressBar(id = ns("dosage2vcf_pb"), value = 0, status = "info", display_pct = TRUE, striped = TRUE, title = " "), + hr(), + tags$style(HTML(paste0( + "#", ns("d2vcf_log"), " { max-height: 300px; overflow-y: auto; background: #1e1e1e !important; color: #d4d4d4; padding: 10px; border-radius: 4px; font-size: 12px; }" + ))), + verbatimTextOutput(ns("d2vcf_log")), + uiOutput(ns("download_d2vcf_log_btn")) ) - ), - column(width = 1), + ) ) ) ) @@ -122,7 +134,33 @@ mod_dosage2vcf_ui <- function(id){ mod_dosage2vcf_server <- function(input, output, session, parent_session){ ns <- session$ns - + + # Reactive value to accumulate log messages + d2vcf_log <- reactiveVal("") + + # Clear log when a new analysis is triggered + observeEvent(input$run_analysis, { + d2vcf_log("") + }, priority = 10) + + output$d2vcf_log <- renderText({ + d2vcf_log() + }) + + output$download_d2vcf_log_btn <- renderUI({ + req(nchar(d2vcf_log()) > 0) + downloadButton(ns("download_d2vcf_log"), "Download Log", style = "margin-top: 8px;") + }) + + output$download_d2vcf_log <- downloadHandler( + filename = function() { + paste0("dosage2vcf_log_", Sys.Date(), ".txt") + }, + content = function(file) { + writeLines(d2vcf_log(), file) + } + ) + # Help links observeEvent(input$goPar, { # change to help tab @@ -162,42 +200,172 @@ mod_dosage2vcf_server <- function(input, output, session, parent_session){ disable("download_d2vcf") - output$download_dose <- downloadHandler( - filename = function() { - paste0("BIGapp_Dose_Report_Example_file.csv") - }, - content = function(file) { - ex <- system.file("iris_DArT_Allele_Dose_Report.csv", package = "BIGapp") - file.copy(ex, file) - }) - - output$download_counts <- downloadHandler( + output$download_madc <- downloadHandler( filename = function() { - paste0("BIGapp_Counts_Example_file.csv") + paste0("BIGapp_MADC_Example_file.csv") }, content = function(file) { - ex <- system.file("iris_DArT_Counts.csv", package = "BIGapp") + ex <- system.file("iris_DArT_MADC.csv", package = "BIGapp") file.copy(ex, file) }) - output$download_madc <- downloadHandler( + output$download_madc_fixed <- downloadHandler( filename = function() { - paste0("BIGapp_MADC_Example_file.csv") + paste0("BIGapp_MADC_Fixed_Example_file.csv") }, content = function(file) { - ex <- system.file("iris_DArT_MADC.csv", package = "BIGapp") - file.copy(ex, file) + github_path <- "https://raw.githubusercontent.com/Breeding-Insight/BIGapp-PanelHub/refs/heads/long_seq/" + alfalfa_madc <- paste0(github_path, "test_madcs/alfalfa_madc.csv") + download.file(alfalfa_madc, destfile = file, mode = "wb") }) - + # Default model choices + advanced_options_all <- reactiveValues( + rm_multiallelic_SNP = TRUE, + multiallelic_SNP_dp_thr = 0, + multiallelic_SNP_sample_thr = 0, + alignment_score_thr = 40, + add_others = FALSE, + others_max_snps = 5, + others_rm_with_indels = TRUE + ) + + # Close popup window when user "saves options" + observeEvent(input$save_advanced_options_all, { + advanced_options_all$rm_multiallelic_SNP <- input$rm_multiallelic_SNP + advanced_options_all$multiallelic_SNP_dp_thr <- input$multiallelic_SNP_dp_thr + advanced_options_all$multiallelic_SNP_sample_thr <- input$multiallelic_SNP_sample_thr + advanced_options_all$alignment_score_thr <- input$alignment_score_thr + advanced_options_all$add_others <- input$add_others + advanced_options_all$others_max_snps <- input$others_max_snps + advanced_options_all$others_rm_with_indels <- as.logical(input$others_rm_with_indels) + # Save other inputs as needed + + removeModal() # Close the modal after saving + }) + + # UI popup window for input + observeEvent(input$advanced_options_all, { + showModal(modalDialog( + title = "Advanced Options", + + numericInput( + inputId = ns("alignment_score_thr"), + label = "Alignment Score Threshold", + value = advanced_options_all$alignment_score_thr, + min = 0 + ), hr(), + # rm_multiallelic_SNP + selectInput( + inputId = ns("rm_multiallelic_SNP"), + label = "Remove Multiallelic SNPs", + choices = c("TRUE" = TRUE, "FALSE" = FALSE), + selected = advanced_options_all$rm_multiallelic_SNP + ), + + # Conditionally show thresholds when rm_multiallelic_SNP is FALSE + conditionalPanel( + condition = paste0("input['", ns("rm_multiallelic_SNP"), "'] == 'FALSE'"), + numericInput( + inputId = ns("multiallelic_SNP_dp_thr"), + label = "Multiallelic SNP Depth Threshold", + value = advanced_options_all$multiallelic_SNP_dp_thr, + min = 0 + ), + numericInput( + inputId = ns("multiallelic_SNP_sample_thr"), + label = "Multiallelic SNP Sample Threshold", + value = advanced_options_all$multiallelic_SNP_sample_thr, + min = 0 + ) + ), hr(), + + # add_others + selectInput( + inputId = ns("add_others"), + label = "Add Others", + choices = c("TRUE" = TRUE, "FALSE" = FALSE), + selected = advanced_options_all$add_others + ), + + # Conditionally show others options when add_others is TRUE + conditionalPanel( + condition = paste0("input['", ns("add_others"), "'] == 'TRUE'"), + numericInput( + inputId = ns("others_max_snps"), + label = "Others Max SNPs", + value = advanced_options_all$others_max_snps, + min = 0 + ), + selectInput( + inputId = ns("others_rm_with_indels"), + label = "Remove Others with Indels", + choices = c("TRUE" = TRUE, "FALSE" = FALSE), + selected = advanced_options_all$others_rm_with_indels + ) + ), + + footer = tagList( + modalButton("Close"), + actionButton(ns("save_advanced_options_all"), "Save") + ) + )) + }) + vcf_out <- eventReactive(input$run_analysis,{ # Ensure the files are uploaded # Missing input with red border and alerts - if(input$file_type == "DArT Dosage Reports"){ - if (is.null(input$report_file$datapath) | is.null(input$counts_file$datapath) | input$d2v_output_name == "" | input$dosage2vcf_ploidy == "") { + if(input$file_type == "DArT MADC file"){ + req(input$madc_file) + # First check if the MADC file is valid (a non-fixedAlleleID MADC file) + + # Select species botloci + github_path <- "https://raw.githubusercontent.com/Breeding-Insight/BIGapp-PanelHub/refs/heads/long_seq/" + + botloci <- switch(input$species, + "alfalfa" = paste0(github_path, "alfalfa/20201030-BI-Alfalfa_SNPs_DArTag-probe-design_f180bp.botloci"), + "blueberry" = paste0(github_path, "blueberry/20200819-BI-Blueberry_10K_SNPs_forDArT_3K_ref_alt.botloci"), + "cranberry" = paste0(github_path, "cranberry/Cranberry_unique_alignment_126MAS_3K_54BB_rmDupTags_f180bp.botloci"), + "cucumber" = paste0(github_path, "cucumber/Cucumber_DArT3K_10192022_f180bp.botloci"), + "pecan" = paste0(github_path, "pecan/Pecan_unique_alignment_top48_MAS_14K_3K_f180bp.botloci"), + "potato" = paste0(github_path, "potato/potato_20K_SNPset_f180bp_forDArT_3K_f180bp.botloci"), + "strawberry" = paste0(github_path, "strawberry/strawberry_20K_SNPset_f180bp_forDArT_3K_f180bp.botloci"), + "sweetpotato" = paste0(github_path, "sweetpotato/sweetpotato_20K_SNPset_f180bp_forDArT_3K_f180bp.botloci"), + "other" = input$botloci_file$datapath) + + microhapDB <- switch(input$species, + "alfalfa" = paste0(github_path, "alfalfa/alfalfa_allele_db_v001.fa"), + "blueberry" = paste0(github_path, "blueberry/blueberry_allele_db_v001.fa"), + "cranberry" = paste0(github_path, "cranberry/cranberry_allele_db_v001.fa"), + "cucumber" = paste0(github_path, "cucumber/cucumber_allele_db_v001.fa"), + "pecan" = paste0(github_path, "pecan/pecan_allele_db_v001.fa"), + "potato" = paste0(github_path, "potato/potato_allele_db_v001.fa"), + "strawberry" = paste0(github_path, "strawberry/strawberry_allele_db_v001.fa"), + "sweetpotato" = paste0(github_path, "sweetpotato/sweetpotato_allele_db_v000_refAlt109bp.fa"), + "other" = input$hapDB_file$datapath) + + markers_info <- switch(input$species, + "alfalfa" = paste0(github_path, "alfalfa/20201030-BI-Alfalfa_SNPs_DArTag-probe-design_snpID_lut.csv"), + "blueberry" = paste0(github_path, "blueberry/20200819-BI-Blueberry_10K_SNPs_forDArT_3K_chrID_snpID_lut.csv"), + "cranberry" = paste0(github_path, "cranberry/Cranberry_unique_alignment_126MAS_3K_54BB_rmDupTags_lut.csv"), + "cucumber" = paste0(github_path, "cucumber/20221019-BI-Cucumber_DArTag-probe-desgin_snpID_lut.csv"), + "pecan" = paste0(github_path, "pecan/Pecan_unique_alignment_top48_MAS_14K_3K_snpID_lut.csv"), + "potato" = paste0(github_path, "potato/potato_dartag_v2_3915markers_rm7dupTags_6traitMarkers_rm1dup_snpID_lut.csv"), + "strawberry" = paste0(github_path, "strawberry/strawberry_9k_probe_3K_snpID_lut.csv"), + "sweetpotato" = paste0(github_path, "sweetpotato/sweetpotato_20K_SNPset_f180bp_forDArT_3K_snpID_lut.csv"), + "other" = if (!is.null(input$markers_info_file)) input$markers_info_file$datapath else NULL) + + # Guard optional inputs (may be NULL if not uploaded) + microhapDB <- if (length(microhapDB) == 0) NULL else microhapDB + markers_info <- if (length(markers_info) == 0) NULL else markers_info + + #Now perform conversion depending on user options + + # Shared setup for all MADC snp_type branches + if (is.null(input$madc_file$datapath) | input$d2v_output_name == "") { shinyalert( title = "Missing input!", - text = "Upload Dose Report and Counts Files", + text = "Upload MADC and/or define a output file name", size = "s", closeOnEsc = TRUE, closeOnClickOutside = FALSE, @@ -210,161 +378,97 @@ mod_dosage2vcf_server <- function(input, output, session, parent_session){ animation = TRUE ) } - req(input$report_file, input$counts_file, input$d2v_output_name, input$dosage2vcf_ploidy) - # Get the uploaded file paths - dosage_file <- input$report_file$datapath - counts_file <- input$counts_file$datapath - ploidy <- input$dosage2vcf_ploidy - + req(input$madc_file) + # Use a temporary file path without appending .vcf temp_base <- tempfile() - - #Status - updateProgressBar(session = session, id = "dosage2vcf_pb", value = 10, title = "Converting DArT files to VCF") - - # Convert to VCF using the BIGr package - cat("Running BIGr::dosage2vcf...\n") - - updateProgressBar(session = session, id = "dosage2vcf_pb", value = 50, title = "Writing VCF") - - dosage2vcf( - dart.report = dosage_file, - dart.counts = counts_file, - output.file = temp_base, - ploidy = as.numeric(ploidy) - ) - + + # Merge MADC if multiple + if(length(input$madc_file$datapath) > 1){ + updateProgressBar(session = session, id = "dosage2vcf_pb", value = 15, title = "Merging MADC files") + + merged_madc <- paste0(temp_base, ".csv") + + run_ids <- sapply(strsplit(input$madc_file$name, "_"), "[[", 1) + if(length(run_ids) == 0) run_ids <- NULL + + merge_MADCs(madc_list = as.list(input$madc_file$datapath), out_madc = merged_madc, run_ids = run_ids) + read_madc <- merged_madc + } else read_madc <- input$madc_file$datapath + # The output file should be temp_base.vcf output_name <- paste0(temp_base, ".vcf") - - updateProgressBar(session = session, id = "dosage2vcf_pb", value = 100, title = "Complete!") - - return(output_name) - - } else if(input$file_type == "DArT MADC file"){ - req(input$madc_file) - # First check if the MADC file is valid (a non-fixedAlleleID MADC file) - - #Read only the first column for the first seven rows - first_seven_rows <- read.csv(input$madc_file$datapath, header = FALSE, nrows = 7, colClasses = c(NA, "NULL")) - - #Check if all entries in the first column are either blank or "*" - check_entries <- all(first_seven_rows[, 1] %in% c("", "*")) - - #Check if the MADC file has the filler rows or is processed from updated fixed allele ID pipeline - if (check_entries) { - #Note: This assumes that the first 7 rows are placeholder info from DArT processing - shinyalert( - title = "Raw MADC!", - text = "This MADC file has not been processed by the updated Breeding Insight fixed allele ID pipeline.", - size = "m", - closeOnEsc = TRUE, - closeOnClickOutside = FALSE, - html = TRUE, - type = "error", - showConfirmButton = TRUE, - confirmButtonText = "OK", - confirmButtonCol = "#004192", - showCancelButton = FALSE, - animation = TRUE - ) - - #Exit the analysis - return() - } - - # Select species botloci - botloci <- switch(input$species, - "alfalfa" = "https://raw.githubusercontent.com/Breeding-Insight/BIGapp-PanelHub/refs/heads/main/alfalfa/20201030-BI-Alfalfa_SNPs_DArTag-probe-design_f180bp.botloci", - "blueberry" = "https://raw.githubusercontent.com/Breeding-Insight/BIGapp-PanelHub/refs/heads/main/blueberry/20200819-BI-Blueberry_10K_SNPs_forDArT_3K_ref_alt.botloci", - "cranberry" = "https://raw.githubusercontent.com/Breeding-Insight/BIGapp-PanelHub/refs/heads/main/cranberry/Cranberry_unique_alignment_126MAS_3K_54BB_rmDupTags_f180bp.botloci", - "cucumber" = "https://raw.githubusercontent.com/Breeding-Insight/BIGapp-PanelHub/refs/heads/main/cucumber/Cucumber_DArT3K_10192022_f180bp.botloci", - "lettuce" = "https://raw.githubusercontent.com/Breeding-Insight/BIGapp-PanelHub/refs/heads/main/lettuce/Lettuce_DArT3K_08172022_bait_f180bp.botloci", - "pecan" = "https://raw.githubusercontent.com/Breeding-Insight/BIGapp-PanelHub/refs/heads/main/pecan/Pecan_unique_alignment_top48_MAS_14K_3K_f180bp.botloci", - "sweetpotato" = "https://raw.githubusercontent.com/Breeding-Insight/BIGapp-PanelHub/refs/heads/main/sweetpotato/sweetpotato_20K_SNPset_f180bp_forDArT_3K_f180bp.botloci", - "other" = input$botloci_file$datapath) - - #Now perform conversion depending on user options - if(input$snp_type == "target_off"){ - if (is.null(input$madc_file$datapath) | input$d2v_output_name == "") { + + updateProgressBar(session = session, id = "dosage2vcf_pb", value = 30, title = "Writing VCF") + + log_lines <- character(0) + tryCatch( + withCallingHandlers( + { + if(input$snp_type == "target_off"){ + madc2vcf_all(madc = read_madc, + botloci_file = botloci, + hap_seq_file = microhapDB, + markers_info = markers_info, + n.cores= input$cores, + rm_multiallelic_SNP = as.logical(advanced_options_all$rm_multiallelic_SNP), + multiallelic_SNP_dp_thr = advanced_options_all$multiallelic_SNP_dp_thr, + multiallelic_SNP_sample_thr = advanced_options_all$multiallelic_SNP_sample_thr, + alignment_score_thr = advanced_options_all$alignment_score_thr, + add_others = as.logical(advanced_options_all$add_others), + others_max_snps = advanced_options_all$others_max_snps, + others_rm_with_indels = as.logical(advanced_options_all$others_rm_with_indels), + out_vcf = output_name, + verbose = TRUE) + } else if(input$snp_type == "target"){ + madc2vcf_targets(read_madc, output_name, get_REF_ALT = as.logical(input$ref_alt), botloci_file = botloci, + markers_info = markers_info, collapse_matches_counts = input$collapse_matches_counts) + } else if(input$snp_type == "multiallelic"){ + madc2vcf_multi( + madc_file = read_madc, + botloci_file = botloci, + outfile = output_name, + markers_info = markers_info, + ploidy = 4L, + verbose = TRUE + ) + } + }, + message = function(m) { + log_lines <<- c(log_lines, conditionMessage(m)) + invokeRestart("muffleMessage") + }, + warning = function(w) { + log_lines <<- c(log_lines, paste0("Warning: ", conditionMessage(w), "\n")) + shinyalert( + title = "Warning", + text = conditionMessage(w), + size = "s", + type = "warning", + showConfirmButton = TRUE, + confirmButtonText = "OK", + confirmButtonCol = "#004192" + ) + invokeRestart("muffleWarning") + } + ), + error = function(e) { + log_lines <<- c(log_lines, paste0("Error: ", conditionMessage(e), "\n")) shinyalert( - title = "Missing input!", - text = "Upload MADC and/or define a output file name", + title = "Error", + text = conditionMessage(e), size = "s", - closeOnEsc = TRUE, - closeOnClickOutside = FALSE, - html = TRUE, type = "error", showConfirmButton = TRUE, confirmButtonText = "OK", - confirmButtonCol = "#004192", - showCancelButton = FALSE, - animation = TRUE + confirmButtonCol = "#004192" ) } - req(input$madc_file) - - # Use a temporary file path without appending .vcf - temp_base <- tempfile() - - # merge MADC if multiple - if(length(input$madc_file$datapath) >1){ - updateProgressBar(session = session, id = "dosage2vcf_pb", value = 15, title = "Merging MADC files") - - merged_madc <- paste0(temp_base, ".csv") - - run_ids <- sapply(strsplit(input$madc_file$name, "_"), "[[",1) - if(length(run_ids) == 0) run_ids <- NULL - - merge_MADCs(madc_list = as.list(input$madc_file$datapath), out_madc = merged_madc,run_ids = run_ids) - read_madc <- merged_madc - } else read_madc <- input$madc_file$datapath - - # The output file should be temp_base.vcf - output_name <- paste0(temp_base, ".vcf") - - updateProgressBar(session = session, id = "dosage2vcf_pb", value = 30, title = "Writing VCF") - - madc2vcf_all(madc = read_madc, - botloci_file = botloci, - hap_seq_file = input$hapDB_file$datapath, - n.cores= input$cores, - rm_multiallelic_SNP = TRUE, - out_vcf = output_name, - verbose = FALSE) - - updateProgressBar(session = session, id = "dosage2vcf_pb", value = 100, title = "Complete!") - - return(output_name) - - } else if(input$snp_type == "target"){ - - # Use a temporary file path without appending .vcf - temp_base <- tempfile() - - # merge MADC if multiple - if(length(input$madc_file$datapath) >1){ - updateProgressBar(session = session, id = "dosage2vcf_pb", value = 15, title = "Merging MADC files") - - merged_madc <- paste0(temp_base, ".csv") - - run_ids <- sapply(strsplit(input$madc_file$name, "_"), "[[",1) - if(length(run_ids) == 0) run_ids <- NULL - - merge_MADCs(madc_list = as.list(input$madc_file$datapath), out_madc = merged_madc,run_ids = run_ids) - read_madc <- merged_madc - } else read_madc <- input$madc_file$datapath - - - # The output file should be temp_base.vcf - output_name <- paste0(temp_base, ".vcf") - - updateProgressBar(session = session, id = "dosage2vcf_pb", value = 30, title = "Writing VCF") - madc2vcf_targets(read_madc, output_name, get_REF_ALT = input$ref_alt, botloci_file = botloci) - - updateProgressBar(session = session, id = "dosage2vcf_pb", value = 100, title = "Complete!") - return(output_name) - } + ) + + d2vcf_log(paste(log_lines, collapse = "")) + updateProgressBar(session = session, id = "dosage2vcf_pb", value = 100, title = "Complete!") + return(output_name) } else if (input$file_type == "Dosage Matrix"){ diff --git a/inst/help_files/DArT_Report2VCF_par.Rmd b/inst/help_files/DArT_Report2VCF_par.Rmd index 6968708..5d57eb1 100644 --- a/inst/help_files/DArT_Report2VCF_par.Rmd +++ b/inst/help_files/DArT_Report2VCF_par.Rmd @@ -4,38 +4,183 @@ output: html_document date: "2024-08-29" --- -* **DArT MADC File** +## **DArT MADC File** The DArT MADC (Missing Allele Discovery Counts) file is a comma-separated file provided by DArT from a sequencing project. It includes the following key columns: -* AlleleID: Typically contains the chromosome, position, reference or alternative allele designation, and the allele ID according to the haplotype database (e.g., `Chr01_000084128|Ref_0001`). -* CloneID: Represents the chromosome and position (e.g., `Chr01_000084128`). -* AlleleSequence: The amplicon sequence (e.g., `GAGTGTGAAGATTTGGACAAAAGAGGTTGGTTTTTACTGTTATGGCATTTATCTCCTTATAAAATTTTGTATTTTTTTTGT`). -* Sample Columns: Named with sample IDs and containing counts of each allele per sample. +- AlleleID: Typically contains the chromosome, position, reference or alternative allele designation, and the allele ID according to the haplotype database (e.g., `Chr01_000084128|Ref_0001`). +- CloneID: Represents the chromosome and position (e.g., `Chr01_000084128`). +- AlleleSequence: The amplicon sequence (e.g., `GAGTGTGAAGATTTGGACAAAAGAGGTTGGTTTTTACTGTTATGGCATTTATCTCCTTATAAAATTTTGTATTTTTTTTGT`). +- Sample Columns: Named with sample IDs and containing counts of each allele per sample. -**Important**: BIGapp requires fixed AlleleIDs tagged with a respective number (e.g., suffix: `_0001`). Fixed AlleleIDs are generated by matching the MADC contents to the haplotype database. If your MADC file does not contain fixed AlleleIDs, please contact Breeding Insight. +We refer here to two different versions of this format, one named **raw MADC** and the other named **MADC with fixed AlleleIDs**. +The first one contains the original AlleleIDs as provided by DArT, which may not be fixed (i.e., they may not have a suffix with a number). +The second version contains fixed AlleleIDs, which can be generated by HapApp that matches the MADC contents to the haplotype database. +HapApp not only fixes the AlleleIDs but also makes corrections such as removing adaptor sequences, adding missing REF and ALT sequences, replacing IUPAC codes, +generating the markers information file (`_lut.csv`) with chromosome, positions, REF and ALT bases, whether the target is an indel, indel length and indel type (insertion or deletion). +This information is critical for the conversion to VCF, especially if you want to extract target SNPs with their REF and ALT bases. -* **Target vs. Off-Target SNPs** + +### **Target vs. Off-Target SNPs** vs. **Microhaplotypes** If you provide a MADC file, you can choose between extracting: * Only **target SNPs** – These are the SNPs for which probes were specifically designed. If your panel includes 3,000 SNPs, your output VCF file should contain exactly 3,000 target SNPs. * Both **target** and **off-target** SNPs – In addition to target SNPs, BIGapp will identify other SNPs within the amplicon region. +* **Microhaplotypes** – These are combinations of closely linked SNPs within the same amplicon that can be treated as a single multi-allelic marker. + +### **Requirements** + +BIGapp will run a series of checks to ensure that the necessary information is available for the type of SNPs you want to extract. +It will inform you if the operation requested is possible or not for your dataset and files provided. + +Here are some of the checks that BIGapp will perform: + +- If MADC has the expected columns +- Presence of columns and rows with all NA +- Presence of IUPAC codes on AlleleSequence +- Presence of lower case bases on AlleleSequence +- Presence of Indels +- If CloneID follows the format Chr_Pos +- If all Ref Alleles have a corresponding Alt and vice-versa +- If "Other" exists in the MADC AlleleID (e.g. `Chr01_000084128|Other_0003`), which indicates the presence of additional alleles +beyond the target SNPs. If "Other" alleles are present, BIGapp will inform the user and direct them to the `madc2vcf_all` +function if they want to extract these additional SNPs as well + +#### Targets + +If you decide to extract only the **target SNPs**, BIGapp function `madc2vcf_targets` will be used. -* **Target SNPs** +You can choose: -If you decide to extract only the **target SNPs**, you can choose if reference (REF) and alternative (ALT) bases should also be extracted. For extracting this information from the MADC file, BIGapp compares the reference sequences with the alternative, finds the polymorphic site and notate the changing base. This requires: +- `Collapse Matches Counts`: the MADC contains the target tags named as `Chr_Pos|Ref_0001` and `Chr_Pos|Alt_0002`, +(or `Chr_Pos|Ref` and `Chr_Pos|Alt` if raw MADC) and also contains the `Chr_Pos|RefMatch_0003` and `Chr_Pos|AltMatch_0004` tags, +which represent off-target SNPs and bases at the target position matching the Ref or the Alt. If you choose to collapse the counts, +the counts of the RefMatch and AltMatch tags will be added to the counts of the Ref and Alt tags, respectively. If not, +the RefMatch and AltMatch tags will be discarded and only the Ref and Alt tags will be kept. + +- `Select Marker Type`: if reference (REF) and alternative (ALT) bases should also be extracted. +BIGapp will extract this information from the `_lut.csv` file if provided; otherwise, it will extract it from the MADC file by comparing + the reference sequences with the alternative, finding the polymorphic site and notating the changing base. + +This requires: - Reference (`Ref_0001`) and alternative (`Alt_0002`) sequences for each tag. If one or both is missing, the tag will be discarded. - A single polymorphism between them. If more than one is found, the tag is discarded - - A `.botloci` file to inform which tag sequences should be converted to its reverse complement. For BI-supported marker panel **species** this file is already embedded within the app, no upload is required. + - A `.botloci` file to inform which tag sequences should be converted to its reverse complement. This file is generated by HapApp when you upload a MADC file with unfixed AlleleIDs. For BI-supported marker panel **species** this file is already embedded within the app, no upload is required. + - or + - A markers information file (`_lut.csv`) with chromosome, position, REF and ALT bases, indel length and indel type (insertion or deletion) for each target SNP. This file is generated by HapApp when you upload a MADC file with unfixed AlleleIDs. For BI-supported marker panel **species** this file is already embedded within the app, no upload is required. + +If you choose to not extract REF and ALT information, all tags will be kept, but your VCF will have missing data (`.`) in the REF and ALT fields. + +`madc2vcf_targets` doesn't run if: + + - MADC Column names are not correct + - Ignores Other alleles, but informs the user if they exist and directs them to `madc2vcf_all` in case they want to extract them as well + +See the table for a summary of `madc2vcf_targets` requirements according to MADC content: -If you choose to not extract REF and ALT information, all tags will be kept, but your VCF will have missing data (`.`) in the REF and ALT fields. The only process in BIGapp that will require this information is the Dosage Calling with PolyRAD. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
check statusget_REF_ALTRequires
IUPACdetectedTRUEmarkers_info REF/ALT
detectedFALSE-
not detectedTRUEbotloci or markers_info REF/ALT
not detectedFALSE-
IndelsdetectedTRUEmarkers_info REF/ALT
detectedFALSE-
not detectedTRUEbotloci or markers_info REF/ALT
not detectedFALSE-
CloneID has Chr_Pos formatdetectedTRUEbotloci or markers_info REF/ALT
detectedFALSE-
not detectedTRUEmarkers_info CHR/POS/REF/ALT or markers_info CHR/POS/ + botloci
not detectedFALSEmarkers_info CHR/POS
FixAlleleIDsdetectedTRUEbotloci or markers_info REF/ALT
detectedFALSE-
not detectedTRUEmarkers_info REF/ALT
not detectedFALSE-
-* **Target and off-target (all) SNPs** +
-To identify **off-target** SNPs, BIGapp aligns each amplicon against its reference (via Bioconductor’s `Biostrings` + `pwalign`) to uncover additional polymorphisms. This procedure requires: +#### Off-target SNPs + +To identify **off-target** SNPs, BIGr function `madc2vcf_all` will be used. +`madc2vcf_all` aligns each amplicon against its reference (via Bioconductor’s `Biostrings` + `pwalign`) to uncover additional +polymorphisms. This procedure requires: - Reference & alternative sequences (e.g. `Ref_0001`, `Alt_0002`) for every tag - If a FASTA haplotype database is supplied, any missing sequences in the MADC file will be retrieved automatically. @@ -44,42 +189,127 @@ To identify **off-target** SNPs, BIGapp aligns each amplicon against its referen - Tags with zero or multiple variants are excluded. - `.botloci` file - Specifies which tags must be reverse-complemented. For BI-supported species, this file is bundled within the app—no upload needed. + - If your MADC contains indels as target, the markers information file (`_lut.csv`) with chromosome, position, REF and ALT bases, indel length and indel type (insertion or deletion) for each target SNP. This file is generated by HapApp when you upload a MADC file with unfixed AlleleIDs. For BI-supported marker panel **species** this file is already embedded within the app, no upload is required. + +The function has some parameters that allow you to customize resource usage, the stringency of the alignment, and tag filtering: + +- `Number of CPU Cores` to specify the number of cores to use for the alignment. By default, it uses a single core. + +Click on `Advanced Options` to see more parameters: -* **Specie** +- `Alignment Score Threshold` to specify the minimum alignment score for a SNP to be called. By default, it is set to 40, which means that only tags (sequences) with an alignment score of 40 or higher will be included in the output VCF file. +- `Remove Multiallelic SNPs` to specify if you want to remove SNPs with more than two variations (e.g. Ref A and Alts C and T). By default, it is set to TRUE, which means that multiallelic SNPs will be removed. +If set to FALSE, multiallelic SNPs will be kept in the output VCF file but you can specify filter thresholds: + - `Multiallelic SNP Depth Threshold` specify the minimum depth by tag threshold for filtering low-frequency SNP alleles. Default is 0 + - `Multiallelic SNP Sample Threshold` specify the minimum number of samples threshold for filtering low-frequency SNP alleles. Default is 0. +- `Add Others` to specify if you want to consider SNPs in the "Other" alleles (e.g. `Chr01_000084128|Other_0003`) for the output VCF file. By default, it is set to FALSE, which means that "Other" alleles will be discarded. +If set to TRUE, "Other" alleles will be included and you can define some filters: + - `Others Max SNPs` to specify the maximum number of SNPs allowed in the "Other" tags alleles. Default is 5. If an "Other" allele has more than this number of SNPs, it will be discarded. + - `Remove Others with Indels` to specify if you want to remove "Other" alleles with indels. By default, it is set to TRUE, which means that "Other" alleles with indels will be removed. -Specify the species so BIGapp can pick the correct `.botloci` file. BI-supported species files live in the [BIGapp-PanelHub](https://github.com/Breeding-Insight/BIGapp-PanelHub) repo and are auto-loaded by the app. +`madc2vcf_all` doesn't run if: -You can also input **multiple MADC files**. BIGapp will merge the files before the conversion. If you have repeated samples IDs, a suffix with the run ID (beginning of the file name) will be added to the repeated samples. + - MADC Column names are not correct + - If it is raw MADC + - If it has IUPAC codes -Conversion is powered by the `madc2vcf_targets` and `madc2vcf_all` functions in the [BIGr](https://github.com/Breeding-Insight/BIGr) R package. You can also run them on the command line to access advanced options (e.g., multiallelic SNP support or custom alignment thresholds). +See the table for `madc2vcf_all` requirements according to MADC content: -* **DArTag Dosage Report** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Check statusRequires
Indelsdetectedmarkers_info REF/ALT/IndelPos/IndelLength + botloci
not detectedbotloci
CloneID has Chr_Pos formatdetectedbotloci
not detectedmarkers_info CHR/POS + botloci
All Ref tags have corresponding Altdetectedbotloci
not detectedbotloci + microhapdb
-The DArT Dosage Report is a tab-separated file provided by DArT from a sequencing project. It contains genotypic information for each target marker across all samples in the sequencing project. +
-File Structure: +#### Microhaplotypes -* Markers are in rows, and samples are in columns. -* The file includes several summary metric columns before the sample dosage columns. -* Dosage values represent the number of alternative alleles present in each sample, ranging from 0 to the species’ ploidy number. +To identify **microhaplotypes**, BIGapp looks for multiple polymorphisms within the same amplicon. This process requires: -Dosage Interpretation (Example: Tetraploid Species - 4x) + - Reference & alternative sequences (e.g. `Ref_0001`, `Alt_0002`) for every tag + - At least two polymorphic sites within the same amplicon + - Tags with fewer than two variants are excluded. + - `.botloci` file + - Specifies which tags must be reverse-complemented. For BI-supported species, this file is bundled within the app—no upload needed. + - If your MADC contains indels as target, the markers information file (`_lut.csv`) with chromosome, position, REF and ALT bases, indel length and indel type (insertion or deletion) for each target SNP. This file is generated by HapApp when you upload a MADC file with unfixed AlleleIDs. For BI-supported marker panel **species** this file is already embedded within the app, no upload is required. -* 4 → Homozygous for the reference allele (AAAA) -* 3 → Heterozygous with three reference alleles and one alternative (AAAB) -* 2 → Heterozygous with two reference and two alternative alleles (AABB) -* 1 → Heterozygous with one reference allele and three alternative (ABBB) -* 0 → Homozygous for the alternative allele (BBBB) +`madc2vcf_multi` doesn’t run if: -This codification is commonly used as input for various software, including AGHmatrix, rrBLUP, and mappoly. However, some programs require not only dosage information but also read counts (see description below). + - MADC Column names are not correct + - If it is raw MADC + - If it has IUPAC codes + - if Ref or Alt tags are absent -To accommodate this, BIGapp integrates both dosage and read count data, generating a VCF file—the most widely accepted and standardized format for genotypic information, ensuring compatibility with a broad range of software. +See the table for `madc2vcf_multi` requirements according to MADC content: - -* **DArTag Counts File** + + + + + + + + + + + + + + + + + + + + + + + + +
Check statusRequires
Indelsdetectedbotloci
not detectedbotloci
CloneID has Chr_Pos formatdetectedbotloci
not detectedmarkers_info CHR/POS + botloci
-The DArT counts file is a tab-separated file provided by DArT from a sequencing project. It contains the read count information for the reference and alternate allele at each target marker. The marker information is in the rows and the samples are in the columns. There are several informational columns that precede the sample columns. There are two versions of this file. The “collapsed counts” version contains the target markers that includes their multiallic read counts in their total counts. The “Counts” file contains the read counts for the target markers only (excluding the multiallelic read count information). BIGapp will merge the counts and the dosage information to generate a VCF file format —the most widely accepted and standardized format for genotypic information, ensuring compatibility with a broad range of software. - -* **Species Ploidy** +
+ +### **Species** + +Specify the species so BIGapp can pick the correct `.botloci`, `_lut.csv`, and microhaplotype database file. BI-supported species files live in the [BIGapp-PanelHub](https://github.com/Breeding-Insight/BIGapp-PanelHub) repo and are auto-loaded by the app. + +### **Species Ploidy** Specifies the ploidy level of the species. The current analysis supports both diploids and autopolyploids. + +### **Multiple MADC files** + +You can also input **multiple MADC files**. BIGapp will merge the files before the conversion. If you have repeated sample IDs, a suffix with the run ID (beginning of the file name) will be added to the repeated samples. + +Conversion is powered by the `madc2vcf_targets`, `madc2vcf_all`, and `madc2vcf_multi` functions in the [BIGr](https://github.com/Breeding-Insight/BIGr) R package. From 4eb06084a183876289b8d491a0245f47dbe31241 Mon Sep 17 00:00:00 2001 From: Alexander Sandercock <39815775+alex-sandercock@users.noreply.github.com> Date: Sun, 17 May 2026 12:16:38 -0400 Subject: [PATCH 3/6] Apply suggestion from @Copilot Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- R/mod_dosage2vcf.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/mod_dosage2vcf.R b/R/mod_dosage2vcf.R index 18f02cb..94ead6b 100644 --- a/R/mod_dosage2vcf.R +++ b/R/mod_dosage2vcf.R @@ -57,7 +57,7 @@ mod_dosage2vcf_ui <- function(id){ fileInput(ns("hapDB_file"), "Upload haplotype database file (fasta) (optional)"), fileInput(ns("markers_info_file"), "Upload markers information (_lut.csv from HapApp) (optional)"), ), - sliderInput(ns("cores"), "Number of CPU Cores", min = 1, max = (availableCores() - 1), value = 1, step = 1), br(), + sliderInput(ns("cores"), "Number of CPU Cores", min = 1, max = max(1, availableCores() - 1), value = 1, step = 1), br(), div( style = "text-align: left; margin-top: 10px;", actionButton(ns("advanced_options_all"), From 807f4604570cc781e2200fd97ffb95d2bb9b5d76 Mon Sep 17 00:00:00 2001 From: Alexander Sandercock <39815775+alex-sandercock@users.noreply.github.com> Date: Fri, 15 May 2026 13:33:41 -0400 Subject: [PATCH 4/6] vcf check updates --- R/mod_Filtering.R | 68 ++++++------- R/mod_GS.R | 238 +++++++++++++++++++++++----------------------- R/mod_GSAcc.R | 84 ++++++++-------- R/mod_PCA.R | 138 +++++++++++++-------------- R/mod_dapc.R | 48 +++++----- R/mod_diversity.R | 26 ++--- R/mod_gwas.R | 58 +++++------ 7 files changed, 330 insertions(+), 330 deletions(-) diff --git a/R/mod_Filtering.R b/R/mod_Filtering.R index b040996..fa68891 100644 --- a/R/mod_Filtering.R +++ b/R/mod_Filtering.R @@ -104,7 +104,7 @@ mod_Filtering_ui <- function(id){ progressBar(id = ns("pb_filter"), value = 0, status = "info", display_pct = TRUE, striped = TRUE, title = " ") ), # A placeholder for the download button. It will be rendered in the shinyalert modal. - uiOutput(ns("download_ui_placeholder")) + uiOutput(ns("download_ui_placeholder")) ) ) ) @@ -159,8 +159,8 @@ mod_Filtering_server <- function(input, output, session, parent_session){ # expand specific box updateBox(id = "VCF_Filtering_box", action = "toggle", session = parent_session) }) - - + + ## Advanced options popup #Default model choices advanced_options <- reactiveValues( @@ -168,7 +168,7 @@ mod_Filtering_server <- function(input, output, session, parent_session){ remove_list = NULL, remove_file = NULL ) - + #List the ped file name if previously uploaded output$uploaded_file_name <- renderText({ if (!is.null(advanced_options$remove_file)) { @@ -177,47 +177,47 @@ mod_Filtering_server <- function(input, output, session, parent_session){ "" # Return an empty string if no file has been uploaded } }) - + #Get list of sample names from VCF file observeEvent(input$updog_rdata, { #### VCF sanity check - checks <- vcf_sanity_check(input$updog_rdata$datapath, - max_markers = 16000, + checks <- vcf_sanity_check(input$updog_rdata$datapath, + max_markers = 16000, depth_support_fields = c("DP", "AD", "RA")) - + error_if_false <- c( "VCF_header", "VCF_columns", "unique_FORMAT", "GT", "samples", "chrom_info", "pos_info", "VCF_compressed", "allele_counts" ) - + error_if_true <- c( - "multiallelics", "phased_GT", + "multiallelics", "duplicated_samples", "duplicated_markers" ) - + warning_if_false <- c("ref_alt","max_markers") - - checks_result <- vcf_sanity_messages(checks, - error_if_false, - error_if_true, - warning_if_false = warning_if_false, + + checks_result <- vcf_sanity_messages(checks, + error_if_false, + error_if_true, + warning_if_false = warning_if_false, warning_if_true = NULL) - + print(checks) print(checks_result) if(checks_result) return() # Stop the analysis if checks fail ######### - - + + #populate preview_data preview_vcf <- read.vcfR(input$updog_rdata$datapath, verbose = FALSE, nrows = 1) - + #Get names advanced_options$sample_list <- names(data.frame(preview_vcf@gt, check.names=FALSE)[,-1]) - + rm(preview_vcf) }) - + #UI popup window for input observeEvent(input$advanced_options, { showModal(modalDialog( @@ -266,9 +266,9 @@ mod_Filtering_server <- function(input, output, session, parent_session){ ) )) }) - - - + + + #Close popup window when user "saves options" observeEvent(input$save_advanced_options, { #Only close the window if one of the options has been selected @@ -278,10 +278,10 @@ mod_Filtering_server <- function(input, output, session, parent_session){ advanced_options$remove_list <- input$remove_list advanced_options$remove_file <- input$remove_file # Save other inputs as needed - + removeModal() } - + }) #vcf @@ -391,7 +391,7 @@ mod_Filtering_server <- function(input, output, session, parent_session){ animation = TRUE ) } - + if (input$use_updog & updog_par) { # Use Updog filtering parameters OD_filter <- as.numeric(input$OD_filter) @@ -444,17 +444,17 @@ mod_Filtering_server <- function(input, output, session, parent_session){ filtering_files$raw_sample_miss_df <- as.numeric(colMeans(is.na(gt_matrix))) #Sample missing values rm(gt_matrix) #Remove gt matrix - + #Remove the samples if any are manually selected from advanced options if (!is.null(advanced_options$remove_list)) { advanced_options$remove_file <- NULL #Prioritize manually selected samples if a file was also uploaded (add a user warning if both are uploaded in model) - + vcf_temp <- subset_vcf(vcf, remove.sample.list = advanced_options$remove_list) vcf <- vcf_temp[[1]] removed_samples <- vcf_temp[[2]] rm(vcf_temp) } else if (!is.null(advanced_options$remove_file)) { - + #Remove the samples vcf_temp <- subset_vcf(vcf, remove.sample.file = advanced_options$remove_file$datapath) vcf <- vcf_temp[[1]] @@ -525,7 +525,7 @@ mod_Filtering_server <- function(input, output, session, parent_session){ sample_removed <- length(starting_samples) - length(final_samples) removed_names <- setdiff(starting_samples, final_samples) filtering_files$removed_names <- removed_names - + # Define the download handler output$download_removed_samples <- downloadHandler( filename = function() { @@ -537,7 +537,7 @@ mod_Filtering_server <- function(input, output, session, parent_session){ } } ) - + if (sample_removed > 0 && removed_samples == 0) { showModal(modalDialog( title = "Samples Filtered", @@ -1001,7 +1001,7 @@ mod_Filtering_server <- function(input, output, session, parent_session){ writeLines(paste(capture.output(filtering_summary_info()), collapse = "\n"), file) } ) - + } ## To be copied in the UI diff --git a/R/mod_GS.R b/R/mod_GS.R index 99750c5..dcc3b29 100644 --- a/R/mod_GS.R +++ b/R/mod_GS.R @@ -140,7 +140,7 @@ mod_GS_ui <- function(id) { #' @noRd mod_GS_server <- function(input, output, session, parent_session) { ns <- session$ns - + # Help links observeEvent(input$goPar, { # change to help tab @@ -148,7 +148,7 @@ mod_GS_server <- function(input, output, session, parent_session) { session = parent_session, inputId = "MainMenu", selected = "help" ) - + # select specific tab updateTabsetPanel( session = parent_session, inputId = "Genomic_Prediction_tabset", @@ -157,14 +157,14 @@ mod_GS_server <- function(input, output, session, parent_session) { # expand specific box updateBox(id = "Genomic_Prediction_box", action = "toggle", session = parent_session) }) - + observeEvent(input$goRes, { # change to help tab updatebs4TabItems( session = parent_session, inputId = "MainMenu", selected = "help" ) - + # select specific tab updateTabsetPanel( session = parent_session, inputId = "Genomic_Prediction_tabset", @@ -173,14 +173,14 @@ mod_GS_server <- function(input, output, session, parent_session) { # expand specific box updateBox(id = "Genomic_Prediction_box", action = "toggle", session = parent_session) }) - + observeEvent(input$goCite, { # change to help tab updatebs4TabItems( session = parent_session, inputId = "MainMenu", selected = "help" ) - + # select specific tab updateTabsetPanel( session = parent_session, inputId = "Genomic_Prediction_tabset", @@ -189,7 +189,7 @@ mod_GS_server <- function(input, output, session, parent_session) { # expand specific box updateBox(id = "Genomic_Prediction_box", action = "toggle", session = parent_session) }) - + # Default model choices advanced_options_pred <- reactiveValues( pred_model = "GBLUP", @@ -197,14 +197,14 @@ mod_GS_server <- function(input, output, session, parent_session) { pred_est_file = NULL, ped_file = NULL ) - + pred_outputs <- reactiveValues( corr_output = NULL, comb_output = NULL, all_GEBVs = NULL, avg_GEBVs = NULL ) - + # List the ped file name if previously uploaded output$uploaded_file_name <- renderText({ if (!is.null(advanced_options_pred$ped_file)) { @@ -213,7 +213,7 @@ mod_GS_server <- function(input, output, session, parent_session) { "" # Return an empty string if no file has been uploaded } }) - + output$uploaded_file_name_pred <- renderText({ if (!is.null(advanced_options_pred$pred_est_file)) { paste("Previously uploaded file:", advanced_options_pred$pred_est_file$name) @@ -221,9 +221,9 @@ mod_GS_server <- function(input, output, session, parent_session) { "" # Return an empty string if no file has been uploaded } }) - + ## Trait file modal window - + # Default choices trait_options <- reactiveValues( missing_data = "NA", @@ -231,14 +231,14 @@ mod_GS_server <- function(input, output, session, parent_session) { sample_column = NULL, file_type = NULL ) - + # UI popup window for input observeEvent(input$pred_trait_file, { req(input$pred_trait_file) # Get the column names of the csv file info_df <- read.csv(input$pred_trait_file$datapath, header = TRUE, check.names = FALSE, nrows = 2) info_df[, 1] <- as.character(info_df[, 1]) # Makes sure that the sample names are characters instead of numeric - + # Read first 5 rows for preview preview_data <- tryCatch( { @@ -248,7 +248,7 @@ mod_GS_server <- function(input, output, session, parent_session) { NULL } ) - + showModal(modalDialog( title = "Trait File Options", size = "l", @@ -301,14 +301,14 @@ mod_GS_server <- function(input, output, session, parent_session) { actionButton(ns("save_trait_options"), "Save") ) )) - + # Render the preview table output$file_preview <- renderTable({ req(preview_data) preview_data }) }) - + output$custom_missing_msg <- renderText({ if (input$missing_data == "Custom" && nchar(input$custom_missing) == 0) { "Please enter a custom missing value." @@ -316,8 +316,8 @@ mod_GS_server <- function(input, output, session, parent_session) { "" } }) - - + + # Close popup window when user "saves options" observeEvent(input$save_trait_options, { trait_options$missing_data <- input$missing_data @@ -325,7 +325,7 @@ mod_GS_server <- function(input, output, session, parent_session) { trait_options$sample_column <- input$sample_column # trait_options$file_type # Save other inputs as needed - + if (input$missing_data == "Custom" && nchar(input$custom_missing) == 0) { # Validation failed: display warning and prevent modal closure showNotification( @@ -335,10 +335,10 @@ mod_GS_server <- function(input, output, session, parent_session) { ) return() # Stop further execution and keep the modal open } - + removeModal() # Close the modal after saving }) - + # UI popup window for input observeEvent(input$advanced_options_pred, { showModal(modalDialog( @@ -387,7 +387,7 @@ mod_GS_server <- function(input, output, session, parent_session) { ) )) }) - + # Close popup window when user "saves options" observeEvent(input$save_advanced_options_pred, { advanced_options_pred$pred_model <- input$pred_model @@ -395,17 +395,17 @@ mod_GS_server <- function(input, output, session, parent_session) { advanced_options_pred$pred_est_file <- input$pred_est_file advanced_options_pred$ped_file <- input$ped_file # Save other inputs as needed - + removeModal() # Close the modal after saving }) - + ### Genomic Prediction # This tab involved 3 observeEvents # 1) to get the traits listed in the phenotype file # 2) to input and validate the input files # 3) to perform the genomic prediction - - + + # 1) Get traits observeEvent(input$save_trait_options, { info_df2 <- read.csv(input$pred_trait_file$datapath, header = TRUE, check.names = FALSE, nrow = 0) @@ -414,11 +414,11 @@ mod_GS_server <- function(input, output, session, parent_session) { updateVirtualSelect("pred_fixed_info2", choices = trait_var2, session = session) updateVirtualSelect("pred_trait_info2", choices = trait_var2, session = session) }) - + observeEvent(input$pred_fixed_info2, { updateVirtualSelect("pred_fixed_cat2", choices = input$pred_fixed_info2, session = session) }) - + # 2) Error check for prediction and save input files continue_prediction2 <- reactiveVal(NULL) pred_inputs2 <- reactiveValues( @@ -430,7 +430,7 @@ mod_GS_server <- function(input, output, session, parent_session) { pred_geno_pheno = NULL, matrix = NULL ) - + pred_outputs2 <- reactiveValues( corr_output = NULL, box_plot = NULL, @@ -441,7 +441,7 @@ mod_GS_server <- function(input, output, session, parent_session) { colors = NULL, trait_output = NULL ) - + # Reactive boxes output$shared_snps <- renderValueBox({ valueBox( @@ -451,12 +451,12 @@ mod_GS_server <- function(input, output, session, parent_session) { color = "info" ) }) - + observeEvent(input$prediction_est_start, { # req(pred_inputs$pheno_input, pred_inputs$geno_input) - + toggleClass(id = "pred_est_ploidy", class = "borderred", condition = (is.na(input$pred_est_ploidy) | is.null(input$pred_est_ploidy))) - + if (is.null(input$pred_known_file$datapath) | is.null(input$pred_trait_file$datapath)) { shinyalert( title = "Missing input!", @@ -474,16 +474,16 @@ mod_GS_server <- function(input, output, session, parent_session) { ) } req(input$pred_known_file$datapath, input$pred_trait_file$datapath, input$pred_est_ploidy) - + # Status updateProgressBar(session = session, id = "pb_gp", value = 5, title = "Checking input files") - + # Variables ploidy <- as.numeric(input$pred_est_ploidy) train_geno_path <- input$pred_known_file$datapath est_geno_path <- input$pred_est_file$datapath traits <- input$pred_trait_info2 - + # Phenotypic variables if (trait_options$missing_data == "(blank)") { pheno2 <- read.csv(input$pred_trait_file$datapath, header = TRUE, check.names = FALSE, na.strings = "") @@ -492,11 +492,11 @@ mod_GS_server <- function(input, output, session, parent_session) { } else { pheno2 <- read.csv(input$pred_trait_file$datapath, header = TRUE, check.names = FALSE, na.strings = trait_options$missing_data) } - + # Make the sample ID column the first column in the dataframe sample_col_name <- input$sample_column pheno2 <- pheno2[, c(sample_col_name, setdiff(names(pheno2), sample_col_name))] - + # Add row names and catch errors tryCatch( { @@ -519,12 +519,12 @@ mod_GS_server <- function(input, output, session, parent_session) { return(NULL) # Return NULL to prevent further processing } ) - + # Assigning the IDs based on user input for column 1 ids_pheno <- pheno2[, 1] - - - + + + # Make sure at least one trait was input if (length(traits) == 0) { # If condition is met, show notification toast @@ -543,23 +543,23 @@ mod_GS_server <- function(input, output, session, parent_session) { imageUrl = "", animation = TRUE, ) - - + + # Stop the observeEvent gracefully return() } - - + + # Getting genotype matrix - + # Geno file path file_path <- train_geno_path - + # Geno.file conversion if needed if (grepl("\\.csv$", file_path)) { train_geno <- read.csv(train_geno_path, header = TRUE, row.names = 1, check.names = FALSE) est_geno <- read.csv(est_geno_path, header = TRUE, row.names = 1, check.names = FALSE) - + # Save number of SNPs # pred_inputs$pred_snps <- nrow(geno) } else if (grepl("\\.vcf$", file_path) || grepl("\\.gz$", file_path)) { @@ -576,32 +576,32 @@ mod_GS_server <- function(input, output, session, parent_session) { } }) } - + #### VCF sanity check checks <- vcf_sanity_check(train_geno_path) - + error_if_false <- c( "VCF_header", "VCF_columns", "unique_FORMAT", "GT", "samples", "VCF_compressed" ) - + error_if_true <- c( - "multiallelics", "phased_GT", "mixed_ploidies", + "multiallelics", "mixed_ploidies", "duplicated_samples", "duplicated_markers" ) - + warning_if_false <- c("chrom_info", "pos_info", "ref_alt","max_markers") - checks_result <- vcf_sanity_messages(checks, - error_if_false, - error_if_true, - warning_if_false = warning_if_false, + checks_result <- vcf_sanity_messages(checks, + error_if_false, + error_if_true, + warning_if_false = warning_if_false, warning_if_true = NULL, input_ploidy = as.numeric(input$pred_est_ploidy)) - + if(checks_result) return() # Stop the analysis if checks fail ######### - + # Convert VCF file if submitted train_vcf <- vcfR::read.vcfR(train_geno_path, verbose = FALSE) if (is.null(est_geno_path) || is.na(est_geno_path)) { @@ -609,21 +609,21 @@ mod_GS_server <- function(input, output, session, parent_session) { } else { ## Check VCF checks <- vcf_sanity_check(est_geno_path) - checks_result <- vcf_sanity_messages(checks, - error_if_false, - error_if_true, - warning_if_false = warning_if_false, + checks_result <- vcf_sanity_messages(checks, + error_if_false, + error_if_true, + warning_if_false = warning_if_false, warning_if_true = NULL, as.numeric(input$pred_est_ploidy)) - + if(checks_result) return() # Stop the analysis if checks fail - + est_vcf <- vcfR::read.vcfR(est_geno_path, verbose = FALSE) } - + # Get number of SNPs # pred_inputs$pred_snps <- nrow(vcf) - + # Extract GT if (is.null(est_vcf)) { est_geno <- NULL @@ -654,11 +654,11 @@ mod_GS_server <- function(input, output, session, parent_session) { imageUrl = "", animation = TRUE, ) - + # Stop the analysis return() } - + # Check that the ploidy entered is correct if (ploidy != max(train_geno, na.rm = TRUE)) { # If condition is met, show notification toast @@ -679,13 +679,13 @@ mod_GS_server <- function(input, output, session, parent_session) { imageUrl = "", animation = TRUE ) - - + + # Stop the observeEvent gracefully # return() } - - + + # Function to convert genotype matrix according to ploidy #convert_genotype <- function(genotype_matrix, ploidy) { @@ -703,7 +703,7 @@ mod_GS_server <- function(input, output, session, parent_session) { #est_geno_adj_init <- convert_genotype(est_geno, as.numeric(ploidy)) est_geno_adj_init <- est_geno } - + # Make sure the trait file and genotype file are in the same order # Column names for geno (assuming these are the individual IDs) colnames_geno <- colnames(train_geno) @@ -713,7 +713,7 @@ mod_GS_server <- function(input, output, session, parent_session) { common_ids <- intersect(colnames_geno, ids_pheno) # Get number of id pred_inputs2$pred_geno_pheno <- length(common_ids) - + # Throw an error if there are less matching samples in the phenotype file than the genotype file if (length(common_ids) == 0) { # If condition is met, show notification toast @@ -732,8 +732,8 @@ mod_GS_server <- function(input, output, session, parent_session) { imageUrl = "", animation = TRUE, ) - - + + # Stop the observeEvent gracefully return() } else if (length(common_ids) < length(colnames_geno)) { @@ -755,15 +755,15 @@ mod_GS_server <- function(input, output, session, parent_session) { imageUrl = "", animation = TRUE ) - - + + # Stop the observeEvent gracefully # return() } - - - - + + + + # Final check before performing analyses shinyalert( title = "Ready?", @@ -791,15 +791,15 @@ mod_GS_server <- function(input, output, session, parent_session) { } } ) - + # Status updateProgressBar(session = session, id = "pb_gp", value = 40, title = "Generating Matrices") - + # Create relationship matrix depending on the input VCF files if (is.null(advanced_options_pred$pred_est_file)) { # Subset phenotype file by common IDs pheno2 <- pheno2[common_ids, ] - + #Matrix #Kin_mat <- A.mat(t(train_geno_adj_init), max.missing=NULL,impute.method="mean",return.imputed=FALSE) Kin_mat <- Gmatrix(t(train_geno_adj_init), @@ -812,7 +812,7 @@ mod_GS_server <- function(input, output, session, parent_session) { } else{ #Subset phenotype file and training file by common IDs pheno2 <- pheno2[common_ids, ] - + # Match training and testing genotype file SNPs common_markers <- intersect(rownames(train_geno_adj_init), rownames(est_geno_adj_init)) # first remove samples from training genotype matrix that are not in the phenotype file @@ -831,22 +831,22 @@ mod_GS_server <- function(input, output, session, parent_session) { missingValue = "NA") } - + # Save to reactive values # pred_inputs2$shared_snps <- length(common_markers) pred_inputs2$matrix <- Kin_mat pred_inputs2$pheno_input <- pheno2 }) - + # 3) Analysis only proceeds once continue_prediction is converted to TRUE observe({ req(continue_prediction2(), pred_inputs2$pheno_input, pred_inputs2$matrix) - + # Stop analysis if cancel was selected if (isFALSE(continue_prediction2())) { return() } - + # Variables ploidy <- as.numeric(input$pred_est_ploidy) gmat <- pred_inputs2$matrix @@ -870,16 +870,16 @@ mod_GS_server <- function(input, output, session, parent_session) { cores <- 1 total_population <- ncol(gmat) # train_size <- floor(percentage / 100 * total_population) - + # Status updateProgressBar(session = session, id = "pb_gp", value = 90, title = "Generating Results") - + # initialize dataframe results_GEBVs <- matrix(nrow = ncol(gmat), ncol = length(traits) + 1) results_TRAITs <- matrix(nrow = ncol(gmat), ncol = length(traits) + 1) colnames(results_TRAITs) <- c("Sample", paste0(traits)) # Set the column names to be the traits colnames(results_GEBVs) <- c("Sample", paste0(traits)) # Set the column names to be the traits - + # GBLUP for each trait for (trait_idx in 1:length(traits)) { traitpred <- kin.blup( @@ -891,24 +891,24 @@ mod_GS_server <- function(input, output, session, parent_session) { K = gmat, n.core = cores ) - + results_GEBVs[, (trait_idx + 1)] <- traitpred$g results_TRAITs[, (trait_idx + 1)] <- traitpred$pred } # Organize dataframes results_GEBVs[, 1] <- row.names(data.frame(traitpred$g)) results_TRAITs[, 1] <- row.names(data.frame(traitpred$pred)) - + # Label the samples that already had phenotype information results_GEBVs <- data.frame(results_GEBVs) results_TRAITs <- data.frame(results_TRAITs) exists_in_df <- results_GEBVs[[1]] %in% pheno2[[1]] results_GEBVs <- cbind(results_GEBVs[1], "w/Pheno" = exists_in_df, results_GEBVs[-1]) results_TRAITs <- cbind(results_TRAITs[1], "w/Pheno" = exists_in_df, results_TRAITs[-1]) - + # Status updateProgressBar(session = session, id = "pb_gp", value = 100, title = "Finished!") - + ## Make output tables depending on 1 or 2 VCF/pedigree files used. # GEBVs if (!is.null(advanced_options_pred$pred_est_file)) { @@ -917,7 +917,7 @@ mod_GS_server <- function(input, output, session, parent_session) { } else { pred_outputs2$all_GEBVs <- results_GEBVs } - + # BLUPs of genetic values if (!is.null(advanced_options_pred$pred_est_file)) { # Subset rows where 'w/Pheno' is FALSE and drop the 'w/Pheno' column @@ -925,11 +925,11 @@ mod_GS_server <- function(input, output, session, parent_session) { } else { pred_outputs2$trait_output <- results_TRAITs } - + # End the event continue_prediction2(NULL) }) - + # Output the prediction tables all_GEBVs <- reactive({ validate( @@ -937,7 +937,7 @@ mod_GS_server <- function(input, output, session, parent_session) { ) pred_outputs2$all_GEBVs }) - + # GEBVs from all iterations/folds output$pred_gebvs_table2 <- renderDT( { @@ -945,14 +945,14 @@ mod_GS_server <- function(input, output, session, parent_session) { }, options = list(scrollX = TRUE, autoWidth = FALSE, pageLength = 5) ) - + trait_output <- reactive({ validate( need(!is.null(pred_outputs2$trait_output), "Upload the input files, set the parameters and click 'run analysis' to access results in this session.") ) pred_outputs2$trait_output }) - + # GEBVs from all iterations/folds output$pred_trait_table <- renderDT( { @@ -960,7 +960,7 @@ mod_GS_server <- function(input, output, session, parent_session) { }, options = list(scrollX = TRUE, autoWidth = FALSE, pageLength = 5) ) - + output$download_vcft <- downloadHandler( filename = function() { paste0("BIGapp_Training_VCF_Example_file.vcf.gz") @@ -970,7 +970,7 @@ mod_GS_server <- function(input, output, session, parent_session) { file.copy(ex, file) } ) - + output$download_vcfp <- downloadHandler( filename = function() { paste0("BIGapp_Predict_VCF_Example_file.vcf") @@ -980,7 +980,7 @@ mod_GS_server <- function(input, output, session, parent_session) { file.copy(ex, file) } ) - + output$download_pheno <- downloadHandler( filename = function() { paste0("BIGapp_passport_Example_file.csv") @@ -990,7 +990,7 @@ mod_GS_server <- function(input, output, session, parent_session) { file.copy(ex, file) } ) - + # Download files for GP output$download_pred_results_file <- downloadHandler( filename = function() { @@ -1000,26 +1000,26 @@ mod_GS_server <- function(input, output, session, parent_session) { # Temporary files list temp_dir <- tempdir() temp_files <- c() - + # Create a temporary file for data frames ebv_file <- file.path(temp_dir, paste0("GS-EBV-predictions-", Sys.Date(), ".csv")) write.csv(pred_outputs2$all_GEBVs, ebv_file, row.names = FALSE) temp_files <- c(temp_files, ebv_file) - + trait_file <- file.path(temp_dir, paste0("GS-Phenotype-predictions-", Sys.Date(), ".csv")) write.csv(pred_outputs2$trait_output, trait_file, row.names = FALSE) temp_files <- c(temp_files, trait_file) - + # Zip files only if there's something to zip if (length(temp_files) > 0) { zip(file, files = temp_files, extras = "-j") # Using -j to junk paths } - + # Optionally clean up file.remove(temp_files) } ) - + ## Summary Info pred_summary_info <- function() { # Handle possible NULL values for inputs @@ -1027,7 +1027,7 @@ mod_GS_server <- function(input, output, session, parent_session) { est_file_name <- if (!is.null(input$pred_est_file$name)) input$pred_est_file$name else "No file selected" passport_file_name <- if (!is.null(input$pred_trait_file$name)) input$pred_trait_file$name else "No file selected" selected_ploidy <- if (!is.null(input$pred_est_ploidy)) as.character(input$pred_est_ploidy) else "Not selected" - + # Print the summary information cat( "BIGapp Selection Summary\n", @@ -1061,7 +1061,7 @@ mod_GS_server <- function(input, output, session, parent_session) { sep = "" ) } - + # Popup for analysis summary observeEvent(input$pred_summary, { showModal(modalDialog( @@ -1077,8 +1077,8 @@ mod_GS_server <- function(input, output, session, parent_session) { ) )) }) - - + + # Download Summary Info output$download_pred_info <- downloadHandler( filename = function() { diff --git a/R/mod_GSAcc.R b/R/mod_GSAcc.R index df9ab30..da246c2 100644 --- a/R/mod_GSAcc.R +++ b/R/mod_GSAcc.R @@ -257,9 +257,9 @@ mod_GSAcc_server <- function(input, output, session, parent_session){ removeModal() # Close the modal after saving }) - + ## Trait file modal window - + #Default choices trait_options <- reactiveValues( missing_data = "NA", @@ -267,25 +267,25 @@ mod_GSAcc_server <- function(input, output, session, parent_session){ sample_column = NULL, file_type = NULL ) - + #UI popup window for input observeEvent(input$trait_file, { req(input$trait_file) #Get the column names of the csv file info_df <- read.csv(input$trait_file$datapath, header = TRUE, check.names = FALSE, nrows=2) info_df[,1] <- as.character(info_df[,1]) #Makes sure that the sample names are characters instead of numeric - + # Read first 5 rows for preview preview_data <- tryCatch({ head(read.csv(input$trait_file$datapath, nrows = 5, na.strings=trait_options$missing_data),5) }, error = function(e) { NULL }) - + showModal(modalDialog( title = "Trait File Options", size= "l", - + selectInput( inputId = ns('missing_data'), label = 'Missing Data Value', @@ -312,7 +312,7 @@ mod_GSAcc_server <- function(input, output, session, parent_session){ label = 'Sample ID Column', choices = colnames(info_df) ), - + if (!is.null(preview_data)) { div( h4( @@ -332,20 +332,20 @@ mod_GSAcc_server <- function(input, output, session, parent_session){ p("Could not load file preview.") ) }, - + footer = tagList( actionButton(ns("save_trait_options"), "Save") ) )) - + # Render the preview table output$file_preview <- renderTable({ req(preview_data) preview_data }) - + }) - + output$custom_missing_msg <- renderText({ if (input$missing_data == "Custom" && nchar(input$custom_missing) == 0) { "Please enter a custom missing value." @@ -353,8 +353,8 @@ mod_GSAcc_server <- function(input, output, session, parent_session){ "" } }) - - + + #Close popup window when user "saves options" observeEvent(input$save_trait_options, { trait_options$missing_data <- input$missing_data @@ -362,7 +362,7 @@ mod_GSAcc_server <- function(input, output, session, parent_session){ trait_options$sample_column <- input$sample_column #trait_options$file_type # Save other inputs as needed - + if (input$missing_data == "Custom" && nchar(input$custom_missing) == 0) { # Validation failed: display warning and prevent modal closure showNotification( @@ -372,7 +372,7 @@ mod_GSAcc_server <- function(input, output, session, parent_session){ ) return() # Stop further execution and keep the modal open } - + removeModal() # Close the modal after saving }) @@ -428,35 +428,35 @@ mod_GSAcc_server <- function(input, output, session, parent_session){ pred_inputs <- eventReactive(input$prediction_start,{ toggleClass(id = "pred_ploidy", class = "borderred", condition = (is.na(input$pred_ploidy) | is.null(input$pred_ploidy))) - + if (advanced_options$pred_matrix != "Amatrix"){ #### VCF sanity check checks <- vcf_sanity_check(input$pred_file$datapath) - + error_if_false <- c( "VCF_header", "VCF_columns", "unique_FORMAT", "GT", "samples", "VCF_compressed" ) - + error_if_true <- c( - "multiallelics", "phased_GT", "mixed_ploidies", + "multiallelics", "mixed_ploidies", "duplicated_samples", "duplicated_markers" ) - + warning_if_false <- c("chrom_info", "pos_info", "ref_alt","max_markers") - - checks_result <- vcf_sanity_messages(checks, - error_if_false, - error_if_true, - warning_if_false = warning_if_false, + + checks_result <- vcf_sanity_messages(checks, + error_if_false, + error_if_true, + warning_if_false = warning_if_false, warning_if_true = NULL, input_ploidy = as.numeric(input$pred_ploidy)) - + if(checks_result) return() # Stop the analysis if checks fail } ######### - - + + if(is.null(advanced_options$pred_matrix)) advanced_options$pred_matrix <- "none_selected" if (((is.null(input$pred_file$datapath) & advanced_options$pred_matrix != "Amatrix") | (is.null(advanced_options$ped_file$datapath) & advanced_options$pred_matrix == "Amatrix")) | @@ -489,11 +489,11 @@ mod_GSAcc_server <- function(input, output, session, parent_session){ } else { pheno <- read.csv(input$trait_file$datapath, header = TRUE, check.names = FALSE, na.strings = trait_options$missing_data) } - + # Make the sample ID column the first column in the dataframe sample_col_name <- input$sample_column pheno <- pheno[, c(sample_col_name, setdiff(names(pheno), sample_col_name))] - + # Add row names and catch errors tryCatch({ row.names(pheno) <- pheno[, 1] @@ -512,7 +512,7 @@ mod_GSAcc_server <- function(input, output, session, parent_session){ ) return(NULL) # Return NULL to prevent further processing }) - + # Assigning the IDs based on user input for column 1 ids_pheno <- pheno[, 1] @@ -810,36 +810,36 @@ mod_GSAcc_server <- function(input, output, session, parent_session){ #pred_outputs }) - + #Output the prediction tables - + all_GEBVs <- reactive({ validate( need(!is.null(pred_outputs$all_GEBVs), "Upload the input files, set the parameters and click 'run analysis' to access results in this session.") ) pred_outputs$comb_output }) - + output$pred_all_table <- renderDT({all_GEBVs()}, options = list(scrollX = TRUE,autoWidth = FALSE, pageLength = 5)) - + comb_output <- reactive({ validate( need(!is.null(pred_outputs$comb_output), "Upload the input files, set the parameters and click 'run analysis' to access results in this session.") ) - + #Adding the mean values to df prepare_df <- round(pred_outputs$comb_output, 4) trait_means <- round(colMeans(prepare_df), 4) new_row <- c("Mean", trait_means[-1]) new_df <- rbind(prepare_df, new_row) - + #exporting new_df - + }) - + output$pred_acc_table <- renderDT({comb_output()}, options = list(scrollX = TRUE,autoWidth = FALSE, pageLength = 5)) - + ##Plots plots <- reactive({ @@ -859,13 +859,13 @@ mod_GSAcc_server <- function(input, output, session, parent_session){ names_to = "Trait", values_to = "Correlation" ) - + # Determine dynamic y-axis lower bound based on the entire dataset min_val <- min(df_long$Correlation, na.rm = TRUE) y_axis_lower_bound <- if (min_val < 0) { # If there are negative values, start the axis slightly below the minimum # You can adjust the floor() logic for more/less padding, or just use min_val - floor(min_val * 10) / 10 + floor(min_val * 10) / 10 } else { 0 } diff --git a/R/mod_PCA.R b/R/mod_PCA.R index 3fc1c9d..87e50e9 100644 --- a/R/mod_PCA.R +++ b/R/mod_PCA.R @@ -168,7 +168,7 @@ mod_PCA_server <- function(input, output, session, parent_session){ # expand specific box updateBox(id = "PCA_box", action = "toggle", session = parent_session) }) - + #Default choices trait_options <- reactiveValues( missing_data = "NA", @@ -176,7 +176,7 @@ mod_PCA_server <- function(input, output, session, parent_session){ sample_column = NULL, file_type = NULL ) - + # Update dropdown menu choices based on uploaded passport file passport_table <- reactive({ validate( @@ -184,26 +184,26 @@ mod_PCA_server <- function(input, output, session, parent_session){ ) info_df <- read.csv(input$passport_file$datapath, header = TRUE, check.names = FALSE, na.strings=trait_options$missing_data) info_df[,1] <- as.character(info_df[,1]) #Makes sure that the sample names are characters instead of numeric - + updateSelectInput(session, "group_info", choices = colnames(info_df)) info_df }) - + #PCA specific category selection observeEvent(passport_table(), { #updateMaterialSwitch(session, inputId = "use_cat", status = "success") - + # Get selected column name selected_col <- input$group_info - + # Extract unique values from the selected column unique_values <- unique(passport_table()[[selected_col]]) - + #Add category selection updateVirtualSelect("cat_color", choices = unique_values, selected = unique_values, session = session) - + }) - + # PCA specific category selection. Update when group_info is changed. observeEvent(input$group_info, { req(passport_table()) # Ensure passport_table is available @@ -211,25 +211,25 @@ mod_PCA_server <- function(input, output, session, parent_session){ unique_values <- unique(passport_table()[[selected_col]]) updateVirtualSelect("cat_color", choices = unique_values, selected = unique_values, session = session) }) - + #UI popup window for input observeEvent(input$passport_file, { req(input$passport_file) #Get the column names of the csv file info_df <- read.csv(input$passport_file$datapath, header = TRUE, check.names = FALSE, nrows=2) info_df[,1] <- as.character(info_df[,1]) #Makes sure that the sample names are characters instead of numeric - + # Read first 5 rows for preview preview_data <- tryCatch({ head(read.csv(input$passport_file$datapath, nrows = 5, na.strings=trait_options$missing_data),5) }, error = function(e) { NULL }) - + showModal(modalDialog( title = "Trait File Options", size= "l", - + selectInput( inputId = ns('missing_data'), label = 'Missing Data Value', @@ -256,7 +256,7 @@ mod_PCA_server <- function(input, output, session, parent_session){ label = 'Sample ID Column', choices = colnames(info_df) ), - + if (!is.null(preview_data)) { div( h4( @@ -276,20 +276,20 @@ mod_PCA_server <- function(input, output, session, parent_session){ p("Could not load file preview.") ) }, - + footer = tagList( actionButton(ns("save_trait_options"), "Save") ) )) - + # Render the preview table output$file_preview <- renderTable({ req(preview_data) preview_data }) - + }) - + output$custom_missing_msg <- renderText({ if (input$missing_data == "Custom" && nchar(input$custom_missing) == 0) { "Please enter a custom missing value." @@ -297,8 +297,8 @@ mod_PCA_server <- function(input, output, session, parent_session){ "" } }) - - + + #Close popup window when user "saves options" observeEvent(input$save_trait_options, { trait_options$missing_data <- input$missing_data @@ -306,7 +306,7 @@ mod_PCA_server <- function(input, output, session, parent_session){ trait_options$sample_column <- input$sample_column #trait_options$file_type # Save other inputs as needed - + if (input$missing_data == "Custom" && nchar(input$custom_missing) == 0) { # Validation failed: display warning and prevent modal closure showNotification( @@ -316,7 +316,7 @@ mod_PCA_server <- function(input, output, session, parent_session){ ) return() # Stop further execution and keep the modal open } - + removeModal() # Close the modal after saving }) @@ -366,29 +366,29 @@ mod_PCA_server <- function(input, output, session, parent_session){ #### VCF sanity check checks <- vcf_sanity_check(geno) - + error_if_false <- c( "VCF_header", "VCF_columns", "unique_FORMAT", "GT", "samples", "VCF_compressed" ) - + error_if_true <- c( - "multiallelics", "phased_GT", "mixed_ploidies", + "multiallelics", "mixed_ploidies", "duplicated_samples", "duplicated_markers" ) - + warning_if_false <- c("chrom_info", "pos_info", "ref_alt", "max_markers") - - checks_result <- vcf_sanity_messages(checks, - error_if_false, - error_if_true, - warning_if_false = warning_if_false, + + checks_result <- vcf_sanity_messages(checks, + error_if_false, + error_if_true, + warning_if_false = warning_if_false, warning_if_true = NULL, input_ploidy = as.numeric(ploidy)) - + if(checks_result) return() # Stop the analysis if checks fail ######### - + #Import genotype information if in VCF format vcf <- read.vcfR(geno, verbose = FALSE) @@ -412,7 +412,7 @@ mod_PCA_server <- function(input, output, session, parent_session){ } #Start analysis following a genotype data check - + if (ncol(genomat) < 5){ shinyalert( title = "Small Genotype File", @@ -441,7 +441,7 @@ mod_PCA_server <- function(input, output, session, parent_session){ } else { info_df <- read.csv(input$passport_file$datapath, header = TRUE, check.names = FALSE, na.strings = trait_options$missing_data) } - + # Make the sample ID column the first column in the dataframe sample_col_name <- input$sample_column info_df <- info_df[, c(sample_col_name, setdiff(names(info_df), sample_col_name))] @@ -537,17 +537,17 @@ mod_PCA_server <- function(input, output, session, parent_session){ validate( need(!is.null(pca_data$pc_df_pop), "Input Genotype file, Species ploidy, and run the analysis to access results in this section.") ) - + df_plot <- pca_data$pc_df_pop group_var_name <- input$group_info pc_x_col <- input$pc_X pc_y_col <- input$pc_Y - + # Define default aesthetics for unselected categories label_to_value <- c("Light Grey" = "grey80", "Grey" = "grey60", "Dark Grey" = "grey40", "Black" = "black") default_color <- label_to_value[[input$grey_choice]] default_shape <- 16 # Solid circle (pch value) - + # --- Palette Generation (local to this reactive, named) --- local_my_palette <- NULL # This will be a named vector: category level -> color if (group_var_name != "" && !is.null(group_var_name) && !is.null(input$color_choice)) { @@ -556,18 +556,18 @@ mod_PCA_server <- function(input, output, session, parent_session){ shinyalert(title = "Error", text = paste("Group variable '", group_var_name, "' not found."), type = "error") return(NULL) } - + unique_group_vals_for_plot <- unique(as.character(df_plot[[group_var_name]])) num_levels_for_plot <- length(unique_group_vals_for_plot) - + if (num_levels_for_plot > 0) { max_brewer_colors <- tryCatch( RColorBrewer::brewer.pal.info[input$color_choice, "maxcolors"], error = function(e) 8 # Default max colors if palette info fails ) - + n_base_colors <- num_levels_for_plot # Number of colors needed from brewer.pal directly or via ramp - + # Adjust n for brewer.pal requirements (min 3 for most) if (num_levels_for_plot == 1) { base_palette_brewer <- RColorBrewer::brewer.pal(3, input$color_choice)[1] @@ -576,32 +576,32 @@ mod_PCA_server <- function(input, output, session, parent_session){ } else { base_palette_brewer <- RColorBrewer::brewer.pal(min(n_base_colors, max_brewer_colors), input$color_choice) } - + generated_palette_values <- grDevices::colorRampPalette(base_palette_brewer)(num_levels_for_plot) local_my_palette <- setNames(generated_palette_values, unique_group_vals_for_plot) } } - + # --- Base ggplot object --- plot_obj <- ggplot(df_plot, aes(x = .data[[pc_x_col]], y = .data[[pc_y_col]])) - + # --- Determine if color/shape are mapped to group or static --- map_color_to_group <- group_var_name != "" && !is.null(group_var_name) && !is.null(local_my_palette) map_shape_to_group <- map_color_to_group && input$use_shapes - + # Arguments for geom_point (static values if not mapped) geom_point_args <- list(size = 2.5, alpha = 0.8) - + if (map_color_to_group) { # Ensure group_var_name column is factor for consistent scale behavior df_plot[[group_var_name]] <- as.factor(df_plot[[group_var_name]]) all_levels <- levels(df_plot[[group_var_name]]) - + plot_obj <- plot_obj + aes(color = as.factor(.data[[group_var_name]])) # Map color aesthetic - + color_values_map <- setNames(rep(default_color, length(all_levels)), all_levels) categories_to_colorize <- input$cat_color # User's selection from UI - + if (input$use_cat && length(categories_to_colorize) > 0) { for (cat_level in categories_to_colorize) { if (cat_level %in% names(local_my_palette)) { @@ -618,25 +618,25 @@ mod_PCA_server <- function(input, output, session, parent_session){ } } # If input$use_cat is TRUE but categories_to_colorize is empty, all remain default_color. - + plot_obj <- plot_obj + scale_color_manual( - name = group_var_name, - values = color_values_map, + name = group_var_name, + values = color_values_map, na.value = default_color # Handles explicit NAs in the grouping column ) } else { geom_point_args$color <- default_color # Set static color for all points } - + if (map_shape_to_group) { df_plot[[group_var_name]] <- as.factor(df_plot[[group_var_name]]) # Ensure it's factor all_levels <- levels(df_plot[[group_var_name]]) - + plot_obj <- plot_obj + aes(shape = .data[[group_var_name]]) # Map shape aesthetic - + shape_values_map <- setNames(rep(default_shape, length(all_levels)), all_levels) categories_to_shape <- input$cat_color # User's selection from UI for shaping - + # Check for shinyalert for too many shapes (based on categories selected for shaping) if (length(categories_to_shape) > 25) { # The shinyalert is defined in your original code, ensure its condition matches this logic @@ -650,23 +650,23 @@ mod_PCA_server <- function(input, output, session, parent_session){ type = "error", showConfirmButton = TRUE, confirmButtonText = "OK", - confirmButtonCol = "#004192", + confirmButtonCol = "#004192", showCancelButton = FALSE, animation = TRUE ) updateMaterialSwitch(session = session, inputId = "use_shapes", value = FALSE) # Use 'session' not 'parent_session' if in module - + # Cap the number of categories getting distinct shapes categories_to_shape_for_map <- categories_to_shape[1:25] } else { categories_to_shape_for_map <- categories_to_shape } - + available_custom_shapes <- c(0:24) # PCH values (0-14 are symbols, 15-20 are filled symbols, 21-24 are bordered) # Standard practice often uses 1:25, let's stick to that. available_custom_shapes <- c(1:25) - - + + shape_idx <- 1 for (cat_level in categories_to_shape_for_map) { if (cat_level %in% all_levels && shape_idx <= length(available_custom_shapes)) { @@ -676,24 +676,24 @@ mod_PCA_server <- function(input, output, session, parent_session){ } plot_obj <- plot_obj + scale_shape_manual( name = group_var_name, # Same name as color scale for potential legend merging - values = shape_values_map, + values = shape_values_map, na.value = default_shape # Handles explicit NAs ) } else { geom_point_args$shape <- default_shape # Set static shape for all points } - + # --- Add geom_point layer --- # geom_point_args list already has size, alpha, and conditionally color/shape if static plot_obj <- plot_obj + do.call(geom_point, geom_point_args) - + # --- Labels, Guides, and Theme --- plot_obj <- plot_obj + labs( x = paste0(pc_x_col, " (", pca_data$variance_explained[as.numeric(substr(pc_x_col, 3, 3))], "%)"), y = paste0(pc_y_col, " (", pca_data$variance_explained[as.numeric(substr(pc_y_col, 3, 3))], "%)") # Legend titles are taken from scale_manual 'name' argument ) - + # Configure guides (legends) guide_options <- list() if (map_color_to_group) { @@ -707,7 +707,7 @@ mod_PCA_server <- function(input, output, session, parent_session){ guide_options$shape <- "none" } plot_obj <- plot_obj + guides(!!!guide_options) - + plot_obj <- plot_obj + theme_minimal() + theme( panel.border = element_rect(color = "black", fill = NA), legend.text = element_text(size = 14), @@ -716,7 +716,7 @@ mod_PCA_server <- function(input, output, session, parent_session){ legend.title = element_text(size = 16), legend.position = "right" # Example position, adjust as needed ) - + return(plot_obj) }) @@ -916,7 +916,7 @@ mod_PCA_server <- function(input, output, session, parent_session){ ex <- system.file("iris_passport_file.csv", package = "BIGapp") file.copy(ex, file) }) - + output$download_pcs <- downloadHandler( filename = function() { paste0("PCs.csv") diff --git a/R/mod_dapc.R b/R/mod_dapc.R index 921bc39..ea3ae4f 100644 --- a/R/mod_dapc.R +++ b/R/mod_dapc.R @@ -205,29 +205,29 @@ mod_dapc_server <- function(input, output, session, parent_session){ #Import genotype information if in VCF format #### VCF sanity check checks <- vcf_sanity_check(geno) - + error_if_false <- c( "VCF_header", "VCF_columns", "unique_FORMAT", "GT", - "samples" + "samples", "VCF_compressed" ) - + error_if_true <- c( - "multiallelics", "phased_GT", "mixed_ploidies", + "multiallelics", "mixed_ploidies", "duplicated_samples", "duplicated_markers" ) - + warning_if_false <- c("chrom_info", "pos_info", "ref_alt") - - checks_result <- vcf_sanity_messages(checks, - error_if_false, - error_if_true, - warning_if_false = warning_if_false, + + checks_result <- vcf_sanity_messages(checks, + error_if_false, + error_if_true, + warning_if_false = warning_if_false, warning_if_true = NULL, input_ploidy = as.numeric(ploidy)) - + if(checks_result) return() # Stop the analysis if checks fail ######### - + vcf <- read.vcfR(geno) #Get items in FORMAT column @@ -297,29 +297,29 @@ mod_dapc_server <- function(input, output, session, parent_session){ #Import genotype information if in VCF format #### VCF sanity check checks <- vcf_sanity_check(geno) - + error_if_false <- c( "VCF_header", "VCF_columns", "unique_FORMAT", "GT", "samples", "VCF_compressed" ) - + error_if_true <- c( "multiallelics", "phased_GT", "mixed_ploidies", "duplicated_samples", "duplicated_markers" ) - + warning_if_false <- c("chrom_info", "pos_info", "ref_alt","max_markers") - - checks_result <- vcf_sanity_messages(checks, - error_if_false, - error_if_true, - warning_if_false = warning_if_false, + + checks_result <- vcf_sanity_messages(checks, + error_if_false, + error_if_true, + warning_if_false = warning_if_false, warning_if_true = NULL, input_ploidy = as.numeric(ploidy)) - + if(checks_result) return() # Stop the analysis if checks fail ######### - + vcf <- read.vcfR(geno) #Get items in FORMAT column @@ -405,9 +405,9 @@ mod_dapc_server <- function(input, output, session, parent_session){ posi.da = "topright", posi.pca="bottomright", mstree = F, # lines connecting clusters - lwd = 1, + lwd = 1, lty = 2, - legeng = F, + legeng = F, clabel = 1) # legend and label of legend clusters. clab 0 or 1 }) diff --git a/R/mod_diversity.R b/R/mod_diversity.R index a10c089..233eef3 100644 --- a/R/mod_diversity.R +++ b/R/mod_diversity.R @@ -143,14 +143,14 @@ mod_diversity_server <- function(input, output, session, parent_session){ # expand specific box updateBox(id = "Genomic_Diversity_box", action = "toggle", session = parent_session) }) - + ##UI text output$dosage_text <- renderUI({ # Check if input$plot_tabs is NULL before evaluating it if (is.null(input$diversity_plot_tabs)) { return(NULL) } - + # Render the text only for the "Dosage Plot" tab if (input$diversity_plot_tabs == "Dosage Plot" && !is.null(diversity_items$dosage_df)) { div( @@ -226,29 +226,29 @@ mod_diversity_server <- function(input, output, session, parent_session){ #Import genotype information if in VCF format #### VCF sanity check checks <- vcf_sanity_check(geno) - + error_if_false <- c( "VCF_header", "VCF_columns", "unique_FORMAT", "GT", "samples", "chrom_info", "pos_info", "VCF_compressed" ) - + error_if_true <- c( - "multiallelics", "phased_GT", "mixed_ploidies", + "multiallelics", "mixed_ploidies", "duplicated_samples", "duplicated_markers" ) - + warning_if_false <- c("ref_alt","max_markers") - - checks_result <- vcf_sanity_messages(checks, - error_if_false, - error_if_true, - warning_if_false = NULL, + + checks_result <- vcf_sanity_messages(checks, + error_if_false, + error_if_true, + warning_if_false = NULL, warning_if_true = NULL, input_ploidy = ploidy) - + if(checks_result) return() # Stop the analysis if checks fail ######### - + vcf <- read.vcfR(geno, verbose = FALSE) #Save position information diff --git a/R/mod_gwas.R b/R/mod_gwas.R index d308a9c..b72b853 100644 --- a/R/mod_gwas.R +++ b/R/mod_gwas.R @@ -190,7 +190,7 @@ mod_gwas_server <- function(input, output, session, parent_session){ # expand specific box updateBox(id = "GWAS_box", action = "toggle", session = parent_session) }) - + #Default choices trait_options <- reactiveValues( missing_data = "NA", @@ -198,25 +198,25 @@ mod_gwas_server <- function(input, output, session, parent_session){ sample_column = NULL, file_type = NULL ) - + #UI popup window for input observeEvent(input$phenotype_file, { req(input$phenotype_file) #Get the column names of the csv file info_df <- read.csv(input$phenotype_file$datapath, header = TRUE, check.names = FALSE, nrows=2) info_df[,1] <- as.character(info_df[,1]) #Makes sure that the sample names are characters instead of numeric - + # Read first 5 rows for preview preview_data <- tryCatch({ head(read.csv(input$phenotype_file$datapath, nrows = 5, na.strings=trait_options$missing_data),5) }, error = function(e) { NULL }) - + showModal(modalDialog( title = "Trait File Options", size= "l", - + selectInput( inputId = ns('missing_data'), label = 'Missing Data Value', @@ -243,7 +243,7 @@ mod_gwas_server <- function(input, output, session, parent_session){ label = 'Sample ID Column', choices = colnames(info_df) ), - + if (!is.null(preview_data)) { div( h4( @@ -263,20 +263,20 @@ mod_gwas_server <- function(input, output, session, parent_session){ p("Could not load file preview.") ) }, - + footer = tagList( actionButton(ns("save_trait_options"), "Save") ) )) - + # Render the preview table output$file_preview <- renderTable({ req(preview_data) preview_data }) - + }) - + output$custom_missing_msg <- renderText({ if (input$missing_data == "Custom" && nchar(input$custom_missing) == 0) { "Please enter a custom missing value." @@ -285,7 +285,7 @@ mod_gwas_server <- function(input, output, session, parent_session){ } }) - + #Close popup window when user "saves options" observeEvent(input$save_trait_options, { trait_options$missing_data <- input$missing_data @@ -293,7 +293,7 @@ mod_gwas_server <- function(input, output, session, parent_session){ trait_options$sample_column <- input$sample_column #trait_options$file_type # Save other inputs as needed - + if (input$missing_data == "Custom" && nchar(input$custom_missing) == 0) { # Validation failed: display warning and prevent modal closure showNotification( @@ -303,10 +303,10 @@ mod_gwas_server <- function(input, output, session, parent_session){ ) return() # Stop further execution and keep the modal open } - + removeModal() # Close the modal after saving }) - + #Call some plots to NULL so that the spinners do not show before analysis output$bic_plot <- renderDT(NULL) @@ -387,7 +387,7 @@ mod_gwas_server <- function(input, output, session, parent_session){ } else { phenotype_file <- read.csv(input$phenotype_file$datapath, header = TRUE, check.names = FALSE, na.strings = trait_options$missing_data) } - + # Make the sample ID column the first column in the dataframe sample_col_name <- input$sample_column phenotype_file <- phenotype_file[, c(sample_col_name, setdiff(names(phenotype_file), sample_col_name))] @@ -458,29 +458,29 @@ mod_gwas_server <- function(input, output, session, parent_session){ #Convert VCF file if submitted #### VCF sanity check checks <- vcf_sanity_check(input$gwas_file$datapath, max_markers = 10000) - + error_if_false <- c( "VCF_header", "VCF_columns", "unique_FORMAT", "GT", "samples", "chrom_info", "pos_info", "VCF_compressed" ) - + error_if_true <- c( - "multiallelics", "phased_GT", "mixed_ploidies", + "multiallelics", "mixed_ploidies", "duplicated_samples", "duplicated_markers" ) - + warning_if_false <- c("ref_alt","max_markers") - - checks_result <- vcf_sanity_messages(checks, - error_if_false, - error_if_true, - warning_if_false = warning_if_false, + + checks_result <- vcf_sanity_messages(checks, + error_if_false, + error_if_true, + warning_if_false = warning_if_false, warning_if_true = NULL, input_ploidy = ploidy) - + if(checks_result) return() # Stop the analysis if checks fail ######### - + vcf <- read.vcfR(input$gwas_file$datapath, verbose = FALSE) #Extract GT @@ -898,8 +898,8 @@ mod_gwas_server <- function(input, output, session, parent_session){ ) }) - - + + output$download_viewpoly <- downloadHandler( filename = function() { paste0("BIGapp_Viewpoly_GWASpoly.RData") @@ -909,7 +909,7 @@ mod_gwas_server <- function(input, output, session, parent_session){ save(temp, file = file) } ) - + #Download files for GWAS output$download_gwas_file <- downloadHandler( filename = function() { From 2034c1a7f85a1784615e98aa75b7e158ec568f43 Mon Sep 17 00:00:00 2001 From: Alexander Sandercock <39815775+alex-sandercock@users.noreply.github.com> Date: Sun, 17 May 2026 12:04:21 -0400 Subject: [PATCH 5/6] replace report file suppoer --- R/mod_dosage2vcf.R | 132 +++++++++++++++++++++++++++++++-------------- 1 file changed, 93 insertions(+), 39 deletions(-) diff --git a/R/mod_dosage2vcf.R b/R/mod_dosage2vcf.R index 94ead6b..cc79548 100644 --- a/R/mod_dosage2vcf.R +++ b/R/mod_dosage2vcf.R @@ -29,8 +29,14 @@ mod_dosage2vcf_ui <- function(id){ title = "Inputs", width=12, status = "info", solidHeader = TRUE, collapsible = FALSE, collapsed = FALSE, selectInput(ns('file_type'), label = 'Select File Format', - choices = c("DArT MADC file", "Dosage Matrix"), + choices = c("DArT MADC file","DArT Dosage/SNP Report", "Dosage Matrix"), selected = "DArT MADC file"), + conditionalPanel(condition = "input.file_type == 'DArT Dosage Reports'", + ns = ns, + fileInput(ns("report_file"), "Choose DArT Dose/SNP Report File", accept = c(".csv")), + fileInput(ns("counts_file"), "Choose DArT Counts File", accept = c(".csv")), + numericInput(ns("dosage2vcf_ploidy"), "Species Ploidy", min = 1, value = NULL) + ), conditionalPanel(condition = "input.file_type == 'Dosage Matrix'", ns = ns, fileInput(ns("matrix_file"), "Choose Dosage Matrix File", accept = c(".csv")), @@ -47,7 +53,7 @@ mod_dosage2vcf_ui <- function(id){ selected = "target"), selectInput(ns('species'), label = 'Species', - choices = c("alfalfa", "blueberry", "cranberry", "cucumber", "pecan", "potato", "strawberry", "sweetpotato", "other"), + choices = c("alfalfa", "blueberry", "cranberry", "cucumber", "pecan", "potato", "strawberry", "sweetpotato", "other"), selected = "alfalfa"), conditionalPanel(condition = "input.snp_type == 'target_off'", ns = ns, @@ -71,13 +77,13 @@ mod_dosage2vcf_ui <- function(id){ radioButtons(ns("collapse_matches_counts"), label = "Collapse Matches Counts:", choices = list("Yes"= TRUE, "No" = FALSE), - selected = FALSE), + selected = FALSE), conditionalPanel(condition = "input.species == 'other'", ns = ns, radioButtons(ns("ref_alt"), label = "Extract REF and ALT info:", choices = list("Yes"= TRUE, "No" = FALSE), - selected = TRUE), + selected = TRUE), conditionalPanel(condition = "input.ref_alt == 'TRUE'", ns = ns, fileInput(ns("botloci_file"), "Upload bottom strand probes file (.botloci)"), @@ -92,7 +98,7 @@ mod_dosage2vcf_ui <- function(id){ hr(), actionButton(ns("run_analysis"), "Convert File", width = "100%"), br(), br(), uiOutput(ns('mybutton')), - + div(style="display:inline-block; float:right",dropdownButton( HTML("Input files"), p(downloadButton(ns('download_madc_fixed'), ""), "Fixed Allele MADC Example File"), @@ -132,7 +138,7 @@ mod_dosage2vcf_ui <- function(id){ #' #' @noRd mod_dosage2vcf_server <- function(input, output, session, parent_session){ - + ns <- session$ns # Reactive value to accumulate log messages @@ -166,40 +172,40 @@ mod_dosage2vcf_server <- function(input, output, session, parent_session){ # change to help tab updatebs4TabItems(session = parent_session, inputId = "MainMenu", selected = "help") - + # select specific tab updateTabsetPanel(session = parent_session, inputId = "DArT_Report2VCF_tabset", selected = "DArT_Report2VCF_par") # expand specific box updateBox(id = "DArT_Report2VCF_box", action = "toggle", session = parent_session) }) - + observeEvent(input$goRes, { # change to help tab updatebs4TabItems(session = parent_session, inputId = "MainMenu", selected = "help") - + # select specific tab updateTabsetPanel(session = parent_session, inputId = "DArT_Report2VCF_tabset", selected = "DArT_Report2VCF_results") # expand specific box updateBox(id = "DArT_Report2VCF_box", action = "toggle", session = parent_session) }) - + observeEvent(input$goCite, { # change to help tab updatebs4TabItems(session = parent_session, inputId = "MainMenu", selected = "help") - + # select specific tab updateTabsetPanel(session = parent_session, inputId = "DArT_Report2VCF_tabset", selected = "DArT_Report2VCF_cite") # expand specific box updateBox(id = "DArT_Report2VCF_box", action = "toggle", session = parent_session) }) - + disable("download_d2vcf") - + output$download_madc <- downloadHandler( filename = function() { paste0("BIGapp_MADC_Example_file.csv") @@ -208,7 +214,7 @@ mod_dosage2vcf_server <- function(input, output, session, parent_session){ ex <- system.file("iris_DArT_MADC.csv", package = "BIGapp") file.copy(ex, file) }) - + output$download_madc_fixed <- downloadHandler( filename = function() { paste0("BIGapp_MADC_Fixed_Example_file.csv") @@ -218,7 +224,7 @@ mod_dosage2vcf_server <- function(input, output, session, parent_session){ alfalfa_madc <- paste0(github_path, "test_madcs/alfalfa_madc.csv") download.file(alfalfa_madc, destfile = file, mode = "wb") }) - + # Default model choices advanced_options_all <- reactiveValues( rm_multiallelic_SNP = TRUE, @@ -240,7 +246,7 @@ mod_dosage2vcf_server <- function(input, output, session, parent_session){ advanced_options_all$others_max_snps <- input$others_max_snps advanced_options_all$others_rm_with_indels <- as.logical(input$others_rm_with_indels) # Save other inputs as needed - + removeModal() # Close the modal after saving }) @@ -315,10 +321,58 @@ mod_dosage2vcf_server <- function(input, output, session, parent_session){ vcf_out <- eventReactive(input$run_analysis,{ # Ensure the files are uploaded # Missing input with red border and alerts - if(input$file_type == "DArT MADC file"){ + if(input$file_type == "DArT Dosage Reports"){ + if (is.null(input$report_file$datapath) | is.null(input$counts_file$datapath) | input$d2v_output_name == "" | input$dosage2vcf_ploidy == "") { + shinyalert( + title = "Missing input!", + text = "Upload Dose Report and Counts Files", + size = "s", + closeOnEsc = TRUE, + closeOnClickOutside = FALSE, + html = TRUE, + type = "error", + showConfirmButton = TRUE, + confirmButtonText = "OK", + confirmButtonCol = "#004192", + showCancelButton = FALSE, + animation = TRUE + ) + } + req(input$report_file, input$counts_file, input$d2v_output_name, input$dosage2vcf_ploidy) + # Get the uploaded file paths + dosage_file <- input$report_file$datapath + counts_file <- input$counts_file$datapath + ploidy <- input$dosage2vcf_ploidy + + # Use a temporary file path without appending .vcf + temp_base <- tempfile() + + #Status + updateProgressBar(session = session, id = "dosage2vcf_pb", value = 10, title = "Converting DArT files to VCF") + + # Convert to VCF using the BIGr package + cat("Running BIGr::dosage2vcf...\n") + + updateProgressBar(session = session, id = "dosage2vcf_pb", value = 50, title = "Writing VCF") + + dosage2vcf( + dart.report = dosage_file, + dart.counts = counts_file, + output.file = temp_base, + ploidy = as.numeric(ploidy) + ) + + # The output file should be temp_base.vcf + output_name <- paste0(temp_base, ".vcf") + + updateProgressBar(session = session, id = "dosage2vcf_pb", value = 100, title = "Complete!") + + return(output_name) + + } else if(input$file_type == "DArT MADC file"){ req(input$madc_file) # First check if the MADC file is valid (a non-fixedAlleleID MADC file) - + # Select species botloci github_path <- "https://raw.githubusercontent.com/Breeding-Insight/BIGapp-PanelHub/refs/heads/long_seq/" @@ -343,7 +397,7 @@ mod_dosage2vcf_server <- function(input, output, session, parent_session){ "strawberry" = paste0(github_path, "strawberry/strawberry_allele_db_v001.fa"), "sweetpotato" = paste0(github_path, "sweetpotato/sweetpotato_allele_db_v000_refAlt109bp.fa"), "other" = input$hapDB_file$datapath) - + markers_info <- switch(input$species, "alfalfa" = paste0(github_path, "alfalfa/20201030-BI-Alfalfa_SNPs_DArTag-probe-design_snpID_lut.csv"), "blueberry" = paste0(github_path, "blueberry/20200819-BI-Blueberry_10K_SNPs_forDArT_3K_chrID_snpID_lut.csv"), @@ -358,7 +412,7 @@ mod_dosage2vcf_server <- function(input, output, session, parent_session){ # Guard optional inputs (may be NULL if not uploaded) microhapDB <- if (length(microhapDB) == 0) NULL else microhapDB markers_info <- if (length(markers_info) == 0) NULL else markers_info - + #Now perform conversion depending on user options # Shared setup for all MADC snp_type branches @@ -469,9 +523,9 @@ mod_dosage2vcf_server <- function(input, output, session, parent_session){ d2vcf_log(paste(log_lines, collapse = "")) updateProgressBar(session = session, id = "dosage2vcf_pb", value = 100, title = "Complete!") return(output_name) - + } else if (input$file_type == "Dosage Matrix"){ - + if (is.null(input$matrix_file$datapath) | input$d2v_output_name == "" | input$dosage2vcf_ploidy == "") { shinyalert( title = "Missing input!", @@ -491,42 +545,42 @@ mod_dosage2vcf_server <- function(input, output, session, parent_session){ req(input$matrix_file, input$d2v_output_name, input$dosage2vcf_ploidy) #Status updateProgressBar(session = session, id = "dosage2vcf_pb", value = 10, title = "Converting matrix to VCF") - + # Get the uploaded file paths matrix_file <- input$matrix_file$datapath ploidy <- input$dosage2vcf_ploidy - + # Use a temporary file path without appending .vcf temp_base <- tempfile() - + # The output file should be temp_base.vcf output_name <- paste0(temp_base, ".vcf") - + #Status updateProgressBar(session = session, id = "dosage2vcf_pb", value = 50, title = "Writing VCF") - + # Convert to VCF using the BIGr package gmatrix2vcf(Gmat.file = matrix_file, ploidy = ploidy, output.file = output_name, dosageCount = input$dosage_counts) - + #Status updateProgressBar(session = session, id = "dosage2vcf_pb", value = 100, title = "Complete!") - + return(output_name) - + } - + }) - + # Only make available the download button when analysis is finished output$mybutton <- renderUI({ if(isTruthy(vcf_out())) downloadButton(ns("download_d2vcf"), "Download VCF file", class = "butt") }) - - + + ##This is for the DArT files conversion to VCF output$download_d2vcf <- downloadHandler( filename = function() { @@ -537,14 +591,14 @@ mod_dosage2vcf_server <- function(input, output, session, parent_session){ bgzip_compress(vcf_out(), file) } ) - + ##Summary Info d2vcf_summary_info <- function() { #Handle possible NULL values for inputs report_file_name <- if (!is.null(input$report_file$name)) input$report_file$name else "No file selected" counts_file_name <- if (!is.null(input$counts_file$name)) input$counts_file$name else "No file selected" selected_ploidy <- if (!is.null(input$dosage2vcf_ploidy)) as.character(input$dosage2vcf_ploidy) else "Not selected" - + #Print the summary information cat( "BIGapp Dosage2VCF Summary\n", @@ -568,7 +622,7 @@ mod_dosage2vcf_server <- function(input, output, session, parent_session){ sep = "" ) } - + # Popup for analysis summary observeEvent(input$d2vcf_summary, { showModal(modalDialog( @@ -584,8 +638,8 @@ mod_dosage2vcf_server <- function(input, output, session, parent_session){ ) )) }) - - + + # Download Summary Info output$download_d2vcf_info <- downloadHandler( filename = function() { From b655a1c072cafa1a424f13f0a36ae2d89ede719f Mon Sep 17 00:00:00 2001 From: Alexander Sandercock <39815775+alex-sandercock@users.noreply.github.com> Date: Sun, 17 May 2026 12:04:38 -0400 Subject: [PATCH 6/6] change names --- R/mod_dosage2vcf.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/mod_dosage2vcf.R b/R/mod_dosage2vcf.R index cc79548..2194a1a 100644 --- a/R/mod_dosage2vcf.R +++ b/R/mod_dosage2vcf.R @@ -31,7 +31,7 @@ mod_dosage2vcf_ui <- function(id){ label = 'Select File Format', choices = c("DArT MADC file","DArT Dosage/SNP Report", "Dosage Matrix"), selected = "DArT MADC file"), - conditionalPanel(condition = "input.file_type == 'DArT Dosage Reports'", + conditionalPanel(condition = "input.file_type == 'DArT Dosage/SNP Report'", ns = ns, fileInput(ns("report_file"), "Choose DArT Dose/SNP Report File", accept = c(".csv")), fileInput(ns("counts_file"), "Choose DArT Counts File", accept = c(".csv")), @@ -321,7 +321,7 @@ mod_dosage2vcf_server <- function(input, output, session, parent_session){ vcf_out <- eventReactive(input$run_analysis,{ # Ensure the files are uploaded # Missing input with red border and alerts - if(input$file_type == "DArT Dosage Reports"){ + if(input$file_type == "DArT Dosage/SNP Report"){ if (is.null(input$report_file$datapath) | is.null(input$counts_file$datapath) | input$d2v_output_name == "" | input$dosage2vcf_ploidy == "") { shinyalert( title = "Missing input!",