#Loading required libraries
library(tidyverse)
library(Hmisc)
library(stringr)
library(reshape2)
library(dplyr)
library(splitstackshape)
library(chron)
library(ggplot2)
library(tidyverse)
library(ggthemes)

run_results <- read.table("/home/asiimwe/projects/run_env/alpha_star_wasp_comparison/benchmark_results_all_runs.txt", sep="\t", header = FALSE, fill=TRUE, quote = "")

run_results <- as.data.frame(run_results[-c(1),])
run_results$V4 <- NULL
colnames(run_results) <- c("Sample", "Run", "Thread", "Param","Value")

run_results$Param <- as.character(run_results$Param)
run_results$Param[run_results$Param == "Elapsed (wall clock) time (h"] <- "Wall_Clock"
run_results$Param[run_results$Param == "Maximum resident set size (kbytes)"] <- "Memory" 

run_results$Value <- as.character(run_results$Value)
run_results$Value <- gsub("mm:ss or m:ss): ", "", run_results$Value)
run_results$Value <- gsub(" ", "", run_results$Value)
run_results$Value

unique(run_results$Run)
run_results_STAR <- run_results %>% filter(Run == "STAR_Runs_noVars_noWaspOutput")#STAR base
run_results_STAR_WASP <- run_results %>% filter(Run == "STAR_Runs") #STAR WASP
run_results_WASP <- run_results %>% filter(Run == "STAR_WASP_Runs") #WASP - change naming globally 
run_results_STAR$Run <- NULL
run_results_STAR_WASP$Run <- NULL
run_results_WASP$Run <- NULL

run_results_STAR <- spread(run_results_STAR, key = Thread, value = Value)
colnames(run_results_STAR) <- c("Sample", "Param", "16threads-STAR", "32threads-STAR", "8threads-STAR")

run_results_STAR_WASP <- spread(run_results_STAR_WASP, key = Thread, value = Value)
colnames(run_results_STAR_WASP) <- c("Sample", "Param", "16threads-STAR_WASP", "32threads-STAR_WASP", "8threads-STAR_WASP")

run_results_WASP <- spread(run_results_WASP, key = Thread, value = Value)
colnames(run_results_WASP) <- c("Sample", "Param", "16threads-WASP", "32threads-WASP", "8threads-WASP")

data <- merge(run_results_STAR, run_results_STAR_WASP, by = c("Sample", "Param"))
data <- merge(data, run_results_WASP, by = c("Sample", "Param"))
#write.csv(data, file = "/home/asiimwe/projects/run_env/alpha_star_wasp_comparison/benchmark_results_all_runs_pivoted.csv")

#Plotting speeds and memory
data_melted <- melt(data, id.vars=c("Sample", "Param"))
data_melted <- cSplit(data_melted,"variable", "-", direction="wide")

colnames(data_melted) <- c("Sample", "Param", "Value", "Threads", "Run")
data_melted$Param <- as.character(data_melted$Param)

#data_melted_subset_clock <- data_melted_subset %>% filter(Param == "Wall_Clock")
#data_melted_subset_clock$Value <- gsub("\\.", ":", data_melted_subset_clock$Value)
#data_melted_subset_clock$Value
#data_melted_subset_clock$Value  <- chron(times. = data_melted_subset_clock$Value)#rejecting format - expecting h:m:s but third aguments is more than 60 for some instances


###########------------------------------------------------------------------------------
# #compressed dataset - removing parameters that are not needed
# #parameters to remove:
# param_remove <- c(
#   "Average resident set size (kbytes)",
#   "Average shared text size (kbytes)",
#   "Average stack size (kbytes)",
#   "Average total size (kbytes)",
#   "Average unshared data size (kbytes)",
#   "Exit status",
#   "Major (requiring I/O) page faults",
#   "Signals delivered",
#   "Socket messages received",
#   "Socket messages sent",
#   "Swaps"
# )
# 
# dataset_subset <- data %>% filter(Param %nin% param_remove)
# write.csv(dataset_subset, file = "/home/asiimwe/projects/run_env/alpha_star_wasp_comparison/run_results_subset_pivoted.csv")
###########------------------------------------------------------------------------------

#Benchmark plots:
#Elapsed (wall clock) time (h    mm:ss or m:ss):       Average resident set size (kbytes)  



