一、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 (全文大量引用該文,不再額外標出)

推薦閱讀:

相关文章