|
|
@ -1,4 +1,7 @@ |
|
|
|
library(shiny) |
|
|
|
library(tidyverse) |
|
|
|
library(sangerseqR) |
|
|
|
library(msa) |
|
|
|
|
|
|
|
# Define UI for application that draws a histogram |
|
|
|
ui <- fluidPage( |
|
|
@ -9,31 +12,187 @@ ui <- fluidPage( |
|
|
|
# Sidebar with a slider input for number of bins |
|
|
|
sidebarLayout( |
|
|
|
sidebarPanel( |
|
|
|
sliderInput("bins", |
|
|
|
"Number of bins:", |
|
|
|
min = 1, |
|
|
|
max = 50, |
|
|
|
value = 30) |
|
|
|
fileInput("file1", "Sube fichero ab1", multiple = FALSE), |
|
|
|
numericInput("thr", label = "Peak Threshold", value = 450), |
|
|
|
numericInput("dist1", label = "1st Distance Reduction", value = 4), |
|
|
|
numericInput("dist2", label = "2nd Distance Reduction", value = 7), |
|
|
|
numericInput("ratio", label = "Ratio 2ary seq", value = 0.33), |
|
|
|
textInput("old", label="Referencia"), |
|
|
|
actionButton("calab", "Analizar") |
|
|
|
), |
|
|
|
|
|
|
|
# Show a plot of the generated distribution |
|
|
|
mainPanel( |
|
|
|
plotOutput("distPlot") |
|
|
|
tags$head(tags$style(HTML("pre,.wrap { white-space: pre-wrap; word-break: break-all; }"))), |
|
|
|
verbatimTextOutput("Primseq") %>% tagAppendAttributes(class="wrap"), |
|
|
|
verbatimTextOutput("align") |
|
|
|
) |
|
|
|
) |
|
|
|
) |
|
|
|
|
|
|
|
# Define server logic required to draw a histogram |
|
|
|
server <- function(input, output) { |
|
|
|
# observe({ |
|
|
|
# |
|
|
|
# obj<<-readsangerseq(input$file1) |
|
|
|
# } |
|
|
|
# }) |
|
|
|
obj<-reactiveValues() |
|
|
|
obj$aborig<-NULL |
|
|
|
obj_ab<-NULL |
|
|
|
obj$seq<-NULL |
|
|
|
|
|
|
|
observe({ |
|
|
|
if (!is.null(input$file1)){ |
|
|
|
obj$aborig<-readsangerseq(input$file1$datapath) |
|
|
|
} |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
observeEvent(input$calab, { |
|
|
|
if (!is.null(obj$aborig)){ |
|
|
|
obj_ab<-obj$aborig |
|
|
|
## Functions |
|
|
|
getpeaks <- function(trace) { |
|
|
|
r <- rle(trace) |
|
|
|
indexes <- which(rep(diff(sign(diff(c(-Inf, r$values, -Inf)))) == -2, |
|
|
|
times = r$lengths)) |
|
|
|
cbind(indexes, trace[indexes]) |
|
|
|
} |
|
|
|
|
|
|
|
output$distPlot <- renderPlot({ |
|
|
|
# generate bins based on input$bins from ui.R |
|
|
|
x <- faithful[, 2] |
|
|
|
bins <- seq(min(x), max(x), length.out = input$bins + 1) |
|
|
|
peakvalues <- function(x, pstart, pstop) { |
|
|
|
region <- x[x[,1] > pstart & x[,1] < pstop, ,drop=FALSE] |
|
|
|
if (length(region[,1]) == 0) return(c(0, NA)) |
|
|
|
else return(c(max(region[,2], na.rm=TRUE), region[which.max(region[,2]),1])) |
|
|
|
} |
|
|
|
|
|
|
|
redDiffs<-function(matrix, diff=5){ |
|
|
|
diffs<-diff(matrix[,1]) |
|
|
|
pos<-matrix(nrow=0, ncol=2) |
|
|
|
i_temp<-matrix(nrow = 0, ncol = 2) |
|
|
|
|
|
|
|
for(i in 1:nrow(matrix)){ |
|
|
|
i_temp<-rbind(i_temp, matrix[i,]) |
|
|
|
|
|
|
|
if(diffs[i] >= diff | i == nrow(matrix)){ |
|
|
|
pos<-rbind(pos, i_temp[which(i_temp[,2] == max(i_temp[,2]))[1],]) |
|
|
|
i_temp<-matrix(nrow = 0, ncol = 2) |
|
|
|
} |
|
|
|
} |
|
|
|
return(pos) |
|
|
|
} |
|
|
|
print("Start") |
|
|
|
|
|
|
|
Apeaks <- getpeaks(obj_ab@traceMatrix[,1]) |
|
|
|
Cpeaks <- getpeaks(obj_ab@traceMatrix[,2]) |
|
|
|
Gpeaks <- getpeaks(obj_ab@traceMatrix[,3]) |
|
|
|
Tpeaks <- getpeaks(obj_ab@traceMatrix[,4]) |
|
|
|
|
|
|
|
peakthr<-input$thr |
|
|
|
peakCusMatrix<-rbind(Gpeaks[Gpeaks[,2] > peakthr,], |
|
|
|
Apeaks[Apeaks[,2] > peakthr,], |
|
|
|
Tpeaks[Tpeaks[,2] > peakthr,], |
|
|
|
Cpeaks[Cpeaks[,2] > peakthr,]) |
|
|
|
|
|
|
|
peakCusMatrix<-peakCusMatrix %>% as.data.frame() %>% rename(Int=V2) %>% group_by(indexes) %>% summarise(Int=max(Int)[1]) |
|
|
|
peakCusMatrix<-as.matrix(peakCusMatrix) |
|
|
|
|
|
|
|
pos1<-redDiffs(peakCusMatrix, input$dist1) |
|
|
|
pos<-redDiffs(pos1, input$dist2) |
|
|
|
print(nrow(pos)) |
|
|
|
|
|
|
|
pos1<-pos1[,1] |
|
|
|
pos<-pos[,1] |
|
|
|
|
|
|
|
print("Peaks Detected") |
|
|
|
|
|
|
|
primarypeaks <- pos |
|
|
|
diffs <- diff(c(0,primarypeaks)) |
|
|
|
starts <- primarypeaks - 0.5*diffs |
|
|
|
stops <- c(primarypeaks[1:(length(primarypeaks)-1)] + |
|
|
|
0.5*diffs[2:length(diffs)], |
|
|
|
primarypeaks[length(diffs)] + 0.5*diffs[length(diffs)] |
|
|
|
) |
|
|
|
|
|
|
|
primary <- NULL |
|
|
|
secondary <- NULL |
|
|
|
tempPosMatrix <- matrix(nrow=length(starts), ncol=4) |
|
|
|
tempAmpMatrix <- matrix(nrow=length(starts), ncol=4) |
|
|
|
|
|
|
|
ratio<-input$ratio |
|
|
|
|
|
|
|
length(starts) |
|
|
|
|
|
|
|
for(i in 1:length(starts)) { |
|
|
|
Apeak <- peakvalues(Apeaks, starts[i], stops[i]) |
|
|
|
Cpeak <- peakvalues(Cpeaks, starts[i], stops[i]) |
|
|
|
Gpeak <- peakvalues(Gpeaks, starts[i], stops[i]) |
|
|
|
Tpeak <- peakvalues(Tpeaks, starts[i], stops[i]) |
|
|
|
if(is.na(Apeak[2]) & |
|
|
|
is.na(Cpeak[2]) & |
|
|
|
is.na(Gpeak[2]) & |
|
|
|
is.na(Tpeak[2])) next #rare case where no peak found |
|
|
|
signals <- c(Apeak[1], Cpeak[1], Gpeak[1], Tpeak[1]) |
|
|
|
tempAmpMatrix[i,] <- signals |
|
|
|
positions <- c(Apeak[2], Cpeak[2], Gpeak[2], Tpeak[2]) |
|
|
|
tempPosMatrix[i,] <- positions |
|
|
|
signalratios <- signals/max(signals, na.rm=TRUE) |
|
|
|
Bases <- c("A", "C", "G", "T") |
|
|
|
# Bases <- c("G", "A", "T", "G") |
|
|
|
Bases[signalratios < ratio] <- NA |
|
|
|
#sort by decreasing signal strength |
|
|
|
Bases <- Bases[order(signals, decreasing=TRUE)] |
|
|
|
positions <- positions[order(signals, decreasing=TRUE)] |
|
|
|
if(length(Bases[!is.na(Bases)]) == 4 |
|
|
|
| length(Bases[!is.na(Bases)]) == 0) { |
|
|
|
primary <- c(primary, "N") |
|
|
|
secondary <- c(secondary, "N") |
|
|
|
} |
|
|
|
else if(length(Bases[!is.na(Bases)]) > 1) { |
|
|
|
primary <- c(primary, Bases[1]) |
|
|
|
Bases2 <- Bases[2:4] |
|
|
|
secondary <- c(secondary, |
|
|
|
mergeIUPACLetters(paste(sort(Bases2[!is.na(Bases2)]), |
|
|
|
collapse=""))) |
|
|
|
} |
|
|
|
else { |
|
|
|
primary <- c(primary, Bases[1]) |
|
|
|
secondary <- c(secondary, Bases[1]) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
obj_ab@peakPosMatrix <- tempPosMatrix[rowSums(!is.na(tempPosMatrix)) > 0,] |
|
|
|
obj_ab@peakAmpMatrix <- tempAmpMatrix[rowSums(!is.na(tempPosMatrix)) > 0,] |
|
|
|
obj_ab@primarySeqID <- "sangerseq package primary basecalls" |
|
|
|
obj_ab@primarySeq <- DNAString(paste(primary, collapse="")) |
|
|
|
obj_ab@secondarySeqID <- "sangerseq package secondary basecalls" |
|
|
|
obj_ab@secondarySeq <- DNAString(paste(secondary, collapse="")) |
|
|
|
obj_ab<<-obj_ab |
|
|
|
obj$seq<-T |
|
|
|
print(as.character(obj_ab@primarySeq)) |
|
|
|
print("Finished") |
|
|
|
} |
|
|
|
}) |
|
|
|
|
|
|
|
output$Primseq <- renderText({ |
|
|
|
observeEvent(obj$seq, {}) |
|
|
|
|
|
|
|
if (!is.null(obj$seq) & input$old != ""){ |
|
|
|
print(1) |
|
|
|
as.character(obj_ab@primarySeq) |
|
|
|
} |
|
|
|
}) |
|
|
|
|
|
|
|
output$align <- renderText({ |
|
|
|
observeEvent(obj$seq, {}) |
|
|
|
|
|
|
|
if (!is.null(obj$seq) & input$old != ""){ |
|
|
|
print(2) |
|
|
|
alignament<-msaClustalW(c("Old"=toupper(input$old),"New"=obj_ab@primarySeq %>% as.character), type="dna") |
|
|
|
paste(capture.output(print(alignament, show="complete")), collapse="\n") |
|
|
|
} |
|
|
|
}) |
|
|
|
|
|
|
|
# draw the histogram with the specified number of bins |
|
|
|
hist(x, breaks = bins, col = 'darkgray', border = 'white') |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
# Run the application |
|
|
|