Skip to content

Commit

Permalink
Add centWaveWithPresIsoROIs core API function
Browse files Browse the repository at this point in the history
o Add do_detectFeatures_centWaveWithPredIsoROIs function (issue #82, #35).
o Change the findPeaks.addPredictedIsotopeFeatures and findPeals.centWaveWith...
  to use the new do_ function.
o Unit test to compare original implementation with the new one.
  • Loading branch information
jorainer committed Dec 12, 2016
1 parent 3232b82 commit 515b814
Show file tree
Hide file tree
Showing 12 changed files with 847 additions and 390 deletions.
2 changes: 2 additions & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,8 @@ export(
"do_detectFeatures_massifquant",
"do_detectFeatures_matchedFilter",
"do_detectFeatures_MSW",
"do_detectFeatures_centWaveWithPredIsoROIs",
"do_detectFeatures_addPredIsoROIs",
"imputeLinInterpol",
"useOriginalCode"
)
Expand Down
520 changes: 293 additions & 227 deletions R/do_detectFeatures-functions.R

Large diffs are not rendered by default.

184 changes: 151 additions & 33 deletions R/methods-xcmsRaw.R
Original file line number Diff line number Diff line change
Expand Up @@ -927,36 +927,94 @@ setMethod("findPeaks.centWaveWithPredictedIsotopeROIs", "xcmsRaw",
ROI.list = list(), firstBaselineCheck = TRUE,
roiScales = NULL, snthreshIsoROIs = 6.25, maxcharge = 3,
maxiso = 5, mzIntervalExtension = TRUE) {
## perform tradictional peak picking
xcmsPeaks <- findPeaks.centWave(
object = object, ppm = ppm, peakwidth = peakwidth,
snthresh = snthresh, prefilter = prefilter,
mzCenterFun = mzCenterFun, integrate = integrate,
mzdiff = mzdiff, fitgauss = fitgauss, scanrange = scanrange,
noise = noise, sleep = sleep, verbose.columns = TRUE,
ROI.list = ROI.list, firstBaselineCheck = firstBaselineCheck,
roiScales = roiScales)

return(
findPeaks.addPredictedIsotopeFeatures(object = object,
ppm = ppm,
peakwidth = peakwidth,
prefilter = prefilter,
mzCenterFun = mzCenterFun,
integrate = integrate,
mzdiff = mzdiff,
fitgauss = fitgauss,
scanrange = scanrange,
noise = noise,
sleep = sleep,
verbose.columns = verbose.columns,
xcmsPeaks = xcmsPeaks,
snthresh = snthreshIsoROIs,
maxcharge = maxcharge,
maxiso = maxiso,
mzIntervalExtension = mzIntervalExtension
))
if (!isCentroided(object))
warning("It looks like this file is in profile mode. centWave",
" can process only centroid mode data !\n")

## Sub-set the xcmsRaw based on scanrange
if (length(scanrange) < 2) {
scanrange <- c(1, length(object@scantime))
} else {
scanrange <- range(scanrange)
}
if (min(scanrange) < 1 | max(scanrange) > length(object@scantime)) {
scanrange[1] <- max(1, scanrange[1])
scanrange[2] <- min(length(object@scantime), scanrange[2])
message("Provided scanrange was adjusted to ", scanrange)
}
object <- object[scanrange[1]:scanrange[2]]

vps <- diff(c(object@scanindex, length(object@env$mz)))
res <- do_detectFeatures_centWaveWithPredIsoROIs(mz = object@env$mz,
int = object@env$intensity,
scantime = object@scantime,
valsPerSpect = vps,
ppm = ppm,
peakwidth = peakwidth,
snthresh = snthresh,
prefilter = prefilter,
mzCenterFun = mzCenterFun,
integrate = integrate,
mzdiff = mzdiff,
fitgauss = fitgauss,
noise = noise,
verboseColumns = verbose.columns,
roiList = ROI.list,
firstBaselineCheck = firstBaselineCheck,
roiScales = roiScales,
snthreshIsoROIs = snthreshIsoROIs,
maxCharge = maxcharge,
maxIso = maxiso,
mzIntervalExtension = mzIntervalExtension
)
invisible(new("xcmsPeaks", res))
})
## Original code: TODO REMOVE ME once method is validated.
.centWaveWithPredictedIsotopeROIs <- function(object, ppm = 25,
peakwidth = c(20,50), snthresh = 10,
prefilter = c(3,100),
mzCenterFun = "wMean", integrate = 1,
mzdiff = -0.001, fitgauss = FALSE,
scanrange = numeric(),
noise = 0, sleep = 0,
verbose.columns = FALSE,
ROI.list = list(),
firstBaselineCheck = TRUE,
roiScales = NULL,
snthreshIsoROIs = 6.25,
maxcharge = 3,
maxiso = 5,
mzIntervalExtension = TRUE) {
## perform tradictional peak picking
xcmsPeaks <- findPeaks.centWave(
object = object, ppm = ppm, peakwidth = peakwidth,
snthresh = snthresh, prefilter = prefilter,
mzCenterFun = mzCenterFun, integrate = integrate,
mzdiff = mzdiff, fitgauss = fitgauss, scanrange = scanrange,
noise = noise, sleep = sleep, verbose.columns = TRUE,
ROI.list = ROI.list, firstBaselineCheck = firstBaselineCheck,
roiScales = roiScales)

return(
.addPredictedIsotopeFeatures(object = object,
ppm = ppm,
peakwidth = peakwidth,
prefilter = prefilter,
mzCenterFun = mzCenterFun,
integrate = integrate,
mzdiff = mzdiff,
fitgauss = fitgauss,
scanrange = scanrange,
noise = noise,
sleep = sleep,
verbose.columns = verbose.columns,
xcmsPeaks = xcmsPeaks,
snthresh = snthreshIsoROIs,
maxcharge = maxcharge,
maxiso = maxiso,
mzIntervalExtension = mzIntervalExtension
))
}