final.log.results <- read.table("/home/asiimwe/projects/run_env/alpha_star_wasp_comparison/final_log_results_all_runs.txt", sep="|", header = FALSE, fill=TRUE, quote = "")
colnames(final.log.results) <- unlist(final.log.results[c(1),])
final.log.results <- as.data.frame(final.log.results[-c(1),])
final.log.results <- as.data.frame(final.log.results)

final.log.results$Sample <- as.character(final.log.results$Sample)
final.log.results$Run <- as.character(final.log.results$Run)
final.log.results$Thread <- as.character(final.log.results$Thread)
final.log.results$Param <- as.character(final.log.results$Param)

colnames(final.log.results)
final.log.results$Param <- str_trim(final.log.results$Param)

final.log.results_filt <- final.log.results %>% filter(Value != "")

final.log.results_filt$Run <- as.character(final.log.results_filt$Run)
unique(final.log.results_filt$Run)
final.log.results_filt$Run[final.log.results_filt$Run == "STAR_Runs_noVars_noWaspOutput"] <- "STAR"
final.log.results_filt$Run[final.log.results_filt$Run == "STAR_Runs"] <- "STAR_WASP"
final.log.results_filt$Run[final.log.results_filt$Run == "STAR_WASP_Runs"] <- "WASP"
colnames(final.log.results_filt)[3] <- "Threads"


#Extracting number of reads for now
final.log.results_filt_input_reads <- final.log.results_filt %>% filter(Param == "Number of input reads") 
final.log.results_filt_mapping_speed <- final.log.results_filt %>% filter(Param == "Mapping speed, Million of reads per hour") 
final.log.results_filt_average_input_read_length <- final.log.results_filt %>% filter(Param == "Average input read length")


data_melted_join_pass1 <- inner_join(data_melted, final.log.results_filt_input_reads, by = c("Sample", "Run", "Threads"))
data_melted_join_pass2 <- inner_join(data_melted_join_pass1, final.log.results_filt_mapping_speed, by = c("Sample", "Run", "Threads"))
data_melted_beta <- inner_join(data_melted_join_pass2, final.log.results_filt_average_input_read_length, by = c("Sample", "Run", "Threads"))

colnames(data_melted_beta)
colnames(data_melted_beta) <- c( "Sample",    "Param",   "Value", "Threads",   "Run",       "Param.y" ,  "Number_of_input_reads",   "Param.x.x", "Mapping_speed_Million_of_reads_per_hour", "Param.y.y", "Average_input_read_length")
data_melted_beta$Param.y <- NULL
data_melted_beta$Param.x.x <- NULL
data_melted_beta$Param.y.y <- NULL 


nrow(data_melted)
nrow(final.log.results_filt_input_reads)
nrow(final.log.results_filt_mapping_speed)
nrow(final.log.results_filt_average_input_read_length)
nrow(data_melted_beta)

#write.csv(data_melted_beta, file = "/home/asiimwe/projects/run_env/alpha_star_wasp_comparison/data_melted_beta.csv")



data_melted_beta <- read.csv("/home/asiimwe/projects/run_env/alpha_star_wasp_comparison/data_melted_beta.csv")
data_melted_beta$X <- NULL
colnames(data_melted_beta)
#"Sample"  "Run"     "Threads" "Param"   "Value"   "N_Reads" "Speed"  

#Data cleanup
str(data_melted_beta)
data_melted_beta$Sample <- as.character(data_melted_beta$Sample)
data_melted_beta$Param <- as.character(data_melted_beta$Param)
data_melted_beta$Value <- gsub("%", "", data_melted_beta$Value)
data_melted_beta %>% filter(Param == "Wall_Clock") #We have different formats for the wall clock - 1:11:33 or 59:38.85 get meanings and convert
#We need to reorder Threads to appear in the correct order
data_melted_beta$Threads <- ordered(data_melted_beta$Threads , levels = c("8threads", "16threads", "32threads"))


dat_text <- data.frame(
  label = c("8 Threads", "16 Threads", "32 Threads"),
  Threads   = c("8threads", "16threads", "32threads")
#  Run = factor(3,levels = c(8,16,32))
)

data_melted_beta_memory <- data_melted_beta %>% filter(Param == "Memory")

data_melted_beta_memory$Value <- as.numeric(data_melted_beta_memory$Value)


data_melted_beta_memory <- data_melted_beta_memory[order(data_melted_beta_memory$Param),] 
range(data_melted_beta_memory$Value) #30649908 38445368

