Mercurial > repos > prog > lcmsmatching
comparison MsPeakForestDb.R @ 0:e66bb061af06 draft
planemo upload for repository https://github.com/workflow4metabolomics/lcmsmatching.git commit 3529b25417f8e1a5836474c9adec4b696d35099d-dirty
author | prog |
---|---|
date | Tue, 12 Jul 2016 12:02:37 -0400 |
parents | |
children | 253d531a0193 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:e66bb061af06 |
---|---|
1 if ( ! exists('MsPeakForestDb')) { # Do not load again if already loaded | |
2 | |
3 library(methods) | |
4 source('MsDb.R') | |
5 source(file.path('UrlRequestScheduler.R')) | |
6 | |
7 ##################### | |
8 # CLASS DECLARATION # | |
9 ##################### | |
10 | |
11 MsPeakForestDb <- setRefClass("MsPeakForestDb", contains = "MsDb", fields = list(.url = "character", .url.scheduler = "ANY")) | |
12 | |
13 ############### | |
14 # CONSTRUCTOR # | |
15 ############### | |
16 | |
17 MsPeakForestDb$methods( initialize = function(url = NA_character_, useragent = NA_character_, ...) { | |
18 | |
19 # Check URL | |
20 if (is.null(url) || is.na(url)) | |
21 stop("No URL defined for new MsPeakForestDb instance.") | |
22 | |
23 .url <<- url | |
24 .url.scheduler <<- UrlRequestScheduler$new(n = 3, useragent = useragent) | |
25 .self$.url.scheduler$setVerbose(1L) | |
26 | |
27 callSuper(...) | |
28 }) | |
29 | |
30 ########### | |
31 # GET URL # | |
32 ########### | |
33 | |
34 MsPeakForestDb$methods( .get.url = function(url, params = NULL, ret.type = 'json') { | |
35 | |
36 res <- NULL | |
37 | |
38 content <- .self$.url.scheduler$getUrl(url = url, params = params) | |
39 | |
40 if (ret.type == 'json') { | |
41 | |
42 library(RJSONIO) | |
43 | |
44 res <- fromJSON(content, nullValue = NA) | |
45 | |
46 if (class(res) == 'list' && 'success' %in% names(res) && res$success == FALSE) { | |
47 param.str <- if (is.null(params)) '' else paste('?', vapply(names(params), function(p) paste(p, params[[p]], sep = '='), FUN.VALUE = ''), collapse = '&', sep = '') | |
48 stop(paste0("Failed to run web service. URL was \"", url, param.str, "\".")) | |
49 } | |
50 } else { | |
51 if (ret.type == 'integer') { | |
52 if (grepl('^[0-9]+$', content, perl = TRUE)) | |
53 res <- as.integer(content) | |
54 else { | |
55 library(RJSONIO) | |
56 res <- fromJSON(content, nullValue = NA) | |
57 } | |
58 } | |
59 } | |
60 | |
61 return(res) | |
62 }) | |
63 | |
64 #################### | |
65 # GET MOLECULE IDS # | |
66 #################### | |
67 | |
68 MsPeakForestDb$methods( getMoleculeIds = function() { | |
69 | |
70 ids <- as.character(.self$.get.url(url = paste0(.self$.url, 'compounds/all/ids'))) | |
71 | |
72 return(ids) | |
73 }) | |
74 | |
75 #################### | |
76 # GET NB MOLECULES # | |
77 #################### | |
78 | |
79 MsPeakForestDb$methods( getNbMolecules = function() { | |
80 | |
81 n <- .self$.get.url(url = paste0(.self$.url, 'compounds/all/count'), ret.type = 'integer') | |
82 | |
83 return(n) | |
84 }) | |
85 | |
86 ############################### | |
87 # GET CHROMATOGRAPHIC COLUMNS # | |
88 ############################### | |
89 | |
90 MsPeakForestDb$methods( getChromCol = function(molid = NULL) { | |
91 | |
92 # Set URL | |
93 url <- paste0(.self$.url, 'metadata/lc/list-code-columns') | |
94 params <- NULL | |
95 if ( ! is.null(molid)) | |
96 params <- list(molids = paste(molid, collapse = ',')) | |
97 | |
98 # Call webservice | |
99 wscols <- .self$.get.url(url = url, params = params) | |
100 | |
101 # Build data frame | |
102 cols <- data.frame(id = character(), title = character()) | |
103 for(id in names(wscols)) | |
104 cols <- rbind(cols, data.frame(id = id, title = wscols[[id]]$name, stringsAsFactors = FALSE)) | |
105 | |
106 return(cols) | |
107 }) | |
108 | |
109 ####################### | |
110 # GET RETENTION TIMES # | |
111 ####################### | |
112 | |
113 MsPeakForestDb$methods( getRetentionTimes = function(molid, col = NA_character_) { | |
114 | |
115 if (is.null(molid) || is.na(molid) || length(molid) != 1) | |
116 stop("The parameter molid must consist only in a single value.") | |
117 | |
118 rt <- list() | |
119 | |
120 # Set URL | |
121 url <- paste0(.self$.url, 'spectra/lcms/search') | |
122 params <- NULL | |
123 if ( ! is.null(molid)) | |
124 params <- list(molids = paste(molid, collapse = ',')) | |
125 | |
126 # Call webservice | |
127 spectra <- .self$.get.url(url = url, params = params) | |
128 if (class(spectra) == 'list' && length(spectra) > 0) { | |
129 for (s in spectra) | |
130 if (is.na(col) || s$liquidChromatography$columnCode %in% col) { | |
131 ret.time <- (s$RTmin + s$RTmax) / 2 | |
132 c <- s$liquidChromatography$columnCode | |
133 if (c %in% names(rt)) { | |
134 if ( ! ret.time %in% rt[[c]]) | |
135 rt[[c]] <- c(rt[[c]], ret.time) | |
136 } else | |
137 rt[[c]] <- ret.time | |
138 } | |
139 } | |
140 | |
141 return(rt) | |
142 }) | |
143 | |
144 ##################### | |
145 # GET MOLECULE NAME # | |
146 ##################### | |
147 | |
148 MsPeakForestDb$methods( getMoleculeName = function(molid) { | |
149 | |
150 library(RJSONIO) | |
151 | |
152 if (is.null(molid)) | |
153 return(NA_character_) | |
154 | |
155 # Initialize names | |
156 names <- as.character(molid) | |
157 | |
158 # Get non NA values | |
159 non.na.molid <- molid[ ! is.na(molid)] | |
160 | |
161 if (length(non.na.molid) > 0) { | |
162 # Set URL | |
163 url <- paste0(.self$.url, 'compounds/all/names') | |
164 params <- c(molids = paste(non.na.molid, collapse = ',')) | |
165 | |
166 # Call webservice | |
167 names[ ! is.na(molid)] <- .self$.get.url(url = url, params = params) | |
168 } | |
169 | |
170 return(names) | |
171 }) | |
172 | |
173 ################ | |
174 # FIND BY NAME # | |
175 ################ | |
176 | |
177 MsPeakForestDb$methods( findByName = function(name) { | |
178 | |
179 if (is.null(name)) | |
180 return(NA_character_) | |
181 | |
182 ids <- list() | |
183 | |
184 for (n in name) { | |
185 | |
186 if (is.na(n)) | |
187 ids <- c(ids, NA_character_) | |
188 | |
189 else { | |
190 url <- paste0(.self$.url, 'search/compounds/name/', curlEscape(n)) | |
191 compounds <- .self$.get.url(url = url)$compoundNames | |
192 ids <- c(ids, list(vapply(compounds, function(c) as.character(c$compound$id), FUN.VALUE = ''))) | |
193 } | |
194 } | |
195 | |
196 return(ids) | |
197 }) | |
198 | |
199 ################# | |
200 # GET NB PEAKS # | |
201 ################# | |
202 | |
203 MsPeakForestDb$methods( getNbPeaks = function(molid = NA_integer_, type = NA_character_) { | |
204 | |
205 # Build URL | |
206 url <- paste0(.self$.url, 'spectra/lcms/count-peaks') | |
207 params <- NULL | |
208 if ( ! is.na(type)) | |
209 params <- c(params, mode = if (type == MSDB.TAG.POS) 'pos' else 'neg') | |
210 if ( ! is.null(molid) && (length(molid) > 1 || ! is.na(molid))) | |
211 params <- c(params, molids = paste(molid, collapse = ',')) | |
212 | |
213 # Run request | |
214 n <- .self$.get.url(url = url, params = params, ret.type = 'integer') | |
215 | |
216 return(sum(n)) | |
217 }) | |
218 | |
219 ################# | |
220 # GET MZ VALUES # | |
221 ################# | |
222 | |
223 MsPeakForestDb$methods( getMzValues = function(mode = NULL) { | |
224 | |
225 # Build URL | |
226 url <- paste0(.self$.url, 'spectra/lcms/peaks/list-mz') | |
227 | |
228 # Query params | |
229 params <- NULL | |
230 if ( ! is.null(mode)) | |
231 params <- c(params, mode = if (mode == MSDB.TAG.POS) 'positive' else 'negative') | |
232 | |
233 # Get MZ valuels | |
234 mz <- .self$.get.url(url = url, params = params) | |
235 | |
236 return(mz) | |
237 }) | |
238 | |
239 ############################## | |
240 # DO SEARCH FOR MZ RT BOUNDS # | |
241 ############################## | |
242 | |
243 MsPeakForestDb$methods( .do.search.for.mz.rt.bounds = function(mode, mz.low, mz.high, rt.low = NULL, rt.high = NULL, col = NULL, attribs = NULL, molids = NULL) { | |
244 | |
245 # Build URL for mz search | |
246 url <- paste0(.self$.url, 'spectra/lcms/peaks/get-range/', mz.low, '/', mz.high) | |
247 | |
248 # Get spectra | |
249 spectra <- .self$.get.url(url = url) | |
250 | |
251 # Build result data frame | |
252 results <- data.frame(MSDB.TAG.MOLID = character(), MSDB.TAG.MOLNAMES = character(), MSDB.TAG.MZTHEO = numeric(), MSDB.TAG.COMP = character(), MSDB.TAG.ATTR = character()) | |
253 for (x in spectra) | |
254 results <- rbind(results, data.frame(MSDB.TAG.MOLID = vapply(x$source$listOfCompounds, function(c) as.character(c$id), FUN.VALUE = ''), | |
255 MSDB.TAG.MOLNAMES = vapply(x$source$listOfCompounds, function(c) paste(c$names, collapse = MSDB.MULTIVAL.FIELD.SEP), FUN.VALUE = ''), | |
256 MSDB.TAG.MZTHEO = as.numeric(x$theoricalMass), | |
257 MSDB.TAG.COMP = as.character(x$composition), | |
258 MSDB.TAG.ATTR = as.character(x$attribution), | |
259 stringsAsFactors = FALSE)) | |
260 | |
261 # RT search | |
262 if ( ! is.null(rt.low) && ! is.null(rt.high)) { | |
263 | |
264 rt.res <- data.frame(MSDB.TAG.MOLID = character(), MSDB.TAG.COL = character(), MSDB.TAG.COLRT = numeric()) | |
265 | |
266 if (nrow(results) > 0) { | |
267 # Build URL for rt search | |
268 url <- paste0(.self$.url, 'spectra/lcms/range-rt-min/', rt.low, '/', rt.high) | |
269 params <- NULL | |
270 if ( ! is.null(col)) | |
271 params <- c(columns = paste(col, collapse = ',')) | |
272 | |
273 # Run query | |
274 rtspectra <- .self$.get.url(url = url, params = params) | |
275 | |
276 # Get compound/molecule IDs | |
277 for (x in spectra) | |
278 rt.res <- rbind(rt.res, data.frame(MSDB.TAG.MOLID = vapply(x$listOfCompounds, function(c) as.character(c$id), FUN.VALUE = ''), | |
279 MSDB.TAG.COL = as.character(x$liquidChromatography$columnCode), | |
280 MSDB.TAG.COLRT = (as.numeric(x$RTmin) + as.numeric(x$RTmax)) / 2, | |
281 stringsAsFactors = FALSE)) | |
282 } | |
283 | |
284 # Add retention times and column info | |
285 results <- merge(results, rt.res) | |
286 } | |
287 | |
288 # Rename columns with proper names | |
289 colnames(results) <- vapply(colnames(results), function(s) eval(parse(text=s)), FUN.VALUE = '') | |
290 | |
291 return(results) | |
292 }) | |
293 } |