setMethod("findPeaks.addPredictedIsotopeFeatures",
"xcmsRaw", function(object, ppm = 25, peakwidth = c(20,50),
Expand All @@ -966,6 +1024,56 @@ setMethod("findPeaks.addPredictedIsotopeFeatures",
sleep = 0, verbose.columns = FALSE,
xcmsPeaks, snthresh = 6.25, maxcharge = 3,
maxiso = 5, mzIntervalExtension = TRUE) {
if (!isCentroided(object))
warning("It looks like this file is in profile mode. centWave",
" can process only centroid mode data !\n")

## Sub-set the xcmsRaw based on scanrange
if (length(scanrange) < 2) {
scanrange <- c(1, length(object@scantime))
} else {
scanrange <- range(scanrange)
}
if (min(scanrange) < 1 | max(scanrange) > length(object@scantime)) {
scanrange[1] <- max(1, scanrange[1])
scanrange[2] <- min(length(object@scantime), scanrange[2])
message("Provided scanrange was adjusted to ", scanrange)
}
object <- object[scanrange[1]:scanrange[2]]
if(class(xcmsPeaks) != "xcmsPeaks")
stop("Pparameter >xcmsPeaks< is not of class 'xcmsPeaks'!\n")

vps <- diff(c(object@scanindex, length(object@env$mz)))
res <- do_detectFeatures_addPredIsoROIs(mz = object@env$mz,
int = object@env$intensity,
scantime = object@scantime,
valsPerSpect = vps,
ppm = ppm,
peakwidth = peakwidth,
snthresh = snthresh,
prefilter = prefilter,
mzCenterFun = mzCenterFun,
integrate = integrate,
mzdiff = mzdiff,
fitgauss = fitgauss,
noise = noise,
verboseColumns = verbose.columns,
features. = xcmsPeaks@.Data,
maxCharge = maxcharge,
maxIso = maxiso,
mzIntervalExtension = mzIntervalExtension
)
invisible(new("xcmsPeaks", res))
})
## Original code: TODO REMOVE ME once method is validated.
.addPredictedIsotopeFeatures <-
function(object, ppm = 25, peakwidth = c(20,50),
prefilter = c(3,100), mzCenterFun = "wMean",
integrate = 1, mzdiff = -0.001, fitgauss = FALSE,
scanrange = numeric(), noise=0, ## noise.local=TRUE,
sleep = 0, verbose.columns = FALSE,
xcmsPeaks, snthresh = 6.25, maxcharge = 3,
maxiso = 5, mzIntervalExtension = TRUE) {
if(nrow(xcmsPeaks) == 0){
warning("Warning: There are no features (parameter >xcmsPeaks<) for the prediction of isotope ROIs !\n")
return(xcmsPeaks)
Expand All @@ -982,6 +1090,8 @@ setMethod("findPeaks.addPredictedIsotopeFeatures",
if(length(newROI.list) == 0)
return(xcmsPeaks)

## HOOK_1
## return(newROI.list)
##############################################################################
## perform peak picking for predicted ROIs
roiScales <- unlist(lapply(X = newROI.list, FUN = function(x){x$scale}))
Expand All @@ -992,6 +1102,8 @@ setMethod("findPeaks.addPredictedIsotopeFeatures",
sleep=sleep, verbose.columns=verbose.columns, ROI.list=newROI.list, firstBaselineCheck=FALSE, roiScales=roiScales
)

## HOOK_2
## return(xcmsPeaks2)
if(nrow(xcmsPeaks2) > 0){
## remove NaN values
rowsWithNaN <- which(apply(X = xcmsPeaks2[, c("mz", "mzmin", "mzmax", "rt", "rtmin", "rtmax")], MARGIN = 1, FUN = function(x){any(is.na(x))}))
Expand All @@ -1003,6 +1115,9 @@ setMethod("findPeaks.addPredictedIsotopeFeatures",
xcmsPeaks2 <- xcmsPeaks2[-noArea, ]
}

## HOOK_3
## return(xcmsPeaks2) ## Compare these results

## make present peaks and new peaks distinct by removing overlapping peaks
if(nrow(xcmsPeaks2) > 0){
## remove ROIs which are already there
Expand Down Expand Up @@ -1047,8 +1162,8 @@ setMethod("findPeaks.addPredictedIsotopeFeatures",
return(FALSE)
}

## TODO FIXXXX, isOverlap is not defined!!! what should be returned here?
return(isOverlap)
## Will never reach the condition below.
## return(isOverlap)
})

removeROI <- unlist(lapply(X = drop, FUN = function(x){
Expand Down Expand Up @@ -1077,9 +1192,10 @@ setMethod("findPeaks.addPredictedIsotopeFeatures",

xcmsPeaks <- rbind(xcmsPeaks, xcmsPeaks2)

return(xcmsPeaks)
})
invisible(new("xcmsPeaks", xcmsPeaks))
}

## Original code: TODO REMOVE ME once method is validated.
removeROIsOutOfRange <- function(object, roi.matrix){
## c("mz", "mzmin", "mzmax", "scmin", "scmax", "length", "intensity")
numberOfROIs <- nrow(roi.matrix)
Expand All @@ -1101,6 +1217,7 @@ removeROIsOutOfRange <- function(object, roi.matrix){

return(roi.matrix)
}
## Original code: TODO REMOVE ME once method is validated.
removeROIsWithoutSignal <- function(object, roi.matrix, intensityThreshold){
## c("mz", "mzmin", "mzmax", "scmin", "scmax", "length", "intensity")
numberOfROIs <- nrow(roi.matrix)
Expand All @@ -1119,6 +1236,7 @@ removeROIsWithoutSignal <- function(object, roi.matrix, intensityThreshold){
return(roi.matrix)
}

## Original code: TODO REMOVE ME once method is validated.
createAdditionalROIs <- function(object, ROI.list, ppm, addNewIsotopeROIs, maxcharge, maxiso, mzIntervalExtension, addNewAdductROIs, polarity){
###############################################################################################
## isotope ROIs
Expand Down
4 changes: 1 addition & 3 deletions inst/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,9 @@ NEW FEATURES:
bins.
+ New vignette "new_functionality.Rmd" describing new and modified functionality
in xcms.
+ New vignette "benchmarking.Rmd" providing some benchmarking results.
+ Add do_detectFeatures_matchedFilter function.
+ Add do_detectFeatures_centWave function.
+ Add useOriginalCode function to enable switching between old and new code
for findPeaks.matchedFilter (see issue #52).
+ Add do_detectFeatures_centWaveWithPredIsoROIs function and unit test.
+ Implement a new data import function.
+ Add do_detectFeatures_MSW function and unit test.
+ Argument stopOnError in xcmsSet function that allows to perform feature
Expand Down

0 comments on commit 515b814

Please sign in to comment.