#Memory
data_melted_beta_memory %>% filter(Param == "Memory") %>% 
  ggplot(aes(x = Sample, y = Value, group=Run)) +
  geom_line(aes(color = Run, linetype = Run)) + 
  scale_color_manual(values = c("darkred", "steelblue", "cyan3")) +
  facet_wrap(~Threads) + labs(y = "Memory", x="") +
  theme_light() + theme(legend.title = element_blank()) + #Base, bw, excel_new(), few, light, lindraw
  #theme(strip.background =element_rect(fill="white"))+
  # theme(strip.text = element_text(colour = 'black')) +
  theme(strip.text.x = element_blank()) + theme(axis.text.x = element_text(angle = 90,hjust = 1,vjust = 0.5, size=10))# +
#geom_text(x = 3, y = max(data_melted_beta_memory$Value), aes(label = label), data = dat_text, check_overlap = TRUE) 



#Mapping Speed
data_melted_beta_speed <- data_melted_beta[order(data_melted_beta$Sample, data_melted_beta$Mapping_speed_Million_of_reads_per_hour),] 

data_melted_beta_speed %>% 
  ggplot(aes(x = Sample, y = Mapping_speed_Million_of_reads_per_hour, group=Run)) +
  geom_line(aes(color = Run, linetype = Run)) + 
  scale_color_manual(values = c("darkred", "steelblue", "cyan3")) +
  facet_wrap(~Threads) + labs(y = "Mapping_Speed", x="") +
  theme_light() +  theme(legend.title = element_blank()) + #Base, bw, excel_new(), few, light, lindraw
  #theme(strip.background =element_rect(fill="white"))+
  # theme(strip.text = element_text(colour = 'black')) +
  theme(strip.text.x = element_blank()) + theme(axis.text.x = element_text(angle = 90,hjust = 1,vjust = 0.5, size=10))# +
#geom_text(x = 3, y = max(data_melted_beta_memory$Value), aes(label = label), data = dat_text, check_overlap = TRUE) 


#put threads, order, look into other stats, tables

#Latex installations
# tinytex::parse_install(
#   text = "! LaTeX Error: File `ae.sty' not found."
# )
# 
# 
# tinytex::parse_install(
#   text = "! LaTeX Error: File `fullpage.sty' not found."
# )
# tinytex::parse_install(
#   text = "! LaTeX Error: File `moresize.sty' not found."
# )
# 
# 
# tinytex::parse_install(
#   text = "! LaTeX Error: File `colortbl.sty' not found."
# )
# 
# 
# tinytex::parse_install(
#   text = "! LaTeX Error: File `soul.sty' not found."
# )
# 
# tinytex::parse_install(
#   text = "! LaTeX Error: File `adjustbox.sty' not found."
# )
# 
# 
# tinytex::parse_install(
#   text = "! LaTeX Error: File `collectbox.sty' not found."
# )



#Preparing data for latex rep
data_melted_beta
data_melted_beta$Threads <- ordered(data_melted_beta$Threads , levels = c("8threads", "16threads", "32threads"))
unique(data_melted_beta$Param)
data_melted_beta_subset <- data_melted_beta %>% filter(Param == "Wall_Clock" | Param == "Memory")
data_melted_beta_subset$Average_input_read_length <- NULL
#data_melted_beta_subset$threads_run <- paste0(data_melted_beta_subset$Threads, "_", data_melted_beta_subset$Run)
#data_melted_beta_subset$Param <- NULL
#data_melted_beta_subset$Threads <- NULL
#data_melted_beta_subset$Run <- NULL

#-----------------------STAR-----------------------
data_melted_beta_subset_STAR <- data_melted_beta_subset %>% filter(Run == "STAR")
data_melted_beta_subset_STAR_Param <- data_melted_beta_subset_STAR[1:4]
data_melted_beta_subset_STAR_reads <- unique(data_melted_beta_subset_STAR[,c(1,6)])
data_melted_beta_subset_STAR_speed <- unique(data_melted_beta_subset_STAR[,c(1,4, 7)])
data_melted_beta_subset_STAR_Param$comb <- paste0(data_melted_beta_subset_STAR_Param$Param, "_", data_melted_beta_subset_STAR_Param$Threads, "_", "STAR")
data_melted_beta_subset_STAR_Param$Param <- NULL
data_melted_beta_subset_STAR_Param$Threads <- NULL
data_melted_beta_subset_STAR_Param <- as.data.frame(data_melted_beta_subset_STAR_Param)
data_melted_beta_subset_STAR_Param_spread <- spread(data_melted_beta_subset_STAR_Param, key = comb, value = Value)

