-
Notifications
You must be signed in to change notification settings - Fork 2
/
filterTrack.R
executable file
·131 lines (100 loc) · 3.52 KB
/
filterTrack.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
## filterTrack-methods
##' @name filterTrack
##' @aliases filterTrack trimTrack trackLength
##' @title filterTrack
##' @rdname filterTrack-methods
##' @docType methods
##'
##' @description methods for filter and trim tracks based on track length.
##' @usage
##' filterTrack(trackll,filter=c(min=7,max=Inf))
##' trimTrack(trackll,trimmer=c(min=1,max=32))
##' trackLength(trackll)
##' @param trackll a list of track lists.
##' @param filter range of possible track lengths to keep
##' @param trimmer range of track lengths allowed in output, otherwise trimmed.
##' @return
##' \itemize{
##' \item{trackll} filtered or trimmed tracks.
##' \item{len} list of track lengths.
##' }
##' @details filterTrack() is used to filter out tracks that has length within
##' a specified range (default 7~Inf). On the other hand, despite the lengths
##' of tracks, trimTrack() is used to trim /cutoff all tracks to a specified
##' range (default 1~32).
##'
##'
##' @examples
##' folder=system.file('extdata','SWR1',package='sojourner')
##' trackll=createTrackll(folder=folder, input=3)
##'
##' trackll.filter=filterTrack(trackll,filter=c(7,Inf))
##' trackll.trim=trimTrack(trackll,trimmer=c(1,20))
##'
##' # see the min and max length of the trackll
##' # trackLength() is a helper function output track length of trackll
##' lapply(trackLength(trackll),min)
##' lapply(trackLength(trackll.filter),min)
##'
##' lapply(trackLength(trackll),max)
##' lapply(trackLength(trackll.trim),max)
##'
##-----------------------------------------------------------------------------
## filterTrack
## a function to filter trackll based on specified fitler value
## (filterTrack on track length), default 6 frames/steps to Inf
##' @export filterTrack
filterTrack = function(trackll, filter = c(min = 7, max = Inf)) {
# filter=match.arg(filter)
# reinforce name
names(filter) = c("min", "max")
cat("applying filter, min", filter["min"], " max", filter["max"],
"\n")
track.len = list()
for (i in seq_along(trackll)) {
track.len[[i]] = vapply(trackll[[i]], function(track) {
dim(track)[1]
}, integer(1))
trackll[[i]] = trackll[[i]][track.len[[i]] >=
filter["min"] & track.len[[i]] < filter["max"]]
}
return(trackll)
}
# no need for the focus swtich, as one can simply filter on a number
# that is bigger than the dt he wanted to draw on
##-----------------------------------------------------------------------------
## trim long tracks into shorter ones
.trimTrack = function(track, min = 1, max = 32) {
t = track[min:max, ]
cc.t = complete.cases(t)
t = t[cc.t, ]
return(t)
}
##' @export trimTrack
trimTrack = function(trackll, trimmer = c(min = 1, max = 32)) {
# reinforce name
names(trimmer) = c("min", "max")
cat("applying trimmer, min", trimmer["min"], " max", trimmer["max"],
"\n")
trackll.trim = list()
length(trackll.trim) = length(trackll)
names(trackll.trim) = names(trackll)
for (i in seq_along(trackll)) {
trackll.trim[[i]] = lapply(trackll[[i]],
.trimTrack, min = trimmer["min"], max = trimmer["max"])
}
return(trackll.trim)
}
# max(sapply(x[[1]],dim))
##' @export trackLength
trackLength = function(trackll) {
len = list()
length(len) = length(trackll)
names(len) = names(trackll)
for (i in seq_along(trackll)) {
len[[i]] = vapply(trackll[[i]], function(track) {
dim(track)[1]
}, integer(1))
}
return(len)
}