BAM files
Standard BAM file
Exported as tsv, but when imported in R
readr:: read_delim( "banalyzer/data_raw/data/cellranger_big.txt",
delim = "\t", escape_double = FALSE,
col_names = FALSE, trim_ws = TRUE)
## Warning: One or more parsing issues, call `problems()` on your data frame for details,
## e.g.:
## dat <- vroom(...)
## problems(dat)
## Rows: 3698 Columns: 29
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: "\t"
## chr (24): X1, X3, X6, X7, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, ...
## dbl (5): X2, X4, X5, X8, X9
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Bam converter 10x function
#' 10x Bam converter
#' takes a tsv file from a cellranger bam file as input and returns a data frame.
#'
#' @param text.file File address of a cellranger bam file transformed in tsv format.
#'
#' @return A data frame with single reads as rows and bam file parameters as columns
#' @export
#' @import dplyr
#'
#' @examples bam.converter.10x(system.file("extdata/cellrangerdata.txt", package = "banalyzer"))
bam.converter.10x <- function(text.file){
# Read bam file as tab delimited file in. Suppresses warnings and messages.
raw.table <- suppressMessages(suppressWarnings(
readr:: read_delim(text.file,
delim = "\t", escape_double = FALSE,
col_names = FALSE, trim_ws = TRUE)))
# Collect information about which combinations of informations (pattern) is
# available for each read (= each row). It achieves it by collecting the 2
# letter code for each informaiton in a new "pattern" column. This is true
# for all the column after the number 11, as the first 11 columns are always
# the same
raw.table["pattern"] <-
# Find which information each observation contains and in which order
apply(raw.table[12:ncol(raw.table)], 2,
function(x) gsub("(^..)(.+$)", "\\1", x)) %>%
# Collapse the pattern of information and append it to each read as a new
# variable
apply(1, function(x) paste(x, collapse = " "))
# Extract the possible pattern combinations
pattern_list <- unique(raw.table$pattern)
# Create a list of all the existing information (abbreviation) in the table,
# without NAs
full_pattern <-
# Collapse the pattern list to a single string
paste(pattern_list, collapse = " ") %>%
# Split the single string to a list of n elements
strsplit(" ") %>%
# Transform the list to a vector
unlist() %>%
# Keep only one cpy of each abbreviation
unique()
full_pattern <- unique(grep("NA", full_pattern, value = TRUE, invert = TRUE))
# Define column names of final table
# Common names are the same for all BAM files ( the first 11 columns are fixed)
common.names <- c("QName", "FLAG", "Ref_name", "Left_pos",
"Map_Quality", "CIGAR", "Ref_name_mate",
"Pos_name_read", "Temp_length", "Sequence", "Read_Quality")
# The column names at the end will be the union of common variables and the full pattern of variables
full_names <- c(common.names, full_pattern)
# Split the raw table into a list of tables that share the same patern of values
# i.e., will have the same number of columns with non-NA values
pattern.divided.table <- raw.table %>%
group_by(pattern) %>%
group_split()
# Create a function that:
# 1. Identifies which variables are present in each pattern group
single.table.adaptor <- function(df){
# Assign column names for this table - the column order is unchanged since
# the pattern was created - thus the order in the pattern is the same as the
# order of the variables contained in the columns
specific.names <- strsplit(df$pattern[1], " ") %>% unlist()
tab.names <- c(common.names, specific.names)
colnames(df) <- tab.names
# Remove columns named NA
df <- df[!colnames(df) %in% ("NA")]
# Substitute with the real column names that are in the full pattern, but are
# not in the subtable yet
missing <- setdiff(full_names, colnames(df))
df[missing] <- NA
# Remove the prefix (the pattern that asigned the information) from the cells
prefix.remover <- function(complex.string){
# Remove everything before the second ":"
sub("^..:.:", "", complex.string)
}
# Apply the prefix remover to columns 12 to end (the ones with prefix).
# However, the function's result is weird, if only one row is available,
# therefore the two different conditions
if(nrow(df) > 1){
df[12:ncol(df)] <- apply(df[12:ncol(df)], 2, prefix.remover)
} else {
df[1,12:ncol(df)] <- lapply(df[1,12:ncol(df)], prefix.remover)
}
return(df)
}
pattern.divided.table <- lapply(pattern.divided.table, single.table.adaptor)
# Merge the pattern divided tables into one table
output <- Reduce(function(...) merge(...,all=TRUE), pattern.divided.table)
## Reorder columns to standard sequence
col_order <- c(common.names, full_pattern)
output <- output[,col_order]
## Replace eventual "-" with NA
output[output == "-"] <- "NA"
## Print output table
return(output)
}
bam.converter.10x("banalyzer/data_raw/data/cellranger_big.txt")
Build an example data set
######################################################################
## Title : Example data set preparation
## Takes a raw tsv file, changes sensible data in it, transforms
## it back to tsv file and saves it in inst/extdata
##
## Author : Giacomo Schmidt Frattari
##
## Version : 0.0.1
##
## Date : 25-08-2023
######################################################################
##
## Prerequisites:#####################################################
##
## Loading required libraries:########################################
library(readr)
library(dplyr)
original.cellranger <- suppressMessages(suppressWarnings(
readr:: read_delim("banalyzer/inst/data_raw/datacellranger_big.txt",
delim = "\t", escape_double = FALSE,
col_names = FALSE, trim_ws = TRUE)))
colnames(original.cellranger) <- paste0("col_", c(1:ncol(original.cellranger)))
# Changing sensible data
# Gene alignment
original.cellranger$col_3 <- sample(rep(c("gene_a", "gene_b", "gene_c"), 50000), nrow(original.cellranger))
# Change column 7 to * and 8 and 9 to 0 to be sure
original.cellranger$col_7 <- "*"
original.cellranger$col_8 <- 0
original.cellranger$col_9 <- 0
# Generate a rondom sequence for column 10
nucl <- c("A","G","T","C")
original.cellranger$col_10 <- replicate(nrow(original.cellranger),
paste0(sample(nucl, 90, replace = TRUE),
collapse=""))
# Change column 16
original.cellranger$col_16 <- gsub("_bh_.._...:",
"_bh_test_test:",
original.cellranger$col_16)
original.cellranger$col_17 <- gsub("(TX:Z:[[:alpha:]]+),",
paste0("TX:Z:a_gene,"),
original.cellranger$col_17)
original.cellranger$col_18 <- gsub("(GX:Z:[[:alpha:]]+)",
paste0("GX:Z:a_gene"),
original.cellranger$col_18)
original.cellranger$col_18 <- gsub("(AN:Z:[[:alpha:]]+)",
paste0("AN:Z:a_gene"),
original.cellranger$col_18)
original.cellranger$col_19 <- gsub("(GN:Z:[[:alpha:]]+)",
paste0("GN:Z:a_gene"),
original.cellranger$col_19)
original.cellranger$col_20 <- gsub("(fx:Z:[[:alpha:]]+)",
paste0("fx:Z:a_gene"),
original.cellranger$col_20)
write_tsv(original.cellranger,
file = "inst/extdata/cellrangerdata.txt",
na = "",
col_names = F)
Run example
bam.converter.10x("banalyzer/inst/extdata/cellrangerdata.txt")
Visualize alignment with splice site
#' Alignment plotter - splice sites
#'
#' Plots alignments with gaps to visualize splice sites
#'
#' @param rbam.dataframe A data frame generated from a tsv bam file with `bam.converter`
#'
#' @return A ggplot with visualization of the CIGAR string
#' @export
#' @import ggplot2
#'
#' @examples alignment.plotter.splice(bam.converter.10x(system.file("extdata/cellrangerdata.txt", package = "banalyzer")))
alignment.plotter.splice <- function(rbam.dataframe){
splice.tab <- rbam.dataframe %>% select(QName, UB, CIGAR, Left_pos)
#Identify reads with gaps, and if so, which reads
splice.tab <- splice.tab %>%
mutate (gap.length= ifelse(grepl("N", CIGAR) == TRUE, gsub("(.+M)([[:digit:]]+)(N.+)", "\\2", CIGAR ), 0))
splice.tab$gap.length <- as.numeric(splice.tab$gap.length)
splice.tab <- splice.tab %>%
mutate (first.match = (stringr::str_extract(CIGAR,"[[:digit:]]+M")))
splice.tab <- splice.tab %>% mutate (l.first.match= sub("M", "", first.match))
splice.tab <- splice.tab %>% mutate (right_pos = Left_pos + as.numeric(l.first.match))
donor.tab <- splice.tab %>% filter(grepl("N", CIGAR) == T)
#Add column to define plot order based on length
donor.tab <- donor.tab %>% mutate(plot.pos = paste(l.first.match, QName, sep= "_"))
plot.order <- donor.tab %>% arrange(plot.pos) %>% pull(plot.pos)
donor.tab %>%
tidyr::pivot_longer(cols = c(Left_pos, right_pos), names_to = "place", values_to = "nt.pos") %>%
ggplot(aes(x= nt.pos, y= factor(plot.pos, levels=plot.order), group=plot.pos)) +
geom_point() +
geom_line() +
theme_classic() +
theme(axis.title.y = element_blank(),
axis.ticks.y = element_blank(),
axis.text.y = element_blank(),
axis.line.y = element_blank())
}
bam.converter.10x("banalyzer/inst/extdata/cellrangerdata.txt") %>%
alignment.plotter.splice()
![](data:image/png;base64,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)
Next version: zoomer function
bam.converter.10x("banalyzer/inst/extdata/cellrangerdata.txt") %>%
alignment.plotter.splice() + coord_cartesian(c(0,500))
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABUAAAAPACAMAAADDuCPrAAABDlBMVEUAAAAAADoAAGYAOjoAOmYAOpAAZrYzMzM6AAA6OgA6Ojo6OmY6OpA6ZmY6ZpA6ZrY6kJA6kLY6kNtNTU1NTW5NTY5Nbo5NbqtNjshmAABmOgBmOjpmkLZmkNtmtttmtv9uTU1ubm5ubo5ujqtujshuq+SOTU2Obk2Obm6Oq6uOq8iOq+SOyOSOyP+QOgCQZjqQZmaQttuQ2/+rbk2rbm6rjm6ryOSr5P+2ZgC2Zjq2kDq2kGa229u22/+2///Ijk3Ijm7IyKvI5P/I///bkDrbtmbbtpDb27bb2//b///kq27kyI7kyKvk////tmb/yI7/25D/27b/5Kv/5Mj/5OT//7b//8j//9v//+T///9UBxuyAAAACXBIWXMAAB2HAAAdhwGP5fFlAAAT2UlEQVR4nO3ca4MbZ3mAYQVCEnqA4nUObWnjlhx6IpTSUCgUp5CUxCQxSdrY+///SHXa9a53Y2tvyR7p1XV9seUVyzyzee+d0Yw0OwUgmU29AQCHSkABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCAaJCAzuam3oYNHdCmAk82xlqezQ4mSwe0qcBTDLGUZ7ODydIBbSrwNCOs5NnsYLJ0QJsKPNUIC3l2iKbeacD2RljIU7cwmXqnAdsbYSFP3cJk6p0GbG+EhXxAVTqgTQWeaoSF/PwPH3dg6p0GbG+EhTx1C5OpdxqwvREW8tQtTKbeacD2RljIU7cwmXqnAdsbYSFP3cJk6p0GbG+EhTx1C5OpdxqwvREW8tQtTKbeacD2RljIU7cwmXqnAdsbYSFP3cJk6p0GbG+EhTx1C5OpdxqwvREW8tQtTKbeacD2RljIU7cwmXqnAdsbYSFP3cJk6p0GbG+EhTx1C5OpdxqwvREW8gFV6YA2FXiqIRbyAUXpgDYVeJoxVvIBRemANhV4ikGW8gFF6YA2FXgyaxkgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgEFCASUIBIQAEiAQWIBBQgElCASEABIgEFiAQUIBJQgEhAASIBBYgE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)