[FlowKit]-1  pythonでFCSファイルを開く(FACS解析)

:::note warn
出力結果には公式ドキュメントからの引用を載せていることが多いです。
たまに自分のサンプルから得られた出力結果も混ざっています。
:::


**公式ドキュメント**
https://flowkit.readthedocs.io/en/latest/
https://pypi.org/project/FlowKit/

#### ライブラリのインストール
```terminal
pip install FlowKit
```

#### ライブラリのインポート
```python
import flowkit as fk
import bokeh
from bokeh.plotting import show
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
bokeh.io.output_notebook()
```

#### バージョンの確認
```python
fk.__version__
```
```
'1.0.1'
```
#### FCSファイルを読み込む
`flowkit.Sample()`（ここでは`fk.Sample()`）の引数にFCSファイルのパスを指定。
```python
#FCSファイルの読み込み
fcs_path = './1SI.fcs'
sample = fk.Sample(fcs_path)

#sample情報の出力(FCSが読み込まれているか確認)
print(sample)
```
FCSファイル名、チャンネル数、イベント数が表示される。
```
Sample(v3.1, 1SI.fcs, 28 channels, 251390 events)
```

#### metadataの出力
辞書型で出力される。
この中にはいろいろなデータが格納されているが、使うのはコンペンセーションの値くらいだと思われる。
```python
#sampleメタデータの出力（辞書型）
print(sample.get_metadata())
```
<details><summary>出力結果(長いので折り畳み)</summary>

`{'byteord': '4,3,2,1', 'datatype': 'I', 'nextdata': '0', 'sys': 'Macintosh System Software 9.0.4', 'creator': 'CELLQuestª 3.3', 'tot': '13367', 'mode': 'L', 'par': '8', 'p1n': 'FSC-H', 'p1r': '1024', 'p1b': '16', 'p1e': '0,0', 'p1g': '3.67', 'p2n': 'SSC-H', 'p2r': '1024', 'p2b': '16', 'p2e': '0,0', 'p2g': '8', 'p3n': 'FL1-H', 'p3r': '1024', 'p3b': '16', 'p3e': '4,0', 'p4n': 'FL2-H', 'p4r': '1024', 'p4b': '16', 'p4e': '4,0', 'p5n': 'FL3-H', 'p5r': '1024', 'p5b': '16', 'p5e': '4,0', 'p1s': 'FSC-Height', 'p2s': 'SSC-Height', 'p3s': 'CD4 FITC', 'p4s': 'CD8 B PE', 'p5s': 'CD3 PerCP', 'p6n': 'FL2-A', 'p6r': '1024', 'p6b': '16', 'p6e': '0,0', 'timeticks': '100', 'p7n': 'FL4-H', 'p7r': '1024', 'p7e': '4,0', 'p7b': '16', 'p7s': 'CD8 APC', 'p8n': 'Time', 'p8r': '1024', 'p8e': '0,0', 'p8b': '16', 'p8s': 'Time (102.40 sec.)', 'sample id': 'Default Patient ID', 'src': 'Default', 'case number': 'Default Case Number', 'cyt': 'FACSCalibur', 'cytnum': 'E3820', 'btim': '16:31:33', 'etim': '16:31:52', 'bdacqlibversion': '3.1', 'bdnpar': '7', 'bdp1n': 'FSC-H', 'bdp2n': 'SSC-H', 'bdp3n': 'FL1-H', 'bdp4n': 'FL2-H', 'bdp5n': 'FL3-H', 'bdp6n': 'FL2-A', 'bdp7n': 'FL4-H', 'bdword0': '24', 'bdword1': '394', 'bdword2': '492', 'bdword3': '477', 'bdword4': '566', 'bdword5': '397', 'bdword6': '397', 'bdword7': '397', 'bdword8': '398', 'bdword9': '397', 'bdword10': '300', 'bdword11': '299', 'bdword12': '551', 'bdword13': '4', 'bdword14': '397', 'bdword15': '501', 'bdword16': '481', 'bdword17': '586', 'bdword18': '574', 'bdword19': '100', 'bdword20': '100', 'bdword21': '100', 'bdword22': '100', 'bdword23': '1', 'bdword24': '1', 'bdword25': '0', 'bdword26': '0', 'bdword27': '0', 'bdword28': '136', 'bdword29': '52', 'bdword30': '52', 'bdword31': '52', 'bdword32': '52', 'bdword33': '52', 'bdword34': '12', 'bdword35': '201', 'bdword36': '6', 'bdword37': '138', 'bdword38': '280', 'bdword39': '3', 'bdword40': '3', 'bdword41': '100', 'bdword42': '100', 'bdword43': '0', 'bdword44': '1023', 'bdword45': '1023', 'bdword46': '1023', 'bdword47': '53', 'bdword48': '550', 'bdword49': '56', 'bdword50': '72', 'bdword51': '52', 'bdword52': '0', 'bdword53': '0', 'bdword54': '0', 'bdword55': '0', 'bdword56': '0', 'bdword57': '0', 'bdword58': '0', 'bdword59': '0', 'bdword60': '0', 'bdword61': '0', 'bdword62': '0', 'bdword63': '0', 'bdlasermode': '1', 'calibfile': 'FALSE', 'p7thresvol': '52', 'fil': 'B07', 'date': '23-Aug-02', 'number well info keywords': '3', '&1sample': '200', '&2number of washes': '1', '&3mixing vol': '100', '&4number of mixes': '2', '&5data file prefix part #1\\\\&6data file prefix part #2\\\\&7data file prefix part #3\\\\&8acquisition doc.': 'LYMPH SUBSET ACQ', '&9instr. sett. file': 'E#7 Settings #1', '&10patient id': ' FJ#192659', '&11day': '35d', '&12sample id': 'T-cells', '&13analysis doc.': ''}`
</details>

