From 3c0bc11da314dd133c14fcf4a0f25fe5aa343ca7 Mon Sep 17 00:00:00 2001 From: Cristianetaniguti Date: Wed, 18 Sep 2024 18:57:52 -0400 Subject: [PATCH 01/38] add LD and fitQTL Breeding-Insight/BIGapp#36 --- R/mod_gwas.R | 184 +++++++++++++++++++++++++++++++------ tests/testthat/test-GWAS.R | 29 ++++++ 2 files changed, 183 insertions(+), 30 deletions(-) diff --git a/R/mod_gwas.R b/R/mod_gwas.R index a5b6282..79a026c 100644 --- a/R/mod_gwas.R +++ b/R/mod_gwas.R @@ -22,6 +22,7 @@ mod_gwas_ui <- function(id){ fileInput(ns("gwas_file"), "Choose VCF File", accept = c(".csv",".vcf",".gz")), fileInput(ns("phenotype_file"), "Choose Passport File", accept = ".csv"), numericInput(ns("gwas_ploidy"), "Species Ploidy", min = 1, value = NULL), + numericInput(ns("bp_window_before"), "Base pair window", min = 0, value = 5e6), selectInput(ns('gwas_threshold'), label='Significance Threshold Method', choices = c("M.eff","Bonferroni","FDR","permute"), selected="M.eff"), selectInput(ns('trait_info'), label = 'Select Trait (eg. Color):', choices = NULL), virtualSelectInput( @@ -39,7 +40,7 @@ mod_gwas_ui <- function(id){ p(downloadButton(ns('download_vcf'),""), "VCF Example File"), p(downloadButton(ns('download_pheno'),""), "Passport Example File"), hr(), p(HTML("Parameters description:"), actionButton(ns("goGWASpar"), icon("arrow-up-right-from-square", verify_fa = FALSE) )), hr(), - p(HTML("Graphics description:"), actionButton(ns("goGWASgraph"), icon("arrow-up-right-from-square", verify_fa = FALSE) )), hr(), + p(HTML("Results description:"), actionButton(ns("goGWASgraph"), icon("arrow-up-right-from-square", verify_fa = FALSE) )), hr(), p(HTML("How to cite:"), actionButton(ns("goGWAScite"), icon("arrow-up-right-from-square", verify_fa = FALSE) )), hr(), p(HTML("GWASpoly tutorial:"), actionButton(ns("goGWASpoly"), icon("arrow-up-right-from-square", verify_fa = FALSE), onclick ="window.open('https://jendelman.github.io/GWASpoly/GWASpoly.html', '_blank')" )), circle = FALSE, @@ -51,14 +52,26 @@ mod_gwas_ui <- function(id){ ), column(width = 6, box( - title = "Plots", status = "info", solidHeader = FALSE, width = 12, height = 600, + title = "Plots", status = "info", solidHeader = FALSE, width = 12, height = 800, bs4Dash::tabsetPanel( + tabPanel("Linkage Desiquilibrium Plot", + withSpinner(plotOutput(ns("LD_plot"), height = "500px")), br(), + conditionalPanel( + condition = "input.gwas_start", ns = ns, + div( + sliderInput(ns("bp_window_after"), label = "Adjust base pair window here and run analysis again", min = 0, + max = 100e6, value = 5e6, step = 100), + ) + ) + ), tabPanel("BIC Plot", withSpinner(plotOutput(ns("bic_plot"), height = "500px"))), tabPanel("Manhattan Plot", withSpinner(plotOutput(ns("manhattan_plot"), height = "500px"))), tabPanel("QQ Plot", withSpinner(plotOutput(ns("qq_plot"), height = "500px"))), tabPanel("BIC Table", withSpinner(DTOutput(ns("bic_table"))),style = "overflow-y: auto; height: 500px"), tabPanel("QTL - significant markers", - withSpinner(DTOutput(ns('gwas_stats'))),style = "overflow-y: auto; height: 500px") + withSpinner(DTOutput(ns('gwas_stats'))),style = "overflow-y: auto; height: 500px"), + tabPanel("fitQTL", + withSpinner(DTOutput(ns('gwas_fitqtl'))),style = "overflow-y: auto; height: 500px") ) ) ), @@ -152,7 +165,10 @@ mod_gwas_server <- function(input, output, session, parent_session){ ##GWAS items gwas_vars <- reactiveValues( gwas_df = NULL, + fit_qtl = NULL, manhattan_plots = NULL, + LD_plot = NULL, + bp_window = NULL, qq_plots = NULL, bic_df = NULL, BIC_ggplot = NULL @@ -271,7 +287,7 @@ mod_gwas_server <- function(input, output, session, parent_session){ temp_geno_file <- tempfile(fileext = ".csv") #Convert VCF file if submitted - vcf <- read.vcfR(input$gwas_file$datapath) + vcf <- read.vcfR(input$gwas_file$datapath, verbose = FALSE) #Extract GT geno_mat <- extract.gt(vcf, element = "GT") @@ -332,6 +348,32 @@ mod_gwas_server <- function(input, output, session, parent_session){ return() } + gwas_vars$LD_plot <- LD.plot(data) + lim.d <- max(gwas_vars$LD_plot$data$d) + + if(input$bp_window_before > lim.d) + shinyalert( + title = "Adjust base pair window", + text = paste0("Base pair window larger than maximum distance (",lim.d,"). Reduce window size."), + size = "s", + closeOnEsc = TRUE, + closeOnClickOutside = FALSE, + html = TRUE, + type = "error", + showConfirmButton = TRUE, + confirmButtonText = "OK", + confirmButtonCol = "#004192", + showCancelButton = FALSE, + animation = TRUE + ) + + validate( + need(input$bp_window_before <= lim.d, paste0("Base pair window larger than maximum distance (",lim.d,"). Reduce window size.")) + ) + + gwas_vars$bp_window <- input$bp_window_before + updateSliderInput(session = session, inputId = "bp_window_after", min = 0, max = lim.d, value = gwas_vars$bp_window, step = round(lim.d/30,4)) + data.loco <- set.K(data,LOCO=F,n.core= as.numeric(cores)) #Delete temp pheno file @@ -399,12 +441,6 @@ mod_gwas_server <- function(input, output, session, parent_session){ #Save BIC plot gwas_vars$BIC_ggplot <- p1 - #Display BIC figure - output$bic_plot <- renderPlot({ - print(p1) - }) - #dev.off() - #Save BIC plot info gwas_vars$bic_df <- plotBICs_kinship @@ -436,22 +472,27 @@ mod_gwas_server <- function(input, output, session, parent_session){ #plot for six models per trait manhattan_plot_list[["all"]] <- manhattan.plot(data2,traits=colnames(data@pheno[i]), models = model)+geom_point(size=3)+theme(text = element_text(size = 25),strip.text = element_text(face = "bold")) - #Output the manhattan plots - output$manhattan_plot <- renderPlot({ - - print(manhattan_plot_list[[input$model_select]]) - - }) - - #get most significant SNPs per QTL file - qtl <- get.QTL(data=data2,traits=colnames(data@pheno[i]),bp.window=5e6) + print("Used") + print(gwas_vars$bp_window) + qtl <- get.QTL(data=data2,traits=colnames(data@pheno[i]),bp.window=gwas_vars$bp_window) qtl_d <- data.frame(qtl) #Save QTL info gwas_vars$gwas_df <- qtl_d - output$gwas_stats <- renderDT({qtl_d}, options = list(scrollX = TRUE,autoWidth = FALSE, pageLength = 5)) + if(length(qtl$Model) >0){ + rm.qtl <- which(qtl$Model %in% c("diplo-general", "diplo-additive")) + if(length(rm.qtl) > 0){ + warning("QTL detected by the models diplo-general and diplo-additive are not supported in the fit.QTL current version") + qtl <- qtl[-rm.qtl,] + } + + fit.ans_temp <- fit.QTL(data=data2, + trait=input$trait_info, + qtl=qtl[,c("Marker","Model")]) + gwas_vars$fit_qtl <- fit.ans_temp + } else gwas_vars$fit_qtl <- NULL #Updating value boxes output$qtls_detected <- renderValueBox({ @@ -472,18 +513,8 @@ mod_gwas_server <- function(input, output, session, parent_session){ #Save qq_plot info gwas_vars$qq_plots <- data_qq - output$qq_plot <- renderPlot({ - CMplot_shiny(data_qq,plot.type="q",col=c(1:8), - ylab.pos=2, - file.name=colnames(data@pheno[i]), - conf.int=FALSE, - box=F,multraits=TRUE,file.output=FALSE) - }) - #plot for each model per trait for (j in 1:length(model)) { - print(j) - data.loco.scan_2 <- GWASpoly(data=data.loco,models=model[j], traits=colnames(data@pheno[i]),params=params,n.core= as.numeric(cores)) @@ -501,6 +532,99 @@ mod_gwas_server <- function(input, output, session, parent_session){ }) + # Tables + output$gwas_stats <- renderDT({ + validate( + need(dim(gwas_vars$gwas_df)[1] > 0, "No QTL detected.") + ) + gwas_vars$gwas_df + }, options = list(scrollX = TRUE,autoWidth = FALSE, pageLength = 5)) + + output$gwas_fitqtl <- renderDT({ + validate( + need(dim(gwas_vars$gwas_df)[1] > 0, "No QTL detected.") + ) + + rm.qtl <- which(gwas_vars$gwas_df$Model %in% c("diplo-general", "diplo-additive")) + if(length(rm.qtl) > 0){ + shinyalert( + title = "Oops", + text = "QTL detected by the models diplo-general and diplo-additive are not supported in the fit.QTL current version", + size = "xs", + closeOnEsc = TRUE, + closeOnClickOutside = FALSE, + html = TRUE, + type = "info", + showConfirmButton = TRUE, + confirmButtonText = "OK", + confirmButtonCol = "#004192", + showCancelButton = FALSE, + imageUrl = "", + animation = TRUE, + ) + } + + gwas_vars$fit_qtl + }, options = list(scrollX = TRUE,autoWidth = FALSE, pageLength = 5)) + + + + + # Plots + #Output the manhattan plots + output$manhattan_plot <- renderPlot({ + validate( + need(!is.null(gwas_vars$manhattan_plots), "Upload the input files, set the parameters and click 'run analysis' to access results in this session.") + ) + print(gwas_vars$manhattan_plots[[input$model_select]]) + + }) + + output$qq_plot <- renderPlot({ + validate( + need(!is.null(gwas_vars$qq_plots), "Upload the input files, set the parameters and click 'run analysis' to access results in this session.") + ) + CMplot_shiny(gwas_vars$qq_plots,plot.type="q",col=c(1:8), + ylab.pos=2, + file.name=input$trait_info, + conf.int=FALSE, + box=F, + multraits=TRUE, + file.output=FALSE) + }) + + #Display BIC figure + output$bic_plot <- renderPlot({ + validate( + need(!is.null(gwas_vars$BIC_ggplot), "Upload the input files, set the parameters and click 'run analysis' to access results in this session.") + ) + + print(gwas_vars$BIC_ggplot) + }) + + output$LD_plot <- renderPlot({ + + validate( + need(!is.null(gwas_vars$LD_plot), "Upload the input files, set the parameters and click 'run analysis' to access results in this session.") + ) + + lim.d <- max(gwas_vars$LD_plot$data$d) + + validate( + need(gwas_vars$bp_window <= lim.d, paste0("Base pair window larger than maximum distance (",lim.d,"). Reduce window size.")) + ) + if(is.null(input$bp_window_after)) { + line <- gwas_vars$bp_window + } else line <- input$bp_window_after + + p <- gwas_vars$LD_plot + geom_vline(aes(xintercept=line, color = "bp window"),linetype="dashed") + + theme(legend.title=element_blank(), legend.position="top", text = element_text(size = 15)) + + updateNumericInput(session = session, inputId = "bp_window_before",value = line) + + print(p) + }) + #Download files for GWAS output$download_gwas_file <- downloadHandler( filename = function() { diff --git a/tests/testthat/test-GWAS.R b/tests/testthat/test-GWAS.R index a2d9420..d56dd36 100644 --- a/tests/testthat/test-GWAS.R +++ b/tests/testthat/test-GWAS.R @@ -82,6 +82,22 @@ test_that("test GWAS",{ stop("Wrong file format") } + LD_plot <- LD.plot(data) + + lim.d <- max(LD_plot$data$d) + + input$bp_window <- 5e6 + + if(input$bp_window > lim.d) { + safeError("Base pair window larger than maximum distance. Reduce window size.") + p <- LD_plot + } else { + p <- LD_plot + geom_vline(aes(xintercept=input$bp_window, color = "bp window"),linetype="dashed") + + theme(legend.title=element_blank(), legend.position="top") + } + + print(p) + data.loco <- set.K(data,LOCO=F,n.core= as.numeric(cores)) #Delete temp pheno file @@ -170,6 +186,18 @@ test_that("test GWAS",{ qtl <- get.QTL(data=data2,traits=colnames(data@pheno[i]),bp.window=5e6) qtl_d <- data.frame(qtl) + if(length(qtl$Model) >0){ + rm.qtl <- which(qtl$Model %in% c("diplo-general", "diplo-additive")) + if(length(rm.qtl) > 0){ + warning("QTL detected by the models diplo-general and diplo-additive are not supported in the fit.QTL current version") + qtl <- qtl[-rm.qtl,] + } + + fit.ans_temp <- fit.QTL(data=data2, + trait=input$trait_info, + qtl=qtl[,c("Marker","Model")]) + } + #get qqplot data_qq <- cbind.data.frame(SNP=data.loco.scan@map$Marker,Chr=data.loco.scan@map$Chrom, Pos=data.loco.scan@map$Position,10^(-data.loco.scan@scores[[colnames(data@pheno[i])]])) @@ -195,3 +223,4 @@ test_that("test GWAS",{ } }) + From 4d542c619149df485980f036424a22a8d03ed7b6 Mon Sep 17 00:00:00 2001 From: Cristianetaniguti Date: Wed, 18 Sep 2024 19:02:15 -0400 Subject: [PATCH 02/38] adjust tab name --- R/mod_gwas.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/mod_gwas.R b/R/mod_gwas.R index 79a026c..b9f2512 100644 --- a/R/mod_gwas.R +++ b/R/mod_gwas.R @@ -70,7 +70,7 @@ mod_gwas_ui <- function(id){ tabPanel("BIC Table", withSpinner(DTOutput(ns("bic_table"))),style = "overflow-y: auto; height: 500px"), tabPanel("QTL - significant markers", withSpinner(DTOutput(ns('gwas_stats'))),style = "overflow-y: auto; height: 500px"), - tabPanel("fitQTL", + tabPanel("Multiple QTL model results table", withSpinner(DTOutput(ns('gwas_fitqtl'))),style = "overflow-y: auto; height: 500px") ) ) From 1db6323c35bcce5d8ff805cdd8165b73645d97f1 Mon Sep 17 00:00:00 2001 From: Cristianetaniguti Date: Thu, 19 Sep 2024 10:48:35 -0400 Subject: [PATCH 03/38] check ploidy PCA --- R/mod_PCA.R | 37 ++++++++++++++++++++++++++++--------- tests/testthat/test-PCA.R | 5 +++++ 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/R/mod_PCA.R b/R/mod_PCA.R index 9c871ba..6c036d3 100644 --- a/R/mod_PCA.R +++ b/R/mod_PCA.R @@ -198,7 +198,7 @@ mod_PCA_server <- function(input, output, session, parent_session){ } else{ #Import genotype information if in VCF format - vcf <- read.vcfR(geno) + vcf <- read.vcfR(geno, verbose = FALSE) #Get items in FORMAT column info <- vcf@gt[1,"FORMAT"] #Getting the first row FORMAT @@ -252,6 +252,25 @@ mod_PCA_server <- function(input, output, session, parent_session){ # Print the modified dataframe row.names(info_df) <- info_df[,1] + # Check ploidy + if(input$pca_ploidy != max(genomat, na.rm = T)){ + shinyalert( + title = "Wrong ploidy", + text = "The input ploidy does not match the maximum dosage found in the genotype file", + size = "s", + closeOnEsc = TRUE, + closeOnClickOutside = FALSE, + html = TRUE, + type = "error", + showConfirmButton = TRUE, + confirmButtonText = "OK", + confirmButtonCol = "#004192", + showCancelButton = FALSE, + animation = TRUE + ) + req(input$pca_ploidy == max(genomat, na.rm = T)) + } + #Plotting #First build a relationship matrix using the genotype values G.mat.updog <- Gmatrix(t(genomat), method = "VanRaden", ploidy = as.numeric(ploidy), missingValue = "NA") @@ -312,14 +331,14 @@ mod_PCA_server <- function(input, output, session, parent_session){ #End of PCA section }) - + ##2D PCA plotting pca_2d <- reactive({ validate( need(!is.null(pca_data$pc_df_pop), "Input Genotype file, Species ploidy, and run the analysis to access results in this section.") ) - + # Generate colors if (!is.null(pca_data$my_palette)) { @@ -448,14 +467,14 @@ mod_PCA_server <- function(input, output, session, parent_session){ output$scree_plot <- renderPlot({ pca_scree() }) - + ##Summary Info pca_summary_info <- function() { # Handle possible NULL values for inputs dosage_file_name <- if (!is.null(input$dosage_file$name)) input$dosage_file$name else "No file selected" passport_file_name <- if (!is.null(input$passport_file$name)) input$passport_file$name else "No file selected" selected_ploidy <- if (!is.null(input$pca_ploidy)) as.character(input$pca_ploidy) else "Not selected" - + # Print the summary information cat( "BIGapp PCA Summary\n", @@ -483,7 +502,7 @@ mod_PCA_server <- function(input, output, session, parent_session){ sep = "" ) } - + # Popup for analysis summary observeEvent(input$pca_summary, { showModal(modalDialog( @@ -499,8 +518,8 @@ mod_PCA_server <- function(input, output, session, parent_session){ ) )) }) - - + + # Download Summary Info output$download_pca_info <- downloadHandler( filename = function() { @@ -511,7 +530,7 @@ mod_PCA_server <- function(input, output, session, parent_session){ writeLines(paste(capture.output(pca_summary_info()), collapse = "\n"), file) } ) - + #Download figures for PCA output$download_pca <- downloadHandler( diff --git a/tests/testthat/test-PCA.R b/tests/testthat/test-PCA.R index 1d2aeff..1deda9a 100644 --- a/tests/testthat/test-PCA.R +++ b/tests/testthat/test-PCA.R @@ -67,6 +67,11 @@ test_that("test PCA",{ # Print the modified dataframe row.names(info_df) <- info_df[,1] + # Check ploidy + if(input$pca_ploidy != max(genomat)){ + stop("Wrong ploidy") + } + #Plotting #First build a relationship matrix using the genotype values G.mat.updog <- AGHmatrix::Gmatrix(t(genomat), method = "VanRaden", ploidy = as.numeric(ploidy), missingValue = "NA") From 9d56f8a13f29ddd83613f45d122b5fb981982762 Mon Sep 17 00:00:00 2001 From: Cristianetaniguti Date: Thu, 19 Sep 2024 10:49:16 -0400 Subject: [PATCH 04/38] colors always categorical PCA 3D --- R/mod_PCA.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/mod_PCA.R b/R/mod_PCA.R index 6c036d3..f8be122 100644 --- a/R/mod_PCA.R +++ b/R/mod_PCA.R @@ -415,7 +415,7 @@ mod_PCA_server <- function(input, output, session, parent_session){ tit = paste0('Total Explained Variance =', sum(pca_data$variance_explained[1:3])) - fig <- plot_ly(pca_data$pc_df_pop, x = ~PC1, y = ~PC2, z = ~PC3, color = pca_data$pc_df_pop[[input$group_info]], + fig <- plot_ly(pca_data$pc_df_pop, x = ~PC1, y = ~PC2, z = ~PC3, color = as.factor(pca_data$pc_df_pop[[input$group_info]]), colors = my_palette) %>% add_markers(size = 12, text = paste0("Sample:",pca_data$pc_df_pop$Row.names)) From 8be91b999e73ca019858935e34d3e253429f1bb0 Mon Sep 17 00:00:00 2001 From: Cristianetaniguti Date: Thu, 19 Sep 2024 11:51:00 -0400 Subject: [PATCH 05/38] fix #62 --- R/mod_diversity.R | 58 +++++++++++++++-------------------------------- 1 file changed, 18 insertions(+), 40 deletions(-) diff --git a/R/mod_diversity.R b/R/mod_diversity.R index 8829de5..cf89737 100644 --- a/R/mod_diversity.R +++ b/R/mod_diversity.R @@ -144,7 +144,7 @@ mod_diversity_server <- function(input, output, session, parent_session){ updateProgressBar(session = session, id = "pb_diversity", value = 20, title = "Importing VCF") #Import genotype information if in VCF format - vcf <- read.vcfR(geno) + vcf <- read.vcfR(geno, verbose = FALSE) #Save position information diversity_items$pos_df <- data.frame(vcf@fix[, 1:2]) @@ -163,7 +163,6 @@ mod_diversity_server <- function(input, output, session, parent_session){ geno_mat <- extract.gt(vcf, element = "GT") geno_mat <- apply(geno_mat, 2, convert_to_dosage) rm(vcf) #Remove VCF - print(class(geno_mat)) #Convert genotypes to alternate counts if they are the reference allele counts @@ -248,8 +247,7 @@ mod_diversity_server <- function(input, output, session, parent_session){ box_plot() }) - #Het plot - het_plot <- reactive({ + output$het_plot <- renderPlot({ validate( need(!is.null(diversity_items$het_df) & !is.null(input$hist_bins), "Input VCF, define parameters and click `run analysis` to access results in this session.") ) @@ -257,37 +255,9 @@ mod_diversity_server <- function(input, output, session, parent_session){ xlab = "Observed Heterozygosity", ylab = "Number of Samples", main = "Sample Observed Heterozygosity") - axis(1, at = seq(0, 1, by = 0.1), labels = TRUE) }) - output$het_plot <- renderPlot({ - het_plot() - }) - - #AF Plot - #af_plot <- reactive({ - # validate( - # need(!is.null(diversity_items$maf_df) & !is.null(input$hist_bins), "Input VCF, define parameters and click `run analysis` to access results in this session.") - # ) - # hist(diversity_items$maf_df$AF, breaks = as.numeric(input$hist_bins), col = "grey", border = "black", xlab = "Alternate Allele Frequency", - # ylab = "Frequency", main = "Alternate Allele Frequency Distribution") - #}) - - #output$af_plot <- renderPlot({ - # af_plot() - #}) - - #MAF plot - maf_plot <- reactive({ - validate( - need(!is.null(diversity_items$maf_df) & !is.null(input$hist_bins), "Input VCF, define parameters and click `run analysis` to access results in this session.") - ) - - hist(diversity_items$maf_df$MAF, breaks = as.numeric(input$hist_bins), col = "grey", border = "black", xlab = "Minor Allele Frequency (MAF)", - ylab = "Frequency", main = "Minor Allele Frequency Distribution") - }) - #Marker plot marker_plot <- reactive({ validate( @@ -297,8 +267,8 @@ mod_diversity_server <- function(input, output, session, parent_session){ diversity_items$pos_df$POS <- as.numeric(diversity_items$pos_df$POS) # Sort the dataframe and pad with a 0 if only a single digit is provided diversity_items$pos_df$CHROM <- ifelse( - nchar(diversity_items$pos_df$CHROM) == 1, - paste0("0", diversity_items$pos_df$CHROM), + nchar(diversity_items$pos_df$CHROM) == 1, + paste0("0", diversity_items$pos_df$CHROM), diversity_items$pos_df$CHROM ) diversity_items$pos_df <- diversity_items$pos_df[order(diversity_items$pos_df$CHROM), ] @@ -346,7 +316,12 @@ mod_diversity_server <- function(input, output, session, parent_session){ }) output$maf_plot <- renderPlot({ - maf_plot() + validate( + need(!is.null(diversity_items$maf_df) & !is.null(input$hist_bins), "Input VCF, define parameters and click `run analysis` to access results in this session.") + ) + + hist(diversity_items$maf_df$MAF, breaks = as.numeric(input$hist_bins), col = "grey", border = "black", xlab = "Minor Allele Frequency (MAF)", + ylab = "Frequency", main = "Minor Allele Frequency Distribution") }) sample_table <- reactive({ @@ -393,12 +368,15 @@ mod_diversity_server <- function(input, output, session, parent_session){ # Conditional plotting based on input selection if (input$div_figure == "Dosage Plot") { print(box_plot()) - } else if (input$div_figure == "AF Histogram") { - af_plot() } else if (input$div_figure == "MAF Histogram") { - maf_plot() + hist(diversity_items$maf_df$MAF, breaks = as.numeric(input$hist_bins), col = "grey", border = "black", xlab = "Minor Allele Frequency (MAF)", + ylab = "Frequency", main = "Minor Allele Frequency Distribution") } else if (input$div_figure == "OHet Histogram") { - het_plot() + hist(diversity_items$het_df$ObservedHeterozygosity, breaks = as.numeric(input$hist_bins), col = "tan3", border = "black", xlim= c(0,1), + xlab = "Observed Heterozygosity", + ylab = "Number of Samples", + main = "Sample Observed Heterozygosity") + axis(1, at = seq(0, 1, by = 0.1), labels = TRUE) } else if (input$div_figure == "Marker Plot") { print(marker_plot()) } @@ -456,4 +434,4 @@ mod_diversity_server <- function(input, output, session, parent_session){ # mod_diversity_ui("diversity_1") ## To be copied in the server -# mod_diversity_server("diversity_1") \ No newline at end of file +# mod_diversity_server("diversity_1") From 2414f1da651bd2939a8f21af61818e101e4058b0 Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Sat, 21 Sep 2024 14:06:42 -0400 Subject: [PATCH 06/38] Updated version --- DESCRIPTION | 2 +- R/app_ui.R | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index bde9f22..0c33326 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: BIGapp Title: Breeding Insight Genomics Shiny Application -Version: 0.6.1 +Version: 0.6.2 Authors@R: c( person(c("Alexander", "M."), "Sandercock", diff --git a/R/app_ui.R b/R/app_ui.R index de2dd35..45c2112 100644 --- a/R/app_ui.R +++ b/R/app_ui.R @@ -94,7 +94,7 @@ app_ui <- function(request) { ), left = div( style = "display: flex; align-items: center; height: 100%;", # Center the version text vertically - "v0.6.0") + "v0.6.2") ), dashboardBody( disconnectMessage(), #Adds generic error message for any error if not already accounted for From 01bd5bcc9cca82694cbaeaa88d44ff47d764a4ee Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Sat, 21 Sep 2024 14:44:39 -0400 Subject: [PATCH 07/38] Bug with phenotype file ids --- R/mod_gwas.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/mod_gwas.R b/R/mod_gwas.R index b9f2512..beeafb0 100644 --- a/R/mod_gwas.R +++ b/R/mod_gwas.R @@ -296,7 +296,7 @@ mod_gwas_server <- function(input, output, session, parent_session){ info <- data.frame(vcf@fix) gpoly_df <- cbind(info[,c("ID","CHROM","POS")], geno_mat) - if(!any(colnames(gpoly_df) %in% phenotype_file$Sample_ID)) { + if(!any(colnames(gpoly_df) %in% phenotype_file[,1])) { shinyalert( title = "Samples ID do not match", text = paste("Check if passport/phenotype files have same sample ID as the VCF/genotype file."), @@ -314,7 +314,7 @@ mod_gwas_server <- function(input, output, session, parent_session){ } validate( - need(any(colnames(gpoly_df) %in% phenotype_file$Sample_ID), "The selected traits must be numerical.") + need(any(colnames(gpoly_df) %in% phenotype_file[,1]), "The selected traits must be numerical.") ) write.csv(gpoly_df, file = temp_geno_file, row.names = FALSE) From 2afdbb44687dc7fb14f909947833e57f449b2ce8 Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Mon, 23 Sep 2024 16:06:38 -0400 Subject: [PATCH 08/38] Added Maximize option to results windows --- R/mod_GS.R | 2 +- R/mod_GSAcc.R | 2 +- R/mod_PCA.R | 2 +- R/mod_dapc.R | 4 ++-- R/mod_diversity.R | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/R/mod_GS.R b/R/mod_GS.R index ee9c9fd..51d57fe 100644 --- a/R/mod_GS.R +++ b/R/mod_GS.R @@ -59,7 +59,7 @@ mod_GS_ui <- function(id){ ), column(width = 6, - box(title = "Results", status = "info", solidHeader = FALSE, width = 12, height = 600, + box(title = "Results", status = "info", solidHeader = FALSE, width = 12, height = 600, maximizable = T, bs4Dash::tabsetPanel( tabPanel("Predicted Trait Table", DTOutput(ns("pred_trait_table")), style = "overflow-y: auto; height: 500px"), tabPanel("GEBVs Table", DTOutput(ns("pred_gebvs_table2")),style = "overflow-y: auto; height: 500px") diff --git a/R/mod_GSAcc.R b/R/mod_GSAcc.R index 788f425..17fe578 100644 --- a/R/mod_GSAcc.R +++ b/R/mod_GSAcc.R @@ -76,7 +76,7 @@ mod_GSAcc_ui <- function(id){ column(width = 6, box( - title = "Plots", status = "info", solidHeader = FALSE, width = 12, height = 600, + title = "Plots", status = "info", solidHeader = FALSE, width = 12, height = 600, maximizable = T, bs4Dash::tabsetPanel( tabPanel("Violin Plot", plotOutput(ns("pred_violin_plot"), height = "500px")), tabPanel("Box Plot", plotOutput(ns("pred_box_plot"), height = "500px")), diff --git a/R/mod_PCA.R b/R/mod_PCA.R index f8be122..2e52cf9 100644 --- a/R/mod_PCA.R +++ b/R/mod_PCA.R @@ -89,7 +89,7 @@ mod_PCA_ui <- function(id){ ) ), column(width = 8, - box(title = "Passport Data", width = 12, solidHeader = TRUE, collapsible = TRUE, status = "info", collapsed = FALSE, + box(title = "Passport Data", width = 12, solidHeader = TRUE, collapsible = TRUE, status = "info", collapsed = FALSE, maximizable = T, DTOutput(ns('passport_table')), style = "overflow-y: auto; height: 480px" ), diff --git a/R/mod_dapc.R b/R/mod_dapc.R index 02002bc..abcffbb 100644 --- a/R/mod_dapc.R +++ b/R/mod_dapc.R @@ -83,13 +83,13 @@ mod_dapc_ui <- function(id){ ) ), column(width = 8, - bs4Dash::box(title = "DAPC Data", width = 12, solidHeader = TRUE, collapsible = TRUE, status = "info", collapsed = FALSE, + bs4Dash::box(title = "DAPC Data", width = 12, solidHeader = TRUE, collapsible = TRUE, status = "info", collapsed = FALSE, maximizable = T, bs4Dash::tabsetPanel( tabPanel("BIC Values",DTOutput(ns('BIC_table'))), tabPanel("DAPC Values", DTOutput(ns('DAPC_table'))), # Placeholder for plot outputs br(), br() )), - bs4Dash::box(title = "DAPC Plots", status = "info", solidHeader = FALSE, width = 12, height = 550, + bs4Dash::box(title = "DAPC Plots", status = "info", solidHeader = FALSE, width = 12, height = 550, maximizable = T, bs4Dash::tabsetPanel( tabPanel("BIC Plot",withSpinner(plotOutput(ns("BIC_plot"), height = '460px'))), tabPanel("DAPC Plot", withSpinner(plotOutput(ns("DAPC_plot"), height = '460px'))), diff --git a/R/mod_diversity.R b/R/mod_diversity.R index cf89737..dc4bba9 100644 --- a/R/mod_diversity.R +++ b/R/mod_diversity.R @@ -51,7 +51,7 @@ mod_diversity_ui <- function(id){ ), column(width = 6, box( - title = "Plots", status = "info", solidHeader = FALSE, width = 12, height = 550, + title = "Plots", status = "info", solidHeader = FALSE, width = 12, height = 550, maximizable = T, bs4Dash::tabsetPanel( tabPanel("Dosage Plot", plotOutput(ns('dosage_plot')),style = "overflow-y: auto; height: 500px"), tabPanel("MAF Plot", plotOutput(ns('maf_plot')),style = "overflow-y: auto; height: 500px"), From cc49743dd1452e9dcf63ab25b946a6ce60908e39 Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Mon, 23 Sep 2024 16:30:03 -0400 Subject: [PATCH 09/38] Removed extra .vcf from output name if present --- R/mod_DosageCall.R | 3 ++- R/mod_Filtering.R | 3 ++- R/mod_dosage2vcf.R | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/R/mod_DosageCall.R b/R/mod_DosageCall.R index f62191f..50a161b 100644 --- a/R/mod_DosageCall.R +++ b/R/mod_DosageCall.R @@ -392,7 +392,8 @@ mod_DosageCall_server <- function(input, output, session, parent_session){ output$download_updog_vcf <- downloadHandler( filename = function() { - paste0(input$output_name, ".vcf.gz") + output_name <- gsub("\\.vcf$", "", input$output_name) + paste0(output_name, ".vcf.gz") }, content = function(file) { #Save Updog output as VCF file diff --git a/R/mod_Filtering.R b/R/mod_Filtering.R index 7225f6c..ef3f23b 100644 --- a/R/mod_Filtering.R +++ b/R/mod_Filtering.R @@ -318,7 +318,8 @@ mod_Filtering_server <- function(input, output, session, parent_session){ #Updog filtering output$start_updog_filter <- downloadHandler( filename = function() { - paste0(input$filter_output_name, ".vcf.gz") + output_name <- gsub("\\.vcf$", "", input$filter_output_name) + paste0(output_name, ".vcf.gz") }, content = function(file) { diff --git a/R/mod_dosage2vcf.R b/R/mod_dosage2vcf.R index 645c7f8..2514163 100644 --- a/R/mod_dosage2vcf.R +++ b/R/mod_dosage2vcf.R @@ -162,7 +162,8 @@ mod_dosage2vcf_server <- function(input, output, session, parent_session){ ##This is for the DArT files conversion to VCF output$download_d2vcf <- downloadHandler( filename = function() { - paste0(input$d2v_output_name, ".vcf.gz") + output_name <- gsub("\\.vcf$", "", input$d2v_output_name) + paste0(output_name, ".vcf.gz") }, content = function(file) { # Ensure the files are uploaded From 86bbcbf441b6b97c4e9699909774c32f502ecefa Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Tue, 24 Sep 2024 15:17:04 -0400 Subject: [PATCH 10/38] added tab summary info --- R/app_ui.R | 8 ++--- R/mod_DosageCall.R | 65 +++++++++++++++++++++++++++++++++++++++- R/mod_Filtering.R | 74 ++++++++++++++++++++++++++++++++++++++++++--- R/mod_GS.R | 75 ++++++++++++++++++++++++++++++++++++++++++++-- R/mod_GSAcc.R | 71 ++++++++++++++++++++++++++++++++++++++++++- R/mod_PCA.R | 2 +- R/mod_dapc.R | 68 +++++++++++++++++++++++++++++++++++++++-- R/mod_diversity.R | 62 +++++++++++++++++++++++++++++++++++++- R/mod_dosage2vcf.R | 60 +++++++++++++++++++++++++++++++++++++ R/mod_gwas.R | 69 +++++++++++++++++++++++++++++++++++++++++- 10 files changed, 536 insertions(+), 18 deletions(-) diff --git a/R/app_ui.R b/R/app_ui.R index 45c2112..9986fc5 100644 --- a/R/app_ui.R +++ b/R/app_ui.R @@ -44,18 +44,18 @@ app_ui <- function(request) { sidebarMenu(id = "MainMenu", flat = FALSE, tags$li(class = "header", style = "color: grey; margin-top: 10px; margin-bottom: 10px; padding-left: 15px;", "Menu"), - menuItem("Home", tabName = "welcome", icon = icon("house")), + menuItem("Home", tabName = "welcome", icon = icon("house")), tags$li(class = "header", style = "color: grey; margin-top: 18px; margin-bottom: 10px; padding-left: 15px;", "Genotype Processing"), menuItem("DArT Report2VCF", tabName = "dosage2vcf", icon = icon("share-from-square")), menuItem("Updog Dosage Calling", tabName = "updog", icon = icon("list-ol")), menuItem("VCF Filtering", tabName = "filtering", icon = icon("filter")), + tags$li(class = "header", style = "color: grey; margin-top: 18px; margin-bottom: 10px; padding-left: 15px;", "Summary Metrics"), + menuItem("Genomic Diversity", tabName = "diversity", icon = icon("chart-pie")), tags$li(class = "header", style = "color: grey; margin-top: 18px; margin-bottom: 10px; padding-left: 15px;", "Population Structure"), menuItem("PCA", tabName = "pca", icon = icon("chart-simple")), menuItem("DAPC", tabName = "dapc", icon = icon("circle-nodes")), - tags$li(class = "header", style = "color: grey; margin-top: 18px; margin-bottom: 10px; padding-left: 15px;", "Summary Metrics"), - menuItem("Genomic Diversity", tabName = "diversity", icon = icon("chart-pie")), tags$li(class = "header", style = "color: grey; margin-top: 18px; margin-bottom: 10px; padding-left: 15px;", "GWAS"), - menuItem("GWASpoly", tabName = "gwas", icon = icon("think-peaks")), + menuItem("GWASpoly", tabName = "gwas", icon = icon("think-peaks")), tags$li(class = "header", style = "color: grey; margin-top: 18px; margin-bottom: 10px; padding-left: 15px;", "Genomic Selection"), menuItem( span("Predictive Ability", bs4Badge("beta", position = "right", color = "success")), diff --git a/R/mod_DosageCall.R b/R/mod_DosageCall.R index 50a161b..da40f42 100644 --- a/R/mod_DosageCall.R +++ b/R/mod_DosageCall.R @@ -88,7 +88,8 @@ mod_DosageCall_ui <- function(id){ 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(), - p(HTML("Updog tutorial:"), actionButton(ns("goUpdog"), icon("arrow-up-right-from-square", verify_fa = FALSE), onclick ="window.open('https://dcgerard.github.io/updog/', '_blank')" )), + p(HTML("Updog tutorial:"), actionButton(ns("goUpdog"), icon("arrow-up-right-from-square", verify_fa = FALSE), onclick ="window.open('https://dcgerard.github.io/updog/', '_blank')" )), hr(), + actionButton(ns("dosage_summary"), "Summary"), circle = FALSE, status = "warning", icon = icon("info"), width = "500px", @@ -429,6 +430,68 @@ mod_DosageCall_server <- function(input, output, session, parent_session){ ex <- system.file("iris_DArT_MADC.csv", package = "BIGapp") file.copy(ex, file) }) + + ##Summary Info + dosage_summary_info <- function() { + #Handle possible NULL values for inputs + genotype_file_name <- if (!is.null(input$madc_file$name)) input$madc_file$name else "No file selected" + report_file_name <- if (!is.null(input$madc_passport$name)) input$madc_passport$name else "No file selected" + selected_ploidy <- if (!is.null(input$ploidy)) as.character(input$ploidy) else "Not selected" + + #Print the summary information + cat( + "BIGapp Dosage Calling Summary\n", + "\n", + paste0("Date: ", Sys.Date()), "\n", + paste("R Version:", R.Version()$version.string), "\n", + "\n", + "### Input Files ###\n", + "\n", + paste("Input Genotype File:", genotype_file_name), "\n", + paste("Input Passport File:", report_file_name), "\n", + "\n", + "### User Selected Parameters ###\n", + "\n", + paste("Selected Ploidy:", selected_ploidy), "\n", + paste("Selected Updog Model:", input$updog_model), "\n", + "\n", + "### R Packages Used ###\n", + "\n", + paste("BIGapp:", packageVersion("BIGapp")), "\n", + paste("BIGr:", packageVersion("BIGr")), "\n", + paste("Updog:", packageVersion("updog")), "\n", + paste("dplyr:", packageVersion("dplyr")), "\n", + sep = "" + ) + } + + # Popup for analysis summary + observeEvent(input$dosage_summary, { + showModal(modalDialog( + title = "Summary Information", + size = "l", + easyClose = TRUE, + footer = tagList( + modalButton("Close"), + downloadButton("download_dosage_info", "Download") + ), + pre( + paste(capture.output(dosage_summary_info()), collapse = "\n") + ) + )) + }) + + + # Download Summary Info + output$download_dosage_info <- downloadHandler( + filename = function() { + paste("DosageCalling_summary_", Sys.Date(), ".txt", sep = "") + }, + content = function(file) { + # Write the summary info to a file + writeLines(paste(capture.output(dosage_summary_info()), collapse = "\n"), file) + } + ) } ## To be copied in the UI diff --git a/R/mod_Filtering.R b/R/mod_Filtering.R index ef3f23b..4bc37e2 100644 --- a/R/mod_Filtering.R +++ b/R/mod_Filtering.R @@ -46,10 +46,8 @@ mod_Filtering_ui <- function(id){ div(style="display:inline-block; float:right",dropdownButton( tags$h3("Updog Filter Parameters"), "You can download examples of the expected file here: \n", - downloadButton(ns('download_vcf'), "Download VCF Example File"), - # "Add description of each filter. Presently, all filtering parameters that are typically used for processing - # a VCF file from Updog dosage calling are included. If a VCF file does not contain these values, it will only be - # filtered for read depth, missing data, and maf.", + downloadButton(ns('download_vcf'), "Download VCF Example File"), hr(), + actionButton(ns("filtering_summary"), "Summary"), circle = FALSE, status = "warning", icon = icon("info"), width = "300px", @@ -624,6 +622,74 @@ mod_Filtering_server <- function(input, output, session, parent_session){ ex <- system.file("iris_DArT_VCF.vcf.gz", package = "BIGapp") file.copy(ex, file) }) + + ##Summary Info + filtering_summary_info <- function() { + #Handle possible NULL values for inputs + genotype_file_name <- if (!is.null(input$updog_rdata$name)) input$updog_rdata$name else "No file selected" + selected_ploidy <- if (!is.null(input$filter_ploidy)) as.character(input$filter_ploidy) else "Not selected" + + #Print the summary information + cat( + "BIGapp VCF Filtering Summary\n", + "\n", + paste0("Date: ", Sys.Date()), "\n", + paste(R.Version()$version.string), "\n", + "\n", + "### Input Files ###\n", + "\n", + paste("Input Genotype File:", genotype_file_name), "\n", + "\n", + "### User Selected Parameters ###\n", + "\n", + paste("Selected Ploidy:", selected_ploidy), "\n", + paste("MAF Filter:", input$filter_maf), "\n", + paste("Min Read Depth (Marker per Sample):", input$size_depth), "\n", + paste("Remove SNPs with >= % missing data:", input$snp_miss), "\n", + paste("Remove Samples with >= % missing data:", input$sample_miss), "\n", + paste("Use Updog Filtering Parameters?:", input$use_updog), "\n", + paste("Max OD (Updog filter):", ifelse(input$use_updog,input$OD_filter, "NA")), "\n", + paste("Bias Minimum (Updog filter):", ifelse(input$use_updog,input$Bias[1], "NA")), "\n", + paste("Bias Maximum (Updog filter):", ifelse(input$use_updog,input$Bias[2], "NA")), "\n", + paste("Max Prop_mis (Updog filter):", ifelse(input$use_updog,input$Prop_mis,"NA")), "\n", + paste("Minimum maxpostprob (Updog filter):", ifelse(input$use_updog,input$maxpostprob_filter,"NA")), "\n", + "\n", + "### R Packages Used ###\n", + "\n", + paste("BIGapp:", packageVersion("BIGapp")), "\n", + paste("BIGr:", packageVersion("BIGr")), "\n", + paste("Updog:", packageVersion("updog")), "\n", + sep = "" + ) + } + + # Popup for analysis summary + observeEvent(input$filtering_summary, { + showModal(modalDialog( + title = "Summary Information", + size = "l", + easyClose = TRUE, + footer = tagList( + modalButton("Close"), + downloadButton("download_filtering_info", "Download") + ), + pre( + paste(capture.output(filtering_summary_info()), collapse = "\n") + ) + )) + }) + + + # Download Summary Info + output$download_filtering_info <- downloadHandler( + filename = function() { + paste("Filtering_summary_", Sys.Date(), ".txt", sep = "") + }, + content = function(file) { + # Write the summary info to a file + 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 51d57fe..6ff4c37 100644 --- a/R/mod_GS.R +++ b/R/mod_GS.R @@ -46,9 +46,8 @@ mod_GS_ui <- function(id){ "You can download examples of the expected input input files here: \n", downloadButton(ns('download_vcft'), "Download Training VCF Example File"), downloadButton(ns('download_pheno'), "Download Passport Example File"), - downloadButton(ns('download_vcfp'), "Download Prediction VCF Example File"), - - #"GP uses the rrBLUP package: It can impute missing data, adapt to different ploidy, perform 5-fold cross validations with different number of iterations, run multiple traits, and accept multiple fixed effects.", + downloadButton(ns('download_vcfp'), "Download Prediction VCF Example File"),hr(), + actionButton(ns("pred_summary"), "Summary"), circle = FALSE, status = "warning", icon = icon("info"), width = "300px", @@ -720,6 +719,76 @@ mod_GS_server <- function(input, output, session, parent_session){ ex <- system.file("iris_passport_file.csv", package = "BIGapp") file.copy(ex, file) }) + + ##Summary Info + pred_summary_info <- function() { + # Handle possible NULL values for inputs + dosage_file_name <- if (!is.null(input$pred_known_file$name)) input$pred_known_file$name else "No file selected" + 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", + "\n", + paste0("Date: ", Sys.Date()), "\n", + paste("R Version:", R.Version()$version.string), "\n", + "\n", + "### Input Files ###\n", + "\n", + paste("Input Genotype File 1:", dosage_file_name), "\n", + paste("Input Genotype File 2:", est_file_name), "\n", + paste("Input Passport File:", passport_file_name), "\n", + "\n", + "### User Selected Parameters ###\n", + "\n", + paste("Selected Ploidy:", selected_ploidy), "\n", + paste("Selected Trait(s):", input$pred_trait_info2), "\n", + paste("Selected Fixed Effects:", input$pred_fixed_info2), "\n", + #paste("Selected Model:", input$pred_fixed_info2), "\n", + #paste("Selected Matrix:", input$pred_fixed_info2), "\n", + "\n", + "### R Packages Used ###\n", + "\n", + paste("BIGapp:", packageVersion("BIGapp")), "\n", + paste("AGHmatrix:", packageVersion("AGHmatrix")), "\n", + paste("ggplot2:", packageVersion("ggplot2")), "\n", + paste("rrBLUP:", packageVersion("rrBLUP")), "\n", + paste("vcfR:", packageVersion("vcfR")), "\n", + paste("dplyr:", packageVersion("dplyr")), "\n", + paste("tidyr:", packageVersion("tidyr")), "\n", + sep = "" + ) + } + + # Popup for analysis summary + observeEvent(input$pred_summary, { + showModal(modalDialog( + title = "Summary Information", + size = "l", + easyClose = TRUE, + footer = tagList( + modalButton("Close"), + downloadButton("download_pred_info", "Download") + ), + pre( + paste(capture.output(pred_summary_info()), collapse = "\n") + ) + )) + }) + + + # Download Summary Info + output$download_pred_info <- downloadHandler( + filename = function() { + paste("pred_summary_", Sys.Date(), ".txt", sep = "") + }, + content = function(file) { + # Write the summary info to a file + writeLines(paste(capture.output(pred_summary_info()), collapse = "\n"), file) + } + ) } ## To be copied in the UI diff --git a/R/mod_GSAcc.R b/R/mod_GSAcc.R index 17fe578..560fe17 100644 --- a/R/mod_GSAcc.R +++ b/R/mod_GSAcc.R @@ -58,7 +58,8 @@ mod_GSAcc_ui <- function(id){ tags$h3("GP Parameters"), "You can download examples of the expected input input files here: \n", downloadButton(ns('download_vcf'), "Download VCF Example File"), - downloadButton(ns('download_pheno'), "Download Passport Example File"), + downloadButton(ns('download_pheno'), "Download Passport Example File"),hr(), + actionButton(ns("predAcc_summary"), "Summary"), circle = FALSE, status = "warning", icon = icon("info"), width = "300px", @@ -783,6 +784,74 @@ mod_GSAcc_server <- function(input, output, session, parent_session){ ex <- system.file("iris_passport_file.csv", package = "BIGapp") file.copy(ex, file) }) + + ##Summary Info + predAcc_summary_info <- function() { + # Handle possible NULL values for inputs + dosage_file_name <- if (!is.null(input$pred_file$name)) input$pred_file$name else "No file selected" + passport_file_name <- if (!is.null(input$trait_file$name)) input$trait_file$name else "No file selected" + selected_ploidy <- if (!is.null(input$pred_ploidy)) as.character(input$pred_ploidy) else "Not selected" + + # Print the summary information + cat( + "BIGapp Selection Model CV Summary\n", + "\n", + paste0("Date: ", Sys.Date()), "\n", + paste("R Version:", R.Version()$version.string), "\n", + "\n", + "### Input Files ###\n", + "\n", + paste("Input Genotype File:", dosage_file_name), "\n", + paste("Input Passport File:", passport_file_name), "\n", + "\n", + "### User Selected Parameters ###\n", + "\n", + paste("Selected Ploidy:", selected_ploidy), "\n", + paste("Selected Trait(s):", input$pred_trait_info), "\n", + paste("Selected Fixed Effects:", input$pred_fixed_info), "\n", + paste("Selected Model:", advanced_options$pred_model), "\n", + paste("Selected Matrix:", advanced_options$pred_matrix), "\n", + "\n", + "### R Packages Used ###\n", + "\n", + paste("BIGapp:", packageVersion("BIGapp")), "\n", + paste("AGHmatrix:", packageVersion("AGHmatrix")), "\n", + paste("ggplot2:", packageVersion("ggplot2")), "\n", + paste("rrBLUP:", packageVersion("rrBLUP")), "\n", + paste("vcfR:", packageVersion("vcfR")), "\n", + paste("dplyr:", packageVersion("dplyr")), "\n", + paste("tidyr:", packageVersion("tidyr")), "\n", + sep = "" + ) + } + + # Popup for analysis summary + observeEvent(input$predAcc_summary, { + showModal(modalDialog( + title = "Summary Information", + size = "l", + easyClose = TRUE, + footer = tagList( + modalButton("Close"), + downloadButton("download_predAcc_info", "Download") + ), + pre( + paste(capture.output(predAcc_summary_info()), collapse = "\n") + ) + )) + }) + + + # Download Summary Info + output$download_predAcc_info <- downloadHandler( + filename = function() { + paste("predAcc_summary_", Sys.Date(), ".txt", sep = "") + }, + content = function(file) { + # Write the summary info to a file + writeLines(paste(capture.output(predAcc_summary_info()), collapse = "\n"), file) + } + ) } ## To be copied in the UI diff --git a/R/mod_PCA.R b/R/mod_PCA.R index 2e52cf9..b9a56ed 100644 --- a/R/mod_PCA.R +++ b/R/mod_PCA.R @@ -35,7 +35,7 @@ mod_PCA_ui <- function(id){ tags$h3("PCA Inputs"), "You can download examples of the expected files here: \n", downloadButton(ns('download_vcf'), "Download VCF Example File"), - downloadButton(ns('download_pheno'), "Download Passport Example File"), + downloadButton(ns('download_pheno'), "Download Passport Example File"),hr(), actionButton(ns("pca_summary"), "Summary"), circle = FALSE, status = "warning", diff --git a/R/mod_dapc.R b/R/mod_dapc.R index abcffbb..1399866 100644 --- a/R/mod_dapc.R +++ b/R/mod_dapc.R @@ -25,8 +25,8 @@ mod_dapc_ui <- function(id){ div(style="display:inline-block; float:right",dropdownButton( tags$h3("DAPC Inputs"), "You can download an examples of the expected input file here: \n", - downloadButton(ns('download_vcf'), "Download VCF Example File"), - #"DAPC Input file and analysis info. The DAPC analysis is broken down into two steps. The first step (Step 1), uses Kmeans clustering to estimate the most likely number of clusters within the dataset. This is visualized in the BIC plot and is typically the minimum BIC value. Step 2 is the DAPC analysis where the most likely value for K (number of clusters) is input and the cluster memberships are determined in the DAPC results", + downloadButton(ns('download_vcf'), "Download VCF Example File"),hr(), + actionButton(ns("dapc_summary"), "Summary"), circle = FALSE, status = "warning", icon = icon("info"), width = "300px", @@ -425,6 +425,70 @@ mod_dapc_server <- function(input, output, session, parent_session){ ex <- system.file("iris_DArT_VCF.vcf.gz", package = "BIGapp") file.copy(ex, file) }) + + ##Summary Info + dapc_summary_info <- function() { + #Handle possible NULL values for inputs + dosage_file_name <- if (!is.null(input$dosage_file$name)) input$dosage_file$name else "No file selected" + #passport_file_name <- if (!is.null(input$passport_file$name)) input$passport_file$name else "No file selected" + selected_ploidy <- if (!is.null(input$dapc_ploidy)) as.character(input$dapc_ploidy) else "Not selected" + + #Print the summary information + cat( + "BIGapp DAPC Summary\n", + "\n", + paste0("Date: ", Sys.Date()), "\n", + paste("R Version:", R.Version()$version.string), "\n", + "\n", + "### Input Files ###\n", + "\n", + paste("Input Genotype File:", dosage_file_name), "\n", + #paste("Input Passport File:", passport_file_name), "\n", + "\n", + "### User Selected Parameters ###\n", + "\n", + paste("Selected Ploidy:", selected_ploidy), "\n", + paste("Maximum K:", input$dapc_kmax), "\n", + paste("Number of Clusters (K):", input$dapc_k), "\n", + "\n", + "### R Packages Used ###\n", + "\n", + paste("BIGapp:", packageVersion("BIGapp")), "\n", + paste("adegenet:", packageVersion("adegenet")), "\n", + paste("ggplot2:", packageVersion("ggplot2")), "\n", + paste("vcfR:", packageVersion("vcfR")), "\n", + paste("RColorBrewer:", packageVersion("RColorBrewer")), "\n", + sep = "" + ) + } + + # Popup for analysis summary + observeEvent(input$dapc_summary, { + showModal(modalDialog( + title = "Summary Information", + size = "l", + easyClose = TRUE, + footer = tagList( + modalButton("Close"), + downloadButton("download_dapc_info", "Download") + ), + pre( + paste(capture.output(dapc_summary_info()), collapse = "\n") + ) + )) + }) + + + # Download Summary Info + output$download_dapc_info <- downloadHandler( + filename = function() { + paste("dapc_summary_", Sys.Date(), ".txt", sep = "") + }, + content = function(file) { + # Write the summary info to a file + writeLines(paste(capture.output(dapc_summary_info()), collapse = "\n"), file) + } + ) } ## To be copied in the UI diff --git a/R/mod_diversity.R b/R/mod_diversity.R index dc4bba9..a9c3141 100644 --- a/R/mod_diversity.R +++ b/R/mod_diversity.R @@ -20,7 +20,8 @@ mod_diversity_ui <- function(id){ div(style="display:inline-block; float:right",dropdownButton( tags$h3("Diversity Parameters"), "You can download an examples of the expected input file here: \n", - downloadButton(ns('download_vcf'), "Download VCF Example File"), + downloadButton(ns('download_vcf'), "Download VCF Example File"),hr(), + actionButton(ns("diversity_summary"), "Summary"), circle = FALSE, status = "warning", icon = icon("info"), width = "300px", @@ -428,6 +429,65 @@ mod_diversity_server <- function(input, output, session, parent_session){ ex <- system.file("iris_DArT_VCF.vcf.gz", package = "BIGapp") file.copy(ex, file) }) + + ##Summary Info + diversity_summary_info <- function() { + # Handle possible NULL values for inputs + dosage_file_name <- if (!is.null(input$diversity_file$name)) input$diversity_file$name else "No file selected" + selected_ploidy <- if (!is.null(input$diversity_ploidy)) as.character(input$diversity_ploidy) else "Not selected" + + # Print the summary information + cat( + "BIGapp Summary Metrics Summary\n", + "\n", + paste0("Date: ", Sys.Date()), "\n", + paste(R.Version()$version.string), "\n", + "\n", + "### Input Files ###\n", + "\n", + paste("Input Genotype File:", dosage_file_name), "\n", + "\n", + "### User Selected Parameters ###\n", + "\n", + paste("Selected Ploidy:", selected_ploidy), "\n", + "\n", + "### R Packages Used ###\n", + "\n", + paste("BIGapp:", packageVersion("BIGapp")), "\n", + paste("BIGr:", packageVersion("BIGr")), "\n", + paste("ggplot2:", packageVersion("ggplot2")), "\n", + paste("vcfR:", packageVersion("vcfR")), "\n", + sep = "" + ) + } + + # Popup for analysis summary + observeEvent(input$diversity_summary, { + showModal(modalDialog( + title = "Summary Information", + size = "l", + easyClose = TRUE, + footer = tagList( + modalButton("Close"), + downloadButton("download_diversity_info", "Download") + ), + pre( + paste(capture.output(diversity_summary_info()), collapse = "\n") + ) + )) + }) + + + # Download Summary Info + output$download_diversity_info <- downloadHandler( + filename = function() { + paste("diversity_summary_", Sys.Date(), ".txt", sep = "") + }, + content = function(file) { + # Write the summary info to a file + writeLines(paste(capture.output(diversity_summary_info()), collapse = "\n"), file) + } + ) } ## To be copied in the UI diff --git a/R/mod_dosage2vcf.R b/R/mod_dosage2vcf.R index 2514163..5b13655 100644 --- a/R/mod_dosage2vcf.R +++ b/R/mod_dosage2vcf.R @@ -30,6 +30,7 @@ mod_dosage2vcf_ui <- function(id){ p(HTML("Parameters description:"), actionButton(ns("goPar"), icon("arrow-up-right-from-square", verify_fa = FALSE) )), hr(), p(HTML("Graphics 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(), + actionButton(ns("d2vcf_summary"), "Summary"), circle = FALSE, status = "warning", icon = icon("info"), width = "500px", @@ -227,6 +228,65 @@ mod_dosage2vcf_server <- function(input, output, session, parent_session){ updateProgressBar(session = session, id = "dosage2vcf_pb", value = 100, title = "Complete! - Downloading VCF") } ) + + ##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", + "\n", + paste0("Date: ", Sys.Date()), "\n", + paste("R Version:", R.Version()$version.string), "\n", + "\n", + "### Input Files ###\n", + "\n", + paste("Input Dosage Report File:", report_file_name), "\n", + paste("Input Counts File:", counts_file_name), "\n", + "\n", + "### User Selected Parameters ###\n", + "\n", + paste("Selected Ploidy:", selected_ploidy), "\n", + "\n", + "### R Packages Used ###\n", + "\n", + paste("BIGapp:", packageVersion("BIGapp")), "\n", + paste("BIGr:", packageVersion("BIGr")), "\n", + sep = "" + ) + } + + # Popup for analysis summary + observeEvent(input$d2vcf_summary, { + showModal(modalDialog( + title = "Summary Information", + size = "l", + easyClose = TRUE, + footer = tagList( + modalButton("Close"), + downloadButton("download_d2vcf_info", "Download") + ), + pre( + paste(capture.output(d2vcf_summary_info()), collapse = "\n") + ) + )) + }) + + + # Download Summary Info + output$download_d2vcf_info <- downloadHandler( + filename = function() { + paste("Dosage2VCF_summary_", Sys.Date(), ".txt", sep = "") + }, + content = function(file) { + # Write the summary info to a file + writeLines(paste(capture.output(d2vcf_summary_info()), collapse = "\n"), file) + } + ) } ## To be copied in the UI diff --git a/R/mod_gwas.R b/R/mod_gwas.R index beeafb0..beae246 100644 --- a/R/mod_gwas.R +++ b/R/mod_gwas.R @@ -42,7 +42,8 @@ mod_gwas_ui <- function(id){ p(HTML("Parameters description:"), actionButton(ns("goGWASpar"), icon("arrow-up-right-from-square", verify_fa = FALSE) )), hr(), p(HTML("Results description:"), actionButton(ns("goGWASgraph"), icon("arrow-up-right-from-square", verify_fa = FALSE) )), hr(), p(HTML("How to cite:"), actionButton(ns("goGWAScite"), icon("arrow-up-right-from-square", verify_fa = FALSE) )), hr(), - p(HTML("GWASpoly tutorial:"), actionButton(ns("goGWASpoly"), icon("arrow-up-right-from-square", verify_fa = FALSE), onclick ="window.open('https://jendelman.github.io/GWASpoly/GWASpoly.html', '_blank')" )), + p(HTML("GWASpoly tutorial:"), actionButton(ns("goGWASpoly"), icon("arrow-up-right-from-square", verify_fa = FALSE), onclick ="window.open('https://jendelman.github.io/GWASpoly/GWASpoly.html', '_blank')" )),hr(), + actionButton(ns("gwas_summary"), "Summary"), circle = FALSE, status = "warning", icon = icon("info"), width = "300px", @@ -727,6 +728,72 @@ mod_gwas_server <- function(input, output, session, parent_session){ ex <- system.file("iris_passport_file.csv", package = "BIGapp") file.copy(ex, file) }) + + ##Summary Info + gwas_summary_info <- function() { + #Handle possible NULL values for inputs + dosage_file_name <- if (!is.null(input$gwas_file$name)) input$gwas_file$name else "No file selected" + passport_file_name <- if (!is.null(input$phenotype_file$name)) input$phenotype_file$name else "No file selected" + selected_ploidy <- if (!is.null(input$gwas_ploidy)) as.character(input$gwas_ploidy) else "Not selected" + + #Print the summary information + cat( + "BIGapp GWAS Summary\n", + "\n", + paste0("Date: ", Sys.Date()), "\n", + paste("R Version:", R.Version()$version.string), "\n", + "\n", + "### Input Files ###\n", + "\n", + paste("Input Genotype File:", dosage_file_name), "\n", + paste("Input Passport File:", passport_file_name), "\n", + "\n", + "### User Selected Parameters ###\n", + "\n", + paste("Selected Ploidy:", selected_ploidy), "\n", + paste("Significance Threshold Method:", input$gwas_threshold), "\n", + paste("Selected Trait:", input$trait_info), "\n", + paste("Selected Fixed Effects:", input$fixed_info), "\n", + "\n", + "### R Packages Used ###\n", + "\n", + paste("BIGapp:", packageVersion("BIGapp")), "\n", + paste("AGHmatrix:", packageVersion("AGHmatrix")), "\n", + paste("ggplot2:", packageVersion("ggplot2")), "\n", + paste("GWASpoly:", packageVersion("GWASpoly")), "\n", + paste("vcfR:", packageVersion("vcfR")), "\n", + paste("Matrix:", packageVersion("Matrix")), "\n", + sep = "" + ) + } + + # Popup for analysis summary + observeEvent(input$gwas_summary, { + showModal(modalDialog( + title = "Summary Information", + size = "l", + easyClose = TRUE, + footer = tagList( + modalButton("Close"), + downloadButton("download_gwas_info", "Download") + ), + pre( + paste(capture.output(gwas_summary_info()), collapse = "\n") + ) + )) + }) + + + # Download Summary Info + output$download_gwas_info <- downloadHandler( + filename = function() { + paste("gwas_summary_", Sys.Date(), ".txt", sep = "") + }, + content = function(file) { + # Write the summary info to a file + writeLines(paste(capture.output(gwas_summary_info()), collapse = "\n"), file) + } + ) } ## To be copied in the UI From f8ef96eda74fd0da4d975f4caee5e74ccd73e35e Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Tue, 24 Sep 2024 15:22:32 -0400 Subject: [PATCH 11/38] Updated read depth input format --- R/mod_Filtering.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/mod_Filtering.R b/R/mod_Filtering.R index 4bc37e2..76a8be1 100644 --- a/R/mod_Filtering.R +++ b/R/mod_Filtering.R @@ -26,7 +26,7 @@ mod_Filtering_ui <- function(id){ textInput(ns("filter_output_name"), "Output File Name"), numericInput(ns("filter_ploidy"),"Ploidy", min = 0, value = NULL), numericInput(ns("filter_maf"),"MAF filter", min = 0, max=1, value = 0.05, step = 0.01), - sliderInput(ns("size_depth"),"Min Read Depth (Marker per Sample)", min = 0, max = 300, value = 10, step = 1), + numericInput(ns("size_depth"),"Min Read Depth (Marker per Sample)", min = 0, max = 300, value = 10, step = 1), numericInput(ns("snp_miss"),"Remove SNPs with >= % missing data", min = 0, max = 100, value = 50, step = 1), numericInput(ns("sample_miss"),"Remove Samples with >= % missing data", min = 0, max = 100, value = 50, step = 1), "Updog Filtering Parameters", From 1fd3f679928396d73fd88aa2e3d6eac71e98b12b Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Wed, 25 Sep 2024 09:03:14 -0400 Subject: [PATCH 12/38] Sidebar updates --- R/app_ui.R | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/R/app_ui.R b/R/app_ui.R index 9986fc5..0ed8546 100644 --- a/R/app_ui.R +++ b/R/app_ui.R @@ -40,11 +40,15 @@ app_ui <- function(request) { ), help = NULL, #This is the default bs4Dash button to control the presence of tooltips and popovers, which can be added as a user help/info feature. bs4DashSidebar( - skin="light", status = "info", + skin="light", + status = "info", + fixed=TRUE, + #minified = F, + expandOnHover = TRUE, sidebarMenu(id = "MainMenu", flat = FALSE, tags$li(class = "header", style = "color: grey; margin-top: 10px; margin-bottom: 10px; padding-left: 15px;", "Menu"), - menuItem("Home", tabName = "welcome", icon = icon("house")), + menuItem("Home", tabName = "welcome", icon = icon("house"),startExpanded = FALSE), tags$li(class = "header", style = "color: grey; margin-top: 18px; margin-bottom: 10px; padding-left: 15px;", "Genotype Processing"), menuItem("DArT Report2VCF", tabName = "dosage2vcf", icon = icon("share-from-square")), menuItem("Updog Dosage Calling", tabName = "updog", icon = icon("list-ol")), From dd9e66c629d83e101086db50862f79cda4253390 Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Wed, 25 Sep 2024 09:30:39 -0400 Subject: [PATCH 13/38] Added data check warning --- R/mod_DosageCall.R | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/R/mod_DosageCall.R b/R/mod_DosageCall.R index da40f42..aaab7af 100644 --- a/R/mod_DosageCall.R +++ b/R/mod_DosageCall.R @@ -364,6 +364,25 @@ mod_DosageCall_server <- function(input, output, session, parent_session){ return() } + + if (nrow(matrices$ref_matrix) == 0 || nrow(matrices$size_matrix) == 0) { + shinyalert( + title = "Data Warning!", + text = "All markers are missing read count information for reference and alternate alleles", + size = "s", + closeOnEsc = TRUE, + closeOnClickOutside = FALSE, + html = TRUE, + type = "error", + showConfirmButton = TRUE, + confirmButtonText = "OK", + confirmButtonCol = "#004192", + showCancelButton = FALSE, + animation = TRUE + ) + + return() + } #Run Updog #I am also taking the ploidy from the max value in the From 6cabc78efc5328d168fb4cc390996f825c12171e Mon Sep 17 00:00:00 2001 From: Cristianetaniguti Date: Wed, 25 Sep 2024 13:55:22 -0400 Subject: [PATCH 14/38] organize GWAS tabs #70 --- R/mod_gwas.R | 166 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 105 insertions(+), 61 deletions(-) diff --git a/R/mod_gwas.R b/R/mod_gwas.R index beae246..f05432d 100644 --- a/R/mod_gwas.R +++ b/R/mod_gwas.R @@ -22,7 +22,7 @@ mod_gwas_ui <- function(id){ fileInput(ns("gwas_file"), "Choose VCF File", accept = c(".csv",".vcf",".gz")), fileInput(ns("phenotype_file"), "Choose Passport File", accept = ".csv"), numericInput(ns("gwas_ploidy"), "Species Ploidy", min = 1, value = NULL), - numericInput(ns("bp_window_before"), "Base pair window", min = 0, value = 5e6), + numericInput(ns("bp_window_before"), "Base pair window", min = 0, value = 50), selectInput(ns('gwas_threshold'), label='Significance Threshold Method', choices = c("M.eff","Bonferroni","FDR","permute"), selected="M.eff"), selectInput(ns('trait_info'), label = 'Select Trait (eg. Color):', choices = NULL), virtualSelectInput( @@ -53,26 +53,45 @@ mod_gwas_ui <- function(id){ ), column(width = 6, box( - title = "Plots", status = "info", solidHeader = FALSE, width = 12, height = 800, + title = "Plots", status = "info", solidHeader = FALSE, width = 12, bs4Dash::tabsetPanel( - tabPanel("Linkage Desiquilibrium Plot", - withSpinner(plotOutput(ns("LD_plot"), height = "500px")), br(), - conditionalPanel( - condition = "input.gwas_start", ns = ns, - div( - sliderInput(ns("bp_window_after"), label = "Adjust base pair window here and run analysis again", min = 0, - max = 100e6, value = 5e6, step = 100), - ) - ) - ), tabPanel("BIC Plot", withSpinner(plotOutput(ns("bic_plot"), height = "500px"))), tabPanel("Manhattan Plot", withSpinner(plotOutput(ns("manhattan_plot"), height = "500px"))), tabPanel("QQ Plot", withSpinner(plotOutput(ns("qq_plot"), height = "500px"))), tabPanel("BIC Table", withSpinner(DTOutput(ns("bic_table"))),style = "overflow-y: auto; height: 500px"), - tabPanel("QTL - significant markers", - withSpinner(DTOutput(ns('gwas_stats'))),style = "overflow-y: auto; height: 500px"), - tabPanel("Multiple QTL model results table", - withSpinner(DTOutput(ns('gwas_fitqtl'))),style = "overflow-y: auto; height: 500px") + tabPanel("Detected QTL", + br(), + box( + title = "Filter QTL by LD window",solidHeader = FALSE, width = 12, + withSpinner(plotOutput(ns("LD_plot"), height = "500px")), br(), + sliderInput(ns("bp_window_after"), label = "Adjust base pair window here and run analysis again", min = 0, + max = 100e6, value = 50, step = 100) + ), + box( + title = "QTL detected", solidHeader = FALSE, width = 12, + withSpinner(DTOutput(ns('gwas_stats'))) + ) + ), + tabPanel("Multiple QTL model", + br(), + pickerInput( + inputId = ns("sele_models"), + label = "Select model", + choices = "will be updated", + options = list( + `actions-box` = TRUE), + multiple = TRUE + ), hr(), + pickerInput( + inputId = ns("sele_qtl"), + label = "Select QTL", + choices = "will be updated", + options = list( + `actions-box` = TRUE), + multiple = TRUE + ), hr(), + withSpinner(DTOutput(ns('gwas_fitqtl'))), + style = "overflow-y: auto; height: 500px") ) ) ), @@ -164,6 +183,11 @@ mod_gwas_server <- function(input, output, session, parent_session){ output$gwas_stats <- renderDT(NULL) ##GWAS items + gwas_data <- reactiveValues( + data2 = NULL, + phenos = NULL + ) + gwas_vars <- reactiveValues( gwas_df = NULL, fit_qtl = NULL, @@ -194,7 +218,6 @@ mod_gwas_server <- function(input, output, session, parent_session){ #GWAS analysis (Shufen Chen and Meng Lin pipelines) observeEvent(input$gwas_start, { - toggleClass(id = "gwas_ploidy", class = "borderred", condition = (is.na(input$gwas_ploidy) | is.null(input$gwas_ploidy))) toggleClass(id = "trait_info", class = "borderred", condition = (all(is.na(input$trait_info)) | all(is.null(input$trait_info)))) @@ -373,7 +396,7 @@ mod_gwas_server <- function(input, output, session, parent_session){ ) gwas_vars$bp_window <- input$bp_window_before - updateSliderInput(session = session, inputId = "bp_window_after", min = 0, max = lim.d, value = gwas_vars$bp_window, step = round(lim.d/30,4)) + updateSliderInput(session = session, inputId = "bp_window_after", min = 0, max = round(lim.d,2), value = gwas_vars$bp_window, step = round(lim.d/30,4)) data.loco <- set.K(data,LOCO=F,n.core= as.numeric(cores)) @@ -414,6 +437,7 @@ mod_gwas_server <- function(input, output, session, parent_session){ kin.adj<-posdefmat(K) kin.test<-as.matrix(kin.adj) + phenos <- vector() for (i in 2:ncol(GE)){ #model selection @@ -465,7 +489,6 @@ mod_gwas_server <- function(input, output, session, parent_session){ #Consider adding options for different thresholds data2 <- set.threshold(data.loco.scan,method=input$gwas_threshold,level=0.05) - #Save manhattan plots to list (only for single trait analysis) #if length(traits) == 1 manhattan_plot_list <- list() @@ -473,38 +496,6 @@ mod_gwas_server <- function(input, output, session, parent_session){ #plot for six models per trait manhattan_plot_list[["all"]] <- manhattan.plot(data2,traits=colnames(data@pheno[i]), models = model)+geom_point(size=3)+theme(text = element_text(size = 25),strip.text = element_text(face = "bold")) - #get most significant SNPs per QTL file - print("Used") - print(gwas_vars$bp_window) - qtl <- get.QTL(data=data2,traits=colnames(data@pheno[i]),bp.window=gwas_vars$bp_window) - qtl_d <- data.frame(qtl) - - #Save QTL info - gwas_vars$gwas_df <- qtl_d - - if(length(qtl$Model) >0){ - rm.qtl <- which(qtl$Model %in% c("diplo-general", "diplo-additive")) - if(length(rm.qtl) > 0){ - warning("QTL detected by the models diplo-general and diplo-additive are not supported in the fit.QTL current version") - qtl <- qtl[-rm.qtl,] - } - - fit.ans_temp <- fit.QTL(data=data2, - trait=input$trait_info, - qtl=qtl[,c("Marker","Model")]) - gwas_vars$fit_qtl <- fit.ans_temp - } else gwas_vars$fit_qtl <- NULL - - #Updating value boxes - output$qtls_detected <- renderValueBox({ - valueBox( - value = length(unique(qtl_d$Position)), - subtitle = "QTLs Detected", - icon = icon("dna"), - color = "info" - ) - }) - #Status updateProgressBar(session = session, id = "pb_gwas", value = 80, title = "GWAS Complete: Now Plotting Results") @@ -525,28 +516,67 @@ mod_gwas_server <- function(input, output, session, parent_session){ #Save manhattan plots gwas_vars$manhattan_plots <- manhattan_plot_list - + phenos[i] <- colnames(data@pheno[i]) } + gwas_data$data2 <- data2 + gwas_data$phenos <- phenos[-which(is.na(phenos))] + #Status updateProgressBar(session = session, id = "pb_gwas", value = 100, status = "success", title = "Finished") - }) # Tables output$gwas_stats <- renderDT({ + #get most significant SNPs per QTL file + lim.d <- max(gwas_vars$LD_plot$data$d) + + validate( + need(gwas_vars$bp_window <= lim.d, paste0("Base pair window larger than maximum distance (",lim.d,"). Reduce window size.")) + ) + if(is.null(input$bp_window_after)) { + line <- gwas_vars$bp_window + } else line <- input$bp_window_after + + qtl <- get.QTL(data=gwas_data$data2,traits=gwas_data$phenos,bp.window=line*1000000) + gwas_vars$gwas_df <- data.frame(qtl) + validate( need(dim(gwas_vars$gwas_df)[1] > 0, "No QTL detected.") ) gwas_vars$gwas_df }, options = list(scrollX = TRUE,autoWidth = FALSE, pageLength = 5)) + #Updating value boxes + output$qtls_detected <- renderValueBox({ + valueBox( + value = length(unique(gwas_vars$gwas_df$Position)), + subtitle = "QTLs Detected", + icon = icon("dna"), + color = "info" + ) + }) + + observe({ + req(gwas_vars$gwas_df) + updatePickerInput(session = session, inputId = "sele_models", choices = unique(gwas_vars$gwas_df$Model), selected = unique(gwas_vars$gwas_df$Model)[1]) + }) + + observe({ + req(gwas_vars$gwas_df) + df <- gwas_vars$gwas_df %>% filter(Model %in% input$sele_models) + updatePickerInput(session = session, inputId = "sele_qtl", choices = unique(paste0(df$Marker, "_", df$Model)), + selected = unique(paste0(df$Marker, "_", df$Model))) + }) + output$gwas_fitqtl <- renderDT({ validate( need(dim(gwas_vars$gwas_df)[1] > 0, "No QTL detected.") ) - rm.qtl <- which(gwas_vars$gwas_df$Model %in% c("diplo-general", "diplo-additive")) + df <- gwas_vars$gwas_df[which(paste0(gwas_vars$gwas_df$Marker, "_", gwas_vars$gwas_df$Model) %in% input$sele_qtl),] + + rm.qtl <- which(df$Model %in% c("diplo-general", "diplo-additive")) if(length(rm.qtl) > 0){ shinyalert( title = "Oops", @@ -565,11 +595,25 @@ mod_gwas_server <- function(input, output, session, parent_session){ ) } - gwas_vars$fit_qtl - }, options = list(scrollX = TRUE,autoWidth = FALSE, pageLength = 5)) + if(length(df$Model) >0){ + rm.qtl <- which(df$Model %in% c("diplo-general", "diplo-additive")) + if(length(rm.qtl) > 0){ + warning("QTL detected by the models diplo-general and diplo-additive are not supported in the fit.QTL current version") + qtl <- df[-rm.qtl,] + } else qtl <- df + validate( + need(dim(qtl)[1] > 0, "No QTL evaluated") + ) + fit.ans_temp <- fit.QTL(data=gwas_data$data2, + trait=input$trait_info, + qtl=qtl[,c("Marker","Model")]) + gwas_vars$fit_qtl <- fit.ans_temp + } else gwas_vars$fit_qtl <- NULL + gwas_vars$fit_qtl + }, options = list(scrollX = TRUE,autoWidth = FALSE, pageLength = 5)) # Plots #Output the manhattan plots @@ -728,14 +772,14 @@ mod_gwas_server <- function(input, output, session, parent_session){ ex <- system.file("iris_passport_file.csv", package = "BIGapp") file.copy(ex, file) }) - + ##Summary Info gwas_summary_info <- function() { #Handle possible NULL values for inputs dosage_file_name <- if (!is.null(input$gwas_file$name)) input$gwas_file$name else "No file selected" passport_file_name <- if (!is.null(input$phenotype_file$name)) input$phenotype_file$name else "No file selected" selected_ploidy <- if (!is.null(input$gwas_ploidy)) as.character(input$gwas_ploidy) else "Not selected" - + #Print the summary information cat( "BIGapp GWAS Summary\n", @@ -766,7 +810,7 @@ mod_gwas_server <- function(input, output, session, parent_session){ sep = "" ) } - + # Popup for analysis summary observeEvent(input$gwas_summary, { showModal(modalDialog( @@ -782,8 +826,8 @@ mod_gwas_server <- function(input, output, session, parent_session){ ) )) }) - - + + # Download Summary Info output$download_gwas_info <- downloadHandler( filename = function() { From d38e38aabaab6aba4ae40df9f91330d95be0c78f Mon Sep 17 00:00:00 2001 From: Cristianetaniguti Date: Wed, 25 Sep 2024 14:57:04 -0400 Subject: [PATCH 15/38] table with all QTL + only one model for fit.qtl #70 --- R/mod_gwas.R | 63 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/R/mod_gwas.R b/R/mod_gwas.R index f05432d..b36cd5b 100644 --- a/R/mod_gwas.R +++ b/R/mod_gwas.R @@ -59,16 +59,17 @@ mod_gwas_ui <- function(id){ tabPanel("Manhattan Plot", withSpinner(plotOutput(ns("manhattan_plot"), height = "500px"))), tabPanel("QQ Plot", withSpinner(plotOutput(ns("qq_plot"), height = "500px"))), tabPanel("BIC Table", withSpinner(DTOutput(ns("bic_table"))),style = "overflow-y: auto; height: 500px"), - tabPanel("Detected QTL", + tabPanel("QTL - significant markers", withSpinner(DTOutput(ns("all_qtl"))),style = "overflow-y: auto; height: 500px"), + tabPanel("Filter QTL by LD window", br(), box( - title = "Filter QTL by LD window",solidHeader = FALSE, width = 12, + title = "LD plot",solidHeader = FALSE, width = 12, withSpinner(plotOutput(ns("LD_plot"), height = "500px")), br(), sliderInput(ns("bp_window_after"), label = "Adjust base pair window here and run analysis again", min = 0, max = 100e6, value = 50, step = 100) ), box( - title = "QTL detected", solidHeader = FALSE, width = 12, + title = "Filtered QTL", solidHeader = FALSE, width = 12, withSpinner(DTOutput(ns('gwas_stats'))) ) ), @@ -80,7 +81,7 @@ mod_gwas_ui <- function(id){ choices = "will be updated", options = list( `actions-box` = TRUE), - multiple = TRUE + multiple = FALSE ), hr(), pickerInput( inputId = ns("sele_qtl"), @@ -190,6 +191,7 @@ mod_gwas_server <- function(input, output, session, parent_session){ gwas_vars <- reactiveValues( gwas_df = NULL, + gwas_df_filt = NULL, fit_qtl = NULL, manhattan_plots = NULL, LD_plot = NULL, @@ -522,11 +524,33 @@ mod_gwas_server <- function(input, output, session, parent_session){ gwas_data$data2 <- data2 gwas_data$phenos <- phenos[-which(is.na(phenos))] + qtl <- get.QTL(data=gwas_data$data2,traits=gwas_data$phenos,bp.window=0) + gwas_vars$gwas_df <- data.frame(qtl) + #Status updateProgressBar(session = session, id = "pb_gwas", value = 100, status = "success", title = "Finished") }) + #Updating value boxes + output$qtls_detected <- renderValueBox({ + valueBox( + value = length(unique(gwas_vars$gwas_df$Position)), + subtitle = "QTLs Detected", + icon = icon("dna"), + color = "info" + ) + }) + # Tables + output$all_qtl <- renderDT({ + #get most significant SNPs per QTL file + validate( + need(dim(gwas_vars$gwas_df)[1] > 0, "No QTL detected.") + ) + gwas_vars$gwas_df + }, options = list(scrollX = TRUE,autoWidth = FALSE, pageLength = 5)) + + output$gwas_stats <- renderDT({ #get most significant SNPs per QTL file lim.d <- max(gwas_vars$LD_plot$data$d) @@ -539,42 +563,33 @@ mod_gwas_server <- function(input, output, session, parent_session){ } else line <- input$bp_window_after qtl <- get.QTL(data=gwas_data$data2,traits=gwas_data$phenos,bp.window=line*1000000) - gwas_vars$gwas_df <- data.frame(qtl) + gwas_vars$gwas_df_filt <- data.frame(qtl) validate( - need(dim(gwas_vars$gwas_df)[1] > 0, "No QTL detected.") + need(dim(gwas_vars$gwas_df_filt)[1] > 0, "No QTL detected.") ) - gwas_vars$gwas_df + gwas_vars$gwas_df_filt }, options = list(scrollX = TRUE,autoWidth = FALSE, pageLength = 5)) - #Updating value boxes - output$qtls_detected <- renderValueBox({ - valueBox( - value = length(unique(gwas_vars$gwas_df$Position)), - subtitle = "QTLs Detected", - icon = icon("dna"), - color = "info" - ) - }) observe({ - req(gwas_vars$gwas_df) - updatePickerInput(session = session, inputId = "sele_models", choices = unique(gwas_vars$gwas_df$Model), selected = unique(gwas_vars$gwas_df$Model)[1]) + req(gwas_vars$gwas_df_filt) + updatePickerInput(session = session, inputId = "sele_models", choices = unique(gwas_vars$gwas_df_filt$Model), selected = unique(gwas_vars$gwas_df_filt$Model)[1]) }) observe({ - req(gwas_vars$gwas_df) - df <- gwas_vars$gwas_df %>% filter(Model %in% input$sele_models) + req(gwas_vars$gwas_df_filt) + df <- gwas_vars$gwas_df_filt %>% filter(Model %in% input$sele_models) updatePickerInput(session = session, inputId = "sele_qtl", choices = unique(paste0(df$Marker, "_", df$Model)), selected = unique(paste0(df$Marker, "_", df$Model))) }) output$gwas_fitqtl <- renderDT({ validate( - need(dim(gwas_vars$gwas_df)[1] > 0, "No QTL detected.") + need(dim(gwas_vars$gwas_df_filt)[1] > 0, "No QTL detected.") ) - df <- gwas_vars$gwas_df[which(paste0(gwas_vars$gwas_df$Marker, "_", gwas_vars$gwas_df$Model) %in% input$sele_qtl),] + df <- gwas_vars$gwas_df_filt[which(paste0(gwas_vars$gwas_df_filt$Marker, "_", gwas_vars$gwas_df_filt$Model) %in% input$sele_qtl),] rm.qtl <- which(df$Model %in% c("diplo-general", "diplo-additive")) if(length(rm.qtl) > 0){ @@ -680,10 +695,10 @@ mod_gwas_server <- function(input, output, session, parent_session){ temp_dir <- tempdir() temp_files <- c() - if (!is.null(gwas_vars$gwas_df)) { + if (!is.null(gwas_vars$gwas_df_filt)) { # Create a temporary file for assignments gwas_file <- file.path(temp_dir, paste0("QTL-statistics-", Sys.Date(), ".csv")) - write.csv(gwas_vars$gwas_df, gwas_file, row.names = FALSE) + write.csv(gwas_vars$gwas_df_filt, gwas_file, row.names = FALSE) temp_files <- c(temp_files, gwas_file) } From 09f001f89fd1d71b0e2aeecc238e049fdc4f1ff8 Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Wed, 25 Sep 2024 16:10:59 -0400 Subject: [PATCH 16/38] Updated QTL infobox --- R/mod_gwas.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/mod_gwas.R b/R/mod_gwas.R index b36cd5b..1071a7c 100644 --- a/R/mod_gwas.R +++ b/R/mod_gwas.R @@ -534,7 +534,7 @@ mod_gwas_server <- function(input, output, session, parent_session){ #Updating value boxes output$qtls_detected <- renderValueBox({ valueBox( - value = length(unique(gwas_vars$gwas_df$Position)), + value = length(unique(gwas_vars$gwas_df_filt$Position)), subtitle = "QTLs Detected", icon = icon("dna"), color = "info" From 6b89d01030f2101f37868f369849299258a6aa53 Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Thu, 26 Sep 2024 10:54:56 -0400 Subject: [PATCH 17/38] Updates to GWAS output --- NAMESPACE | 1 + R/mod_gwas.R | 53 +++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 5dd0ab8..a4c67e0 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -74,6 +74,7 @@ importFrom(graphics,text) importFrom(graphics,title) importFrom(matrixcalc,is.positive.definite) importFrom(plotly,add_markers) +importFrom(plotly,ggplotly) importFrom(plotly,layout) importFrom(plotly,plot_ly) importFrom(plotly,plotlyOutput) diff --git a/R/mod_gwas.R b/R/mod_gwas.R index 1071a7c..766129f 100644 --- a/R/mod_gwas.R +++ b/R/mod_gwas.R @@ -22,7 +22,7 @@ mod_gwas_ui <- function(id){ fileInput(ns("gwas_file"), "Choose VCF File", accept = c(".csv",".vcf",".gz")), fileInput(ns("phenotype_file"), "Choose Passport File", accept = ".csv"), numericInput(ns("gwas_ploidy"), "Species Ploidy", min = 1, value = NULL), - numericInput(ns("bp_window_before"), "Base pair window", min = 0, value = 50), + numericInput(ns("bp_window_before"), "Base pair window (Mb)", min = 0, value = 2), selectInput(ns('gwas_threshold'), label='Significance Threshold Method', choices = c("M.eff","Bonferroni","FDR","permute"), selected="M.eff"), selectInput(ns('trait_info'), label = 'Select Trait (eg. Color):', choices = NULL), virtualSelectInput( @@ -64,9 +64,9 @@ mod_gwas_ui <- function(id){ br(), box( title = "LD plot",solidHeader = FALSE, width = 12, - withSpinner(plotOutput(ns("LD_plot"), height = "500px")), br(), - sliderInput(ns("bp_window_after"), label = "Adjust base pair window here and run analysis again", min = 0, - max = 100e6, value = 50, step = 100) + plotlyOutput(ns("LD_plot"), height = "500px"), br(), + sliderInput(ns("bp_window_after"), label = "Adjust base pair window here to filter QTLs", min = 0, + max = 100, value = 5, step = 1) ), box( title = "Filtered QTL", solidHeader = FALSE, width = 12, @@ -107,7 +107,8 @@ mod_gwas_ui <- function(id){ tags$h3("Save Image"), selectInput(inputId = ns('gwas_figures'), label = 'Figure', choices = c("BIC Plot", "Manhattan Plot", - "QQ Plot")), + "QQ Plot", + "LD Plot")), selectInput(inputId = ns('gwas_image_type'), label = 'File Type', choices = c("jpeg","tiff","png"), selected = "jpeg"), sliderInput(inputId = ns('gwas_image_res'), label = 'Resolution', value = 300, min = 50, max = 1000, step=50), sliderInput(inputId = ns('gwas_image_width'), label = 'Width', value = 9, min = 1, max = 20, step=0.5), @@ -134,6 +135,7 @@ mod_gwas_ui <- function(id){ #' @importFrom stats BIC as.formula lm logLik median model.matrix na.omit prcomp qbeta quantile runif sd setNames #' @importFrom bs4Dash updatebs4TabItems updateBox #' @importFrom shiny updateTabsetPanel +#' @importFrom plotly ggplotly #' @noRd mod_gwas_server <- function(input, output, session, parent_session){ @@ -398,7 +400,7 @@ mod_gwas_server <- function(input, output, session, parent_session){ ) gwas_vars$bp_window <- input$bp_window_before - updateSliderInput(session = session, inputId = "bp_window_after", min = 0, max = round(lim.d,2), value = gwas_vars$bp_window, step = round(lim.d/30,4)) + updateSliderInput(session = session, inputId = "bp_window_after", min = 0, max = round(lim.d,2), value = gwas_vars$bp_window, step = round(lim.d/150,4)) data.loco <- set.K(data,LOCO=F,n.core= as.numeric(cores)) @@ -662,7 +664,7 @@ mod_gwas_server <- function(input, output, session, parent_session){ print(gwas_vars$BIC_ggplot) }) - output$LD_plot <- renderPlot({ + output$LD_plot <- renderPlotly({ validate( need(!is.null(gwas_vars$LD_plot), "Upload the input files, set the parameters and click 'run analysis' to access results in this session.") @@ -678,11 +680,21 @@ mod_gwas_server <- function(input, output, session, parent_session){ } else line <- input$bp_window_after p <- gwas_vars$LD_plot + geom_vline(aes(xintercept=line, color = "bp window"),linetype="dashed") + - theme(legend.title=element_blank(), legend.position="top", text = element_text(size = 15)) + theme(legend.title=element_blank(), legend.position=c(1,1),legend.justification = c(1,1), text = element_text(size = 15)) + + labs(y = "R-squared") updateNumericInput(session = session, inputId = "bp_window_before",value = line) - print(p) + ggplotly(p) %>% + layout( + legend = list( + title = list(text = ''), # Explicitly remove legend title in plotly + x = 1, # X position (right) + y = 1, # Y position (top) + xanchor = 'right', # Anchor the legend at the right + yanchor = 'top' # Anchor the legend at the top + ) + ) }) #Download files for GWAS @@ -694,13 +706,27 @@ mod_gwas_server <- function(input, output, session, parent_session){ # Temporary files list temp_dir <- tempdir() temp_files <- c() - + + if (!is.null(gwas_vars$gwas_df)) { + # Create a temporary file for assignments + gwas_file <- file.path(temp_dir, paste0("QTL-Significant_Markers-statistics-", Sys.Date(), ".csv")) + write.csv(gwas_vars$gwas_df, gwas_file, row.names = FALSE) + temp_files <- c(temp_files, gwas_file) + } + if (!is.null(gwas_vars$gwas_df_filt)) { # Create a temporary file for assignments - gwas_file <- file.path(temp_dir, paste0("QTL-statistics-", Sys.Date(), ".csv")) + gwas_file <- file.path(temp_dir, paste0("QTL-LD-filtered-statistics-", Sys.Date(), ".csv")) write.csv(gwas_vars$gwas_df_filt, gwas_file, row.names = FALSE) temp_files <- c(temp_files, gwas_file) } + + if (!is.null(gwas_vars$fit_qtl)) { + # Create a temporary file for assignments + gwas_file <- file.path(temp_dir, paste0("Multiple-QTL-model-statistics-", Sys.Date(), ".csv")) + write.csv(gwas_vars$fit_qtl, gwas_file, row.names = FALSE) + temp_files <- c(temp_files, gwas_file) + } if (!is.null(gwas_vars$bic_df)) { # Create a temporary file for BIC data frame @@ -748,6 +774,11 @@ mod_gwas_server <- function(input, output, session, parent_session){ req(gwas_vars$BIC_ggplot) print(gwas_vars$BIC_ggplot) + } else if (input$gwas_figures == "LD Plot") { + req(gwas_vars$LD_plot) + #Plot + print(gwas_vars$LD_plot) + } else if (input$gwas_figures == "Manhattan Plot") { req(gwas_vars$manhattan_plots, input$model_select) #Plot From b250f931fadf7f2c02c562a4669fc064f7fe140f Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Wed, 2 Oct 2024 12:19:37 -0400 Subject: [PATCH 18/38] Removed dosage2vcf button --- 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 5b13655..9c0b18b 100644 --- a/R/mod_dosage2vcf.R +++ b/R/mod_dosage2vcf.R @@ -20,7 +20,7 @@ mod_dosage2vcf_ui <- function(id){ fileInput(ns("counts_file"), "Choose DArT Counts File", accept = c(".csv")), textInput(ns("d2v_output_name"), "Output File Name"), numericInput(ns("dosage2vcf_ploidy"), "Species Ploidy", min = 1, value = NULL), - actionButton(ns("run_analysis"), "Run Analysis"), + #actionButton(ns("run_analysis"), "Run Analysis"), useShinyjs(), downloadButton(ns('download_d2vcf'), "Download VCF File", class = "butt"), div(style="display:inline-block; float:right",dropdownButton( From 550043368a53cf52d0778a89c3da38815ae73538 Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Tue, 15 Oct 2024 11:33:35 -0400 Subject: [PATCH 19/38] Generalized dosage2vcf tab --- R/app_ui.R | 2 +- R/mod_dosage2vcf.R | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/R/app_ui.R b/R/app_ui.R index 0ed8546..fdb3238 100644 --- a/R/app_ui.R +++ b/R/app_ui.R @@ -50,7 +50,7 @@ app_ui <- function(request) { tags$li(class = "header", style = "color: grey; margin-top: 10px; margin-bottom: 10px; padding-left: 15px;", "Menu"), menuItem("Home", tabName = "welcome", icon = icon("house"),startExpanded = FALSE), tags$li(class = "header", style = "color: grey; margin-top: 18px; margin-bottom: 10px; padding-left: 15px;", "Genotype Processing"), - menuItem("DArT Report2VCF", tabName = "dosage2vcf", icon = icon("share-from-square")), + menuItem("Convert to VCF", tabName = "dosage2vcf", icon = icon("share-from-square")), menuItem("Updog Dosage Calling", tabName = "updog", icon = icon("list-ol")), menuItem("VCF Filtering", tabName = "filtering", icon = icon("filter")), tags$li(class = "header", style = "color: grey; margin-top: 18px; margin-bottom: 10px; padding-left: 15px;", "Summary Metrics"), diff --git a/R/mod_dosage2vcf.R b/R/mod_dosage2vcf.R index 9c0b18b..cdd02d7 100644 --- a/R/mod_dosage2vcf.R +++ b/R/mod_dosage2vcf.R @@ -16,8 +16,18 @@ mod_dosage2vcf_ui <- function(id){ fluidRow( box( title = "Inputs", status = "info", solidHeader = TRUE, collapsible = FALSE, collapsed = FALSE, - fileInput(ns("report_file"), "Choose DArT Dose Report File", accept = c(".csv")), - fileInput(ns("counts_file"), "Choose DArT Counts File", accept = c(".csv")), + selectInput(ns('file_type'), label = 'Select File Format', choices = c("DArT Dosage Reports","AgriSeq")), + 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")), + ), + conditionalPanel(condition = "input.file_type == 'AgriSeq'", + ns = ns, + "Support for this file type is in-progress", + "", + #fileInput(ns("agriseq_file"), "Choose Input File", accept = c(".csv")) + ), textInput(ns("d2v_output_name"), "Output File Name"), numericInput(ns("dosage2vcf_ploidy"), "Species Ploidy", min = 1, value = NULL), #actionButton(ns("run_analysis"), "Run Analysis"), From c1c7b48bc7bf2e5e11d015640b16d24ef2089f6d Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Fri, 25 Oct 2024 15:55:13 -0400 Subject: [PATCH 20/38] Updated Y-axis label --- R/mod_GSAcc.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/mod_GSAcc.R b/R/mod_GSAcc.R index 560fe17..6129e48 100644 --- a/R/mod_GSAcc.R +++ b/R/mod_GSAcc.R @@ -639,7 +639,7 @@ mod_GSAcc_server <- function(input, output, session, parent_session){ facet_wrap(~ Trait, nrow = 1) + # Facet by trait, allowing different y-scales labs(title = "Predictive Ability by Trait", x = " ", - y = "Pearson Correlation") + + y = "Predictive Ability") + #theme_minimal() + # Using a minimal theme theme(legend.position = "none", strip.text = element_text(size = 12), @@ -656,7 +656,7 @@ mod_GSAcc_server <- function(input, output, session, parent_session){ facet_wrap(~ Trait, nrow = 1) + # Facet by trait, allowing different y-scales labs(title = "Predictive Ability by Trait", x = " ", # x-label is blank because it's not relevant per facet - y = "Pearson Correlation") + + y = "Predictive Ability") + theme(legend.position = "none", strip.text = element_text(size = 12), axis.text = element_text(size = 12), From 9b3adad830c94435020c9277c6e46fdce85ec83f Mon Sep 17 00:00:00 2001 From: Alexander Sandercock <39815775+alex-sandercock@users.noreply.github.com> Date: Wed, 20 Nov 2024 08:37:48 -0500 Subject: [PATCH 21/38] Update logo on README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 09ca3c4..3bad278 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Development](https://img.shields.io/badge/development-active-blue.svg)](https://img.shields.io/badge/development-active-blue.svg) -# (B)reeding (I)nsight (G)enomics app +# (B)reeding (I)nsight (G)enomics app Currently, Breeding Insight provides bioinformatic processing support for our external collaborators. This R shiny app will provide a web-based user friendly way for our internal and external collaborators to analyze genomic data without needing to use command-line tools. From 7045dac1ea46a73eb375be4c40d8097d0ad319e1 Mon Sep 17 00:00:00 2001 From: Cristianetaniguti Date: Fri, 6 Dec 2024 10:31:23 -0500 Subject: [PATCH 22/38] function docs + input files exceptions --- R/MyFun_BIC_Meng.R | 6 ++--- R/utils.R | 38 +++++++++++++++++++------------- tests/testthat/test-DosageCall.R | 1 + 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/R/MyFun_BIC_Meng.R b/R/MyFun_BIC_Meng.R index 084b51b..aae20da 100644 --- a/R/MyFun_BIC_Meng.R +++ b/R/MyFun_BIC_Meng.R @@ -43,9 +43,9 @@ #' function for BIC calculation #' -#' @param y describe documentation -#' @param PC describe documentation -#' @param K describe documentation +#' @param y length N vector +#' @param PC matrix of principal components with N rows and P columns +#' @param K kinship matrix with N rows and N columns #' #' @import rrBLUP #' @importFrom MASS ginv diff --git a/R/utils.R b/R/utils.R index 975e339..9e78b21 100644 --- a/R/utils.R +++ b/R/utils.R @@ -4,7 +4,11 @@ get_counts <- function(madc_file, output_name) { # Note: This assumes that the first 7 rows are not useful here like in the Strawberry DSt23-8501_MADC file # Read the madc file - madc_df <- read.csv(madc_file, sep = ',', skip = 7, check.names = FALSE) + madc_df <- read.csv(madc_file, sep = ',', check.names = FALSE, header = FALSE) + header <- grep("AlleleID", madc_df[,1]) + if(header > 1) madc_df <- madc_df[-c(1:(grep("AlleleID", madc_df[,1]))-1),] + colnames(madc_df) <- madc_df[1,] + madc_df <- madc_df[-1,] # Retain only the Ref and Alt haplotypes filtered_df <- madc_df[!grepl("\\|AltMatch|\\|RefMatch", madc_df$AlleleID), ] @@ -21,23 +25,23 @@ get_counts <- function(madc_file, output_name) { #Add functionality here to stop the script if indentical() is False get_matrices <- function(result_df) { #This function takes the dataframe of ref and alt counts for each sample, and converts them to ref, alt, and size(total count) matrices for Updog - + update_df <- result_df - + # Filter rows where 'AlleleID' ends with 'Ref' ref_df <- subset(update_df, grepl("Ref$", AlleleID)) - + # Filter rows where 'AlleleID' ends with 'Alt' alt_df <- subset(update_df, grepl("Alt$", AlleleID)) - + #Ensure that each has the same SNPs and that they are in the same order same <- identical(alt_df$CloneID,ref_df$CloneID) - + ###Convert the ref and alt counts into matrices with the CloneID as the index #Set SNP names as index row.names(ref_df) <- ref_df$CloneID row.names(alt_df) <- alt_df$CloneID - + #Retain only the rows in common if they are not identical and provide warning if (same == FALSE) { warning("Mismatch between Ref and Alt Markers. MADC likely altered. Markers without a Ref or Alt match removed.") @@ -47,26 +51,30 @@ get_matrices <- function(result_df) { ref_df <- ref_df[common_ids, ] alt_df <- alt_df[common_ids, ] } - + #Remove unwanted columns and convert to matrix - ref_matrix <- as.matrix(ref_df[, -c(1:16)]) - alt_matrix <- as.matrix(alt_df[, -c(1:16)]) - + rm.col <- c("AlleleID", "CloneID", "AlleleSequence", "ClusterConsensusSequence", + "CallRate", "OneRatioRef", "OneRatioSnp", "FreqHomRef", "FreqHomSnp", + "FreqHets", "PICRef", "PICSnp", "AvgPIC", "AvgCountRef", "AvgCountSnp","RatioAvgCountRefAvgCountSnp") + + ref_matrix <- as.matrix(ref_df[, -which(colnames(ref_df) %in% rm.col)]) + alt_matrix <- as.matrix(alt_df[, -which(colnames(alt_df) %in% rm.col)]) + #Convert elements to numeric class(ref_matrix) <- "numeric" class(alt_matrix) <- "numeric" - + #Make the size matrix by combining the two matrices size_matrix <- (ref_matrix + alt_matrix) - + #Count the number of cells with 0 count to estimate missing data # Count the number of cells with the value 0 count_zeros <- sum(size_matrix == 0) - + # Print the result ratio_missing_data <- count_zeros / length(size_matrix) cat("Ratio of missing data =", ratio_missing_data, "\n") - + # Return the ref and alt matrices as a list matrices_list <- list(ref_matrix = ref_matrix, size_matrix = size_matrix) return(matrices_list) diff --git a/tests/testthat/test-DosageCall.R b/tests/testthat/test-DosageCall.R index b49b881..a3ac1d0 100644 --- a/tests/testthat/test-DosageCall.R +++ b/tests/testthat/test-DosageCall.R @@ -6,6 +6,7 @@ context("Dosage Calling") test_that("Dosage Calling from MADC file",{ madc_file <- system.file("iris_DArT_MADC.csv", package="BIGapp") + output_name <- "output" ploidy <- 2 cores <- 2 From 09fd245bae7912c8c048487d4393700a1b0edc3e Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Fri, 13 Dec 2024 16:02:53 -0500 Subject: [PATCH 23/38] UI and Logo Updates --- DESCRIPTION | 7 +++---- R/app_ui.R | 10 +++++----- R/mod_DosageCall.R | 7 ++++--- R/mod_GS.R | 2 +- R/mod_GSAcc.R | 2 +- R/mod_Home.R | 10 +++++----- R/mod_PCA.R | 11 +++++------ R/mod_gwas.R | 2 +- inst/app/www/BIG_R_logo.png | Bin 15503 -> 66561 bytes inst/app/www/BIG_logo_edit.png | Bin 286631 -> 0 bytes inst/app/www/favicon.ico | Bin 15406 -> 15406 bytes inst/app/www/golem_favicon.ico | Bin 3774 -> 0 bytes 12 files changed, 25 insertions(+), 26 deletions(-) delete mode 100644 inst/app/www/BIG_logo_edit.png delete mode 100644 inst/app/www/golem_favicon.ico diff --git a/DESCRIPTION b/DESCRIPTION index 0c33326..dca0ab1 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: BIGapp Title: Breeding Insight Genomics Shiny Application -Version: 0.6.2 +Version: 1.0.0 Authors@R: c( person(c("Alexander", "M."), "Sandercock", @@ -20,10 +20,9 @@ Authors@R: role = "aut"), person("Breeding Insight Team", role = "aut")) -Description: This R shiny app provides a web-based user friendly way for our internal and - external collaborators to analyze genomic data without needing to use command-line tools. +Description: This R shiny app provides a web-based user friendly way for researchers to analyze genomic data without needing to use command-line tools. Initial supported analyses will include the mature genomics/bioinformatics pipelines developed - within Breeding Insight, with additional analyses continuing to be added. + within Breeding Insight, with additional analyses continuing to be added. Both diploid and polyploid species are supported. License: Apache License (== 2.0) Encoding: UTF-8 Roxygen: list(markdown = TRUE) diff --git a/R/app_ui.R b/R/app_ui.R index fdb3238..2530d33 100644 --- a/R/app_ui.R +++ b/R/app_ui.R @@ -71,10 +71,10 @@ app_ui <- function(request) { icon = icon("angles-right")), tags$li(class = "header", style = "color: grey; margin-top: 18px; margin-bottom: 10px; padding-left: 15px;", "Information"), menuItem("Source Code", icon = icon("circle-info"), href = "https://www.github.com/Breeding-Insight/Genomics_Shiny_App"), - menuItem( - span("Job Queue", bs4Badge("demo", position = "right", color = "warning")), - tabName = "slurm", - icon = icon("clock")), + #menuItem( + # span("Job Queue", bs4Badge("demo", position = "right", color = "warning")), + # tabName = "slurm", + # icon = icon("clock")), menuItem("Help", tabName = "help", icon = icon("circle-question")) ) ), @@ -98,7 +98,7 @@ app_ui <- function(request) { ), left = div( style = "display: flex; align-items: center; height: 100%;", # Center the version text vertically - "v0.6.2") + "v1.0.0") ), dashboardBody( disconnectMessage(), #Adds generic error message for any error if not already accounted for diff --git a/R/mod_DosageCall.R b/R/mod_DosageCall.R index aaab7af..bc4d99a 100644 --- a/R/mod_DosageCall.R +++ b/R/mod_DosageCall.R @@ -19,8 +19,9 @@ mod_DosageCall_ui <- function(id){ fluidRow( box( title = "Inputs", status = "info", solidHeader = TRUE, collapsible = FALSE, collapsed = FALSE, - fileInput(ns("madc_file"), "Choose MADC or VCF File", accept = c(".csv",".vcf",".gz")), - fileInput(ns("madc_passport"), "Choose Passport File (optional)", accept = c(".csv")), + "* Required", + fileInput(ns("madc_file"), "Choose MADC or VCF File*", accept = c(".csv",".vcf",".gz")), + fileInput(ns("madc_passport"), "Choose Trait File", accept = c(".csv")), conditionalPanel( condition = "output.passportTablePopulated", ns = ns, @@ -161,7 +162,7 @@ mod_DosageCall_server <- function(input, output, session, parent_session){ # Update dropdown menu choices based on uploaded passport file passport_table <- reactive({ validate( - need(!is.null(input$madc_passport), "Upload passport file to access results in this section."), + need(!is.null(input$madc_passport), "Upload Trait File to access results in this section."), ) info_df <- read.csv(input$madc_passport$datapath, header = TRUE, check.names = FALSE) info_df[,1] <- as.character(info_df[,1]) #Makes sure that the sample names are characters instead of numeric diff --git a/R/mod_GS.R b/R/mod_GS.R index 6ff4c37..3032403 100644 --- a/R/mod_GS.R +++ b/R/mod_GS.R @@ -21,7 +21,7 @@ mod_GS_ui <- function(id){ column(width = 3, box(title="Inputs", width = 12, collapsible = TRUE, collapsed = FALSE, status = "info", solidHeader = TRUE, fileInput(ns("pred_known_file"), "Choose Training VCF File", accept = c(".csv",".vcf",".gz")), - fileInput(ns("pred_trait_file"), "Choose Passport File", accept = ".csv"), + fileInput(ns("pred_trait_file"), "Choose Trait File", accept = ".csv"), fileInput(ns("pred_est_file"), "Choose Prediction VCF File", accept = c(".csv",".vcf",".gz")), numericInput(ns("pred_est_ploidy"), "Species Ploidy", min = 1, value = NULL), virtualSelectInput( diff --git a/R/mod_GSAcc.R b/R/mod_GSAcc.R index 6129e48..fa8492c 100644 --- a/R/mod_GSAcc.R +++ b/R/mod_GSAcc.R @@ -21,7 +21,7 @@ mod_GSAcc_ui <- function(id){ column(width = 3, box(title="Inputs", width = 12, collapsible = TRUE, collapsed = FALSE, status = "info", solidHeader = TRUE, fileInput(ns("pred_file"), "Choose VCF File", accept = c(".csv",".vcf",".gz")), - fileInput(ns("trait_file"), "Choose Passport File", accept = ".csv"), + fileInput(ns("trait_file"), "Choose Trait File", accept = ".csv"), numericInput(ns("pred_ploidy"), "Species Ploidy", min = 1, value = NULL), numericInput(ns("pred_cv"), "Iterations", min = 1, max=20, value = 5), virtualSelectInput( diff --git a/R/mod_Home.R b/R/mod_Home.R index 9dd0b8e..7e38e2a 100644 --- a/R/mod_Home.R +++ b/R/mod_Home.R @@ -20,17 +20,17 @@ mod_Home_ui <- function(id){ box( title = "Breeding Insight Genomics App", status = "info", solidHeader = FALSE, width = 12, collapsible = FALSE, HTML( - "The app is under development -

