OdgiをMacでコンパイルしてみた

## odgiとは

GFA: Graphical Fragment Assembly (GFA) Format というフォーマットがゲノムグラフではよく用いられているらしい。GFAファイルに対してさまざまな操作を提供するツールだと思われる。SAM/BAMに対するsamtoolsのような立ち位置のツールではないかと想像するが、この記事を書いている段階ではほとんど使ったことがないのでよくわかっていません。

- リポジトリ　→　https://github.com/pangenome/odgi
- 論文　→　https://doi.org/10.1093/bioinformatics/btac308
- 日本語説明　→　[パンゲノムグラフのためのツール ODGI - macでインフォマティクス](https://kazumaxneo.hatenablog.com/entry/2022/10/14/020000)

論文のアブストラクトの冒頭 (ChatGPTによる翻訳を少しだけ改変）

> ### モチベーション
> パンゲノムグラフは、ゲノム集合の相互整列の完全な表現を提供します。これらのモデルは、構造的に複雑な領域を含む人口のゲノム多様性を研究する機会を提供します。しかし、既存のツールによるサポートが不十分であるため、パンゲノムグラフを使用して数百ギガベーススケールのゲノムを分析することは困難です。そのため、高度なクエリを効率的にデータに対して行うために、高速かつ多様なソフトウェアが必要です。

> ### 結果
> 私たちは、Optimized Dynamic Genome/Graph Implementation（ODGI）という新しいツールのスイートを作成しました。ODGIはスケーラブルなアルゴリズムを実装し、バリエーショングラフの形式でDNAパンゲノムグラフを効率的にインメモリで表現します。ODGIは、GFA形式の事前に構築されたグラフをサポートしています。ODGIには、複雑な領域の検出、パンゲノミックな位置の抽出、アーティファクトの除去、探索的分析、操作、検証、視覚化のためのツールが含まれています。その高速な並列実行により、ギガベーススケールのパンゲノムグラフの一般的なタスクと、複雑な生物学的な問題に迅速に答えることができるパイプラインが容易に行えます。

## Macでコンパイルする時の注意点 OpenMP

miniconda/anacondaを使っている人は、忘れずに `conda deactivate` しておく。

このツールはOpenMPを利用する。
余談であるが、OpenMPIとOpenMPは全く別らしい。私は今日までこの２つを混同していたのでご注意ください。
OpenMPを利用するためには homebrew で libomp をインストールすればよい。しかし、コンパイル時にライブラリを発見する方法が、macのバージョンなどによってうまくいったりいかなかったりするらしい。

CMakefile.txt見ると Darwin と Linux でif分岐がされており、Darwinのところのコメント欄に、`find_package(OpenMP)` はうまく動作しなませんと書いてあり、多くの環境変数を手動でセットしているようである。

```cmake
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") # untested
  # assumes clang build
  # we can't reliably detect when we're using clang, so for the time being we assume
  # TODO: can't we though?
  # adapted from https://stackoverflow.com/questions/46414660/macos-cmake-and-openmp
  # find_package(OpenMP) does not work reliably on macOS, so we do its work ourselves
  set (OpenMP_C "${CMAKE_C_COMPILER}")
  set (OpenMP_C_FLAGS " -Xpreprocessor -fopenmp -I/opt/local/include/libomp -I/usr/local/include -L/opt/local/lib/libomp -L/usr/local/lib")
  set (OpenMP_C_LIB_NAMES "libomp" "libgomp" "libiomp5")
  set (OpenMP_CXX "${CMAKE_CXX_COMPILER}")
  set (OpenMP_CXX_FLAGS " -Xpreprocessor -fopenmp -I/opt/local/include/libomp -I/usr/local/include -L/opt/local/lib/libomp -L/usr/local/lib")
  set (OpenMP_CXX_LIB_NAMES "libomp" "libgomp" "libiomp5")
  set (OpenMP_libomp_LIBRARY "omp")
  set (OpenMP_libgomp_LIBRARY "gomp")
  set (OpenMP_libiomp5_LIBRARY "iomp5")
  # and now add the OpenMP parameters to the compile flags
  set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
  set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
  set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS} -lomp")
elseif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
  find_package(OpenMP REQUIRED)
  # add the flags it detects to the compile flags
  set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS} -fopenmp")
  set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} -fopenmp")
  set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()
```

上記のコメントには、[StackOverFlow](https://stackoverflow.com/questions/46414660/macos-cmake-and-openmp) へのリンクが張ってあるのでさらに詳しい情報を知りたい方はご参照ください。

ひょっとすると、もっと良い方法があり得るかもしれないが、この問題を解決する一つの方法は下記のプルリクエストに記載されている。

https://github.com/pangenome/odgi/pull/494

まずは依存ファイルである jemalloc をインストールし、

```sh 
brew install llvm jemalloc
```

環境変数 `CC` および `CXX` を設定して、homebrewのllvmパッケージ内のclangを利用する。

```sh
CC=/opt/homebrew/opt/llvm/bin/clang \
  CXX=/opt/homebrew/opt/llvm/bin/clang++ \
  LDFLAGS=-L/opt/homebrew/lib \
  cmake . -Bbuild

CC=/opt/homebrew/opt/llvm/bin/clang \
  CXX=/opt/homebrew/opt/llvm/bin/clang++ \
  LDFLAGS=-L/opt/homebrew/lib \
  cmake --build build -- -j
```

これで odgi がコンパイルされる。

意外なところにリンクされていないかチェックしておく。

```
otool -L bin/odgi
```

自分でツールをコンパイルした場合は、テストを実行しておく。

```
bin/odgi test -s > test_log.txt
```

多くのテストが通過するが、一部のテストでバスエラーが出現した。
原因はよくわからないが、完全には正常に動作しないかもしれません。

どうしても動作がおかしい場合は、Dockerが提供されているので、それを利用すればよいようだ。

```
docker pull pangenome/odgi
docker run odgi
```

この記事は以上です。