#### チャンネル情報の出力
```python
print(sample.channels)
```
DataFrameで出力される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/1e8af890-a3e0-10b0-c75a-b3e5635173a9.png)


#### コンペンセーション値の出力
`metadata`の中からコンペンセーション値を取り出す。
（この文字列を加工してコンペンセーションとして適用するのは別の記事で。）

```python
print(sample.get_metadata()['spillover'])
```
(長いのでスクショで。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/7664b81d-6821-4402-5e5b-dc75568b6d8d.png)



#### ヒストグラムの出力
引数に`チャンネル名`を入れる。例として`FSC-H`の場合を示す。
```python
p = sample.plot_histogram('FSC-H', source='raw', bins=256)
show(p)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/49d8a9c2-9049-b920-bda1-7001813ae286.png)


#### プロットの出力
他にも異なる種類の表示方法で出力できるが割愛。[公式ドキュメント](https://flowkit.readthedocs.io/en/latest/notebooks/flowkit-tutorial-part01-sample-class.html#Contour-Plot)参照。
ここでは以下の例として2種類を紹介。
```python
#by default, plot_contour uses sub-sampled events for performance
f = sample.plot_contour('FSC-H', 'SSC-H', source='raw', plot_events=True)
plt.show()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/a4af0ecf-60f0-4125-2158-075d587f2655.png)


```python
p = sample.plot_scatter(
    'FSC-H', 'SSC-H',
    source='raw', y_min=0., y_max=130, x_min=0., x_max=280, color_density=True
)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/d2cce280-7597-51f1-d0f7-efa5f1f69c89.png)

#### 対数軸にしてプロットする
まず、サンプルに対数を適用する。（実行しても何も出力されない）
```python
xform = fk.transforms.LogicleTransform('my_logicle', param_t=1024, param_w=0.5, param_m=4.5, param_a=0)
sample.apply_transform(xform)
```

プロットの際に引数`source`に`xform`を指定する。
`FSC`と`SSC`の表示には必要ないが、蛍光の測定結果をプロットする際には必要。
```python
#source='raw' だと見にくい（左図）
p = sample.plot_scatter('FL1-H', 'FL2-H', source='raw')
show(p)

#source='xform' にすることで対数軸になる（右図）
p = sample.plot_scatter('FL1-H', 'FL2-H', source='xform')
show(p)
```
対数軸にすることで見やすくなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/a8c5cbda-e668-b091-e9af-8f59802a274f.png)


#### eventsの取り出し
ここに1つ1つのeventの測定値が格納されている。
```python
#eventを取り出してDataFrameに
df_events = sample.as_dataframe(source='raw')
#eventを取り出してndarrayに
array_events = sample.get_events(source='raw')
```
DataFrameでの出力例。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655949/c5d6e985-7120-5f0a-e6c6-364418a4c9e9.png)


#### 次回予告
次の記事では、コンペンセーションの適用方法について記します。