data_melted_beta_subset_STAR_Param_spread <- data_melted_beta_subset_STAR_Param_spread %>% dplyr::group_by(Sample) %>% 
  dplyr::summarise_all(purrr::discard, is.na)

data_melted_beta_subset_STAR_Param_spread <- as.data.frame(data_melted_beta_subset_STAR_Param_spread)

data_melted_beta_subset_STAR_speed_spread <- spread(data_melted_beta_subset_STAR_speed, key = Threads, value = Mapping_speed_Million_of_reads_per_hour)
colnames(data_melted_beta_subset_STAR_speed_spread)
colnames(data_melted_beta_subset_STAR_speed_spread) <- c("Sample", "Mapping_Speed_8threads_STAR",  "Mapping_Speed_16threads_STAR", "Mapping_Speed_32threads_STAR")
STAR_tab_subset <- inner_join(data_melted_beta_subset_STAR_reads, data_melted_beta_subset_STAR_Param_spread, by = "Sample")
STAR_tab_subset <- inner_join(STAR_tab_subset, data_melted_beta_subset_STAR_speed_spread, by = "Sample")
STAR_tab_subset <- STAR_tab_subset[,c(1,2,3,4,5,9,10,11, 6,7,8)]

#----------------------STAR_WASP-----------------------
data_melted_beta_subset_STAR_WASP <- data_melted_beta_subset %>% filter(Run == "STAR_WASP")
data_melted_beta_subset_STAR_WASP_Param <- data_melted_beta_subset_STAR_WASP[1:4]
data_melted_beta_subset_STAR_WASP_reads <- unique(data_melted_beta_subset_STAR_WASP[,c(1,6)])
data_melted_beta_subset_STAR_WASP_speed <- unique(data_melted_beta_subset_STAR_WASP[,c(1,4, 7)])
data_melted_beta_subset_STAR_WASP_Param$comb <- paste0(data_melted_beta_subset_STAR_WASP_Param$Param, "_", data_melted_beta_subset_STAR_WASP_Param$Threads, "_", "STAR_WASP")
data_melted_beta_subset_STAR_WASP_Param$Param <- NULL
data_melted_beta_subset_STAR_WASP_Param$Threads <- NULL
data_melted_beta_subset_STAR_WASP_Param <- as.data.frame(data_melted_beta_subset_STAR_WASP_Param)
rownames(data_melted_beta_subset_STAR_WASP_Param) <- 1:nrow(data_melted_beta_subset_STAR_WASP_Param)
data_melted_beta_subset_STAR_WASP_Param$id <- 1:nrow(data_melted_beta_subset_STAR_WASP_Param)
data_melted_beta_subset_STAR_WASP_Param_spread <- spread(data_melted_beta_subset_STAR_WASP_Param, key = comb, value = Value)
data_melted_beta_subset_STAR_WASP_Param_spread$id <- NULL

data_melted_beta_subset_STAR_WASP_Param_spread <- data_melted_beta_subset_STAR_WASP_Param_spread %>% dplyr::group_by(Sample) %>% 
  dplyr::summarise_all(purrr::discard, is.na)

data_melted_beta_subset_STAR_WASP_Param_spread <- as.data.frame(data_melted_beta_subset_STAR_WASP_Param_spread)

data_melted_beta_subset_STAR_WASP_speed_spread <- spread(data_melted_beta_subset_STAR_WASP_speed, key = Threads, value = Mapping_speed_Million_of_reads_per_hour)
colnames(data_melted_beta_subset_STAR_WASP_speed_spread)
colnames(data_melted_beta_subset_STAR_WASP_speed_spread) <- c("Sample", "Mapping_Speed_8threads_STAR_WASP",  "Mapping_Speed_16threads_STAR_WASP", "Mapping_Speed_32threads_STAR_WASP")
STAR_WASP_tab_subset <- inner_join(data_melted_beta_subset_STAR_WASP_Param_spread, data_melted_beta_subset_STAR_WASP_speed_spread, by = "Sample")
STAR_WASP_tab_subset <- STAR_WASP_tab_subset[,c(1,2,3,4,8,9,10, 5,6,7)]


