90 lines
2.5 KiB
R
90 lines
2.5 KiB
R
# Lab 9 for the University of Tulsa's CS-6643 Bioinformatics Course
|
|
# Pairwise Sequence Alignment with Dynamic Programming
|
|
# Professor: Dr. McKinney, Fall 2022
|
|
# Noah L. Schrick - 1492657
|
|
|
|
## Set Working Directory to file directory - RStudio approach
|
|
setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
|
|
|
|
|
|
#### Part A: Specifying the Input
|
|
## Score Rules and Seqs
|
|
x_str <- "ATAC" # side sequence
|
|
y_str <- "GTGTAC" # top sequence
|
|
match_score <- 3
|
|
mismatch_score <- -1
|
|
gap_penalty <- -4
|
|
|
|
## Substitution Matrix
|
|
dna.letters<-c("A","C","G","T")
|
|
num.letters <- length(dna.letters)
|
|
S<-data.frame(matrix(0,nrow=num.letters,ncol=num.letters)) # data frame
|
|
rownames(S)<-dna.letters; colnames(S)<-dna.letters
|
|
for (i in 1:4){
|
|
for (j in 1:4){
|
|
if(dna.letters[i]==dna.letters[j]){
|
|
S[i,j]<- match_score
|
|
}
|
|
else{
|
|
S[i,j]<- mismatch_score
|
|
}
|
|
}
|
|
}
|
|
|
|
#### Part B: Alignment Score Matrix (F) and Traceback Matrix (T)
|
|
x <- unlist(strsplit(x_str, ""))
|
|
y <- unlist(strsplit(y_str, ""))
|
|
x.len <- length(x)
|
|
y.len <- length(y)
|
|
|
|
Fmat<-matrix(0,nrow=x.len+1,ncol=y.len+1)
|
|
Tmat<-Fmat # 0's to start
|
|
|
|
rownames(Fmat)<-c("-",x); colnames(Fmat)<-c("-",y)
|
|
rownames(Tmat)<-c("-",x); colnames(Tmat)<-c("-",y)
|
|
|
|
# create first row and column
|
|
Fmat[,1]<- seq(from=0,len=x.len+1,by=-abs(gap_penalty))
|
|
Fmat[1,]<- seq(from=0,len=y.len+1,by=-abs(gap_penalty))
|
|
Tmat[,1]<- rep(2,x.len+1) # 2 means align with a gap in the upper seq
|
|
Tmat[1,]<- rep(3,y.len+1) # 3 means align with a gap in the side seq
|
|
|
|
|
|
#### Part C: Building Fmat and Tmat
|
|
## Building Fmat and Tmat
|
|
for (i in 2:nrow(Fmat)){
|
|
for (j in 2:ncol(Fmat)){ # use F recursive rules
|
|
test_three_cases <- c(Fmat[i-1, j-1] + S[rownames(Fmat)[i], colnames(Fmat)[j]], # 1 mis/match
|
|
Fmat[i-1, j] + gap_penalty, # 2 up-gap
|
|
Fmat[i, j-1] + gap_penalty) # 3 left-gap
|
|
Fmat[i,j]=max(test_three_cases)
|
|
Tmat[i,j]=which.max(test_three_cases)
|
|
}
|
|
}
|
|
final_score <- Fmat[nrow(Fmat),ncol(Fmat)]
|
|
|
|
## Aligning from Tmat
|
|
n <- nrow(Tmat)
|
|
m <- ncol(Tmat)
|
|
seq_align <- character()
|
|
while( (n+m)!=2 ){
|
|
if (Tmat[n,m]==1){
|
|
curr_align_col <- rbind(x[n-1],y[m-1])
|
|
seq_align <- cbind(curr_align_col,seq_align)
|
|
n <- n-1
|
|
m <- m-1
|
|
}else if(Tmat[n,m]==2){
|
|
curr_align_col <- rbind(x[n-1],"-")
|
|
seq_align <- cbind(curr_align_col,seq_align)
|
|
n <- n-1
|
|
}else{
|
|
curr_align_col <- rbind("-",y[m-1])
|
|
seq_align <- cbind(curr_align_col,seq_align)
|
|
m <- m-1
|
|
}
|
|
} # end while
|
|
|
|
seq_align
|
|
|
|
|