Breeding Insight provides bioinformatic processing support for our external collaborators. This R shiny app provides a web-based user friendly way for users to analyze genomic data without needing to use command-line tools.

+ "

The BIGapp is a user-friendly tool for processing low to mid-density genotyping data for diploid and polyploid species. This R shiny app provides a web-based user friendly way for users to analyze genomic data without needing to use command-line tools. + Additional analysis will be added, with the initial focus on a core set of features for supporting breeding decisions.

Supported Analyses

Initial supported analyses includes the mature genomics/bioinformatics pipelines developed within Breeding Insight:
    -
  • Genotype processing
  • -
  • Summary metrics
  • +
  • Genotype Processing
  • +
  • Summary Metrics
  • Population Structure
  • GWAS
  • -
  • GS
  • +
  • Genomic Selection
" ), style = "overflow-y: auto; height: 500px" diff --git a/R/mod_PCA.R b/R/mod_PCA.R index b9a56ed..106931f 100644 --- a/R/mod_PCA.R +++ b/R/mod_PCA.R @@ -26,7 +26,7 @@ mod_PCA_ui <- function(id){ title = "Inputs", width = 12, solidHeader = TRUE, status = "info", p("* Required"), fileInput(ns("dosage_file"), "Choose VCF File*", accept = c(".csv",".vcf",".gz")), - fileInput(ns("passport_file"), "Choose Passport File (Sample IDs in first column)", accept = c(".csv")), + fileInput(ns("passport_file"), "Choose Trait File (IDs in first column)", accept = c(".csv")), #Dropdown will update after passport upload numericInput(ns("pca_ploidy"), "Species Ploidy*", min = 2, value = NULL), actionButton(ns("pca_start"), "Run Analysis"), @@ -35,7 +35,7 @@ mod_PCA_ui <- function(id){ tags$h3("PCA Inputs"), "You can download examples of the expected files here: \n", downloadButton(ns('download_vcf'), "Download VCF Example File"), - downloadButton(ns('download_pheno'), "Download Passport Example File"),hr(), + downloadButton(ns('download_pheno'), "Download Trait Example File"),hr(), actionButton(ns("pca_summary"), "Summary"), circle = FALSE, status = "warning", @@ -46,9 +46,8 @@ mod_PCA_ui <- function(id){ ), box( title = "Plot Controls", status = "warning", solidHeader = TRUE, collapsible = TRUE,collapsed = FALSE, width = 12, - "Change the PCA plot parameters", br(), - selectInput(ns('group_info'), label = 'Color Variable (eg, Taxon)', choices = NULL), - materialSwitch(ns('use_cat'), label = "Color Specific Category Within Variable?", status = "success"), + selectInput(ns('group_info'), label = 'Color Variable', choices = NULL), + materialSwitch(ns('use_cat'), label = "Color Category", status = "success"), conditionalPanel(condition = "input.use_cat", ns = ns, virtualSelectInput( @@ -89,7 +88,7 @@ mod_PCA_ui <- function(id){ ) ), column(width = 8, - box(title = "Passport Data", width = 12, solidHeader = TRUE, collapsible = TRUE, status = "info", collapsed = FALSE, maximizable = T, + box(title = "Trait Data", width = 12, solidHeader = TRUE, collapsible = TRUE, status = "info", collapsed = FALSE, maximizable = T, DTOutput(ns('passport_table')), style = "overflow-y: auto; height: 480px" ), diff --git a/R/mod_gwas.R b/R/mod_gwas.R index 766129f..908b497 100644 --- a/R/mod_gwas.R +++ b/R/mod_gwas.R @@ -20,7 +20,7 @@ mod_gwas_ui <- function(id){ column(width = 3, box(title="Inputs", width = 12, collapsible = TRUE, collapsed = FALSE, status = "info", solidHeader = TRUE, fileInput(ns("gwas_file"), "Choose VCF File", accept = c(".csv",".vcf",".gz")), - fileInput(ns("phenotype_file"), "Choose Passport File", accept = ".csv"), + fileInput(ns("phenotype_file"), "Choose Trait File", accept = ".csv"), numericInput(ns("gwas_ploidy"), "Species Ploidy", min = 1, value = NULL), numericInput(ns("bp_window_before"), "Base pair window (Mb)", min = 0, value = 2), selectInput(ns('gwas_threshold'), label='Significance Threshold Method', choices = c("M.eff","Bonferroni","FDR","permute"), selected="M.eff"), diff --git a/inst/app/www/BIG_R_logo.png b/inst/app/www/BIG_R_logo.png index f654b759b2ed19f2d26e4e4e08064b733289cc9a..0599b1e78a0377ec57af2da07e1e514718f01d23 100644 GIT binary patch literal 66561 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 Ef0N)07XSbN literal 15503 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 diff --git a/inst/app/www/BIG_logo_edit.png b/inst/app/www/BIG_logo_edit.png deleted file mode 100644 index 0c2b780c98bd79556388f7394c363cfb6f68d65c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286631 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

