M2 Mac で GATK をコンパイルしてみたった

## はじめに

[GATK](https://gatk.broadinstitute.org)とは、[ブロード研究所](https://www.broadinstitute.org/)が作成しているゲノム解析のためのツールの集合体である。「ブロード」は人名で、住宅建設会社[KBホーム](https://en.wikipedia.org/wiki/KB_Home)および年金会社サンアメリカの創業者である[エリ・ブロード](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%AA%E3%83%BB%E3%83%96%E3%83%AD%E3%83%BC%E3%83%89)さんが出資して作った研究所なのでこの名称になっている。特にHaplotypeCallerやMutect2などショートリードの変異の検出に使われているが、Picardのような汎用的なツールも含まれるる。

https://gatk.broadinstitute.org/

https://github.com/broadinstitute/gatk

コミット履歴によると、一人の巨人が作り上げたツールというよりも、多くの個人が寄稿して練り上げたツールに見える。（しかし、そのためか見通しは非常によくない。）

プログラミング言語も科学向けで多いPythonやR言語ではなく、かといって高速なツールによく採用されているC言語、C++言語などでもなく、Javaで書かれている。そしてそのJavaが本格的にオブジェクト指向で書かれている。歴史を感じるが少しとっつきにくさを感じる。

[公式サイト](https://gatk.broadinstitute.org)はウィキのようにまとめられており、質問フォーラムもある。この公式ページはRailsで作成されているが、これは[Zendesk](https://www.zendesk.com)というサービスを採用しているからであってGATKの人たちがRailsを書いているわけではないであろう。GATKのグループはYouTubeに動画をアップロードしている。今となってはすこし古いが2019年のコース。

https://youtube.com/playlist?list=PLjiXAZO27elDHGlQwfd06r7coiFtpPkvI&si=TYKIIbIOPhpth0X1

もう少し新しいものを希望する場合は、2023年に台湾で行われたコースもある。

https://youtube.com/playlist?list=PLwNfIjftbYZFGvLayoA30UqefjLgEgmDc&si=Hcvv2LG53PHiF59O

YouTubeではGATKに関して同じスライドで異なる人たちが発表しているのを見ることができる。おそらくはワークショップのたびに異なるスタッフが同じスライドで説明を行っているのだろう。2019年頃に比較すると、2023年は熱意が薄れているように見えるが気のせいだろうか？

いずれにせよ、独特の雰囲気を放っているツールであることは間違いない。

## GATKと仲良くなりたい

こんな難しそうなGATKだが、どうすれば少しでも仲良くなれるのだろうか？

ビルドしてみればいいのではないか？

GATKはインストールが案外難しい。[Bioconda](https://anaconda.org/bioconda/gatk)などでインストールすることもできる。しかしBiocondaはArm Macでは頼りにならない。トラブルを避けるためには[GATKをDockerで実行](https://gatk.broadinstitute.org/hc/en-us/articles/360035889991--How-to-Run-GATK-in-a-Docker-container)することが多いだろう。（GATKの開発元のブロード研究所の人たちはGoogleと提携しており[Terra](https://support.terra.bio)というプラットフォームを用いて、Google Cloud Platform (GCP) で実行することを想定している。しかし[Nextflow](https://www.nextflow.io/)と比較すると今ひとつ盛り上がりに欠ける気がするのは気のせいだろうか？）

## Javaについてメモ

そもそもJavaというプログラミング言語をこれまであまり触ってこなかったので、頭の整理でメモ。（間違ったことを書いていたらすみません）

C言語やC++言語は、コンパイルすると実行形式のファイルを生成する。Crystal言語では、コードを中間表現LLVM-IRに変換した上で、最適化されたアセンブリ言語や実行形式に変換することができる。

Rubyでは、抽象構文木をYARV命令文というバイトコードに変換してから実行する。最近はJITというものが導入されて、YARV命令文のなかで頻回に呼び出される部分を中間表現→機械語にコンパイルすることによって高速化を図っている。

Javaではコンパイルすると[Javaクラスファイル](Javaクラスファイル)が生成される。Javaクラスファイルは、Java仮想マシン (JVM) 上で実行可能なJavaバイトコードが含まれている。JVMはこのクラスファイルを実行することができる。さまざまなプラットフォーム用のJVMが用意されている。[JAR](https://ja.wikipedia.org/wiki/JAR_(%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88))ファイルは、複数のJavaクラスファイルを一つにまとめ圧縮したものである。

原則から考えると、M2 MacでもGATKは動作するはずである。

## GATKのビルド

GitHubの[公式リポジトリ](https://github.com/broadinstitute/gatk)からフォークしてクローンする。重い予感しかないので、`--depth 1` しておいた（どちらでもよい）。

```
git clone https://github.com/your_name/gatk --depth 1
```

Javaのコンパイルとは、実行形式のファイルではなく中間言語であるバイトコードを生成するプロセスを指す。GATKではビルド自動化システムに、Gradle Build Tool というやつを採用しているようなので、ビルドは次のコマンドになる。

```
./gradlew bundle
```

実行すると、`git lfs` がないと言われたので、インストールして、`git lfs install` しておく。

```
brew install git-lfs
git lfs install
```

OpenJDK@17で実行する。そうでないと警告が大量に出てエラーになる。
Javaのバージョンが切り替えるために `jenv` を導入する。

https://qiita.com/seijikohara/items/56cc4ac83ef9d686fab2

```sh
brew install jenv
brew install openjdk@17
brew ls openjdk@17 # パスを確認
jenv add your_path_to_java
jenv local 17
# 上記のコマンドは雰囲気です。実際に打ち込む正しいコマンドは適宜調べてやってください。
```

```
./gradlew bundle
```

これでMacでもgatkがビルドできた。

## テストを実行する

```
./gradlew test
```

結果は、

214738 tests completed, 486 failed, 22 skipped

やはりそこそこ失敗しているが、動くものもあるという感じである。

## 最近の動きなど、ポエム

GATKにはさまざまなツールが含まれているため、今後も使われなくなることはないだろう。
またバイオインフォマティックスのツールとしては珍しく多くのメンバーが入れ替わり立ち代わり保守するという体制をとっており、Java言語によるオブジェクト指向で書かれている。

しかし、とはいえ、である。
全体的に少し枯れた感じが漂っている。

GATKは一人の仕事ではないかわりに、GATKのメンテナンスに一時期関わったからといって持続的に研究者として就職することは難しいのであろう。そこで、アカデミアから産業界への就職の流れがある。

変異解析については、Google Healthなどが 

- [Deep Variant](https://github.com/google/deepvariant)
- [Deep Consensus](https://github.com/google/deepconsensus)
- [Deep Somatic](https://github.com/google/deepsomatic)
 
などのソフトウェアを次々発表している。これは一見すると面白そうに見える。DeepVariantは、[公式ブログ](https://google.github.io/deepvariant/)があり、[Ribbon](https://github.com/MariaNattestad/Ribbon)の開発者のMaria Nattestadさんが解説動画や記事を書いている。

https://www.youtube.com/watch?v=pZEMSBmoyi0

Deep VariantはPileupされたシーンから、６つのチャンネルを持つ画像を生成してこれを学習させる。

- read base
- base quality
- mapping quality
- strand of alignment
- read supports variant
- base differs from ref

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/09ea709d-5a79-f8f7-cda2-08e9431ce8af.png)

言われていみれば、なるほどという感じだけど、正直んん？と思ったのは私だけでしょうか。一言で言うと、IGVを人間が人力で見る作業をそのままAIにやらせているだけ感は否めない。新しいアイディアがあったという感じがあまりしないのである。

私はアホなので話にならないが、優秀な人たちはこれを見てどう思うだろうか？バイオインフォマティックスがGPUマシンを大量に保有している企業しか参加できない金持ちの娯楽になってしまうと、優秀な人はつまらなすぎて離れてしまうと思う。

GATKが少し枯れた雰囲気を醸し出しているのはこのあたりに関係がある気がする。かといって大手クラウドの未来が明るいかというとそれはどうだろうか。Googleはピカピカしているけれども本当は暗いようにも感じられる。GATKは枯れているけど、その心は明るくなれるだろうか？

この記事は以上です。