From 804bc93d7443c1ecff5dd8ad683c2cea8eb29fa2 Mon Sep 17 00:00:00 2001 From: Steffen Neumann Date: Sun, 28 May 2017 16:54:42 +0000 Subject: [PATCH] Squashed commit of the following: commit 4dfbc01c1ec656fed8e0d3a4e262193f1061ebb3 Author: jotsetung Date: Fri May 26 11:52:55 2017 +0200 Fix issue #180 commit 8dfccd382b73c3f772b4a80b7d2fbe38b57c0a96 Author: jotsetung Date: Fri May 26 08:56:17 2017 +0200 Update NEWS. commit d290cbeb8d57a69305f7f7315135fa26f6eb80b5 Merge: 56c43dd d2d4b7a Author: jotsetung Date: Thu May 25 17:17:59 2017 +0200 Merge branch 'devel' into xcms3 commit d2d4b7a2a18a9a1620eaa52e94dc81edb2c939e9 Merge: f11aac4 d9baa6c Author: Johannes Rainer Date: Thu May 25 16:31:59 2017 +0200 Merge pull request #178 from stanstrup/patch-4 scanrange was collapsed when the adjusted range was reported. commit d9baa6ca364f4dd197a9eedd361869cf0787dbc3 Author: Jan Stanstrup Date: Mon May 22 14:01:47 2017 +0200 scanrange was collapsed when the adjusted range was reported. ```r > scanrange=c(1,1400) > message("Provided scanrange was adjusted to ", scanrange) Provided scanrange was adjusted to 11400 > > > message("Provided scanrange was adjusted to ", scanrange[1]," - ", scanrange[2]) Provided scanrange was adjusted to 1 - 1400 > ``` commit 56c43ddfd7eece4fe58f1f81da66714bf23e32ef Author: jotsetung Date: Fri May 19 12:20:29 2017 +0200 Fix for issue #173 - Stitching of mzML files did not fill in mz and intensity values for the last spectrum. commit 95a8deadbc29b7433678cd35b05690961c99dd6c Author: jotsetung Date: Thu May 18 15:36:54 2017 +0200 Fix for issue #175 - Disable original xcms-preprocessing vignette. commit 36535df5d03137a1d3db62fbf7a9f85c7fdaf8a9 Author: jotsetung Date: Mon May 15 09:08:31 2017 +0200 Add extractMsData method (issue #120) - Add extractMsData to extract MS data (mz, rt, intensity duples) as a data.frame (related to issue #120). - Add related unit tests and documentation. commit b273693c627451f470d1c5a91c435f384ce9cdf7 Author: jotsetung Date: Fri May 5 13:21:14 2017 +0200 Fix for bug introduced into plotChromPeakDensity commit ad6aa2bf4bec129147c1407d0325f531dcf1fcb0 Author: jotsetung Date: Fri May 5 13:03:00 2017 +0200 Add Jan Stanstrup's fix also to the plotChromPeakDensity function commit 906be43e92aee5ac54b97ee795ada7848cbae5c5 Author: jotsetung Date: Fri May 5 13:00:30 2017 +0200 Update news. commit 11ed73c97b5c1ea28354172da7f639eff85bae38 Merge: e90b74e f11aac4 Author: jotsetung Date: Fri May 5 12:59:04 2017 +0200 Merge branch 'devel' into xcms3 commit f11aac4020319d991b845154e492f1031f946888 Author: jotsetung Date: Fri May 5 12:43:06 2017 +0200 Fix problem with merge from Jan Stanstrup - Remove definitions of argument n in density functions other than in do_groupChromPeaks_density: fixes errors in the vignette. - Fix issue #161. commit 9129650cdba019bcacba62441d2623e50168a498 Merge: 77c51a4 60ff595 Author: Johannes Rainer Date: Fri May 5 11:14:26 2017 +0200 Merge pull request #162 from stanstrup/patch-5 fixes for #161: increase parameter `n` in `density` function calls for *peak density* correspondence. commit e90b74e3c30bdf3860b475b549db6fdb158ecd60 Author: jotsetung Date: Fri May 5 11:10:57 2017 +0200 Remove un-needed functions from functions-XCMSnExp.R commit 77c51a444c14b962c54b3ca6c0eabc7dd3f7c2f8 Merge: 14e701c cf3a862 Author: Steffen Neumann Date: Fri May 5 09:49:28 2017 +0200 Merge branch 'biocdevel' into devel commit 58e35e588c0f4654f013f06933356b0d232f1f99 Author: jotsetung Date: Fri May 5 09:41:03 2017 +0200 Add plotChromPeakDensity function (issue #171) - Add the plotChromPeakDensity function to evaluate peak density correspondence settings. - Add related unit tests and documentation. commit 9de2927231f6c92fe600381ec5f3758093dd642d Author: jotsetung Date: Tue May 2 09:32:25 2017 +0200 Add new clean,Chromatogram method - Add new clean,Chromatogram method. - Add related unit tests and documentation. commit f7719b8d4c8a04cc2bc349802c309441e3fee382 Author: jotsetung Date: Thu Apr 27 22:18:33 2017 +0200 Fixes to the extractChromatograms method - Ensure that the returned lists per rt/mz range have the same lengths than there are files. - Return a Chromatogram object of length equal to the number of scans within the specified retention time range, even if no measurement is available for the provided mz range (report NA_real_). - Add parameter missing to the extractChromatograms method to allow specifying the intensity value to be used if no signal was measured for a rt in the specified mz range. commit 20c7e9e048d8117733f8af7309307308262ee563 Author: jotsetung Date: Wed Apr 26 08:12:47 2017 +0200 extractChromatograms extracts multiple ranges - extractChromatograms extracts multiple ranges to enable efficient chromatogram extraction without re-reading the raw data (issue #168). - Add corresponding unit tests and documentation. - Fix in plotChromatogram to avoid warnings if the number of measured data values differs between files (issue #167). - Extend new_functionality vignette. - Disable parallel processing in preprocessing vignette. commit 77b0396c54e2afe61de1df09271ec1ce427781e3 Author: jotsetung Date: Fri Apr 21 15:25:27 2017 +0200 Fix bug in plotChromatogram commit 612cecfc868a55b94c43cf01d16b15ea6c56418c Author: jotsetung Date: Fri Apr 21 14:27:48 2017 +0200 Ensure plotChromatogram doesn't break if no data available commit af6eea822cb9edb1d9d979289617b022b6947584 Author: jotsetung Date: Fri Apr 21 09:20:35 2017 +0200 Add plotChromatogram and highlightChromPeaks functions - Add plotChromatogram and highlightChromPeaks functions (issue #167). - Add documentation. commit d045d708e1802f81e54a307220d19e0b18253a61 Author: jotsetung Date: Wed Apr 19 09:57:22 2017 +0200 Fix validation method for CentWaveParam if roiList is provided commit 14e701ce3e3c0f271bb7f6f38a678f132d007442 Merge: f775cbb 84a5375 Author: Steffen Neumann Date: Fri Apr 14 19:20:26 2017 +0200 Merge branch 'biocdevel' into devel commit f775cbb7336e160ff7157d5e897c5cd1a0e93d8c Merge: aa9f1d3 30bb9b2 Author: jotsetung Date: Thu Apr 13 18:59:42 2017 +0200 Merge branch 'xcms3' into devel commit 30bb9b270ff90a4a54b8e752f3abf8dd609ee811 Author: jotsetung Date: Thu Apr 13 18:57:46 2017 +0200 Update date commit 9d507248152612eabc049cd887f838aa525545d9 Author: jotsetung Date: Thu Apr 13 13:22:42 2017 +0200 Avoid fillPeaks using deprecated API (issue #163) - Implement .getPeaks_new that does no longer depend on deprecated profFun calls. - Change getPeaks to use by default the new .getPeaks_new function (fixes fillPeaks issue #163). - Add corresponding unit tests. commit 60ff5957cf9ef6a7729710eb2fdb823209fa8d62 Author: Jan Stanstrup Date: Tue Apr 11 11:01:47 2017 +0200 additional fixes for #160 commit 959004a09888b236111bc0ef5a9f829a5558c174 Author: Jan Stanstrup Date: Tue Apr 11 10:57:25 2017 +0200 devel patch for # 160 commit 0b26f47f3bb48080c5691af82631e176e6312018 Author: jotsetung Date: Mon Apr 10 08:24:36 2017 +0200 Fix possible memory problem in obiwarp (issue #159) - Fix issue #159. - Add example on how to inspect raw peak data in the new user interface (issue #155). commit a7cc281eae4013c691afacccaf010596756266b6 Author: jotsetung Date: Fri Apr 7 08:06:22 2017 +0200 Update documentation of fillPeaks.chrom - Update the documentation of fillPeaks.chrom. - Display message if nSlaves is used suggesting to use BPPARAM instead (issue #158). commit 00786dab2f8d73ad9fdf45f17da28d8f024fe89c Author: jotsetung Date: Thu Apr 6 08:04:07 2017 +0200 Clean up imports and dependencies - Import specific functions from Biobase instead of the full package. - Move packages from Depends to Imports. commit e4a970e93d8a1c14baf920684bfae5e2f9ea91cd Author: jotsetung Date: Wed Apr 5 06:29:26 2017 +0200 Add parameters mz, rt, ppm and type to chromPeaks (issue #156) - Add parameters mz, rt, ppm and type to the chromPeaks method to enable extracting chromatographic peaks from the specified range(s). - Add related documentation and unit tests. - Documentation tidying. commit 7fcc690bbc484805528151e26434cd806d244ce4 Author: jotsetung Date: Tue Apr 4 16:56:34 2017 +0200 Add parameter "filled" to featureValues - Add parameter filled to the featureValues,XCMSnExp method (issue #157). - Add related unit tests and documentation. commit aa9f1d3e5241cc22c7ade7165c168bdfb6399e8d Merge: 828883b ecbe9a7 Author: Steffen Neumann Date: Fri Mar 31 13:58:31 2017 +0200 Merge branch 'biocdevel' into devel commit 828883b412f7973f10eacbd58eac2744500ecb13 Author: jotsetung Date: Fri Mar 31 07:50:44 2017 +0200 Updates to the vignette commit cbe41fac512d7ed267b3d1a36bccb023fe776615 Author: jotsetung Date: Thu Mar 30 13:03:59 2017 +0200 Add the plotAdjustedRtime function (issue #141) - Add the plotAdjustedRtime function to visualize alignment results (issue #141) - Add corresponding documentation, unit tests and examples. - Code tidying. - Include plotAdjustedRtime to vignette. commit 592ecdc097dfa72fc92027df46133144d387394b Author: jotsetung Date: Thu Mar 30 09:02:12 2017 +0200 Support predefined peak group matrix for peak groups alignment - Support peak groups-based alignment using a pre-defined peak groups matrix (issue #153). - Add related unit tests and update documentation. commit 985c051ebdd6a7c7f9fe86c19b0616e32458e2c1 Author: jotsetung Date: Wed Mar 29 22:01:07 2017 +0200 Add peakGroupsMatrix slot to PeakGroupsParam class - Add peakGroupsMatrix slot to the PeakGroupsParam class (issue #153). - Add related unit test and update documentation. commit 2ec98ddfef91ebaf5e9f10d51cc44b94647e4dbb Author: jotsetung Date: Wed Mar 29 14:38:15 2017 +0200 Remove private 'isSeizmo' massifquant function. - Remove the private isSeizmo function from massifquant's C++ code (issue #149). commit 0b97c0d38ab8a874a25ce260adbd5c0631898a9b Author: jotsetung Date: Tue Mar 21 09:53:00 2017 +0100 Add adjustRtimePeakGroups function (issue #147) - Add adjustRtimePeakGroups function for XCMSnExp that returns the peak groups that would be used for a given PeakGroupsParam parameter object. - Add related documentation and unit tests. commit 59f1f4940517517f5b3aa324d1ce55ee2c45541a Author: jotsetung Date: Mon Mar 20 17:23:16 2017 +0100 Use feature IDs as rownames in featureValues and featureDefinitions - Add arbitrary feature IDs as rownames to the featureDefinitions DataFrame and use these also for the matrix returned by featureValues (issue #148). - Add related documentation and unit tests. commit 6b52f86e267846e637411fbaddc5e6271230ef81 Author: jotsetung Date: Fri Mar 17 16:25:03 2017 +0100 Add filterRt,Chromatogram method - Add a filterRt,Chromatogram method (issue #142). - Add related unit tests and documentation. commit 0e0a9909d3f684a923c4454b4e64d2dc9a8d8aad Author: jotsetung Date: Fri Mar 17 15:21:13 2017 +0100 Ensure correct ordering of values in Chromatogram constructor o Order intensity and retention time values by retention time if not increasingly ordered in the Chromatogram constructor (issue #145). commit d2f3d141558585e5df094d64876b84f1a8749666 Author: jotsetung Date: Fri Mar 17 08:06:52 2017 +0100 Change order of alignment and correspondence in XCMSnExp,show commit f8148d567b9e2f406755f27149334a103f0b23b4 Author: jotsetung Date: Wed Mar 15 16:22:03 2017 +0100 Fix unordered adjusted retention times in peakGroups o Fix adjustRtime,XCMSnExp,PeakGroupsParam to return for some data adjusted retention times that are not in the same order than raw retention times (issue #146). commit c697bfd54397f856207769ce28a7b75794402379 Author: jotsetung Date: Wed Mar 15 09:15:54 2017 +0100 Ensure adjusted and raw retention times to be in the same order o For adjustRtime,XCMSnExp,PeakGroupParam ensure that adjusted retention times are in the same order than the raw retention times (issue #146). o Show warning if adjusted retention times have to be re-adjusted accordingly. o Show warning if adjusted retention times are not ordered. commit 2b66b28e3905618f7543a6b4b44176ca6bbebf6d Merge: b4c4885 dfe23f3 Author: jotsetung Date: Tue Mar 14 15:53:49 2017 +0100 Merge branch 'devel' into xcms3 commit b4c48850e6976bc599fc02bb5d224bd69ae370b6 Author: jotsetung Date: Tue Mar 14 15:52:07 2017 +0100 Show warning if order of adjusted retention time is not increasing o Show a warning message if the adjusted retention times for a file are not ordered increasingly (issue #146) commit dfe23f315235d0ac965b712de2cd995f54204ec0 Merge: ed89456 215409c Author: Steffen Neumann Date: Fri Mar 10 23:09:00 2017 +0100 Merge branch 'biocdevel' into devel commit e8dbb4c094b0cbaa6a962320047f941f52474207 Author: jotsetung Date: Fri Mar 10 22:02:31 2017 +0100 Avoid multiple/nested parallel processing - Avoid multiple/nested parallel processing calls (issue #144). - Documentation update with newer roxygen2 package. commit ed8945662d82612911bcdbf4be3333ea750d1ef6 Author: jotsetung Date: Fri Mar 10 11:12:53 2017 +0100 Change default backend for mzML files to pwiz (issue #143) commit cf6b1bca8d966a9bc2ffc34d68bfedb76c4eeb93 Author: jotsetung Date: Thu Mar 9 17:04:16 2017 +0100 Remove debug centWave version debug message commit e9f39ecd6540aae7ba4a438d9ca8b26a1e8e80ff Author: jotsetung Date: Wed Mar 8 08:44:30 2017 +0100 Extend new_functionality vignette. commit 572f2ebe0d840929dc4db7fb671f9a54016f7861 Author: jotsetung Date: Tue Mar 7 12:51:15 2017 +0100 Add fillChromPeaks for matchedFilter peak detection o Add support for matchedFilter identified peak in fillChromPeaks,XCMSnExp (issue #130). o Add related documentation and unit tests. commit 6af52f4458663c40fba939044ce5f24c9c8de49c Author: jotsetung Date: Mon Mar 6 14:35:01 2017 +0100 Remove commented old matchedFilter test functions. commit e899b923086b8c540f26a0b1fdb468eb0cd701a3 Author: jotsetung Date: Mon Mar 6 13:43:58 2017 +0100 Ensure XCMSnExp compatibility for single spectrum MS data o Check XCMSnExp on single spectrum direct injection MS data (issue #106). o Add related unit tests. commit 5c6454c1f53da31e898c393a3181465229726e8a Author: jotsetung Date: Mon Mar 6 12:27:36 2017 +0100 Support peak filling for direct infusion data o Add support for MSW identified peaks of single spectra, direct infusion data in fillChromPeaks,XCMSnExp. o Add documentation and related unit tests. commit 889caf0f3ba0188646868d493ee0ba6dc3d9d9bb Author: jotsetung Date: Fri Mar 3 13:58:52 2017 +0100 Extend show method for XCMSnExp commit c9c061fd76e883d33431830a4277d721678af060 Author: jotsetung Date: Fri Mar 3 13:36:52 2017 +0100 Fix expand.rt and expand.mz in fillPeaks (issue #139) commit e51387f7cc7ec952ad258b4b9bd6d46897e582e3 Author: jotsetung Date: Fri Mar 3 13:09:54 2017 +0100 Add featureValues method for XCMSnExp o Add featureValues method for XCMSnExp (issue #131). o Add related unit tests and documentations. commit f7c0547dc6b422d8980b159710a56e4debc04be5 Author: jotsetung Date: Fri Mar 3 12:26:31 2017 +0100 Add dropFilledChromPeaks method o Add dropFilledChromPeaks method (issue #140). o Add related documentation and unit tests. commit e48e977a2e50943e8d41d011515e985362014768 Author: jotsetung Date: Fri Mar 3 10:41:43 2017 +0100 Add @filled slot for XCMSnExp to xcmsSet conversion commit 083fd4b2594ae8e5703ca04ca527ff6a12453fa4 Author: jotsetung Date: Fri Mar 3 10:35:40 2017 +0100 Add fillChromPeaks method and FillChromPeaksParam class o Add fillChromPeaks method and FillChromPeaksParam class. o Add related unit tests and documentation. commit b1b430239a2c5e4e7dda3777e442535f474f5ead Author: jotsetung Date: Thu Mar 2 13:12:28 2017 +0100 o Remove debug messages from xcmsSet. commit d469000b45403204e8796dd1de0dd07fabf7e32c Author: jotsetung Date: Wed Mar 1 15:26:33 2017 +0100 Add modified centWave function and various fixes o Add modified centWave function that integrates peak intensity using only signal within the peak area (issue #136). o Fix error in findChromPeaks if no peaks were found (issue #137). o Fix for failing unit test checking break definition functions (issue #118). commit c821b33adea47101f8e4044ddc3e66b11764665f Merge: 8e44a7b e4b4f89 Author: jotsetung Date: Mon Feb 27 22:11:31 2017 +0100 Merge branch 'devel' into xcms3 commit 8e44a7bb32b532da9fc86c07a7676c1223a6acd5 Author: jotsetung Date: Mon Feb 27 18:47:34 2017 +0100 Update NEWS commit 2d670e210408e778cd896553632e0e9b3969b0ac Author: jotsetung Date: Sun Feb 26 22:12:49 2017 +0100 Fix for issues #118 #133 #134 o Disable part of failing unit test for issue #118 - try to reproduce on a windows build machine o issue #134: show information message if no files are provided showing the directory in which files are listed and the number of found files. o issue #133: don't re-index samlples if no peaks were identified. commit e4b4f8951ae599f3764d29372c23d3dbcc64cd57 Merge: 861e938 d421682 Author: Steffen Neumann Date: Fri Feb 24 22:12:22 2017 +0100 Merge branch 'biocdevel' into devel commit 78a98b1e8c2612a847382ff741da49a90786c6c0 Author: jotsetung Date: Fri Feb 24 08:38:39 2017 +0100 Add columne "is_filled" to chromPeaks matrix commit 1743262d1d03865461bc489bf76fc0a566608f4e Author: jotsetung Date: Thu Feb 23 18:58:44 2017 +0100 Add findChromPeaks for XCMSnExp objects (issue #128) commit 8068dbeb2d955121179c6974b94c6aa7d7b0d610 Author: jotsetung Date: Thu Feb 23 13:26:21 2017 +0100 Rename parentMz in Chromatogram to precursorMz o Rename Chromatogram class slot parentMz into precursorMz to fit with the IUPAC definition. commit b358862912447e017ad9b9406cbe369abc357aae Author: jotsetung Date: Thu Feb 23 08:02:13 2017 +0100 spectra,XCMSnExp returning adjusted rtime (issue #129) o spectra,XCMSnExp returns adjusted rtime within the Spectrum objects, if such retention times are present in the XCMSnExp object. o Add related documentation and unit tests. commit 861e93805afcf2da1add7adfde71e403333c8fe0 Author: jotsetung Date: Wed Feb 22 11:06:19 2017 +0100 Fix issue #127: failing unit test on tokay2 build machine commit 2ae5eafdebe4c225d3a1de7b194a89093507d109 Author: jotsetung Date: Wed Feb 22 10:52:34 2017 +0100 Rename methods, functions and objects (issue #126) o Rename most of the methods from the new user interface to follow a common nomenclature. commit 009e57a15b6a2969d460144bec30b2b098485377 Author: jotsetung Date: Wed Feb 15 09:39:04 2017 +0000 Ensure memory cleanup in parallel findPeaks for xcmsSet commit 6da82fc146eb80e3058ce56cfe2bc536818fce82 Author: jotsetung Date: Wed Feb 8 12:15:02 2017 +0100 Minor changes to Chromatogram o Don't export Chromatogram. commit c4bca930c1f897e1fe3b3db6c01cfb6f7c456d27 Author: jotsetung Date: Mon Feb 6 08:27:36 2017 +0100 Add Chromatogram class o Add Chromatogram class (related to issue #120). o Add methods, unit tests and documentation. commit f6e169fbfbfe9ac9ee83d6677317def6b2714b8a Merge: b0deb92 84eee36 Author: Steffen Neumann Date: Fri Feb 3 09:59:01 2017 +0100 Merge branch 'biocdevel' into devel commit b0deb92a9b8df81fe7b2ea6e2129ae46bc282cfa Author: jotsetung Date: Fri Feb 3 09:20:54 2017 +0100 Bump version and update NEWS. commit 70040008b630ede4a8c5ff569fce27bf798a4616 Author: jotsetung Date: Fri Feb 3 08:40:41 2017 +0100 Fix issue #124 o Fix issue #124: filterRt,XCMSnExp returns empty object. o Extend unit tests for above fix. commit 2f1add71e4440547b006c5534ba10328f8f8feef Author: jotsetung Date: Thu Feb 2 18:48:02 2017 +0100 Bump version. commit 0c9b416ea9128ecbbce3ce567a71d7462b776cdb Author: jotsetung Date: Thu Feb 2 18:45:06 2017 +0100 Small internal changes. commit 09eb5e3f5e784157e8b50e159cef9c05cf725bc8 Author: jotsetung Date: Thu Feb 2 15:21:15 2017 +0100 Small code cleanup. commit 00fd415e0b14070b3bf9a417283b98a9a888c065 Author: jotsetung Date: Thu Feb 2 15:01:58 2017 +0100 Update NEWS. commit 806d79351a46d5369d2e056010ca33f6d7c5d5f4 Merge: 2d2ecf8 6e0381e Author: jotsetung Date: Thu Feb 2 14:48:35 2017 +0100 Merge branch 'devel' into xcms3 commit 2d2ecf85d66ce24309499c60834448694ac5eb60 Author: jotsetung Date: Thu Feb 2 14:18:48 2017 +0100 Fix unit test error on R-3.2.3 commit 7720ea5c0de35552ca8c25e782e1e9df7ab47023 Author: jotsetung Date: Thu Feb 2 12:20:49 2017 +0100 filterRt filtering by default on adjusted rt if available o Fix filterRt to filter on adjusted retention times if available. o Fix filterRt to filter features correctly for adjusted = FALSE. o Extend unit tests to ensure proper functionality. o Extend documentation. commit 7aeee29b3eaddceae9ba613083162b0a5066b6c7 Author: jotsetung Date: Thu Feb 2 07:28:23 2017 +0100 rtime,XCMSnExp reports by default adjusted rt o rtime,XCMSnExp method reports by default, if present, adjusted retention times (issue #123). o Add/fix related unit tests and adapt documentation. o Extend other documentations. commit 079836e67c1bb607759bd51e17edee66230cfb3a Author: jotsetung Date: Wed Feb 1 10:54:21 2017 +0100 Add groupval,XCMSnExp method (issue #114) o Add the groupval,XCMSnExp method. o Add documentation and unit tests. commit 359ad1c2492c0c3b334de29297465284b3eaa226 Author: jotsetung Date: Wed Feb 1 06:25:58 2017 +0100 Add adjustRtime,XCMSnExp,ObiwarpParam (issue #119) o Add adjustRtime obiwarp alignment for XCMSnExp and OnDiskMSnExp. o Add documentation and unit tests. commit d4ceb5f5fbae010575cf76f7ffffe130093639d3 Author: jotsetung Date: Mon Jan 30 09:10:53 2017 +0100 Tentative fix for issue #118 o Using checkEquals instead of checkIdentical on the failing unit test. commit d6df84b9c3ab052fc20d7591fb9d4a39de4db793 Author: jotsetung Date: Mon Jan 30 09:05:51 2017 +0100 Add ObiwarpParam class (issue #119) o Add the ObiwarpParam class. o Add related documentation and unit tests. commit 940fecdcc931cdc83b0011b6299b56affc3e5e98 Author: jotsetung Date: Fri Jan 27 06:56:51 2017 +0100 Implement profMat method for XCMSnExp and OnDiskMSnExp o Implement the profMat method for OnDiskMSnExp and XCMSnExp objects (issue #115). o Add related documentation and unit tests. commit 98b53f3ceff0b26c2ff9afc091cba73a8705442f Author: jotsetung Date: Wed Jan 25 14:59:47 2017 +0100 Use do_adjustRtime_featureGroups in retcor.peakgroups o Modify the retcor.peakgroups method to use the do_adjustRtime_featureGroups to perform the retention time correction (issue #111 and #112). o Add related unit test to compare to the original code. commit 4a2d9659ba665e0d3a5f032257666a703846db5f Author: jotsetung Date: Wed Jan 25 13:45:03 2017 +0100 Add adjustRtime,XCMSnExp,FeatureGroupsParam method o Add the retention time adjustment equivalent to retcor.peakgroups (issue #112). o Add related unit tests and documentation. o Enhance and fix the dropFeatures, dropFeatureGroups and dropAdjustedRtime methods and the features<-, featureGroups<- and adjustedRtime<- methods (see issue #113). o Add related documentation and unit tests. commit 569dff0f2a4148e04f0d2a83419d0b0f858ecbbe Author: jotsetung Date: Tue Jan 24 15:06:07 2017 +0100 Add FeatureGroupsParam object (issue #112) o Add FeatureGroupsParam object. o Add related unit tests and documentation. commit 1f866da1b7f80d91e35f16ca4b1ab055d3c2cc3e Author: jotsetung Date: Tue Jan 24 12:54:05 2017 +0100 Add documentation and unit test for do_adjustRtime_featureGroups o Add documentation and unit test for do_adjustRtime_featureGroups (issue #111). commit 27c382a2d9ed436a8071b38bebed7d24703568e7 Author: jotsetung Date: Tue Jan 24 12:18:08 2017 +0100 Amend ordering of peak goups in retcor.peakgroups (issue #110) commit 5d602d2185665c9feac159dacda58fdbaa36bfed Author: jotsetung Date: Tue Jan 24 09:18:34 2017 +0100 Add the do_adjustRtime_featureGroups function o The do_adjustRtime_featureGroups function performs retention time correction with the peakgroups method. Issue #111. commit 6c005cf0ea4346a124569a0e79015a6722136b8a Author: jotsetung Date: Fri Jan 20 16:26:56 2017 +0100 Remove commented code. commit 9b88134182343a19992fe99100d39c0c62b9242b Author: jotsetung Date: Fri Jan 20 16:13:21 2017 +0100 Add groupFeatures,XCMSnExp,NearestFeatures method (issue #108) o Add the groupFeatures,XCMSnExp,NearestFeatures method. o Add related unit tests and documentation. commit 73311ba4e6b4417f48d00a327168e2b5c47c3ca0 Author: jotsetung Date: Fri Jan 20 15:32:50 2017 +0100 Add NearestFeaturesParam class (issue #108) o Add the NearestFeaturesParam class with all methods and functions. o Add related documentation and unit tests. commit dde4b3a9d585c33bc91c2705b696e53a2a73d21d Author: jotsetung Date: Fri Jan 20 13:15:36 2017 +0100 Fix warnings in group.nearest (issue #109) commit ec0daf60ed1c6d01e696dc7e927c25d10b651912 Merge: 8fd3010 8312b64 Author: jotsetung Date: Fri Jan 20 11:10:29 2017 +0100 Merge branch 'xcms3' of https://github.com/sneumann/xcms into xcms3 commit 8fd301034eefa35e87dbbccb47aec86643e79297 Author: jotsetung Date: Fri Jan 20 10:38:28 2017 +0100 Add do_groupFeatures_nearest function (issue #103) o Add the do_groupFeatures_nearest function. o Add unit tests and documentation. commit 8312b6469d37fc923c0cd6ac6bc1a17bcd4eec59 Author: jotsetung Date: Fri Jan 20 10:38:28 2017 +0100 Add do_groupFeatures_nearest function (issue #103) o Add the do_groupFeatures_nearest function. o Add unit tests and documentation. commit 848b6c21d1fcd6bab86a669c78de1a3a3594d445 Author: jotsetung Date: Thu Jan 19 16:02:03 2017 +0100 Add groupFeatures,XCMSnExp,MzClustParam (issue #107) o Add groupFeatures,XCMSnExp,MzClustParam method. o Add documentation and unit tests. commit 8f4230089e538631d87bc30b45c0b1c5a640e474 Author: jotsetung Date: Thu Jan 19 14:43:22 2017 +0100 Add MzClustParam class and smaller bug fixes o Add the MzClustParam class along with all required methods (issue #107). o Add unit tests and documentation. o Add support for R-3.2.3: fix problems with S4Vectors and sort method. commit a98f9fb67ec76eb9cc6905533f50b9e60f9a65c4 Author: jotsetung Date: Wed Jan 18 16:13:45 2017 +0100 Fix order issue (issue #180 in MSnbase) o Remove argument 'method' from any calls to order to ensure backward compatibility. commit 5c11a30aeef599220a8a87188fb8e50552beb19f Author: jotsetung Date: Wed Jan 18 06:55:23 2017 +0100 Add do_groupFeatures_mzClust function (issue #103) o Add the do_groupFeatures_mzClust function. o Add unit tests and documentation. commit 797ec556f78cb3e241a8bccd90f06c615126170d Author: jotsetung Date: Tue Jan 17 15:53:54 2017 +0100 Add groupFeatures,XCMSnExp,FeatureDensityParam method o Add the groupFeatures,XCMSnExp,FeatureDensityParam method to perform the feature alignment using the density method (issue #105). o Add unit test and documentation. commit 900c1d14f6343c2da8f3cf7515e8c77d9ac0bf0c Author: jotsetung Date: Tue Jan 17 14:06:35 2017 +0100 Add FeatureDensityParam class (issue #105) o Add the FeatureDensityParam class, all related methods and functions. o Unit tests and documentations for FeatureDensityParam. commit bb2f22a0f092d99527dde11c7c8fc99145979d6b Author: jotsetung Date: Tue Jan 17 11:01:24 2017 +0100 Parallel version of the do_groupFeatures_density implemented o Function implemented but not exported - no performance increase with the parallel version. commit 458b9e353ea184d861d21e27ce08fcefe300cce9 Author: jotsetung Date: Tue Jan 17 10:19:10 2017 +0100 Replace code in group.density with do_groupFeatures_density (#103) commit 9edb01c2d9986d15d48d65ce95ed00edc86901bc Author: jotsetung Date: Tue Jan 17 09:22:08 2017 +0100 Add do_groupFeatures_density function o Add the first feature alignment core API function: do_groupFeatures_density: issue #103. o Add unit tests and documentation. commit 6e0381eef656d2f32fa8d3affabd2a9f995bfc38 Merge: 87a57f1 283023b Author: Steffen Neumann Date: Tue Jan 17 08:28:38 2017 +0100 Bump version and adapt NEWS commit 87a57f1c4d1ab4da77093dc529ed4def9b1bc0e2 Merge: 5e288f4 62452c2 Author: Steffen Neumann Date: Mon Jan 16 22:57:21 2017 +0100 Merge remote-tracking branch 'origin/xcms3' into devel commit 5e288f41000a7aab07e2b0e4cc61232fb7baa1f3 Merge: a4421c3 4c6815a Author: Steffen Neumann Date: Mon Jan 16 22:57:07 2017 +0100 Merge branch 'biocdevel' into devel commit 62452c2b5204f515e57579aaa8c614173c44750b Author: jotsetung Date: Mon Jan 16 12:57:22 2017 +0100 Removed , in DESCRIPTION commit bdc3d65b646447f4b7fef7ba650623d2bcacb87f Author: jotsetung Date: Fri Jan 13 21:28:54 2017 +0100 Add spectrum,XCMSnExp method and increase method robustness o Add spectrum,XCMSnExp method to extract spectra grouped by samples (bySample parameter). Issue #96. o Ensure robustness of methods with a bySample parameter: the returned list has always the same length as there are files, with elements being empty if no e.g. mz values are present for a specific file (because it got e.g. filtered). commit d8e9a21f1ed58e0167e68164c2b98f48e0f826fb Author: jotsetung Date: Fri Jan 13 13:33:54 2017 +0100 Fix issue #102 commit 95f5c30fdd727e0419de928553121d204e032ae4 Author: jotsetung Date: Fri Jan 13 13:29:26 2017 +0100 Fix issue #91. o Replay the changes made by Jan Stanstrup. commit 839fdb369875f895c06d627dedbe5161e3600f2c Author: jotsetung Date: Fri Jan 13 13:17:31 2017 +0100 Fix issue #98 o Fix error in flagme vignette. Ensure that number of rows of the profile matrix is equivalent to what produced in the old code. Problem was that previously the mzrange of the xcmsRaw object was altered, i.e. represented rounded *real* mz range. The number of rows in the profile matrix were then equal to the length of the sequence seq(mzrange[1], mzrange[2], by = step). The new code however always ensures that the real max mz value is included, i.e. it produces one more bin in cases were in the old approach the max mz would have been floored (new code: always do ceiling). commit c602fef616c8060b196c00f933fe22c6ee289394 Author: jotsetung Date: Fri Jan 13 08:01:13 2017 +0100 Add bySample parameter to features,XCMSnExp o Add the bySample parameter to the features,XCMSnExp method allowing to extract the feature matrices grouped by sample. commit f7053990d515702911850aa400908f4e5d7c5b14 Author: jotsetung Date: Thu Jan 12 16:21:50 2017 +0100 Fix for the last improvement of the issue #99 fix. commit 223798c30f8852d3c4696f4284facbe4152a08c8 Author: jotsetung Date: Thu Jan 12 07:58:19 2017 +0100 Update NEWS. commit 277324fec07683db2b08e09c0077ce243f9d327f Author: jotsetung Date: Thu Jan 12 07:53:47 2017 +0100 Improve fix for issue #99 o Only throw an error if the rtrange is completely outside the available rt. commit 707990ee9ae0f27e8d7e7fd3b5c8e6ef6048db90 Author: jotsetung Date: Wed Jan 11 08:28:01 2017 +0100 Method to coerce XCMSnExp to xcmsSet o Add setAs method to coerce XCMSnExp to xcmsSet (issue #100). o Add related unit tests and documentation. o Add examples for XCMSnExp usage. commit 9419493c8dda575dd6e74417e62d2c3a62989394 Author: jotsetung Date: Tue Jan 10 16:10:47 2017 +0100 Fix issue #101 o Fix the xcmsRaw function to not copy over MSn data if msleve = 1 is provided. commit 804e8bca6f6322b42ffa88467b1ff2e45038a819 Author: jotsetung Date: Tue Jan 10 09:15:50 2017 +0100 Add filterRt method for XCMSnExp o Implement the filterRt method for XCMSnExp objects that allows to filter the object by retention time. Subsets also features, featureGroups and adjusted retention time. Issue #96. commit 0bcb852e280294f0d58e016d69f1ad02c6368bbd Merge: 48055c0 7962641 Author: jotsetung Date: Mon Jan 9 16:01:17 2017 +0100 Merge remote-tracking branch 'refs/remotes/origin/xcms3' into xcms3 commit 48055c072e5589fa2fd3351b5a14de0b5bbc3a9b Author: jotsetung Date: Mon Jan 9 08:16:42 2017 +0100 Add bySample argument to adjustedRtime,XCMSnExp method o Add the bySample argument to the adjustedRtime,XCMSnExp method. commit 79626414dd15957ebec9d47c1dc18ccba9b85dab Author: jotsetung Date: Mon Jan 9 08:16:42 2017 +0100 Add bySample argument to adjustedRtime,XCMSnExp method o Add the bySample argument to the adjustedRtime,XCMSnExp method. commit 2e30a970c7e091bfdd575397985cfe1d985d0cca Author: jotsetung Date: Mon Jan 9 06:52:03 2017 +0100 Add mz, intensity and rtime methods for XCMSnExp o Add mz, intensity and rtime methods for XCMSnExp objects extending the corresponding methods for OnDiskMSnExp by adding the bySample parameter. commit 4aa10f595f103f2f8a7ef9b080a4407b3a41dd3a Author: jotsetung Date: Fri Jan 6 22:24:13 2017 +0100 Use drop* methods to remove preprocessing results o Use the drop* methods to remove preprocessing results from XCMSnExp objects. commit 8f1fc5cba7ea93c47ff60bdc76a5799693d09249 Author: jotsetung Date: Tue Jan 3 18:29:41 2017 +0100 Add sort method option o Add sort method option that defaults to "auto" on R versions < 3.3. See https://github.com/lgatto/MSnbase/issues/180 for more info. commit 6ae59333718b341ce3b40ec74b4e83007e975ed4 Author: jotsetung Date: Mon Jan 2 21:22:48 2017 +0100 Fix failed execution of unit tests commit a1122065a96cf6e69088417d82fe987cda188cd5 Author: jotsetung Date: Fri Dec 30 21:57:02 2016 +0100 Add drop methods o Add dropFeatures, dropFeatureGroups and dropAdjustedRtime for XCMSnExp and MsFeatureData objects to remove the corresponding results. o Remove obsolete Rd files. commit 477f0db3fd58f0aedef21e06d062b2f19e86f5c2 Merge: e92a02d a4421c3 Author: jotsetung Date: Sun Dec 25 18:49:49 2016 +0100 Merge branch 'devel' into xcms3 commit e92a02d2b0bb24bb9c58b615879f430fa35a9b61 Author: jotsetung Date: Fri Dec 23 15:27:37 2016 +0100 Implement filterMz method for XCMSnExp o Add the filterMz method for XCMSnExp that allows filtering on an mz value range. features and featureGroups are retained if they are completely within the mz range. Adjusted retention time is not altered. o Add unit tests and documnentation. commit 6dec3689c906b8557ebfe3bee91c1592e22852a2 Author: jotsetung Date: Fri Dec 23 14:04:37 2016 +0100 Fix problem reading MS2-only files. o Fix issue https://github.com/MassBank/RMassBank/issues/174 commit 9c9319da5bd9be139648680805fb59d175a4abea Author: jotsetung Date: Fri Dec 23 12:29:03 2016 +0100 Implement some of the methods inherited from OnDiskMSnExp o Implement all data manipulation methods from OnDiskMSnExp for XCMSnExp class (issue #96). All drop xcms pre-processing results. o Implement filterFile for XCMSnExp, does subset identified features. o Add documentation and unit tests. commit a4421c35caef0aaee129a222c128c99c25b218a5 Merge: 62932b7 1ddbb89 Author: Steffen Neumann Date: Fri Dec 23 12:01:16 2016 +0100 Merge branch 'devel' of github.com:sneumann/xcms into devel commit 62932b77c7407c04ed0d49bbe7d7ad2cf82371f0 Author: s.neumann Date: Fri Dec 23 11:00:28 2016 +0000 added deepCopy to avoid corrupting the original object, thanks to J. Stanstrup, closes #93 git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@125419 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 2ab8350f93056ba300eee06b7ef14212bd65ceaf Author: s.neumann Date: Fri Dec 23 11:00:19 2016 +0000 added deepCopy to avoid corrupting the original object #76 git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@125418 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 832f67adc75df88264aa017361788f2b2632da91 Author: jotsetung Date: Fri Dec 23 06:37:34 2016 +0100 Code cleanup o Comment unneeded (mostly testing purpose only) functions. o Remove previously commented out functions and code. o Add xcms startup message. commit c0ac4b7c622ccb211fcbb526a649e05ec514536f Author: jotsetung Date: Thu Dec 22 16:22:15 2016 +0100 Extend show method for XCMSnExp objects. commit a58cf39f9ebde3e6dc3ee94795fd3cb9addb18e5 Author: jotsetung Date: Thu Dec 22 15:23:36 2016 +0100 Enable XCMSnExp as return object in detectFeatures o Return the XCMSnExp object as a result object from the detectFeatures method. o Add related unit tests and update documentation. o XCMSnExp is ready to run (issue #85). commit 46c27495d87083dd41890e9ec2663f3ae669ef3d Author: jotsetung Date: Thu Dec 22 13:38:19 2016 +0100 Export the ProcessHistory and XProcessHistory classes o Export the ProcessHistory and XProcessHistory classes allowing to keep track of performed data analysis steps. o Add the processHistory method for XCMSnExp objects. o Add unit tests and documentations. commit 1fbf8b525a7557239c24296c62b4d98b9860e226 Author: jotsetung Date: Wed Dec 21 21:45:45 2016 +0100 Implement the detectFeatures method for CentWavePredIsoParam o Implement the detectFeatures method for CentWavePredIsoParam class. o Add documentation and unit tests. commit a3324552b94599b38995f117e9f3ce860465d83a Author: jotsetung Date: Wed Dec 21 16:34:47 2016 +0100 Add rtime,XCMSnExp method o Add rtime,XCMSnExp method that returns the retention time grouped per sample. commit f5f7d04610e4d1aeb2cbbd4b4315f89568317b66 Author: jotsetung Date: Wed Dec 21 15:48:09 2016 +0100 Add XCMSnExp class o Add the XCMSnExp class and export the MsFeatureData class (issue #85). o Add methods hasAdjustedRtime, hasAlignedFeatures, hasDetectedFeatures, features, features<-, featureGroups, featureGroups<-, adjustedRtime, adjustedRtime<-. o Add unit tests and documentation. commit cb148d5da0527462b548f0da04274ed8b505764c Author: jotsetung Date: Wed Dec 21 12:20:15 2016 +0100 Add MsFeatureData class o Add the MsFeatureData class for storing xcms preprocessing results (see issue #85 and https://github.com/lgatto/MSnbase/issues/177). o Add unit tests and validity function for the new object. commit 1ddbb890ddb2e5d741571c79647821c6d96c14a6 Author: Steffen Neumann Date: Tue Dec 20 22:14:46 2016 +0100 added deepCopy to avoid corrupting the original object, thanks to J. Stanstrup, closes #93 commit 37280ef115738daccd392c10f9e4b4fe5f6543a6 Merge: 5160700 fef11aa Author: Steffen Neumann Date: Tue Dec 20 21:43:15 2016 +0100 Merge branch 'stanstrup-patch-3' into devel commit fef11aac12ca51f227ac9302fe960997563e11a3 Merge: 5160700 ba80552 Author: Steffen Neumann Date: Tue Dec 20 21:43:02 2016 +0100 Merge branch 'patch-3' of git://github.com/stanstrup/xcms into stanstrup-patch-3 commit 5160700df8728f54c4460a0054ba975b05662f05 Merge: 8b595bf 647e2f9 Author: Steffen Neumann Date: Tue Dec 20 21:41:28 2016 +0100 Merge branch 'devel' of github.com:sneumann/xcms into devel commit 8b595bf187e6f97de4d19508c7faab73062ad593 Author: s.neumann Date: Tue Dec 20 20:39:30 2016 +0000 adapted manpage for plotQC From: Steffen Neumann git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@125356 bc3139a8-67e5-0310-9ffc-ced21a209358 commit b95b7689e622b50e55f76c2caaf19c25e6071c32 Author: s.neumann Date: Tue Dec 20 20:39:20 2016 +0000 merged xcms3 branch, added return value to plotQC() From: Steffen Neumann git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@125355 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 647e2f9c5fc7e6ea40d839c9846b07d668a95f0d Author: Steffen Neumann Date: Tue Dec 20 21:34:30 2016 +0100 adapted manpage for plotQC commit cf29b17d73c32bb0b89f7b7166fcb9cf9decec1e Author: Steffen Neumann Date: Tue Dec 20 21:32:50 2016 +0100 merged xcms3 branch, added return value to plotQC() commit ba805525dda98a90d9dd4682fbbdd0318bbab01d Author: Jan Stanstrup Date: Tue Dec 13 11:34:53 2016 +0100 added deepCopy to avoid corrupting the original object #76 commit dde6cba65156aedd28c36be89e64944d4e4e3389 Merge: d771f06 3385098 Author: jotsetung Date: Tue Dec 13 11:26:02 2016 +0100 Merge branch 'devel' into xcms3 commit 33850986e49365cbbdab5a0cffce65378db8ed35 Author: s.neumann Date: Tue Dec 13 10:14:49 2016 +0000 do not error if a centWave ROI contains no data, closes #90 git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@125062 bc3139a8-67e5-0310-9ffc-ced21a209358 commit bc99d3d47fb913a9ae13525b88186f1209fc08ae Merge: 58c2ad2 ba781a1 Author: s.neumann Date: Tue Dec 13 10:14:41 2016 +0000 Merge branch 'stanstrup-patch-2' git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@125061 bc3139a8-67e5-0310-9ffc-ced21a209358 commit ba781a1ba412e303fbd36673baf1e078495e0362 Merge: 58c2ad2 cba193b Author: Steffen Neumann Date: Tue Dec 13 11:11:47 2016 +0100 Merge branch 'patch-2' of git://github.com/stanstrup/xcms into stanstrup-patch-2 commit 58c2ad22057adfe1d4c7da5d06ffa75e1309a70e Author: s.neumann Date: Tue Dec 13 09:52:50 2016 +0000 Merge fix and bump version git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@125060 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 99b0eee8ca8ac60542c28065e3125cce20e09458 Merge: 2bf72a8 02444fd Author: s.neumann Date: Tue Dec 13 09:52:13 2016 +0000 Merge remote-tracking branch 'sneumann/devel' git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@125059 bc3139a8-67e5-0310-9ffc-ced21a209358 commit d771f06e483f8d579ba918e4b5fa56834f53d02f Author: jotsetung Date: Tue Dec 13 08:16:05 2016 +0100 Add CentWavePredIsoParam class o Add CentWavePredIsoParam class, documentation and unit tests. commit 515b8141ab02e3726cdc52cdb69f130a5ef9f689 Author: jotsetung Date: Mon Dec 12 15:24:55 2016 +0100 Add centWaveWithPresIsoROIs core API function 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. commit 3232b82c34254459f2d71d0a4c7a0b8e970ad641 Merge: 0d9d13e 02444fd Author: jotsetung Date: Sun Dec 11 19:21:14 2016 +0100 Merge branch 'devel' into xcms3 commit 02444fdc4f3e2264d7ff85e7320e9df955969379 Author: jotsetung Date: Sun Dec 11 19:04:11 2016 +0100 Fix wrong sample indexing in getEIC,xcmsSet o Fix the wrong sample indexing in getEIC,xcmsSet: issue #92. commit 0d9d13ec4fe9e9d0b24a4530297d436fe61b56a6 Author: jotsetung Date: Sat Dec 10 22:19:13 2016 +0100 Start implementing the do function for withAddIsotopes commit cba193bdeac458b978628c66d02a9dfdef69e1c6 Author: Jan Stanstrup Date: Fri Dec 9 11:05:45 2016 +0100 More informative warning. commit 9dc277bfeebd257b967645e61fb817c732ce16a3 Author: jotsetung Date: Thu Dec 8 12:24:43 2016 +0100 change profStepPad to use new binning functions o change profStepPad, used in retcor.obiwarp, to use new binning functions. o Ensure consistent naming of data types for parameters in roxygen documentation. commit 94b2b7f3048cd5e944b62631ea99ee772df78e00 Author: jotsetung Date: Thu Dec 8 09:51:28 2016 +0100 Update new_functionality vignette to new BiocStyle o Update the new_functionality vignette to correctly use the BiocStyle package. o Add the xcms.org org-file representing the future vignette describing xcms3 in detail. commit fd47069e84bc2b4f519b27db9d566f42cbdb9952 Author: jotsetung Date: Mon Dec 5 15:58:54 2016 +0100 Finish unit test tuning o Reduce processing time in the remaining unit tests. commit cb382f6bf4c20a568903ad549e3d9e72146d6ea7 Author: jotsetung Date: Fri Dec 2 12:57:45 2016 +0100 Unit test tuning o Tuning some more unit tests. o Disable the benchmarking vignette. commit 9fdf8a952bccabe19153d98b5371f5eabd8608a2 Author: jotsetung Date: Thu Dec 1 16:23:08 2016 +0100 Fix vignettes and tune unit tests o Disable parallel processing for R CMD check. o Fix BiocStyle templates in the new vignettes. o Tune unit tests and examples. commit 88322830e22aa9ce19749fbd1b7f40703fe22743 Merge: cd9165b bf142bc Author: Johannes Rainer Date: Thu Dec 1 14:43:15 2016 +0100 Merge pull request #88 from Treutler/xcms3 implemented function "do_predictIsotopeROIs" (issue #82) commit bf142bc4db56af7d66a06e2caee165147ae6ed9c Author: Treutler Date: Thu Dec 1 14:03:40 2016 +0100 split the functionality of "findPeaks.addPredictedIsotopeFeatures" / "findPeaks.centWaveWithPredictedIsotopeROIs" and implemented function "do_predictIsotopeROIs" commit cd9165bac43e205ffd3391ffa64aac7f42c5dac1 Author: jotsetung Date: Thu Dec 1 11:21:49 2016 +0100 Add MSW detectFeatures method o Add the detectFeatures,xxMSnExp,MSWParam method (issue #87). o Add documentation for massifquant detectFeatures method (issue #84). o Update NEWS. commit 8ace0ea8ddeefe383017920cac2a7316108473a5 Author: jotsetung Date: Wed Nov 30 14:53:49 2016 +0100 Add massifquant detectFeatures method o Implement the MassifquantParam class and the detectFeatures method (issue #84). o Implement the MSWParam class (issue #87). commit 35b3b7e476d918d7836ac6317bedb5c4ec92f60f Author: jotsetung Date: Mon Nov 28 14:59:09 2016 +0100 Add XProcessHistory class o The XProcessHistory class extends the ProcessHistory class and allows to add a Param class to the @param slot with the settings of the processing step. o Notes and ideas of the new XCMSnSet object. commit ccecc8f3bc62ffd0245f3a23b2f3a6e85c833b9d Author: jotsetung Date: Sun Nov 27 18:44:50 2016 +0100 Just some comments commit dd8cbd3c8f5aaa6e8633f7aee5185f4df009d9d4 Author: jotsetung Date: Sun Nov 27 08:34:34 2016 +0100 Add MassifquantParam class o Add a MassifquantParam class (issue #84). commit a6bfa83e3d5cce6dbfc4ce9416aaff873275d4ca Author: jotsetung Date: Fri Nov 25 11:52:56 2016 +0100 Add warning if data is not in centroid mode for centWave commit 284408213e7c410e2a09e68697c737524851ed03 Author: jotsetung Date: Fri Nov 25 11:32:37 2016 +0100 Add documentation for detectFeatures centWave and matchedFilter o Complete the missing documentation for the parameter classes and methods and the detectFeature methods (issue #83). commit 5b1e7a261f9b69dcb79792fdb83ee02807b73589 Author: jotsetung Date: Fri Nov 25 10:06:47 2016 +0100 Implement MatchedFilterParam and detectFeatures method o Add the MatchedFilterParam class and related methods. o Implement the detectFeatures,MSnExp,MatchedFilterParam and detectFeatures,OnDiskMSnExp,MatchedFilterParam methods (issue #83) o Add related unit tests. commit c4990197c14f30f40278e8c29f3e443574800ee7 Author: jotsetung Date: Thu Nov 24 10:38:38 2016 +0100 Add detectFeatures method for MSnExp and OnDiskMSnExp objects o Implement detectFeatures,MSnExp,CentWaveParam and detectFeatures,OnDiskMSnExp,CentWaveParam methods to perform feature detection using centWave on MSnExp and OnDiskMSnExp objects from the MSnbase package (issue #79). o Add unit tests evaluating correct processing. o Add roiList parameter validation to CentWaveParam class. commit e464617e26015c18f53303226e678adb9e70299b Author: jotsetung Date: Thu Nov 17 12:33:46 2016 +0100 Add CentWaveParam class (issue #78) o Add a Param and CentWaveParam class to pave the road for the feature detection framework. commit 27cf041f62238cf4e81a193e2b5f622724557c3a Author: jotsetung Date: Mon Nov 7 11:02:49 2016 +0100 Fix remaining unit test errors o Fix all unit test errors due to profBin function deprecation and new getEIC method (issue #68). o Add additional unit tests to ensure getXcmsRaw and [ subsetting works also along with specifying scanrange. commit ddc4e6f571bb9ed06d3bc54c93fc102ccf67c90f Author: jotsetung Date: Fri Oct 28 19:34:26 2016 +0200 Update getEIC method o getEIC method uses now the new binning and linear interpolation functions (issue #74). commit 348a598f05dd99d5fa4452a93aec4a9620453133 Author: jotsetung Date: Thu Oct 27 10:47:16 2016 +0200 Fix warnings in specDist o Fix warnings in specDist method (issue #73). commit b7cd5c9f919779100f2a6fa044835ee82e28d012 Author: jotsetung Date: Thu Oct 27 08:56:50 2016 +0200 Fix subsetting and profile matrix generation issues o Fix scanrange subsetting in xcmsRaw function (issue #69). o Avoid duplicated profile matrix generation in xcmsRaw function issue #72. o Add profMat method (issue #71). o Fix profStep<- and profMethod<- to avoid profile matrix generation when not needed. commit a98067ade4b5e03997f8c04d2897fe99391bd73f Author: jotsetung Date: Mon Oct 24 16:13:57 2016 +0200 Deprecate old binning functions. o Deprecate the profBin, profBinM, profBinLin, profBinLinM, profBinLinBase and profBinLinBaseM functions. commit 0ba4586a16b142fa10992b9c929051c5f1f21b93 Author: jotsetung Date: Mon Oct 24 08:03:08 2016 +0200 Change data import to newer mzR methods + Use `header` and `peaks` methods from mzR for data import instead of un-exported private methods. + Fix issue #67: add argument dropEmptyScans in readRawData to emulate the _old_ behaviour to discard empty scans. + Update new_functionality.Rmd. commit 93c216f8269868d13ddf824d55b4eef1c4f6a1e0 Author: jotsetung Date: Fri Oct 21 09:26:36 2016 +0200 Update the new_functionality.Rmd vignette. commit 31139f05c72360f84ed7aec20b7a19efadf81928 Merge: fa2fb9b fa4a97f Author: jotsetung Date: Fri Oct 21 09:20:17 2016 +0200 Merge branch 'devel' into xcms3 commit fa2fb9b054e06bfa4fb25ca8ac1eeb1286b77137 Author: jotsetung Date: Fri Oct 21 09:04:26 2016 +0200 Use official mzR methods for data import o Remove use of private ::: methods from mzR for data import and use the official 'header' and 'peaks' methods (issue #65). o Fix issue #66. commit b800586682acc62b63edb8954ad885f06fe434a4 Author: jotsetung Date: Thu Oct 20 11:19:39 2016 +0200 Change matchedFilter to use new binning code o Change findPeaks.matchedFilter and do_detectFeatures_matchedFilter to use the new binning code that performs the binning on the full matrix. This relates and fixes issues #47 and #52. o Change default in useOriginalCode to FALSE. commit 0036470d847cda9d1370194835a3748d5f2acab3 Author: jotsetung Date: Thu Oct 20 06:59:38 2016 +0200 Update findPeaks.centWave to use the do_ function o Update findPeaks.centWave to use the do_detectFeatures_centWave function. o Fix subsetting by scanrange in centWave (issue #64). commit 9611dae1e9689d67cbbfba2ceb1b5d215b921adc Author: jotsetung Date: Wed Oct 19 15:13:12 2016 +0200 Fix scanrange parameter in findPeaks methods o Fix problems with the scanrange parameter in findPeaks methods: - findPeaks.massifquant: parameter was ignored (issue #61). - findPeaks.matchedFilter: parameter was partially ignored (issue #63). - findPeaks.centWave: spectra were sub-setted, but @scantime not (issue #64). commit fa4a97f903ad8dba16cad0b3247f25d85dc27d93 Author: hpages@fhcrc.org Date: Mon Oct 17 19:10:43 2016 +0000 bump x.y.z versions to odd 'y' after creation of 3_4 branch git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@122712 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 1f816d946ed079f95dc4efa4e0aaa7cca360ef64 Author: hpages@fhcrc.org Date: Mon Oct 17 18:45:06 2016 +0000 bump x.y.z versions to even 'y' prior to creation of 3_4 branch git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@122710 bc3139a8-67e5-0310-9ffc-ced21a209358 commit baf28d1d1b3d9a32f20a485e5867b40369c73723 Author: jotsetung Date: Wed Sep 28 09:41:16 2016 +0200 Update the do_detectFeatures_centWave function o Update the do_detectFeatures_centWave function to the latest code. o Fix a bug in the [ method for xcmsRaw. commit 8a65c66a1d535603cf1b6f584099c7a0d06eda1b Author: jotsetung Date: Tue Sep 27 08:21:56 2016 +0200 Fix issue #60 o Fix issue #60. o Add documentation for do_detectFeatures_massifquant. commit 50848696d4fdfdd5f6c81f2c12f3e8d8e7f4bfb0 Merge: f82432a 4b2458e Author: jotsetung Date: Tue Sep 27 06:36:00 2016 +0200 Merge branch 'devel' into xcms3 o Fix conflicts in methods-xcmsRaw.R and NEWS. commit 4b2458e54e11a874fd5a0ce42cfb4d4e475a2865 Author: s.neumann Date: Mon Sep 26 14:28:09 2016 +0000 Bump version and add NEWS on documentation fixes git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@121387 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 87c0eb5ffac14b74133d4a3a84e18e78ee9a4bf3 Merge: 0574910 39e1823 Author: s.neumann Date: Mon Sep 26 14:28:01 2016 +0000 Merge branch 'Treutler-devel' into devel git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@121386 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 05749105ac97b83938dc11705a57a8c1165522c6 Author: s.neumann Date: Mon Sep 26 14:26:19 2016 +0000 updated NEWS and bumped version git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@121385 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 39e1823fb1ed38a76c77b8e061af0024a7d09c7f Author: Hendrik Treutler Date: Mon Sep 26 15:22:00 2016 +0200 fixed WARNINGS commit f82432a125e222d9a9ab475cdd47d36c2da1b458 Author: jotsetung Date: Mon Sep 26 08:19:46 2016 +0200 Add [ method for xcmsRaw objects o Implement a [ method for xcmsRaw objects allowing to sub-set the object to specified scans/spectra. o Implement the do_detectFeatures_massifquant function. o Unit tests for the above method/function. commit 9f35b91e6c6381ce6892d15b95b5ab9b70c02c3f Author: jotsetung Date: Fri Sep 23 13:48:10 2016 +0200 Fix NEWS and remove unused variables from C code o Remove unused variables from C/C++ code. commit 536aa23e1c07bedae1083ff7bee400efdc8dcc79 Author: jotsetung Date: Fri Sep 23 13:16:24 2016 +0200 Fix issue #59 o Fix passing arguments in the wrong order in do_detectFeatures_MSW. o Fix a small bug in diffreport (wrong variable name for a directory). commit 873b11d4f8d15c09e294ef3983ad62f8ac43a5ee Author: jotsetung Date: Fri Sep 23 12:35:38 2016 +0200 Fix issue #58 and prepare massifquant do function o Fix the bug in rawMat,xcmsRaw method (issue #58). o Prepare the "do" function for massifquant. commit 5a505865868ae409ea01a1be81741ee1a0c8b009 Author: jotsetung Date: Tue Sep 20 14:09:17 2016 +0200 Add .processHistory slot to xcmsSet o Add .processHistory slot, ProcessHistory class and functionality to track processing steps. o Add unit tests for subsetting, splitting and concatenating of xcmsSet objects checking that .processHistory slot is processed correctly. o Add showError method for xcmsSet objects that lists eventual errors during the feature detection step. o This addresses discussions in issue #55. commit 5313459da83183f6f24576f03fe3ebd62b024a43 Author: jotsetung Date: Mon Sep 19 13:16:02 2016 +0200 Add argument stopOnError to xcmsSet function o Add argument stopOnError to xcmsSet to enable feature detection in all provided files without stopping on errors. This relates to issue #55. o Add related documentation. commit fb93c843fc40ee7a41ede3f1a3746d7c7e13cd46 Author: Hendrik Treutler Date: Wed Sep 14 10:54:18 2016 +0200 corrected documentation commit b228271555c2144e8d557d5b940e4a43f2753542 Merge: d9ba200 5b73c67 Author: Hendrik Treutler Date: Mon Sep 12 11:28:40 2016 +0200 bug fix Merge branch 'devel' of https://github.com/sneumann/xcms into devel Conflicts: NAMESPACE R/AllGenerics.R R/methods-xcmsRaw.R inst/unitTests/runit.findPeaksCentWaveWithIsotopeROIs.R commit ea0e449bbd7a040b4fd6d63cad3d8cb35b6df594 Author: jotsetung Date: Mon Sep 12 08:37:36 2016 +0200 Documentation fixes and code tidying commit 330ae95620bd2ad2f15aa74066b04d5b52cd0e2c Author: jotsetung Date: Fri Sep 9 20:34:37 2016 +0200 Add do_detectFeatures_MSW function. commit f3fc2b4000217f728a9b7acbabcd6ffa6c280a73 Author: jotsetung Date: Wed Sep 7 16:29:38 2016 +0200 Re-organize IO functions o Put new IO functions into functions-IO.R commit c812cda0cea2a06b78571b54ab5c707489eafa22 Author: jotsetung Date: Wed Sep 7 14:15:02 2016 +0200 New data import function o Add new readRawData function that could replace the loadRaw and related S4 objects; this aims to fix issue #55. o Start implementing do_detectFeatures_MSW. commit 9bce991e2ed0b66289f88030e57e5db121ed8368 Author: jotsetung Date: Tue Sep 6 11:34:52 2016 +0200 Update NEWS commit 16ac3ddeb24f8bcecc7290d00c93a28daeb0ad27 Merge: 4f46f61 5b73c67 Author: jotsetung Date: Tue Sep 6 11:23:04 2016 +0200 Merge branch 'devel' into xcms3 commit 4f46f61127bb7b4fee037b10b57e67a2d070cd1b Author: jotsetung Date: Tue Sep 6 11:04:52 2016 +0200 Add .Rbuildignore and update .gitignore commit d9ba200c61b7d6886f527b3d17ce6361edc89b2a Author: Hendrik Treutler Date: Tue Sep 6 08:51:13 2016 +0200 splitted method 'findPeaks.centWaveWithPredictedIsotopeROIs' into two more modular methods; removed parameter list and added individual parameters instead; added documentation for new methods commit 1bea5114fcce0796bb8f98a9e624317130934d80 Author: jotsetung Date: Mon Sep 5 13:53:27 2016 +0200 Add matchedFilter benchmarking commit 5b73c67688add8718c998763a9d9053ea2885511 Merge: 897da00 71d4d46 Author: Steffen Neumann Date: Mon Sep 5 13:28:58 2016 +0200 Merge branch 'devel' of github.com:sneumann/xcms into devel commit 897da00d22770f3ae8d494133d3fec85ed31aaaa Author: s.neumann Date: Mon Sep 5 11:13:31 2016 +0000 Bump version, add NEWS git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@120725 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 915d8bc1c2d3c7f4ad65ac2c5474f2c055c6e2ae Author: s.neumann Date: Mon Sep 5 11:13:24 2016 +0000 minor bug fix in unit test git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@120724 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 550d3e2dfdb1fdf4dd3ca41f4eaa313a481347c6 Author: s.neumann Date: Mon Sep 5 11:13:16 2016 +0000 Bug fix in case of small m/z ranges from peak picking using centWave and bug fix regarding scantime ranges git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@120723 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 73ac8a908dc445e745f0a3e3c42108621ec27750 Author: s.neumann Date: Mon Sep 5 11:13:08 2016 +0000 Added standard generic git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@120722 bc3139a8-67e5-0310-9ffc-ced21a209358 commit a989bbdc350bd34b3a2606e8b982ce0bf99d2b16 Author: s.neumann Date: Mon Sep 5 11:13:01 2016 +0000 Added function findPeaks.centWaveWithPredictedIsotopeROIs for the sensitive detection of isotope peaks based on predicted isotope ROIs git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@120721 bc3139a8-67e5-0310-9ffc-ced21a209358 commit b688d92f0ac223e6bc19db0140957a9b934a86aa Author: Hendrik Treutler Date: Mon Sep 5 12:48:59 2016 +0200 minor bug fix in unit test commit 1a69592b361794376eb01c28aaa263346acc449d Author: Hendrik Treutler Date: Mon Sep 5 12:40:52 2016 +0200 Bug fix in case of small m/z ranges from peak picking using centWave and bug fix regarding scantime ranges commit 8686fc16075ed7e2ca2b33f6c79e513b43cee92d Author: jotsetung Date: Mon Sep 5 10:51:11 2016 +0200 Update new_features vignette commit 7b72591f03fc429d408a89d1d4f8a92e3376ec10 Author: jotsetung Date: Mon Sep 5 09:59:35 2016 +0200 Add do_detectFeatures_centWave and doc updates o Export do_detectFeatures_centWave. o Add missing roxygen2 documentations. commit c70e5ba9edad767f6428ae441c2cba1d01de48e2 Author: jotsetung Date: Fri Sep 2 09:21:02 2016 +0200 Switch to do_detectFeatures_matchedFilter o findPeaks.matchedFilter calls do_detectFeatures_matchedFilter. o Default for now is to use the original code (discussed in issue #52). o Export useOriginalCode function that allows to switch between old and new implementation (default is old). o Describe discrepancies between old and new code for matchedFilter in the new_features.Rmd vignette. commit 2962d586d6505a6f09c53cf52117571f4b250a8e Author: jotsetung Date: Wed Aug 31 15:05:37 2016 +0200 Prepare all functions for issue #52 o Implement the test function comparing the matchedFilter implementations. o Start writing roxygen documentation for the do_ functions. o Tidy do_ functions up. commit 3ed5a6b9c7bae091a9ce84156bd06eadbf17df48 Author: Hendrik Treutler Date: Wed Aug 31 13:34:13 2016 +0200 Added standard generic commit 37f742eefd85a9e87a9b813516bbaa3b8d5f16ad Merge: efdbe68 71d4d46 Author: Hendrik Treutler Date: Wed Aug 31 09:40:24 2016 +0200 Merge branch 'devel' of https://github.com/Treutler/xcms into devel commit efdbe6828acc3281a907d0385d03b129cfa25f2c Author: htreutle Date: Wed Aug 31 09:14:38 2016 +0200 Added function findPeaks.centWaveWithPredictedIsotopeROIs for the sensitive detection of isotope peaks based on predicted isotope ROIs commit 1d3bb742ee0ea3e4f2b3739a59baf15574e1b1d3 Author: jotsetung Date: Mon Aug 29 12:30:49 2016 +0200 Add benchmarking vignette o Add benchmarking vignette. commit 7f78f064fa8397ecf2af0e9d9a30dac9fac0e37b Author: jotsetung Date: Thu Aug 25 06:25:16 2016 +0200 Fix compilation warnings in obiwarp code o Replace fabs with abs calls for integer variables in the C++ code of obiwarp that threw warnings during package compilation. commit 8f1b40a7d0aaaa51d8dcb709c8a78984445d8857 Author: jotsetung Date: Wed Aug 24 08:38:06 2016 +0200 Add new_functionality vignette o Add vignette describing new and modified functionality in xcms. commit 57b69a902c4cfd1f159c76760f6ab495f0ebb5b8 Author: jotsetung Date: Tue Aug 23 11:32:25 2016 +0200 Export binning functions o Export binYonX, breaks_on_binSize, breaks_on_nBins and imputeLinInterpol functions. o Add documenation (generated by roxygen2) for these functions. o Extensive unit tests for all functions. o Add parameter noInterpolAtEnds to imputeLinInterpol (mentioned in issue #49). commit fa1a0d5825c98ee939b23a3e993c359fe05f8ac3 Merge: 88ec298 71d4d46 Author: jotsetung Date: Tue Aug 23 08:29:33 2016 +0200 Merge branch 'devel' into xcms3 commit 88ec298cce23218ac20ed1c0dabeea73204aaa12 Author: jotsetung Date: Tue Aug 23 08:24:35 2016 +0200 Fix and improve binning functions o Fix breaks calculation for bins (multiplication instead of addition in C-function) resulting in identical break values than R's seq would. o Fix binYonX and imputeLinInterpol to return results identical to profBinM and similar (except bugs reported in issue #46). commit 71d4d46caab55d2eadcba535771d141bf4051837 Merge: 7f9bb05 7949102 Author: Steffen Neumann Date: Mon Aug 22 15:31:15 2016 +0200 Merge branch 'devel' of github.com:sneumann/xcms into devel commit 7f9bb0590b91346a41f2839f392d49eebfab8c34 Author: s.neumann Date: Mon Aug 22 13:30:24 2016 +0000 Temporarily disable vignette with benchmarking. git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@120327 bc3139a8-67e5-0310-9ffc-ced21a209358 commit b4f020db8c5f459d36db18574619c4e34e4e0b81 Author: s.neumann Date: Mon Aug 22 12:45:33 2016 +0000 updated NEWS and bumped version git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@120325 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 3625829bc0953c868f14598eec06512264ec8998 Merge: 100cedc 2fbba30 Author: s.neumann Date: Mon Aug 22 12:45:25 2016 +0000 Merge branch 'xcms3' into devel git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@120324 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 79491025c265337f65a1be98f662aae1f4569334 Merge: b17c615 5219078 Author: Steffen Neumann Date: Mon Aug 22 14:44:50 2016 +0200 fix whitespace merge conflict commit b17c615f7449a444931097a1c936b69fd1253646 Author: Steffen Neumann Date: Mon Aug 22 14:42:34 2016 +0200 updated NEWS and bumped version commit 5f57f336f7c8247a341d30c5314b959a1a4a0130 Merge: 100cedc 2fbba30 Author: Steffen Neumann Date: Mon Aug 22 14:37:09 2016 +0200 Merge branch 'xcms3' into devel commit 100cedc031a2e7b0b935d0d122b7ac5373b3db95 Merge: bc80d6a e429a1b Author: s.neumann Date: Mon Aug 22 12:19:25 2016 +0000 fix merge conflict in NEWS git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@120323 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 5219078a4cd3098395f081776599e52ba6769e68 Merge: bc80d6a e429a1b Author: Steffen Neumann Date: Mon Aug 22 14:18:49 2016 +0200 fix merge conflict in NEWS commit 2fbba3060dae40cd6c1fb625172fc4e68f9ef0e7 Author: jotsetung Date: Thu Aug 11 09:19:41 2016 +0200 Implement binlinbase missing value imputation o Separate binning and missing value imputation from profBin* methods into two functions: binYonX and imputeLinInterpol. o Unit tests to validate that results from profBin* methods and binYonX and imputeLinInterpol match. commit 77345695e4aaa9210723ccd083ed7d1f3b95f710 Author: jotsetung Date: Tue Aug 9 15:05:26 2016 +0200 Add unit test comparing profBinM o Unit test to compare profBinM with binYonX with support for multiple data sub-sets. commit 65d34ce811bd48774db10df922d0d6c90de5638c Author: jotsetung Date: Tue Aug 9 09:51:46 2016 +0200 Add functionality to binYonX o Add support for length(fromIdx) and length(toIdx) > 1: performs the binning for each individual sub-set and returns a list of results. o Add argument returnIndex, which allows to return the index of the max or min value within each bin in x. o Change behaviour of arguments fromX and toX. These are by default NA now and are calculated internally based on the (eventually sub-setted) x values. If provided they allow to manually force the bin-range to be the same for all potential sub-sets. o Update roxygen documentation, add unit tests. commit 379038a7c424bfd20aa85e203ae96e7c8fde4634 Author: jotsetung Date: Mon Aug 8 16:07:25 2016 +0200 Implement binlin imputation for binYonX o Implement the binlin imputation method for missing bin values in the binYonX function. o Add corresponding unit tests and benchmarks. commit c98934013ea9a8521972bf5ef07956130d375f6f Author: jotsetung Date: Mon Aug 8 09:42:08 2016 +0200 Unify binning functions into single C-function o Define a single C-level binning function as entry point from R: binYonX. o Fix logical & and | in C. o Add unit test for profBinLin; that fails due to the bug in profBinLin! o Extend some documentations. commit 900811d5f83825df3940e38f210ce901e9fe4a2f Author: jotsetung Date: Fri Aug 5 08:11:06 2016 +0200 Add matchedFilter do_ function o Implement do_detectFeatures_matchedFilter (issue #35); thus far containing the original code from findPeaks.matchedFilter. o Add tests to compare results for matchedFilter. commit 43c68cc7ca0374cfca6504ba2e6fd83f5a003ec3 Author: jotsetung Date: Thu Aug 4 14:43:58 2016 +0200 max, min, sum and mean for binning function o binYonX supports aggregation of values within bin using min, max, sum and mean. o Add corresponding unit tests. commit 36f612de00b42e7c39a434d24d739a2c2801db05 Author: jotsetung Date: Thu Aug 4 09:41:20 2016 +0200 Binning function allow to shift bins o Add argument to binning function to allow shifting bins by binSize/2 to simulate the profBin method (see also issue #42). o Add benchmarking vignette. commit 54218b5cfb44985ebfdeb473f5adca158bcaf171 Author: jotsetung Date: Thu Aug 4 07:51:46 2016 +0200 Binning funtions return bin mid-point o The C-level binning functions return the bin mid-point. o Add unit tests for binning functions. commit 1aa1165c12c1500458eac3203cc11aa0ef40dfa8 Merge: 75ca47a e429a1b Author: jotsetung Date: Tue Aug 2 10:00:59 2016 +0200 Merge branch 'devel' into xcms3 commit e429a1ba876b35cdf6a7e77a5c528be8f91fb3f7 Author: jotsetung Date: Tue Aug 2 09:54:28 2016 +0200 Fix getXcmsRaw bug reported by Aleksandr o Fix the bug in getXcmsRaw that would eventually not apply retention time correction when reading the raw data (issue #44). commit 75ca47a33adf11ed2bddf81d5fdc2b7445e7ad10 Author: jotsetung Date: Tue Aug 2 08:41:07 2016 +0200 Binning C-function about implemented o Add unit tests and write (not yet exported) documentation. commit 500509aa5851d41101485cee8dd33079e0d1f1e6 Merge: b67dc45 d8cddeb Author: jotsetung Date: Mon Aug 1 08:29:46 2016 +0200 Merge branch 'devel' of https://github.com/sneumann/xcms into devel commit b67dc45a54203a4acf529da5f32aaa35e143d128 Author: jotsetung Date: Mon Aug 1 08:27:55 2016 +0200 Address missing documentation warning. o Fix the missing [ documentation for xcmsSet (issue #43). o Fix two 'partial argument match' notes in R CMD check. commit 508c09507e5a0e5ac5e5df5ca7aba57501101163 Author: jotsetung Date: Mon Aug 1 07:52:16 2016 +0200 Prepare for C-level binning functions o Start implementing binning utilities in C. commit 0f5d3c423dfda64b825883d2f9e862799c10a78b Author: jotsetung Date: Thu Jul 28 13:41:32 2016 +0200 Some documentation updates. o Some updates that (hopefully) clarify the difference between getEIC and rawEIC. commit d8cddebcc8a62c304046e372ec59523d0d160b4f Merge: d7465f6 8e6439e Author: Steffen Neumann Date: Wed Jul 27 16:25:10 2016 +0200 Merge branch 'devel' of github.com:sneumann/xcms into devel commit b7d774bd919d8596342b228c69db7f6f58da14cf Author: jotsetung Date: Wed Jul 27 11:23:03 2016 +0200 Fix findmzROI. See issue #38 commit bc80d6ab546633b771d9a4b76553bd0eae617313 Author: s.neumann Date: Tue Jul 26 12:57:10 2016 +0000 Bump version From: Steffen Neumann git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@119638 bc3139a8-67e5-0310-9ffc-ced21a209358 commit d7465f657fc27b591976d16e7b173e24fc819209 Author: s.neumann Date: Tue Jul 26 12:57:10 2016 +0000 Bump version From: Steffen Neumann git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@119638 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 0976bd26e5defa62bf548a530eb16516325a71a3 Merge: acc52a4 e1d915d Author: s.neumann Date: Tue Jul 26 12:57:02 2016 +0000 Merge remote-tracking branch 'remotes/origin/devel' into devel From: Steffen Neumann git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@119637 bc3139a8-67e5-0310-9ffc-ced21a209358 commit a68d6cac8b51b42e94914e3e7b471dc2fa8560ed Author: s.neumann Date: Tue Jul 26 12:57:02 2016 +0000 Merge remote-tracking branch 'remotes/origin/devel' into devel From: Steffen Neumann git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@119637 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 8e6439e1a6b88df86c6c99c10ed309ab83f99ffb Author: Steffen Neumann Date: Tue Jul 26 14:55:54 2016 +0200 Bump version commit 3a40d763d105846c5b0cc235929fe0934c026269 Merge: acc52a4 e1d915d Author: Steffen Neumann Date: Tue Jul 26 10:50:47 2016 +0200 Merge remote-tracking branch 'remotes/origin/devel' into devel commit e1d915d74272b556e9ba61ad6455403ab8c75fea Author: jotsetung Date: Tue Jul 26 10:10:22 2016 +0200 Update NEWS file. commit ef488cf0cc03e8d2a323c14fb4286b2d08db14d6 Merge: f8aaddc 1fbabb9 Author: jotsetung Date: Tue Jul 26 09:53:19 2016 +0200 Merge branch 'xcms3' into devel commit f8aaddcae90146f34da495ea1472f33f18fb17f7 Author: jotsetung Date: Tue Jul 26 09:52:36 2016 +0200 Add readme.org to .gitignore commit e537216f5075f9739c9e851cfd08a9e4a8138ae3 Author: s.neumann Date: Tue Jul 26 07:16:21 2016 +0000 Use BiocParallel for parallel processing o Use bplapply in getXcmsRaw. o Deprecate xcmsPapply. o Update documentations to include BPPARAM argument. o Import from BiocGenerics and Biobase, remove the definitions of phenoData and phenoData<- generics. o Import from graphics, stats etc to fix 'R CMD check' warnings. git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@119633 bc3139a8-67e5-0310-9ffc-ced21a209358 commit c43e37a7890de080d4ce1b200695a6bbb979014a Author: s.neumann Date: Tue Jul 26 07:16:11 2016 +0000 findPeaks and fillPeaks using BiocParallel o Add xcmsSet2 function and fillPeaks.chrom2 method that use BiocParallel instead of manual parallel processing setup. o Add a unit test comparing the results. git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@119632 bc3139a8-67e5-0310-9ffc-ced21a209358 commit db566567149f571bcc459b10e5215324bef5fbc4 Author: s.neumann Date: Tue Jul 26 07:16:02 2016 +0000 Added some uncommitted mzTab stuff git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@119631 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 115d8fd7560b592fd963282fefb96adbf68b4c55 Author: s.neumann Date: Tue Jul 26 07:15:55 2016 +0000 fixed merge conflict git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@119630 bc3139a8-67e5-0310-9ffc-ced21a209358 commit c3bbb074a6817f6825dda2d740fc149a9f2c46f4 Merge: 55dfbb2 e81b590 Author: Steffen Neumann Date: Tue Jul 26 09:12:37 2016 +0200 Merge branch 'devel' of github.com:sneumann/xcms into devel commit 55dfbb2d639817b1f51bf4fabaa69281a1add4e3 Author: jotsetung Date: Mon Jul 18 14:41:57 2016 +0200 Use BiocParallel for parallel processing o Use bplapply in getXcmsRaw. o Deprecate xcmsPapply. o Update documentations to include BPPARAM argument. o Import from BiocGenerics and Biobase, remove the definitions of phenoData and phenoData<- generics. o Import from graphics, stats etc to fix 'R CMD check' warnings. commit 74d32385367baf7dcb0880486c6f2794e7c2f05a Author: jotsetung Date: Mon Jul 18 13:27:56 2016 +0200 findPeaks and fillPeaks using BiocParallel o Add xcmsSet2 function and fillPeaks.chrom2 method that use BiocParallel instead of manual parallel processing setup. o Add a unit test comparing the results. commit 7cd59c562406eecac77d15ed05bf9d4629c4a0a0 Author: Steffen Neumann Date: Tue May 17 00:20:39 2016 +0200 Added some uncommitted mzTab stuff commit 458fb021a0bf6d5ad3efd88da40475bae01ce8a3 Author: Steffen Neumann Date: Tue Jul 26 09:09:12 2016 +0200 fixed merge conflict commit 1fbabb9783ef3e144ab9a8dee3aaad6f505a24c9 Author: jotsetung Date: Mon Jul 25 15:17:28 2016 +0200 Add centWave do_function. + Implement the do_detectFeatures_centWave function. + Add unit test for do_detectFeatures_centWave. + Code reformatting. commit 72f8d6d69fb9b41f77ad6875a40766bbaa429b07 Author: jotsetung Date: Fri Jul 22 09:02:45 2016 +0200 Move packages from Suggests to Imports + Move packages multtest, MassSpecWavelet and RANN from DESCRIPTION's Suggests to Imports field (issue #34). + Fix warning message in findPeaksPar. commit 6da19f05041ab245f3cd83d04148c2d664b007f6 Author: jotsetung Date: Thu Jul 21 10:37:21 2016 +0200 Fix R CMD check warnings and notes (#32) + Move generics from CleanData.R to AllGenerics.R, methods to methods-xcmsRaw.R + Remove all DUP = FALSE from the .C calls as they are ignored anyways. + Fix bug in fillPeaksChromPar using an index i that does not exist. + Fix bug in fillPeaksChromPar referring to variable 'object' that does not exist. + Fix bug call in group.nearest to undefined variable coreList (change to scoreList). + Move all deprecated functions to Deprecated.R. commit 623c6fdc6700f894fbfb8fa192ba86e200234953 Author: jotsetung Date: Thu Jul 21 10:17:57 2016 +0200 Refactoring for xcmsEIC and xcmsFragments done. commit 09d92f2fc2c2b371c2fc496cf4de87802acdc9b9 Author: jotsetung Date: Thu Jul 21 09:36:08 2016 +0200 Refactor xcmsRaw R source files. + Split methods/functions for xcmsRaw into respective files. + Put all generics into AllGenerics.R commit 6cbe43599ae919b11bfee0de9b6887484c022c00 Author: jotsetung Date: Thu Jul 21 06:45:47 2016 +0200 Done with refactoring of xcmsSet R files + Moved all generic method definitions for xcmsSet and xcmsRaw into AllGenerics.R. + Moved all(?) xcmsSet methods into methods-xcmsSet.R. + Moved all xcmsSet functions into functions-xcmsSet.R. + Reverted the doRUnit.R file. commit a4d09a15aab9fc0e1d9d957ed5709d263d927c93 Author: jotsetung Date: Wed Jul 20 07:45:56 2016 +0200 Add updateObject method for xcmsSet + Add updateObject and validity method for xcmsSet along with corresponding unit tests. + Internal cleanup: move class definitions to DataClasses.R, use roxygen2 to create the Collate field in DESCRIPTION. commit e0d4e36a6db8ffd7a8d6c7753307cc39a33d2355 Merge: 55817bd e81b590 Author: jotsetung Date: Tue Jul 19 08:39:07 2016 +0200 Merge branch 'devel' into xcms3 commit e81b590fd2596829103798e5d8b19e2fdfde2018 Author: jotsetung Date: Mon Jul 18 14:41:57 2016 +0200 Use BiocParallel for parallel processing o Use bplapply in getXcmsRaw. o Deprecate xcmsPapply. o Update documentations to include BPPARAM argument. o Import from BiocGenerics and Biobase, remove the definitions of phenoData and phenoData<- generics. o Import from graphics, stats etc to fix 'R CMD check' warnings. commit c57175f33fc13bfed929530345145edcdcb1849a Author: jotsetung Date: Mon Jul 18 13:27:56 2016 +0200 findPeaks and fillPeaks using BiocParallel o Add xcmsSet2 function and fillPeaks.chrom2 method that use BiocParallel instead of manual parallel processing setup. o Add a unit test comparing the results. commit 55817bd32eb2bae345737d16a24883e527474347 Author: jotsetung Date: Mon Jul 18 13:27:56 2016 +0200 findPeaks and fillPeaks using BiocParallel o Add xcmsSet2 function and fillPeaks.chrom2 method that use BiocParallel instead of manual parallel processing setup. o Add a unit test comparing the results. commit e01074465062a674af92f0e2704073a11899dd1f Author: jotsetung Date: Mon Jul 18 09:04:01 2016 +0200 Add readme.org file. commit fcc1feb555bf6007b0ca2d37bc8f3b6635b40a9d Author: s.neumann Date: Tue May 17 07:41:19 2016 +0000 Add NEWS and bump version git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@117572 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 2c5e8aa4b2ec61dc9c3a121281625830c72879ff Author: s.neumann Date: Tue May 17 07:41:13 2016 +0000 Added some uncommitted mzTab stuff git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@117571 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 48931274f4fd638c8123ed01f10250f0b066f2e4 Author: s.neumann Date: Tue May 17 07:41:06 2016 +0000 First go at mzTab export git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@117570 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 0b11cc3eb8b0e879b2f4ba35c514eb71906b6f85 Author: Steffen Neumann Date: Tue May 17 07:37:54 2016 +0200 Add NEWS and bump version commit 9535218aaf8e52bcd361f1c912375854104e7e76 Author: Steffen Neumann Date: Tue May 17 00:20:39 2016 +0200 Added some uncommitted mzTab stuff commit 89ff2dbf642d5a786c8efc3bee0fcc9467933d15 Author: Steffen Neumann Date: Mon May 16 23:37:04 2016 +0200 First go at mzTab export commit f900b6144c5eb0bbf8ccf4faee5f691861270f1e Author: s.neumann Date: Sun May 15 21:30:54 2016 +0000 The raw CDF/mzXML/mzData/mzML is assumed to have scans sorted by m/z. Instead of throwing an "m/z sort assumption violated !" error, the data is re-read and on-demand sorted by m/z. git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@117517 bc3139a8-67e5-0310-9ffc-ced21a209358 commit 7b38c2d610f66a1fee9d9330119f2b9c04fdf20e Merge: 23c01d7 f9be4f4 Author: s.neumann Date: Sun May 15 21:30:46 2016 +0000 Merge branch 'fixmzsortassumption' into devel git-svn-id: https://hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@117516 bc3139a8-67e5-0310-9ffc-ced21a209358 commit f9be4f4f23c49f56074670658bc9665e093c8f83 Author: Steffen Neumann Date: Fri Apr 1 14:09:29 2016 +0200 Add automatic repair for "m/z sort assumption violated !" error in findPeaks (centWave) From: Steffen Neumann git-svn-id: file:///home/git/hedgehog.fhcrc.org/bioconductor/trunk/madman/Rpacks/xcms@129944 bc3139a8-67e5-0310-9ffc-ced21a209358 --- DESCRIPTION | 5 +- NAMESPACE | 10 +- R/AllGenerics.R | 3 +- R/DataClasses.R | 27 +- R/MPI.R | 4 +- R/do_adjustRtime-functions.R | 9 +- R/do_findChromPeaks-functions.R | 7 +- R/do_groupChromPeaks-functions.R | 7 +- R/functions-Chromatogram.R | 332 ++++++-- R/functions-XCMSnExp.R | 796 +++++++++++------- R/functions-normalization.R | 118 --- R/functions-utils.R | 242 ++++-- R/functions-xcmsRaw.R | 2 +- R/methods-Chromatogram.R | 203 +++-- R/methods-OnDiskMSnExp.R | 23 +- R/methods-XCMSnExp.R | 171 +++- R/methods-xcmsRaw.R | 38 +- R/methods-xcmsSet.R | 17 +- inst/NEWS | 43 + inst/unitTests/runit.Chromatogram.R | 98 ++- inst/unitTests/runit.XCMSnExp.R | 189 ++++- .../runit.do_findChromPeaks_centWave.R | 56 +- inst/unitTests/runit.fillChromPeaks.R | 2 +- inst/unitTests/runit.functions-XCMSnExp.R | 12 + inst/unitTests/runit.functions-utils.R | 53 ++ man/Chromatogram-class.Rd | 66 +- man/XCMSnExp-class.Rd | 10 +- man/extractChromatograms-method.Rd | 88 +- man/extractMsData-method.Rd | 64 ++ man/groupChromPeaks-density.Rd | 4 +- man/plotChromPeakDensity.Rd | 101 +++ man/plotChromatogram.Rd | 115 +++ man/useOriginalCode.Rd | 15 +- tests/doRUnit.R | 3 + vignettes/new_functionality.Rmd | 104 +-- vignettes/new_functionality.org | 127 +-- ...eprocess.Rnw => xcmsPreprocess.Rnw-notrun} | 3 + 37 files changed, 2266 insertions(+), 901 deletions(-) delete mode 100644 R/functions-normalization.R create mode 100644 inst/unitTests/runit.functions-XCMSnExp.R create mode 100644 inst/unitTests/runit.functions-utils.R create mode 100644 man/extractMsData-method.Rd create mode 100644 man/plotChromPeakDensity.Rd create mode 100644 man/plotChromatogram.Rd rename vignettes/{xcmsPreprocess.Rnw => xcmsPreprocess.Rnw-notrun} (99%) diff --git a/DESCRIPTION b/DESCRIPTION index 5a13fa9e9..9002911c1 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: xcms -Version: 1.53.0 -Date: 2017-04-16 +Version: 2.99.1 +Date: 2017-05-10 Title: LC/MS and GC/MS Data Analysis Author: Colin A. Smith , Ralf Tautenhahn , @@ -67,7 +67,6 @@ Collate: 'functions-OnDiskMSnExp.R' 'functions-ProcessHistory.R' 'functions-XCMSnExp.R' - 'functions-normalization.R' 'functions-xcmsEIC.R' 'functions-xcmsFragments.R' 'functions-xcmsRaw.R' diff --git a/NAMESPACE b/NAMESPACE index f397d240d..0ac1d5175 100755 --- a/NAMESPACE +++ b/NAMESPACE @@ -10,7 +10,7 @@ importClassesFrom("Biobase", "AnnotatedDataFrame", "Versioned") importMethodsFrom("Biobase", "classVersion", "classVersion<-", "phenoData", "phenoData<-", "pData", "rowMedians") -importFrom("graphics", "plot", "image", "boxplot") +importFrom("graphics", "plot", "image", "boxplot", "matplot", "rect", "axis") importFrom("mzR", "peaks", "close", "openMSfile", "header") importFrom("lattice", "levelplot", "panel.rect", "panel.levelplot") importFrom("plyr", "rbind.fill") @@ -206,7 +206,10 @@ export( "do_adjustRtime_peakGroups", "processHistoryTypes", "adjustRtimePeakGroups", - "plotAdjustedRtime" + "plotAdjustedRtime", + "plotChromatogram", + "highlightChromPeaks", + "plotChromPeakDensity" ) ## New analysis methods @@ -429,5 +432,6 @@ exportMethods("hasChromPeaks", "productMz", "fillChromPeaks", "as.data.frame", - "dropFilledChromPeaks" + "dropFilledChromPeaks", + "extractMsData" ) diff --git a/R/AllGenerics.R b/R/AllGenerics.R index ff86372d9..46380832b 100644 --- a/R/AllGenerics.R +++ b/R/AllGenerics.R @@ -81,7 +81,8 @@ setGeneric("extraPeaks<-", function(object, value) standardGeneric("extraPeaks<-")) setGeneric("extractChromatograms", function(object, ...) standardGeneric("extractChromatograms")) - +setGeneric("extractMsData", function(object, ...) + standardGeneric("extractMsData")) ## F setGeneric("factorDiag", function(object) standardGeneric("factorDiag")) diff --git a/R/DataClasses.R b/R/DataClasses.R index 800886301..9bde64946 100644 --- a/R/DataClasses.R +++ b/R/DataClasses.R @@ -614,10 +614,11 @@ setClass("CentWaveParam", msg <- c(msg, paste0("'roiList' does not provide ", "all required fields!")) } - if (length(object@roiList) > 0 & - length(object@roiList) != length(object@roiScales)) - msg <- c(msg, paste0("'roiScales' has to have the same", - " length than 'roiList'.")) + if (length(object@roiScales) > 0) { + if (length(object@roiList) != length(object@roiScales)) + msg <- c(msg, paste0("'roiScales' has to have the same", + " length than 'roiList'.")) + } if (length(msg)) msg else @@ -1377,7 +1378,9 @@ NULL #' @seealso The \code{\link{do_groupChromPeaks_density}} core #' API function and \code{\link{group.density}} for the old user interface. #' -#' @seealso \code{\link{featureDefinitions}} and +#' @seealso \code{\link{plotChromPeakDensity}} to plot peak densities and +#' evaluate different algorithm settings. +#' \code{\link{featureDefinitions}} and #' \code{\link{featureValues,XCMSnExp-method}} for methods to access the #' features (i.e. the peak grouping results). #' @@ -2243,13 +2246,21 @@ setClass("MsFeatureData", contains = c("environment", "Versioned"), #' @seealso \code{\linkS4class{xcmsSet}} for the old implementation. #' \code{\link[MSnbase]{OnDiskMSnExp}}, \code{\link[MSnbase]{MSnExp}} #' and \code{\link[MSnbase]{pSet}} for a complete list of inherited methods. +#' #' \code{\link{findChromPeaks}} for available peak detection methods #' returning a \code{XCMSnExp} object as a result. +#' #' \code{\link{groupChromPeaks}} for available peak grouping #' methods and \code{\link{featureDefinitions}} for the method to extract #' the feature definitions representing the peak grouping results. #' \code{\link{adjustRtime}} for retention time adjustment methods. #' +#' \code{\link{extractChromatograms}} to extract MS data as +#' \code{\link{Chromatogram}} objects. +#' +#' \code{\link{extractMsData}} for the method to extract MS data as +#' \code{data.frame}s. +#' #' @rdname XCMSnExp-class #' #' @examples @@ -2415,6 +2426,8 @@ setClass("XCMSnExp", #' @seealso \code{\link{extractChromatograms}} for the method to extract #' \code{Chromatogram} objects from \code{\link{XCMSnExp}} or #' \code{\link[MSnbase]{OnDiskMSnExp}} objects. +#' +#' \code{\link{plotChromatogram}} to plot \code{Chromatogram} objects. setClass("Chromatogram", slots = c( rtime = "numeric", @@ -2430,8 +2443,8 @@ setClass("Chromatogram", prototype = prototype( rtime = numeric(), intensity = numeric(), - mz = c(0, 0), - filterMz = c(0, 0), + mz = c(NA_real_, NA_real_), + filterMz = c(NA_real_, NA_real_), precursorMz = c(NA_real_, NA_real_), productMz = c(NA_real_, NA_real_), fromFile = integer(), diff --git a/R/MPI.R b/R/MPI.R index db770866b..1d4a7b2cf 100644 --- a/R/MPI.R +++ b/R/MPI.R @@ -90,12 +90,12 @@ fillPeaksChromPar <- function(arg) { if (length(params$dataCorrection) > 1) { ## Note: dataCorrection (as set in the xcmsSet function) is either ## 1 for all or for none. - if (any(params$dataCorrection) == 1) + if (any(params$dataCorrection == 1)) lcraw <- stitch(lcraw, AutoLockMass(lcraw)) } if (exists("params$polarity") && length(params$polarity) >0) { - if (length(params$polarity) >0) { + if (length(params$polarity) > 0) { ## Retain wanted polarity only lcraws <- split(lcraw, lcraw@polarity, DROP=TRUE) lcraw <- lcraws[[params$polarity]] diff --git a/R/do_adjustRtime-functions.R b/R/do_adjustRtime-functions.R index 619f13b3a..8a8c51327 100644 --- a/R/do_adjustRtime-functions.R +++ b/R/do_adjustRtime-functions.R @@ -106,6 +106,9 @@ do_adjustRtime_peakGroups <- } else rt <- .getPeakGroupsRtMatrix(peaks, peakIndex, nSamples, missingSample, extraPeaks) + ## Fix for issue #175 + if (length(rt) == 0) + stop("No peak groups found in the data for the provided settings") ## ## Check if we have peak groups with almost the same retention time. If yes ## ## select the best matching peaks among these. ## rtmeds <- rowMedians(rt, na.rm = TRUE) @@ -477,5 +480,9 @@ do_adjustRtime_peakGroups_orig <- function(peaks, peakIndex, rtime, ## retention time that is calculated over ALL peaks within the peak ## group, not only to one peak selected for each sample (for multi ## peak per sample assignments). - rt[order(rowMedians(rt, na.rm = TRUE)), , drop = FALSE] + ## Fix for issue #175 + if (is(rt, "matrix")) { + rt <- rt[order(rowMedians(rt, na.rm = TRUE)), , drop = FALSE] + } + rt } diff --git a/R/do_findChromPeaks-functions.R b/R/do_findChromPeaks-functions.R index 3d2153c81..401e50172 100644 --- a/R/do_findChromPeaks-functions.R +++ b/R/do_findChromPeaks-functions.R @@ -466,7 +466,7 @@ do_findChromPeaks_centWave <- function(mz, int, scantime, valsPerSpect, mzmean <- do.call(mzCenterFun, list(mz = mz.value, intensity = mz.int)) - + ## Compute dppm only if needed dppm <- NA if (verboseColumns) { @@ -980,8 +980,13 @@ do_findChromPeaks_centWave <- function(mz, int, scantime, valsPerSpect, ## @MOD1: Remove mz values for which no intensity was ## measured. Would be better if getEIC returned NA ## if nothing was measured. + mzorig <- mz.value mz.value <- mz.value[mz.int > 0] mz.int <- mz.int[mz.int > 0] + ## Call next to avoid reporting peaks without mz + ## values (issue #165). + if (length(mz.value) == 0) + next ## cat("mz.value: ", paste0(mz.value, collapse = ", "), ## "\n") diff --git a/R/do_groupChromPeaks-functions.R b/R/do_groupChromPeaks-functions.R index d488a534c..c118a2e57 100644 --- a/R/do_groupChromPeaks-functions.R +++ b/R/do_groupChromPeaks-functions.R @@ -114,6 +114,7 @@ do_groupChromPeaks_density <- function(peaks, sampleGroups, densFrom <- rtRange[1] - 3 * bw densTo <- rtRange[2] + 3 * bw + densN <- max(512, 2^(ceiling(log2(diff(rtRange) / (bw / 2))))) endIdx <- 0 num <- 0 gcount <- integer(nSampleGroups) @@ -125,7 +126,8 @@ do_groupChromPeaks_density <- function(peaks, sampleGroups, if (endIdx - startIdx < 0) next curMat <- peaks[startIdx:endIdx, , drop = FALSE] - den <- density(curMat[, "rt"], bw = bw, from = densFrom, to = densTo) + den <- density(curMat[, "rt"], bw = bw, from = densFrom, to = densTo, + n = densN) maxden <- max(den$y) deny <- den$y ## gmat <- matrix(nrow = 5, ncol = 2 + gcount) @@ -240,7 +242,8 @@ do_groupChromPeaks_density_par <- function(peaks, sampleGroups, sampleGroupTbl, minFr, minSmpls, sampleGroupNms, peakOrdr) { den <- density(z[, "rt"], bw = bw, from = rtr[1] - 3 * bw, - to = rtr[2] + 3 * bw) + to = rtr[2] + 3 * bw, + n = max(512, 2^(ceiling(log2(diff(rtr) / (bw / 2)))))) maxden <- max(den$y) deny <- den$y snum <- 0 diff --git a/R/functions-Chromatogram.R b/R/functions-Chromatogram.R index 4ddf44e8e..56b467595 100644 --- a/R/functions-Chromatogram.R +++ b/R/functions-Chromatogram.R @@ -5,30 +5,33 @@ names(.SUPPORTED_AGG_FUN_CHROM) <- "Intensity representing the minimum intensity across the mz range.", "Intensity representing the mean intensity across the mz range.") -##' @title Validation function for Chromatogram objects -##' -##' @description This function can be used instead of the \code{validObject} to -##' check if the chromatogram is valid, without having to call the validity -##' method on all super classes. -##' -##' @param object A \code{Chromatogram} object. -##' -##' @return \code{TRUE} if the \code{object} is valid and the error messages -##' otherwise (i.e. a \code{character}). -##' @author Johannes Rainer -##' @noRd +#' @title Validation function for Chromatogram objects +#' +#' @description This function can be used instead of the \code{validObject} to +#' check if the chromatogram is valid, without having to call the validity +#' method on all super classes. +#' +#' @param object A \code{Chromatogram} object. +#' +#' @return \code{TRUE} if the \code{object} is valid and the error messages +#' otherwise (i.e. a \code{character}). +#' +#' @author Johannes Rainer +#' +#' @noRd validChromatogram <- function(object) { msg <- character() if (length(object@rtime) != length(object@intensity)) msg <- c(msg, "Length of 'rt' and 'intensity' have to match!") - if (is.unsorted(object@mz)) - msg <- c(msg, "'mz' has to be increasingly ordered!") if (is.unsorted(object@rtime)) msg <- c(msg, paste0("'rtime' has to be increasingly ordered!")) if (length(object@mz) > 0 & length(object@mz) != 2) msg <- c(msg, paste0("'mz' is supposed to contain the ", "minimum and maximum mz values for the ", "chromatogram.")) + if (!all(is.na(object@mz))) + if (is.unsorted(object@mz)) + msg <- c(msg, "'mz' has to be increasingly ordered!") if (length(object@filterMz) > 0 & length(object@filterMz) != 2) msg <- c(msg, paste0("'filterMz' is supposed to contain the ", "minimum and maximum mz values of the filter", @@ -54,44 +57,45 @@ validChromatogram <- function(object) { else msg } -##' @description \code{Chromatogram}: create an instance of the -##' \code{Chromatogram} class. -##' -##' @param rtime \code{numeric} with the retention times (length has to be equal -##' to the length of \code{intensity}). -##' -##' @param intensity \code{numeric} with the intensity values (length has to be -##' equal to the length of \code{rtime}). -##' -##' @param mz \code{numeric(2)} representing the mz value range (min, max) -##' on which the chromatogram was created. This is supposed to contain the -##' \emph{real} range of mz values in contrast to the \code{filterMz} below. -##' If not applicable use \code{mzrange = c(0, 0)}. -##' -##' @param filterMz \code{numeric(2)} representing the mz value range (min, -##' max) that was used to filter the original object on mz dimension. If not -##' applicable use \code{filterMz = c(0, 0)}. -##' -##' @param precursorMz \code{numeric(2)} for SRM/MRM transitions. -##' Represents the mz of the precursor ion. See details for more information. -##' -##' @param productMz \code{numeric(2)} for SRM/MRM transitions. -##' Represents the mz of the product. See details for more information. -##' -##' @param fromFile \code{integer(1)} the index of the file within the -##' \code{\link{OnDiskMSnExp}} or \code{\link{XCMSnExp}} from which the -##' chromatogram was extracted. -##' -##' @param aggregationFun \code{character} string specifying the function that -##' was used to aggregate intensity values for the same retention time across the -##' mz range. Supported are \code{"sum"} (total ion chromatogram), \code{"max"} -##' (base peak chromatogram), \code{"min"} and \code{"mean"}. -##' -##' @slot .__classVersion__,rtime,intensity,mz,filterMz,precursorMz,productMz,fromFile,aggregationFun See corresponding parameter above. -##' -##' @rdname Chromatogram-class +#' @description \code{Chromatogram}: create an instance of the +#' \code{Chromatogram} class. +#' +#' @param rtime \code{numeric} with the retention times (length has to be equal +#' to the length of \code{intensity}). +#' +#' @param intensity \code{numeric} with the intensity values (length has to be +#' equal to the length of \code{rtime}). +#' +#' @param mz \code{numeric(2)} representing the mz value range (min, max) +#' on which the chromatogram was created. This is supposed to contain the +#' \emph{real} range of mz values in contrast to the \code{filterMz} below. +#' If not applicable use \code{mzrange = c(0, 0)}. +#' +#' @param filterMz \code{numeric(2)} representing the mz value range (min, +#' max) that was used to filter the original object on mz dimension. If not +#' applicable use \code{filterMz = c(0, 0)}. +#' +#' @param precursorMz \code{numeric(2)} for SRM/MRM transitions. +#' Represents the mz of the precursor ion. See details for more information. +#' +#' @param productMz \code{numeric(2)} for SRM/MRM transitions. +#' Represents the mz of the product. See details for more information. +#' +#' @param fromFile \code{integer(1)} the index of the file within the +#' \code{\link{OnDiskMSnExp}} or \code{\link{XCMSnExp}} from which the +#' chromatogram was extracted. +#' +#' @param aggregationFun \code{character} string specifying the function that +#' was used to aggregate intensity values for the same retention time across +#' the mz range. Supported are \code{"sum"} (total ion chromatogram), +#' \code{"max"} (base peak chromatogram), \code{"min"} and \code{"mean"}. +#' +#' @slot .__classVersion__,rtime,intensity,mz,filterMz,precursorMz,productMz,fromFile,aggregationFun See corresponding parameter above. +#' +#' @rdname Chromatogram-class Chromatogram <- function(rtime = numeric(), intensity = numeric(), - mz = c(0, 0), filterMz = c(0, 0), + mz = c(NA_real_, NA_real_), + filterMz = c(NA_real_, NA_real_), precursorMz = c(NA_real_, NA_real_), productMz = c(NA_real_, NA_real_), fromFile = integer(), @@ -107,3 +111,229 @@ Chromatogram <- function(rtime = numeric(), intensity = numeric(), precursorMz = range(precursorMz), productMz = range(productMz), fromFile = as.integer(fromFile), aggregationFun = aggregationFun)) } + +#' @title Plot Chromatogram objects +#' +#' @description \code{plotChromatogram} creates a chromatogram plot for a +#' single \code{Chromatogram} object or a \code{list} of +#' \code{\link{Chromatogram}} objects (one line for each +#' \code{\link{Chromatogram}}/sample). +#' +#' @details The \code{plotChromatogram} function allows to efficiently plot +#' the chromatograms of several samples into a single plot. +#' +#' @param x For \code{plotChromatogram}: \code{list} of +#' \code{\link{Chromatogram}} objects. Such as extracted from an +#' \code{\link{XCMSnExp}} object by the \code{\link{extractChromatograms}} +#' method. +#' For \code{highlightChromPeaks}: \code{XCMSnExp} object with the detected +#' peaks. +#' +#' @param rt For \code{plotChromatogram}: \code{numeric(2)}, optional parameter +#' to subset each \code{Chromatogram} by retention time prior to plotting. +#' Alternatively, the plot could be subsetted by passing a \code{xlim} +#' parameter. +#' For \code{highlightChromPeaks}: \code{numeric(2)} with the +#' retention time range from which peaks should be extracted and plotted. +#' +#' @param col For \code{plotChromatogram}: color definition for each +#' line/sample. Has to have the same length as samples/elements in \code{x}, +#' otherwise \code{col[1]} is recycled to generate a vector of +#' \code{length(x)}. +#' For \code{highlightChromPeaks}: color to be used to fill the +#' rectangle. +#' +#' @param lty the line type. See \code{\link[graphics]{plot}} for more details. +#' +#' @param type the plotting type. See \code{\link[graphics]{plot}} for more +#' details. +#' For \code{highlightChromPeaks}: \code{character(1)} defining how the peak +#' should be highlighted: \code{type = "rect"} draws a rectangle +#' representing the peak definition, \code{type = "point"} indicates a +#' chromatographic peak with a single point at the position of the peak's +#' \code{"rt"} and \code{"maxo"}. +#' +#' @param xlab \code{character(1)} with the label for the x-axis. +#' +#' @param ylab \code{character(1)} with the label for the y-axis. +#' +#' @param main The title for the plot. For \code{plotChromatogram}: if +#' \code{main = NULL} the mz range of the \code{Chromatogram} object(s) will +#' be used as the title. +#' +#' @param ... additional parameters to the \code{\link{matplot}} or \code{plot} +#' function. +#' +#' @seealso \code{\link{extractChromatograms}} for how to extract a list of +#' \code{\link{Chromatogram}} objects from an \code{\link{XCMSnExp}} +#' objects. +#' +#' @author Johannes Rainer +#' +#' @examples +#' +#' ## Perform a fast peak detection. +#' library(xcms) +#' library(faahKO) +#' faahko_3_files <- c(system.file('cdf/KO/ko15.CDF', package = "faahKO"), +#' system.file('cdf/KO/ko16.CDF', package = "faahKO"), +#' system.file('cdf/KO/ko18.CDF', package = "faahKO")) +#' +#' od <- readMSData2(faahko_3_files) +#' +#' od <- findChromPeaks(od, param = CentWaveParam(snthresh = 20, noise = 10000)) +#' +#' rtr <- c(2600, 2750) +#' mzr <- c(344, 344) +#' chrs <- extractChromatograms(od, rt = rtr, mz = mzr) +#' +#' ## Plot a single chromatogram +#' plotChromatogram(chrs[[1]]) +#' +#' ## Plot all chromatograms at once, using different colors for each. +#' plotChromatogram(chrs, col = c("#FF000080", "#00FF0080", "#0000FF80"), lwd = 2) +#' +#' ## Highlight identified chromatographic peaks. +#' highlightChromPeaks(od, rt = rtr, mz = mzr, +#' col = c("#FF000005", "#00FF0005", "#0000FF05"), +#' border = c("#FF000040", "#00FF0040", "#0000FF40")) +#' +plotChromatogram <- function(x, rt, col = "#00000060", + lty = 1, type = "l", xlab = "retention time", + ylab = "intensity", main = NULL, ...) { + if (!is.list(x) & !is(x, "Chromatogram")) + stop("'x' should be a Chromatogram object or a list of Chromatogram", + " objects.") + if (is(x, "Chromatogram")) + x <- list(x) + isOK <- lapply(x, function(z) { + if (is(z, "Chromatogram")) { + return(TRUE) + } else { + if (is.na(z)) + return(TRUE) + } + FALSE + }) + if (any(!unlist(isOK))) + stop("if 'x' is a list it should only contain Chromatogram objects") + ## Subset the Chromatogram objects if rt provided. + if (!missing(rt)) { + rt <- range(rt) + x <- lapply(x, function(z) { + if (is(z, "Chromatogram")) + filterRt(z, rt = rt) + }) + } + if (length(col) != length(x)) { + col <- rep(col[1], length(x)) + } + ## If main is NULL use the mz range. + if (is.null(main)) { + mzr <- range(lapply(x, mz), na.rm = TRUE, finite = TRUE) + main <- paste0(format(mzr, digits = 7), collapse = " - ") + } + ## Number of measurements we've got per chromatogram. This can be different + ## between samples, from none (if not a single measurement in the rt/mz) + ## to the number of data points that were actually measured. + lens <- unique(lengths(x)) + max_len <- max(lens) + max_len_vec <- rep_len(NA, max_len) + ## Generate the matrix of rt values, columns are samples, rows retention + ## time values. Fill each column with NAs up to the maximum number of values + ## we've got in a sample/file. + rts <- do.call(cbind, lapply(x, function(z) { + cur_len <- length(z) + if (cur_len == 0) + max_len_vec + else { + ## max_len_vec[,] <- NA ## don't need that. get's copied. + max_len_vec[seq_len(cur_len)] <- rtime(z) + max_len_vec + } + })) + ## Same for the intensities. + ints <- do.call(cbind, lapply(x, function(z) { + cur_len <- length(z) + if (length(z) == 0) + max_len_vec + else { + ## max_len_vec[,] <- NA ## don't need that. get's copied. + max_len_vec[seq_len(cur_len)] <- intensity(z) + max_len_vec + } + })) + ## Define the x and y limits + x_lim <- c(0, 1) + y_lim <- c(0, 1) + if (all(is.na(rts))) + if (!missing(rt)) + x_lim <- range(rt) + else + x_lim <- range(rts, na.rm = TRUE, finite = TRUE) + if (!all(is.na(ints))) + y_lim <- range(ints, na.rm = TRUE, finite = TRUE) + ## Identify columns that have only NAs in either intensity or rt - these + ## will not be plotted. + keepCol <- which(apply(ints, MARGIN = 2, function(z) any(!is.na(z))) | + apply(rts, MARGIN = 2, function(z) any(!is.na(z)))) + ## Finally plot the data. + if (length(keepCol)) { + matplot(x = rts[, keepCol, drop = FALSE], + y = ints[, keepCol, drop = FALSE], type = type, lty = lty, + col = col[keepCol], xlab = xlab, ylab = ylab, main = main, + ...) + } else + plot(x = 3, y = 3, pch = NA, xlab = xlab, ylab = ylab, main = main, + xlim = x_lim, ylim = y_lim) +} + + + +#' @description The \code{highlightChromPeaks} function adds chromatographic +#' peak definitions to an existing plot, such as one created by the +#' \code{plotChromatograms} function. +#' +#' @param mz \code{numeric(2)} with the mz range from which the peaks should +#' be extracted and plotted. +#' +#' @param border colors to be used to color the border of the rectangles. Has to +#' be equal to the number of samples in \code{x}. +#' +#' @param lwd \code{numeric(1)} defining the width of the line/border. +#' +#' @rdname plotChromatogram +highlightChromPeaks <- function(x, rt, mz, + border = rep("00000040", length(fileNames(x))), + lwd = 1, col = NA, type = c("rect", "point"), + ...) { + type <- match.arg(type) + if (missing(rt)) + rt <- c(-Inf, Inf) + if (missing(mz)) + mz <- c(-Inf, Inf) + if (!is(x, "XCMSnExp")) + stop("'x' has to be a XCMSnExp object") + if (!hasChromPeaks(x)) + stop("'x' does not contain any detected peaks") + pks <- chromPeaks(x, rt = rt, mz = mz, ppm = 0) + if (length(col) != length(fileNames(x))) + col <- rep(col[1], length(fileNames(x))) + if (length(border) != length(fileNames(x))) + border <- rep(border[1], length(fileNames(x))) + if (length(pks)) { + if (type == "rect") + rect(xleft = pks[, "rtmin"], xright = pks[, "rtmax"], + ybottom = rep(0, nrow(pks)), ytop = pks[, "maxo"], + border = border[pks[, "sample"]], lwd = lwd, + col = col[pks[, "sample"]]) + if (type == "point") { + if (any(is.na(col))) + col <- border + ## Draw a star at the position defined by the "rt" column + points(x = pks[, "rt"], y = pks[, "maxo"], + col = col[pks[, "sample"]], ...) + } + } +} + diff --git a/R/functions-XCMSnExp.R b/R/functions-XCMSnExp.R index e9cf3cab0..e756540bf 100644 --- a/R/functions-XCMSnExp.R +++ b/R/functions-XCMSnExp.R @@ -1,12 +1,14 @@ #' @include DataClasses.R functions-utils.R -##' Takes a XCMSnExp and drops ProcessHistory steps from the @.processHistory -##' slot matching the provided type. -##' -##' @param num which should be dropped? If \code{-1} all matching will be dropped, -##' otherwise just the most recent num. -##' @return The XCMSnExp input object with selected ProcessHistory steps dropped. -##' @noRd +#' @description Takes a XCMSnExp and drops ProcessHistory steps from the +#' @.processHistory slot matching the provided type. +#' +#' @param num which should be dropped? If \code{-1} all matching will be dropped, +#' otherwise just the most recent num. +#' +#' @return The XCMSnExp input object with selected ProcessHistory steps dropped. +#' +#' @noRd dropProcessHistories <- function(x, type, num = -1) { x@.processHistory <- dropProcessHistoriesList(processHistory(x), type = type, num = num) @@ -32,8 +34,9 @@ dropProcessHistoriesList <- function(x, type, num = -1) { return(x) } -##' Convert an XCMSnExp to an xcmsSet. -##' @noRd +#' Convert an XCMSnExp to an xcmsSet. +#' +#' @noRd .XCMSnExp2xcmsSet <- function(from) { if (any(msLevel(from) > 1)) stop("Coercing an XCMSnExp with MS level > 1 is not yet supported!") @@ -117,122 +120,29 @@ dropProcessHistoriesList <- function(x, type, num = -1) { return(xs) } -##' @title Extract spectra subsets -##' -##' Extract subsets of spectra matching the given mz and retention time ranges. -##' @noRd -.spectraSubsets <- function(x, rtrange, mzrange) { - ## o Should allow to provide single ranges, but also matrices of rtrange - ## and/or mzranges. - ## o Perform the data fetching by file. - ## o Return the (mz subsetted) spectra by file and by ranges. - ## o Since data should be processed on a by-file basis representation of the - ## result as a list (files) of list(ranges) of list(spectra) seems to be - ## best. - ## SEE runit.XCMSnExp.R, -} - -## This is somewhat similar to the getEIC, just that it extracts for each -## mz/rt range pair a data.frame with rt, mz, intensity per sample. -## This version works on a single rt/mz range pair at a time. -## CHECK: -## 1) mz range outside. -## 2) rt range outside. -.extractMsData <- function(x, rtrange, mzrange) { - ## Subset the OnDiskMSnExp - fns <- fileNames(x) - subs <- filterMz(filterRt(x, rt = rtrange), mz = mzrange) - if (length(subs) == 0) { - return(NULL) - } - fromF <- base::match(fileNames(subs), fns) - ## Now extract mz-intensity pairs from each spectrum. - ## system.time( - ## suppressWarnings( - ## dfs <- spectrapply(tmp, as.data.frame) - ## ) - ## ) ## 0.73sec - ## system.time( - suppressWarnings( - dfs <- spectrapply(subs, FUN = function(z) { - if (peaksCount(z)) - return(base::data.frame(rt = rep_len(rtime(z), length(z@mz)), - as.data.frame(z))) - else - return(base::data.frame(rt = numeric(), mz = numeric(), - i = integer())) - }) - ) - ## Now I want to rbind the spectrum data frames per file - ff <- fromFile(subs) - L <- split(dfs, f = ff) - L <- lapply(L, do.call, what = rbind) - ## Put them into a vector same length that we have files. - res <- vector(mode = "list", length = length(fns)) - res[fromF] <- L - return(res) -} - -## Same as above, but we're applying a function - or none. -.sliceApply <- function(x, FUN = NULL, rtrange, mzrange) { - fns <- fileNames(x) - if (is(x, "XCMSnExp")) { - ## Now, the filterRt might get heavy for XCMSnExp objects if we're - ## filtering also the chromatographic peaks and features! - msfd <- new("MsFeatureData") - if (hasAdjustedRtime(x)) { - ## just copy over the retention time. - msfd$adjustedRtime <- x@msFeatureData$adjustedRtime - } - lockEnvironment(msfd, bindings = TRUE) - x@msFeatureData <- msfd - ## with an XCMSnExp without chrom. peaks and features filterRt - ## should be faster. - } - subs <- filterMz(filterRt(x, rt = rtrange), mz = mzrange) - if (base::length(subs) == 0) { - return(list()) - } - fromF <- base::match(fileNames(subs), fns) - suppressWarnings( - res <- spectrapply(subs, FUN = FUN) - ) - ## WARN: fromFile reported within the Spectra might not be correct!!! - return(res) -} - -##' @description Extract a chromatogram from an \code{OnDiskMSnExp} or -##' \code{XCMSnExp} subsetting to the provided retention time range -##' (\code{rt}) and using the function \code{aggregationFun} to aggregate -##' intensity values for the same retention time across the mz range -##' (\code{mz}). -##' -##' @param x An \code{OnDiskMSnExp} or \code{XCMSnExp} object. -##' -##' @param rt \code{numeric(2)} providing the lower and upper retention time. It -##' is also possible to submit a \code{numeric(1)} in which case \code{range} is -##' called on it to transform it to a \code{numeric(2)}. -##' -##' @param mz \code{numeric(2)} providing the lower and upper mz value for -##' the mz range. It is also possible to submit a \code{numeric(1)} in which case -##' \code{range} is called on it to transform it to a \code{numeric(2)}. -##' -##' @param aggregationFun The function to be used to aggregate intensity values -##' across the mz range for the same retention time. -##' -##' @param ... Additional arguments to be passed to the object's \code{rtime} -##' call. -##' -##' @return A \code{list} with the \code{Chromatogram} objects. If no data was -##' present for the specified \code{rtrange} and \code{mzrange} the function -##' returns a \code{list} of length \code{0}. -##' -##' @author Johannes Rainer -##' @noRd -.extractChromatogram <- function(x, rt, mz, aggregationFun = "sum", ...) { - if (!any(.SUPPORTED_AGG_FUN_CHROM == aggregationFun)) - stop("'aggregationFun' should be one of ", - paste0("'", .SUPPORTED_AGG_FUN_CHROM, "'", collapse = ", ")) +#' @description Extract a \code{data.frame} of retention time, mz and intensity +#' values from each file/sample in the provided rt-mz range. +#' +#' @note Ideally, \code{x} should be an \code{OnDiskMSnExp} object as subsetting +#' of a \code{XCMSnExp} object is more costly (removing of preprocessing +#' results, restoring data etc). If retention times reported in the +#' featureData are replaced by adjusted retention times, these are set +#' in the Spectrum objects as retention time. +#' +#' @param x An \code{OnDiskMSnExp} object. +#' +#' @param rt \code{numeric(2)} with the retention time range from which the +#' data should be extracted. +#' +#' @param mz \code{numeric(2)} with the mz range. +#' +#' @param return A \code{list} with length equal to the number of files and +#' each element being a \code{data.frame} with the extracted values. +#' +#' @noRd +#' +#' @author Johannes Rainer +.extractMsData <- function(x, rt, mz) { if (!missing(rt)) { rt <- range(rt, na.rm = TRUE) if (length(rt) != 2) @@ -247,203 +157,350 @@ dropProcessHistoriesList <- function(x, type, num = -1) { ## Subset the object based on rt and mz range. subs <- filterMz(filterRt(x, rt = rt), mz = mz) if (length(subs) == 0) { - return(list()) + ## Return a list with empty data.frames + empty_df <- data.frame(rt = numeric(), mz = numeric(), i = integer()) + return(lapply(1:length(fileNames(x)), FUN = function(z){empty_df})) } - ## Now, call spectrapply on the object to return the data we need from each - ## Spectrum: the aggregated intensity values per spectrum and the mz value - ## range. - ## Note: we're returning NA in case we don't have a valid measurement for a - ## retention time within the specified mz suppressWarnings( - res <- spectrapply(subs, FUN = function(z) { + dfs <- spectrapply(subs, FUN = function(z) { if (!z@peaksCount) - return(c(NA_real_, NA_real_, NA_real_)) - ## return(list()) - return(c(range(z@mz), do.call(aggregationFun, list(z@intensity)))) + return(data.frame(rt = numeric(), mz = numeric(), + i = integer())) + data.frame(rt = rep_len(z@rt, length(z@mz)), + mz = z@mz, i = z@intensity) }) ) - ## Do I want to drop the names? - nas <- unlist(lapply(res, function(z) is.na(z[3])), use.names = FALSE) - if (all(nas)) - return(list()) - ## not_empty <- base::which(base::lengths(res) > 0) - ## if (length(not_empty)) { - ## res <- split(res[not_empty], f = fromFile(subs)[not_empty]) - ## rtm <- split(rtime(subs, ...)[not_empty], f = fromFile(subs)[not_empty]) - res <- split(res, f = fromFile(subs)) - rtm <- split(rtime(subs, ...), f = fromFile(subs)) - ## We want to have one Chromatogram per file. - ## Let's use a simple for loop here - no need for an mapply (yet). - resL <- vector("list", length(res)) - for (i in 1:length(res)) { - allVals <- unlist(res[[i]], use.names = FALSE) - idx <- seq(3, length(allVals), by = 3) - mzr <- range(allVals[-idx], na.rm = TRUE, finite = TRUE) - ## Or should we drop the names completely? - ints <- allVals[idx] - names(ints) <- names(rtm[[i]]) - resL[[i]] <- Chromatogram(rtime = rtm[[i]], - intensity = ints, mz = mzr, - filterMz = fmzr, - fromFile = as.integer(names(res)[i]), - aggregationFun = aggregationFun) - } - return(resL) - ## } else { - ## return(list()) - ## } -} + fns <- fileNames(x) + fromF <- base::match(fileNames(subs), fns) -#' Integrates the intensities for chromatograpic peak(s). This is supposed to be -#' called by the fillChromPeaks method. -#' -#' @note Use one of .getPeakInt2 or .getPeakInt3 instead! -#' -#' @param object An \code{XCMSnExp} object representing a single sample. -#' @param peakArea A \code{matrix} with the peak definition, i.e. \code{"rtmin"}, -#' \code{"rtmax"}, \code{"mzmin"} and \code{"mzmax"}. -#' @noRd -.getPeakInt <- function(object, peakArea) { - if (length(fileNames(object)) != 1) - stop("'object' should be an XCMSnExp for a single file!") - res <- numeric(nrow(peakArea)) - for (i in 1:length(res)) { - rtr <- peakArea[i, c("rtmin", "rtmax")] - chr <- extractChromatograms(object, - rt = rtr, - mz = peakArea[i, c("mzmin", "mzmax")])[[1]] - if (length(chr)) - res[i] <- sum(intensity(chr), na.rm = TRUE) * - ((rtr[2] - rtr[1]) / (length(chr) - 1)) - else - res[i] <- NA_real_ - } - return(unname(res)) + ## Now I want to rbind the spectrum data frames per file + L <- split(dfs, f = fromFile(subs)) + L <- lapply(L, do.call, what = rbind) + ## Put them into a vector same length that we have files. + res <- vector(mode = "list", length = length(fns)) + res[fromF] <- L + return(res) } -#' Integrates the intensities for chromatograpic peak(s). This is supposed to be -#' called by the fillChromPeaks method. + +#' @description This function extracts chromatograms efficiently for multiple +#' rt and mz ranges by loading the data per file only once and performing +#' the mz subsetting on the already loaded Spectrum1 classes. #' -#' @note This reads the full data first and does the subsetting later in R. +#' @note Ensure that x is an OnDiskMSnExp and not an e.g. XCMSnExp object. +#' Subsetting etc an XCMSnExp might take longer. #' -#' @param object An \code{XCMSnExp} object representing a single sample. -#' @param peakArea A \code{matrix} with the peak definition, i.e. \code{"rtmin"}, -#' \code{"rtmax"}, \code{"mzmin"} and \code{"mzmax"}. -#' @noRd -.getPeakInt2 <- function(object, peakArea) { - if (length(fileNames(object)) != 1) - stop("'object' should be an XCMSnExp for a single file!") - res <- numeric(nrow(peakArea)) - spctr <- spectra(object, BPPARAM = SerialParam()) - mzs <- lapply(spctr, mz) - valsPerSpect <- lengths(mzs) - ints <- unlist(lapply(spctr, intensity), use.names = FALSE) - rm(spctr) - mzs <- unlist(mzs, use.names = FALSE) - rtim <- rtime(object) - for (i in 1:length(res)) { - rtr <- peakArea[i, c("rtmin", "rtmax")] - mtx <- .rawMat(mz = mzs, int = ints, scantime = rtim, - valsPerSpect = valsPerSpect, rtrange = rtr, - mzrange = peakArea[i, c("mzmin", "mzmax")]) - if (length(mtx)) { - if (!all(is.na(mtx[, 3]))) { - ## How to calculate the area: (1)sum of all intensities / (2)by - ## the number of data points (REAL ones, considering also NAs) - ## and multiplied with the (3)rt width. - ## (1) sum(mtx[, 3], na.rm = TRUE) - ## (2) sum(rtim >= rtr[1] & rtim <= rtr[2]) - 1 ; if we used - ## nrow(mtx) here, which would correspond to the non-NA - ## intensities within the rt range we don't get the same results - ## as e.g. centWave. - ## (3) rtr[2] - rtr[1] - res[i] <- sum(mtx[, 3], na.rm = TRUE) * - ((rtr[2] - rtr[1]) / - (sum(rtim >= rtr[1] & rtim <= rtr[2]) - 1)) - } else { - res[i] <- NA_real_ - } - } else { - res[i] <- NA_real_ - } - } - return(unname(res)) -} - -#' Integrates the intensities for chromatograpic peak(s). This is supposed to be -#' called by the fillChromPeaks method. +#' @param rt \code{matrix} with two columns and number of rows corresponding to +#' the number of ranges to extract. +#' +#' @param mz \code{matrix} with two columns and number of rows corresponding to +#' the number of ranges to extract. nrow of rt and mz have to match. #' -#' @note This reads the full data first and does the subsetting later in R. This -#' function uses the C getEIC function. +#' @param x OnDiskMSnExp object from which to extract the chromatograms. +#' +#' @param return.type either \code{"list"} or \code{"matrix"} to return the +#' result as a list or as a matrix. +#' +#' @param missingValue value to be used as intensity if no signal was measured +#' for a given rt. #' -#' @param object An \code{XCMSnExp} object representing a single sample. -#' @param peakArea A \code{matrix} with the peak definition, i.e. \code{"rtmin"}, -#' \code{"rtmax"}, \code{"mzmin"} and \code{"mzmax"}. +#' @return A \code{list} or \code{matrix} with the \code{Chromatogram} objects. +#' If no data was present for the specified \code{rtrange} and +#' \code{mzrange} the function returns a \code{list} of length \code{0}. +#' The \code{list} is arranged first by ranges and then by files, such that +#' \code{result[[1]]} returns a \code{list} of \code{Chromatogram} objects +#' for the same rt/mz range. +#' For \code{return.type = "matrix"} a \code{matrix} is returned with rows +#' corresponding to ranges and columns to files/samples. \code{result[, 1]} +#' will thus return a \code{list} of \code{Chromatogram} objects for the +#' first sample/file, while \code{result[1, ]} returns a \code{list} of +#' \code{Chromatogram} objects for the same rt/mz range for all files. +#' +#' @author Johannes Rainer #' #' @noRd -.getPeakInt3 <- function(object, peakArea) { - if (length(fileNames(object)) != 1) - stop("'object' should be an XCMSnExp for a single file!") - if (nrow(peakArea) == 0) { - return(numeric()) +.extractMultipleChromatograms <- function(x, rt, mz, aggregationFun = "sum", + BPPARAM = bpparam(), + return.type = c("list", "matrix"), + missingValue = NA_real_) { + return.type <- match.arg(return.type) + missingValue <- as.numeric(missingValue) + if (!any(.SUPPORTED_AGG_FUN_CHROM == aggregationFun)) + stop("'aggregationFun' should be one of ", + paste0("'", .SUPPORTED_AGG_FUN_CHROM, "'", collapse = ", ")) + ## Ensure we're working on MS1 only! + x <- filterMsLevel(x, 1) + if (length(x) == 0) + return(list()) + nranges <- 1 + if (missing(rt)) + rt <- matrix(c(-Inf, Inf), nrow = 1) + if (missing(mz)) + mz <- matrix(c(-Inf, Inf), nrow = 1) + if (!missing(rt)) { + if (ncol(rt) != 2) + stop("'rt' has to be a matrix with two columns") + ## Replicate if nrow rt is 1 to match nrow of mz. + if (nrow(rt) == 1) + rt <- matrix(rep(rt, nrow(mz)), ncol = 2, byrow = TRUE) } - res <- matrix(ncol = 4, nrow = nrow(peakArea)) - res <- numeric(nrow(peakArea)) - spctr <- spectra(object, BPPARAM = SerialParam()) - mzs <- lapply(spctr, mz) - valsPerSpect <- lengths(mzs) - scanindex <- valueCount2ScanIndex(valsPerSpect) ## Index vector for C calls - ints <- unlist(lapply(spctr, intensity), use.names = FALSE) - rm(spctr) - mzs <- unlist(mzs, use.names = FALSE) - rtim <- rtime(object) - for (i in 1:length(res)) { - rtr <- peakArea[i, c("rtmin", "rtmax")] - sr <- c(min(which(rtim >= rtr[1])), max(which(rtim <= rtr[2]))) - eic <- .Call("getEIC", mzs, ints, scanindex, - as.double(peakArea[i, c("mzmin", "mzmax")]), - as.integer(sr), as.integer(length(scanindex)), - PACKAGE = "xcms") - if (length(eic$intensity)) { - ## How to calculate the area: (1)sum of all intensities / (2)by - ## the number of data points (REAL ones, considering also NAs) - ## and multiplied with the (3)rt width. - if (!all(is.na(eic$intensity)) && !all(eic$intensity == 0)) { - res[i] <- sum(eic$intensity, na.rm = TRUE) * - ((rtr[2] - rtr[1]) / (length(eic$intensity) - 1)) - } else { - res[i] <- NA_real_ + if (!missing(mz)) { + if (ncol(mz) != 2) + stop("'mz' has to be a matrix with two coliumns") + if (nrow(mz) == 1) + mz <- matrix(rep(mz, nrow(rt)), ncol = 2, byrow = TRUE) + } + if (nrow(rt) != nrow(mz)) + stop("dimensions of 'rt' and 'mz' have to match") + ## Identify indices of all spectra that are within the rt ranges. + rtimes <- rtime(x) + + ## 1) Subset x keeping all spectra that fall into any of the provided rt + ## ranges. + keep_idx <- unlist(apply(rt, MARGIN = 1, function(z) + which(rtimes >= z[1] & rtimes <= z[2])), use.names = FALSE) + keep_idx <- sort(unique(as.integer(keep_idx))) + if (length(keep_idx) == 0) + return(list()) + subs <- x[keep_idx] + + ## 2) Call the final subsetting on each file separately. + subs_by_file <- splitByFile(subs, f = factor(seq_along(fileNames(subs)))) + suppressWarnings( + res <- bpmapply( + subs_by_file, + seq_along(fileNames(subs)), + FUN = function(cur_sample, cur_file, rtm, mzm, aggFun) { + ## Load all spectra for that file. applies also any proc steps + sps <- spectra(cur_sample) + rts <- rtime(cur_sample) + cur_res <- vector("list", nrow(rtm)) + ## Loop through rt and mz. + for (i in 1:nrow(rtm)) { + ## - Select all spectra within that range and call a + ## function on them that does first filterMz and then + ## aggregate the values per spectrum. + in_rt <- rts >= rtm[i, 1] & rts <= rtm[i, 2] + ## Return an empty Chromatogram if there is no spectrum/scan + ## within the retention time range. + if (!any(in_rt)) { + cur_res[[i]] <- Chromatogram( + filterMz = mzm[i, ], + fromFile = as.integer(cur_file), + aggregationFun = aggFun) + next + } + cur_sps <- lapply( + sps[in_rt], + function(spct, filter_mz, aggFun) { + spct <- filterMz(spct, filter_mz) + ## Now aggregate the values. + if (!spct@peaksCount) + return(c(NA_real_, NA_real_, missingValue)) + return(c(range(spct@mz, na.rm = TRUE, finite = TRUE), + do.call( + aggFun, + list(spct@intensity, na.rm = TRUE)))) + }, filter_mz = mzm[i, ], aggFun = aggFun) + ## Now build the Chromatogram class. + allVals <- unlist(cur_sps, use.names = FALSE) + idx <- seq(3, length(allVals), by = 3) + ## Or should we drop the names completely? + ints <- allVals[idx] + names(ints) <- names(cur_sps) + ## Don't return a Chromatogram object if no values. + if (!all(is.na(ints))) { + cur_res[[i]] <- Chromatogram( + rtime = rts[in_rt], + intensity = ints, + mz = range(allVals[-idx], na.rm = TRUE, + finite = TRUE), + filterMz = mzm[i, ], + fromFile = as.integer(cur_file), + aggregationFun = aggFun) + } else { + ## If no measurement if non-NA, still report the NAs and + ## use the filter mz as mz. + cur_res[[i]] <- Chromatogram( + rtime = rts[in_rt], + intensity = ints, + mz = mzm[i, ], + filterMz = mzm[i, ], + fromFile = as.integer(cur_file), + aggregationFun = aggFun) + } + } + cur_res + }, MoreArgs = list(rtm = rt, mzm = mz, aggFun = aggregationFun), + BPPARAM = BPPARAM, SIMPLIFY = FALSE) + ) + ## Ensure that the lists have the same length than there are samples! + fns <- fileNames(x) + fromF <- base::match(fileNames(subs), fns) + + ## If we've got some files in which we don't have any signal in any range, + ## fill it with empty Chromatograms. This ensures that the result has + ## ALWAYS the same length than there are samples. + if (length(res) != length(fns)) { + res_all_files <- vector(mode = "list", length = length(fns)) + res_all_files[fromF] <- res + empties <- which(lengths(res_all_files) == 0) + ## fill these + for (i in 1:length(empties)) { + empty_list <- vector(mode = "list", length = nrow(rt)) + for(j in 1:nrow(rt)) { + empty_list[j] <- Chromatogram(filterMz = mz[i, ], + fromFile = as.integer(i), + aggregationFun = aggregationFun) } - } else { - res[i] <- NA_real_ + res_all_files[[empties[i]]] <- empty_list + } + res <- res_all_files + } + ## Now I need to re-arrange the result. + if (return.type == "list") { + ## Got [[file]][[range]], but want to have [[range]][[file]] + final_res <- vector("list", nrow(rt)) + for (i in 1:nrow(rt)) { + final_res[[i]] <- lapply(res, FUN = `[[`, i) } + if (nrow(rt) == 1) + final_res <- final_res[[1]] + } + if (return.type == "matrix") { + final_res <- do.call(cbind, res) } - return(unname(res)) + final_res } -#' Integrates the intensities for chromatograpic peak(s). This is supposed to be -#' called by the fillChromPeaks method. +## #' @description Integrates the intensities for chromatograpic peak(s). This is +## #' supposed to be called by the fillChromPeaks method. +## #' +## #' @note This reads the full data first and does the subsetting later in R. +## #' +## #' @param object An \code{XCMSnExp} object representing a single sample. +## #' +## #' @param peakArea A \code{matrix} with the peak definition, i.e. \code{"rtmin"}, +## #' \code{"rtmax"}, \code{"mzmin"} and \code{"mzmax"}. +## #' +## #' @noRd +## .getPeakInt2 <- function(object, peakArea) { +## if (length(fileNames(object)) != 1) +## stop("'object' should be an XCMSnExp for a single file!") +## res <- numeric(nrow(peakArea)) +## spctr <- spectra(object, BPPARAM = SerialParam()) +## mzs <- lapply(spctr, mz) +## valsPerSpect <- lengths(mzs) +## ints <- unlist(lapply(spctr, intensity), use.names = FALSE) +## rm(spctr) +## mzs <- unlist(mzs, use.names = FALSE) +## rtim <- rtime(object) +## for (i in 1:length(res)) { +## rtr <- peakArea[i, c("rtmin", "rtmax")] +## mtx <- .rawMat(mz = mzs, int = ints, scantime = rtim, +## valsPerSpect = valsPerSpect, rtrange = rtr, +## mzrange = peakArea[i, c("mzmin", "mzmax")]) +## if (length(mtx)) { +## if (!all(is.na(mtx[, 3]))) { +## ## How to calculate the area: (1)sum of all intensities / (2)by +## ## the number of data points (REAL ones, considering also NAs) +## ## and multiplied with the (3)rt width. +## ## (1) sum(mtx[, 3], na.rm = TRUE) +## ## (2) sum(rtim >= rtr[1] & rtim <= rtr[2]) - 1 ; if we used +## ## nrow(mtx) here, which would correspond to the non-NA +## ## intensities within the rt range we don't get the same results +## ## as e.g. centWave. +## ## (3) rtr[2] - rtr[1] +## res[i] <- sum(mtx[, 3], na.rm = TRUE) * +## ((rtr[2] - rtr[1]) / +## (sum(rtim >= rtr[1] & rtim <= rtr[2]) - 1)) +## } else { +## res[i] <- NA_real_ +## } +## } else { +## res[i] <- NA_real_ +## } +## } +## return(unname(res)) +## } + +## #' @description Integrates the intensities for chromatograpic peak(s). This is +## #' supposed to be called by the fillChromPeaks method. +## #' +## #' @note This reads the full data first and does the subsetting later in R. This +## #' function uses the C getEIC function. +## #' +## #' @param object An \code{XCMSnExp} object representing a single sample. +## #' +## #' @param peakArea A \code{matrix} with the peak definition, i.e. \code{"rtmin"}, +## #' \code{"rtmax"}, \code{"mzmin"} and \code{"mzmax"}. +## #' +## #' @noRd +## .getPeakInt3 <- function(object, peakArea) { +## if (length(fileNames(object)) != 1) +## stop("'object' should be an XCMSnExp for a single file!") +## if (nrow(peakArea) == 0) { +## return(numeric()) +## } +## res <- matrix(ncol = 4, nrow = nrow(peakArea)) +## res <- numeric(nrow(peakArea)) +## spctr <- spectra(object, BPPARAM = SerialParam()) +## mzs <- lapply(spctr, mz) +## valsPerSpect <- lengths(mzs) +## scanindex <- valueCount2ScanIndex(valsPerSpect) ## Index vector for C calls +## ints <- unlist(lapply(spctr, intensity), use.names = FALSE) +## rm(spctr) +## mzs <- unlist(mzs, use.names = FALSE) +## rtim <- rtime(object) +## for (i in 1:length(res)) { +## rtr <- peakArea[i, c("rtmin", "rtmax")] +## sr <- c(min(which(rtim >= rtr[1])), max(which(rtim <= rtr[2]))) +## eic <- .Call("getEIC", mzs, ints, scanindex, +## as.double(peakArea[i, c("mzmin", "mzmax")]), +## as.integer(sr), as.integer(length(scanindex)), +## PACKAGE = "xcms") +## if (length(eic$intensity)) { +## ## How to calculate the area: (1)sum of all intensities / (2)by +## ## the number of data points (REAL ones, considering also NAs) +## ## and multiplied with the (3)rt width. +## if (!all(is.na(eic$intensity)) && !all(eic$intensity == 0)) { +## res[i] <- sum(eic$intensity, na.rm = TRUE) * +## ((rtr[2] - rtr[1]) / (length(eic$intensity) - 1)) +## } else { +## res[i] <- NA_real_ +## } +## } else { +## res[i] <- NA_real_ +## } +## } +## return(unname(res)) +## } + + +#' @description Integrates the intensities for chromatograpic peak(s). This is +#' supposed to be called by the fillChromPeaks method. #' #' @note This reads the full data first and does the subsetting later in R. #' #' @param object An \code{XCMSnExp} object representing a single sample. #' -#' @param peakArea A \code{matrix} with the peak definition, i.e. \code{"rtmin"}, -#' \code{"rtmax"}, \code{"mzmin"} and \code{"mzmax"}. +#' @param peakArea A \code{matrix} with the peak definition, i.e. +#' \code{"rtmin"}, \code{"rtmax"}, \code{"mzmin"} and \code{"mzmax"}. #' #' @param sample_idx \code{integer(1)} with the index of the sample in the -#' object. +#' object. #' #' @param mzCenterFun Name of the function to be used to calculate the mz value. -#' Defaults to \code{weighted.mean}, i.e. the intensity weighted mean mz. +#' Defaults to \code{weighted.mean}, i.e. the intensity weighted mean mz. #' #' @param cn \code{character} with the names of the result matrix. #' #' @return A \code{matrix} with at least columns \code{"mz"}, \code{"rt"}, -#' \code{"into"} and \code{"maxo"} with the by intensity weighted mean of mz, -#' rt or the maximal intensity in the area, the integrated signal in the area -#' and the maximal signal in the area. +#' \code{"into"} and \code{"maxo"} with the by intensity weighted mean of +#' mz, rt or the maximal intensity in the area, the integrated signal in +#' the area and the maximal signal in the area. +#' #' @noRd .getChromPeakData <- function(object, peakArea, sample_idx, mzCenterFun = "weighted.mean", @@ -932,3 +989,166 @@ plotAdjustedRtime <- function(object, col = "#00000080", lty = 1, type = "l", } } +#' @title Plot chromatographic peak density along the retention time axis +#' +#' @description Plot the density of chromatographic peaks along the retention +#' time axis and indicate which peaks would be grouped into the same feature +#' based using the \emph{peak density} correspondence method. Settings for +#' the \emph{peak density} method can be passed with an +#' \code{\link{PeakDensityParam}} object to parameter \code{param}. +#' +#' @details The \code{plotChromPeakDensity} function allows to evaluate +#' different settings for the \emph{peak density} on an mz slice of +#' interest (e.g. containing chromatographic peaks corresponding to a known +#' metabolite). +#' The plot shows the individual peaks that were detected within the +#' specified \code{mz} slice at their retention time (x-axis) and sample in +#' which they were detected (y-axis). The density function is plotted as a +#' black line. Parameters for the \code{density} function are taken from the +#' \code{param} object. Grey rectangles indicate which chromatographic peaks +#' would be grouped into a feature by the \emph{peak density} correspondence +#' method. Parameters for the algorithm are also taken from \code{param}. +#' See \code{\link{groupChromPeaks-density}} for more information about the +#' algorithm and its supported settings. +#' +#' @param object A \code{\link{XCMSnExp}} object with identified +#' chromatographic peaks. +#' +#' @param mz \code{numeric(2)} defining an mz range for which the peak density +#' should be plotted. +#' +#' @param rt \code{numeric(2)} defining an optional rt range for which the +#' peak density should be plotted. Defaults to the absolute retention time +#' range of \code{object}. +#' +#' @param param \code{\link{PeakDensityParam}} from which parameters for the +#' \emph{peak density} correspondence algorithm can be extracted. +#' +#' @param col Color to be used for the individual samples. Length has to be 1 +#' or equal to the number of samples in \code{object}. +#' +#' @param xlab \code{character(1)} with the label for the x-axis. +#' +#' @param ylab \code{character(1)} with the label for the y-axis. +#' +#' @param xlim \code{numeric(2)} representing the limits for the x-axis. +#' Defaults to the range of the \code{rt} parameter. +#' +#' @param ... Additional parameters to be passed to the \code{plot} function. +#' +#' @return The function is called for its side effect, i.e. to create a plot. +#' +#' @author Johannes Rainer +#' +#' @seealso \code{\link{groupChromPeaks-density}} for details on the +#' \emph{peak density} correspondence method and supported settings. +#' +#' @examples +#' +#' ## Below we perform first a peak detection (using the centWave +#' ## method) on some of the test files from the faahKO package. +#' library(faahKO) +#' library(xcms) +#' fls <- dir(system.file("cdf/KO", package = "faahKO"), recursive = TRUE, +#' full.names = TRUE) +#' +#' ## Reading 2 of the KO samples +#' raw_data <- readMSData2(fls[1:2]) +#' +#' ## Perform the peak detection using the centWave method. +#' res <- findChromPeaks(raw_data, param = CentWaveParam(noise = 1000)) +#' +#' ## Align the samples using obiwarp +#' res <- adjustRtime(res, param = ObiwarpParam()) +#' +#' ## Plot the chromatographic peak density for a specific mz range to evaluate +#' ## different peak density correspondence settings. +#' mzr <- c(305.05, 305.15) +#' +#' plotChromPeakDensity(res, mz = mzr, param = PeakDensityParam(), pch = 16) +#' +#' ## Use a larger bandwidth +#' plotChromPeakDensity(res, mz = mzr, param = PeakDensityParam(bw = 60), +#' pch = 16) +#' ## Neighboring peaks are now fused into one. +#' +#' ## Require the chromatographic peak to be present in all samples of a group +#' plotChromPeakDensity(res, mz = mzr, pch = 16, +#' param = PeakDensityParam(minFraction = 1)) +plotChromPeakDensity <- function(object, mz, rt, param = PeakDensityParam(), + col = "#00000080", xlab = "retention time", + ylab = "sample", xlim = range(rt), ...) { + if (missing(object)) + stop("Required parameter 'object' is missing") + if (!is(object, "XCMSnExp")) + stop("'object' must be an XCMSnExp object") + if (!hasChromPeaks(object)) + stop("No chromatographic peaks present in 'object'") + if (missing(mz)) + mz <- c(-Inf, Inf) + if (missing(rt)) + rt <- range(rtime(object)) + mz <- range(mz) + rt <- range(rt) + ## Get all the data we require. + nsamples <- length(fileNames(object)) + if (length(col) != nsamples) + col <- rep_len(col[1], nsamples) + pks <- chromPeaks(object, mz = mz, rt = rt) + if (nrow(pks)) { + ## Extract parameters from the param object + bw = bw(param) + ## That's Jan Stanstrup's fix (issue #161). + densN <- max(512, 2^(ceiling(log2(diff(rt) / (bw / 2))))) + sample_groups <- sampleGroups(param) + if (length(sample_groups) == 0) + sample_groups <- rep(1, nsamples) + if (length(sample_groups) != nsamples) + stop("If provided, the 'sampleGroups' parameter in the 'param' ", + "class has to have the same length than there are samples ", + "in 'object'") + sample_groups_table <- table(sample_groups) + dens_from <- rt[1] - 3 * bw + dens_to <- rt[2] + 3 * bw + dens <- density(pks[, "rt"], bw = bw, from = dens_from, to = dens_to, + n = densN) + yl <- c(0, max(dens$y)) + ypos <- seq(from = 0, to = yl[2], length.out = nsamples) + ## Plot the peaks as points. + plot(x = pks[, "rt"], y = ypos[pks[, "sample"]], xlim = xlim, + col = col[pks[, "sample"]], xlab = xlab, yaxt = "n", ylab = ylab, + main = paste0(format(mz, digits = 7), collapse = " - "), ...) + axis(side = 2, at = ypos, labels = 1:nsamples) + points(x = dens$x, y = dens$y, type = "l") + ## Estimate what would be combined to a feature + ## Code is taken from do_groupChromPeaks_density + dens_max <- max(dens$y) + dens_y <- dens$y + snum <- 0 + while(dens_y[max_y <- which.max(dens_y)] > dens_max / 20 && + snum < maxFeatures(param)) { + feat_range <- xcms:::descendMin(dens_y, max_y) + dens_y[feat_range[1]:feat_range[2]] <- 0 + feat_idx <- which(pks[, "rt"] >= dens$x[feat_range[1]] & + pks[, "rt"] <= dens$x[feat_range[2]]) + tt <- table(sample_groups[pks[feat_idx, "sample"]]) + if (!any(tt / sample_groups_table[names(tt)] >= + minFraction(param) & tt >= minSamples(param))) + next + rect(xleft = min(pks[feat_idx, "rt"]), ybottom = 0, + xright = max(pks[feat_idx, "rt"]), ytop = yl[2], + border = "#00000040", col = "#00000020") + } + } else { + plot(3, 3, pch = NA, xlim = rt, xlab = xlab, + main = paste0(format(mz, digits = 7), collapse = " - ")) + } +} + +## Plot the chromatographic peaks for a file in a two dimensional plot. +## plotChromPeakImage... +## @description Plots the + +## Find mz ranges with multiple peaks per sample. +## Use the density distribution for that? with a bandwidth = 0.001, check +## density method for that... diff --git a/R/functions-normalization.R b/R/functions-normalization.R deleted file mode 100644 index 5f1c7fb47..000000000 --- a/R/functions-normalization.R +++ /dev/null @@ -1,118 +0,0 @@ -#' @include DataClasses.R functions-utils.R - - -#' @title Fit linear model row-wise to a matrix or data.frame -#' -#' @description Simple function to fit linear models row-wise to the provided -#' data. -#' -#' @details For \code{method = "lmrob"} robust regression is performed using -#' the \code{\link[robustbase]{lmrob}} function with settings -#' \code{settings = "KS2014"} and \code{method = "SMDB"}. -#' The function will perform by default parallel fitting of the models -#' based on the global parallel processing settings. -#' -#' @note Between batch correction in the form of \code{y ~ idx * batch} is -#' currently problematic, because we don't yet check if there are too few -#' values within each batch. -#' -#' @param formula \code{formula} representing the model. -#' -#' @param data \code{data.frame} containing the data to be fitted (e.g. the -#' \code{pData} of an \code{\link{XCMSnExp}} object. -#' -#' @param y \code{matrix} or \code{data.frame} with the response variable. The -#' model is fit to each row of this matrix (which can be e.g. the -#' \code{\link{featureValues}} matrix). -#' -#' @param minVals \code{integer(1)} defining the minimum number of values to be -#' used for the fitting. Model fitting is skipped for rows in \code{y} with -#' less than \code{minVals} non-NA values. -#' -#' @param method \code{character} defining the method/function to be used for -#' model fitting. Allowed values are \code{"lm"} for least squares -#' regression and \code{"lmrob"} for robust regression using the -#' \code{\link[robustbase]{lmrob}} function. -#' -#' @param BPPARAM optional parameter specifying parallel processing settings. -#' -#' @return A \code{list} with the fitted linear models or \code{NULL} for rows -#' with too few data points. -#' -#' @noRd -#' -#' @author Johannes Rainer -fitModel <- function(formula, data, y, minVals = 4, - method = c("lm", "lmrob"), BPPARAM = bpparam()) { - method <- match.arg(method, c("lm", "lmrob")) - if (missing(formula) || !is(formula, "formula")) - stop("'formula' has to be submitted and should be a formula!") - if (missing(data) || !is(data, "data.frame")) - stop("'data' has to be a 'data.frame'!") - if (missing(y)) - stop("'y' is missing with no default.") - if (ncol(y) != nrow(data)) - stop("ncol(y) has to match nrow(data)!") - ## Check that 'data' contains the variables we're looking for. - vars <- all.vars(formula) - if (vars[1] != "y") - stop("'formula' should start with 'y ~'") - if (!all(vars[-1] %in% colnames(data))) - stop("All of the variables from 'formula' have to be present in 'data'") - ## data shouldn't contain a column y. - if (any(colnames(data) == "y")) - stop("'data' should not contain a column named 'y'") - ## Done with checking. - force(y) - force(data) - force(formula) - force(minVals) - force(method) - force(BPPARAM) - ## Subset data to contain only explanatory variables - data <- data[, vars[-1], drop = FALSE] - if (is.null(rownames(y))) - rownames(y) <- 1:nrow(y) - y <- split.data.frame(y, f = rownames(y)) - ## Determine fetures we skip because of too few data points. - do_em <- which(unlist(lapply(y, function(z) sum(!is.na(z)) >= minVals))) - res <- vector("list", length(y)) - names(res) <- names(y) - sttngs <- list() - if (method == "lmrob") { - ## Force use of the KS2014 settings in lmrob and increase the - ## scale-finding iterations to avoid some of the warnings. - ## sttngs <- robustbase::lmrob.control("KS2014") - ## sttngs$maxit.scale <- 10000 - ## sttngs$k.max <- 10000 - ## sttngs$refine.tol <- 1e-7 - } - if (length(do_em)) { - ## fit the model - res[do_em] <- bplapply(y[do_em], FUN = function(z, formula., data., - minVals., lmeth, - sttngs) { - ## TODO: need to check what happens if we're also performing between - ## batch correction and we have too few samples per batch! - ## ## Removing all missing values - could eventually skip that. - ## z <- as.numeric(z) - ## not_na <- !is.na(z) - ## data. <- droplevels(data.frame(y = z[not_na], - ## data.[not_na, , drop = FALSE])) - data. <- data.frame(y = as.numeric(z), data.) - if (lmeth == "lm") - return(lm(formula., data = data., model = FALSE)) - if (lmeth == "lmrob") { - ## set.seed(123) - ## return(robustbase::lmrob(formula., data = data., model = FALSE, - ## setting = sttngs)) - } - if (lmeth == "rlm") - stop("Not yet implemented") - ## return(MASS::rlm(formula., data = data.)) - }, formula. = formula, data. = data, minVals. = minVals, lmeth = method, - sttngs = sttngs, BPPARAM = BPPARAM) - } - res -} - diff --git a/R/functions-utils.R b/R/functions-utils.R index 3f26387cc..5915f5207 100644 --- a/R/functions-utils.R +++ b/R/functions-utils.R @@ -4,16 +4,21 @@ ############################################################ ## valueCount2ScanIndex ## -## @description Simple helper function that converts the number of values -## per scan/spectrum to an integer vector that can be passed to the base -## xcms functions/downstream C functions. -## -## @title Create index vector for internal C calls -## @param valCount Numeric vector representing the number of values per -## spectrum. -## @return An integer vector with the index (0-based) in the mz or intensity -## vectors indicating the start of a spectrum. -## @author Johannes Rainer +#' @title Create index vector for internal C calls +#' +#' @description Simple helper function that converts the number of values +#' per scan/spectrum to an integer vector that can be passed to the base +#' xcms functions/downstream C functions. +#' +#' @param valCount Numeric vector representing the number of values per +#' spectrum. +#' +#' @return An integer vector with the index (0-based) in the mz or intensity +#' vectors indicating the start of a spectrum. +#' +#' @author Johannes Rainer +#' +#' @noRd valueCount2ScanIndex <- function(valCount){ ## Convert into 0 based. valCount <- cumsum(valCount) @@ -27,24 +32,27 @@ valueCount2ScanIndex <- function(valCount){ ## code instead of the new implementations. ## This sets options. ## -##' @title Enable usage of old xcms code -##' -##' @description This function allows to enable the usage of old, partially -##' deprecated code from xcms by setting a corresponding global option. See -##' details for functions affected. -##' -##' @note Usage of old code is strongly dicouraged. This function is thought -##' to be used mainly in the transition phase from xcms to xcms version 3. -##' @details The functions/methods that will be affected by this are: -##' \itemize{ -##' \item \code{\link{do_findChromPeaks_matchedFilter}} -##' } -##' @param x logical(1) to specify whether or not original -##' old code should be used in corresponding functions. If not provided the -##' function simply returns the value of the global option. -##' @return logical(1) indicating whether old code is being -##' used. -##' @author Johannes Rainer +#' @title Enable usage of old xcms code +#' +#' @description This function allows to enable the usage of old, partially +#' deprecated code from xcms by setting a corresponding global option. See +#' details for functions affected. +#' +#' @note Usage of old code is strongly dicouraged. This function is thought +#' to be used mainly in the transition phase from xcms to xcms version 3. +#' +#' @details The functions/methods that will be affected by this are: +#' \itemize{ +#' \item \code{\link{do_findChromPeaks_matchedFilter}} +#' } +#' +#' @param x logical(1) to specify whether or not original +#' old code should be used in corresponding functions. If not provided the +#' function simply returns the value of the global option. +#' +#' @return logical(1) indicating whether old code is being used. +#' +#' @author Johannes Rainer useOriginalCode <- function(x) { if (missing(x)) { res <- options()$BioC$xcms$useOriginalCode @@ -69,13 +77,19 @@ useOriginalCode <- function(x) { ## matchedFilter = ".matchedFilter_orig" ## ) -##' @title Copy the content from an environment to another one -##' This function copies the content of an environment into another one. -##' @param env environment from which to copy. -##' @param inheritLocks logical(1) whether the locking status should be copied -##' too -##' @return an env. -##' @noRd +#' @title Copy the content from an environment to another one +#' +#' @description This function copies the content of an environment into another +#' one. +#' +#' @param env environment from which to copy. +#' +#' @param inheritLocks logical(1) whether the locking status should be copied +#' too. +#' +#' @return an env. +#' +#' @noRd .copy_env <- function(env, inheritLocks = FALSE) { new_e <- new.env(parent = emptyenv()) eNames <- ls(env, all.names = TRUE) @@ -101,48 +115,48 @@ useOriginalCode <- function(x) { ############################################################ ## .createProfileMatrix -##' @title Create the profile matrix -##' -##' @description This function creates a \emph{profile} matrix, i.e. a rt times -##' m/z matrix of aggregated intensity values with values aggregated within -##' bins along the m/z dimension. -##' -##' @details This is somewhat the successor function for the deprecated -##' \code{profBin} methods (\code{profBinM}, \code{profBinLinM}, -##' \code{profBinLinBaseM} and \code{profIntLin}). -##' -##' @param mz Numeric representing the m/z values across all scans/spectra. -##' -##' @param int Numeric representing the intensity values across all -##' scans/spectra. -##' -##' @param valsPerSpect Numeric representing the number of measurements for each -##' scan/spectrum. -##' -##' @param method A character string specifying the profile matrix generation -##' method. Allowed are \code{"bin"}, \code{"binlin"}, -##' \code{"binlinbase"} and \code{"intlin"}. -##' -##' @param step Numeric specifying the size of the m/z bins. -##' -##' @param baselevel Numeric specifying the base value. -##' -##' @param basespace Numeric. -##' -##' @param mzrange. numeric(2) optionally specifying the mz value range -##' for binning. This is to adopt the old profStepPad<- method used for -##' obiwarp retention time correction that did the binning from -##' whole-number limits. -##' -##' @param returnBreaks logical(1): hack to return the breaks of the bins. -##' Setting this to TRUE causes the function to return a \code{list} with -##' elements \code{"$profMat"} and \code{"breaks"}. -##' -##' @param baseValue numeric(1) defining the value to be returned if no signal -##' was found in the corresponding bin. Defaults to 0 for backward -##' compatibility. -##' -##' @noRd +#' @title Create the profile matrix +#' +#' @description This function creates a \emph{profile} matrix, i.e. a rt times +#' m/z matrix of aggregated intensity values with values aggregated within +#' bins along the m/z dimension. +#' +#' @details This is somewhat the successor function for the deprecated +#' \code{profBin} methods (\code{profBinM}, \code{profBinLinM}, +#' \code{profBinLinBaseM} and \code{profIntLin}). +#' +#' @param mz Numeric representing the m/z values across all scans/spectra. +#' +#' @param int Numeric representing the intensity values across all +#' scans/spectra. +#' +#' @param valsPerSpect Numeric representing the number of measurements for each +#' scan/spectrum. +#' +#' @param method A character string specifying the profile matrix generation +#' method. Allowed are \code{"bin"}, \code{"binlin"}, +#' \code{"binlinbase"} and \code{"intlin"}. +#' +#' @param step Numeric specifying the size of the m/z bins. +#' +#' @param baselevel Numeric specifying the base value. +#' +#' @param basespace Numeric. +#' +#' @param mzrange. numeric(2) optionally specifying the mz value range +#' for binning. This is to adopt the old profStepPad<- method used for +#' obiwarp retention time correction that did the binning from +#' whole-number limits. +#' +#' @param returnBreaks logical(1): hack to return the breaks of the bins. +#' Setting this to TRUE causes the function to return a \code{list} with +#' elements \code{"$profMat"} and \code{"breaks"}. +#' +#' @param baseValue numeric(1) defining the value to be returned if no signal +#' was found in the corresponding bin. Defaults to 0 for backward +#' compatibility. +#' +#' @noRd .createProfileMatrix <- function(mz, int, valsPerSpect, method, step = 0.1, baselevel = NULL, basespace = NULL, @@ -236,3 +250,77 @@ useOriginalCode <- function(x) { .featureIDs <- function(x) { sprintf(paste0("FT%0", ceiling(log10(x + 1L)), "d"), 1:x) } + +#' @description Expands stretches of TRUE values in \code{x} by one on both +#' sides. +#' +#' @note The return value for a \code{NA} is always \code{FALSE}. +#' +#' @param x \code{logical} vector. +#' +#' @author Johannes Rainer +#' +#' @noRd +.grow_trues <- function(x) { + previous <- NA + x_new <- rep_len(FALSE, length(x)) + for (i in 1:length(x)) { + if (is.na(x[i])) { + previous <- NA + next + } + ## If current element is TRUE + if (x[i]) { + x_new[i] <- TRUE + ## if last element was FALSE, set last element to TRUE + if (!is.na(previous) && !previous) + x_new[i - 1] <- TRUE + } else { + ## if previous element was TRUE, set current to TRUE. + if (!is.na(previous) && previous) + x_new[i] <- TRUE + } + previous <- x[i] + } + x_new +} + +#' @title Weighted mean around maximum +#' +#' @describe Calculate a weighted mean of the values around the value with the +#' largest weight. \code{x} could e.g. be mz values and \code{w} the +#' corresponding intensity values. +#' +#' @param x \code{numeric} vector from which the weighted mean should be +#' calculated. +#' +#' @param w \code{numeric} of same length than \code{x} with the weights. +#' +#' @param i \code{integer(1)} defining the number of data points left and right +#' of the index with the largest weight that should be considered for the +#' weighted mean calculation. +#' +#' @return The weighted mean value. +#' +#' @author Johannes Rainer +#' +#' @noRd +#' +#' @examples +#' +#' mz <- c(124.0796, 124.0812, 124.0828, 124.0843, 124.0859, 124.0875, +#' 124.0890, 124.0906, 124.0922, 124.0938, 124.0953, 124.0969) +#' ints <- c(10193.8, 28438.0, 56987.6, 85107.6, 102531.6, 104262.6, +#' 89528.8, 61741.2, 33485.8, 14146.6, 5192.2, 1630.2) +#' +#' plot(mz, ints) +#' +#' ## What would be found by the max: +#' abline(v = mz[which.max(ints)], col = "grey") +#' ## What does the weighted mean around apex return: +#' abline(v = weightedMeanAroundApex(mz, ints, i = 2), col = "blue") +weightedMeanAroundApex <- function(x, w = rep(1, length(x)), i = 1) { + max_idx <- which.max(w) + seq_idx <- max(1, max_idx - i):min(length(x), max_idx + i) + weighted.mean(x[seq_idx], w[seq_idx]) +} diff --git a/R/functions-xcmsRaw.R b/R/functions-xcmsRaw.R index 3f7f7d11a..b2476294e 100644 --- a/R/functions-xcmsRaw.R +++ b/R/functions-xcmsRaw.R @@ -47,7 +47,7 @@ xcmsRaw <- function(filename, profstep = 1, profmethod = "bin", 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) + message("Provided scanrange was adjusted to ", scanrange[1]," - ", scanrange[2]) } if (!is.null(rawdata$acquisitionNum)) { ## defined only for mzData and mzXML diff --git a/R/methods-Chromatogram.R b/R/methods-Chromatogram.R index c816c495c..61dae643d 100644 --- a/R/methods-Chromatogram.R +++ b/R/methods-Chromatogram.R @@ -1,4 +1,4 @@ -#' @include DataClasses.R functions-Chromatogram.R +#' @include DataClasses.R functions-Chromatogram.R functions-utils.R setMethod("initialize", "Chromatogram", function(.Object, ...) { classVersion(.Object)["Chromatogram"] <- "0.0.1" @@ -6,7 +6,7 @@ setMethod("initialize", "Chromatogram", function(.Object, ...) { }) -##' @rdname Chromatogram-class +#' @rdname Chromatogram-class setMethod("show", "Chromatogram", function(object) { cat("Object of class: ", class(object), "\n", sep = "") if (length(object@aggregationFun)) @@ -15,80 +15,84 @@ setMethod("show", "Chromatogram", function(object) { cat("length of object: ", length(object@rtime), "\n", sep = "") cat("from file: ", object@fromFile, "\n", sep = "") cat("mz range: [", object@mz[1], ", ", object@mz[2], "]\n", sep = "") - rtr <- range(object@rtime) - cat("rt range: [", rtr[1], ", ", rtr[2], "]\n", sep = "") + if (length(object@rtime) > 0) { + rtr <- range(object@rtime) + cat("rt range: [", rtr[1], ", ", rtr[2], "]\n", sep = "") + } }) ## Methods: ## rtime -##' @description \code{rtime} returns the retention times for the rentention time -##' - intensity pairs stored in the chromatogram. -##' -##' @param object A \code{Chromatogram} object. -##' -##' @rdname Chromatogram-class +#' @description \code{rtime} returns the retention times for the rentention time +#' - intensity pairs stored in the chromatogram. +#' +#' @param object A \code{Chromatogram} object. +#' +#' @rdname Chromatogram-class setMethod("rtime", "Chromatogram", function(object) { return(object@rtime) }) ## intensity -##' @description \code{intensity} returns the intensity for the rentention time -##' - intensity pairs stored in the chromatogram. -##' -##' @rdname Chromatogram-class +#' @description \code{intensity} returns the intensity for the rentention time +#' - intensity pairs stored in the chromatogram. +#' +#' @rdname Chromatogram-class setMethod("intensity", "Chromatogram", function(object) { return(object@intensity) }) ## mz -##' @description \code{mz} get the mz (range) of the chromatogram. The -##' function returns a \code{numeric(2)} with the lower and upper mz value. -##' -##' @param filter For \code{mz}: whether the mz range used to filter the -##' original object should be returned (\code{filter = TRUE}), or the mz range -##' calculated on the real data (\code{filter = FALSE}). -##' -##' @rdname Chromatogram-class +#' @description \code{mz} get the mz (range) of the chromatogram. The +#' function returns a \code{numeric(2)} with the lower and upper mz value. +#' +#' @param filter For \code{mz}: whether the mz range used to filter the +#' original object should be returned (\code{filter = TRUE}), or the mz +#' range calculated on the real data (\code{filter = FALSE}). +#' +#' @rdname Chromatogram-class setMethod("mz", "Chromatogram", function(object, filter = FALSE) { if (filter) return(object@filterMz) return(object@mz) }) -## ##' @rdname Chromatogram-class +## #' @rdname Chromatogram-class ## setReplaceMethod("mz", "CentWaveParam", function(object, value) { ## object@mzrange <- value ## if (validObject(object)) ## return(object) ## }) -##' @description \code{precursorMz} get the mz of the precursor ion. The -##' function returns a \code{numeric(2)} with the lower and upper mz value. -##' -##' @rdname Chromatogram-class +#' @description \code{precursorMz} get the mz of the precursor ion. The +#' function returns a \code{numeric(2)} with the lower and upper mz value. +#' +#' @rdname Chromatogram-class setMethod("precursorMz", "Chromatogram", function(object) { return(object@precursorMz) }) -##' @aliases productMz -##' @description \code{productMz} get the mz of the product chromatogram/ion. The -##' function returns a \code{numeric(2)} with the lower and upper mz value. -##' -##' @rdname Chromatogram-class +#' @aliases productMz +#' +#' @description \code{productMz} get the mz of the product chromatogram/ion. The +#' function returns a \code{numeric(2)} with the lower and upper mz value. +#' +#' @rdname Chromatogram-class setMethod("productMz", "Chromatogram", function(object) { return(object@productMz) }) ## aggregationFun -##' @aliases aggregationFun -##' @description \code{aggregationFun,aggregationFun<-} get or set the -##' aggregation function. -##' -##' @rdname Chromatogram-class +#' @aliases aggregationFun +#' +#' @description \code{aggregationFun,aggregationFun<-} get or set the +#' aggregation function. +#' +#' @rdname Chromatogram-class setMethod("aggregationFun", "Chromatogram", function(object) { return(object@aggregationFun) }) -## ##' @rdname Chromatogram-class +## #' @rdname Chromatogram-class ## setReplaceMethod("aggregationFun", "CentWaveParam", function(object, value) { ## object@aggregationFun <- value ## if (validObject(object)) @@ -96,62 +100,62 @@ setMethod("aggregationFun", "Chromatogram", function(object) { ## }) ## fromFile -##' @description \code{fromFile} returns the value from the \code{fromFile} slot. -##' -##' @rdname Chromatogram-class +#' @description \code{fromFile} returns the value from the \code{fromFile} slot. +#' +#' @rdname Chromatogram-class setMethod("fromFile", "Chromatogram", function(object) { return(object@fromFile) }) ## length -##' @description \code{length} returns the length (number of retention time - -##' intensity pairs) of the chromatogram. -##' -##' @param x For \code{as.data.frame} and \code{length}: a \code{Chromatogram} -##' object. -##' -##' @rdname Chromatogram-class +#' @description \code{length} returns the length (number of retention time - +#' intensity pairs) of the chromatogram. +#' +#' @param x For \code{as.data.frame} and \code{length}: a \code{Chromatogram} +#' object. +#' +#' @rdname Chromatogram-class setMethod("length", "Chromatogram", function(x) { return(length(x@rtime)) }) ## as.data.frame -##' @description \code{as.data.frame} returns the \code{rtime} and -##' \code{intensity} values from the object as \code{data.frame}. -##' -##' @rdname Chromatogram-class +#' @description \code{as.data.frame} returns the \code{rtime} and +#' \code{intensity} values from the object as \code{data.frame}. +#' +#' @rdname Chromatogram-class setMethod("as.data.frame", "Chromatogram", function(x) { return(data.frame(rtime = x@rtime, intensity = x@intensity)) }) -##' @description \code{filterRt}: filters the chromatogram based on the provided -##' retention time range. -##' -##' @param rt For \code{filterRt}: \code{numeric(2)} defining the lower and -##' upper retention time for the filtering. -##' -##' @rdname Chromatogram-class -##' -##' @examples -##' -##' ## Create a simple Chromatogram object based on random values. -##' chr <- Chromatogram(intensity = abs(rnorm(1000, mean = 2000, sd = 200)), -##' rtime = sort(abs(rnorm(1000, mean = 10, sd = 5)))) -##' chr -##' -##' ## Get the intensities -##' head(intensity(chr)) -##' -##' ## Get the retention time -##' head(rtime(chr)) -##' -##' ## What is the retention time range of the object? -##' range(rtime(chr)) -##' -##' ## Filter the chromatogram to keep only values between 4 and 10 seconds -##' chr2 <- filterRt(chr, rt = c(4, 10)) -##' -##' range(rtime(chr2)) +#' @description \code{filterRt}: filters the chromatogram based on the provided +#' retention time range. +#' +#' @param rt For \code{filterRt}: \code{numeric(2)} defining the lower and +#' upper retention time for the filtering. +#' +#' @rdname Chromatogram-class +#' +#' @examples +#' +#' ## Create a simple Chromatogram object based on random values. +#' chr <- Chromatogram(intensity = abs(rnorm(1000, mean = 2000, sd = 200)), +#' rtime = sort(abs(rnorm(1000, mean = 10, sd = 5)))) +#' chr +#' +#' ## Get the intensities +#' head(intensity(chr)) +#' +#' ## Get the retention time +#' head(rtime(chr)) +#' +#' ## What is the retention time range of the object? +#' range(rtime(chr)) +#' +#' ## Filter the chromatogram to keep only values between 4 and 10 seconds +#' chr2 <- filterRt(chr, rt = c(4, 10)) +#' +#' range(rtime(chr2)) setMethod("filterRt", "Chromatogram", function(object, rt) { if (missing(rt)) return(object) @@ -168,3 +172,42 @@ setMethod("filterRt", "Chromatogram", function(object, rt) { if (validObject(object)) object }) + +#' @description \code{clean}: \emph{cleans} a \code{Chromatogram} class by +#' removing all \code{0} and \code{NA} intensity signals (along with the +#' associates retention times). By default (if \code{all = FALSE}) \code{0} +#' values that are directly adjacent to peaks are kept too. \code{NA} +#' values are always removed. +#' +#' @param all For \code{clean}: \code{logical(1)} whether all \code{0} intensity +#' value pairs should be removed (defaults to \code{FALSE}). +#' +#' @return For \code{clean}: a \emph{cleaned} \code{Chromatogram} object. +#' +#' @rdname Chromatogram-class +#' +#' @examples +#' +#' ## Create a simple Chromatogram object +#' +#' chr <- Chromatogram(rtime = 1:12, +#' intensity = c(0, 0, 20, 0, 0, 0, 123, 124343, 3432, 0, 0, 0)) +#' +#' ## Remove 0-intensity values keeping those adjacent to peaks +#' chr <- clean(chr) +#' intensity(chr) +#' +#' ## Remove all 0-intensity values +#' chr <- clean(chr, all = TRUE) +#' intensity(chr) +setMethod("clean", signature = signature("Chromatogram"), + function(object, all = FALSE) { + if (all) + keep <- which(object@intensity > 0) + else + keep <- which(.grow_trues(object@intensity > 0)) + object@intensity <- object@intensity[keep] + object@rtime <- object@rtime[keep] + if (validObject(object)) + object + }) diff --git a/R/methods-OnDiskMSnExp.R b/R/methods-OnDiskMSnExp.R index 1d33b9f3a..ff0a8cc87 100644 --- a/R/methods-OnDiskMSnExp.R +++ b/R/methods-OnDiskMSnExp.R @@ -821,7 +821,24 @@ setMethod("adjustRtime", #' @rdname extractChromatograms-method setMethod("extractChromatograms", signature(object = "OnDiskMSnExp"), - function(object, rt, mz, aggregationFun = "sum") { - return(.extractChromatogram(x = object, rt = rt, mz = mz, - aggregationFun = aggregationFun)) + function(object, rt, mz, aggregationFun = "sum", missing = NA_real_) { + if (!missing(rt)) { + if (is.null(ncol(rt))) + rt <- matrix(range(rt), ncol = 2, nrow = 1) + } + if (!missing(mz)) { + if (is.null(ncol(mz))) + mz <- matrix(range(mz), ncol = 2, nrow = 1) + } + ## return(.extractChromatogram(x = object, rt = rt, mz = mz, + ## aggregationFun = aggregationFun)) + .extractMultipleChromatograms(object, rt = rt, mz = mz, + aggregationFun = aggregationFun, + missingValue = missing) + }) + +#' @rdname extractMsData-method +setMethod("extractMsData", signature(object = "OnDiskMSnExp"), + function(object, rt, mz) { + .extractMsData(object, rt = rt, mz = mz) }) diff --git a/R/methods-XCMSnExp.R b/R/methods-XCMSnExp.R index c371f2043..16149a3be 100644 --- a/R/methods-XCMSnExp.R +++ b/R/methods-XCMSnExp.R @@ -247,7 +247,7 @@ setReplaceMethod("featureDefinitions", "XCMSnExp", function(object, value) { #' @rdname XCMSnExp-class setMethod("chromPeaks", "XCMSnExp", function(object, bySample = FALSE, rt = numeric(), mz = numeric(), - ppm = 10, type = "any") { + ppm = 0, type = "any") { pks <- chromPeaks(object@msFeatureData) type <- match.arg(type, c("any", "within")) ## Select peaks within rt range. @@ -263,8 +263,10 @@ setMethod("chromPeaks", "XCMSnExp", function(object, bySample = FALSE, if (length(mz) && length(pks)) { mz <- range(mz) ## Increase mz by ppm. - mz[1] <- mz[1] - mz[1] * ppm / 1e6 - mz[2] <- mz[2] + mz[2] * ppm / 1e6 + if (is.finite(mz[1])) + mz[1] <- mz[1] - mz[1] * ppm / 1e6 + if (is.finite(mz[2])) + mz[2] <- mz[2] + mz[2] * ppm / 1e6 if (type == "within") keep <- which(pks[, "mzmin"] >= mz[1] & pks[, "mzmax"] <= mz[2]) else @@ -1826,16 +1828,25 @@ setMethod("featureValues", #' \code{\link{XCMSnExp}} objects. #' #' @details Arguments \code{rt} and \code{mz} allow to specify the MS -#' data slice from which the chromatogram should be extracted. The -#' parameter \code{aggregationSum} allows to specify the function to be +#' data slice from which the chromatogram should be extracted. +#' The parameter \code{aggregationSum} allows to specify the function to be #' used to aggregate the intensities across the mz range for the same #' retention time. Setting \code{aggregationFun = "sum"} would e.g. allow #' to calculate the \emph{total ion chromatogram} (TIC), #' \code{aggregationFun = "max"} the \emph{base peak chromatogram} (BPC). +#' The length of the extracted \code{Chromatogram} object, i.e. the number +#' of available data points, corresponds to the number of scans/spectra +#' measured in the specified retention time range. If in a specific scan +#' (for a give retention time) no signal was measured in the specified mz +#' range, a \code{NA_real_} is reported as intensity for the retention time +#' (see Notes for more information). This can be changed using the +#' \code{missing} parameter. #' #' @note \code{Chromatogram} objects extracted with \code{extractChromatogram} -#' contain \code{NA_real_} values if, for a given retention time, no valid -#' measurement was available for the provided mz range. +#' contain \code{NA_real_} values if, for a given retention time, no +#' signal was measured in the specified mz range. If no spectrum/scan is +#' present in the defined retention time window a \code{Chromatogram} object +#' of length 0 is returned. #' #' For \code{\link{XCMSnExp}} objects, if adjusted retention times are #' available, the \code{extractChromatograms} method will by default report @@ -1847,17 +1858,17 @@ setMethod("featureValues", #' \code{\link{XCMSnExp}} object from which the chromatograms should be #' extracted. #' -#' @param rt \code{numeric(2)} defining the lower and upper boundary for the -#' retention time range. If not specified, the full retention time range of -#' the original data will be used. It is also possible to submit a -#' \code{numeric(1)} in which case \code{range} is called on it to -#' transform it to a \code{numeric(2)}. +#' @param rt \code{numeric(2)} or two-column \code{matrix} defining the lower +#' and upper boundary for the retention time range(s). If not specified, +#' the full retention time range of the original data will be used. +#' It is also possible to submit a \code{numeric(1)} in which case +#' \code{range} is called on it to transform it to a \code{numeric(2)}. #' -#' @param mz \code{numeric(2)} defining the lower and upper mz value for the -#' MS data slice. If not specified, the chromatograms will be calculated on -#' the full mz range. It is also possible to submit a \code{numeric(1)} in -#' which case \code{range} is called on it to transform it to a -#' \code{numeric(2)}. +#' @param mz \code{numeric(2)} or two-column \code{matrix} defining the lower +#' and upper mz value for the MS data slice(s). If not specified, the +#' chromatograms will be calculated on the full mz range. +#' It is also possible to submit a \code{numeric(1)} in which case +#' \code{range} is called on it to transform it to a \code{numeric(2)}. #' #' @param adjustedRtime For \code{extractChromatograms,XCMSnExp}: whether the #' adjusted (\code{adjustedRtime = TRUE}) or raw retention times @@ -1869,6 +1880,32 @@ setMethod("featureValues", #' aggregate intensity values across the mz value range for the same #' retention time. Allowed values are \code{"sum"}, \code{"max"}, #' \code{"mean"} and \code{"min"}. +#' +#' @param missing \code{numeric(1)} allowing to specify the intensity value to +#' be used if for a given retention time no signal was measured within the +#' mz range of the corresponding scan. Defaults to \code{NA_real_} (see also +#' Details and Notes sections below). Use \code{missing = 0} to resemble the +#' behaviour of the \code{getEIC} from the \code{old} user interface. +#' +#' @return If a single \code{rt} and \code{mz} range was specified, +#' \code{extractChromatograms} returns a \code{list} of +#' \code{\link{Chromatogram}} classes each element being the chromatogram +#' for one of the samples for the specified range. +#' If multiple \code{rt} and \code{mz} ranges were provided (i.e. by passing +#' a multi-row \code{matrix} to parameters \code{rt} or \code{mz}), the +#' function returns a \code{list} of \code{list}s. The outer list +#' representing results for the various ranges, the inner the result across +#' files. In other words, \code{result[[1]]} returns a \code{list} with +#' \code{Chromatogram} classes length equal to the number of files, each +#' element representing the \code{Chromatogram} for the first rt/mz range +#' for one file. +#' An empty \code{list} is returned if no MS1 data is present in +#' \code{object} or if not a single spectrum is available for any of the +#' provided retention time ranges in \code{rt}. An empty \code{Chromatogram} +#' object is returned at the correponding position in the result \code{list} +#' if for the specific file no scan/spectrum was measured in the provided +#' rt window. In all other cases, a \code{Chromatogram} with length equal +#' to the number of scans/spectra in the provided rt range is returned. #' #' @author Johannes Rainer #' @@ -1876,6 +1913,12 @@ setMethod("featureValues", #' \code{\link{Chromatogram}} for the object representing chromatographic #' data. #' +#' \code{\link{plotChromatogram}} to plot a \code{Chromatogram} or +#' \code{list} of such objects. +#' +#' \code{\link{extractMsData}} for a method to extract the MS data as +#' \code{data.frame}. +#' #' @export #' #' @rdname extractChromatograms-method @@ -1899,13 +1942,37 @@ setMethod("featureValues", #' for(i in c(1, 3)) { #' points(rtime(chrs[[i]]), intensity(chrs[[i]]), type = "l", col = "00000080") #' } +#' +#' ## Plot the chromatogram using plotChromatogram +#' plotChromatogram(chrs) +#' +#' ## Extract chromatograms for multiple ranges. +#' mzr <- matrix(c(335, 335, 344, 344), ncol = 2, byrow = TRUE) +#' rtr <- matrix(c(2700, 2900, 2600, 2750), ncol = 2, byrow = TRUE) +#' chrs <- extractChromatograms(od, mz = mzr, rt = rtr) +#' +#' ## Plot the extracted chromatograms +#' par(mfrow = c(1, 2)) +#' plotChromatogram(chrs[[1]]) +#' plotChromatogram(chrs[[2]]) setMethod("extractChromatograms", signature(object = "XCMSnExp"), function(object, rt, mz, adjustedRtime = hasAdjustedRtime(object), - aggregationFun = "sum") { - return(.extractChromatogram(x = object, rt = rt, mz = mz, - aggregationFun = aggregationFun, - adjusted = adjustedRtime)) + aggregationFun = "sum", missing = NA_real_) { + ## Coerce to OnDiskMSnExp. + if (adjustedRtime) + adj_rt <- rtime(object, adjusted = TRUE) + object <- as(object, "OnDiskMSnExp") + if (adjustedRtime) { + ## Replace the original rtime with adjusted ones... + object@featureData$retentionTime <- adj_rt + } + extractChromatograms(object, rt = rt, mz = mz, + aggregationFun = aggregationFun, + missing = missing) + ## .extractChromatogram(x = object, rt = rt, mz = mz, + ## aggregationFun = aggregationFun, + ## adjusted = adjustedRtime) }) #' @rdname XCMSnExp-class @@ -2281,3 +2348,65 @@ setMethod("dropFilledChromPeaks", "XCMSnExp", function(object) { return(object) }) +#' @aliases extractMsData +#' +#' @title Extract a \code{data.frame} containing MS data +#' +#' @description Extract a \code{data.frame} of retention time, mz and intensity +#' values from each file/sample in the provided rt-mz range (or for the full +#' data range if \code{rt} and \code{mz} are not defined). +#' +#' @param object A \code{XCMSnExp} or \code{OnDiskMSnExp} object. +#' +#' @param rt \code{numeric(2)} with the retention time range from which the +#' data should be extracted. +#' +#' @param mz \code{numeric(2)} with the mz range. +#' +#' @param adjustedRtime (for \code{extractMsData,XCMSnExp}): \code{logical(1)} +#' specifying if adjusted or raw retention times should be reported. +#' Defaults to adjusted retention times, if these are present in +#' \code{object}. +#' +#' @return A \code{list} of length equal to the number of samples/files in +#' \code{object}. Each element being a \code{data.frame} with columns +#' \code{"rt"}, \code{"mz"} and \code{"i"} with the retention time, mz and +#' intensity tuples of a file. If no data is available for the mz-rt range +#' in a file a \code{data.frame} with 0 rows is returned for that file. +#' +#' @seealso \code{\link{XCMSnExp}} for the data object. +#' +#' @rdname extractMsData-method +#' +#' @author Johannes Rainer +#' +#' @examples +#' ## Read some files from the test data package. +#' library(faahKO) +#' library(xcms) +#' fls <- dir(system.file("cdf/KO", package = "faahKO"), recursive = TRUE, +#' full.names = TRUE) +#' raw_data <- readMSData2(fls[1:2]) +#' +#' ## Read the full MS data for a defined mz-rt region. +#' res <- extractMsData(raw_data, mz = c(300, 320), rt = c(2700, 2900)) +#' +#' ## We've got one data.frame per file +#' length(res) +#' +#' ## With number of rows: +#' nrow(res[[1]]) +#' +#' head(res[[1]]) +setMethod("extractMsData", "XCMSnExp", + function(object, rt, mz, adjustedRtime = hasAdjustedRtime(object)){ + ## Now, this method takes the adjusted rts, casts the object to + ## an OnDiskMSnExp, eventually replaces the rtime in the + ## featureData with the adjusted retention times (depending on + ## adjustedRtime and calls the method for OnDiskMSnExp. + if (adjustedRtime & hasAdjustedRtime(object)) { + fData(object)$retentionTime <- rtime(object, adjusted = TRUE) + } + object <- as(object, "OnDiskMSnExp") + extractMsData(object, rt = rt, mz = mz) + }) diff --git a/R/methods-xcmsRaw.R b/R/methods-xcmsRaw.R index 2280bc34d..c852b995d 100755 --- a/R/methods-xcmsRaw.R +++ b/R/methods-xcmsRaw.R @@ -2302,17 +2302,35 @@ setMethod("stitch.xml", "xcmsRaw", function(object, lockMass) { ob@tic<-object@tic ob@profparam<-list() - arr<-array(dim=c(2,max(diff(ob@scanindex)), length(ob@scanindex))) + ## Array [x, y, z] with + ## - x: mz and intensity + ## - y: spectrum (1: max measurements within one of the spectra) + ## - z: scans (1: number of spectra) + arr <- array(dim = c(2, max(diff(ob@scanindex)), length(ob@scanindex))) if(lockMass[1] == 1){ lockMass<-lockMass[3:length(lockMass)] } + + ## Remove the last lock mass if it is too close by the end + if ((lockMass[length(lockMass)] + 2) > length(ob@scanindex)) + lockMass <- lockMass[1:(length(lockMass) - 1)] + + ## If the number of lockMass values is not even splitting them into a + ## two-column matrix is not OK (causes also the first lockMass spectrum to + ## be overwritten twice. That's to get rid of the warning in issue #173. + if (length(lockMass) %% 2) + lockMass <- c(lockMass, -99) lockMass<-matrix(lockMass, ncol=2, byrow=TRUE) - if((lockMass[nrow(lockMass),2]+2) > length(ob@scanindex)){ - lockMass<-lockMass[1:(nrow(lockMass)-1),] - } + ## if((lockMass[nrow(lockMass),2]+2) > length(ob@scanindex)){ + ## lockMass<-lockMass[1:(nrow(lockMass)-1),] + ## } + ## We're looping from 1 to length - 1, thus we have to fill in the last + ## scan later. for(i in 1:(length(ob@scanindex)-1)){ - if(any(i == lockMass[,1])){ + if(any(i == lockMass[, 1])){ + ## Place mz and intensity values from the previous scan into the + ## array and fill the rest with NA. arr[1,,i] <-c(object@env$mz[(object@scanindex[(i-1)]+1):object@scanindex[i]], rep(NA, (max(diff(object@scanindex))- length((object@scanindex[(i-1)]+1):object@scanindex[i])) )) @@ -2321,7 +2339,8 @@ setMethod("stitch.xml", "xcmsRaw", function(object, lockMass) { rep(NA, (max(diff(object@scanindex)) - length((object@scanindex[(i-1)]+1):object@scanindex[i])) )) - } else if(any(i == lockMass[,2])){ + } else if(any(i == lockMass[, 2])){ + ## Place mz and intensity values from the next scan into the array. arr[1,,i] <-c(object@env$mz[(object@scanindex[i+1]+1):object@scanindex[(i+2)]], rep(NA, (max(diff(object@scanindex)) - length((object@scanindex[i+1]+1):object@scanindex[(i+2)])) )) @@ -2331,6 +2350,7 @@ setMethod("stitch.xml", "xcmsRaw", function(object, lockMass) { length((object@scanindex[i+1]+1):object@scanindex[(i+2)])) )) } else{ + ## Just fill with the actual values. arr[1,,i] <-c(object@env$mz[(object@scanindex[i]+1):object@scanindex[i+1]], rep(NA, (max(diff(object@scanindex))- length((object@scanindex[i]+1):object@scanindex[i+1])) )) @@ -2352,6 +2372,12 @@ setMethod("stitch.xml", "xcmsRaw", function(object, lockMass) { ob@scanindex[i]<-as.integer(length(na.omit(arr[1,,(i-1)]))+ob@scanindex[(i-1)]) } } + ## Fix for #173: fill also values for the last scan. + last_i <- length(ob@scanindex) + fetch_idx <- (object@scanindex[last_i] + 1):length(object@env$mz) + put_idx <- 1:length(fetch_idx) + arr[1, put_idx, length(ob@scanindex)] <- object@env$mz[fetch_idx] + arr[2, put_idx, length(ob@scanindex)] <- object@env$intensity[fetch_idx] NAidx<-is.na(arr[1,,]) ob@env$mz<-as.numeric(arr[1,,][!NAidx]) diff --git a/R/methods-xcmsSet.R b/R/methods-xcmsSet.R index 9d69e920e..5082d47a4 100644 --- a/R/methods-xcmsSet.R +++ b/R/methods-xcmsSet.R @@ -453,7 +453,13 @@ setMethod("retcor", "xcmsSet", function(object, method=getOption("BioC")$xcms$re ...) { ## Backward compatibility for old "methods" if (method == "linear" || method == "loess") { - return(invisible(do.call(retcor.peakgroups, alist(object, smooth=method, ...)))) + args <- list(...) + if (any(names(args) == "smooth")) + warning("Provided argument 'smooth' will be replaced with the ", + "value of 'method', i.e. with ", method) + args$smooth <- method + ## Overwriting eventually provided smooth parameter. + return(invisible(do.call(retcor.peakgroups, c(list(object), args)))) } method <- match.arg(method, getOption("BioC")$xcms$retcor.methods) @@ -731,8 +737,10 @@ setMethod("retcor.peakgroups", "xcmsSet", function(object, missing = 1, extra = screen(2) par(mar = c(5.1, 4.1, 0, 2), yaxt = "n") - allden <- density(peakmat[,"rt"], bw = diff(rtrange)/200, from = rtrange[1], to = rtrange[2])[c("x","y")] - corden <- density(rt, bw = diff(rtrange)/200, from = rtrange[1], to = rtrange[2], na.rm = TRUE)[c("x","y")] + allden <- density(peakmat[,"rt"], bw = diff(rtrange)/200, + from = rtrange[1], to = rtrange[2])[c("x","y")] + corden <- density(rt, bw = diff(rtrange)/200, from = rtrange[1], + to = rtrange[2], na.rm = TRUE)[c("x","y")] allden$y <- allden$y / sum(allden$y) corden$y <- corden$y / sum(corden$y) maxden <- max(allden$y, corden$y) @@ -1069,7 +1077,8 @@ setMethod("plotrt", "xcmsSet", function(object, col = NULL, ty = NULL, leg = TRU screen(2) par(mar = c(5.1, 4.1, 0, 2), yaxt = "n") - allden <- density(object@peaks[,"rt"], bw = diff(rtrange)/200, from = rtrange[1], to = rtrange[2])[c("x","y")] + allden <- density(object@peaks[,"rt"], bw = diff(rtrange)/200, + from = rtrange[1], to = rtrange[2])[c("x","y")] plot(allden, xlim = rtrange, type = "l", main = "", xlab = "Retention Time", ylab = "Peak Density") abline(h = 0, col = "grey") close.screen(all.screens = TRUE) diff --git a/inst/NEWS b/inst/NEWS index 498b193d6..0380de3a0 100644 --- a/inst/NEWS +++ b/inst/NEWS @@ -1,3 +1,46 @@ +CHANGES IN VERSION 2.99.1 +------------------------- + +NEW FEATURES: +- extractMsData to extract raw MS data as a data.frame (issue #120). + +BUG FIXES: +- issue #175: an error is now thrown if no peak group was identified for peak + group retention time correction. +- issue #178: scanrange was collapsed when the adjusted range was reported + (pull request by Jan Stanstrup). +- issue #180: error when both parameters method and smooth are provided in the + retcor method. + + +CHANGES IN VERSION 2.99.0 +------------------------- + +NEW FEATURES: +- plotChromatogram and highlightChromPeaks functions. +- plotChromPeakDensity function. +- clean method for Chromatogram classes. + +USER VISIBLE CHANGES: +- Change default for ppm parameter in chromPeaks method to 0. +- extractChromatograms supports extraction of multiple rt and mz ranges. +- New parameter missing for extractChromatograms allowing to specify the + intensity value to be used for rts for which no signal is available within + the mz range. +- extractChromatograms returns Chromatograms of length equal to the number of + scans within the specified rt range, even if no signals are measured + (intensity values are NA). + + +CHANGES IN VERSION 1.53.1 +-------------------------- + +BUG FIXES: +- Increase parameter n for the density call in the peak density correspondence + method. This enables to separate neighboring peaks using small n (issue #161). + Thanks to Jan Stanstrup. + + CHANGES IN VERSION 1.51.11 -------------------------- diff --git a/inst/unitTests/runit.Chromatogram.R b/inst/unitTests/runit.Chromatogram.R index c01a16265..53861f2d1 100644 --- a/inst/unitTests/runit.Chromatogram.R +++ b/inst/unitTests/runit.Chromatogram.R @@ -52,11 +52,11 @@ test_Chromatogram_class <- function() { ch <- xcms:::Chromatogram(mz = c(1, 3)) checkEquals(ch@mz, c(1, 3)) checkEquals(mz(ch), c(1, 3)) - checkEquals(mz(ch, filter = TRUE), c(0, 0)) + checkEquals(mz(ch, filter = TRUE), c(NA_real_, NA_real_)) ch <- xcms:::Chromatogram(filterMz = c(1, 3)) checkEquals(ch@filterMz, c(1, 3)) checkEquals(mz(ch, filter = TRUE), c(1, 3)) - checkEquals(mz(ch, filter = FALSE), c(0, 0)) + checkEquals(mz(ch, filter = FALSE), c(NA_real_, NA_real_)) ch <- xcms:::Chromatogram(precursorMz = 123) checkEquals(ch@precursorMz, c(123, 123)) checkEquals(precursorMz(ch), c(123, 123)) @@ -90,6 +90,7 @@ test_extractChromatograms <- function() { ## OnDiskMSnExp ## TIC chrs <- extractChromatograms(filterFile(od_x, file = 2)) + plotChromatogram(chrs) spctr <- spectra(filterFile(od_x, file = 2)) ints <- unlist(lapply(spctr, function(z) return(sum(intensity(z))))) @@ -114,6 +115,10 @@ test_extractChromatograms <- function() { aggregationFun = "max") ints <- unlist(lapply(spctr, function(z) return(max(intensity(z))))) + chrs_2 <- xcms:::.extractMultipleChromatograms(filterFile(xod_x, file = 2), + aggregationFun = "max") + checkEquals(intensity(chrs[[1]]), intensity(chrs_2[[1]])) + checkEquals(intensity(chrs[[1]]), ints) checkEquals(rtime(chrs[[1]]), unlist(lapply(spctr, rtime))) ## with adjusted retention times. @@ -126,7 +131,15 @@ test_extractChromatograms <- function() { aggregationFun = "max") checkEquals(intensity(chrs[[1]]), ints) checkEquals(rtime(chrs[[1]]), rtime(xod_xgr, bySample = TRUE)[[2]]) - + ## Subset to certain mz range in all files. + chrs_adj <- extractChromatograms(xod_xgr, mz = c(300, 330)) + chrs_raw <- extractChromatograms(xod_x, mz = c(300, 330)) + checkTrue(sum(rtime(chrs_adj[[1]]) != rtime(chrs_raw[[1]])) > + length(chrs_raw[[1]]) / 2) + checkEquals(rtime(chrs_adj[[1]]), rtime(xod_xgr, bySample = TRUE)[[1]]) + checkEquals(rtime(chrs_adj[[2]]), rtime(xod_xgr, bySample = TRUE)[[2]]) + checkEquals(rtime(chrs_adj[[3]]), rtime(xod_xgr, bySample = TRUE)[[3]]) + ## Now subsetting for mz: tmp <- filterFile(od_x, file = 2) chrs <- extractChromatograms(tmp, mz = c(300, 400)) @@ -219,8 +232,85 @@ test_extractChromatograms <- function() { ## What if we're completely off? chrs <- extractChromatograms(od_x, rt = c(5000, 5500)) checkTrue(length(chrs) == 0) + ## Now rt is within range, but mz is completely off. We expect Chromatograms + ## with same length than there are spectra in the rt range, but all NA + ## values. chrs <- extractChromatograms(od_x, rt = c(2600, 2700), mz = 12000) - checkTrue(length(chrs) == 0) + rts <- split(rtime(od_x), f = fromFile(od_x)) + rts <- lapply(rts, function(z) z[z >= 2600 & z <= 2700]) + checkEquals(lengths(chrs), lengths(chrs)) + ## All have to be NA. + checkTrue(all(unlist(lapply(chrs, function(z) is.na(intensity(z)))))) + + ## Multiple ranges. + rtr <- matrix(c(2700, 2900, 2600, 2800), ncol = 2, byrow = TRUE) + mzr <- matrix(c(355, 355, 344, 344), ncol = 2, byrow = TRUE) + chrs <- extractChromatograms(od_x, rt = rtr, mz = mzr) + + checkTrue(all(rtime(chrs[[1]][[1]]) >= 2700 & rtime(chrs[[1]][[1]]) <= 2900)) + checkTrue(all(rtime(chrs[[1]][[2]]) >= 2700 & rtime(chrs[[1]][[2]]) <= 2900)) + checkTrue(all(rtime(chrs[[1]][[3]]) >= 2700 & rtime(chrs[[1]][[3]]) <= 2900)) + checkTrue(all(rtime(chrs[[2]][[1]]) >= 2600 & rtime(chrs[[2]][[1]]) <= 2800)) + checkTrue(all(rtime(chrs[[2]][[2]]) >= 2600 & rtime(chrs[[2]][[2]]) <= 2800)) + checkTrue(all(rtime(chrs[[2]][[3]]) >= 2600 & rtime(chrs[[2]][[3]]) <= 2800)) + spctr <- spectra(filterMz(filterRt(od_x, rt = rtr[1, ]), + mz = mzr[1, ])) + ints <- split(unlist(lapply(spctr, function(z) { + if (z@peaksCount) + return(sum(intensity(z))) + else return(NA) + })), f = unlist(lapply(spctr, fromFile))) + checkEquals(ints[[1]], intensity(chrs[[1]][[1]])) + checkEquals(ints[[2]], intensity(chrs[[1]][[2]])) + checkEquals(ints[[3]], intensity(chrs[[1]][[3]])) + spctr <- spectra(filterMz(filterRt(od_x, rt = rtr[2, ]), + mz = mzr[2, ])) + ints <- split(unlist(lapply(spctr, function(z) { + if (z@peaksCount) + return(sum(intensity(z))) + else return(NA) + })), f = unlist(lapply(spctr, fromFile))) + checkEquals(ints[[1]], intensity(chrs[[2]][[1]])) + checkEquals(ints[[2]], intensity(chrs[[2]][[2]])) + checkEquals(ints[[3]], intensity(chrs[[2]][[3]])) + + ## Multiple ranges with complete off ranges. + rtr <- matrix(c(2700, 2900, 5000, 5500, 2600, 2800), ncol = 2, byrow = TRUE) + mzr <- matrix(c(355, 355, 500, 500, 344, 344), ncol = 2, byrow = TRUE) + chrs <- extractChromatograms(od_x, rt = rtr, mz = mzr) + checkTrue(length(chrs) == 3) + checkTrue(all(lengths(chrs[[2]]) == 0)) + + rtr <- matrix(c(2700, 2900, 2700, 2900, 2600, 2800), ncol = 2, byrow = TRUE) + mzr <- matrix(c(355, 355, 100000, 100000, 344, 344), ncol = 2, byrow = TRUE) + chrs <- extractChromatograms(od_x, rt = rtr, mz = mzr) + checkTrue(length(chrs) == 3) + ## All values in the 2nd Chromosome object have to be NA. + checkTrue(all(unlist(lapply(chrs[[2]], function(z) is.na(intensity(z)))))) +} + +test_clean_chromatogram <- function() { + chr <- Chromatogram( + rtime = 1:12, + intensity = c(0, 0, 20, 0, 0, 0, 123, 124343, 3432, 0, 0, 0)) + chr_clnd <- clean(chr) + checkEquals(rtime(chr_clnd), c(2, 3, 4, 6, 7, 8, 9,10)) + + chr_clnd <- clean(chr, all = TRUE) + checkTrue(length(chr_clnd) == 4) + checkEquals(rtime(chr_clnd), c(3, 7, 8, 9)) + + ## With NA + chr <- Chromatogram( + rtime = 1:12, + intensity = c(0, NA, 20, 0, 0, 0, 123, 124343, 3432, 0, 0, 0)) + chr_clnd <- clean(chr) + checkEquals(rtime(chr_clnd), c(3, 4, 6, 7, 8, 9, 10)) + chr <- Chromatogram( + rtime = 1:12, + intensity = c(NA, NA, 20, NA, NA, NA, 123, 124343, 3432, NA, NA, NA)) + chr_clnd <- clean(chr) + checkEquals(rtime(chr_clnd), c(3, 7, 8, 9)) } dontrun_test_with_MRM <- function() { diff --git a/inst/unitTests/runit.XCMSnExp.R b/inst/unitTests/runit.XCMSnExp.R index e9e1fe1cb..2c09bb369 100644 --- a/inst/unitTests/runit.XCMSnExp.R +++ b/inst/unitTests/runit.XCMSnExp.R @@ -1088,8 +1088,8 @@ test_signal_integration <- function() { ## cat(" ", chromPeaks(tmp)[i, "into"], " - ", pkI, "\n") checkEquals(unname(pkI), unname(chromPeaks(tmp)[i, "into"])) } - pkI2 <- xcms:::.getPeakInt2(tmp, chromPeaks(tmp)[idxs, , drop = FALSE]) - checkEquals(unname(pkI2), unname(chromPeaks(tmp)[idxs, "into"])) + ## pkI2 <- xcms:::.getPeakInt2(tmp, chromPeaks(tmp)[idxs, , drop = FALSE]) + ## checkEquals(unname(pkI2), unname(chromPeaks(tmp)[idxs, "into"])) ## Now for matchedfilter. tmp <- findChromPeaks(filterFile(od_x, 2), param = MatchedFilterParam()) @@ -1111,8 +1111,8 @@ test_signal_integration <- function() { ## cat(" ", chromPeaks(tmp)[i, "into"], " - ", pkI, "\n") checkEquals(unname(pkI), unname(chromPeaks(tmp)[i, "into"])) } - pkI2 <- xcms:::.getPeakInt2(tmp, chromPeaks(tmp)[idxs, , drop = FALSE]) - checkEquals(unname(pkI2), unname(chromPeaks(tmp)[idxs, "into"])) + ## pkI2 <- xcms:::.getPeakInt2(tmp, chromPeaks(tmp)[idxs, , drop = FALSE]) + ## checkEquals(unname(pkI2), unname(chromPeaks(tmp)[idxs, "into"])) ## ## matchedFilter with wide mz bins. ## ## For matchedFilter I will have to do this on the profile matrix! @@ -1162,6 +1162,69 @@ test_adjustRtimePeakGroups <- function() { checkTrue(max(isNa) == 1) } +test_extractMsData <- function() { + ## All the data + ## all <- extractMsData(od_x) + ## checkEquals(length(all), length(fileNames(od_x))) + ## rts <- split(rtime(od_x), f = fromFile(od_x)) + ## checkEquals(lengths(rts), unlist(lapply(all, nrow))) + ## On an OnDiskMSnExp with only mz + mzr <- c(300, 302) + res <- extractMsData(od_x, mz = mzr) + checkEquals(length(res), length(fileNames(od_x))) + checkTrue(all(res[[1]][, "mz"] >= mzr[1] & res[[1]][, "mz"] <= mzr[2])) + checkTrue(all(res[[2]][, "mz"] >= mzr[1] & res[[2]][, "mz"] <= mzr[2])) + checkTrue(all(res[[3]][, "mz"] >= mzr[1] & res[[3]][, "mz"] <= mzr[2])) + ## On an OnDiskMSnExp with only rt + rtr <- c(2500, 2800) + res <- extractMsData(od_x, rt = rtr) + checkTrue(all(res[[1]][, "rt"] >= rtr[1] & res[[1]][, "rt"] <= rtr[2])) + checkTrue(all(res[[2]][, "rt"] >= rtr[1] & res[[2]][, "rt"] <= rtr[2])) + checkTrue(all(res[[3]][, "rt"] >= rtr[1] & res[[3]][, "rt"] <= rtr[2])) + ## LLLLL TODO Continue here, and then add example to the extractMsData + ## help page. + ## On an OnDiskMSnExp with mz and rt + res <- extractMsData(od_x, rt = rtr, mz = mzr) + checkTrue(all(res[[1]][, "rt"] >= rtr[1] & res[[1]][, "rt"] <= rtr[2])) + checkTrue(all(res[[2]][, "rt"] >= rtr[1] & res[[2]][, "rt"] <= rtr[2])) + checkTrue(all(res[[3]][, "rt"] >= rtr[1] & res[[3]][, "rt"] <= rtr[2])) + checkTrue(all(res[[1]][, "mz"] >= mzr[1] & res[[1]][, "mz"] <= mzr[2])) + checkTrue(all(res[[2]][, "mz"] >= mzr[1] & res[[2]][, "mz"] <= mzr[2])) + checkTrue(all(res[[3]][, "mz"] >= mzr[1] & res[[3]][, "mz"] <= mzr[2])) + + ## XCMSnExp, xod_xgr + ## with adjusted retention times + res <- extractMsData(xod_xgr, rt = rtr, mz = mzr) + checkTrue(all(res[[1]][, "rt"] >= rtr[1] & res[[1]][, "rt"] <= rtr[2])) + checkTrue(all(res[[2]][, "rt"] >= rtr[1] & res[[2]][, "rt"] <= rtr[2])) + checkTrue(all(res[[3]][, "rt"] >= rtr[1] & res[[3]][, "rt"] <= rtr[2])) + checkTrue(all(res[[1]][, "mz"] >= mzr[1] & res[[1]][, "mz"] <= mzr[2])) + checkTrue(all(res[[2]][, "mz"] >= mzr[1] & res[[2]][, "mz"] <= mzr[2])) + checkTrue(all(res[[3]][, "mz"] >= mzr[1] & res[[3]][, "mz"] <= mzr[2])) + ## without adjusted retention times + res_2 <- extractMsData(xod_xgr, adjustedRtime = FALSE, rt = rtr, mz = mzr) + checkTrue(all(res_2[[1]][, "rt"] >= rtr[1] & res_2[[1]][, "rt"] <= rtr[2])) + checkTrue(all(res_2[[2]][, "rt"] >= rtr[1] & res_2[[2]][, "rt"] <= rtr[2])) + checkTrue(all(res_2[[3]][, "rt"] >= rtr[1] & res_2[[3]][, "rt"] <= rtr[2])) + checkTrue(all(res_2[[1]][, "mz"] >= mzr[1] & res_2[[1]][, "mz"] <= mzr[2])) + checkTrue(all(res_2[[2]][, "mz"] >= mzr[1] & res_2[[2]][, "mz"] <= mzr[2])) + checkTrue(all(res_2[[3]][, "mz"] >= mzr[1] & res_2[[3]][, "mz"] <= mzr[2])) + checkTrue(nrow(res[[1]]) != nrow(res_2[[1]])) + checkTrue(nrow(res[[2]]) != nrow(res_2[[2]])) + checkTrue(nrow(res[[3]]) != nrow(res_2[[3]])) + + ## rt and mzr out of range. + res <- extractMsData(od_x, rt = c(6000, 6300), mz = c(0, 3)) + checkEquals(length(res), 3) + checkTrue(all(unlist(lapply(res, FUN = nrow)) == 0)) + res <- extractMsData(od_x, rt = c(6000, 6300)) + checkEquals(length(res), 3) + checkTrue(all(unlist(lapply(res, FUN = nrow)) == 0)) + res <- extractMsData(od_x, mz = c(0, 3)) + checkEquals(length(res), 3) + checkTrue(all(unlist(lapply(res, FUN = nrow)) == 0)) +} + ############################################################ ## Test getEIC alternatives. dontrun_getEIC_alternatives <- function() { @@ -1175,44 +1238,44 @@ dontrun_getEIC_alternatives <- function() { cwp <- CentWaveParam(noise = 10000, snthresh = 40) od_x <- findChromPeaks(od, param = cwp) - ## with this one we get 3 spectras back, one in each file. - rtr <- c(2787, 2788) - res <- filterRt(od_x, rt = rtr) - - ## ----------- - ## That's to test .extractChromatogram - mzr <- c(279, 279) - chrs <- extractChromatograms(od_x, mzrange = mzr) - ## input parameter - x <- od_x - rm(rtrange) - rm(mzrange) - mzrange <- mzr - aggregationFun <- "sum" - ## function call - ## ----------- + ## ## with this one we get 3 spectras back, one in each file. + ## rtr <- c(2787, 2788) + ## res <- filterRt(od_x, rt = rtr) + + ## ## ----------- + ## ## That's to test .extractChromatogram + ## mzr <- c(279, 279) + ## chrs <- extractChromatograms(od_x, mzrange = mzr) + ## ## input parameter + ## x <- od_x + ## rm(rtrange) + ## rm(mzrange) + ## mzrange <- mzr + ## aggregationFun <- "sum" + ## ## function call + ## ## ----------- - od_xg <- groupChromPeaks(od_x, param = PeakDensityParam()) - od_xgr <- adjustRtime(od_xg, param = PeakGroupsParam(span = 0.4)) - - rtr <- as.matrix(featureDefinitions(od_xg)[1:5, c("rtmin", "rtmax")]) - mzr <- as.matrix(featureDefinitions(od_xg)[1:5, c("mzmin", "mzmax")]) - - system.time( - res1 <- xcms:::.extractMsData(od, rtrange = rtr[1, ], mzrange = mzr[1, ]) - ) - system.time( - res2 <- xcms:::.extractMsData(od_xgr, rtrange = rtr[1, ], mzrange = mzr[1, ]) - ) - system.time( - res1 <- xcms:::.sliceApply(od, rtrange = rtr[1, ], mzrange = mzr[1, ]) - ) - system.time( - res1 <- xcms:::.sliceApply(od_xgr, rtrange = rtr[1, ], mzrange = mzr[1, ]) - ) + ## od_xg <- groupChromPeaks(od_x, param = PeakDensityParam()) + ## od_xgr <- adjustRtime(od_xg, param = PeakGroupsParam(span = 0.4)) + + ## rtr <- as.matrix(featureDefinitions(od_xg)[1:5, c("rtmin", "rtmax")]) + ## mzr <- as.matrix(featureDefinitions(od_xg)[1:5, c("mzmin", "mzmax")]) + + ## system.time( + ## res1 <- xcms:::.extractMsData(od, rtrange = rtr[1, ], mzrange = mzr[1, ]) + ## ) + ## system.time( + ## res2 <- xcms:::.extractMsData(od_xgr, rtrange = rtr[1, ], mzrange = mzr[1, ]) + ## ) + ## system.time( + ## res1 <- xcms:::.sliceApply(od, rtrange = rtr[1, ], mzrange = mzr[1, ]) + ## ) + ## system.time( + ## res1 <- xcms:::.sliceApply(od_xgr, rtrange = rtr[1, ], mzrange = mzr[1, ]) + ## ) - library(profvis) - profvis(res <- xcms:::.extractMsData(od, rtrange = rtr[1, ], mzrange = mzr[1, ])) + ## library(profvis) + ## profvis(res <- xcms:::.extractMsData(od, rtrange = rtr[1, ], mzrange = mzr[1, ])) ## Compare with getEIC @@ -1227,11 +1290,38 @@ dontrun_getEIC_alternatives <- function() { rtr <- groups(xs_2)[1:5, c("rtmin", "rtmax")] mzr <- groups(xs_2)[1:5, c("mzmin", "mzmax")] + ## + + register(SerialParam()) + od <- as(od_x, "OnDiskMSnExp") + ## Get all of em. + chrs <- xcms:::.extractMultipleChromatograms(od, rt = rtr, mz = mzr) + for (i in 1:nrow(rtr)) { + chrs1 <- extractChromatograms(od_x, rt = rtr[i, ], mz = mzr[i, ]) + checkEquals(unname(chrs1), unname(chrs[[i]])) + } + + library(microbenchmark) + microbenchmark(xcms:::.extractChromatogram(od, rt = rtr[1, ], mz = mzr[1, ]), + xcms:::.extractMultipleChromatograms(od, rt = rtr[1, , drop = FALSE], + mz = mzr[1, , drop = FALSE]), + times = 10) + + library(profvis) + profvis(xcms:::.extractMultipleChromatograms(od, rt = rtr[1, , drop = FALSE], + mz = mzr[1, , drop = FALSE])) + ## Extract the EIC: system.time( eic <- getEIC(xs_2, rtrange = rtr, mzrange = mzr, rt = "raw") - ) ## 3.7sec + ) ## 5.5 sec + system.time( + eic2 <- xcms:::.extractMultipleChromatograms(od, rt = rtr, mz = mzr) + ) ## 0.13 sec + + + ## Now try to do the same using MSnbase stuff. system.time( res <- xcms:::.extractMsData(od, rtrange = rtr[1, ], mzrange = mzr[1, ]) @@ -1269,9 +1359,21 @@ dontrun_getEIC_alternatives <- function() { ############################################################ ## Alternative: do it by file. + ## IF it's an XCMSnExp: coerce to OnDiskMSnExp by replacing the rtime with + ## the adjusted rtime. ## 1) Subset the od selecting all spectra that fall into the rt ranges. - ## 2) Work on that subsetted od: load into memory. - ## 3) loop over the rtrange and mzrange. + ## keep_logical <- have_rt >= rt[1] & have_rt <= rt[2] + ## tmp <- as(object, "OnDiskMSnExp")[base::which(keep_logical)] + ## 2) Call a spectrapply, passing the matrix of rts and mzs. + ## (Load the spectra (without any filtering now).) + ## 3) spectrapply function loops over the rtrange and mzrange: + ## - select all spectra that are within the range. + ## - lapply on those, apply filterMz with the current mz range. + ## - return a list of Chromatogram classes. + ## 4) We get a list of list of Chromatogram objects. [[files]][[ranges]]. + ## Rearrange the lists: [[ranges]][[files]]. + ## Could also put that into a DataFrame... [ranges, files] + ## For a single one: @@ -1281,6 +1383,7 @@ dontrun_getEIC_alternatives <- function() { dfs <- spectrapply(tmp, as.data.frame) ) + ## mz outside: mzrange <- c(600, 601) tmp <- filterMz(filterRt(od, rt = rtrange), mz = mzrange) diff --git a/inst/unitTests/runit.do_findChromPeaks_centWave.R b/inst/unitTests/runit.do_findChromPeaks_centWave.R index ec08e68de..41724742f 100644 --- a/inst/unitTests/runit.do_findChromPeaks_centWave.R +++ b/inst/unitTests/runit.do_findChromPeaks_centWave.R @@ -21,15 +21,15 @@ test_findChromPeaks_centWave_peakIntensity <- function() { raw <- readMSData2(fl) options(originalCentWave = TRUE) tmp <- findChromPeaks(raw, param = CentWaveParam(peakwidth = c(2, 10))) - ## Use the getPeakInt2 which uses the rawMat function. - pkI2 <- xcms:::.getPeakInt2(tmp, chromPeaks(tmp)) - ## Use the getPeakInt3 which uses the getEIC C function. - pkI3 <- xcms:::.getPeakInt3(tmp, chromPeaks(tmp)) - ## These fail for the original centWave code. - checkTrue(sum(pkI2 != chromPeaks(tmp)[, "into"]) > length(pkI2) / 2) - ## checkEquals(unname(pkI2), unname(chromPeaks(tmp)[, "into"])) - ## checkEquals(unname(pkI3), unname(chromPeaks(tmp)[, "into"])) - checkEquals(pkI2, pkI3) + ## ## Use the getPeakInt2 which uses the rawMat function. + ## pkI2 <- xcms:::.getPeakInt2(tmp, chromPeaks(tmp)) + ## ## Use the getPeakInt3 which uses the getEIC C function. + ## pkI3 <- xcms:::.getPeakInt3(tmp, chromPeaks(tmp)) + ## ## These fail for the original centWave code. + ## checkTrue(sum(pkI2 != chromPeaks(tmp)[, "into"]) > length(pkI2) / 2) + ## ## checkEquals(unname(pkI2), unname(chromPeaks(tmp)[, "into"])) + ## ## checkEquals(unname(pkI3), unname(chromPeaks(tmp)[, "into"])) + ## checkEquals(pkI2, pkI3) ## Try with new implementation. options(originalCentWave = FALSE) tmp2 <- findChromPeaks(raw, param = CentWaveParam(peakwidth = c(2, 10))) @@ -51,25 +51,25 @@ test_findChromPeaks_centWave_peakIntensity <- function() { plot(cp2[, "rtmin"], chromPeaks(tmp)[, "rtmin"]) ## Very similar plot(cp2[, "rtmax"], chromPeaks(tmp)[, "rtmax"]) ## Very similar ## Use the getPeakInt3 which uses the getEIC C function. - pkI2_2 <- xcms:::.getPeakInt2(tmp2, chromPeaks(tmp2)) - pkI3_2 <- xcms:::.getPeakInt3(tmp2, chromPeaks(tmp2)) - ## These fail for the original centWave code. - checkEquals(unname(pkI2_2), unname(chromPeaks(tmp2)[, "into"])) - checkEquals(unname(pkI3_2), unname(chromPeaks(tmp2)[, "into"])) - checkEquals(pkI2_2, pkI3_2) + ## pkI2_2 <- xcms:::.getPeakInt2(tmp2, chromPeaks(tmp2)) + ## pkI3_2 <- xcms:::.getPeakInt3(tmp2, chromPeaks(tmp2)) + ## ## These fail for the original centWave code. + ## checkEquals(unname(pkI2_2), unname(chromPeaks(tmp2)[, "into"])) + ## checkEquals(unname(pkI3_2), unname(chromPeaks(tmp2)[, "into"])) + ## checkEquals(pkI2_2, pkI3_2) ## The same for one of the test files; this works even with the original ## centWave code options(originalCentWave = TRUE) tmp <- filterFile(xod_xgrg, file = 3) - ## Use the getPeakInt2 which uses the rawMat function. - pkI2 <- xcms:::.getPeakInt2(tmp, chromPeaks(tmp)) - ## Use the getPeakInt3 which uses the getEIC C function. - pkI3 <- xcms:::.getPeakInt3(tmp, chromPeaks(tmp)) - checkEquals(pkI2, pkI3) - checkEquals(unname(pkI2), unname(chromPeaks(tmp)[, "into"])) - checkEquals(unname(pkI3), unname(chromPeaks(tmp)[, "into"])) + ## ## Use the getPeakInt2 which uses the rawMat function. + ## pkI2 <- xcms:::.getPeakInt2(tmp, chromPeaks(tmp)) + ## ## Use the getPeakInt3 which uses the getEIC C function. + ## pkI3 <- xcms:::.getPeakInt3(tmp, chromPeaks(tmp)) + ## checkEquals(pkI2, pkI3) + ## checkEquals(unname(pkI2), unname(chromPeaks(tmp)[, "into"])) + ## checkEquals(unname(pkI3), unname(chromPeaks(tmp)[, "into"])) ## New modified centWave. options(originalCentWave = FALSE) tmp2 <- findChromPeaks(filterFile(faahko_od, file = 3), @@ -77,12 +77,12 @@ test_findChromPeaks_centWave_peakIntensity <- function() { ## Even the identified peaks are identical! checkEquals(chromPeaks(tmp), chromPeaks(tmp2)) ## Use the getPeakInt2 which uses the rawMat function. - pkI2 <- xcms:::.getPeakInt2(tmp2, chromPeaks(tmp2)) - ## Use the getPeakInt3 which uses the getEIC C function. - pkI3 <- xcms:::.getPeakInt3(tmp2, chromPeaks(tmp2)) - checkEquals(pkI2, pkI3) - checkEquals(unname(pkI2), unname(chromPeaks(tmp2)[, "into"])) - checkEquals(unname(pkI3), unname(chromPeaks(tmp2)[, "into"])) + ## pkI2 <- xcms:::.getPeakInt2(tmp2, chromPeaks(tmp2)) + ## ## Use the getPeakInt3 which uses the getEIC C function. + ## pkI3 <- xcms:::.getPeakInt3(tmp2, chromPeaks(tmp2)) + ## checkEquals(pkI2, pkI3) + ## checkEquals(unname(pkI2), unname(chromPeaks(tmp2)[, "into"])) + ## checkEquals(unname(pkI3), unname(chromPeaks(tmp2)[, "into"])) options(originalCentWave = TRUE) } diff --git a/inst/unitTests/runit.fillChromPeaks.R b/inst/unitTests/runit.fillChromPeaks.R index 0a9527d28..97e7f3023 100644 --- a/inst/unitTests/runit.fillChromPeaks.R +++ b/inst/unitTests/runit.fillChromPeaks.R @@ -73,7 +73,7 @@ test_fillChromPeaks <- function() { ## Get the intensities for the first one. pkArea <- apply(tmp, median, MARGIN = 2) chr <- extractChromatograms(res, rt = pkArea[1:2], mz = pkArea[3:4]) - checkTrue(length(chr) == 0) + checkTrue(all(unlist(lapply(chr, function(z) is.na(intensity(z)))))) ## Get also the spectra: spctr <- spectra(filterRt(filterFile(xod_xg, file = 1), rt = pkArea[1:2])) mzs <- unlist(lapply(spctr, mz)) diff --git a/inst/unitTests/runit.functions-XCMSnExp.R b/inst/unitTests/runit.functions-XCMSnExp.R new file mode 100644 index 000000000..a152a9de8 --- /dev/null +++ b/inst/unitTests/runit.functions-XCMSnExp.R @@ -0,0 +1,12 @@ +## Unit tests for functions in functions-XCMSnExp.R + +test_plotChromPeakDensity <- function() { + mzr <- c(305.05, 305.15) + plotChromPeakDensity(xod_x, mz = mzr) + + ## Use the full range. + plotChromPeakDensity(xod_x) + + plotChromPeakDensity(xod_x, mz = c(0, 1)) + plotChromPeakDensity(xod_x, mz = c(300, 310), pch = 16, xlim = c(2500, 4000)) +} diff --git a/inst/unitTests/runit.functions-utils.R b/inst/unitTests/runit.functions-utils.R new file mode 100644 index 000000000..9f4184e99 --- /dev/null +++ b/inst/unitTests/runit.functions-utils.R @@ -0,0 +1,53 @@ +library(xcms) +library(RUnit) +## Test the .grow_trues +test_grow_trues <- function() { + ## Compare performance with MSnbase:::utils.clean + Test <- c(1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, + 1, 0) + Expect <- c(TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, + FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, + TRUE, TRUE, TRUE, TRUE) + res_2 <- xcms:::.grow_trues(Test > 0) + checkEquals(res_2, Expect) + + Test <- c(0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0) + Expect <- c(FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE, + TRUE, FALSE) + res_2 <- xcms:::.grow_trues(Test > 0) + checkEquals(res_2, Expect) + + Test <- c(0, 1, NA, 0, 0, 1) + Expect <- c(TRUE, TRUE, FALSE, FALSE, TRUE, TRUE) + res_2 <- xcms:::.grow_trues(Test > 0) + checkEquals(res_2, Expect) + + Test <- c(0, NA, 1, 0, 0, 1, 0, 0) + Expect <- c(FALSE, FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE) + res_2 <- xcms:::.grow_trues(Test > 0) + checkEquals(res_2, Expect) + + Test <- c(0, 1, 0, 0, NA, 0, 1) + Expect <- c(TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE) + res_2 <- xcms:::.grow_trues(Test > 0) + checkEquals(res_2, Expect) + + Test <- c(NA, 1, NA, NA, NA, NA, 1) + Expect <- c(FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE) + res_2 <- xcms:::.grow_trues(Test > 0) + checkEquals(res_2, Expect) +} + +benchmark_grow_trues <- function() { + set.seed(123) + Test <- rnorm(n = 30000) + Test[Test < 0] <- 0 + Test2 <- Test > 0 + res_1 <- MSnbase:::utils.clean(Test) + res_2 <- .clean(Test2) + + Test <- c(0, 0, 1, 1, 0, 0, 0, 1, 0, 0) + Expect <- c(FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE, FALSE) + res_1 <- MSnbase:::utils.clean(Test) + +} diff --git a/man/Chromatogram-class.Rd b/man/Chromatogram-class.Rd index e3a8db9dd..51ce6a657 100644 --- a/man/Chromatogram-class.Rd +++ b/man/Chromatogram-class.Rd @@ -18,11 +18,12 @@ \alias{length,Chromatogram-method} \alias{as.data.frame,Chromatogram-method} \alias{filterRt,Chromatogram-method} +\alias{clean,Chromatogram-method} \title{Representation of chromatographic MS data} \usage{ -Chromatogram(rtime = numeric(), intensity = numeric(), mz = c(0, 0), - filterMz = c(0, 0), precursorMz = c(NA_real_, NA_real_), - productMz = c(NA_real_, NA_real_), fromFile = integer(), +Chromatogram(rtime = numeric(), intensity = numeric(), mz = c(NA_real_, + NA_real_), filterMz = c(NA_real_, NA_real_), precursorMz = c(NA_real_, + NA_real_), productMz = c(NA_real_, NA_real_), fromFile = integer(), aggregationFun = character()) \S4method{show}{Chromatogram}(object) @@ -46,6 +47,8 @@ Chromatogram(rtime = numeric(), intensity = numeric(), mz = c(0, 0), \S4method{as.data.frame}{Chromatogram}(x) \S4method{filterRt}{Chromatogram}(object, rt) + +\S4method{clean}{Chromatogram}(object, all = FALSE) } \arguments{ \item{rtime}{\code{numeric} with the retention times (length has to be equal @@ -74,21 +77,27 @@ Represents the mz of the product. See details for more information.} chromatogram was extracted.} \item{aggregationFun}{\code{character} string specifying the function that -was used to aggregate intensity values for the same retention time across the -mz range. Supported are \code{"sum"} (total ion chromatogram), \code{"max"} -(base peak chromatogram), \code{"min"} and \code{"mean"}.} +was used to aggregate intensity values for the same retention time across +the mz range. Supported are \code{"sum"} (total ion chromatogram), +\code{"max"} (base peak chromatogram), \code{"min"} and \code{"mean"}.} \item{object}{A \code{Chromatogram} object.} \item{filter}{For \code{mz}: whether the mz range used to filter the -original object should be returned (\code{filter = TRUE}), or the mz range -calculated on the real data (\code{filter = FALSE}).} +original object should be returned (\code{filter = TRUE}), or the mz +range calculated on the real data (\code{filter = FALSE}).} \item{x}{For \code{as.data.frame} and \code{length}: a \code{Chromatogram} object.} \item{rt}{For \code{filterRt}: \code{numeric(2)} defining the lower and upper retention time for the filtering.} + +\item{all}{For \code{clean}: \code{logical(1)} whether all \code{0} intensity +value pairs should be removed (defaults to \code{FALSE}).} +} +\value{ +For \code{clean}: a \emph{cleaned} \code{Chromatogram} object. } \description{ The \code{Chromatogram} class is designed to store @@ -100,36 +109,42 @@ The \code{Chromatogram} class is designed to store \code{\link{extractChromatograms}}). \code{Chromatogram}: create an instance of the -\code{Chromatogram} class. + \code{Chromatogram} class. \code{rtime} returns the retention times for the rentention time -- intensity pairs stored in the chromatogram. + - intensity pairs stored in the chromatogram. \code{intensity} returns the intensity for the rentention time -- intensity pairs stored in the chromatogram. + - intensity pairs stored in the chromatogram. \code{mz} get the mz (range) of the chromatogram. The -function returns a \code{numeric(2)} with the lower and upper mz value. + function returns a \code{numeric(2)} with the lower and upper mz value. \code{precursorMz} get the mz of the precursor ion. The -function returns a \code{numeric(2)} with the lower and upper mz value. + function returns a \code{numeric(2)} with the lower and upper mz value. \code{productMz} get the mz of the product chromatogram/ion. The -function returns a \code{numeric(2)} with the lower and upper mz value. + function returns a \code{numeric(2)} with the lower and upper mz value. \code{aggregationFun,aggregationFun<-} get or set the -aggregation function. + aggregation function. \code{fromFile} returns the value from the \code{fromFile} slot. \code{length} returns the length (number of retention time - -intensity pairs) of the chromatogram. + intensity pairs) of the chromatogram. \code{as.data.frame} returns the \code{rtime} and -\code{intensity} values from the object as \code{data.frame}. + \code{intensity} values from the object as \code{data.frame}. \code{filterRt}: filters the chromatogram based on the provided -retention time range. + retention time range. + +\code{clean}: \emph{cleans} a \code{Chromatogram} class by + removing all \code{0} and \code{NA} intensity signals (along with the + associates retention times). By default (if \code{all = FALSE}) \code{0} + values that are directly adjacent to peaks are kept too. \code{NA} + values are always removed. } \details{ The \code{mz}, \code{filterMz}, \code{precursorMz} and @@ -170,11 +185,26 @@ range(rtime(chr)) chr2 <- filterRt(chr, rt = c(4, 10)) range(rtime(chr2)) + +## Create a simple Chromatogram object + +chr <- Chromatogram(rtime = 1:12, + intensity = c(0, 0, 20, 0, 0, 0, 123, 124343, 3432, 0, 0, 0)) + +## Remove 0-intensity values keeping those adjacent to peaks +chr <- clean(chr) +intensity(chr) + +## Remove all 0-intensity values +chr <- clean(chr, all = TRUE) +intensity(chr) } \seealso{ \code{\link{extractChromatograms}} for the method to extract \code{Chromatogram} objects from \code{\link{XCMSnExp}} or \code{\link[MSnbase]{OnDiskMSnExp}} objects. + + \code{\link{plotChromatogram}} to plot \code{Chromatogram} objects. } \author{ Johannes Rainer diff --git a/man/XCMSnExp-class.Rd b/man/XCMSnExp-class.Rd index 7cdff0bfb..2f5caf7aa 100644 --- a/man/XCMSnExp-class.Rd +++ b/man/XCMSnExp-class.Rd @@ -109,7 +109,7 @@ processHistoryTypes() \S4method{featureDefinitions}{XCMSnExp}(object) <- value \S4method{chromPeaks}{XCMSnExp}(object, bySample = FALSE, rt = numeric(), - mz = numeric(), ppm = 10, type = "any") + mz = numeric(), ppm = 0, type = "any") \S4method{chromPeaks}{XCMSnExp}(object) <- value @@ -545,13 +545,21 @@ head(peaks(xs)) \code{\linkS4class{xcmsSet}} for the old implementation. \code{\link[MSnbase]{OnDiskMSnExp}}, \code{\link[MSnbase]{MSnExp}} and \code{\link[MSnbase]{pSet}} for a complete list of inherited methods. + \code{\link{findChromPeaks}} for available peak detection methods returning a \code{XCMSnExp} object as a result. + \code{\link{groupChromPeaks}} for available peak grouping methods and \code{\link{featureDefinitions}} for the method to extract the feature definitions representing the peak grouping results. \code{\link{adjustRtime}} for retention time adjustment methods. + \code{\link{extractChromatograms}} to extract MS data as + \code{\link{Chromatogram}} objects. + + \code{\link{extractMsData}} for the method to extract MS data as + \code{data.frame}s. + \code{\link{fillChromPeaks}} for the method to fill-in eventually missing chromatographic peaks for a feature in some samples. } diff --git a/man/extractChromatograms-method.Rd b/man/extractChromatograms-method.Rd index e7cc1f047..a95568246 100644 --- a/man/extractChromatograms-method.Rd +++ b/man/extractChromatograms-method.Rd @@ -8,39 +8,67 @@ \title{Extracting chromatograms} \usage{ \S4method{extractChromatograms}{OnDiskMSnExp}(object, rt, mz, - aggregationFun = "sum") + aggregationFun = "sum", missing = NA_real_) \S4method{extractChromatograms}{XCMSnExp}(object, rt, mz, - adjustedRtime = hasAdjustedRtime(object), aggregationFun = "sum") + adjustedRtime = hasAdjustedRtime(object), aggregationFun = "sum", + missing = NA_real_) } \arguments{ \item{object}{Either a \code{\link[MSnbase]{OnDiskMSnExp}} or \code{\link{XCMSnExp}} object from which the chromatograms should be extracted.} -\item{rt}{\code{numeric(2)} defining the lower and upper boundary for the -retention time range. If not specified, the full retention time range of -the original data will be used. It is also possible to submit a -\code{numeric(1)} in which case \code{range} is called on it to -transform it to a \code{numeric(2)}.} +\item{rt}{\code{numeric(2)} or two-column \code{matrix} defining the lower +and upper boundary for the retention time range(s). If not specified, +the full retention time range of the original data will be used. +It is also possible to submit a \code{numeric(1)} in which case +\code{range} is called on it to transform it to a \code{numeric(2)}.} -\item{mz}{\code{numeric(2)} defining the lower and upper mz value for the -MS data slice. If not specified, the chromatograms will be calculated on -the full mz range. It is also possible to submit a \code{numeric(1)} in -which case \code{range} is called on it to transform it to a -\code{numeric(2)}.} +\item{mz}{\code{numeric(2)} or two-column \code{matrix} defining the lower +and upper mz value for the MS data slice(s). If not specified, the +chromatograms will be calculated on the full mz range. +It is also possible to submit a \code{numeric(1)} in which case +\code{range} is called on it to transform it to a \code{numeric(2)}.} \item{aggregationFun}{\code{character} specifying the function to be used to aggregate intensity values across the mz value range for the same retention time. Allowed values are \code{"sum"}, \code{"max"}, \code{"mean"} and \code{"min"}.} +\item{missing}{\code{numeric(1)} allowing to specify the intensity value to +be used if for a given retention time no signal was measured within the +mz range of the corresponding scan. Defaults to \code{NA_real_} (see also +Details and Notes sections below). Use \code{missing = 0} to resemble the +behaviour of the \code{getEIC} from the \code{old} user interface.} + \item{adjustedRtime}{For \code{extractChromatograms,XCMSnExp}: whether the adjusted (\code{adjustedRtime = TRUE}) or raw retention times (\code{adjustedRtime = FALSE}) should be used for filtering and returned in the resulting \code{\link{Chromatogram}} object. Adjusted retention times are used by default if available.} } +\value{ +If a single \code{rt} and \code{mz} range was specified, + \code{extractChromatograms} returns a \code{list} of + \code{\link{Chromatogram}} classes each element being the chromatogram + for one of the samples for the specified range. + If multiple \code{rt} and \code{mz} ranges were provided (i.e. by passing + a multi-row \code{matrix} to parameters \code{rt} or \code{mz}), the + function returns a \code{list} of \code{list}s. The outer list + representing results for the various ranges, the inner the result across + files. In other words, \code{result[[1]]} returns a \code{list} with + \code{Chromatogram} classes length equal to the number of files, each + element representing the \code{Chromatogram} for the first rt/mz range + for one file. + An empty \code{list} is returned if no MS1 data is present in + \code{object} or if not a single spectrum is available for any of the + provided retention time ranges in \code{rt}. An empty \code{Chromatogram} + object is returned at the correponding position in the result \code{list} + if for the specific file no scan/spectrum was measured in the provided + rt window. In all other cases, a \code{Chromatogram} with length equal + to the number of scans/spectra in the provided rt range is returned. +} \description{ \code{extractChromatograms}: the method allows to extract chromatograms from \code{\link[MSnbase]{OnDiskMSnExp}} and @@ -48,17 +76,26 @@ times are used by default if available.} } \details{ Arguments \code{rt} and \code{mz} allow to specify the MS - data slice from which the chromatogram should be extracted. The - parameter \code{aggregationSum} allows to specify the function to be + data slice from which the chromatogram should be extracted. + The parameter \code{aggregationSum} allows to specify the function to be used to aggregate the intensities across the mz range for the same retention time. Setting \code{aggregationFun = "sum"} would e.g. allow to calculate the \emph{total ion chromatogram} (TIC), \code{aggregationFun = "max"} the \emph{base peak chromatogram} (BPC). + The length of the extracted \code{Chromatogram} object, i.e. the number + of available data points, corresponds to the number of scans/spectra + measured in the specified retention time range. If in a specific scan + (for a give retention time) no signal was measured in the specified mz + range, a \code{NA_real_} is reported as intensity for the retention time + (see Notes for more information). This can be changed using the + \code{missing} parameter. } \note{ \code{Chromatogram} objects extracted with \code{extractChromatogram} - contain \code{NA_real_} values if, for a given retention time, no valid - measurement was available for the provided mz range. + contain \code{NA_real_} values if, for a given retention time, no + signal was measured in the specified mz range. If no spectrum/scan is + present in the defined retention time window a \code{Chromatogram} object + of length 0 is returned. For \code{\link{XCMSnExp}} objects, if adjusted retention times are available, the \code{extractChromatograms} method will by default report @@ -85,11 +122,30 @@ plot(rtime(chrs[[2]]), intensity(chrs[[2]]), type = "l", xlab = "rtime", for(i in c(1, 3)) { points(rtime(chrs[[i]]), intensity(chrs[[i]]), type = "l", col = "00000080") } + +## Plot the chromatogram using plotChromatogram +plotChromatogram(chrs) + +## Extract chromatograms for multiple ranges. +mzr <- matrix(c(335, 335, 344, 344), ncol = 2, byrow = TRUE) +rtr <- matrix(c(2700, 2900, 2600, 2750), ncol = 2, byrow = TRUE) +chrs <- extractChromatograms(od, mz = mzr, rt = rtr) + +## Plot the extracted chromatograms +par(mfrow = c(1, 2)) +plotChromatogram(chrs[[1]]) +plotChromatogram(chrs[[2]]) } \seealso{ \code{\link{XCMSnExp}} for the data object. \code{\link{Chromatogram}} for the object representing chromatographic data. + + \code{\link{plotChromatogram}} to plot a \code{Chromatogram} or + \code{list} of such objects. + + \code{\link{extractMsData}} for a method to extract the MS data as + \code{data.frame}. } \author{ Johannes Rainer diff --git a/man/extractMsData-method.Rd b/man/extractMsData-method.Rd new file mode 100644 index 000000000..ac527ff96 --- /dev/null +++ b/man/extractMsData-method.Rd @@ -0,0 +1,64 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/methods-OnDiskMSnExp.R, R/methods-XCMSnExp.R +\docType{methods} +\name{extractMsData,OnDiskMSnExp-method} +\alias{extractMsData,OnDiskMSnExp-method} +\alias{extractMsData,XCMSnExp-method} +\alias{extractMsData} +\title{Extract a \code{data.frame} containing MS data} +\usage{ +\S4method{extractMsData}{OnDiskMSnExp}(object, rt, mz) + +\S4method{extractMsData}{XCMSnExp}(object, rt, mz, + adjustedRtime = hasAdjustedRtime(object)) +} +\arguments{ +\item{object}{A \code{XCMSnExp} or \code{OnDiskMSnExp} object.} + +\item{rt}{\code{numeric(2)} with the retention time range from which the +data should be extracted.} + +\item{mz}{\code{numeric(2)} with the mz range.} + +\item{adjustedRtime}{(for \code{extractMsData,XCMSnExp}): \code{logical(1)} +specifying if adjusted or raw retention times should be reported. +Defaults to adjusted retention times, if these are present in +\code{object}.} +} +\value{ +A \code{list} of length equal to the number of samples/files in + \code{object}. Each element being a \code{data.frame} with columns + \code{"rt"}, \code{"mz"} and \code{"i"} with the retention time, mz and + intensity tuples of a file. If no data is available for the mz-rt range + in a file a \code{data.frame} with 0 rows is returned for that file. +} +\description{ +Extract a \code{data.frame} of retention time, mz and intensity + values from each file/sample in the provided rt-mz range (or for the full + data range if \code{rt} and \code{mz} are not defined). +} +\examples{ +## Read some files from the test data package. +library(faahKO) +library(xcms) +fls <- dir(system.file("cdf/KO", package = "faahKO"), recursive = TRUE, + full.names = TRUE) +raw_data <- readMSData2(fls[1:2]) + +## Read the full MS data for a defined mz-rt region. +res <- extractMsData(raw_data, mz = c(300, 320), rt = c(2700, 2900)) + +## We've got one data.frame per file +length(res) + +## With number of rows: +nrow(res[[1]]) + +head(res[[1]]) +} +\seealso{ +\code{\link{XCMSnExp}} for the data object. +} +\author{ +Johannes Rainer +} diff --git a/man/groupChromPeaks-density.Rd b/man/groupChromPeaks-density.Rd index bf13d6532..1c8b2bd42 100644 --- a/man/groupChromPeaks-density.Rd +++ b/man/groupChromPeaks-density.Rd @@ -214,7 +214,9 @@ Profiling Using Nonlinear Peak Alignment, Matching, and Identification" The \code{\link{do_groupChromPeaks_density}} core API function and \code{\link{group.density}} for the old user interface. -\code{\link{featureDefinitions}} and +\code{\link{plotChromPeakDensity}} to plot peak densities and + evaluate different algorithm settings. + \code{\link{featureDefinitions}} and \code{\link{featureValues,XCMSnExp-method}} for methods to access the features (i.e. the peak grouping results). diff --git a/man/plotChromPeakDensity.Rd b/man/plotChromPeakDensity.Rd new file mode 100644 index 000000000..9fe333079 --- /dev/null +++ b/man/plotChromPeakDensity.Rd @@ -0,0 +1,101 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/functions-XCMSnExp.R +\name{plotChromPeakDensity} +\alias{plotChromPeakDensity} +\title{Plot chromatographic peak density along the retention time axis} +\usage{ +plotChromPeakDensity(object, mz, rt, param = PeakDensityParam(), + col = "#00000080", xlab = "retention time", ylab = "sample", + xlim = range(rt), ...) +} +\arguments{ +\item{object}{A \code{\link{XCMSnExp}} object with identified +chromatographic peaks.} + +\item{mz}{\code{numeric(2)} defining an mz range for which the peak density +should be plotted.} + +\item{rt}{\code{numeric(2)} defining an optional rt range for which the +peak density should be plotted. Defaults to the absolute retention time +range of \code{object}.} + +\item{param}{\code{\link{PeakDensityParam}} from which parameters for the +\emph{peak density} correspondence algorithm can be extracted.} + +\item{col}{Color to be used for the individual samples. Length has to be 1 +or equal to the number of samples in \code{object}.} + +\item{xlab}{\code{character(1)} with the label for the x-axis.} + +\item{ylab}{\code{character(1)} with the label for the y-axis.} + +\item{xlim}{\code{numeric(2)} representing the limits for the x-axis. +Defaults to the range of the \code{rt} parameter.} + +\item{...}{Additional parameters to be passed to the \code{plot} function.} +} +\value{ +The function is called for its side effect, i.e. to create a plot. +} +\description{ +Plot the density of chromatographic peaks along the retention + time axis and indicate which peaks would be grouped into the same feature + based using the \emph{peak density} correspondence method. Settings for + the \emph{peak density} method can be passed with an + \code{\link{PeakDensityParam}} object to parameter \code{param}. +} +\details{ +The \code{plotChromPeakDensity} function allows to evaluate + different settings for the \emph{peak density} on an mz slice of + interest (e.g. containing chromatographic peaks corresponding to a known + metabolite). + The plot shows the individual peaks that were detected within the + specified \code{mz} slice at their retention time (x-axis) and sample in + which they were detected (y-axis). The density function is plotted as a + black line. Parameters for the \code{density} function are taken from the + \code{param} object. Grey rectangles indicate which chromatographic peaks + would be grouped into a feature by the \emph{peak density} correspondence + method. Parameters for the algorithm are also taken from \code{param}. + See \code{\link{groupChromPeaks-density}} for more information about the + algorithm and its supported settings. +} +\examples{ + +## Below we perform first a peak detection (using the centWave +## method) on some of the test files from the faahKO package. +library(faahKO) +library(xcms) +fls <- dir(system.file("cdf/KO", package = "faahKO"), recursive = TRUE, + full.names = TRUE) + +## Reading 2 of the KO samples +raw_data <- readMSData2(fls[1:2]) + +## Perform the peak detection using the centWave method. +res <- findChromPeaks(raw_data, param = CentWaveParam(noise = 1000)) + +## Align the samples using obiwarp +res <- adjustRtime(res, param = ObiwarpParam()) + +## Plot the chromatographic peak density for a specific mz range to evaluate +## different peak density correspondence settings. +mzr <- c(305.05, 305.15) + +plotChromPeakDensity(res, mz = mzr, param = PeakDensityParam(), pch = 16) + +## Use a larger bandwidth +plotChromPeakDensity(res, mz = mzr, param = PeakDensityParam(bw = 60), + pch = 16) +## Neighboring peaks are now fused into one. + +## Require the chromatographic peak to be present in all samples of a group +plotChromPeakDensity(res, mz = mzr, pch = 16, + param = PeakDensityParam(minFraction = 1)) +} +\seealso{ +\code{\link{groupChromPeaks-density}} for details on the + \emph{peak density} correspondence method and supported settings. +} +\author{ +Johannes Rainer +} diff --git a/man/plotChromatogram.Rd b/man/plotChromatogram.Rd new file mode 100644 index 000000000..03ff29dba --- /dev/null +++ b/man/plotChromatogram.Rd @@ -0,0 +1,115 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/functions-Chromatogram.R +\name{plotChromatogram} +\alias{plotChromatogram} +\alias{highlightChromPeaks} +\title{Plot Chromatogram objects} +\usage{ +plotChromatogram(x, rt, col = "#00000060", lty = 1, type = "l", + xlab = "retention time", ylab = "intensity", main = NULL, ...) + +highlightChromPeaks(x, rt, mz, border = rep("00000040", length(fileNames(x))), + lwd = 1, col = NA, type = c("rect", "point"), ...) +} +\arguments{ +\item{x}{For \code{plotChromatogram}: \code{list} of +\code{\link{Chromatogram}} objects. Such as extracted from an +\code{\link{XCMSnExp}} object by the \code{\link{extractChromatograms}} +method. +For \code{highlightChromPeaks}: \code{XCMSnExp} object with the detected +peaks.} + +\item{rt}{For \code{plotChromatogram}: \code{numeric(2)}, optional parameter +to subset each \code{Chromatogram} by retention time prior to plotting. +Alternatively, the plot could be subsetted by passing a \code{xlim} +parameter. +For \code{highlightChromPeaks}: \code{numeric(2)} with the +retention time range from which peaks should be extracted and plotted.} + +\item{col}{For \code{plotChromatogram}: color definition for each +line/sample. Has to have the same length as samples/elements in \code{x}, +otherwise \code{col[1]} is recycled to generate a vector of +\code{length(x)}. +For \code{highlightChromPeaks}: color to be used to fill the +rectangle.} + +\item{lty}{the line type. See \code{\link[graphics]{plot}} for more details.} + +\item{type}{the plotting type. See \code{\link[graphics]{plot}} for more +details. +For \code{highlightChromPeaks}: \code{character(1)} defining how the peak +should be highlighted: \code{type = "rect"} draws a rectangle +representing the peak definition, \code{type = "point"} indicates a +chromatographic peak with a single point at the position of the peak's +\code{"rt"} and \code{"maxo"}.} + +\item{xlab}{\code{character(1)} with the label for the x-axis.} + +\item{ylab}{\code{character(1)} with the label for the y-axis.} + +\item{main}{The title for the plot. For \code{plotChromatogram}: if +\code{main = NULL} the mz range of the \code{Chromatogram} object(s) will +be used as the title.} + +\item{...}{additional parameters to the \code{\link{matplot}} or \code{plot} +function.} + +\item{mz}{\code{numeric(2)} with the mz range from which the peaks should +be extracted and plotted.} + +\item{border}{colors to be used to color the border of the rectangles. Has to +be equal to the number of samples in \code{x}.} + +\item{lwd}{\code{numeric(1)} defining the width of the line/border.} +} +\description{ +\code{plotChromatogram} creates a chromatogram plot for a + single \code{Chromatogram} object or a \code{list} of + \code{\link{Chromatogram}} objects (one line for each + \code{\link{Chromatogram}}/sample). + +The \code{highlightChromPeaks} function adds chromatographic + peak definitions to an existing plot, such as one created by the + \code{plotChromatograms} function. +} +\details{ +The \code{plotChromatogram} function allows to efficiently plot + the chromatograms of several samples into a single plot. +} +\examples{ + +## Perform a fast peak detection. +library(xcms) +library(faahKO) +faahko_3_files <- c(system.file('cdf/KO/ko15.CDF', package = "faahKO"), + system.file('cdf/KO/ko16.CDF', package = "faahKO"), + system.file('cdf/KO/ko18.CDF', package = "faahKO")) + +od <- readMSData2(faahko_3_files) + +od <- findChromPeaks(od, param = CentWaveParam(snthresh = 20, noise = 10000)) + +rtr <- c(2600, 2750) +mzr <- c(344, 344) +chrs <- extractChromatograms(od, rt = rtr, mz = mzr) + +## Plot a single chromatogram +plotChromatogram(chrs[[1]]) + +## Plot all chromatograms at once, using different colors for each. +plotChromatogram(chrs, col = c("#FF000080", "#00FF0080", "#0000FF80"), lwd = 2) + +## Highlight identified chromatographic peaks. +highlightChromPeaks(od, rt = rtr, mz = mzr, + col = c("#FF000005", "#00FF0005", "#0000FF05"), + border = c("#FF000040", "#00FF0040", "#0000FF40")) + +} +\seealso{ +\code{\link{extractChromatograms}} for how to extract a list of + \code{\link{Chromatogram}} objects from an \code{\link{XCMSnExp}} + objects. +} +\author{ +Johannes Rainer +} diff --git a/man/useOriginalCode.Rd b/man/useOriginalCode.Rd index d432f8b74..fb223073f 100644 --- a/man/useOriginalCode.Rd +++ b/man/useOriginalCode.Rd @@ -12,23 +12,22 @@ old code should be used in corresponding functions. If not provided the function simply returns the value of the global option.} } \value{ -logical(1) indicating whether old code is being -used. +logical(1) indicating whether old code is being used. } \description{ This function allows to enable the usage of old, partially -deprecated code from xcms by setting a corresponding global option. See -details for functions affected. + deprecated code from xcms by setting a corresponding global option. See + details for functions affected. } \details{ The functions/methods that will be affected by this are: -\itemize{ -\item \code{\link{do_findChromPeaks_matchedFilter}} -} + \itemize{ + \item \code{\link{do_findChromPeaks_matchedFilter}} + } } \note{ Usage of old code is strongly dicouraged. This function is thought -to be used mainly in the transition phase from xcms to xcms version 3. + to be used mainly in the transition phase from xcms to xcms version 3. } \author{ Johannes Rainer diff --git a/tests/doRUnit.R b/tests/doRUnit.R index 700e4bcd4..729feb8af 100644 --- a/tests/doRUnit.R +++ b/tests/doRUnit.R @@ -42,6 +42,9 @@ if(require("RUnit", quietly=TRUE)) { snthresh = 40)) faahko_xs <- xcmsSet(faahko_3_files, profparam = list(step = 0), method = "centWave", noise = 10000, snthresh = 40) + ## faahko_xod <- findChromPeaks(faahko_od, param = CentWaveParam(noise = 5000)) + ## faahko_xs <- xcmsSet(faahko_3_files, profparam = list(step = 0), + ## method = "centWave", noise = 5000) ## Doing also the retention time correction etc od_x <- faahko_od xod_x <- faahko_xod diff --git a/vignettes/new_functionality.Rmd b/vignettes/new_functionality.Rmd index 0383cc15c..e658787f0 100644 --- a/vignettes/new_functionality.Rmd +++ b/vignettes/new_functionality.Rmd @@ -133,11 +133,22 @@ Alternatively we can use the `extractChromatograms` method that extracts chromatograms from the object. In the example below we extract the *base peak chromatogram* (BPC) by setting `aggregationFun` to `"max"` and not specifying an `rt` or `mz` range to extract only a data subset. In contrast to the `tic` and `bpi` -methods, this function reads the data from the raw files. +methods, this function reads the data from the raw files. It takes thus more +time to create the plot, but it is based on the actual raw data that is used for +the later analysis - the `tic` and `bpi` methods access only the information that is +stored in the raw data files by the MS detector during the data acquisition. ```{r faahKO-bpi, message = FALSE, fig.align = "center", fig.width = 8, fig.height = 4} ## Get the base peak chromatograms. This reads data from the files. bpis <- extractChromatograms(raw_data, aggregationFun = "max") +## Plot the list of Chromatogram objects. +plotChromatogram(bpis, col = paste0(sample_colors[pData(raw_data)$sample_group], 80)) +``` + +While the `plotChromatogram` function if very convenient (and fast), it would also +not be too difficult to create the plot manually: + +```{r faahKO-bbpi-manual, message = FALSE, fig.align = "center", fig.width = 8, fig.height = 4} plot(3, 3, pch = NA, xlim = range(unlist(lapply(bpis, rtime))), ylim = range(unlist(lapply(bpis, intensity))), main = "BPC", xlab = "rtime", ylab = "intensity") @@ -148,7 +159,7 @@ for (i in 1:length(bpis)) { ``` Note that we could restrict the analysis to a certain retention time range by -sub-setting `raw_data` with the `filterRt` method. +first sub-setting `raw_data` with the `filterRt` method. In addition we can plot the distribution of the total ion counts per file. In contrast to sub-setting the object we split the numeric vector returned by the @@ -174,7 +185,7 @@ Next we perform the chromatographic peak detection using the *centWave* algorith parameters, but the settings should be adjusted to each experiment individually based on e.g. the expected width of the chromatographic peaks etc. -```{r faahKO-centWave} +```{r faahKO-centWave, message = FALSE, warning = FALSE} ## Defining the settings for the centWave peak detection. cwp <- CentWaveParam(snthresh = 20, noise = 1000) xod <- findChromPeaks(raw_data, param = cwp) @@ -199,8 +210,14 @@ for the updated user interface. Next we extract the chromatogram for the rt-mz region corresponding to one detected chromatographic peak increasing the region in rt dimension by +/- 60 -seconds. In addition we extract also all chromatographic peaks in that region by -passing the same `mz` and `rt` parameters to the `chromPeaks` method. +seconds. In addition we extract also the full chromatogram for the specified mz +range (i.e. the full rt range) and identify all chromatographic peaks in that +region by passing the same `mz` and `rt` parameters to the `chromPeaks` method. + +If two-column matrices are passed to the `extractChromatograms` method with +parameters `rt` and `mz`, the function returns a `list`, each element being a `list` of +`Chromatogram` objects representing the chromatogram for the respective +ranges. ```{r faahKO-chromPeaks-extractChroms, warning = FALSE} rtr <- chromPeaks(xod)[68, c("rtmin", "rtmax")] @@ -209,32 +226,30 @@ rtr[1] <- rtr[1] - 60 rtr[2] <- rtr[2] + 60 mzr <- chromPeaks(xod)[68, c("mzmin", "mzmax")] +## Add an rt range that would extract the full chromatogram +rtr <- rbind(c(-Inf, Inf), rtr) +mzr <- rbind(mzr, mzr) + chrs <- extractChromatograms(xod, rt = rtr, mz = mzr) ## In addition we get all peaks detected in the same region pks <- chromPeaks(xod, rt = rtr, mz = mzr) +pks ``` Next we plot the extracted chromatogram for the data and highlight in addition the identified peaks. -```{r faahKO-extracted-chrom-with-peaks, message = FALSE, fig.cap = "Extracted ion chromatogram for one of the identified peaks. Each line represents the signal measured in one sample. The rectangles indicate the margins of the identified chromatographic peak in the respective sample.", fig.align = "center", fig.width = 8, fig.height = 8} -## Define the limits on x- and y-dimension -xl <- range(lapply(chrs, rtime), na.rm = TRUE) -yl <- range(lapply(chrs, intensity), na.rm = TRUE) -plot(3, 3, pch = NA, main = paste(format(mzr, digits = 6), collapse = "-"), - xlab = "rt", ylab = "intensity", xlim = xl, ylim = yl) -## Plot the chromatogram per sample -for (i in 1:length(chrs)) { - points(rtime(chrs[[i]]), intensity(chrs[[i]]), type = "l", - col = sample_colors[pData(xod)$sample_group[i]]) -} -## Highlight the identified chromatographic peaks. -for (i in 1:nrow(pks)) { - rect(xleft = pks[i, "rtmin"], xright = pks[i, "rtmax"], ybottom = 0, - ytop = pks[i, "maxo"], - border = paste0(sample_colors[pData(xod)$sample_group][pks[i, "sample"]], 60)) -} +```{r faahKO-extracted-chrom-with-peaks, message = FALSE, fig.cap = "Extracted ion chromatogram for one of the identified peaks. Left: full retention time range, right: rt range of the peak. Each line represents the signal measured in one sample. The rectangles indicate the margins of the identified chromatographic peak in the respective sample.", fig.align = "center", fig.width = 12, fig.height = 6} +## Plot the full rt range: +plotChromatogram(chrs[[1]], + col = paste0(sample_colors[pData(xod)$sample_group], 80)) +## And now for the peak range. +plotChromatogram(chrs[[2]], + col = paste0(sample_colors[pData(xod)$sample_group], 80)) +## Highlight also the identified chromatographic peaks. +highlightChromPeaks(xod, rt = rtr[2, ], mzr[2, ], + border = paste0(sample_colors[pData(xod)$sample_group], 40)) ``` Note that the `extractChromatograms` does return an `NA` value if in a certain scan @@ -266,13 +281,8 @@ times per sample using the `plotAdjustedRtime` function. bpis <- extractChromatograms(xod, aggregationFun = "max") par(mfrow = c(2, 1), mar = c(4.5, 4.2, 1, 0.5)) -plot(3, 3, pch = NA, xlim = range(unlist(lapply(bpis, rtime))), - ylim = range(unlist(lapply(bpis, intensity))), main = "BPC", - xlab = "rtime", ylab = "intensity") -for (i in 1:length(bpis)) { - points(rtime(bpis[[i]]), intensity(bpis[[i]]), type = "l", - col = paste0(sample_colors[pData(xod)$sample_group[i]], 80)) -} +plotChromatogram(bpis, + col = paste0(sample_colors[pData(xod)$sample_group[i]], 80)) ## Plot also the difference of adjusted to raw retention time. plotAdjustedRtime(xod, col = paste0(sample_colors[pData(xod)$sample_group], 80)) ``` @@ -299,10 +309,11 @@ The 3rd sample was used as *center* sample against which all other samples were aligned to, hence its adjusted retention times are identical to the raw retention times. -We are again plotting the extracted ion chromatogram for the selected peaks from -above to evaluate the impact of the alignment. +Below we plot the extracted ion chromatogram for the selected peak from the +example above before and after retention time correction to evaluate the impact +of the alignment. -```{r faahKO-extracted-chrom-with-peaks-aligned, echo = FALSE, message = FALSE, fig.cap = "Extracted ion chromatogram for one of the identified peaks after alignment.", fig.align = "center", fig.width = 8, fig.height = 8} +```{r faahKO-extracted-chrom-with-peaks-aligned, echo = FALSE, message = FALSE, fig.cap = "Extracted ion chromatogram for one of the identified peaks before and after alignment.", fig.align = "center", fig.width = 8, fig.height = 8} rtr <- chromPeaks(xod)[68, c("rtmin", "rtmax")] ## Increase the range: rtr[1] <- rtr[1] - 60 @@ -310,26 +321,15 @@ rtr[2] <- rtr[2] + 60 mzr <- chromPeaks(xod)[68, c("mzmin", "mzmax")] chrs <- extractChromatograms(xod, rt = rtr, mz = mzr) - -## In addition we get all peaks detected in the same region -pks <- chromPeaks(xod, rt = rtr, mz = mzr) - -## Define the limits on x- and y-dimension -xl <- range(lapply(chrs, rtime), na.rm = TRUE) -yl <- range(lapply(chrs, intensity), na.rm = TRUE) -plot(3, 3, pch = NA, main = paste(format(mzr, digits = 6), collapse = "-"), - xlab = "rt", ylab = "intensity", xlim = xl, ylim = yl) -## Plot the chromatogram per sample -for (i in 1:length(chrs)) { - points(rtime(chrs[[i]]), intensity(chrs[[i]]), type = "l", - col = sample_colors[pData(xod)$sample_group[i]]) -} -## Highlight the identified chromatographic peaks. -for (i in 1:nrow(pks)) { - rect(xleft = pks[i, "rtmin"], xright = pks[i, "rtmax"], ybottom = 0, - ytop = pks[i, "maxo"], - border = paste0(sample_colors[pData(xod)$sample_group][pks[i, "sample"]], 60)) -} +chrs_raw <- extractChromatograms(raw_data, rt = rtr, mz = mzr) + +par(mfrow = c(2, 1)) +plotChromatogram(chrs_raw, + col = paste0(sample_colors[pData(xod)$sample_group], 80)) +plotChromatogram(chrs, + col = paste0(sample_colors[pData(xod)$sample_group], 80)) +highlightChromPeaks(xod, rt = rtr, mzr, + border = paste0(sample_colors[pData(xod)$sample_group], 40)) ``` After alignment, the peaks are nicely overlapping. diff --git a/vignettes/new_functionality.org b/vignettes/new_functionality.org index e9df02811..8411bc4c3 100644 --- a/vignettes/new_functionality.org +++ b/vignettes/new_functionality.org @@ -84,10 +84,12 @@ an LS/GC-MS experiment are referred to as /chromatographic peaks/. The respectiv method to identify such peaks is hence called =findChromPeaks= and the identified peaks can be accessed using the =XCMSnExp= =chromPeaks= method. The results from an correspondence analysis which aims to match and group chromatographic peaks -within and between samples are called /features/. The definition of such mz-rt -features (i.e. the result from the =groupChromPeaks= method) can be accessed /via/ -the =featureDefinitions= method of the =XCMSnExp= class. Finally, alignment -(retention time correction) can be performed using the =adjustRtime= method. +within and between samples are called /features/. A feature corresponds to +individual ions with a unique mass-to-charge ratio (mz) and a unique retention +time (rt). The definition of such mz-rt features (i.e. the result from the +=groupChromPeaks= method) can be accessed /via/ the =featureDefinitions= method of +the =XCMSnExp= class. Finally, alignment (retention time correction) can be +performed using the =adjustRtime= method. The settings for any of the new analysis methods are bundled in /parameter/ classes, one class for each method. This encapsulation of the parameters to a @@ -149,12 +151,25 @@ Alternatively we can use the =extractChromatograms= method that extracts chromatograms from the object. In the example below we extract the /base peak chromatogram/ (BPC) by setting =aggregationFun= to ="max"= and not specifying an =rt= or =mz= range to extract only a data subset. In contrast to the =tic= and =bpi= -methods, this function reads the data from the raw files. +methods, this function reads the data from the raw files. It takes thus more +time to create the plot, but it is based on the actual raw data that is used for +the later analysis - the =tic= and =bpi= methods access only the information that is +stored in the raw data files by the MS detector during the data acquisition. #+NAME: faahKO-bpi #+BEGIN_SRC R :ravel message = FALSE, fig.align = "center", fig.width = 8, fig.height = 4 ## Get the base peak chromatograms. This reads data from the files. bpis <- extractChromatograms(raw_data, aggregationFun = "max") + ## Plot the list of Chromatogram objects. + plotChromatogram(bpis, col = paste0(sample_colors[pData(raw_data)$sample_group], 80)) + +#+END_SRC + +While the =plotChromatogram= function if very convenient (and fast), it would also +not be too difficult to create the plot manually: + +#+NAME: faahKO-bbpi-manual +#+BEGIN_SRC R :ravel message = FALSE, fig.align = "center", fig.width = 8, fig.height = 4 plot(3, 3, pch = NA, xlim = range(unlist(lapply(bpis, rtime))), ylim = range(unlist(lapply(bpis, intensity))), main = "BPC", xlab = "rtime", ylab = "intensity") @@ -162,11 +177,11 @@ methods, this function reads the data from the raw files. points(rtime(bpis[[i]]), intensity(bpis[[i]]), type = "l", col = paste0(sample_colors[pData(raw_data)$sample_group[i]], 80)) } - #+END_SRC + Note that we could restrict the analysis to a certain retention time range by -sub-setting =raw_data= with the =filterRt= method. +first sub-setting =raw_data= with the =filterRt= method. In addition we can plot the distribution of the total ion counts per file. In contrast to sub-setting the object we split the numeric vector returned by the @@ -194,7 +209,7 @@ parameters, but the settings should be adjusted to each experiment individually based on e.g. the expected width of the chromatographic peaks etc. #+NAME: faahKO-centWave -#+BEGIN_SRC R :message = FALSE +#+BEGIN_SRC R :ravel message = FALSE, warning = FALSE ## Defining the settings for the centWave peak detection. cwp <- CentWaveParam(snthresh = 20, noise = 1000) xod <- findChromPeaks(raw_data, param = cwp) @@ -220,8 +235,14 @@ for the updated user interface. Next we extract the chromatogram for the rt-mz region corresponding to one detected chromatographic peak increasing the region in rt dimension by +/- 60 -seconds. In addition we extract also all chromatographic peaks in that region by -passing the same =mz= and =rt= parameters to the =chromPeaks= method. +seconds. In addition we extract also the full chromatogram for the specified mz +range (i.e. the full rt range) and identify all chromatographic peaks in that +region by passing the same =mz= and =rt= parameters to the =chromPeaks= method. + +If two-column matrices are passed to the =extractChromatograms= method with +parameters =rt= and =mz=, the function returns a =list=, each element being a =list= of +=Chromatogram= objects representing the chromatogram for the respective +ranges. #+NAME: faahKO-chromPeaks-extractChroms #+BEGIN_SRC R :ravel warning = FALSE @@ -231,34 +252,31 @@ passing the same =mz= and =rt= parameters to the =chromPeaks= method. rtr[2] <- rtr[2] + 60 mzr <- chromPeaks(xod)[68, c("mzmin", "mzmax")] + ## Add an rt range that would extract the full chromatogram + rtr <- rbind(c(-Inf, Inf), rtr) + mzr <- rbind(mzr, mzr) + chrs <- extractChromatograms(xod, rt = rtr, mz = mzr) ## In addition we get all peaks detected in the same region pks <- chromPeaks(xod, rt = rtr, mz = mzr) + pks #+END_SRC Next we plot the extracted chromatogram for the data and highlight in addition the identified peaks. #+NAME: faahKO-extracted-chrom-with-peaks -#+BEGIN_SRC R :ravel message = FALSE, fig.cap = "Extracted ion chromatogram for one of the identified peaks. Each line represents the signal measured in one sample. The rectangles indicate the margins of the identified chromatographic peak in the respective sample.", fig.align = "center", fig.width = 8, fig.height = 8 - ## Define the limits on x- and y-dimension - xl <- range(lapply(chrs, rtime), na.rm = TRUE) - yl <- range(lapply(chrs, intensity), na.rm = TRUE) - plot(3, 3, pch = NA, main = paste(format(mzr, digits = 6), collapse = "-"), - xlab = "rt", ylab = "intensity", xlim = xl, ylim = yl) - ## Plot the chromatogram per sample - for (i in 1:length(chrs)) { - points(rtime(chrs[[i]]), intensity(chrs[[i]]), type = "l", - col = sample_colors[pData(xod)$sample_group[i]]) - } - ## Highlight the identified chromatographic peaks. - for (i in 1:nrow(pks)) { - rect(xleft = pks[i, "rtmin"], xright = pks[i, "rtmax"], ybottom = 0, - ytop = pks[i, "maxo"], - border = paste0(sample_colors[pData(xod)$sample_group][pks[i, "sample"]], 60)) - } - +#+BEGIN_SRC R :ravel message = FALSE, fig.cap = "Extracted ion chromatogram for one of the identified peaks. Left: full retention time range, right: rt range of the peak. Each line represents the signal measured in one sample. The rectangles indicate the margins of the identified chromatographic peak in the respective sample.", fig.align = "center", fig.width = 12, fig.height = 6 + ## Plot the full rt range: + plotChromatogram(chrs[[1]], + col = paste0(sample_colors[pData(xod)$sample_group], 80)) + ## And now for the peak range. + plotChromatogram(chrs[[2]], + col = paste0(sample_colors[pData(xod)$sample_group], 80)) + ## Highlight also the identified chromatographic peaks. + highlightChromPeaks(xod, rt = rtr[2, ], mzr[2, ], + border = paste0(sample_colors[pData(xod)$sample_group], 40)) #+END_SRC Note that the =extractChromatograms= does return an =NA= value if in a certain scan @@ -292,13 +310,8 @@ times per sample using the =plotAdjustedRtime= function. bpis <- extractChromatograms(xod, aggregationFun = "max") par(mfrow = c(2, 1), mar = c(4.5, 4.2, 1, 0.5)) - plot(3, 3, pch = NA, xlim = range(unlist(lapply(bpis, rtime))), - ylim = range(unlist(lapply(bpis, intensity))), main = "BPC", - xlab = "rtime", ylab = "intensity") - for (i in 1:length(bpis)) { - points(rtime(bpis[[i]]), intensity(bpis[[i]]), type = "l", - col = paste0(sample_colors[pData(xod)$sample_group[i]], 80)) - } + plotChromatogram(bpis, + col = paste0(sample_colors[pData(xod)$sample_group[i]], 80)) ## Plot also the difference of adjusted to raw retention time. plotAdjustedRtime(xod, col = paste0(sample_colors[pData(xod)$sample_group], 80)) #+END_SRC @@ -326,11 +339,12 @@ The 3rd sample was used as /center/ sample against which all other samples were aligned to, hence its adjusted retention times are identical to the raw retention times. -We are again plotting the extracted ion chromatogram for the selected peaks from -above to evaluate the impact of the alignment. +Below we plot the extracted ion chromatogram for the selected peak from the +example above before and after retention time correction to evaluate the impact +of the alignment. #+NAME: faahKO-extracted-chrom-with-peaks-aligned -#+BEGIN_SRC R :ravel echo = FALSE, message = FALSE, fig.cap = "Extracted ion chromatogram for one of the identified peaks after alignment.", fig.align = "center", fig.width = 8, fig.height = 8 +#+BEGIN_SRC R :ravel echo = FALSE, message = FALSE, fig.cap = "Extracted ion chromatogram for one of the identified peaks before and after alignment.", fig.align = "center", fig.width = 8, fig.height = 8 rtr <- chromPeaks(xod)[68, c("rtmin", "rtmax")] ## Increase the range: rtr[1] <- rtr[1] - 60 @@ -338,27 +352,15 @@ above to evaluate the impact of the alignment. mzr <- chromPeaks(xod)[68, c("mzmin", "mzmax")] chrs <- extractChromatograms(xod, rt = rtr, mz = mzr) - - ## In addition we get all peaks detected in the same region - pks <- chromPeaks(xod, rt = rtr, mz = mzr) - - ## Define the limits on x- and y-dimension - xl <- range(lapply(chrs, rtime), na.rm = TRUE) - yl <- range(lapply(chrs, intensity), na.rm = TRUE) - plot(3, 3, pch = NA, main = paste(format(mzr, digits = 6), collapse = "-"), - xlab = "rt", ylab = "intensity", xlim = xl, ylim = yl) - ## Plot the chromatogram per sample - for (i in 1:length(chrs)) { - points(rtime(chrs[[i]]), intensity(chrs[[i]]), type = "l", - col = sample_colors[pData(xod)$sample_group[i]]) - } - ## Highlight the identified chromatographic peaks. - for (i in 1:nrow(pks)) { - rect(xleft = pks[i, "rtmin"], xright = pks[i, "rtmax"], ybottom = 0, - ytop = pks[i, "maxo"], - border = paste0(sample_colors[pData(xod)$sample_group][pks[i, "sample"]], 60)) - } - + chrs_raw <- extractChromatograms(raw_data, rt = rtr, mz = mzr) + + par(mfrow = c(2, 1)) + plotChromatogram(chrs_raw, + col = paste0(sample_colors[pData(xod)$sample_group], 80)) + plotChromatogram(chrs, + col = paste0(sample_colors[pData(xod)$sample_group], 80)) + highlightChromPeaks(xod, rt = rtr, mzr, + border = paste0(sample_colors[pData(xod)$sample_group], 40)) #+END_SRC After alignment, the peaks are nicely overlapping. @@ -508,6 +510,10 @@ highlighted in the plot. ** New naming convention +Peaks identified in LC/GC-MS metabolomics are referred to as /chromatographic +peaks/ where possible to avoid any misconceptions with /mass peaks/ identified in +mz dimension. + Methods for data analysis from the original =xcms= code have been renamed to avoid potential confusions: @@ -520,11 +526,12 @@ potential confusions: + *Correspondence*: =groupChromPeaks= instead of =group= to clearly indicate what is being grouped. Group might be a sample group or a peak group, the latter being referred to also by (mz-rt) /feature/. - + + *Alignment*: =adjustRtime= instead of =retcor= for retention time correction. The word /cor/ in /retcor/ might be easily misinterpreted as /correlation/ instead of correction. + ** New data classes *** =OnDiskMSnExp= diff --git a/vignettes/xcmsPreprocess.Rnw b/vignettes/xcmsPreprocess.Rnw-notrun similarity index 99% rename from vignettes/xcmsPreprocess.Rnw rename to vignettes/xcmsPreprocess.Rnw-notrun index 375d25921..ac8d0b6c5 100755 --- a/vignettes/xcmsPreprocess.Rnw +++ b/vignettes/xcmsPreprocess.Rnw-notrun @@ -53,6 +53,9 @@ corresponding to each step are also given.} library(multtest) library(xcms) library(faahKO) +## Disable default parallel processing since on some platforms it might +## cause delays. +register(SerialParam()) @ \section{Raw Data File Preparation}