xcms项目中chromPeakSpectra函数处理重复峰ID的bug分析
问题背景
在xcms这个用于质谱数据分析的R包中,chromPeakSpectra()函数用于从色谱峰中提取对应的质谱数据。最近发现该函数在处理包含重复峰ID的输入时会出现两个明显的bug:
- 当
return.type = "Spectra"且method = "closest_rt"时,返回的质谱数量会多于输入的色谱峰数量 - 当
return.type = "List"时,函数会直接报错并终止
问题重现
通过一个实际示例可以清晰地重现这个问题。我们首先加载必要的库和测试数据:
library(msdata)
library(xcms)
# 读取示例DDA数据
dda_file <- system.file("TripleTOF-SWATH", "PestMix1_DDA.mzML", package = "msdata")
dda_data <- readMsExperiment(dda_file)
# 进行色谱峰检测
cwp <- CentWaveParam(snthresh = 5, noise = 100, ppm = 10, peakwidth = c(3, 30))
dda_data <- findChromPeaks(dda_data, param = cwp, msLevel = 1L)
然后我们尝试提取特定色谱峰对应的质谱数据,其中故意包含重复的峰ID:
# 提取色谱峰CP01(重复)和CP02对应的质谱
dda_spectra <- chromPeakSpectra(dda_data, msLevel = 1L,
peaks = c("CP01", "CP02", "CP01"),
method = "closest_rt")
问题表现
问题1:返回质谱数量异常
正常情况下,输入3个峰ID(尽管有重复),应该返回3个质谱。但实际返回了5个质谱:
> dda_spectra
MSn data (Spectra) with 5 spectra in a MsBackendMzR backend:
msLevel rtime scanIndex
<integer> <numeric> <integer>
1 1 130.615 1037
2 1 130.615 1037
3 1 240.897 1843
4 1 130.615 1037
5 1 130.615 1037
问题2:List返回类型报错
当尝试使用List返回类型时,函数直接报错:
> dda_spectra <- chromPeakSpectra(dda_data, msLevel = 1L,
peaks = c("CP01", "CP02", "CP01"),
method = "closest_rt",
return.type = "List")
Error in h(simpleError(msg, call)) :
error in evaluating the argument 'f' in selecting a method for function 'split': factor level [3] is duplicated
问题原因分析
这两个问题都源于函数对重复峰ID的处理不当:
- 在"closest_rt"方法下,函数没有正确处理重复ID,导致为同一个峰ID多次查找质谱
- 在List返回类型下,函数尝试使用峰ID作为分组因子,但重复ID导致分组失败
解决方案
xcms开发团队已经通过PR #797和#798修复了这些问题。修复后的版本应该能够:
- 正确处理重复峰ID,返回与输入数量一致的质谱
- 支持List返回类型,即使输入包含重复峰ID
最佳实践建议
虽然bug已经修复,但在实际使用中仍建议:
- 尽量避免传入重复峰ID,除非有特殊需求
- 如果需要处理多个峰,考虑先对峰ID进行去重
- 更新到最新版本的xcms以获取修复后的功能
这个bug的发现和修复展示了开源社区协作的优势,也提醒我们在处理函数输入时要考虑各种边界情况。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



