一、Introduction

蛋白质组学研究中,样品的蛋白质成分与含量的检测主要通过质谱仪来测定。具体的过程就是把大的蛋白质分子「掐断」成小的氨基酸离子条,然后质谱仪就可以测得很多的这些小离子的质荷比(m/z)形成实验谱图,再将实验谱图与现有的库谱图比对就可以确认实验谱图代表的蛋白质种类是不是库谱图对应的蛋白质,从而实现样品蛋白质成分鉴定。可见,这种方法是由小见大,从微知著的间接思路,这就叫做「button-to-top」,从下往上递推。(希望以后可以直接鉴定蛋白质而不需要打碎,省去这么多弯弯绕。

二、mzML的前世

在上述过程中,质谱仪的输出数据格式是各个设备商各搞一套,而且外人无法获取解析。这样的数据江湖混战受伤的是整个业界呀。于是在2003-2005年,业界大佬Human Proteome Organization( HUPO ) Proteomics Standards Initiative( PSI ) 提出了mzData格式,这样各个设备商数据就有了统一标准。mzData的格式为了兼顾各种设备、技术路线的可能性,框架设计包含了很大的灵活性,最后发现灵活性太强,需要不断更新设计框架。下面是一个mzData文件:

<?xml version="1.0" encoding="UTF-8"?>
<mzData version="1.05" accessionNumber="psi-ms:12345" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<description>
<admin>
</admin>
<instrument>
</instrument>
<dataProcessing>
</dataProcessing>
</description>
<spectrumList count="1227">
<spectrum id="20">
<spectrumDesc>
<spectrumSettings>
<acqSpecification spectrumType="discrete" methodOfCombination="sum" count="1">
<acquisition acqNumber="20"/>
</acqSpecification>
<spectrumInstrument msLevel="2" mzRangeStart="110.000000" mzRangeStop="905.000000">
<cvParam cvLabel="psi" accession="PSI:1000036" name="ScanMode" value="MassScan"/>
<cvParam cvLabel="psi" accession="PSI:1000037" name="Polarity" value="positive"/>
<cvParam cvLabel="psi" accession="PSI:1000038" name="TimeInMinutes" value="5.944667"/>
<cvParam cvLabel="psi" accession="PSI:1000035" name="PeakProcessing" value="continuous"/>
<cvParam cvLabel="tmo" accession="TMO:1000001" name="Filter" value="+ c d Full ms2 [email protected] [ 110.00-905.00]"/>
</spectrumInstrument>
</spectrumSettings>
<precursorList count = "1">
<precursor msLevel="2" spectrumRef="19">
<ionSelection>
<cvParam cvLabel="psi" accession="PSI:1000040" name="MassToChargeRatio" value="445.346680"/>
<cvParam cvLabel="psi" accession="PSI:1000041" name="ChargeState" value="2"/>
<cvParam cvLabel="psi" accession="PSI:1000041" name="ChargeState" value="3"/>
</ionSelection>
<activation>
<cvParam cvLabel="psi" accession="PSI:1000044" name="Method" value="CID"/>
<cvParam cvLabel="psi" accession="PSI:1000045" name="CollisionEnergy" value="35.00"/>
</activation>
</precursor>
</precursorList>
</spectrumDesc>
<mzArrayBinary>
<data precision="64" endian="little" length="43">AAAAwNfia0AAAACApoJ</data>
</mzArrayBinary>
<intenArrayBinary>
<data precision="64" endian="little" length="43">AAAAAAD+p0AAAAAAAKy=</data>
</intenArrayBinary>
</spectrum>
</spectrumList>
</mzData>

另一个大佬Institute for Systems Biology (ISB) 则提出了 mzXML 格式,它的特点就是简单固定,缺点就是不够灵活。下面是一个mzXML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<mzXML xmlns="http://sashimi.sourceforge.net/schema_revision/mzXML_3.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://sashimi.sourceforge.net/schema_revision/mzXML_3.0 http://sashimi.sourceforge.net/schema_revision/mzXML_3.0/mzXML_idx_3.0.xsd" >
<msRun scanCount="9181" startTime="PT480.065S" endTime="PT6598.78S" >
<parentFile fileName="R1_RG59_B4_1.RAW" fileType="RAWData" fileSha1="8710fc9a36c249bc85b5a4ce560b03d5aac319cc" />
<msInstrument>
</msInstrument>
<dataProcessing centroided="1" >
</dataProcessing>
<scan num="1"
msLevel="1"
peaksCount="221"
polarity="+"
scanType="Full"
filterLine="FTMS + p NSI Full ms [375.00-2000.00]"
retentionTime="PT480.065S"
lowMz="376.83"
highMz="1979.57"
basePeakMz="1125.3"
basePeakIntensity="10168"
totIonCurrent="175256" >
<peaks precision="32"
byteOrder="network"
pairOrder="m/z-int" >Q7xqSEOoVlVDvPXgQ+TplEO89x==</peaks>
</scan>
</msRun>
<index name="scan">
<offset id="1" >1085</offset>
</index>
</indexOffset>124914</indexOffset>
</mzXML>

相比较而言是不是就觉得mzXML很清爽啊。

总之,有人开始嫌弃mzData太灵活,mzXML太死板。

三、mzML今生

2010年,ISB 又提出了 mzML 格式,以期解决上述问题,使得框架灵活与稳定能够兼顾。它主要采取的手段包括三把斧头:

  1. 各种属性、参数基本都囊括进一个叫做 控制字典 的东西中去,想增添属性、参数先从字典里面找找。在mzML文件中就可以通过引用字典中的id来表示该属性。控制字典的一个属性定义如下所示:

[Term]
id: MS:0000000
name: Proteomics Standards Initiative Mass Spectrometry Vocabularies
def: "Proteomics Standards Initiative Mass Spectrometry Vocabularies." [PSI:MS]

  1. 语义检查。确保基本相同的属性、参数不被多个变数控制。
  2. 开发mzML兼容的工具链,使得用户愿意从其他数据格式转换过来。

现在,mzML格式已经更新到1.1版本了。再加上这三把斧头,mzML格式能够应付一个十年就有希望了。

四、mzML详解

整体框架

1. 在<mzML>标签下,前面有很多的栏位来说明样品制备、设备参数、使用软体、数据处理过程等等,并说明控制字典的引用来源2. 质谱数据记录标签<run>里面的<spectrum>,每一个<spectrum>里包含的质荷比与离子强度就是真正的一帧质谱数据。3. <run>可能还包含<chromatogram> (optinal),它是表示对确定质荷比离子丰度随时间变化的数据,即色谱峰,一般没有使用该栏位。

4. 在<mzML>结束后,还会有<spectrum><chromatogram>的标签块来索引每一个spetrum在整个文件中的索引地址。

5. 最后,有索引块的起始地址。

一级质谱详解

<spectrum index="100" id="sample=1 period=1 cycle=2 experiment=1" defaultArrayLength="76665">
<cvParam cvRef="MS" accession="MS:1000511" name="ms level" value="1"/>
<cvParam cvRef="MS" accession="MS:1000579" name="MS1 spectrum" value=""/>
<cvParam cvRef="MS" accession="MS:1000130" name="positive scan" value=""/>
<cvParam cvRef="MS" accession="MS:1000128" name="profile spectrum" value=""/>
<cvParam cvRef="MS" accession="MS:1000505" name="base peak intensity" value="66617.0" unitCvRef="MS" unitAccession="MS:1000131" unitName="number of detector counts"/>
<cvParam cvRef="MS" accession="MS:1000504" name="base peak m/z" value="497.27801529955" unitCvRef="MS" unitAccession="MS:1000040" unitName="m/z"/>
<cvParam cvRef="MS" accession="MS:1000285" name="total ion current" value="1.677707e06" unitCvRef="MS" unitAccession="MS:1000131" unitName="number of detector counts"/>
<cvParam cvRef="MS" accession="MS:1000796" name="spectrum title" value="weissto_i170508_005-SWLYPB125.101.101. File:&quot;weissto_i170508_005.wiff&quot;, NativeID:&quot;sample=1 period=1 cycle=2 experiment=1&quot;"/>
<scanList count="1">
<cvParam cvRef="MS" accession="MS:1000795" name="no combination" value=""/>
<scan>
<cvParam cvRef="MS" accession="MS:1000016" name="scan start time" value="0.059933333333" unitCvRef="UO" unitAccession="UO:0000031" unitName="minute"/>
<cvParam cvRef="MS" accession="MS:1000616" name="preset scan configuration" value="1"/>
<scanWindowList count="1">
<scanWindow>
<cvParam cvRef="MS" accession="MS:1000501" name="scan window lower limit" value="360.0" unitCvRef="MS" unitAccession="MS:1000040" unitName="m/z"/>
<cvParam cvRef="MS" accession="MS:1000500" name="scan window upper limit" value="1460.0" unitCvRef="MS" unitAccession="MS:1000040" unitName="m/z"/>
</scanWindow>
</scanWindowList>
</scan>
</scanList>
<binaryDataArrayList count="2">
<binaryDataArray encodedLength="608780">
<cvParam cvRef="MS" accession="MS:1000523" name="64-bit float" value=""/>
<cvParam cvRef="MS" accession="MS:1000574" name="zlib compression" value=""/>
<cvParam cvRef="MS" accession="MS:1000514" name="m/z array" value="" unitCvRef="MS" unitAccession="MS:1000040" unitName="m/z"/>
<binary>eJwc2nc8ltVbdhu......=</binary>
</binaryDataArray>
<binaryDataArray encodedLength="60096">
<cvParam cvRef="MS" accession="MS:1000523" name="64-bit float" value=""/>
<cvParam cvRef="MS" accession="MS:1000574" name="zlib compression" value=""/>
<cvParam cvRef="MS" accession="MS:1000515" name="intensity array" value="" unitCvRef="MS" unitAccession="MS:1000131" unitName="number of detector counts"/>
<binary>eJzsvUadfaettrrr......=</binary>
</binaryDataArray>
</binaryDataArrayList>
</spectrum>

  1. index 是数字编号,一般是从0开始,zero-based,这个与 mzXML 不同。id是自定义,在swath方法中可以用第x样品x个MS1的第x个MS2命名。defaultArrayLength表示默认情况下的二进位数据长度。
  2. ms level表明本次扫描是MS1还是MS2。
  3. base peak intensity,查表知该属性表示该次质谱的最高强度。
  4. base peak m/z,查表知改属性表示最高强度对应的m/z。
  5. scan start time,表示retension time.(待确定),注意其后跟随的时间单位是minute还是second。
  6. scan window lower/upper limit,质谱仪扫描窗口的范围,注意与swath方法的子窗口范围相区分。
  7. 64-bit float,表示压缩数据来源是64位
  8. zlib,表示压缩方法
  9. m/z array和intensity array就是最主要数据。

二级质谱详解

<spectrum index="101" id="sample=1 period=1 cycle=2 experiment=2" defaultArrayLength="164">
<cvParam cvRef="MS" accession="MS:1000511" name="ms level" value="2"/>
<cvParam cvRef="MS" accession="MS:1000580" name="MSn spectrum" value=""/>
<cvParam cvRef="MS" accession="MS:1000130" name="positive scan" value=""/>
<cvParam cvRef="MS" accession="MS:1000128" name="profile spectrum" value=""/>
<cvParam cvRef="MS" accession="MS:1000505" name="base peak intensity" value="84.0" unitCvRef="MS" unitAccession="MS:1000131" unitName="number of detector counts"/>
<cvParam cvRef="MS" accession="MS:1000504" name="base peak m/z" value="214.982951835982" unitCvRef="MS" unitAccession="MS:1000040" unitName="m/z"/>
<cvParam cvRef="MS" accession="MS:1000285" name="total ion current" value="2202.0" unitCvRef="MS" unitAccession="MS:1000131" unitName="number of detector counts"/>
<cvParam cvRef="MS" accession="MS:1000796" name="spectrum title" value="weissto_i170508_005-SWLYPB125.102.102. File:&quot;weissto_i170508_005.wiff&quot;, NativeID:&quot;sample=1 period=1 cycle=2 experiment=2&quot;"/>
<scanList count="1">
<cvParam cvRef="MS" accession="MS:1000795" name="no combination" value=""/>
<scan>
<cvParam cvRef="MS" accession="MS:1000016" name="scan start time" value="0.060883333333" unitCvRef="UO" unitAccession="UO:0000031" unitName="minute"/>
<cvParam cvRef="MS" accession="MS:1000616" name="preset scan configuration" value="2"/>
<scanWindowList count="1">
<scanWindow>
<cvParam cvRef="MS" accession="MS:1000501" name="scan window lower limit" value="50.0" unitCvRef="MS" unitAccession="MS:1000040" unitName="m/z"/>
<cvParam cvRef="MS" accession="MS:1000500" name="scan window upper limit" value="2000.0" unitCvRef="MS" unitAccession="MS:1000040" unitName="m/z"/>
</scanWindow>
</scanWindowList>
</scan>
</scanList>
<precursorList count="1">
<precursor>
<isolationWindow>
<cvParam cvRef="MS" accession="MS:1000827" name="isolation window target m/z" value="403.0" unitCvRef="MS" unitAccession="MS:1000040" unitName="m/z"/>
<cvParam cvRef="MS" accession="MS:1000828" name="isolation window lower offset" value="3.5" unitCvRef="MS" unitAccession="MS:1000040" unitName="m/z"/>
<cvParam cvRef="MS" accession="MS:1000829" name="isolation window upper offset" value="3.5" unitCvRef="MS" unitAccession="MS:1000040" unitName="m/z"/>
</isolationWindow>
<selectedIonList count="1">
<selectedIon>
<cvParam cvRef="MS" accession="MS:1000744" name="selected ion m/z" value="403.0" unitCvRef="MS" unitAccession="MS:1000040" unitName="m/z"/>
</selectedIon>
</selectedIonList>
<activation>
<cvParam cvRef="MS" accession="MS:1000422" name="beam-type collision-induced dissociation" value=""/>
</activation>
</precursor>
</precursorList>
<binaryDataArrayList count="2">
<binaryDataArray encodedLength="1500">
<cvParam cvRef="MS" accession="MS:1000523" name="64-bit float" value=""/>
<cvParam cvRef="MS" accession="MS:1000574" name="zlib compression" value=""/>
<cvParam cvRef="MS" accession="MS:1000514" name="m/z array" value="" unitCvRef="MS" unitAccession="MS:1000040" unitName="m/z"/>
<binary>eJwNxXswFAgcB/......=</binary>
</binaryDataArray>
<binaryDataArray encodedLength="80">
<cvParam cvRef="MS" accession="MS:1000523" name="64-bit float" value=""/>
<cvParam cvRef="MS" accession="MS:1000574" name="zlib compression" value=""/>
<cvParam cvRef="MS" accession="MS:1000515" name="intensity array" value="" unitCvRef="MS" unitAccession="MS:1000131" unitName="number of detector counts"/>
<binary>eJxjYAABJwcGrI......=</binary>
</binaryDataArray>
</binaryDataArrayList>
</spectrum>

(只描述与MS1不同的标签)

  1. scan window lower/upper limit,该范围一般大于MS1指定的扫描范围。(待确认
  2. 在标签中,"isolation window target m/z"和"isolation window lower/upper offset"就表示了该次MS2的子窗口大小。从这个子窗口的大小和整的需要的扫描窗口大小,可以计算一次MS1最大对应(1460-360)/(3.5+3.5)≈157次,同时由于子窗口的大小是变化的,越靠近MS1的边界子窗口设置越大,因此,实际MS2的次数小于该最大值,为100次左右
  3. 在标签中,「selected ion m/z」与「isolation window target m/z」一致。(那这个标签有什么意义?

五、后记

  • mzData完成了它的历史使命,已经被官方抛弃了,让我们为它曾经做过的贡献致敬!
  • mzXML和mzML还在广泛使用中。。。
  • 期待更合适的数据格式能够用于表示庞大的质谱结果,比如RDF(resource description framework)等。

六、参考文献

  1. Eric W. Deutsch. Mass Spectrometer Output File Format mzML. In Current Protocols in Protein Science (p. 25.0.1-25.0.2). Hoboken, NJ, USA: John Wiley & Sons, Inc. doi.org/10.1002/0471140 (全文大量引用该文,不再额外标出)

推荐阅读:

相关文章