&f<0 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%0DZsj@87>#XHR8>$P&4G#zX*vcLN2)uUNAjp#)$ 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 LRj??k+{#=PxvZYZ=-blWGyf&&( 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 RULt@mSt&)yDskhW{{vHi3daBd diff --git a/inst/app/www/favicon.ico b/inst/app/www/favicon.ico index ca0b26c936ab145fee18b2f44b4a08f1f824c10e..c301bc16179e693ab45d0e715c8375de2499714e 100644 GIT binary patch literal 15406 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 literal 15406 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 DE6ynk diff --git a/inst/app/www/golem_favicon.ico b/inst/app/www/golem_favicon.ico deleted file mode 100644 index 4c0982c026551c9cf45043e2a9ce56f58ef9a817..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3774 zcmbVPdr(y872nKcrvJ2QC*wGsRAiTzSg?>?a93a#c7X+#W!dKiG!!9-K;-=tQB24B zjCRt*m|)Ua)YO>z3>9P*6txqRm>Lrwkkqj?lGd6A&{ie}em&`PU%m*_j3tXjwR`&S-$5?iV3ruH0Kv-77nWteuL2Tvk3J369Jwf8iNx?pg_C@Un11n zg#g12#6@X_9j2)Bj>JXbQ(;Rwo-<6^9}w@0DREHU3ECgZgw41bagC{=eChg;Ch9`4U4EoO_qa5%z9u#X7=ovt; z`!ht^Phg(w27=swC(e5^-g^ji-$Crs_mG?SD})Pw7Waa(zJkC06{w>#usA;M4q-2| z8nv^Sm10PDnzWsX20Q!>yPAHz4!<7_se`}5#7Tb%M zn>j-9agBz=dW8|b%JXkAW)Bf@?XD)%4?%iGYhaT^i~KE-_d#j&&Z z;rMwT!tHn-+jHF@t|3oyEDo2ifZMqPb3MZ%HrFOl7(l3-&PTXEu49>F=erZ=`4V9c zsu{%=MDl{H+febo>l&^3Zu#!j6ZX5v^=!kj%3`>aV@GJ9v%VbF*^T&#K;bA`C*4w203P-icl^A%BMKR?@F5UF1erR9CmhT~INE~0s9B~H|p zGvC+D*HK@I_UdAkJ60e(PL=*fq-t`vW$tr*X*y^i?nt8lup3P;M8p{KEe za<0OuRn>Sd+l}zVRW{O}SP5 zFCTGsjPdf!!`o1WSMqZ(KdK5!C-=f2l(tVOr@zv<_L0o@e+d4L&!LVg#IcGMV%(BH z=OAJd)^T5cqkNw2wS2xl4#`%UPc@W5tI3AH{Wby|x3DCC6;g6`BeV1{QkT2{WyTEz zIB&xhFW?NFkK`wx8C%9Tdi)#sdYWpH^kghlj(*Ht`~l{~?t;Jh43w#7@I>tEP}y%G z$kmSmQv%haW`=wf)8^ORSc_*8^$1RA_4Nk#2j5|FaIetc7~K|Z6dYo`<#|c6FTYB@ zFMOVq-}HQZm(H%K!+Jr0()uy=*n@FCCCNdlJ!r|x#_83yQ|88;%*Qq3+I<_J6k~T| zC5r5&2uVGKS;?32gL;bls+0Qq@6p%MhQ9VTeDM0K_|)5h58r6T<^6Bq>d}KZy?z}&errG8Yk3Km_O;^Nw$11u z-*Fs~&le--N8b+jURs`ucB-LQ&dGdRHsIoGE%@loeYke?FnVZx{p}-^?_R?GEqaf) zp=Z;2TyHxja&Zi7Bj;mGzW+N5bNPLApWcD?Omkd!jmL_;D+_Uw&PK}LySk2Y+&~z= zME5V&im{)2ZWG?$^)kBFHR1gBt>W4K@%e2yw|$EkpSP*rcgB<#W9@mS5H)Tq1aq91 zxNQ86PccNzvYB+tvdsEBP1z3W70Q)s!uN$_F!+U@=akpt+hpcqU&bJ;9fbLPIfo?Eo+K*LjoNT) z!ost~HuG@n%H?9L(iu<1$9tU597-e{XEtbZ={xeBwb{j+3+yu$mZY0%mUB{VXPe^G<+&E)_2wl`94IeA*Qy$Eyj4+xXP3IL z%wp^#n@XzDcmAH2_?c7AYu0O2RQJ_+X{Lu8as+J3%|w2hX_R!$v=<=x@hta~>t`a% zed(L^QL4YvnHY0``u32`qz$kd7k;Pz$8fWG0H@;zp!ngysN#DA!-_`+ZYmTN>lBI~ W%_N?g*f7>j!engbU@no9xc>v_w5JCE From 84582bf82f466bf7429e8ad950dc1729200199b5 Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Wed, 18 Dec 2024 13:44:23 -0500 Subject: [PATCH 24/38] Added Updates Info Button --- DESCRIPTION | 2 ++ NAMESPACE | 5 +++ R/app_server.R | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++ R/app_ui.R | 6 ++++ 4 files changed, 97 insertions(+) diff --git a/DESCRIPTION b/DESCRIPTION index dca0ab1..f15c1dd 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -31,6 +31,7 @@ biocViews: Imports: vcfR (>= 1.15.0), adegenet, + curl, DT, dplyr, bs4Dash, @@ -50,6 +51,7 @@ Imports: GWASpoly, AGHmatrix, factoextra, + httr, future, shinycssloaders, RColorBrewer, diff --git a/NAMESPACE b/NAMESPACE index a4c67e0..2f9add2 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -50,6 +50,8 @@ importFrom(bs4Dash,updatebs4TabItems) importFrom(bs4Dash,valueBox) importFrom(bs4Dash,valueBoxOutput) importFrom(config,get) +importFrom(curl,curl_fetch_memory) +importFrom(curl,new_handle) importFrom(factoextra,get_eigenvalue) importFrom(future,availableCores) importFrom(golem,activate_js) @@ -72,6 +74,9 @@ importFrom(graphics,strheight) importFrom(graphics,strwidth) importFrom(graphics,text) importFrom(graphics,title) +importFrom(httr,GET) +importFrom(httr,content) +importFrom(httr,status_code) importFrom(matrixcalc,is.positive.definite) importFrom(plotly,add_markers) importFrom(plotly,ggplotly) diff --git a/R/app_server.R b/R/app_server.R index c74809a..ae734bf 100644 --- a/R/app_server.R +++ b/R/app_server.R @@ -3,6 +3,8 @@ #' @param input,output,session Internal parameters for {shiny}. #' DO NOT REMOVE. #' @import shiny +#' @importFrom httr GET content status_code +#' @importFrom curl new_handle curl_fetch_memory #' @noRd app_server <- function(input, output, session) { # Your application server logic @@ -68,6 +70,88 @@ app_server <- function(input, output, session) { ) )) }) + + #Check for updates from GitHub for BIGapp + get_latest_github_commit <- function(repo, owner) { + url <- paste0("https://api.github.com/repos/", owner, "/", repo, "/commits/main") + response <- GET(url) + content <- content(response, "parsed") + + if (status_code(response) == 200) { + return(content$sha) + } else { + return(NULL) + } + } + + is_internet_connected <- function() { + handle <- new_handle() + success <- tryCatch({ + curl_fetch_memory("https://www.google.com", handle = handle) + TRUE + }, error = function(e) { + FALSE + }) + return(success) + } + + observeEvent(input$updates_info_button, { + # Check internet connectivity + if (!is_internet_connected()) { + # Display internet connectivity issues message + showModal(modalDialog( + title = "No Internet Connection", + easyClose = TRUE, + footer = tagList( + modalButton("Close") + ), + "Please check your internet connection and try again." + )) + return() + } + + package_name <- "BIGapp" + repo_name <- "BIGapp" # GitHub repo name + repo_owner <- "Breeding-Insight" # User or organization name + + # Get the installed version + installed_version <- as.character(packageVersion(package_name)) + + # Get the latest version from GitHub (can be tag version or latest commit) + latest_commit <- get_latest_github_commit(repo_name, repo_owner) + + # Compare versions and prepare message + if (latest_commit > installed_version) { + update_status <- "A new version is available. Please update your package." + # Prepare styled HTML text for the modal + message_html <- paste( + "Installed version:", installed_version, "
", + #"Latest version commit SHA:", latest_commit, "
", + "A new version is available on GitHub!
", + "Please update your package." + ) + } else { + update_status <- "Your package is up-to-date!" + # Prepare non-styled text for no update needed + message_html <- paste( + "Installed version:", installed_version, "
", + #"Latest version commit SHA:", latest_commit, "
", + update_status + ) + } + + # Display message in a Shiny modal + showModal(modalDialog( + title = "BIGapp Updates", + size = "m", + easyClose = TRUE, + footer = tagList( + modalButton("Close") + ), + # Use HTML to format the message and include styling + HTML(message_html) + )) + }) #Download Session Info output$download_session_info <- downloadHandler( diff --git a/R/app_ui.R b/R/app_ui.R index 2530d33..de39c5d 100644 --- a/R/app_ui.R +++ b/R/app_ui.R @@ -34,6 +34,12 @@ app_ui <- function(request) { href = "#", "Session Info", onclick = "Shiny.setInputValue('session_info_button', Math.random())" + ), + tags$a( + class = "dropdown-item", + href = "#", + "Check for Updates", + onclick = "Shiny.setInputValue('updates_info_button', Math.random())" ) ) ) From e3fe9491a1fc1e0b73df8a5b6c309b95979951b2 Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Thu, 19 Dec 2024 09:41:08 -0500 Subject: [PATCH 25/38] UI Updates --- R/app_ui.R | 4 +-- R/mod_DosageCall.R | 9 +++--- R/mod_GS.R | 81 +++++++++++++++++++++++++++++++++++++++++++++- R/mod_GSAcc.R | 2 +- R/mod_dosage2vcf.R | 77 ++++++++++++++++++++++--------------------- R/mod_gwas.R | 4 +-- 6 files changed, 129 insertions(+), 48 deletions(-) diff --git a/R/app_ui.R b/R/app_ui.R index de39c5d..37f0d29 100644 --- a/R/app_ui.R +++ b/R/app_ui.R @@ -68,11 +68,11 @@ app_ui <- function(request) { menuItem("GWASpoly", tabName = "gwas", icon = icon("think-peaks")), tags$li(class = "header", style = "color: grey; margin-top: 18px; margin-bottom: 10px; padding-left: 15px;", "Genomic Selection"), menuItem( - span("Predictive Ability", bs4Badge("beta", position = "right", color = "success")), + span("Predictive Ability"), tabName = "prediction_accuracy", icon = icon("right-left")), menuItem( - span("Genomic Prediction", bs4Badge("beta", position = "right", color = "success")), + span("Genomic Prediction"), tabName = "prediction", icon = icon("angles-right")), tags$li(class = "header", style = "color: grey; margin-top: 18px; margin-bottom: 10px; padding-left: 15px;", "Information"), diff --git a/R/mod_DosageCall.R b/R/mod_DosageCall.R index bc4d99a..638ca26 100644 --- a/R/mod_DosageCall.R +++ b/R/mod_DosageCall.R @@ -97,12 +97,11 @@ mod_DosageCall_ui <- function(id){ tooltip = tooltipOptions(title = "Click to see info!") )) ), - valueBoxOutput(ns("MADCsnps")) - ), - - fluidRow( - box(title = "Status", width = 3, collapsible = TRUE, status = "info", + column(width=4, + valueBoxOutput(ns("MADCsnps"), width=12), + box(title = "Status", width = 12, collapsible = TRUE, status = "info", progressBar(id = ns("pb_madc"), value = 0, status = "info", display_pct = TRUE, striped = TRUE, title = " ") + ) ) ) ) diff --git a/R/mod_GS.R b/R/mod_GS.R index 3032403..f59a45d 100644 --- a/R/mod_GS.R +++ b/R/mod_GS.R @@ -52,7 +52,14 @@ mod_GS_ui <- function(id){ status = "warning", icon = icon("info"), width = "300px", tooltip = tooltipOptions(title = "Click to see info!") - )) + )), + tags$hr(style="border-color: #d3d3d3; margin-top: 20px; margin-bottom: 20px;"), # Lighter grey line + div(style="text-align: left; margin-top: 10px;", + actionButton(ns("advanced_options_pred"), + label = HTML(paste(icon("cog", style = "color: #007bff;"), "Advanced Options (beta)")), + style = "background-color: transparent; border: none; color: #007bff; font-size: smaller; text-decoration: underline; padding: 0;" + ) + ) ) ), @@ -105,6 +112,78 @@ mod_GS_ui <- function(id){ mod_GS_server <- function(input, output, session, parent_session){ ns <- session$ns + + #Default model choices + advanced_options_pred <- reactiveValues( + pred_model = "GBLUP", + pred_matrix = "Gmatrix", + 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)) { + paste("Previously uploaded file:", advanced_options_pred$ped_file$name) + } else { + "" # Return an empty string if no file has been uploaded + } + }) + + #UI popup window for input + observeEvent(input$advanced_options_pred, { + showModal(modalDialog( + title = "Advanced Options (beta)", + selectInput( + inputId = ns('pred_model'), + label = 'Model Choice', + choices = c("GBLUP"), + selected = advanced_options_pred$pred_model # Initialize with stored value + ), + conditionalPanel( + condition = "input.pred_model == 'GBLUP'", ns = ns, + div( + selectInput( + inputId = ns('pred_matrix'), + label = 'GBLUP Matrix Choice', + choices = c("Gmatrix", "Amatrix", "Hmatrix"), + selected = advanced_options_pred$pred_matrix # Initialize with stored value + ) + ) + ), + conditionalPanel( + condition = "input.pred_matrix != 'Gmatrix'", ns = ns, + div( + fileInput(ns("ped_file"), "Choose Pedigree File", accept = ".csv"), + conditionalPanel( + condition = "output.uploaded_file_name !== ''", # Show only if there's content + textOutput(ns("uploaded_file_name")) # Display the uploaded file name + ) + ) + ), + footer = tagList( + modalButton("Close"), + actionButton(ns("save_advanced_options"), "Save") + ) + )) + }) + + + + #Close popup window when user "saves options" + observeEvent(input$save_advanced_options, { + advanced_options$pred_model <- input$pred_model + advanced_options$pred_matrix <- input$pred_matrix + advanced_options$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 diff --git a/R/mod_GSAcc.R b/R/mod_GSAcc.R index fa8492c..ded934b 100644 --- a/R/mod_GSAcc.R +++ b/R/mod_GSAcc.R @@ -164,7 +164,7 @@ mod_GSAcc_server <- function(input, output, session, parent_session){ selectInput( inputId = ns('pred_model'), label = 'Model Choice', - choices = c("rrBLUP", "GBLUP"), + choices = c("GBLUP"), selected = advanced_options$pred_model # Initialize with stored value ), conditionalPanel( diff --git a/R/mod_dosage2vcf.R b/R/mod_dosage2vcf.R index cdd02d7..4c2ebfd 100644 --- a/R/mod_dosage2vcf.R +++ b/R/mod_dosage2vcf.R @@ -14,48 +14,51 @@ mod_dosage2vcf_ui <- function(id){ tagList( fluidPage( fluidRow( - box( - title = "Inputs", status = "info", solidHeader = TRUE, collapsible = FALSE, collapsed = FALSE, - selectInput(ns('file_type'), label = 'Select File Format', choices = c("DArT Dosage Reports","AgriSeq")), - 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")), - ), - conditionalPanel(condition = "input.file_type == 'AgriSeq'", - ns = ns, - "Support for this file type is in-progress", - "", - #fileInput(ns("agriseq_file"), "Choose Input File", accept = c(".csv")) - ), - textInput(ns("d2v_output_name"), "Output File Name"), - numericInput(ns("dosage2vcf_ploidy"), "Species Ploidy", min = 1, value = NULL), - #actionButton(ns("run_analysis"), "Run Analysis"), - useShinyjs(), - downloadButton(ns('download_d2vcf'), "Download VCF File", class = "butt"), - 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"), hr(), - p(HTML("Parameters description:"), actionButton(ns("goPar"), icon("arrow-up-right-from-square", verify_fa = FALSE) )), hr(), - p(HTML("Graphics 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(), - actionButton(ns("d2vcf_summary"), "Summary"), - circle = FALSE, - status = "warning", - icon = icon("info"), width = "500px", - tooltip = tooltipOptions(title = "Click to see info!") - )) - ), - valueBoxOutput(ns("ReportSnps")) + column(width = 5, + box( + title = "Inputs", width=12, status = "info", solidHeader = TRUE, collapsible = FALSE, collapsed = FALSE, + selectInput(ns('file_type'), label = 'Select File Format', choices = c("DArT Dosage Reports","AgriSeq")), + 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")), + ), + conditionalPanel(condition = "input.file_type == 'AgriSeq'", + ns = ns, + "Support for this file type is in-progress", + "", + #fileInput(ns("agriseq_file"), "Choose Input File", accept = c(".csv")) + ), + textInput(ns("d2v_output_name"), "Output File Name"), + numericInput(ns("dosage2vcf_ploidy"), "Species Ploidy", min = 1, value = NULL), + #actionButton(ns("run_analysis"), "Run Analysis"), + useShinyjs(), + downloadButton(ns('download_d2vcf'), "Download VCF File", class = "butt"), + 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"), hr(), + p(HTML("Parameters description:"), actionButton(ns("goPar"), icon("arrow-up-right-from-square", verify_fa = FALSE) )), hr(), + p(HTML("Graphics 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(), + actionButton(ns("d2vcf_summary"), "Summary"), + circle = FALSE, + status = "warning", + icon = icon("info"), width = "500px", + tooltip = tooltipOptions(title = "Click to see info!") + )) + ) ), - fluidRow( - box(title = "Status", width = 3, collapsible = TRUE, status = "info", + column(width = 4, + valueBoxOutput(ns("ReportSnps"), width=12), + 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 = 1), ) ) ) - ) } #' dosage2vcf Server Functions diff --git a/R/mod_gwas.R b/R/mod_gwas.R index 908b497..0f230ba 100644 --- a/R/mod_gwas.R +++ b/R/mod_gwas.R @@ -23,8 +23,8 @@ mod_gwas_ui <- function(id){ fileInput(ns("phenotype_file"), "Choose Trait File", accept = ".csv"), numericInput(ns("gwas_ploidy"), "Species Ploidy", min = 1, value = NULL), numericInput(ns("bp_window_before"), "Base pair window (Mb)", min = 0, value = 2), - selectInput(ns('gwas_threshold'), label='Significance Threshold Method', choices = c("M.eff","Bonferroni","FDR","permute"), selected="M.eff"), - selectInput(ns('trait_info'), label = 'Select Trait (eg. Color):', choices = NULL), + selectInput(ns('gwas_threshold'), label='Significance Threshold', choices = c("M.eff","Bonferroni","FDR","permute"), selected="M.eff"), + selectInput(ns('trait_info'), label = 'Select Trait', choices = NULL), virtualSelectInput( inputId = ns("fixed_info"), label = "Select Fixed Effects (optional):", From f5b9f9aa2bae73341e08ca4c87337c17e3cb2bab Mon Sep 17 00:00:00 2001 From: Cristianetaniguti Date: Thu, 19 Dec 2024 15:33:52 -0500 Subject: [PATCH 26/38] update help #43 --- R/mod_help.R | 10 ++++-- inst/help_files/DAPC_cite.Rmd | 13 +++++++ inst/help_files/DAPC_par.Rmd | 27 +++++++++++++++ inst/help_files/DAPC_res.Rmd | 20 +++++++++++ inst/help_files/DArT_Report2VCF_cite.Rmd | 10 ++++++ inst/help_files/DArT_Report2VCF_par.Rmd | 11 ++++++ inst/help_files/DArT_Report2VCF_res.Rmd | 3 ++ inst/help_files/GWAS_par.Rmd | 4 +++ inst/help_files/GWAS_res.Rmd | 33 +++++++++++------- inst/help_files/Genomic_Diversity_cite.Rmd | 9 +++++ inst/help_files/Genomic_Diversity_par.Rmd | 3 ++ inst/help_files/Genomic_Diversity_res.Rmd | 11 ++++++ inst/help_files/Genomic_Prediction_cite.Rmd | 15 ++++++++ inst/help_files/Genomic_Prediction_par.Rmd | 29 ++++++++++++++++ inst/help_files/Genomic_Prediction_res.Rmd | 22 ++++++++++++ inst/help_files/PCA_cite.Rmd | 13 +++++++ inst/help_files/PCA_par.Rmd | 36 ++++++++++++++++++++ inst/help_files/PCA_res.Rmd | 5 +++ inst/help_files/Predictive_Ability_cite.Rmd | 15 ++++++++ inst/help_files/Predictive_Ability_par.Rmd | 18 ++++++++++ inst/help_files/Predictive_Ability_res.Rmd | 18 ++++++++++ inst/help_files/Updog_Dosage_Calling_par.Rmd | 4 ++- inst/help_files/VCF_Filtering_cite.Rmd | 13 +++++++ inst/help_files/VCF_Filtering_par.Rmd | 20 +++++++++++ inst/help_files/VCF_Filtering_res.Rmd | 3 ++ 25 files changed, 349 insertions(+), 16 deletions(-) diff --git a/R/mod_help.R b/R/mod_help.R index 19960f0..081eb61 100644 --- a/R/mod_help.R +++ b/R/mod_help.R @@ -14,7 +14,7 @@ mod_help_ui <- function(id){ column(width=12), column(width=12, box(title="DArT Report2VCF", id = "DArT_Report2VCF_box",width = 12, collapsible = TRUE, collapsed = TRUE, status = "info", solidHeader = TRUE, - "**Draft**This tab is designed to convert the DArT Dose Report and Counts files to a VCF file. **DArT Website**", + "This tab converts the processed genotype and counts files from DArT into a VCF file (v4.3). This file can then be used as the genotype input for the analyses within BIGapp or used with other genomics applications.", br(), br(), bs4Dash::tabsetPanel(id = "DArT_Report2VCF_tabset", tabPanel("Parameters description", value = "DArT_Report2VCF_par", @@ -42,6 +42,8 @@ mod_help_ui <- function(id){ )) ), box(title="VCF Filtering", id = "VCF_Filtering_box",width = 12, collapsible = TRUE, collapsed = TRUE, status = "info", solidHeader = TRUE, + "Filter SNPs and samples in a VCF file based on missing data, minor allele frequency, read depth, and Updog dosage calling metrics", + br(), br(), bs4Dash::tabsetPanel(id = "VCF_Filtering_tabset", tabPanel("Parameters description", value = "VCF_Filtering_par", includeMarkdown(system.file("help_files/VCF_Filtering_par.Rmd", package = "BIGapp")) @@ -54,6 +56,7 @@ mod_help_ui <- function(id){ )) ), box(title="PCA", id = "PCA_box",width = 12, collapsible = TRUE, collapsed = TRUE, status = "info", solidHeader = TRUE, + "This tab is used to perform a PCA to visualize the genomic relationships between samples (population structure)", bs4Dash::tabsetPanel(id = "PCA_tabset", tabPanel("Parameters description", value = "PCA_par", includeMarkdown(system.file("help_files/PCA_par.Rmd", package = "BIGapp")) @@ -66,6 +69,7 @@ mod_help_ui <- function(id){ )) ), box(title="DAPC", id = "DAPC_box",width = 12, collapsible = TRUE, collapsed = TRUE, status = "info", solidHeader = TRUE, + "This tab group estimates the number of distinct groups that are present within the genomic dataset, and classifies each sample into a distinct group.", bs4Dash::tabsetPanel(id = "DAPC_tabset", tabPanel("Parameters description", value = "DAPC_par", includeMarkdown(system.file("help_files/DAPC_par.Rmd", package = "BIGapp")) @@ -78,7 +82,7 @@ mod_help_ui <- function(id){ )) ), box(title="Genomic Diversity", id = "Genomic_Diversity_box",width = 12, collapsible = TRUE, collapsed = TRUE, status = "info", solidHeader = TRUE, - "**Draft**This tab is dedicated to analyzing genomic diversity within the population. It calculates various diversity metrics such as heterozygosity and minor allele frequency (MAF). The app includes functionalities to visualize these metrics through histograms and other plots. Users can download the calculated diversity metrics as CSV files. This tab helps in understanding the genetic variability and distribution of alleles within the population.", + "This tab estimates summary metrics for the samples and SNPs within a genomic dataset and produces figures and tables.", br(), br(), bs4Dash::tabsetPanel(id = "Genomic_Diversity_tabset", tabPanel("Parameters description", value = "Genomic_Diversity_par", @@ -106,6 +110,7 @@ mod_help_ui <- function(id){ )) ), box(title="Predictive Ability", id = "Predictive_Ability_box",width = 12, collapsible = TRUE, collapsed = TRUE, status = "info", solidHeader = TRUE, + "This tab provides the predictive ability of a GBLUP model for each trait across all samples within a genomic dataset", bs4Dash::tabsetPanel(id = "Predictive_Ability_tabset", tabPanel("Parameters description", value = "Predictive_Ability_par", includeMarkdown(system.file("help_files/Predictive_Ability_par.Rmd", package = "BIGapp")) @@ -118,6 +123,7 @@ mod_help_ui <- function(id){ )) ), box(title="Genomic Prediction", id = "Genomic_Prediction_box",width = 12, collapsible = TRUE, collapsed = TRUE, status = "info", solidHeader = TRUE, + "his tab estimates the trait and estimated-breeding-values (EBVs) for either all individuals in a genomic dataset, or by training the model with one genomic dataset to predict the values in another.", bs4Dash::tabsetPanel(id = "Genomic_Prediction_tabset", tabPanel("Parameters description", value = "Genomic_Prediction_par", includeMarkdown(system.file("help_files/Genomic_Prediction_par.Rmd", package = "BIGapp")) diff --git a/inst/help_files/DAPC_cite.Rmd b/inst/help_files/DAPC_cite.Rmd index 1458b7c..c590227 100644 --- a/inst/help_files/DAPC_cite.Rmd +++ b/inst/help_files/DAPC_cite.Rmd @@ -4,3 +4,16 @@ output: html_document date: "2024-08-29" --- +* **BIGapp** + +* **BIGr** + +* **vcfR** + +Knaus BJ, Grünwald NJ (2017). “VCFR: a package to manipulate and visualize variant call format data in R.” Molecular Ecology Resources, 17(1), 44–53. ISSN 757, https://dx.doi.org/10.1111/1755-0998.12549. + +Knaus BJ, Grünwald NJ (2016). “VcfR: an R package to manipulate and visualize VCF format data.” BioRxiv. https://dx.doi.org/10.1101/041277. + +* **adegenet** + +Jombart, T. (2008). adegenet: a R package for the multivariate analysis of genetic markers. Bioinformatics, 24(11), 1403–1405. diff --git a/inst/help_files/DAPC_par.Rmd b/inst/help_files/DAPC_par.Rmd index b566e42..ce4577a 100644 --- a/inst/help_files/DAPC_par.Rmd +++ b/inst/help_files/DAPC_par.Rmd @@ -4,3 +4,30 @@ output: html_document date: "2024-08-29" --- +* **VCF file** +Variant Call Format (VCF) is a standard file format to store genetic variant information. The genotype (GT) data within the VCF is required for the analysis in this tab. For more details about the VCF format, see this document: https://samtools.github.io/hts-specs/VCFv4.2.pdf. + +* **Passport file** +A comma-separated values (CSV) file containing individual names (Sample_ID) in the first column and phenotype values in the subsequent columns. The phenotype column names should correspond to the phenotype ID. Example: + +