#-------------------WASP-------------------------------
data_melted_beta_subset_WASP <- data_melted_beta_subset %>% filter(Run == "WASP")
data_melted_beta_subset_WASP_Param <- data_melted_beta_subset_WASP[1:4]
data_melted_beta_subset_WASP_reads <- unique(data_melted_beta_subset_WASP[,c(1,6)])
data_melted_beta_subset_WASP_speed <- unique(data_melted_beta_subset_WASP[,c(1,4, 7)])
data_melted_beta_subset_WASP_Param$comb <- paste0(data_melted_beta_subset_WASP_Param$Param, "_", data_melted_beta_subset_WASP_Param$Threads, "_", "WASP")
data_melted_beta_subset_WASP_Param$Param <- NULL
data_melted_beta_subset_WASP_Param$Threads <- NULL
data_melted_beta_subset_WASP_Param <- as.data.frame(data_melted_beta_subset_WASP_Param)
rownames(data_melted_beta_subset_WASP_Param) <- 1:nrow(data_melted_beta_subset_WASP_Param)
data_melted_beta_subset_WASP_Param$id <- 1:nrow(data_melted_beta_subset_WASP_Param)
data_melted_beta_subset_WASP_Param_spread <- spread(data_melted_beta_subset_WASP_Param, key = comb, value = Value)
data_melted_beta_subset_WASP_Param_spread$id <- NULL

data_melted_beta_subset_WASP_Param_spread <- data_melted_beta_subset_WASP_Param_spread %>% dplyr::group_by(Sample) %>% 
  dplyr::summarise_all(purrr::discard, is.na)

data_melted_beta_subset_WASP_Param_spread <- as.data.frame(data_melted_beta_subset_WASP_Param_spread)

data_melted_beta_subset_WASP_speed_spread <- spread(data_melted_beta_subset_WASP_speed, key = Threads, value = Mapping_speed_Million_of_reads_per_hour)
colnames(data_melted_beta_subset_WASP_speed_spread)
colnames(data_melted_beta_subset_WASP_speed_spread) <- c("Sample", "Mapping_Speed_8threads_WASP",  "Mapping_Speed_16threads_WASP", "Mapping_Speed_32threads_WASP")

WASP_tab_subset <- inner_join(data_melted_beta_subset_WASP_Param_spread, data_melted_beta_subset_WASP_speed_spread, by = "Sample")
WASP_tab_subset <- WASP_tab_subset[,c(1,2,3,4,8,9,10, 5,6,7)]

STAR_tab_subset <- as.data.frame(STAR_tab_subset)
STAR_WASP_tab_subset <- as.data.frame(STAR_WASP_tab_subset)
WASP_tab_subset <- as.data.frame(WASP_tab_subset)

n_way_merger0 <- merge(STAR_tab_subset, STAR_WASP_tab_subset, by = "Sample")
n_way_merger <- merge(n_way_merger0, WASP_tab_subset, by = "Sample")

n_way_merger$Size_holder1 <- ""
n_way_merger$Size_holder2 <- ""


colnames(n_way_merger)

#[1] "Sample"                            "Number_of_input_reads"             "Memory_16threads_STAR"             "Memory_32threads_STAR"             "Memory_8threads_STAR"             
#[6] "Mapping_Speed_8threads_STAR"       "Mapping_Speed_16threads_STAR"      "Mapping_Speed_32threads_STAR"      "Wall_Clock_16threads_STAR"         "Wall_Clock_32threads_STAR"        
#[11] "Wall_Clock_8threads_STAR"          "Memory_16threads_STAR_WASP"        "Memory_32threads_STAR_WASP"        "Memory_8threads_STAR_WASP"         "Mapping_Speed_8threads_STAR_WASP" 
#[16] "Mapping_Speed_16threads_STAR_WASP" "Mapping_Speed_32threads_STAR_WASP" "Wall_Clock_16threads_STAR_WASP"    "Wall_Clock_32threads_STAR_WASP"    "Wall_Clock_8threads_STAR_WASP"    
#[21] "Memory_16threads_WASP"             "Memory_32threads_WASP"             "Memory_8threads_WASP"              "Mapping_Speed_8threads_WASP"       "Mapping_Speed_16threads_WASP"     
#[26] "Mapping_Speed_32threads_WASP"      "Wall_Clock_16threads_WASP"         "Wall_Clock_32threads_WASP"         "Wall_Clock_8threads_WASP"          "Size_holder1"                     
#[31] "Size_holder2"

#n_way_merger <- n_way_merger[] #reorg cols based on table - nreads | Ram |speed | Clock

knitr::kable(n_way_merger, "latex")
























