10
10
# ' @param bamcoverage.path The path to \code{bamCoverage}, used when \code{format} is bam. Default: NULL (auto-detect).
11
11
# ' @param norm.method Methods to normalize the number of reads per bin, chosen from "RPKM", "CPM", "BPM", "RPGC", "None".
12
12
# ' Default: RPKM.
13
+ # ' @param single.nuc Logical value, whether to visualize at single nucleotide level. Default: FALSE.
14
+ # ' @param single.nuc.region Region for \code{single.nuc}. Default: NULL
13
15
# ' @param bin.size Size of the bins, in bases. Default: 50.
14
16
# ' @param bc.extra.para Extra parameters for \code{bamCoverage}, eg: "--effectiveGenomeSize 2700000000 --ignoreForNormalization chrX"
15
17
# '
16
18
# ' @return A dataframe.
17
19
# ' @importFrom rtracklayer import
18
20
# ' @importFrom Rsamtools indexBam
19
21
# ' @importFrom utils read.csv
22
+ # ' @importFrom GenomicAlignments alphabetFrequencyFromBam
23
+ # ' @importFrom magrittr %>%
24
+ # ' @importFrom dplyr select
20
25
# ' @export
21
26
# '
22
27
# ' @examples
35
40
# ' )
36
41
LoadTrackFile <- function (track.file , track.folder = NULL , format = c(" bam" , " wig" , " bw" , " bedgraph" ), meta.info = NULL , meta.file = " " ,
37
42
bamcoverage.path = NULL , norm.method = c(" RPKM" , " CPM" , " BPM" , " RPGC" , " None" ),
38
- bin.size = 10 , bc.extra.para = NULL ) {
43
+ single.nuc = FALSE , single.nuc.region = NULL , bin.size = 10 , bc.extra.para = NULL ) {
39
44
# check parameters
40
45
format <- match.arg(arg = format )
41
46
norm.method <- match.arg(arg = norm.method )
42
47
43
48
# prepare track files
44
49
if (! is.null(track.folder )) {
45
- track.file <- list.files(path = track.folder , full.names = TRUE , pattern = format )
50
+ track.file <- list.files(path = track.folder , full.names = TRUE , pattern = paste0( format , " $ " ) )
46
51
}
47
52
48
53
# get track dataframe
49
54
if (format %in% c(" wig" , " bw" , " bedgraph" )) {
50
- # read track file
51
- track.list <- lapply(track.file , function (x ) {
52
- # get basename
53
- track.file.base <- basename(x )
54
- # import wig, bigwig and bedgraph file
55
- single.track.df <- as.data.frame(rtracklayer :: import(x ))
56
- single.track.df $ TrackFile <- track.file.base
57
- return (single.track.df )
58
- })
59
- } else if (format == " bam" ) {
60
- # require deeptools
61
- if (is.null(bamcoverage.path )) {
62
- bamcoverage.path <- Sys.which(" bamCoverage" )
63
- if (bamcoverage.path == " " ) {
64
- stop(" Can not find bamCoverage automatically, please specify the path!" )
65
- }
55
+ if (single.nuc ) {
56
+ stop(" To visualize single nucleotide, please use bam file!" )
66
57
} else {
67
- bamcoverage.path <- bamcoverage.path
58
+ # read track file
59
+ track.list <- lapply(track.file , function (x ) {
60
+ # get basename
61
+ track.file.base <- basename(x )
62
+ # import wig, bigwig and bedgraph file
63
+ single.track.df <- as.data.frame(rtracklayer :: import(x ))
64
+ single.track.df $ TrackFile <- track.file.base
65
+ return (single.track.df )
66
+ })
68
67
}
68
+ } else if (format == " bam" ) {
69
69
# create index
70
70
for (bam in track.file ) {
71
71
bam.index.file <- paste(bam , " bai" , sep = " ." )
@@ -74,29 +74,70 @@ LoadTrackFile <- function(track.file, track.folder = NULL, format = c("bam", "wi
74
74
Rsamtools :: indexBam(bam )
75
75
}
76
76
}
77
- # read track file
78
- track.list <- lapply(track.file , function (x ) {
79
- # get basename
80
- track.file.base <- basename(x )
81
- # bigwig file
82
- out.bw.file <- tempfile(fileext = c(" .bw" ))
83
- # prepare bamCoverage cmd
84
- bamcoverage.cmd <- paste(
85
- bamcoverage.path , " -b" , x , " -o" , out.bw.file ,
86
- " --binSize" , bin.size , " --normalizeUsing" , norm.method , bc.extra.para
87
- )
88
- # run command
89
- message(paste(" Calling bamCoverage: " , bamcoverage.cmd ))
90
- bamcoverage.status <- system(bamcoverage.cmd , intern = TRUE )
91
- bamcoverage.status.code <- attr(bamcoverage.status , " status" )
92
- if (! is.null(bamcoverage.status.code )) {
93
- stop(" Run bamCoverage error!" )
77
+ if (single.nuc ) {
78
+ if (! is.null(single.nuc.region )) {
79
+ single.nuc.region <- gsub(pattern = " ," , replacement = " " , x = single.nuc.region )
80
+ single.nuc.region.chr <- unlist(strsplit(x = single.nuc.region , split = " :" ))[1 ]
81
+ single.nuc.region.se <- unlist(strsplit(x = single.nuc.region , split = " :" ))[2 ]
82
+ single.nuc.region.start <- unlist(strsplit(x = single.nuc.region.se , split = " -" ))[1 ]
83
+ single.nuc.region.end <- unlist(strsplit(x = single.nuc.region.se , split = " -" ))[2 ]
84
+ track.list <- lapply(track.file , function (x ) {
85
+ single.track.df <- GenomicAlignments :: alphabetFrequencyFromBam(x , param = single.nuc.region , baseOnly = TRUE ) %> % as.data.frame()
86
+ single.track.df <- single.track.df [, c(" A" , " G" , " C" , " T" )]
87
+ single.track.df $ score <- rowSums(single.track.df )
88
+ single.track.df $ seqnames <- single.nuc.region.chr
89
+ single.track.df $ start <- single.nuc.region.start : single.nuc.region.end
90
+ single.track.df $ end <- single.track.df $ start + 1
91
+ single.track.df $ width <- 1
92
+ single.track.df $ strand <- " *"
93
+ single.track.df <- single.track.df %> % dplyr :: select(- c(" A" , " G" , " C" , " T" ))
94
+ # get basename
95
+ track.file.base <- basename(x )
96
+ single.track.df $ TrackFile <- track.file.base
97
+ single.track.df <- single.track.df [c(
98
+ " seqnames" , " start" , " end" , " width" ,
99
+ " strand" , " score" , " TrackFile"
100
+ )]
101
+ return (single.track.df )
102
+ })
103
+ } else {
104
+ stop(" Please provide region for visualizing single nucleotide!" )
94
105
}
95
- # import wig, bigwig and bedgraph file
96
- single.track.df <- as.data.frame(rtracklayer :: import(out.bw.file ))
97
- single.track.df $ TrackFile <- track.file.base
98
- return (single.track.df )
99
- })
106
+ } else {
107
+ # require deeptools
108
+ if (is.null(bamcoverage.path )) {
109
+ bamcoverage.path <- Sys.which(" bamCoverage" )
110
+ if (bamcoverage.path == " " ) {
111
+ stop(" Can not find bamCoverage automatically, please specify the path!" )
112
+ }
113
+ } else {
114
+ bamcoverage.path <- bamcoverage.path
115
+ }
116
+
117
+ # read track file
118
+ track.list <- lapply(track.file , function (x ) {
119
+ # get basename
120
+ track.file.base <- basename(x )
121
+ # bigwig file
122
+ out.bw.file <- tempfile(fileext = c(" .bw" ))
123
+ # prepare bamCoverage cmd
124
+ bamcoverage.cmd <- paste(
125
+ bamcoverage.path , " -b" , x , " -o" , out.bw.file ,
126
+ " --binSize" , bin.size , " --normalizeUsing" , norm.method , bc.extra.para
127
+ )
128
+ # run command
129
+ message(paste(" Calling bamCoverage: " , bamcoverage.cmd ))
130
+ bamcoverage.status <- system(bamcoverage.cmd , intern = TRUE )
131
+ bamcoverage.status.code <- attr(bamcoverage.status , " status" )
132
+ if (! is.null(bamcoverage.status.code )) {
133
+ stop(" Run bamCoverage error!" )
134
+ }
135
+ # import wig, bigwig and bedgraph file
136
+ single.track.df <- as.data.frame(rtracklayer :: import(out.bw.file ))
137
+ single.track.df $ TrackFile <- track.file.base
138
+ return (single.track.df )
139
+ })
140
+ }
100
141
}
101
142
# get track dataframe
102
143
track.df <- do.call(rbind , track.list )
0 commit comments