+ +|Sample_ID | Sepal.Length| Sepal.Width| Petal.Length| Petal.Width|Species | +|:---------:|:------------:|:-----------:|:------------:|:-----------:|:-------:| +|Sample_1 | 5.1| 3.5| 1.4| 0.2|versicolor | +|Sample_2 | 4.9| 3.0| 1.4| 0.2|setosa | +|Sample_3 | 4.7| 3.2| 1.3| 0.2|setosa | +|Sample_4 | 4.6| 3.1| 1.5| 0.2|setosa | +|Sample_5 | 5.0| 3.6| 1.4| 0.2|setosa | +|Sample_6 | 5.4| 3.9| 1.7| 0.4|setosa | + +
+ +  + +* **Species Ploidy** +Specifies the ploidy level of the species. The current analysis supports both diploids and autopolyploids. + +* **Maximum K** + +* **Number of Clusters (K)** diff --git a/inst/help_files/DAPC_res.Rmd b/inst/help_files/DAPC_res.Rmd index 0932956..470ae86 100644 --- a/inst/help_files/DAPC_res.Rmd +++ b/inst/help_files/DAPC_res.Rmd @@ -4,3 +4,23 @@ output: html_document date: "2024-08-29" --- +* **Cluster assignments table** + +
+ +|K | BIC | +|:---------:|:------------:| +|Sample_1 | 5.1| +|Sample_2 | 4.9| +|Sample_3 | 4.7| +|Sample_4 | 4.6| +|Sample_5 | 5.0| +|Sample_6 | 5.4| + +
+ +  + +* **BIC plot** + +* **DAPC plot** diff --git a/inst/help_files/DArT_Report2VCF_cite.Rmd b/inst/help_files/DArT_Report2VCF_cite.Rmd index d3be88a..7ff8c10 100644 --- a/inst/help_files/DArT_Report2VCF_cite.Rmd +++ b/inst/help_files/DArT_Report2VCF_cite.Rmd @@ -4,3 +4,13 @@ output: html_document date: "2024-08-29" --- +* **BIGapp** + + +* **BIGr** + +* **vcfR** + +Knaus BJ, Grünwald NJ (2017). “VCFR: a package to manipulate and visualize variant call format data in R.” Molecular Ecology Resources, 17(1), 44–53. ISSN 757, https://dx.doi.org/10.1111/1755-0998.12549. + +Knaus BJ, Grünwald NJ (2016). “VcfR: an R package to manipulate and visualize VCF format data.” BioRxiv. https://dx.doi.org/10.1101/041277. diff --git a/inst/help_files/DArT_Report2VCF_par.Rmd b/inst/help_files/DArT_Report2VCF_par.Rmd index ccf8d3c..4e6447f 100644 --- a/inst/help_files/DArT_Report2VCF_par.Rmd +++ b/inst/help_files/DArT_Report2VCF_par.Rmd @@ -4,3 +4,14 @@ output: html_document date: "2024-08-29" --- +* **DArTag Dosage Report** + +The DArT Dosage Report is a tab-separated file provided by DArT from a sequencing project. It contains the genotype information for each of the target markers for all samples in the sequencing project. The markers are in rows and the samples are in the columns. There are several summary metric columns that preceed the sample genotype columns. The genotype calls are the count of the reference allele, where 0 is equal to homozygous alternate. + +* **DArTag Counts File** + +The DArT counts file is a tab-separated file provided by DArT from a sequencing project. It contains the read count information for the referance and alternate allele at each target marker. The marker information are in the rows and the samples are in the columns. There are several information columns that preceed 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). + +* **Species Ploidy** + +Specifies the ploidy level of the species. The current analysis supports both diploids and autopolyploids. diff --git a/inst/help_files/DArT_Report2VCF_res.Rmd b/inst/help_files/DArT_Report2VCF_res.Rmd index 8f71982..0c70d3f 100644 --- a/inst/help_files/DArT_Report2VCF_res.Rmd +++ b/inst/help_files/DArT_Report2VCF_res.Rmd @@ -4,3 +4,6 @@ output: html_document date: "2024-08-29" --- +* **VCF file (v4.3)** + +Variant Call Format (VCF) is a standard file format to store genetic variant information. The genotype (GT) data within the VCF is converted from the numeric dosage call information. Included is the read counts for each marker/sample and the numeric dosage call (UD) data. For more details about the VCF format, see this document: https://samtools.github.io/hts-specs/VCFv4.2.pdf. diff --git a/inst/help_files/GWAS_par.Rmd b/inst/help_files/GWAS_par.Rmd index 8a8aaff..7082696 100644 --- a/inst/help_files/GWAS_par.Rmd +++ b/inst/help_files/GWAS_par.Rmd @@ -35,3 +35,7 @@ date: "2024-08-29" * **Number of CPU Cores**: Defines the number of CPU cores to be used for the GWAS analysis, enabling faster processing by splitting the workload across multiple cores. +BIGapp uses GWASpoly random polygenic effect to control for population structure. By default, all markers are used to calculate a single covariance matrix (parameter LOCO = FALSE in GWASpoly set.k function). + +BIGapp tests the inclusion of principal components as fixed effects (P + K model). For that, the BIC is calculated for models including 1 to 10 of the first principal components and the kinship matrix. In this step, the mixed model for GWAS is fitted using mixed.solve function of rrBLUP. Then, using the estimated parameters, log-likelihood is calculated by using the equation (2) in Kang et al., 2008. Finally, BIC is calculated by using the standard formula (BIC = K * log(N) - 2 * LL). + diff --git a/inst/help_files/GWAS_res.Rmd b/inst/help_files/GWAS_res.Rmd index 80003a4..8d11df5 100644 --- a/inst/help_files/GWAS_res.Rmd +++ b/inst/help_files/GWAS_res.Rmd @@ -4,16 +4,23 @@ output: html_document date: "2024-08-29" --- -* BIC plot - -* BIC Table - -* LD plot - -* Manhattan Plot - -* QQ Plot - -* QTL - significant markers - -* Multiple QTL model results table +* **BIC plot** +Plot of the BIC of the tested models including PCs and kinship. The model using the number of PC that resulted in the lower BIC is the one used by BIGapp. + +* **BIC Table** +Table with BIC for the tests including PC and kinship. The model using the number of PC that resulted in the lower BIC is the one used by BIGapp. + +* **LD plot** +Plot LD vs distance. A monotone decreasing, convex spline is fit using R package scam. + +* **Manhattan Plot** +From GWASpoly documentation: Results for the ref and alt versions of the dominance model are combined. If data is the output from set.threshold, then the threshold is displayed as a horizontal dashed line when models contains a single model. Because the threshold varies between models, it is not drawn when multiple models are included. Although the ref and alt versions of each dominance model are slightly different (as seen with qq.plot), they are treated as a single model for the Manhattan plot, and the average threshold is shown. + +* **QQ Plot** +From GWASpoly documentation: One of the standard diagnostics in GWAS is to check the inflation of the -log10(p) values (aka “scores”). This can be done using a quantile-quantile plot of the observed vs. expected values under the null hypothesis, which follows a uniform distribution and is shown with a dotted line + +* **QTL - significant markers** +Describes significant markers after screening with GWASpoly function + +* **Multiple QTL model results table** +Results after fit.QTL function diff --git a/inst/help_files/Genomic_Diversity_cite.Rmd b/inst/help_files/Genomic_Diversity_cite.Rmd index b85b481..1870dbc 100644 --- a/inst/help_files/Genomic_Diversity_cite.Rmd +++ b/inst/help_files/Genomic_Diversity_cite.Rmd @@ -4,3 +4,12 @@ output: html_document date: "2024-08-29" --- +* **BIGapp** + +* **BIGr** + +* **vcfR** + +Knaus BJ, Grünwald NJ (2017). “VCFR: a package to manipulate and visualize variant call format data in R.” Molecular Ecology Resources, 17(1), 44–53. ISSN 757, https://dx.doi.org/10.1111/1755-0998.12549. + +Knaus BJ, Grünwald NJ (2016). “VcfR: an R package to manipulate and visualize VCF format data.” BioRxiv. https://dx.doi.org/10.1101/041277. diff --git a/inst/help_files/Genomic_Diversity_par.Rmd b/inst/help_files/Genomic_Diversity_par.Rmd index b236539..c4581aa 100644 --- a/inst/help_files/Genomic_Diversity_par.Rmd +++ b/inst/help_files/Genomic_Diversity_par.Rmd @@ -4,3 +4,6 @@ output: html_document date: "2024-08-29" --- +* **VCF file**: Variant Call Format (VCF) is a standard file format to store genetic variant information. The genotype (GT) data within the VCF is required for the analysis in this tab. For more details about the VCF format, see this document: https://samtools.github.io/hts-specs/VCFv4.2.pdf. + +* **Species Ploidy**: Specifies the ploidy level of the species. The current analysis supports both diploids and autopolyploids. diff --git a/inst/help_files/Genomic_Diversity_res.Rmd b/inst/help_files/Genomic_Diversity_res.Rmd index 752af92..2046b00 100644 --- a/inst/help_files/Genomic_Diversity_res.Rmd +++ b/inst/help_files/Genomic_Diversity_res.Rmd @@ -4,3 +4,14 @@ output: html_document date: "2024-08-29" --- +* **MAF plot** + +* **OHet plot** + +* **Dosage Ratio plot** + +* **Marker distribution plot** + +* **MAF table** + +* **OHet table** diff --git a/inst/help_files/Genomic_Prediction_cite.Rmd b/inst/help_files/Genomic_Prediction_cite.Rmd index 55097f3..1e59726 100644 --- a/inst/help_files/Genomic_Prediction_cite.Rmd +++ b/inst/help_files/Genomic_Prediction_cite.Rmd @@ -4,3 +4,18 @@ output: html_document date: "2024-08-29" --- +* **BIGapp** + +* **vcfR** + +Knaus BJ, Grünwald NJ (2017). “VCFR: a package to manipulate and visualize variant call format data in R.” Molecular Ecology Resources, 17(1), 44–53. ISSN 757, https://dx.doi.org/10.1111/1755-0998.12549. + +Knaus BJ, Grünwald NJ (2016). “VcfR: an R package to manipulate and visualize VCF format data.” BioRxiv. https://dx.doi.org/10.1101/041277. + +* **rrBLUP** + +Endelman JB (2011). “Ridge regression and other kernels for genomic selection with R package rrBLUP.” Plant Genome, 4, 250-255. + +* **AGHmatrix** + +R Amadeu R, Franco Garcia A, Munoz P, V Ferrao L (2023). “AGHmatrix: genetic relationship matrices in R .” Bioinformatics, 39(7). diff --git a/inst/help_files/Genomic_Prediction_par.Rmd b/inst/help_files/Genomic_Prediction_par.Rmd index b4b18cb..b411335 100644 --- a/inst/help_files/Genomic_Prediction_par.Rmd +++ b/inst/help_files/Genomic_Prediction_par.Rmd @@ -4,3 +4,32 @@ output: html_document date: "2024-08-29" --- +This tab estimates the trait and estimated-breeding-values (EBVs) for either all individuals in a genomic dataset, or by training the model with one genomic dataset to predict the values in another. The trait and EBV information can then be used to make selections for the next breeding cycle. + +* **VCF file**: Variant Call Format (VCF) is a standard file format to store genetic variant information. The genotype (GT) data within the VCF is required for the analysis in this tab. For more details about the VCF format, see this document: https://samtools.github.io/hts-specs/VCFv4.2.pdf. + +* **Passport file**: A comma-separated values (CSV) file containing individual names (Sample_ID) in the first column and phenotype values in the subsequent columns. The phenotype column names should correspond to the phenotype ID. Example: + +
+ +|Sample_ID | Sepal.Length| Sepal.Width| Petal.Length| Petal.Width|Species | +|:---------:|:------------:|:-----------:|:------------:|:-----------:|:-------:| +|Sample_1 | 5.1| 3.5| 1.4| 0.2|versicolor | +|Sample_2 | 4.9| 3.0| 1.4| 0.2|setosa | +|Sample_3 | 4.7| 3.2| 1.3| 0.2|setosa | +|Sample_4 | 4.6| 3.1| 1.5| 0.2|setosa | +|Sample_5 | 5.0| 3.6| 1.4| 0.2|setosa | +|Sample_6 | 5.4| 3.9| 1.7| 0.4|setosa | + +
+ +  + +* **Prediction VCF file** + +* **Species Ploidy**: Specifies the ploidy level of the species. The current analysis supports both diploids and autopolyploids. + +* **Matrix type**: Specifies the matrix type to use for the GBLUP prediction model. The choices are: + * **Gmatrix**: An additive relationship matrix between all samples is created using the genotype information from the VCF file + * **Amatrix**: An additive relationship matrix between all samples is created using a user supplied pedigree file + * **Hmatrix**: An additive relationship matrix between all samples is created by using the information from both the VCF file and the pedigree file diff --git a/inst/help_files/Genomic_Prediction_res.Rmd b/inst/help_files/Genomic_Prediction_res.Rmd index c48e1ed..93d9f55 100644 --- a/inst/help_files/Genomic_Prediction_res.Rmd +++ b/inst/help_files/Genomic_Prediction_res.Rmd @@ -4,3 +4,25 @@ output: html_document date: "2024-08-29" --- +* **Predicted Trait table**: The trait values are predicted for all samples in either the input VCF file (if only one provided), or for all of the samples in the predictive VCF file. It is in the format of samples IDs in the first column, and each subsequent column being the information for the traits selected by the user. + +| Sample ID | Sepal Length | Sepal Width | +|------------|--------------|-------------| +| Sample_1 | 4.8 | 3.5 | +| Sample_2 | 4.9 | 3.0 | +| Sample_3 | 4.7 | 3.2 | +| Sample_4 | 4.6 | 3.1 | +| Sample_5 | 5.0 | 3.6 | +| Sample_6 | 5.4 | 3.9 | + + +* **EBV table**: Estimated Breeding Values (EBVs) from genomic prediction are statistical estimates of an individual's genetic potential for a specific trait, calculated by combining genomic information with phenotypic and pedigree data. These values help predict an organism's ability to pass on desirable traits to its offspring, allowing for more accurate selection in breeding programs. The EBVs are predicted for all samples in either the input VCF file (if only one provided), or for all of the samples in the predictive VCF file. It is in the format of samples IDs in the first column, and each subsequent column being the information for the traits selected by the user. + +| Sample ID | Sepal Length | Sepal Width | +|------------|--------------|-------------| +| Sample_1 | 0.32 | 0.48 | +| Sample_2 | -0.12 | -0.28 | +| Sample_3 | 0.14 | 0.31 | +| Sample_4 | 1.21 | 1.03 | +| Sample_5 | 0.43 | 0.33 | +| Sample_6 | 0.03 | 0.91 | diff --git a/inst/help_files/PCA_cite.Rmd b/inst/help_files/PCA_cite.Rmd index 45d5f7f..f65632a 100644 --- a/inst/help_files/PCA_cite.Rmd +++ b/inst/help_files/PCA_cite.Rmd @@ -4,3 +4,16 @@ output: html_document date: "2024-08-29" --- +* **BIGapp** + +* **BIGr** + +* **vcfR** + +Knaus BJ, Grünwald NJ (2017). “VCFR: a package to manipulate and visualize variant call format data in R.” Molecular Ecology Resources, 17(1), 44–53. ISSN 757, https://dx.doi.org/10.1111/1755-0998.12549. + +Knaus BJ, Grünwald NJ (2016). “VcfR: an R package to manipulate and visualize VCF format data.” BioRxiv. https://dx.doi.org/10.1101/041277. + +* **AGHmatrix** + +R Amadeu R, Franco Garcia A, Munoz P, V Ferrao L (2023). “AGHmatrix: genetic relationship matrices in R .” Bioinformatics, 39(7). diff --git a/inst/help_files/PCA_par.Rmd b/inst/help_files/PCA_par.Rmd index 61a0f27..61f859d 100644 --- a/inst/help_files/PCA_par.Rmd +++ b/inst/help_files/PCA_par.Rmd @@ -4,3 +4,39 @@ output: html_document date: "2024-08-29" --- + +* **VCF file** +Variant Call Format (VCF) is a standard file format to store genetic variant information. The genotype (GT) data within the VCF is required for the analysis in this tab. For more details about the VCF format, see this document: https://samtools.github.io/hts-specs/VCFv4.2.pdf. + +* **Passport file** +A comma-separated values (CSV) file containing individual names (Sample_ID) in the first column and phenotype values in the subsequent columns. The phenotype column names should correspond to the phenotype ID. Example: + +
+ +|Sample_ID | Sepal.Length| Sepal.Width| Petal.Length| Petal.Width|Species | +|:---------:|:------------:|:-----------:|:------------:|:-----------:|:-------:| +|Sample_1 | 5.1| 3.5| 1.4| 0.2|versicolor | +|Sample_2 | 4.9| 3.0| 1.4| 0.2|setosa | +|Sample_3 | 4.7| 3.2| 1.3| 0.2|setosa | +|Sample_4 | 4.6| 3.1| 1.5| 0.2|setosa | +|Sample_5 | 5.0| 3.6| 1.4| 0.2|setosa | +|Sample_6 | 5.4| 3.9| 1.7| 0.4|setosa | + +
+ +  + +* **Species Ploidy** +Specifies the ploidy level of the species. The current analysis supports both diploids and autopolyploids. + +* **Variable to color** +Specifies which column to use in the passport data file to color the samples in the PCA plots by. + +* **Category to color** +Specifies which specific item(s) within the selected column to color the samples in the PCA plots. All other samples will be a shade of grey. + +* **Color palette** +Select which color palette to use for coloring the sample points. The different color palettes are separated by those that are color-blind friendly and those that are not. + +* **Axes to visualize** +Choose which axes to display on the 2D PCA plot. diff --git a/inst/help_files/PCA_res.Rmd b/inst/help_files/PCA_res.Rmd index 1f2f534..07c678d 100644 --- a/inst/help_files/PCA_res.Rmd +++ b/inst/help_files/PCA_res.Rmd @@ -4,3 +4,8 @@ output: html_document date: "2024-08-29" --- +* **3D PCA plot** + +* **2D PCA plot** + +* **Scree plot** diff --git a/inst/help_files/Predictive_Ability_cite.Rmd b/inst/help_files/Predictive_Ability_cite.Rmd index 92d6654..2bdeda1 100644 --- a/inst/help_files/Predictive_Ability_cite.Rmd +++ b/inst/help_files/Predictive_Ability_cite.Rmd @@ -4,3 +4,18 @@ output: html_document date: "2024-08-29" --- +* **BIGapp** + +* **vcfR** + +Knaus BJ, Grünwald NJ (2017). “VCFR: a package to manipulate and visualize variant call format data in R.” Molecular Ecology Resources, 17(1), 44–53. ISSN 757, https://dx.doi.org/10.1111/1755-0998.12549. + +Knaus BJ, Grünwald NJ (2016). “VcfR: an R package to manipulate and visualize VCF format data.” BioRxiv. https://dx.doi.org/10.1101/041277. + +* **rrBLUP** + +Endelman JB (2011). “Ridge regression and other kernels for genomic selection with R package rrBLUP.” Plant Genome, 4, 250-255. + +* **AGHmatrix** + +R Amadeu R, Franco Garcia A, Munoz P, V Ferrao L (2023). “AGHmatrix: genetic relationship matrices in R .” Bioinformatics, 39(7). diff --git a/inst/help_files/Predictive_Ability_par.Rmd b/inst/help_files/Predictive_Ability_par.Rmd index c3eab0f..ce189f2 100644 --- a/inst/help_files/Predictive_Ability_par.Rmd +++ b/inst/help_files/Predictive_Ability_par.Rmd @@ -4,3 +4,21 @@ output: html_document date: "2024-08-29" --- +This tab provides the predictive ability of a GBLUP model for each trait across all samples within a genomic dataset. The model is based on a 5-fold cross validation, where the samples are evenly grouped into 5 groups, and 4 of the groups are used to train the GBLUP model, while the trait is predicted for the 5th group. This continues until each group has had their trait information predicted, and the predictive ability is the pearson correlation between the known trait values and the predicted values. Each 5-fold cross-validation can be performed multiple times (iterations) to get a more confident estimate in the predictive ability of the model. This supports the use of genomic and pedigree information. + + +* **VCF file**: Variant Call Format (VCF) is a standard file format to store genetic variant information. The genotype (GT) data within the VCF is required for the analysis in this tab. For more details about the VCF format, see this document: https://samtools.github.io/hts-specs/VCFv4.2.pdf. + +* **Passport file**: A comma-separated values (CSV) file containing individual names (Sample_ID) in the first column and phenotype values in the subsequent columns. The phenotype column names should correspond to the phenotype ID. Example: + +* **Species ploidy**: Specifies the ploidy level of the species. The current analysis supports both diploids and autopolyploids. + +* **Iterations**: This is the number of runs of five-fold cross-validation that you would like to perform to estimate predictive ability. The accuracy results are averaged over all iterations. The more iterations that are performed, the higher confidence in the final predictive ability estimates. + +* **Matrix type**: Specifies the matrix type to use for the GBLUP prediction model. The choices are: + + * **Gmatrix**: An additive relationship matrix between all samples is created using the genotype information from the VCF file + + * **Amatrix**: An additive relationship matrix between all samples is created using a user supplied pedigree file + + * **Hmatrix**: An additive relationship matrix between all samples is created by using the information from both the VCF file and the pedigree file diff --git a/inst/help_files/Predictive_Ability_res.Rmd b/inst/help_files/Predictive_Ability_res.Rmd index 14e1952..ea1fa3c 100644 --- a/inst/help_files/Predictive_Ability_res.Rmd +++ b/inst/help_files/Predictive_Ability_res.Rmd @@ -4,3 +4,21 @@ output: html_document date: "2024-08-29" --- +* **Violin plot** + +* **Box plot** + +* **Predictive ability table** + +
+ +|Iter | Sepal.Length | Sepal.Width | +|:---------:|:------------:|:-----------:| +|1 | 0.728| 0.571| +|2 | 0.721| 0.568| +|3 | 0.724| 0.543| + + +
+ +  diff --git a/inst/help_files/Updog_Dosage_Calling_par.Rmd b/inst/help_files/Updog_Dosage_Calling_par.Rmd index 40305c8..f80e6ec 100644 --- a/inst/help_files/Updog_Dosage_Calling_par.Rmd +++ b/inst/help_files/Updog_Dosage_Calling_par.Rmd @@ -11,7 +11,8 @@ date: "2024-08-29" * **VCF file**: Variant Call Format (VCF) is a standard file format to store genetic variant information. The genotype (GT) data within the VCF is required for the analysis in this tab. For more details about the VCF format, see this document: https://samtools.github.io/hts-specs/VCFv4.2.pdf. -* **Passport File**: A comma-separated values (CSV) file containing individual names (Sample_ID) in the first column and phenotype values in the subsequent columns. The phenotype column names should correspond to the phenotype ID. +* **Passport File**: +A comma-separated values (CSV) file containing individual names (Sample_ID) in the first column and phenotype values in the subsequent columns. The phenotype column names should correspond to the phenotype ID. * **Select Category Subset**: After loading the passport file, this option will be available. You can select the column name to base the subsetting for the samples @@ -45,6 +46,7 @@ The following information is from the Updog manual. Possible values of the genot `f1` This prior assumes the individuals are all full-siblings resulting from one generation of a bi-parental cross. This model assumes a particular type of meiotic behavior: polysomic inheritance with bivalent, non-preferential pairing. `f1pp` This prior allows for double reduction and preferential pairing in an F1 population of tretraploids. `s1pp` This prior allows for double reduction and preferential pairing in an S1 population of tretraploids. `flex` Generically any categorical distribution. Theoretically, this works well if you have a lot of individuals. In practice, it seems to be much less robust to violations in modeling assumptions.`uniform` A discrete uniform distribution. This should never be used in practice." * **Parent**: If “s1” or “s1pp” model is selected you must define which sample is correspondent to the parent including the sample ID in this box. The input sample ID must match to the sample ID in the input genotype file + * **Parent1 and Parent2**: if “f1” or “f1pp” model is selected you must define which samples correspondent to the parent1 and parent2 including the samples ID in the respective boxes. The input sample ID must match to the sample ID in the input genotype file * **Number of CPU Cores**: Number of cores to be used in the multidog function paralelization diff --git a/inst/help_files/VCF_Filtering_cite.Rmd b/inst/help_files/VCF_Filtering_cite.Rmd index 0699277..1958c9d 100644 --- a/inst/help_files/VCF_Filtering_cite.Rmd +++ b/inst/help_files/VCF_Filtering_cite.Rmd @@ -4,3 +4,16 @@ output: html_document date: "2024-08-29" --- +* **BIGapp** + +* **BIGr** + +* **Updog** (if filtering parameters used) + +Gerard, D., Ferrão, L. F. V., Garcia, A. A. F., & Stephens, M. (2018). Genotyping Polyploids from Messy Sequencing Data. Genetics, 210(3), 789-807. doi: 10.1534/genetics.118.301468. + +* **vcfR** + +Knaus BJ, Grünwald NJ (2017). “VCFR: a package to manipulate and visualize variant call format data in R.” Molecular Ecology Resources, 17(1), 44–53. ISSN 757, https://dx.doi.org/10.1111/1755-0998.12549. + +Knaus BJ, Grünwald NJ (2016). “VcfR: an R package to manipulate and visualize VCF format data.” BioRxiv. https://dx.doi.org/10.1101/041277. diff --git a/inst/help_files/VCF_Filtering_par.Rmd b/inst/help_files/VCF_Filtering_par.Rmd index 2abbd30..d845367 100644 --- a/inst/help_files/VCF_Filtering_par.Rmd +++ b/inst/help_files/VCF_Filtering_par.Rmd @@ -3,3 +3,23 @@ title: "VCF_Filtering_par" output: html_document date: "2024-08-29" --- + + +* **VCF file**: Variant Call Format (VCF) is a standard file format to store genetic variant information. The genotype (GT) data within the VCF is required for the analysis in this tab. For more details about the VCF format, see this document: https://samtools.github.io/hts-specs/VCFv4.2.pdf. + +* **Species Ploidy**: Specifies the ploidy level of the species. The current analysis supports both diploids and autopolyploids. + +* **Minor-Allele-Frequency**: The frequency of the minor allele within the population for each SNP. SNPs with a very low MAF (MAF < 0.01) are typically removed since they could be due to sequencing errors and could bias the GWAS and PCA analyses. + +* **Read Depth per marker/sample**: This the read depth for each marker at each sample. A low read depth suggests that a given marker at a sample had poor genotyping performance, and should be assigned as missing. Typical read depth thresholds are set so that genotypes with a read depth per marker/sample of less than 10 are assigned as missing data. + +* **SNP missing data**: The ratio of missing data across all samples for each SNP. Low missing data (minimum <= 50%) is necessary to not bias and have confidence in the downstream results. + +* **Sample missing data**: The ratio of missing data across all SNPs for each sample. Low missing data (minimum <= 50%) is necessary to not bias and have confidence in the downstream results. + +* **Updog parameters**: + + * **OD**: The estimated overdispersion parameter of the SNP from updog + * **Bias**: The estimated allele bias of the SNP from updog + * **Prop_mis**: The estimated proportion of individuals misclassified in the SNP from updog + * **Maxpostprob**: Maximum posterior probability for that dosage call from updog diff --git a/inst/help_files/VCF_Filtering_res.Rmd b/inst/help_files/VCF_Filtering_res.Rmd index e3430b6..8243c09 100644 --- a/inst/help_files/VCF_Filtering_res.Rmd +++ b/inst/help_files/VCF_Filtering_res.Rmd @@ -4,3 +4,6 @@ output: html_document date: "2024-08-29" --- +* **VCF file (v4.3)** + +Variant Call Format (VCF) is a standard file format to store genetic variant information. The genotype (GT) data within the VCF is required for the analysis in this tab. For more details about the VCF format, see this document: https://samtools.github.io/hts-specs/VCFv4.2.pdf. From afadbd7d0479301ee0d6321533534e28a7aac416 Mon Sep 17 00:00:00 2001 From: Cristianetaniguti Date: Thu, 19 Dec 2024 15:48:32 -0500 Subject: [PATCH 27/38] adjusts --- R/mod_help.R | 48 ++++++++++++---------- inst/help_files/DAPC_res.Rmd | 3 +- inst/help_files/Genomic_Prediction_res.Rmd | 2 + inst/help_files/Predictive_Ability_res.Rmd | 2 - 4 files changed, 29 insertions(+), 26 deletions(-) diff --git a/R/mod_help.R b/R/mod_help.R index 081eb61..52b7206 100644 --- a/R/mod_help.R +++ b/R/mod_help.R @@ -17,13 +17,13 @@ mod_help_ui <- function(id){ "This tab converts the processed genotype and counts files from DArT into a VCF file (v4.3). This file can then be used as the genotype input for the analyses within BIGapp or used with other genomics applications.", br(), br(), bs4Dash::tabsetPanel(id = "DArT_Report2VCF_tabset", - tabPanel("Parameters description", value = "DArT_Report2VCF_par", + tabPanel("Parameters description", value = "DArT_Report2VCF_par", br(), includeMarkdown(system.file("help_files/DArT_Report2VCF_par.Rmd", package = "BIGapp")) ), - tabPanel("Results description", value = "DArT_Report2VCF_results", + tabPanel("Results description", value = "DArT_Report2VCF_results", br(), includeMarkdown(system.file("help_files/DArT_Report2VCF_res.Rmd", package = "BIGapp")) ), - tabPanel("How to cite", value = "DArT_Report2VCF_cite", + tabPanel("How to cite", value = "DArT_Report2VCF_cite", br(), includeMarkdown(system.file("help_files/DArT_Report2VCF_cite.Rmd", package = "BIGapp")) )) ), @@ -45,39 +45,41 @@ mod_help_ui <- function(id){ "Filter SNPs and samples in a VCF file based on missing data, minor allele frequency, read depth, and Updog dosage calling metrics", br(), br(), bs4Dash::tabsetPanel(id = "VCF_Filtering_tabset", - tabPanel("Parameters description", value = "VCF_Filtering_par", + tabPanel("Parameters description", value = "VCF_Filtering_par", br(), includeMarkdown(system.file("help_files/VCF_Filtering_par.Rmd", package = "BIGapp")) ), - tabPanel("Results description", value = "VCF_Filtering_results", - includeMarkdown(system.file("help_files/VCF_Filtering_par.Rmd", package = "BIGapp")) + tabPanel("Results description", value = "VCF_Filtering_results", br(), + includeMarkdown(system.file("help_files/VCF_Filtering_res.Rmd", package = "BIGapp")) ), - tabPanel("How to cite", value = "Updog_Dosage_Calling_cite", + tabPanel("How to cite", value = "Updog_Dosage_Calling_cite", br(), includeMarkdown(system.file("help_files/VCF_Filtering_cite.Rmd", package = "BIGapp")) )) ), box(title="PCA", id = "PCA_box",width = 12, collapsible = TRUE, collapsed = TRUE, status = "info", solidHeader = TRUE, "This tab is used to perform a PCA to visualize the genomic relationships between samples (population structure)", + br(), br(), bs4Dash::tabsetPanel(id = "PCA_tabset", - tabPanel("Parameters description", value = "PCA_par", + tabPanel("Parameters description", value = "PCA_par", br(), includeMarkdown(system.file("help_files/PCA_par.Rmd", package = "BIGapp")) ), - tabPanel("Results description", value = "PCA_results", + tabPanel("Results description", value = "PCA_results", br(), includeMarkdown(system.file("help_files/PCA_res.Rmd", package = "BIGapp")) ), - tabPanel("How to cite", value = "PCA_cite", + tabPanel("How to cite", value = "PCA_cite", br(), includeMarkdown(system.file("help_files/PCA_cite.Rmd", package = "BIGapp")) )) ), box(title="DAPC", id = "DAPC_box",width = 12, collapsible = TRUE, collapsed = TRUE, status = "info", solidHeader = TRUE, "This tab group estimates the number of distinct groups that are present within the genomic dataset, and classifies each sample into a distinct group.", + br(), br(), bs4Dash::tabsetPanel(id = "DAPC_tabset", - tabPanel("Parameters description", value = "DAPC_par", + tabPanel("Parameters description", value = "DAPC_par", br(), includeMarkdown(system.file("help_files/DAPC_par.Rmd", package = "BIGapp")) ), - tabPanel("Results description", value = "DAPC_results", + tabPanel("Results description", value = "DAPC_results", br(), includeMarkdown(system.file("help_files/DAPC_res.Rmd", package = "BIGapp")) ), - tabPanel("How to cite", value = "DAPC_cite", + tabPanel("How to cite", value = "DAPC_cite", br(), includeMarkdown(system.file("help_files/DAPC_cite.Rmd", package = "BIGapp")) )) ), @@ -85,13 +87,13 @@ mod_help_ui <- function(id){ "This tab estimates summary metrics for the samples and SNPs within a genomic dataset and produces figures and tables.", br(), br(), bs4Dash::tabsetPanel(id = "Genomic_Diversity_tabset", - tabPanel("Parameters description", value = "Genomic_Diversity_par", + tabPanel("Parameters description", value = "Genomic_Diversity_par", br(), includeMarkdown(system.file("help_files/Genomic_Diversity_par.Rmd", package = "BIGapp")) ), - tabPanel("Results description", value = "Genomic_Diversity_results", + tabPanel("Results description", value = "Genomic_Diversity_results", br(), includeMarkdown(system.file("help_files/Genomic_Diversity_res.Rmd", package = "BIGapp")) ), - tabPanel("How to cite", value = "Genomic_Diversity_cite", + tabPanel("How to cite", value = "Genomic_Diversity_cite", br(), includeMarkdown(system.file("help_files/Genomic_Diversity_cite.Rmd", package = "BIGapp")) )) ), @@ -111,27 +113,29 @@ mod_help_ui <- function(id){ ), box(title="Predictive Ability", id = "Predictive_Ability_box",width = 12, collapsible = TRUE, collapsed = TRUE, status = "info", solidHeader = TRUE, "This tab provides the predictive ability of a GBLUP model for each trait across all samples within a genomic dataset", + br(), br(), bs4Dash::tabsetPanel(id = "Predictive_Ability_tabset", - tabPanel("Parameters description", value = "Predictive_Ability_par", + tabPanel("Parameters description", value = "Predictive_Ability_par", br(), includeMarkdown(system.file("help_files/Predictive_Ability_par.Rmd", package = "BIGapp")) ), - tabPanel("Results description", value = "Predictive_Ability_results", + tabPanel("Results description", value = "Predictive_Ability_results", br(), includeMarkdown(system.file("help_files/Predictive_Ability_res.Rmd", package = "BIGapp")) ), - tabPanel("How to cite", value = "Predictive_Ability_cite", + tabPanel("How to cite", value = "Predictive_Ability_cite", br(), includeMarkdown(system.file("help_files/Predictive_Ability_cite.Rmd", package = "BIGapp")) )) ), box(title="Genomic Prediction", id = "Genomic_Prediction_box",width = 12, collapsible = TRUE, collapsed = TRUE, status = "info", solidHeader = TRUE, "his tab estimates the trait and estimated-breeding-values (EBVs) for either all individuals in a genomic dataset, or by training the model with one genomic dataset to predict the values in another.", + br(), br(), bs4Dash::tabsetPanel(id = "Genomic_Prediction_tabset", - tabPanel("Parameters description", value = "Genomic_Prediction_par", + tabPanel("Parameters description", value = "Genomic_Prediction_par", br(), includeMarkdown(system.file("help_files/Genomic_Prediction_par.Rmd", package = "BIGapp")) ), - tabPanel("Results description", value = "Genomic_Prediction_results", + tabPanel("Results description", value = "Genomic_Prediction_results", br(), includeMarkdown(system.file("help_files/Genomic_Prediction_res.Rmd", package = "BIGapp")) ), - tabPanel("How to cite", value = "Genomic_Prediction_cite", + tabPanel("How to cite", value = "Genomic_Prediction_cite", br(), includeMarkdown(system.file("help_files/Genomic_Prediction_cite.Rmd", package = "BIGapp")) )) ), diff --git a/inst/help_files/DAPC_res.Rmd b/inst/help_files/DAPC_res.Rmd index 470ae86..99bce83 100644 --- a/inst/help_files/DAPC_res.Rmd +++ b/inst/help_files/DAPC_res.Rmd @@ -6,7 +6,7 @@ date: "2024-08-29" * **Cluster assignments table** -
+ |K | BIC | |:---------:|:------------:| @@ -17,7 +17,6 @@ date: "2024-08-29" |Sample_5 | 5.0| |Sample_6 | 5.4| -
  diff --git a/inst/help_files/Genomic_Prediction_res.Rmd b/inst/help_files/Genomic_Prediction_res.Rmd index 93d9f55..d467256 100644 --- a/inst/help_files/Genomic_Prediction_res.Rmd +++ b/inst/help_files/Genomic_Prediction_res.Rmd @@ -16,6 +16,8 @@ date: "2024-08-29" | Sample_6 | 5.4 | 3.9 | +  + * **EBV table**: Estimated Breeding Values (EBVs) from genomic prediction are statistical estimates of an individual's genetic potential for a specific trait, calculated by combining genomic information with phenotypic and pedigree data. These values help predict an organism's ability to pass on desirable traits to its offspring, allowing for more accurate selection in breeding programs. The EBVs are predicted for all samples in either the input VCF file (if only one provided), or for all of the samples in the predictive VCF file. It is in the format of samples IDs in the first column, and each subsequent column being the information for the traits selected by the user. | Sample ID | Sepal Length | Sepal Width | diff --git a/inst/help_files/Predictive_Ability_res.Rmd b/inst/help_files/Predictive_Ability_res.Rmd index ea1fa3c..bfb1db6 100644 --- a/inst/help_files/Predictive_Ability_res.Rmd +++ b/inst/help_files/Predictive_Ability_res.Rmd @@ -10,7 +10,6 @@ date: "2024-08-29" * **Predictive ability table** -
