pyOpenMSを用いて抽出クロマトグラムを描画する

pyOpenMSはpythonのMS解析用のライブラリーである。

https://pyopenms.readthedocs.io/en/latest/introduction.html

これを用いて抽出イオンクロマトグラムを描画しpdfファイルとして出力する方法をまとめる。
google colaboratoryでも利用可能である。

<h1>インストール</h1>

以下のコマンドでインストールを行う。
```
pip install pyopenms
```

描画にはnumpyやmatplotlibを用いるため、これらをこれらもインストールする必要がある。

<h1>ファイルの準備</h1>
測定データをconverterを用いてmzML形式に変換する。
converterは「MSconvert」を用いると良い。
https://proteowizard.sourceforge.io/download.html

<h1></h1>

必要なライブラリの読み込みを行う。

```
import numpy as np
from pyopenms import *
import matplotlib.pyplot as plt
```

<h1>ファイルの読み込み</h1>

まず、以下の方法でファイルを開く。

```
exp = MSExperiment()
MzMLFile().load("filename.mzML", exp)
```

この開いたファイルでまず、TICを描画してみる。
```
#calculateTIC()を用いてTICを描画することができる。
#TICの保持時間とシグナル強度を所得する。
tic = exp.calculateTIC() 
retention_times, intensities = tic.get_peaks()

#グラフの描画
plt.plot(retention_times, intensities)

plt.title('TIC')
plt.xlabel('time (s)')
plt.ylabel('intensity (cps)')
plt.savefig('file.pdf')
plt.show()
```

![ダウンロード (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1825372/8a68e8a6-d78d-cc50-7c21-36879e3b22a4.png)

retention_timesを60で割ることで分に変換できる。
```
#グラフの描画
plt.plot(retention_times/60, intensities)
plt.title('TIC')
plt.xlabel('time (min)')
plt.ylabel('intensity (cps)')
plt.savefig('file.pdf')
plt.show()
```

<h1>抽出イオンクロマトグラムの描画</h1>

以下のdefを作成し、抽出イオンクロマトグラムを作成する準備をする。
loc_expには読み出したexpを入力。
min, maxは抽出するイオンの範囲を表す。

```
def extract_chrom(loc_exp,min,max):
  #データの格納先の作成
  time = np.array(0)
  signal = np.array(0)
  #スペクトルを呼び出し、指定した
  for spec in loc_exp:
    #スペクトルからmzの値とシグナル強度を抽出する。
    mz, intensity = spec.get_peaks()
    sum = 0
    count = 0
    for i in mz:
      if min <= i <= max:
        sum += intensity[count]
      count += 1
    time = np.append(time, spec.getRT())
    signal = np.append(signal, sum)
  return time,signal
```
timeは保持時間のタイムポイントのリストであり、signalはタイムポイントにおける、指定された範囲にあるイオンの強度の合計を表す。

これを用いて以下の操作を行うことで描画できる。

```
mass = 352
max_mass = mass - 0.5
min_mass = mass + 0.5
time_l, signal_l = extract_chrom(exp,max_mass,min_mass)
plt.plot(time_l, signal_l, label = 'EIC@' + str(mass))
plt.xlabel('time (s)')
plt.ylabel('intensity (cps)')
plt.savefig('file_eic.pdf')
plt.show()
```
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1825372/82170d59-fb65-cafa-83a6-9302a62c93c5.png)


<h1>MSMSデータを除く場合</h1>
LCMS解析のメッソドにもよるが、これらのデータにはMSMSのデータが含まれている場合があり、それらにより、データが観察しにくくなる。
出力する　getMSLevel()を指定することで解決することができそうである。

```
def extract_chrom(loc_exp,min,max):
  #データの格納先の作成
  time = np.array(0)
  signal = np.array(0)
  #スペクトルを呼び出し、指定した
  for spec in loc_exp:
    #MSLEVELを判定する項目の追加
    if spec.getMSLevel() == 1: #ここでは1と指定したが、データによって異なると思われる。
      pass
    else:
      #MSLevelが1以外の場合はスキップする。
      continue
    #スペクトルからmzの値とシグナル強度を抽出する。
    mz, intensity = spec.get_peaks()
    sum = 0
    count = 0
    for i in mz:
      if min <= i <= max:
        sum += intensity[count]
      count += 1
    time = np.append(time, spec.getRT())
    signal = np.append(signal, sum)
  return time,signal
```

データの読み込み

```
exp = MSExperiment()
MzMLFile().load("filename.mzML", exp)
```

実際の描画

```
mass = 352
max_mass = mass - 0.5
min_mass = mass + 0.5
time_l, signal_l = extract_chrom(exp,max_mass,min_mass)
plt.plot(time_l, signal_l, label = 'EIC@' + str(mass))
plt.xlabel('time (s)')
plt.ylabel('intensity (cps)')
plt.savefig('file_eic.pdf')
plt.show()
```

<h1>複数のクロマトグラムをまとめて描画する場合</h1>

以下のように書き換えることで、複数の抽出イオンクロマトグラムをまとめて書くことができる。

```
list = [352, 501, 400]

for i in list:
    mass = i
    max_mass = mass - 0.5
    min_mass = mass + 0.5
    time_l, signal_l = extract_chrom(exp,max_mass,min_mass)
    plt.plot(time_l, signal_l, label = 'EIC@' + str(mass))
    plt.xlabel('time (s)')
    plt.ylabel('intensity (cps)')

plt.savefig('file_eic.pdf')
plt.show()
```