|Iter | Sepal.Length | Sepal.Width | |:---------:|:------------:|:-----------:| @@ -19,6 +18,5 @@ date: "2024-08-29" |3 | 0.724| 0.543| -
  From 9813e52c6db98ec0f1ad155e49a9d086cb3b5528 Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Fri, 20 Dec 2024 16:04:06 -0500 Subject: [PATCH 28/38] GS and UI updates --- R/GS_functions.R | 4 +- R/app_ui.R | 2 +- R/mod_Filtering.R | 4 +- R/mod_GS.R | 475 ++++++++++++++++++++-------------------------- R/mod_GSAcc.R | 11 +- R/mod_help.R | 4 +- 6 files changed, 224 insertions(+), 276 deletions(-) diff --git a/R/GS_functions.R b/R/GS_functions.R index 03b5e4c..79a98da 100644 --- a/R/GS_functions.R +++ b/R/GS_functions.R @@ -311,9 +311,9 @@ GBLUP_genomic_prediction <- function(pheno_dat, Geno.mat, cycles, folds, traits, results[(((r-1)*5)+fold), (length(traits)+2)] <- fold # Extract GEBVs - GEBVs_fold[, trait_idx] <- traitpred$g[test] #Confirm it is accuract to calculate the GEBVs for testing group from the trained model + GEBVs_fold[, trait_idx] <- traitpred$g[test] - # Calculate heritability (these are wrong) + # Calculate heritability (*confirm this calculation* - either way will not report to user) Vu <- traitpred$Vg Ve <- traitpred$Ve heritability_scores[(((r-1)*5)+fold), trait_idx] <- Vu / (Vu + Ve) diff --git a/R/app_ui.R b/R/app_ui.R index 37f0d29..c9b058b 100644 --- a/R/app_ui.R +++ b/R/app_ui.R @@ -57,7 +57,7 @@ app_ui <- function(request) { menuItem("Home", tabName = "welcome", icon = icon("house"),startExpanded = FALSE), tags$li(class = "header", style = "color: grey; margin-top: 18px; margin-bottom: 10px; padding-left: 15px;", "Genotype Processing"), menuItem("Convert to VCF", tabName = "dosage2vcf", icon = icon("share-from-square")), - menuItem("Updog Dosage Calling", tabName = "updog", icon = icon("list-ol")), + menuItem("Dosage Calling", tabName = "updog", icon = icon("list-ol")), menuItem("VCF Filtering", tabName = "filtering", icon = icon("filter")), tags$li(class = "header", style = "color: grey; margin-top: 18px; margin-bottom: 10px; padding-left: 15px;", "Summary Metrics"), menuItem("Genomic Diversity", tabName = "diversity", icon = icon("chart-pie")), diff --git a/R/mod_Filtering.R b/R/mod_Filtering.R index 76a8be1..2c8308a 100644 --- a/R/mod_Filtering.R +++ b/R/mod_Filtering.R @@ -40,9 +40,9 @@ mod_Filtering_ui <- function(id){ numericInput(ns("maxpostprob_filter"), "Minimum maxpostprob (Updog filter)", min = 0, value = 0.5, step = 0.1) ) ), - actionButton(ns("run_filters"), "Apply filters"), + actionButton(ns("run_filters"), "Apply Filters"), useShinyjs(), - downloadButton(ns("start_updog_filter"), "Download Filtered VCF", icon = icon("download"), class = "butt"), + downloadButton(ns("start_updog_filter"), "Download", icon = icon("download"), class = "butt"), div(style="display:inline-block; float:right",dropdownButton( tags$h3("Updog Filter Parameters"), "You can download examples of the expected file here: \n", diff --git a/R/mod_GS.R b/R/mod_GS.R index f59a45d..933bb70 100644 --- a/R/mod_GS.R +++ b/R/mod_GS.R @@ -20,13 +20,13 @@ mod_GS_ui <- function(id){ fluidRow( column(width = 3, box(title="Inputs", width = 12, collapsible = TRUE, collapsed = FALSE, status = "info", solidHeader = TRUE, - fileInput(ns("pred_known_file"), "Choose Training VCF File", accept = c(".csv",".vcf",".gz")), - fileInput(ns("pred_trait_file"), "Choose Trait File", accept = ".csv"), - fileInput(ns("pred_est_file"), "Choose Prediction VCF File", accept = c(".csv",".vcf",".gz")), - numericInput(ns("pred_est_ploidy"), "Species Ploidy", min = 1, value = NULL), + "* Required", + fileInput(ns("pred_known_file"), "Choose VCF File*", accept = c(".csv",".vcf",".gz")), + fileInput(ns("pred_trait_file"), "Choose Trait File*", accept = ".csv"), + numericInput(ns("pred_est_ploidy"), "Species Ploidy*", min = 1, value = NULL), virtualSelectInput( inputId = ns("pred_trait_info2"), - label = "Select Trait (eg, Color):", + label = "Select Trait*", choices = NULL, showValueAsTags = TRUE, search = TRUE, @@ -34,12 +34,26 @@ mod_GS_ui <- function(id){ ), virtualSelectInput( inputId = ns("pred_fixed_info2"), - label = "Select Fixed Effects (optional) (not validated):", + label = span("Select Fixed Effects", bs4Badge("beta", position = "right", color = "success")), choices = NULL, showValueAsTags = TRUE, search = TRUE, multiple = TRUE ), + conditionalPanel( + condition = "input.pred_fixed_info2.length > 0", ns = ns, + div( + "(unselected will be considered covariates)", + virtualSelectInput( + inputId = ns("pred_fixed_cat2"), + label = "Select Categorical Fixed Effects", + choices = NULL, + showValueAsTags = TRUE, + search = TRUE, + multiple = TRUE + ) + ) + ), actionButton(ns("prediction_est_start"), "Run Analysis"), div(style="display:inline-block; float:right",dropdownButton( tags$h3("GP Parameters"), @@ -67,8 +81,8 @@ mod_GS_ui <- function(id){ column(width = 6, box(title = "Results", status = "info", solidHeader = FALSE, width = 12, height = 600, maximizable = T, bs4Dash::tabsetPanel( - tabPanel("Predicted Trait Table", DTOutput(ns("pred_trait_table")), style = "overflow-y: auto; height: 500px"), - tabPanel("GEBVs Table", DTOutput(ns("pred_gebvs_table2")),style = "overflow-y: auto; height: 500px") + tabPanel("Predicted Pheno Table", DTOutput(ns("pred_trait_table")), style = "overflow-y: auto; height: 500px"), + tabPanel("EBVs Table", DTOutput(ns("pred_gebvs_table2")),style = "overflow-y: auto; height: 500px") ) ) @@ -77,7 +91,7 @@ mod_GS_ui <- function(id){ column(width = 3, valueBoxOutput("shared_snps", width = NULL), box(title = "Status", width = 12, collapsible = TRUE, status = "info", - progressBar(id = "pb_gp", value = 0, status = "info", display_pct = TRUE, striped = TRUE, title = " ") + progressBar(id = ns("pb_gp"), value = 0, status = "info", display_pct = TRUE, striped = TRUE, title = " ") ), box(title = "Plot Controls", status = "warning", solidHeader = TRUE, collapsible = TRUE, width = 12, div(style="display:inline-block; float:left",dropdownButton( @@ -117,6 +131,7 @@ mod_GS_server <- function(input, output, session, parent_session){ advanced_options_pred <- reactiveValues( pred_model = "GBLUP", pred_matrix = "Gmatrix", + pred_est_file = NULL, ped_file = NULL ) @@ -134,13 +149,21 @@ mod_GS_server <- function(input, output, session, parent_session){ } }) + 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) + } else { + "" # Return an empty string if no file has been uploaded + } + }) + #UI popup window for input observeEvent(input$advanced_options_pred, { showModal(modalDialog( title = "Advanced Options (beta)", selectInput( inputId = ns('pred_model'), - label = 'Model Choice', + label = 'Method Choice', choices = c("GBLUP"), selected = advanced_options_pred$pred_model # Initialize with stored value ), @@ -149,12 +172,23 @@ mod_GS_server <- function(input, output, session, parent_session){ div( selectInput( inputId = ns('pred_matrix'), - label = 'GBLUP Matrix Choice', - choices = c("Gmatrix", "Amatrix", "Hmatrix"), + label = 'Relationship Matrix Choice', + #choices = c("Gmatrix", "Amatrix", "Hmatrix"), + choices = c("Gmatrix"), selected = advanced_options_pred$pred_matrix # Initialize with stored value ) ) ), + conditionalPanel( + condition = "input.pred_matrix != 'Amatrix'", ns = ns, + div( + fileInput(ns("pred_est_file"), "Choose Prediction VCF", accept = c(".vcf",".gz")), + conditionalPanel( + condition = "output.uploaded_file_name_pred !== ''", # Show only if there's content + textOutput(ns("uploaded_file_name_pred")) # Display the uploaded file name + ) + ) + ), conditionalPanel( condition = "input.pred_matrix != 'Gmatrix'", ns = ns, div( @@ -167,7 +201,7 @@ mod_GS_server <- function(input, output, session, parent_session){ ), footer = tagList( modalButton("Close"), - actionButton(ns("save_advanced_options"), "Save") + actionButton(ns("save_advanced_options_pred"), "Save") ) )) }) @@ -175,10 +209,11 @@ mod_GS_server <- function(input, output, session, parent_session){ #Close popup window when user "saves options" - observeEvent(input$save_advanced_options, { - advanced_options$pred_model <- input$pred_model - advanced_options$pred_matrix <- input$pred_matrix - advanced_options$ped_file <- input$ped_file + observeEvent(input$save_advanced_options_pred, { + advanced_options_pred$pred_model <- input$pred_model + advanced_options_pred$pred_matrix <- input$pred_matrix + 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 @@ -196,12 +231,12 @@ mod_GS_server <- function(input, output, session, parent_session){ info_df2 <- read.csv(input$pred_trait_file$datapath, header = TRUE, check.names = FALSE, nrow = 0) trait_var2 <- colnames(info_df2) trait_var2 <- trait_var2[2:length(trait_var2)] - #updateSelectInput(session, "pred_trait_info", choices = c("All", trait_var)) updateVirtualSelect("pred_fixed_info2", choices = trait_var2, session = session) updateVirtualSelect("pred_trait_info2", choices = trait_var2, session = session) - - #output$passport_table <- renderDT({info_df}, options = list(scrollX = TRUE,autoWidth = FALSE, pageLength = 4) - #) + }) + + 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 @@ -212,7 +247,8 @@ mod_GS_server <- function(input, output, session, parent_session){ est_geno_input = NULL, shared_snps = NULL, pred_genos = NULL, - pred_geno_pheno = NULL + pred_geno_pheno = NULL, + matrix = NULL ) pred_outputs2 <- reactiveValues( @@ -241,7 +277,7 @@ mod_GS_server <- function(input, output, session, parent_session){ 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_est_file$datapath) | is.null(input$pred_trait_file$datapath)) { + if (is.null(input$pred_known_file$datapath) | is.null(input$pred_trait_file$datapath)) { shinyalert( title = "Missing input!", text = "Upload VCF and phenotype files", @@ -257,7 +293,7 @@ mod_GS_server <- function(input, output, session, parent_session){ animation = TRUE ) } - req(input$pred_known_file$datapath, input$pred_est_file$datapath, input$pred_trait_file$datapath, input$pred_est_ploidy) + 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") @@ -278,7 +314,7 @@ mod_GS_server <- function(input, output, session, parent_session){ # If condition is met, show notification toast shinyalert( - title = "Oops", + title = "Missing input!", text = "No traits were selected", size = "xs", closeOnEsc = TRUE, @@ -330,19 +366,27 @@ mod_GS_server <- function(input, output, session, parent_session){ } #Convert VCF file if submitted - train_vcf <- vcfR::read.vcfR(train_geno_path) - est_vcf <- vcfR::read.vcfR(est_geno_path) + train_vcf <- vcfR::read.vcfR(train_geno_path, verbose = FALSE) + if (is.null(est_geno_path) || is.na(est_geno_path)){ + est_vcf <- NULL + } else { + 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 + } else { + est_geno <- extract.gt(est_vcf, element = "GT") + est_geno <- apply(est_geno, 2, convert_to_dosage) + class(est_geno) <- "numeric" + } train_geno <- extract.gt(train_vcf, element = "GT") train_geno <- apply(train_geno, 2, convert_to_dosage) - est_geno <- extract.gt(est_vcf, element = "GT") - est_geno <- apply(est_geno, 2, convert_to_dosage) class(train_geno) <- "numeric" - class(est_geno) <- "numeric" rm(train_vcf) rm(est_vcf) @@ -350,7 +394,7 @@ mod_GS_server <- function(input, output, session, parent_session){ # If condition is met, show notification toast shinyalert( - title = "Oops", + title = "File Error", text = "No valid genotype file detected", size = "xs", closeOnEsc = TRUE, @@ -369,9 +413,6 @@ mod_GS_server <- function(input, output, session, parent_session){ return() } - #Save number of samples in file - #pred_inputs$pred_genos <- ncol(geno) - #Check that the ploidy entered is correct if (ploidy != max(train_geno, na.rm = TRUE)) { # If condition is met, show notification toast @@ -407,7 +448,11 @@ mod_GS_server <- function(input, output, session, parent_session){ #tranforming genotypes train_geno_adj_init <- convert_genotype(train_geno, as.numeric(ploidy)) - est_geno_adj_init <- convert_genotype(est_geno, as.numeric(ploidy)) + if (is.null(est_geno)) { + est_geno_adj_init <- NULL + } else { + est_geno_adj_init <- convert_genotype(est_geno, as.numeric(ploidy)) + } #Make sure the trait file and genotype file are in the same order # Column names for geno (assuming these are the individual IDs) @@ -424,8 +469,8 @@ mod_GS_server <- function(input, output, session, parent_session){ # If condition is met, show notification toast shinyalert( - title = "Oops", - text = "All samples were missing from the phenotype file", + title = "Data Mismatch", + text = "All genotyped samples were missing from the phenotype file", size = "xs", closeOnEsc = TRUE, closeOnClickOutside = FALSE, @@ -446,8 +491,8 @@ mod_GS_server <- function(input, output, session, parent_session){ } else if (length(common_ids) < length(colnames_geno)) { # If condition is met, show notification toast shinyalert( - title = "Data Mismatch", - text = paste0((length(colnames_geno)-length(common_ids))," samples were removed for not having trait information"), + title = "Data Check", + text = paste0((length(common_ids))," samples in VCF File have trait information"), size = "xs", closeOnEsc = FALSE, closeOnClickOutside = FALSE, @@ -498,32 +543,45 @@ mod_GS_server <- function(input, output, session, parent_session){ } } ) - - - # Subset and reorder geno and pheno to ensure they only contain and are ordered by common IDs - train_geno_adj <- train_geno_adj_init[, common_ids] # Assuming that the columns can be directly indexed by IDs - pheno2 <- pheno2[match(common_ids, ids_pheno), ] - - #Save to reactive values - pred_inputs2$pheno_input <- pheno2 - #pred_inputs$geno_adj_input <- geno_adj - - #Match training and testing genotype file SNPs - common_markers <- intersect(rownames(train_geno_adj), rownames(est_geno_adj_init)) - train_geno_adj <- train_geno_adj[common_markers, ] - est_geno_adj_init <- est_geno_adj_init[common_markers, ] + + #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) + + } 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 + train_geno_adj <- train_geno_adj_init[common_markers, common_ids] + #Merge the training and prediction genotype matrices + est_geno_adj_init <- est_geno_adj_init[common_markers, ] + train_pred_geno <- cbind(train_geno_adj, est_geno_adj_init) + + #Matrix + Kin_mat <- A.mat(t(train_pred_geno), max.missing=NULL,impute.method="mean",return.imputed=FALSE) + + } #Save to reactive values pred_inputs2$shared_snps <- length(common_markers) - pred_inputs2$train_geno_input <- train_geno_adj - pred_inputs2$est_geno_input <- est_geno_adj_init - + 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$train_geno_input) + req(continue_prediction2(),pred_inputs2$pheno_input, pred_inputs2$matrix) # Stop analysis if cancel was selected if (isFALSE(continue_prediction2())) { @@ -532,220 +590,80 @@ mod_GS_server <- function(input, output, session, parent_session){ #Variables ploidy <- as.numeric(input$pred_est_ploidy) - train_geno_adj <- pred_inputs2$train_geno_input - est_geno_adj <- pred_inputs2$est_geno_input - pheno <- pred_inputs2$pheno_input + gmat <- pred_inputs2$matrix + pheno2 <- pred_inputs2$pheno_input traits <- input$pred_trait_info2 - #CVs <- as.numeric(input$pred_cv) - #train_perc <- as.numeric(input$pred_folds) - fixed_traits <- input$pred_fixed_info2 - cores <- input$pred_cores - - ##Need to add ability for the use of parallelism for the for cross-validation - ##Example at this tutorial also: https://www.youtube.com/watch?v=ARWjdQU6ays - - # Function to perform genomic prediction - ##Make sure this is correct (I think I need to be generating a relationship matrix A.mat() to account for missing data, but I am not sure how that works with this) - genomic_prediction2 <- function(train_geno,est_geno, Pheno, traits, fixed_effects = NULL, cores = 1) { - - # Define variables - traits <- traits - #cycles <- as.numeric(Iters) - #Folds <- as.numeric(Fold) - total_population <- ncol(train_geno) - #train_size <- floor(percentage / 100 * total_population) - fixed_traits <- fixed_effects - cores <- as.numeric(cores) - - # Initialize a list to store GEBVs for all traits and cycles - GEBVs <- list() - - #Cross validation number for progress bar (not involved in the calculations, just shiny visuals) - pb_value = 10 - - #Remove the fixed traits from the Pheno file - if (length(fixed_traits) == 0) { - Pheno <- Pheno - } else { - #Subset fixed traits - Fixed <- subset(Pheno, select = fixed_traits) - - #Pheno <- subset(Pheno, select = -fixed_traits) - convert_all_to_factor_if_not_numeric <- function(df) { - for (col in names(df)) { - if (!is.numeric(df[[col]]) && !is.integer(df[[col]])) { - df[[col]] <- as.factor(df[[col]]) - } - } - return(df) - } - # Convert all columns to factor if they are not numeric or integer - Fixed <- convert_all_to_factor_if_not_numeric(Fixed) - - #Fixed <- as.data.frame(lapply(Fixed, as.factor)) #convert to factor - row.names(Fixed) <- row.names(Pheno) - - #Make the matrix - formula_str <- paste("~", paste(fixed_traits, collapse = " + ")) - formula <- as.formula(formula_str) - - # Create the design matrix using the constructed formula - Fixed <- model.matrix(formula, data = Fixed) - } - - #Make kinship matrix of all individuals? - #Kin_mat <- A.mat(t(geno), n.core = 1) ##Need to explore whether or not to use a Kinship matrix and if it makes a significant improvement to accuracy - #If wanting to use Kkinship matrix, will then need to see how to implement it here - - #For now, I am just imputing the missing sites using mean, but EM is more accurate, but slower (can use multiple cores). - impute = (A.mat(t(train_geno), max.missing=1,impute.method="mean",return.imputed=TRUE)) - train_geno <- impute$imputed - impute = (A.mat(t(est_geno), max.missing=1,impute.method="mean",return.imputed=TRUE)) - est_geno <- impute$imputed - - #Match training and testing genotype file SNPs - common_markers <- intersect(colnames(train_geno), colnames(est_geno)) - train_geno <- train_geno[ ,common_markers] - est_geno <- est_geno[ ,common_markers] - - #Calculate predicted traits and GEBVs - #fold_ids <- sample(rep(1:Folds, length.out = total_population)) - #fold_df <- data.frame(Sample = row.names(geno), FoldID = fold_ids) #Randomly assign each sample to a fold - #fold_results <- matrix(nrow = Folds, ncol = length(traits)) - #colnames(fold_results) <- traits - - #Status - updateProgressBar(session = session, id = "pb_gp", value = 50, title = "Estimating Predicted Values") - - train <- row.names(train_geno) - - #Subset datasets - #if (length(fixed_traits) == 0) { - # Fixed_train = NULL - #} else{ - # Fixed_train <- data.frame(Fixed[train, ]) - # Fixed_train <- as.matrix(Fixed_train) - # row.names(Fixed_train) <- train - #colnames(Fixed_train) <- colnames(Fixed) - Fixed_train = NULL - - #Fixed (testing) - # Fixed_test<- data.frame(Fixed[test, ]) - # Fixed_test <- as.matrix(Fixed_test) - # row.names(Fixed_test) <- test - #colnames(Fixed_test) <- colnames(Fixed) - - Pheno_train <- Pheno[train, ] # Subset the phenotype df to only retain the relevant samples from the training set - m_train <- train_geno - #Pheno_test <- Pheno[test, ] - #Fixed_test <- Fixed[test, ] #Where would the Fixed_test be used? - m_valid <- est_geno - - print(dim(m_train)) - print(dim(m_valid)) - - # Initialize a matrix to store GEBVs for this fold - GEBVs_fold <- matrix(nrow = nrow(est_geno), ncol = length(traits)) - colnames(GEBVs_fold) <- c(traits) - rownames(GEBVs_fold) <- row.names(est_geno) - - Pred_results <- matrix(nrow = nrow(est_geno), ncol = length(traits)) - colnames(Pred_results) <- c(traits) - rownames(Pred_results) <- row.names(est_geno) - - #Evaluate each trait using the same train and testing samples for each - for (trait_idx in 1:length(traits)) { - trait <- Pheno_train[, traits[trait_idx]] # Get the trait of interest - trait_answer <- mixed.solve(y= trait, Z = m_train, K = NULL, X = Fixed_train, SE = FALSE, return.Hinv = FALSE) - TRT <- trait_answer$u - e <- as.matrix(TRT) - pred_trait_test <- m_valid %*% e - pred_trait <- pred_trait_test[, 1] + c(trait_answer$beta) # Make sure this still works when using multiple traits - Pred_results[, trait_idx] <- pred_trait #save to dataframe - - # Extract GEBVs - # Check if Fixed_train is not NULL and include beta if it is - if (!is.null(Fixed_train) && !is.null(trait_answer$beta)) { - # Calculate GEBVs including fixed effects - #GEBVs_fold[, trait_idx] <- m_train %*% trait_answer$u + Fixed_train %*% matrix(trait_answer$beta, nrow = length(trait_answer$beta), ncol = 1) - #GEBVs_fold[, trait_idx] <- m_valid %*% trait_answer$u + Fixed_test %*% matrix(trait_answer$beta, nrow = length(trait_answer$beta), ncol = 1) - GEBVs_fold[, trait_idx] <- m_valid %*% trait_answer$u + Fixed_test %*% trait_answer$beta - } else { - # Calculate GEBVs without fixed effects - #GEBVs_fold[, trait_idx] <- m_train %*% trait_answer$u - GEBVs_fold[, trait_idx] <- m_valid %*% trait_answer$u #Confirm it is accuract to calculate the GEBVs for testing group from the trained model - } - - # Calculate heritability for the current trait - #Vu <- trait_answer$Vu - #Ve <- trait_answer$Ve - #heritability_scores[(((r-1)*5)+fold), trait_idx] <- Vu / (Vu + Ve) - - } - #Add iter and fold information for each trait/result - #heritability_scores[(((r-1)*5)+fold), (length(traits)+1)] <- r - #heritability_scores[(((r-1)*5)+fold), (length(traits)+2)] <- fold - - #Add sample, iteration, and fold information to GEBVs_fold - #GEBVs_fold[,"Iter"] = r - #GEBVs_fold[,"Fold"] = fold - #GEBVs_fold[,"Sample"] <- row.names(est_geno) - - # Store GEBVs for this fold - GEBVs_df <- data.frame(GEBVs_fold) - - Pred_results <- data.frame(Pred_results) - - - # Store GEBVs for this cycle - #GEBVs[[r]] <- do.call(rbind, GEBVs_cycle) - - - # Combine all GEBVs into a single DataFrame - #GEBVs_df <- as.data.frame(do.call(rbind, GEBVs)) - - #results <- as.data.frame(results) - #heritability_scores <- as.data.frame(heritability_scores) - - # Combine results and heritability_scores using cbind - #combined_results <- cbind(results, heritability_scores) - - return(list(GEBVs = GEBVs_df, Predictions = Pred_results)) + # Assign fixed_cat based on input$pred_fixed_cat2 + if (!is.null(input$pred_fixed_cat2) && length(input$pred_fixed_cat2) > 0) { + fixed_cat <- input$pred_fixed_cat2 + } else { + fixed_cat <- NULL } - - # Example call to the function - #This is slow when using 3k markers and 1.2k samples...will need to parallelize if using this script... - results <- genomic_prediction2(train_geno_adj, est_geno_adj, pheno, traits = traits, fixed_effects = fixed_traits, cores = cores) - - #With fixed effects (need to inforporate the ability for fixed effects into the prediction?) - #results <- genomic_prediction(geno_matrix, phenotype_df, c("height", "weight"), "~ age + sex") - - #Save to reactive value - pred_outputs2$trait_output <- results$Predictions - pred_outputs2$all_GEBVs <- results$GEBVs - #TESTING!!! - #write.csv(results$GEBVs, "GEBVs_test.csv") - - # Convert trait columns to numeric - results$GEBVs <- results$GEBVs %>% - mutate(across(all_of(traits), ~ as.numeric(.x))) - - - #Get average accuracy and h2 for each iter accross the 5 folds - - #columns <- setdiff(colnames(results$CombinedResults), c("Iter","Fold")) - #average_accuracy_df <- results$CombinedResults %>% - # group_by(Iter) %>% - # summarize(across(all_of(columns), mean, na.rm = TRUE)) - + # Assign fixed_cov based on conditions + if (!is.null(fixed_cat) && length(fixed_cat) == length(input$pred_fixed_info2)) { + fixed_cov <- NULL + } else if (length(input$pred_fixed_info2) > 0 && is.null(fixed_cat)) { + fixed_cov <- input$pred_fixed_info2 + } else { + fixed_cov <- setdiff(input$pred_fixed_info2, input$pred_fixed_cat2) + } + #fixed_cov <- setdiff(input$pred_fixed_info2, input$pred_fixed_cat2) + 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") - - ##Figures and Tables - + + #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(data = pheno2, + geno = colnames(pheno2)[1], + pheno = traits[trait_idx], + fixed = fixed_cat, + covariate = fixed_cov, + 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)) { + # Subset rows where 'w/Pheno' is FALSE and drop the 'w/Pheno' column + pred_outputs2$all_GEBVs <- results_GEBVs[results_GEBVs$`w/Pheno` == FALSE, !names(results_GEBVs) %in% "w/Pheno"] + } 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 + pred_outputs2$trait_output <- results_TRAITs[results_TRAITs$`w/Pheno` == FALSE, !names(results_TRAITs) %in% "w/Pheno"] + } else{ + pred_outputs2$trait_output <- results_TRAITs + } #End the event continue_prediction2(NULL) @@ -799,6 +717,35 @@ 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() { + paste0("Prediction-results-", Sys.Date(), ".zip") + }, + content = function(file) { + # 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 diff --git a/R/mod_GSAcc.R b/R/mod_GSAcc.R index ded934b..472e2b5 100644 --- a/R/mod_GSAcc.R +++ b/R/mod_GSAcc.R @@ -34,7 +34,7 @@ mod_GSAcc_ui <- function(id){ ), virtualSelectInput( inputId = ns("pred_fixed_info"), - label = "Select Fixed Effects (optional) (not validated):", + label = span("Select Fixed Effects", bs4Badge("beta", position = "right", color = "success")), choices = NULL, showValueAsTags = TRUE, search = TRUE, @@ -42,10 +42,11 @@ mod_GSAcc_ui <- function(id){ ), conditionalPanel( condition = "input.pred_fixed_info.length > 0", ns = ns, + "(unselected will be considered covariates)", div( virtualSelectInput( inputId = ns("pred_fixed_cat"), - label = "Select Categorical Fixed Effects (unselected will be considered covariates)", + label = "Select Categorical Fixed Effects", choices = NULL, showValueAsTags = TRUE, search = TRUE, @@ -81,7 +82,7 @@ mod_GSAcc_ui <- function(id){ bs4Dash::tabsetPanel( tabPanel("Violin Plot", plotOutput(ns("pred_violin_plot"), height = "500px")), tabPanel("Box Plot", plotOutput(ns("pred_box_plot"), height = "500px")), - tabPanel("Accuracy Table", DTOutput(ns("pred_acc_table")), style = "overflow-y: auto; height: 500px") + tabPanel("P.A. Table", DTOutput(ns("pred_acc_table")), style = "overflow-y: auto; height: 500px") ) ) @@ -163,7 +164,7 @@ mod_GSAcc_server <- function(input, output, session, parent_session){ title = "Advanced Options (beta)", selectInput( inputId = ns('pred_model'), - label = 'Model Choice', + label = 'Method Choice', choices = c("GBLUP"), selected = advanced_options$pred_model # Initialize with stored value ), @@ -172,7 +173,7 @@ mod_GSAcc_server <- function(input, output, session, parent_session){ div( selectInput( inputId = ns('pred_matrix'), - label = 'GBLUP Matrix Choice', + label = 'Relationship Matrix Choice', choices = c("Gmatrix", "Amatrix", "Hmatrix"), selected = advanced_options$pred_matrix # Initialize with stored value ) diff --git a/R/mod_help.R b/R/mod_help.R index 52b7206..69d0ca0 100644 --- a/R/mod_help.R +++ b/R/mod_help.R @@ -13,7 +13,7 @@ mod_help_ui <- function(id){ fluidPage( column(width=12), column(width=12, - box(title="DArT Report2VCF", id = "DArT_Report2VCF_box",width = 12, collapsible = TRUE, collapsed = TRUE, status = "info", solidHeader = TRUE, + box(title="Convert to VCF", id = "DArT_Report2VCF_box",width = 12, collapsible = TRUE, collapsed = TRUE, status = "info", solidHeader = TRUE, "This tab converts the processed genotype and counts files from DArT into a VCF file (v4.3). This file can then be used as the genotype input for the analyses within BIGapp or used with other genomics applications.", br(), br(), bs4Dash::tabsetPanel(id = "DArT_Report2VCF_tabset", @@ -27,7 +27,7 @@ mod_help_ui <- function(id){ includeMarkdown(system.file("help_files/DArT_Report2VCF_cite.Rmd", package = "BIGapp")) )) ), - box(title="Updog Dosage Calling", id = "Updog_Dosage_Calling_box",width = 12, collapsible = TRUE, collapsed = TRUE, status = "info", solidHeader = TRUE, + box(title="Dosage Calling", id = "Updog_Dosage_Calling_box",width = 12, collapsible = TRUE, collapsed = TRUE, status = "info", solidHeader = TRUE, "This tab is designed to handle the process of dosage calling in genomic data. Dosage calling is essential for determining the number of copies of a particular allele at each genomic location.", br(), br(), bs4Dash::tabsetPanel(id = "Updog_Dosage_Calling_tabset", From f6288faed940f179a6da1308bb5fde38932f76b3 Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Sat, 21 Dec 2024 10:25:57 -0500 Subject: [PATCH 29/38] Check for Updates fix --- R/app_server.R | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/R/app_server.R b/R/app_server.R index ae734bf..2052408 100644 --- a/R/app_server.R +++ b/R/app_server.R @@ -73,12 +73,15 @@ app_server <- function(input, output, session) { #Check for updates from GitHub for BIGapp get_latest_github_commit <- function(repo, owner) { - url <- paste0("https://api.github.com/repos/", owner, "/", repo, "/commits/main") + url <- paste0("https://api.github.com/repos/", owner, "/", repo, "/releases/latest") response <- GET(url) content <- content(response, "parsed") if (status_code(response) == 200) { - return(content$sha) + tag_name <- content$tag_name + clean_tag_name <- sub("-.*", "", tag_name) + clean_tag_name <- sub("v", "", clean_tag_name) + return(clean_tag_name) } else { return(NULL) } From 05ad6642d49aa275bdbe0d5c362694d94f19a262 Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Sat, 21 Dec 2024 15:03:49 -0500 Subject: [PATCH 30/38] Added PIC calculation --- R/mod_diversity.R | 47 ++++++++++++++++++++++++++++++++++------------- R/utils.R | 2 +- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/R/mod_diversity.R b/R/mod_diversity.R index a9c3141..b598ac3 100644 --- a/R/mod_diversity.R +++ b/R/mod_diversity.R @@ -93,7 +93,8 @@ mod_diversity_server <- function(input, output, session, parent_session){ het_df = NULL, maf_df = NULL, pos_df = NULL, - markerPlot = NULL + markerPlot = NULL, + snp_stats = NULL ) #Reactive boxes @@ -165,15 +166,15 @@ mod_diversity_server <- function(input, output, session, parent_session){ geno_mat <- apply(geno_mat, 2, convert_to_dosage) rm(vcf) #Remove VCF - print(class(geno_mat)) + #print(class(geno_mat)) #Convert genotypes to alternate counts if they are the reference allele counts #Importantly, the dosage plot is based on the input format NOT the converted genotypes - is_reference <- TRUE #(input$zero_value == "Reference Allele Counts") + is_reference <- FALSE #(input$zero_value == "Reference Allele Counts") - print("Genotype file successfully imported") + #print("Genotype file successfully imported") ######Get MAF plot (Need to remember that the VCF genotypes are likely set as 0 = homozygous reference, where the dosage report is 0 = homozygous alternate) - print("Starting percentage calc") + #print("Starting percentage calc") #Status updateProgressBar(session = session, id = "pb_diversity", value = 70, title = "Calculating...") # Calculate percentages for both genotype matrices @@ -182,7 +183,7 @@ mod_diversity_server <- function(input, output, session, parent_session){ percentages1_df <- as.data.frame(t(percentages1)) percentages1_df$Data <- "Dosages" # Assuming my_data is your dataframe - print("Percentage Complete: melting dataframe") + #print("Percentage Complete: melting dataframe") melted_data <- percentages1_df %>% pivot_longer(cols = -(Data),names_to = "Dosage", values_to = "Percentage") @@ -197,12 +198,32 @@ mod_diversity_server <- function(input, output, session, parent_session){ # Calculating heterozygosity diversity_items$het_df <- calculate_heterozygosity(geno_mat, ploidy = ploidy) - print("Heterozygosity success") + #print("Heterozygosity success") diversity_items$maf_df <- calculateMAF(geno_mat, ploidy = ploidy) diversity_items$maf_df <- diversity_items$maf_df[, c(1,3)] - print("MAF success") - + #Calculate PIC + Fre <-calc_allele_frequencies(geno_mat,as.numeric(ploidy)) + calc_pic <- function(x) { + freq_squared <- x^2 + outer_matrix <- outer(freq_squared, freq_squared) + upper_tri_sum <- sum(outer_matrix[upper.tri(outer_matrix)]) + pic <- 1 - sum(freq_squared) - 2*upper_tri_sum + return(pic) + } + + print(Fre[1:5,]) + + PIC_results <- apply(Fre[, c("p1", "p2")], 1, calc_pic) + PIC_df <- data.frame(SNP_ID = Fre$SNP, PIC = PIC_results) + rownames(PIC_df) <- NULL + + print(PIC_df[1:5,]) + print(diversity_items$maf_df[1:5,]) + + diversity_items$snp_stats <- (merge(diversity_items$maf_df, PIC_df, by = "SNP_ID", all = TRUE))[,c("SNP_ID","MAF","PIC")] + colnames(diversity_items$snp_stats)[1] <- "SNP" + #Updating value boxes output$mean_het_box <- renderValueBox({ valueBox( @@ -336,9 +357,9 @@ mod_diversity_server <- function(input, output, session, parent_session){ snp_table <- reactive({ validate( - need(!is.null(diversity_items$maf_df), "Input VCF, define parameters and click `run analysis` to access results in this session.") + need(!is.null(diversity_items$snp_stats), "Input VCF, define parameters and click `run analysis` to access results in this session.") ) - diversity_items$maf_df + diversity_items$snp_stats }) output$snp_table <- renderDT({snp_table()}, options = list(scrollX = TRUE,autoWidth = FALSE, pageLength = 5)) @@ -404,10 +425,10 @@ mod_diversity_server <- function(input, output, session, parent_session){ temp_files <- c(temp_files, het_file) } - if (!is.null(diversity_items$maf_df)) { + if (!is.null(diversity_items$snp_stats)) { # Create a temporary file for BIC data frame maf_file <- file.path(temp_dir, paste0("SNP-statistics-", Sys.Date(), ".csv")) - write.csv(diversity_items$maf_df, maf_file, row.names = FALSE) + write.csv(diversity_items$snp_stats, maf_file, row.names = FALSE) temp_files <- c(temp_files, maf_file) } diff --git a/R/utils.R b/R/utils.R index 9e78b21..096f3ef 100644 --- a/R/utils.R +++ b/R/utils.R @@ -210,7 +210,7 @@ calculate_heterozygosity <- function(genotype_matrix, ploidy = 2) { # Create a dataframe with Sample ID and Observed Heterozygosity result_df <- data.frame( SampleID = colnames(genotype_matrix), - ObservedHeterozygosity = heterozygosity_proportion, + Ho = heterozygosity_proportion, row.names = NULL, check.names = FALSE ) From 15e81dab4e72db27adefc794f5e1862b3ce64c45 Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Sun, 22 Dec 2024 11:06:21 -0500 Subject: [PATCH 31/38] Suppressed console output and updated warnings --- R/mod_DosageCall.R | 10 ++++++++++ R/mod_Filtering.R | 10 ++++++++++ R/mod_GS.R | 11 +++++++++++ R/mod_GSAcc.R | 11 +++++++++++ R/mod_PCA.R | 13 ++++++++++++- R/mod_dapc.R | 42 +++++++++++++++++++++++++++++++++++++----- R/mod_diversity.R | 11 +++++++++++ R/mod_dosage2vcf.R | 10 ++++++++++ R/mod_gwas.R | 12 +++++++++++- R/run_app.R | 5 +++++ 10 files changed, 128 insertions(+), 7 deletions(-) diff --git a/R/mod_DosageCall.R b/R/mod_DosageCall.R index 638ca26..50c73cd 100644 --- a/R/mod_DosageCall.R +++ b/R/mod_DosageCall.R @@ -10,12 +10,22 @@ #' @importFrom shiny NS tagList #' @importFrom future availableCores #' @importFrom bs4Dash renderValueBox +#' @import shinydisconnect #' #' mod_DosageCall_ui <- function(id){ ns <- NS(id) tagList( fluidPage( + disconnectMessage( + text = "An input file error occurred, please reload the application and check the file.", + refresh = "Reload now", + background = "white", + colour = "grey", + overlayColour = "grey", + overlayOpacity = 0.3, + refreshColour = "purple" + ), fluidRow( box( title = "Inputs", status = "info", solidHeader = TRUE, collapsible = FALSE, collapsed = FALSE, diff --git a/R/mod_Filtering.R b/R/mod_Filtering.R index 2c8308a..a5233b3 100644 --- a/R/mod_Filtering.R +++ b/R/mod_Filtering.R @@ -13,12 +13,22 @@ #' @importFrom shinyjs enable disable useShinyjs #' #' @import dplyr +#' @import shinydisconnect #' #' mod_Filtering_ui <- function(id){ ns <- NS(id) tagList( fluidRow( + disconnectMessage( + text = "An input file error occurred, please reload the application and check the file.", + refresh = "Reload now", + background = "white", + colour = "grey", + overlayColour = "grey", + overlayOpacity = 0.3, + refreshColour = "purple" + ), column(width = 3, box(width = 12, title = "Quality Filtering", status = "info", solidHeader = TRUE, collapsible = TRUE, collapsed = FALSE, diff --git a/R/mod_GS.R b/R/mod_GS.R index 933bb70..74903be 100644 --- a/R/mod_GS.R +++ b/R/mod_GS.R @@ -12,12 +12,22 @@ #' @importFrom bs4Dash valueBox #' @importFrom shiny NS tagList #' @importFrom shinyWidgets virtualSelectInput progressBar +#' @import shinydisconnect #' #' mod_GS_ui <- function(id){ ns <- NS(id) tagList( fluidRow( + disconnectMessage( + text = "An input file error occurred, please reload the application and check the file.", + refresh = "Reload now", + background = "white", + colour = "grey", + overlayColour = "grey", + overlayOpacity = 0.3, + refreshColour = "purple" + ), column(width = 3, box(title="Inputs", width = 12, collapsible = TRUE, collapsed = FALSE, status = "info", solidHeader = TRUE, "* Required", @@ -126,6 +136,7 @@ mod_GS_ui <- function(id){ mod_GS_server <- function(input, output, session, parent_session){ ns <- session$ns + #Default model choices advanced_options_pred <- reactiveValues( diff --git a/R/mod_GSAcc.R b/R/mod_GSAcc.R index 472e2b5..c62b7f0 100644 --- a/R/mod_GSAcc.R +++ b/R/mod_GSAcc.R @@ -12,12 +12,22 @@ #' @importFrom bs4Dash valueBox #' @importFrom shiny NS tagList #' @importFrom shinyWidgets virtualSelectInput +#' @import shinydisconnect #' mod_GSAcc_ui <- function(id){ ns <- NS(id) tagList( # Add GWAS content here fluidRow( + disconnectMessage( + text = "An input file error occurred, please reload the application and check the file.", + refresh = "Reload now", + background = "white", + colour = "grey", + overlayColour = "grey", + overlayOpacity = 0.3, + refreshColour = "purple" + ), column(width = 3, box(title="Inputs", width = 12, collapsible = TRUE, collapsed = FALSE, status = "info", solidHeader = TRUE, fileInput(ns("pred_file"), "Choose VCF File", accept = c(".csv",".vcf",".gz")), @@ -137,6 +147,7 @@ mod_GSAcc_server <- function(input, output, session, parent_session){ ns <- session$ns + #Default model choices advanced_options <- reactiveValues( pred_model = "GBLUP", diff --git a/R/mod_PCA.R b/R/mod_PCA.R index 106931f..2bb331b 100644 --- a/R/mod_PCA.R +++ b/R/mod_PCA.R @@ -18,6 +18,15 @@ mod_PCA_ui <- function(id){ tagList( # Add PCA content here fluidRow( + disconnectMessage( + text = "An input file error occurred, please reload the application and check the file.", + refresh = "Reload now", + background = "white", + colour = "grey", + overlayColour = "grey", + overlayOpacity = 0.3, + refreshColour = "purple" + ), useShinyjs(), inlineCSS(list(.borderred = "border-color: red", .redback = "background: red")), @@ -113,12 +122,14 @@ mod_PCA_ui <- function(id){ #' @importFrom plotly layout plotlyOutput renderPlotly add_markers plot_ly #' @importFrom RColorBrewer brewer.pal #' @importFrom shinyjs toggleClass +#' @import shinydisconnect #' #' @noRd mod_PCA_server <- function(input, output, session, parent_session){ ns <- session$ns - + options(warn = -1) #Uncomment to suppress warnings + #PCA reactive values pca_data <- reactiveValues( pc_df_pop = NULL, diff --git a/R/mod_dapc.R b/R/mod_dapc.R index 1399866..a642501 100644 --- a/R/mod_dapc.R +++ b/R/mod_dapc.R @@ -8,11 +8,21 @@ #' @noRd #' #' @importFrom shiny NS tagList +#' @import shinydisconnect mod_dapc_ui <- function(id){ ns <- NS(id) tagList( # Add PCA content here fluidRow( + disconnectMessage( + text = "An input file error occurred, please reload the application and check the file.", + refresh = "Reload now", + background = "white", + colour = "grey", + overlayColour = "grey", + overlayOpacity = 0.3, + refreshColour = "purple" + ), column(width = 3, bs4Dash::box( title = "Inputs", width = 12, solidHeader = TRUE, status = "info", @@ -113,7 +123,6 @@ mod_dapc_server <- function(input, output, session, parent_session){ ns <- session$ns - dapc_items <- reactiveValues( grp = NULL, bestK = NULL, @@ -144,6 +153,9 @@ mod_dapc_server <- function(input, output, session, parent_session){ ) } req(input$dosage_file$datapath, input$dapc_ploidy) + + #PB + updateProgressBar(session = session, id = "pb_dapc", value = 5, title = "Importing input files") ploidy <- as.numeric(input$dapc_ploidy) maxK <- as.numeric(input$dapc_kmax) @@ -171,7 +183,10 @@ mod_dapc_server <- function(input, output, session, parent_session){ genotypeMatrix <- apply(genotypeMatrix, 2, convert_to_dosage) rm(vcf) #Remove VCF } - + + #PB + updateProgressBar(session = session, id = "pb_dapc", value = 30, title = "Calculating K") + #Perform analysis get_k <- findK(genotypeMatrix, maxK, ploidy) @@ -179,6 +194,10 @@ mod_dapc_server <- function(input, output, session, parent_session){ dapc_items$grp <- get_k$grp dapc_items$bestK <- get_k$bestK dapc_items$BIC <- get_k$BIC + + #PB + updateProgressBar(session = session, id = "pb_dapc", value = 100, title = "Step 1: Finished!") + }) observeEvent(input$dapc_start, { @@ -203,7 +222,10 @@ mod_dapc_server <- function(input, output, session, parent_session){ ) } req(input$dosage_file$datapath, input$dapc_ploidy, input$dapc_k) - + + #Pb + updateProgressBar(session = session, id = "pb_dapc", value = 5, title = "Importing input files") + geno <- input$dosage_file$datapath ploidy <- as.numeric(input$dapc_ploidy) selected_K <- as.numeric(input$dapc_k) @@ -216,7 +238,10 @@ mod_dapc_server <- function(input, output, session, parent_session){ # Apply the function to the first INFO string info_ids <- extract_info_ids(info[1]) - + + #Pb + updateProgressBar(session = session, id = "pb_dapc", value = 30, title = "Formatting files") + #Get the genotype values if the updog dosage calls are present if ("UD" %in% info_ids) { genotypeMatrix <- extract.gt(vcf, element = "UD") @@ -228,13 +253,20 @@ mod_dapc_server <- function(input, output, session, parent_session){ genotypeMatrix <- apply(genotypeMatrix, 2, convert_to_dosage) rm(vcf) #Remove VCF } - + + #Pb + updateProgressBar(session = session, id = "pb_dapc", value = 60, title = "Performing DAPC") + #Perform analysis clusters <- performDAPC(genotypeMatrix, selected_K, ploidy) #Assign results to reactive value dapc_items$assignments <- clusters$Q dapc_items$dapc <- clusters$dapc + + #Pb + updateProgressBar(session = session, id = "pb_dapc", value = 100, title = "Finished!") + }) ###Outputs from DAPC diff --git a/R/mod_diversity.R b/R/mod_diversity.R index b598ac3..cead00c 100644 --- a/R/mod_diversity.R +++ b/R/mod_diversity.R @@ -7,11 +7,21 @@ #' @noRd #' #' @importFrom shiny NS tagList +#' @import shinydisconnect mod_diversity_ui <- function(id){ ns <- NS(id) tagList( # Add GWAS content here fluidRow( + disconnectMessage( + text = "An input file error occurred, please reload the application and check the file.", + refresh = "Reload now", + background = "white", + colour = "grey", + overlayColour = "grey", + overlayOpacity = 0.3, + refreshColour = "purple" + ), column(width = 3, box(title="Inputs", width = 12, collapsible = TRUE, collapsed = FALSE, status = "info", solidHeader = TRUE, fileInput(ns("diversity_file"), "Choose VCF File", accept = c(".csv",".vcf",".gz")), @@ -84,6 +94,7 @@ mod_diversity_ui <- function(id){ mod_diversity_server <- function(input, output, session, parent_session){ ns <- session$ns + #######Genomic Diversity analysis #Genomic Diversity output files diff --git a/R/mod_dosage2vcf.R b/R/mod_dosage2vcf.R index 4c2ebfd..8bf4601 100644 --- a/R/mod_dosage2vcf.R +++ b/R/mod_dosage2vcf.R @@ -8,11 +8,21 @@ #' #' @importFrom shiny NS tagList #' @importFrom shinyjs enable disable useShinyjs +#' @import shinydisconnect #' mod_dosage2vcf_ui <- function(id){ ns <- NS(id) tagList( fluidPage( + disconnectMessage( + text = "An input file error occurred, please reload the application and check the file.", + refresh = "Reload now", + background = "white", + colour = "grey", + overlayColour = "grey", + overlayOpacity = 0.3, + refreshColour = "purple" + ), fluidRow( column(width = 5, box( diff --git a/R/mod_gwas.R b/R/mod_gwas.R index 0f230ba..14068d8 100644 --- a/R/mod_gwas.R +++ b/R/mod_gwas.R @@ -11,12 +11,22 @@ #' @importFrom future availableCores #' @importFrom shinycssloaders withSpinner #' @importFrom shinyWidgets virtualSelectInput +#' @import shinydisconnect #' mod_gwas_ui <- function(id){ ns <- NS(id) tagList( # Add GWAS content here fluidRow( + disconnectMessage( + text = "An input file error occurred, please reload the application and check the file.", + refresh = "Reload now", + background = "white", + colour = "grey", + overlayColour = "grey", + overlayOpacity = 0.3, + refreshColour = "purple" + ), column(width = 3, box(title="Inputs", width = 12, collapsible = TRUE, collapsed = FALSE, status = "info", solidHeader = TRUE, fileInput(ns("gwas_file"), "Choose VCF File", accept = c(".csv",".vcf",".gz")), @@ -140,7 +150,7 @@ mod_gwas_ui <- function(id){ mod_gwas_server <- function(input, output, session, parent_session){ ns <- session$ns - + # Help links observeEvent(input$goGWASpar, { # change to help tab diff --git a/R/run_app.R b/R/run_app.R index 5d60ac1..baf85e7 100644 --- a/R/run_app.R +++ b/R/run_app.R @@ -7,6 +7,7 @@ #' @export #' @importFrom shiny shinyApp #' @importFrom golem with_golem_options +#' run_app <- function( onStart = NULL, options = list(), @@ -14,6 +15,10 @@ run_app <- function( uiPattern = "/", ... ) { + #Uncomment the sink command to allow console output + sink(file = tempfile()) + options(warn = -1) + with_golem_options( app = shinyApp( ui = app_ui, From 0b061959253ea8a94b5ff789c428d62ef3742d00 Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Sun, 22 Dec 2024 11:46:55 -0500 Subject: [PATCH 32/38] UI Updates --- R/mod_DosageCall.R | 2 +- R/mod_Filtering.R | 2 +- R/mod_GS.R | 4 ++-- R/mod_GSAcc.R | 2 +- R/mod_PCA.R | 2 +- R/mod_dapc.R | 2 +- R/mod_diversity.R | 18 ++++++++++++++---- R/mod_dosage2vcf.R | 2 +- R/mod_gwas.R | 2 +- 9 files changed, 23 insertions(+), 13 deletions(-) diff --git a/R/mod_DosageCall.R b/R/mod_DosageCall.R index 50c73cd..ed737b7 100644 --- a/R/mod_DosageCall.R +++ b/R/mod_DosageCall.R @@ -18,7 +18,7 @@ mod_DosageCall_ui <- function(id){ tagList( fluidPage( disconnectMessage( - text = "An input file error occurred, please reload the application and check the file.", + text = "An unexpected error occurred, please reload the application and check the input file(s).", refresh = "Reload now", background = "white", colour = "grey", diff --git a/R/mod_Filtering.R b/R/mod_Filtering.R index a5233b3..59b891e 100644 --- a/R/mod_Filtering.R +++ b/R/mod_Filtering.R @@ -21,7 +21,7 @@ mod_Filtering_ui <- function(id){ tagList( fluidRow( disconnectMessage( - text = "An input file error occurred, please reload the application and check the file.", + text = "An unexpected error occurred, please reload the application and check the input file(s).", refresh = "Reload now", background = "white", colour = "grey", diff --git a/R/mod_GS.R b/R/mod_GS.R index 74903be..0703aef 100644 --- a/R/mod_GS.R +++ b/R/mod_GS.R @@ -20,7 +20,7 @@ mod_GS_ui <- function(id){ tagList( fluidRow( disconnectMessage( - text = "An input file error occurred, please reload the application and check the file.", + text = "An unexpected error occurred, please reload the application and check the input file(s).", refresh = "Reload now", background = "white", colour = "grey", @@ -584,7 +584,7 @@ mod_GS_server <- function(input, output, session, parent_session){ } #Save to reactive values - pred_inputs2$shared_snps <- length(common_markers) + #pred_inputs2$shared_snps <- length(common_markers) pred_inputs2$matrix <- Kin_mat pred_inputs2$pheno_input <- pheno2 }) diff --git a/R/mod_GSAcc.R b/R/mod_GSAcc.R index c62b7f0..1787b92 100644 --- a/R/mod_GSAcc.R +++ b/R/mod_GSAcc.R @@ -20,7 +20,7 @@ mod_GSAcc_ui <- function(id){ # Add GWAS content here fluidRow( disconnectMessage( - text = "An input file error occurred, please reload the application and check the file.", + text = "An unexpected error occurred, please reload the application and check the input file(s).", refresh = "Reload now", background = "white", colour = "grey", diff --git a/R/mod_PCA.R b/R/mod_PCA.R index 2bb331b..365d629 100644 --- a/R/mod_PCA.R +++ b/R/mod_PCA.R @@ -19,7 +19,7 @@ mod_PCA_ui <- function(id){ # Add PCA content here fluidRow( disconnectMessage( - text = "An input file error occurred, please reload the application and check the file.", + text = "An unexpected error occurred, please reload the application and check the input file(s).", refresh = "Reload now", background = "white", colour = "grey", diff --git a/R/mod_dapc.R b/R/mod_dapc.R index a642501..3fbc82a 100644 --- a/R/mod_dapc.R +++ b/R/mod_dapc.R @@ -15,7 +15,7 @@ mod_dapc_ui <- function(id){ # Add PCA content here fluidRow( disconnectMessage( - text = "An input file error occurred, please reload the application and check the file.", + text = "An unexpected error occurred, please reload the application and check the input file(s).", refresh = "Reload now", background = "white", colour = "grey", diff --git a/R/mod_diversity.R b/R/mod_diversity.R index cead00c..db79ee0 100644 --- a/R/mod_diversity.R +++ b/R/mod_diversity.R @@ -14,7 +14,7 @@ mod_diversity_ui <- function(id){ # Add GWAS content here fluidRow( disconnectMessage( - text = "An input file error occurred, please reload the application and check the file.", + text = "An unexpected error occurred, please reload the application and check the input file(s).", refresh = "Reload now", background = "white", colour = "grey", @@ -214,6 +214,16 @@ mod_diversity_server <- function(input, output, session, parent_session){ diversity_items$maf_df <- diversity_items$maf_df[, c(1,3)] #Calculate PIC + calc_allele_frequencies <- function(d_diplo_t, ploidy) { + allele_frequencies <- apply(d_diplo_t, 1, function(x) { + count_sum <- sum(!is.na(x)) + allele_sum <- sum(x, na.rm = TRUE) + if (count_sum != 0) {allele_sum / (ploidy * count_sum)} else {NA} + }) + + all_allele_frequencies <- data.frame(SNP = rownames(d_diplo_t), p1= allele_frequencies, p2= 1-allele_frequencies) + return(all_allele_frequencies) + } Fre <-calc_allele_frequencies(geno_mat,as.numeric(ploidy)) calc_pic <- function(x) { freq_squared <- x^2 @@ -238,7 +248,7 @@ mod_diversity_server <- function(input, output, session, parent_session){ #Updating value boxes output$mean_het_box <- renderValueBox({ valueBox( - value = round(mean(diversity_items$het_df$ObservedHeterozygosity),3), + value = round(mean(diversity_items$het_df$Ho),3), subtitle = "Mean Heterozygosity", icon = icon("dna"), color = "info" @@ -284,7 +294,7 @@ mod_diversity_server <- function(input, output, session, parent_session){ validate( need(!is.null(diversity_items$het_df) & !is.null(input$hist_bins), "Input VCF, define parameters and click `run analysis` to access results in this session.") ) - hist(diversity_items$het_df$ObservedHeterozygosity, breaks = as.numeric(input$hist_bins), col = "tan3", border = "black", xlim= c(0,1), + hist(diversity_items$het_df$Ho, breaks = as.numeric(input$hist_bins), col = "tan3", border = "black", xlim= c(0,1), xlab = "Observed Heterozygosity", ylab = "Number of Samples", main = "Sample Observed Heterozygosity") @@ -405,7 +415,7 @@ mod_diversity_server <- function(input, output, session, parent_session){ hist(diversity_items$maf_df$MAF, breaks = as.numeric(input$hist_bins), col = "grey", border = "black", xlab = "Minor Allele Frequency (MAF)", ylab = "Frequency", main = "Minor Allele Frequency Distribution") } else if (input$div_figure == "OHet Histogram") { - hist(diversity_items$het_df$ObservedHeterozygosity, breaks = as.numeric(input$hist_bins), col = "tan3", border = "black", xlim= c(0,1), + hist(diversity_items$het_df$Ho, breaks = as.numeric(input$hist_bins), col = "tan3", border = "black", xlim= c(0,1), xlab = "Observed Heterozygosity", ylab = "Number of Samples", main = "Sample Observed Heterozygosity") diff --git a/R/mod_dosage2vcf.R b/R/mod_dosage2vcf.R index 8bf4601..2c8c879 100644 --- a/R/mod_dosage2vcf.R +++ b/R/mod_dosage2vcf.R @@ -15,7 +15,7 @@ mod_dosage2vcf_ui <- function(id){ tagList( fluidPage( disconnectMessage( - text = "An input file error occurred, please reload the application and check the file.", + text = "An unexpected error occurred, please reload the application and check the input file(s).", refresh = "Reload now", background = "white", colour = "grey", diff --git a/R/mod_gwas.R b/R/mod_gwas.R index 14068d8..0abdfe7 100644 --- a/R/mod_gwas.R +++ b/R/mod_gwas.R @@ -19,7 +19,7 @@ mod_gwas_ui <- function(id){ # Add GWAS content here fluidRow( disconnectMessage( - text = "An input file error occurred, please reload the application and check the file.", + text = "An unexpected error occurred, please reload the application and check the input file(s).", refresh = "Reload now", background = "white", colour = "grey", From adae187c56b321ff3ea65e48e90f9490737e91b9 Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Sun, 22 Dec 2024 13:18:46 -0500 Subject: [PATCH 33/38] Fixed GWAS bug --- R/mod_gwas.R | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/R/mod_gwas.R b/R/mod_gwas.R index 0abdfe7..8ab25a5 100644 --- a/R/mod_gwas.R +++ b/R/mod_gwas.R @@ -542,6 +542,30 @@ mod_gwas_server <- function(input, output, session, parent_session){ #Status updateProgressBar(session = session, id = "pb_gwas", value = 100, status = "success", title = "Finished") }) + + #Checking if any QTLs were detected and returning a user notice if not + observe({ + req(gwas_vars$gwas_df) + if(dim(gwas_vars$gwas_df)[1] == 0) { + shinyalert( + title = "No QTL Detected", + text = "No QTL detected for this trait.", + size = "s", + closeOnEsc = TRUE, + closeOnClickOutside = FALSE, + html = TRUE, + type = "info", + showConfirmButton = TRUE, + confirmButtonText = "OK", + confirmButtonCol = "#004192", + showCancelButton = FALSE, + animation = TRUE + ) + } + + #Gracefully abort + return() + }) #Updating value boxes output$qtls_detected <- renderValueBox({ @@ -585,12 +609,13 @@ mod_gwas_server <- function(input, output, session, parent_session){ observe({ - req(gwas_vars$gwas_df_filt) + req(gwas_vars$gwas_df_filt, nrow(gwas_vars$gwas_df_filt) > 0) updatePickerInput(session = session, inputId = "sele_models", choices = unique(gwas_vars$gwas_df_filt$Model), selected = unique(gwas_vars$gwas_df_filt$Model)[1]) }) observe({ - req(gwas_vars$gwas_df_filt) + req(gwas_vars$gwas_df_filt, nrow(gwas_vars$gwas_df_filt) > 0) + df <- gwas_vars$gwas_df_filt %>% filter(Model %in% input$sele_models) updatePickerInput(session = session, inputId = "sele_qtl", choices = unique(paste0(df$Marker, "_", df$Model)), selected = unique(paste0(df$Marker, "_", df$Model))) From b30e8dc23b7eeebbfd01bd13db34a30c57346c94 Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Sun, 22 Dec 2024 14:27:34 -0500 Subject: [PATCH 34/38] Updated Info Dropdowns --- R/mod_Filtering.R | 45 +++++++++- R/mod_GS.R | 48 ++++++++-- R/mod_GSAcc.R | 46 +++++++++- R/mod_PCA.R | 225 +++++++++++++++++++++++++++------------------- R/mod_dapc.R | 46 +++++++++- R/mod_diversity.R | 45 +++++++++- R/mod_gwas.R | 2 +- R/mod_help.R | 2 +- 8 files changed, 347 insertions(+), 112 deletions(-) diff --git a/R/mod_Filtering.R b/R/mod_Filtering.R index 59b891e..76ac321 100644 --- a/R/mod_Filtering.R +++ b/R/mod_Filtering.R @@ -54,9 +54,11 @@ mod_Filtering_ui <- function(id){ useShinyjs(), downloadButton(ns("start_updog_filter"), "Download", icon = icon("download"), class = "butt"), div(style="display:inline-block; float:right",dropdownButton( - tags$h3("Updog Filter Parameters"), - "You can download examples of the expected file here: \n", - downloadButton(ns('download_vcf'), "Download VCF Example File"), hr(), + HTML("Input files"), + p(downloadButton(ns('download_vcf'),""), "VCF Example File"), + 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(), actionButton(ns("filtering_summary"), "Summary"), circle = FALSE, status = "warning", @@ -110,6 +112,43 @@ mod_Filtering_ui <- function(id){ mod_Filtering_server <- function(input, output, session, parent_session){ ns <- session$ns + + # Help links + observeEvent(input$goPar, { + # change to help tab + updatebs4TabItems(session = parent_session, inputId = "MainMenu", + selected = "help") + + # select specific tab + updateTabsetPanel(session = parent_session, inputId = "VCF_Filtering_tabset", + selected = "VCF_Filtering_par") + # expand specific box + updateBox(id = "VCF_Filtering_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 = "VCF_Filtering_tabset", + selected = "VCF_Filtering_results") + # expand specific box + updateBox(id = "VCF_Filtering_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 = "VCF_Filtering_tabset", + selected = "VCF_Filtering_cite") + # expand specific box + updateBox(id = "VCF_Filtering_box", action = "toggle", session = parent_session) + }) #vcf filtering_files <- reactiveValues( diff --git a/R/mod_GS.R b/R/mod_GS.R index 0703aef..cf65eb8 100644 --- a/R/mod_GS.R +++ b/R/mod_GS.R @@ -66,11 +66,13 @@ mod_GS_ui <- function(id){ ), actionButton(ns("prediction_est_start"), "Run Analysis"), div(style="display:inline-block; float:right",dropdownButton( - tags$h3("GP Parameters"), - "You can download examples of the expected input input files here: \n", - downloadButton(ns('download_vcft'), "Download Training VCF Example File"), - downloadButton(ns('download_pheno'), "Download Passport Example File"), - downloadButton(ns('download_vcfp'), "Download Prediction VCF Example File"),hr(), + HTML("Input files"), + p(downloadButton(ns('download_vcf'),""), "VCF Example File"), + p(downloadButton(ns('download_pheno'),""), "Trait Example File"), + p(downloadButton(ns('download_vcfp'), ""), "Download Prediction VCF 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(), actionButton(ns("pred_summary"), "Summary"), circle = FALSE, status = "warning", @@ -137,6 +139,42 @@ mod_GS_server <- function(input, output, session, parent_session){ ns <- session$ns + # Help links + observeEvent(input$goPar, { + # change to help tab + updatebs4TabItems(session = parent_session, inputId = "MainMenu", + selected = "help") + + # select specific tab + updateTabsetPanel(session = parent_session, inputId = "Genomic_Prediction_tabset", + selected = "Genomic_Prediction_par") + # 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", + selected = "Genomic_Prediction_results") + # 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", + selected = "Genomic_Prediction_cite") + # expand specific box + updateBox(id = "Genomic_Prediction_box", action = "toggle", session = parent_session) + }) #Default model choices advanced_options_pred <- reactiveValues( diff --git a/R/mod_GSAcc.R b/R/mod_GSAcc.R index 1787b92..9df59b2 100644 --- a/R/mod_GSAcc.R +++ b/R/mod_GSAcc.R @@ -66,10 +66,12 @@ mod_GSAcc_ui <- function(id){ ), actionButton(ns("prediction_start"), "Run Analysis"), div(style="display:inline-block; float:right", dropdownButton( - tags$h3("GP Parameters"), - "You can download examples of the expected input input files here: \n", - downloadButton(ns('download_vcf'), "Download VCF Example File"), - downloadButton(ns('download_pheno'), "Download Passport Example File"),hr(), + HTML("Input files"), + p(downloadButton(ns('download_vcf'),""), "VCF Example File"), + p(downloadButton(ns('download_pheno'),""), "Trait 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(), actionButton(ns("predAcc_summary"), "Summary"), circle = FALSE, status = "warning", @@ -147,6 +149,42 @@ mod_GSAcc_server <- function(input, output, session, parent_session){ ns <- session$ns + # Help links + observeEvent(input$goPar, { + # change to help tab + updatebs4TabItems(session = parent_session, inputId = "MainMenu", + selected = "help") + + # select specific tab + updateTabsetPanel(session = parent_session, inputId = "Predictive_Ability_tabset", + selected = "Predictive_Ability_par") + # expand specific box + updateBox(id = "Predictive_Ability_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 = "Predictive_Ability_tabset", + selected = "Predictive_Ability_results") + # expand specific box + updateBox(id = "Predictive_Ability_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 = "Predictive_Ability_tabset", + selected = "Predictive_Ability_cite") + # expand specific box + updateBox(id = "Predictive_Ability_box", action = "toggle", session = parent_session) + }) #Default model choices advanced_options <- reactiveValues( diff --git a/R/mod_PCA.R b/R/mod_PCA.R index 365d629..229e240 100644 --- a/R/mod_PCA.R +++ b/R/mod_PCA.R @@ -16,100 +16,104 @@ mod_PCA_ui <- function(id){ ns <- NS(id) tagList( + fluidPage( # Add PCA content here - fluidRow( - disconnectMessage( - text = "An unexpected error occurred, please reload the application and check the input file(s).", - refresh = "Reload now", - background = "white", - colour = "grey", - overlayColour = "grey", - overlayOpacity = 0.3, - refreshColour = "purple" - ), - useShinyjs(), - inlineCSS(list(.borderred = "border-color: red", .redback = "background: red")), - - column(width = 3, - box( - title = "Inputs", width = 12, solidHeader = TRUE, status = "info", - p("* Required"), - fileInput(ns("dosage_file"), "Choose VCF File*", accept = c(".csv",".vcf",".gz")), - fileInput(ns("passport_file"), "Choose Trait File (IDs in first column)", accept = c(".csv")), - #Dropdown will update after passport upload - numericInput(ns("pca_ploidy"), "Species Ploidy*", min = 2, value = NULL), - actionButton(ns("pca_start"), "Run Analysis"), - div(style="display:inline-block; float:right", - dropdownButton( - tags$h3("PCA Inputs"), - "You can download examples of the expected files here: \n", - downloadButton(ns('download_vcf'), "Download VCF Example File"), - downloadButton(ns('download_pheno'), "Download Trait Example File"),hr(), - actionButton(ns("pca_summary"), "Summary"), - circle = FALSE, - status = "warning", - icon = icon("info"), width = "300px", - tooltip = tooltipOptions(title = "Click to see info!") - )), - style = "overflow-y: auto; height: 480px" - ), - box( - title = "Plot Controls", status = "warning", solidHeader = TRUE, collapsible = TRUE,collapsed = FALSE, width = 12, - selectInput(ns('group_info'), label = 'Color Variable', choices = NULL), - materialSwitch(ns('use_cat'), label = "Color Category", status = "success"), - conditionalPanel(condition = "input.use_cat", - ns = ns, - virtualSelectInput( - inputId = ns("cat_color"), - label = "Select Category To Color:", - choices = NULL, - showValueAsTags = TRUE, - search = TRUE, - multiple = TRUE - ), - selectInput(ns("grey_choice"), "Select Grey", choices = c("Light Grey", "Grey", "Dark Grey", "Black"), selected = "Grey") + fluidRow( + disconnectMessage( + text = "An unexpected error occurred, please reload the application and check the input file(s).", + refresh = "Reload now", + background = "white", + colour = "grey", + overlayColour = "grey", + overlayOpacity = 0.3, + refreshColour = "purple" + ), + useShinyjs(), + inlineCSS(list(.borderred = "border-color: red", .redback = "background: red")), + + column(width = 3, + box( + title = "Inputs", width = 12, solidHeader = TRUE, status = "info", + p("* Required"), + fileInput(ns("dosage_file"), "Choose VCF File*", accept = c(".csv",".vcf",".gz")), + fileInput(ns("passport_file"), "Choose Trait File (IDs in first column)", accept = c(".csv")), + #Dropdown will update after passport upload + numericInput(ns("pca_ploidy"), "Species Ploidy*", min = 2, value = NULL), + br(), + actionButton(ns("pca_start"), "Run Analysis"), + div(style="display:inline-block; float:right",dropdownButton( + HTML("Input files"), + p(downloadButton(ns('download_vcf'),""), "VCF Example File"), + p(downloadButton(ns('download_pheno'),""), "Trait 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(), + actionButton(ns("pca_summary"), "Summary"), + circle = FALSE, + status = "warning", + icon = icon("info"), width = "300px", + tooltip = tooltipOptions(title = "Click to see info!") + ))#, + #style = "overflow-y: auto; height: 480px" ), - selectInput(ns("color_choice"), "Color Palette", choices = list("Standard Palettes" = c("Set1","Set3","Pastel2", - "Pastel1","Accent","Spectral", - "RdYlGn","RdGy"), - "Colorblind Friendly" = c("Set2","Paired","Dark2","YlOrRd","YlOrBr","YlGnBu","YlGn", - "Reds","RdPu","Purples","PuRd","PuBuGn","PuBu", - "OrRd","Oranges","Greys","Greens","GnBu","BuPu", - "BuGn","Blues","RdYlBu", - "RdBu", "PuOr","PRGn","PiYG","BrBG" - )), - selected = "Set1"), - selectInput(ns("pc_X"), "X-Axis (2D-Plot only)", choices = c("PC1","PC2","PC3","PC4","PC5"), selected = "PC1"), - selectInput(ns("pc_Y"), "Y-Axis (2D-Plot only)", choices = c("PC1","PC2","PC3","PC4","PC5"), selected = "PC2"), - div(style="display:inline-block; float:right",dropdownButton( - tags$h3("Save Image"), - selectInput(inputId = ns('pca_figure'), label = 'Figure', choices = c("2D Plot", "Scree Plot"), selected = "2D Plot"), - selectInput(inputId = ns('pca_image_type'), label = 'File', choices = c("jpeg","tiff","png"), selected = "jpeg"), - sliderInput(inputId = ns('pca_image_res'), label = 'Resolution', value = 300, min = 50, max = 1000, step=50), - sliderInput(inputId = ns('pca_image_width'), label = 'Width', value = 10, min = 1, max = 20, step=0.5), - sliderInput(inputId = ns('pca_image_height'), label = 'Height', value = 6, min = 1, max = 20, step = 0.5), - downloadButton(ns("download_pca"), "Save Image"), - circle = FALSE, - status = "danger", - icon = icon("floppy-disk"), width = "300px", - tooltip = tooltipOptions(title = "Click to see inputs!") - )) - ) - ), - column(width = 8, - box(title = "Trait Data", width = 12, solidHeader = TRUE, collapsible = TRUE, status = "info", collapsed = FALSE, maximizable = T, - DTOutput(ns('passport_table')), - style = "overflow-y: auto; height: 480px" - ), - box( - title = "PCA Plots", status = "info", solidHeader = FALSE, width = 12, height = 550, maximizable = T, - bs4Dash::tabsetPanel( - tabPanel("3D-Plot",withSpinner(plotlyOutput(ns("pca_plot"), height = '460px'))), - tabPanel("2D-Plot", withSpinner(plotOutput(ns("pca_plot_ggplot"), height = '460px'))), - tabPanel("Scree Plot", withSpinner(plotOutput(ns("scree_plot"), height = '460px')))) # Placeholder for plot outputs - ) - ), - column(width = 1) + box( + title = "Plot Controls", status = "warning", solidHeader = TRUE, collapsible = TRUE,collapsed = FALSE, width = 12, + selectInput(ns('group_info'), label = 'Color Variable', choices = NULL), + materialSwitch(ns('use_cat'), label = "Color Category", status = "success"), + conditionalPanel(condition = "input.use_cat", + ns = ns, + virtualSelectInput( + inputId = ns("cat_color"), + label = "Select Category To Color:", + choices = NULL, + showValueAsTags = TRUE, + search = TRUE, + multiple = TRUE + ), + selectInput(ns("grey_choice"), "Select Grey", choices = c("Light Grey", "Grey", "Dark Grey", "Black"), selected = "Grey") + ), + selectInput(ns("color_choice"), "Color Palette", choices = list("Standard Palettes" = c("Set1","Set3","Pastel2", + "Pastel1","Accent","Spectral", + "RdYlGn","RdGy"), + "Colorblind Friendly" = c("Set2","Paired","Dark2","YlOrRd","YlOrBr","YlGnBu","YlGn", + "Reds","RdPu","Purples","PuRd","PuBuGn","PuBu", + "OrRd","Oranges","Greys","Greens","GnBu","BuPu", + "BuGn","Blues","RdYlBu", + "RdBu", "PuOr","PRGn","PiYG","BrBG" + )), + selected = "Set1"), + selectInput(ns("pc_X"), "X-Axis (2D-Plot only)", choices = c("PC1","PC2","PC3","PC4","PC5"), selected = "PC1"), + selectInput(ns("pc_Y"), "Y-Axis (2D-Plot only)", choices = c("PC1","PC2","PC3","PC4","PC5"), selected = "PC2"), + div(style="display:inline-block; float:right",dropdownButton( + tags$h3("Save Image"), + selectInput(inputId = ns('pca_figure'), label = 'Figure', choices = c("2D Plot", "Scree Plot"), selected = "2D Plot"), + selectInput(inputId = ns('pca_image_type'), label = 'File', choices = c("jpeg","tiff","png"), selected = "jpeg"), + sliderInput(inputId = ns('pca_image_res'), label = 'Resolution', value = 300, min = 50, max = 1000, step=50), + sliderInput(inputId = ns('pca_image_width'), label = 'Width', value = 10, min = 1, max = 20, step=0.5), + sliderInput(inputId = ns('pca_image_height'), label = 'Height', value = 6, min = 1, max = 20, step = 0.5), + downloadButton(ns("download_pca"), "Save Image"), + circle = FALSE, + status = "danger", + icon = icon("floppy-disk"), width = "300px", + tooltip = tooltipOptions(title = "Click to see inputs!") + )) + ) + ), + column(width = 8, + box(title = "Trait Data", width = 12, solidHeader = TRUE, collapsible = TRUE, status = "info", collapsed = FALSE, maximizable = T, + DTOutput(ns('passport_table')), + style = "overflow-y: auto; height: 480px" + ), + box( + title = "PCA Plots", status = "info", solidHeader = FALSE, width = 12, height = 550, maximizable = T, + bs4Dash::tabsetPanel( + tabPanel("3D-Plot",withSpinner(plotlyOutput(ns("pca_plot"), height = '460px'))), + tabPanel("2D-Plot", withSpinner(plotOutput(ns("pca_plot_ggplot"), height = '460px'))), + tabPanel("Scree Plot", withSpinner(plotOutput(ns("scree_plot"), height = '460px')))) # Placeholder for plot outputs + ) + ), + column(width = 1) + ) ) ) } @@ -130,6 +134,43 @@ mod_PCA_server <- function(input, output, session, parent_session){ ns <- session$ns options(warn = -1) #Uncomment to suppress warnings + # Help links + observeEvent(input$goPar, { + # change to help tab + updatebs4TabItems(session = parent_session, inputId = "MainMenu", + selected = "help") + + # select specific tab + updateTabsetPanel(session = parent_session, inputId = "PCA_tabset", + selected = "PCA_par") + # expand specific box + updateBox(id = "PCA_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 = "PCA_tabset", + selected = "PCA_results") + # expand specific box + updateBox(id = "PCA_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 = "PCA_tabset", + selected = "PCA_cite") + # expand specific box + updateBox(id = "PCA_box", action = "toggle", session = parent_session) + }) + #PCA reactive values pca_data <- reactiveValues( pc_df_pop = NULL, diff --git a/R/mod_dapc.R b/R/mod_dapc.R index 3fbc82a..f221261 100644 --- a/R/mod_dapc.R +++ b/R/mod_dapc.R @@ -33,9 +33,12 @@ mod_dapc_ui <- function(id){ numericInput(ns("dapc_ploidy"), "Species Ploidy", min = 1, value = NULL), actionButton(ns("K_start"), "Run Step 1"), div(style="display:inline-block; float:right",dropdownButton( - tags$h3("DAPC Inputs"), - "You can download an examples of the expected input file here: \n", - downloadButton(ns('download_vcf'), "Download VCF Example File"),hr(), + HTML("Input files"), + p(downloadButton(ns('download_vcf'),""), "VCF Example File"), + p(downloadButton(ns('download_pheno'),""), "Trait 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(), actionButton(ns("dapc_summary"), "Summary"), circle = FALSE, status = "warning", @@ -122,6 +125,43 @@ mod_dapc_ui <- function(id){ mod_dapc_server <- function(input, output, session, parent_session){ ns <- session$ns + + # Help links + observeEvent(input$goPar, { + # change to help tab + updatebs4TabItems(session = parent_session, inputId = "MainMenu", + selected = "help") + + # select specific tab + updateTabsetPanel(session = parent_session, inputId = "DAPC_tabset", + selected = "DAPC_par") + # expand specific box + updateBox(id = "DAPC_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 = "DAPC_tabset", + selected = "DAPC_results") + # expand specific box + updateBox(id = "DAPC_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 = "DAPC_tabset", + selected = "DAPC_cite") + # expand specific box + updateBox(id = "DAPC_box", action = "toggle", session = parent_session) + }) dapc_items <- reactiveValues( grp = NULL, diff --git a/R/mod_diversity.R b/R/mod_diversity.R index db79ee0..90295af 100644 --- a/R/mod_diversity.R +++ b/R/mod_diversity.R @@ -28,9 +28,11 @@ mod_diversity_ui <- function(id){ numericInput(ns("diversity_ploidy"), "Species Ploidy", min = 1, value = NULL), actionButton(ns("diversity_start"), "Run Analysis"), div(style="display:inline-block; float:right",dropdownButton( - tags$h3("Diversity Parameters"), - "You can download an examples of the expected input file here: \n", - downloadButton(ns('download_vcf'), "Download VCF Example File"),hr(), + HTML("Input files"), + p(downloadButton(ns('download_vcf'),""), "VCF Example File"), + 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(), actionButton(ns("diversity_summary"), "Summary"), circle = FALSE, status = "warning", @@ -95,6 +97,43 @@ mod_diversity_server <- function(input, output, session, parent_session){ ns <- session$ns + # Help links + observeEvent(input$goPar, { + # change to help tab + updatebs4TabItems(session = parent_session, inputId = "MainMenu", + selected = "help") + + # select specific tab + updateTabsetPanel(session = parent_session, inputId = "Genomic_Diversity_tabset", + selected = "Genomic_Diversity_par") + # expand specific box + updateBox(id = "Genomic_Diversity_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_Diversity_tabset", + selected = "Genomic_Diversity_results") + # expand specific box + updateBox(id = "Genomic_Diversity_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_Diversity_tabset", + selected = "Genomic_Diversity_cite") + # expand specific box + updateBox(id = "Genomic_Diversity_box", action = "toggle", session = parent_session) + }) + #######Genomic Diversity analysis #Genomic Diversity output files diff --git a/R/mod_gwas.R b/R/mod_gwas.R index 8ab25a5..999a634 100644 --- a/R/mod_gwas.R +++ b/R/mod_gwas.R @@ -48,7 +48,7 @@ mod_gwas_ui <- function(id){ div(style="display:inline-block; float:right",dropdownButton( HTML("Input files"), p(downloadButton(ns('download_vcf'),""), "VCF Example File"), - p(downloadButton(ns('download_pheno'),""), "Passport Example File"), hr(), + p(downloadButton(ns('download_pheno'),""), "Trait Example File"), hr(), p(HTML("Parameters description:"), actionButton(ns("goGWASpar"), icon("arrow-up-right-from-square", verify_fa = FALSE) )), hr(), p(HTML("Results description:"), actionButton(ns("goGWASgraph"), icon("arrow-up-right-from-square", verify_fa = FALSE) )), hr(), p(HTML("How to cite:"), actionButton(ns("goGWAScite"), icon("arrow-up-right-from-square", verify_fa = FALSE) )), hr(), diff --git a/R/mod_help.R b/R/mod_help.R index 69d0ca0..8020916 100644 --- a/R/mod_help.R +++ b/R/mod_help.R @@ -51,7 +51,7 @@ mod_help_ui <- function(id){ tabPanel("Results description", value = "VCF_Filtering_results", br(), includeMarkdown(system.file("help_files/VCF_Filtering_res.Rmd", package = "BIGapp")) ), - tabPanel("How to cite", value = "Updog_Dosage_Calling_cite", br(), + tabPanel("How to cite", value = "VCF_Filtering_cite", br(), includeMarkdown(system.file("help_files/VCF_Filtering_cite.Rmd", package = "BIGapp")) )) ), From d92cea31caf49d89bf4b963771dcae05dee65576 Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Sun, 22 Dec 2024 15:37:21 -0500 Subject: [PATCH 35/38] Help Section Updates --- inst/help_files/DAPC_res.Rmd | 38 +++++++++++++------ inst/help_files/Genomic_Diversity_res.Rmd | 36 +++++++++++++++--- inst/help_files/Genomic_Prediction_par.Rmd | 2 +- inst/help_files/Genomic_Prediction_res.Rmd | 16 ++++++-- inst/help_files/PCA_cite.Rmd | 17 ++++----- inst/help_files/PCA_res.Rmd | 18 +++++++-- inst/help_files/Predictive_Ability_res.Rmd | 25 +++++++++--- inst/help_files/Updog_Dosage_Calling_cite.Rmd | 21 +++++----- inst/help_files/VCF_Filtering_cite.Rmd | 16 ++++---- 9 files changed, 129 insertions(+), 60 deletions(-) diff --git a/inst/help_files/DAPC_res.Rmd b/inst/help_files/DAPC_res.Rmd index 99bce83..f31e234 100644 --- a/inst/help_files/DAPC_res.Rmd +++ b/inst/help_files/DAPC_res.Rmd @@ -4,22 +4,36 @@ output: html_document date: "2024-08-29" --- -* **Cluster assignments table** +#### BIC Table +- **Description**: The BIC table summarizes the association between different numbers of clusters (K) and their Bayesian Information Criterion (BIC) values. +- **Interpretation**: Each row corresponds to a different number of clusters (K), with the BIC value indicating the model fit. Typically, lower BIC values suggest a better model fit, pointing to the optimal number of genetic clusters. This can be viewed as the "knee", where the BIC values stabilize after decreasing sharply. +- **Use**: In breeding applications, the table helps identify the most suitable number of genetic clusters, providing insights into genetic diversity and structure that inform breeding choices. +#### BIC Plot -|K | BIC | -|:---------:|:------------:| -|Sample_1 | 5.1| -|Sample_2 | 4.9| -|Sample_3 | 4.7| -|Sample_4 | 4.6| -|Sample_5 | 5.0| -|Sample_6 | 5.4| +- **Description**: The BIC plot graphically displays the BIC values for different numbers of clusters (K) derived from the data, typically to determine the optimal number of clusters. +- **Interpretation**: The x-axis presents different cluster numbers (K), while the y-axis indicates corresponding BIC values. The optimal number of clusters is suggested by an "elbow" or point where BIC values level off, indicating diminishing returns for increasing the number of clusters. +- **Use**: This plot is crucial for deciding how many distinct genetic clusters exist within the population. In breeding, it helps determine the number of genetically distinct groups worth considering in breeding programs. In population genetics, it guides researchers in identifying sub-population structures. +#### DAPC Results Table -  +- **Description**: The DAPC results table provides a detailed view of sample membership probabilities across different genetic clusters, and identifies the most likely cluster assignment for each sample. +- **Interpretation**: Each row corresponds to a specific sample, with columns representing the probability of membership in each cluster based on discriminant analysis. The final column, "Cluster_Assignment," indicates the cluster to which a sample is most strongly associated, based on the highest probability value. +- **Use**: This table is instrumental in both breeding and population genetics. In breeding, it aids in identifying which genetic clusters individuals belong to, helping in the selection of genetically favorable traits. In population genetics, it helps delineate the distribution of genetic diversity across the population, facilitating studies on migration, adaptation, and evolutionary patterns. -* **BIC plot** +- **Example Table**: -* **DAPC plot** + | Sample | Cluster_1 | Cluster_2 | Cluster_3 | Cluster_Assignment | + |:--------:|:---------:|:---------:|:---------:|:------------------:| + | Sample_1 | 0.80 | 0.10 | 0.10 | 1 | + | Sample_2 | 0.20 | 0.70 | 0.10 | 2 | + | Sample_3 | 0.15 | 0.15 | 0.70 | 3 | + | Sample_4 | 0.40 | 0.50 | 0.10 | 2 | + | Sample_5 | 0.60 | 0.20 | 0.20 | 1 | + +#### DAPC Plot + +- **Description**: The DAPC plot visualizes the discriminant analysis results, showing genetic sample distribution based on discriminant functions. +- **Interpretation**: Each point represents a genetic sample, plotted based on its discriminant function scores, which are linear combinations of principal components. Clusters of points suggest genetic similarity or differentiation. +- **Use**: This plot is instrumental in distinguishing between genetic clusters and assessing population structure. For breeding applications, it facilitates the selection of genetically similar or diverse individuals suited for breeding objectives. In population genetics studies, it provides insights into the genetic differentiation between groups. diff --git a/inst/help_files/Genomic_Diversity_res.Rmd b/inst/help_files/Genomic_Diversity_res.Rmd index 2046b00..347820b 100644 --- a/inst/help_files/Genomic_Diversity_res.Rmd +++ b/inst/help_files/Genomic_Diversity_res.Rmd @@ -4,14 +4,38 @@ output: html_document date: "2024-08-29" --- -* **MAF plot** +#### Dosage Ratio Plot -* **OHet plot** +- **Description**: The dosage ratio box plot illustrates the distribution of different genotypic dosage levels across the genomic dataset. +- **Interpretation**: Each box in the plot corresponds to a specific dosage level, showing the proportion of samples exhibiting each dosage. These levels typically indicate the number of copies of a particular allele. +- **Use**: This plot is beneficial in understanding the distribution of allelic dosages in the population. -* **Dosage Ratio plot** +#### MAF Plot -* **Marker distribution plot** +- **Description**: The MAF plot shows the minor allele frequency distribution for the SNPs within the dataset. +- **Interpretation**: The x-axis represents SNPs, while the y-axis depicts the frequency of the less common allele. High MAF values indicate prevalent mutations, whereas low values suggest rarity. +- **Use**: This visualization helps in assessing allele variation across the population, essential for breeding decisions aiming to maximize genetic diversity. It's crucial for identifying potentially beneficial minor alleles in a population genetics context or ensuring adequate filtering prior to downstream analyses such as GWAS. -* **MAF table** +#### OHet Plot -* **OHet table** +- **Description**: The OHet plot displays the observed heterozygosity for samples, illustrating genetic variability. +- **Interpretation**: The y-axis may represent heterozygosity levels, with distinct individuals on the x-axis. Variation indicates the degree of genetic diversity within samples. +- **Use**: High heterozygosity is often associated with genetic health and adaptability, making this plot valuable for breeding insight. In population genetics, it aids understanding of population diversity and potential inbreeding effects. + +#### Marker Distribution Plot + +- **Description**: This plot provides a spatial distribution of markers across different chromosomes or linkage groups. +- **Interpretation**: Points correspond to SNPs or markers, plotted along chromosomal positions. Patterns suggest marker density and distribution. +- **Use**: Insight into marker distribution is critical for genomic selection and breeding strategy, ensuring comprehensive genomic coverage. This is also a good visual to determine if markers were filtered too strictly or sequenced poorly for a given project. + +#### Sample Table + +- **Description**: The sample table includes a list of sample IDs with associated summary statistics, such as heterozygosity. +- **Interpretation**: Each row details a specific sample, providing key genetic metrics valuable for assessing sample quality and genetic integrity. +- **Use**: This table supports the evaluation of sample quality and diversity, crucial for selecting appropriate breeding candidates or conducting robust population analyses. + +#### SNP Table + +- **Description**: The SNP table features SNP IDs alongside their summary statistics, including metrics like Minor Allele Frequency (MAF) and Polymorphism Information Content (PIC). +- **Interpretation**: The table provides insight into each SNP's genetic contribution and informativeness, facilitating genome-wide association studies and diversity assessments. +- **Use**: By highlighting key SNP metrics, this table assists in choosing markers for selection in breeding programs and understanding diversity in population genetics. diff --git a/inst/help_files/Genomic_Prediction_par.Rmd b/inst/help_files/Genomic_Prediction_par.Rmd index b411335..133627c 100644 --- a/inst/help_files/Genomic_Prediction_par.Rmd +++ b/inst/help_files/Genomic_Prediction_par.Rmd @@ -25,7 +25,7 @@ This tab estimates the trait and estimated-breeding-values (EBVs) for either all   -* **Prediction VCF file** +* **Prediction VCF file**(optional): Variant Call Format (VCF). See above for required formatting details. * **Species Ploidy**: Specifies the ploidy level of the species. The current analysis supports both diploids and autopolyploids. diff --git a/inst/help_files/Genomic_Prediction_res.Rmd b/inst/help_files/Genomic_Prediction_res.Rmd index d467256..a028faa 100644 --- a/inst/help_files/Genomic_Prediction_res.Rmd +++ b/inst/help_files/Genomic_Prediction_res.Rmd @@ -6,7 +6,9 @@ date: "2024-08-29" * **Predicted Trait table**: The trait values are predicted for all samples in either the input VCF file (if only one provided), or for all of the samples in the predictive VCF file. It is in the format of samples IDs in the first column, and each subsequent column being the information for the traits selected by the user. -| Sample ID | Sepal Length | Sepal Width | +
+ +| Sample ID | Sepal.Length|Sepal.Width | |------------|--------------|-------------| | Sample_1 | 4.8 | 3.5 | | Sample_2 | 4.9 | 3.0 | @@ -16,11 +18,15 @@ date: "2024-08-29" | Sample_6 | 5.4 | 3.9 | -  +
+ * **EBV table**: Estimated Breeding Values (EBVs) from genomic prediction are statistical estimates of an individual's genetic potential for a specific trait, calculated by combining genomic information with phenotypic and pedigree data. These values help predict an organism's ability to pass on desirable traits to its offspring, allowing for more accurate selection in breeding programs. The EBVs are predicted for all samples in either the input VCF file (if only one provided), or for all of the samples in the predictive VCF file. It is in the format of samples IDs in the first column, and each subsequent column being the information for the traits selected by the user. -| Sample ID | Sepal Length | Sepal Width | + +
+ +| Sample ID | Sepal.Length | Sepal.Width | |------------|--------------|-------------| | Sample_1 | 0.32 | 0.48 | | Sample_2 | -0.12 | -0.28 | @@ -28,3 +34,7 @@ date: "2024-08-29" | Sample_4 | 1.21 | 1.03 | | Sample_5 | 0.43 | 0.33 | | Sample_6 | 0.03 | 0.91 | + +
+ +  diff --git a/inst/help_files/PCA_cite.Rmd b/inst/help_files/PCA_cite.Rmd index f65632a..d9e2272 100644 --- a/inst/help_files/PCA_cite.Rmd +++ b/inst/help_files/PCA_cite.Rmd @@ -4,16 +4,13 @@ output: html_document date: "2024-08-29" --- -* **BIGapp** +- **BIGapp** -* **BIGr** +- **BIGr** -* **vcfR** +- **vcfR** + - Knaus BJ, Grünwald NJ (2017). *VCFR: a package to manipulate and visualize variant call format data in R.* Molecular Ecology Resources, 17(1), 44–53. ISSN 757. [doi:10.1111/1755-0998.12549](https://dx.doi.org/10.1111/1755-0998.12549). + - Knaus BJ, Grünwald NJ (2016). *VcfR: an R package to manipulate and visualize VCF format data.* BioRxiv. [doi:10.1101/041277](https://dx.doi.org/10.1101/041277). -Knaus BJ, Grünwald NJ (2017). “VCFR: a package to manipulate and visualize variant call format data in R.” Molecular Ecology Resources, 17(1), 44–53. ISSN 757, https://dx.doi.org/10.1111/1755-0998.12549. - -Knaus BJ, Grünwald NJ (2016). “VcfR: an R package to manipulate and visualize VCF format data.” BioRxiv. https://dx.doi.org/10.1101/041277. - -* **AGHmatrix** - -R Amadeu R, Franco Garcia A, Munoz P, V Ferrao L (2023). “AGHmatrix: genetic relationship matrices in R .” Bioinformatics, 39(7). +- **AGHmatrix** + - Amadeu R, Franco Garcia A, Munoz P, V Ferrao L (2023). *AGHmatrix: genetic relationship matrices in R.* Bioinformatics, 39(7). diff --git a/inst/help_files/PCA_res.Rmd b/inst/help_files/PCA_res.Rmd index 07c678d..54ac140 100644 --- a/inst/help_files/PCA_res.Rmd +++ b/inst/help_files/PCA_res.Rmd @@ -4,8 +4,20 @@ output: html_document date: "2024-08-29" --- -* **3D PCA plot** +#### 3D PCA Plot -* **2D PCA plot** +- **Description**: The 3D PCA plot visualizes the first three principal components of genomic data, displayed in a three-dimensional space. +- **Interpretation**: Each point represents an individual sample or genome, positioned according to its scores on the first three principal components. Clusters may indicate genetic similarities or groupings within the population. +- **Use**: In the context of breeding decisions, this plot helps identify genetic diversity and potential outliers within a gene pool, facilitating the evaluation of genetic relationships between individuals. In broader population genetics, it aids in visualizing population structure and sub-structure. -* **Scree plot** +#### 2D PCA Plot + +- **Description**: The 2D PCA plot represents two principal components of the genomic data in a two-dimensional view. +- **Interpretation**: Points on the plot correspond to individual genetic samples, with the axes signifying the most significant components capturing data variance. Patterns or grouping may suggest genetic linkage or divergence. +- **Use**: For breeding applications, this plot offers a straightforward view to quickly assess genetic variance and clustering among candidate individuals. In population genetics, it helps in examining genetic differentiation or affinity among populations. + +#### Scree Plot + +- **Description**: The scree plot displays the eigenvalues of each principal component, in descending order, providing a visual summary of variance explained by each component. +- **Interpretation**: The x-axis lists the principal components, while the y-axis shows associated eigenvalues. A significant drop in eigenvalues, or "elbow", indicates where additional components provide diminishing returns in explaining data variance. +- **Use**: This plot assists in deciding the optimal number of principal components for analysis, striking a balance between data simplification and variance preservation. For breeding decisions, it informs which components capture most genetic variation, aiding in selection strategies. In population genetics, it helps determine the dimensional analysis required to understand genetic structure comprehensively. diff --git a/inst/help_files/Predictive_Ability_res.Rmd b/inst/help_files/Predictive_Ability_res.Rmd index bfb1db6..67b01e7 100644 --- a/inst/help_files/Predictive_Ability_res.Rmd +++ b/inst/help_files/Predictive_Ability_res.Rmd @@ -4,12 +4,27 @@ output: html_document date: "2024-08-29" --- -* **Violin plot** +#### Violin Plot -* **Box plot** +- **Description**: The violin plot showcases the distribution of Pearson correlation coefficients between predicted and known phenotype values for each group in a five-fold cross-validation, repeated across the user selected number of iterations. +- **Interpretation**: The shape and width of the violins illustrate the distribution and density of correlation values, while individual points represent specific correlation outcomes for each cross-validation split (total points = 5*# of iters). +- **Use**: This plot is vital for assessing the variability and robustness of predictive models in genomic selection, highlighting how well genotype data can predict phenotypes. -* **Predictive ability table** +#### Box Plot +- **Description**: The box plot is similar to the violin plot, summarizing the Pearson correlation coefficients without displaying individual data points. +- **Interpretation**: The box plot shows the median, interquartile range, and potential outliers of the correlation values, providing a concise view of prediction accuracy across all cross-validation folds. +- **Use**: This visualization is useful for quickly comparing the central tendency and variability of predictive performance across different traits or models, facilitating quick assessments of model reliability and effectiveness in genomic selection. + +#### Predictive Ability Table + +- **Description**: The predictive ability table summarizes the Pearson correlations (Predictive Ability) for each iteration, organized by specific traits of interest, such as Sepal Length and Sepal Width. +- **Interpretation**: Each row represents a different iteration, with columns providing correlation values for each phenotypic trait. Higher values indicate better predictive performance of the genomic selection model. +- **Use**: This table serves as a detailed summary of predictive ability across iterations, allowing researchers to evaluate model performance over repeated trials. It is crucial for determining model reliability and can be used to generate custom figures. + +- **Example**: + +
|Iter | Sepal.Length | Sepal.Width | |:---------:|:------------:|:-----------:| @@ -17,6 +32,4 @@ date: "2024-08-29" |2 | 0.721| 0.568| |3 | 0.724| 0.543| - - -  +
diff --git a/inst/help_files/Updog_Dosage_Calling_cite.Rmd b/inst/help_files/Updog_Dosage_Calling_cite.Rmd index 21e35d4..e7ca342 100644 --- a/inst/help_files/Updog_Dosage_Calling_cite.Rmd +++ b/inst/help_files/Updog_Dosage_Calling_cite.Rmd @@ -4,13 +4,14 @@ output: html_document date: "2024-08-29" --- -* **BIGapp** - - -* **Updog package** - -Gerard, D., Ferrão, L. F. V., Garcia, A. A. F., & Stephens, M. (2018). Genotyping Polyploids from Messy Sequencing Data. Genetics, 210(3), 789-807. doi: 10.1534/genetics.118.301468. - -If you used the “norm” model cite also: - -Gerard D, Ferrão L (2020). “Priors for Genotyping Polyploids.” Bioinformatics, 36(6), 1795-1800. ISSN 1367-4803, doi: 10.1093/bioinformatics/btz852. +- **BIGapp** + +- **BIGr** + +- **Updog Package** + + Gerard, D., Ferrão, L. F. V., Garcia, A. A. F., & Stephens, M. (2018). *Genotyping Polyploids from Messy Sequencing Data*. Genetics, 210(3), 789-807. [doi: 10.1534/genetics.118.301468](https://doi.org/10.1534/genetics.118.301468). + + If you used the “norm” model, cite also: + + Gerard D, Ferrão L (2020). *Priors for Genotyping Polyploids*. Bioinformatics, 36(6), 1795-1800. ISSN 1367-4803, [doi: 10.1093/bioinformatics/btz852](https://doi.org/10.1093/bioinformatics/btz852). diff --git a/inst/help_files/VCF_Filtering_cite.Rmd b/inst/help_files/VCF_Filtering_cite.Rmd index 1958c9d..390e900 100644 --- a/inst/help_files/VCF_Filtering_cite.Rmd +++ b/inst/help_files/VCF_Filtering_cite.Rmd @@ -4,16 +4,14 @@ output: html_document date: "2024-08-29" --- -* **BIGapp** -* **BIGr** +- **BIGapp** -* **Updog** (if filtering parameters used) +- **BIGr** -Gerard, D., Ferrão, L. F. V., Garcia, A. A. F., & Stephens, M. (2018). Genotyping Polyploids from Messy Sequencing Data. Genetics, 210(3), 789-807. doi: 10.1534/genetics.118.301468. +- **Updog** (if filtering parameters used) + Gerard, D., Ferrão, L. F. V., Garcia, A. A. F., & Stephens, M. (2018). *Genotyping Polyploids from Messy Sequencing Data*. Genetics, 210(3), 789-807. [doi: 10.1534/genetics.118.301468](https://doi.org/10.1534/genetics.118.301468). -* **vcfR** - -Knaus BJ, Grünwald NJ (2017). “VCFR: a package to manipulate and visualize variant call format data in R.” Molecular Ecology Resources, 17(1), 44–53. ISSN 757, https://dx.doi.org/10.1111/1755-0998.12549. - -Knaus BJ, Grünwald NJ (2016). “VcfR: an R package to manipulate and visualize VCF format data.” BioRxiv. https://dx.doi.org/10.1101/041277. +- **vcfR** + - Knaus BJ, Grünwald NJ (2017). *vcfR: a package to manipulate and visualize variant call format data in R.* Molecular Ecology Resources, 17(1), 44–53. ISSN 757, [doi:10.1111/1755-0998.12549](https://dx.doi.org/10.1111/1755-0998.12549). + - Knaus BJ, Grünwald NJ (2016). *VcfR: an R package to manipulate and visualize VCF format data.* BioRxiv. [doi:10.1101/041277](https://dx.doi.org/10.1101/041277). From 2958942dd56c6b61ac29b15d63a8e6d570a372bf Mon Sep 17 00:00:00 2001 From: alex-sandercock Date: Sun, 22 Dec 2024 17:28:57 -0500 Subject: [PATCH 36/38] UI Updates --- R/mod_Filtering.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/mod_Filtering.R b/R/mod_Filtering.R index 76ac321..511bcc2 100644 --- a/R/mod_Filtering.R +++ b/R/mod_Filtering.R @@ -34,7 +34,7 @@ mod_Filtering_ui <- function(id){ title = "Quality Filtering", status = "info", solidHeader = TRUE, collapsible = TRUE, collapsed = FALSE, fileInput(ns("updog_rdata"),"Choose VCF File", accept = c(".vcf",".gz")), textInput(ns("filter_output_name"), "Output File Name"), - numericInput(ns("filter_ploidy"),"Ploidy", min = 0, value = NULL), + numericInput(ns("filter_ploidy"),"Species Ploidy", min = 0, value = NULL), numericInput(ns("filter_maf"),"MAF filter", min = 0, max=1, value = 0.05, step = 0.01), numericInput(ns("size_depth"),"Min Read Depth (Marker per Sample)", min = 0, max = 300, value = 10, step = 1), numericInput(ns("snp_miss"),"Remove SNPs with >= % missing data", min = 0, max = 100, value = 50, step = 1), From af59936fedd9450f49d8610d5268df74e3d63734 Mon Sep 17 00:00:00 2001 From: Alexander Sandercock <39815775+alex-sandercock@users.noreply.github.com> Date: Sun, 22 Dec 2024 17:34:37 -0500 Subject: [PATCH 37/38] Update README.md --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3bad278..1f3f10d 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ # (B)reeding (I)nsight (G)enomics app -Currently, Breeding Insight provides bioinformatic processing support for our external collaborators. This R shiny app will provide a web-based user friendly way for our internal and external collaborators to analyze genomic data without needing to use command-line tools. +The BIGapp is a user-friendly tool for processing low to mid-density genotyping data for diploid and polyploid species. This R shiny app provides a web-based user friendly way for users to analyze genomic data without needing to use command-line tools. Additional analysis will be added, with the initial focus on a core set of features for supporting breeding decisions. ### Supported Analyses @@ -17,16 +17,17 @@ Supported: - SNP filtering - Sample filtering - Summary metrics - - SNP Allele Frequency + - SNP Polymorphism Information Content - SNP Minor Allele Frequency - Sample Observed Heterozygosity - Population Structure - PCA - DAPC - GWAS + - GWASpoly - GS - Estimate Model Prediction Accuracy - - Predict Trait Values for New Genotypes + - Predict Phenotype Values and EBVs for Samples ### Running the BIG app From 656d8ba05e39e66b73d51b89d5a3997e7a88366f Mon Sep 17 00:00:00 2001 From: Alexander Sandercock <39815775+alex-sandercock@users.noreply.github.com> Date: Sun, 22 Dec 2024 17:49:51 -0500 Subject: [PATCH 38/38] Update test-diversity.R --- tests/testthat/test-diversity.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/testthat/test-diversity.R b/tests/testthat/test-diversity.R index 82b7444..ce164f9 100644 --- a/tests/testthat/test-diversity.R +++ b/tests/testthat/test-diversity.R @@ -70,7 +70,7 @@ test_that("test diversity",{ axis.title = element_text(size = 14) ) - hist(diversity_items$het_df$ObservedHeterozygosity, breaks = as.numeric(input$hist_bins), col = "tan3", border = "black", xlim= c(0,1), + hist(diversity_items$het_df$Ho, breaks = as.numeric(input$hist_bins), col = "tan3", border = "black", xlim= c(0,1), xlab = "Observed Heterozygosity", ylab = "Number of Samples", main = "Sample Observed Heterozygosity")