CAFA 5 Protein Function Prediction DeepGOの読経(2023/07/15)


# はじめに
<!-- 発端や概要を記載 -->
[6/30](https://qiita.com/taichan003/items/e2ab1d4c70ff715faf05), [7/2](https://qiita.com/taichan003/items/ed365c6b2470d25a4a3f), [7/3](https://qiita.com/taichan003/items/39ff269e80752f9f0097), [7/10](https://qiita.com/taichan003/items/47fc81fd2bf6550f9037)  のメモの続きです。
以下の kaggle コンペについての覚書です。

https://www.kaggle.com/competitions/cafa-5-protein-function-prediction

今更だけど、目次が機能していないことに気づいたので作るのやめました。
リンクもつけるの大変だし、記事を書いている人たちってすごかったんだなあ。


# DeepGOZero: Improving protein function prediction from sequence and zero-shot learning based on ontology axioms

https://github.com/bio-ontology-research-group/deepgozero

kaggle のテストデータについて、とりあえず公開されているプログラムをそのまま実行しようと思った、、、けど全部のタンパク質で同じ答えになっちゃった。
さすがにもう少し勉強したほうがいいらしい。


# 論文読むよ

https://academic.oup.com/bioinformatics/article/38/Supplement_1/i238/6617515

ChatGPT先生お願いします >_<
<details><summary>全体要約</summary><div>

・DeepGOZeroは、タンパク質の機能予測を改善するための機械学習モデルであり、少数またはまったくアノテーションのない機能に対して予測を行うことができる。
・DeepGOZeroは、オントロジーの公理を学習するためのモデル理論的アプローチと、タンパク質の機能予測のためのニューラルネットワークを組み合わせている。
・Gene Ontology（GO）の形式的な定義を利用して、ゼロショット予測を行うことができる。つまり、トレーニングフェーズでその機能に関連付けられたタンパク質が一つもなくても、タンパク質の機能を予測することができる。
・DeepGOZeroは、形式的な公理の形での背景知識を利用して、タンパク質の機能予測の性能を向上させることができる。
・DeepGOZeroは、少ないアノテーションを持つクラス（タンパク質）に対しても予測を行うことができる。
・DeepGOZeroは、他の最先端の方法と比較して、タンパク質の予測性能が優れていることが示されている。
・Multi-layer perceptron (MLP)は、InterProScanで得られたタンパク質のInterProドメインアノテーションを使用して、MLPネットワークからタンパク質の機能を予測する方法である。
・DeepGOPlusは、1D畳み込みニューラルネットワークを使用して、タンパク質のアミノ酸配列から機能を予測するDeepGOCNNと組み合わせて、タンパク質の機能アノテーションを予測する方法である。
・NetGO2.0は、GO用語の頻度、InterProドメイン、タンパク質間相互作用ネットワーク、再帰型ニューラルネットワーク、文献などの情報を組み合わせたアンサンブル方法であり、GOLabelerの改良版である。
・DeepGOZeroは、背景知識としてGOの説明論理公理を使用してタンパク質の機能予測の品質を向上させることを目的としています。
・DeepGOZeroは、GOの公理によって制約されたn次元空間内のGOクラスを表現するためにEL Embeddingsを使用します。
・DeepGOZeroは、タンパク質の機能を予測するために、タンパク質とGOクラスの近接性と関係性を考慮してニューラルネットワークを使用します。
・DeepGOZeroはMFO評価で最高のAUC（0.766）を達成し、DeepGOCNNはBPOおよびCCO評価で最高のAUC（0.680および0.760）を達成している。
・DeepGOZeroは50個未満のアノテーションを持つGOクラスにおいて、MLPよりも優れた予測性能を持つことがわかった。一方、MLPはアノテーションが多いGOクラスにおいて優れた性能を示した。
・DeepGOZeroは他の最先端の機能予測手法と比較しても予測性能が高く、DeepGOZeroは配列ベースの特徴のみを使用している。
・DeepGOZeroは、ベクトル空間内の埋め込みとの幾何学的関係に基づいてタンパク質の機能を予測する。
・DeepGOZeroは、トレーニングセットのいずれのタンパク質もその機能に関連付けられていない場合でも、タンパク質の機能を予測することができる。
・ゼロショット予測の性能はランダムよりも優れているが、トレーニングによって性能が改善されることが示されている。
・DeepGOZeroは、GOの公理を使用してタンパク質の機能予測を制約する初めての手法であり、特定のクラスの予測性能を向上させるだけでなく、機能のトレーニングデータがない場合でもタンパク質の機能を予測することができる。
・DeepGOZeroは、少数またはまったく同定されていない機能の予測に影響を与える。他のモデルではこれらの機能を予測することができず、配列の類似性に基づいても予測することができない。
・DeepGOZeroの予測性能は、公理の存在によって大幅に改善される。将来的には、異なるタイプの公理がこの予測性能にどのような影響を与えるかを調査することが興味深い。
・DeepGOZeroは、アミノ酸配列の特徴からタンパク質の機能を予測するモデルであり、GOの背景知識を予測プロセスに組み込んでいる。
・DeepGOZeroは、GOの公理によって機能予測が制約され、アノテーションの少ない特定のGOクラスにおいて予測性能を向上させることができる。
・DeepGOZeroは、他の情報源（タンパク質構造、PPI、文献など）と組み合わせることでさらに性能を向上させることができる。
</div></details>

### 使用したデータ
UniProt/SwissProt Knowledgebase (UniProtKB-SwissProt) のうち、エビデンスコードEXP、IDA、IPI、IMP、IGI、IEP、TAS、IC、HTP、HDA、HMP、HGI、HEPを持つ実験的機能アノテーションを持つ全てのタンパク質にフィルターをかけたもの。このデータセットにはレビューされた 77,647個のタンパク質が含まれる。
このデータセットに対し、GOの各サブオントロジーについて、個別にモデルを学習・評価した。
UniProtKB-SwissProtデータセットには、配列が同一であり、機能注釈もほぼ同じタンパク質が複数含まれる。
学習データと検証データの作成のためにタンパク質をランダムに分割すると、非常によく似たタンパク質やほとんど同じタンパク質が含まれることになり、過学習の可能性がある。
そこで、ランダム分割を行う前に、タンパク質を類似性でグループ分けする。
Diamond 配列類似度が50%を超えるタンパク質を同じグループに入れ、グループの81%をトレーニングに、9%をバリデーションに、10%をテストに使用した。

また、比較のため NetGO2.0 の作者によって生成されたデータセットも使用する。
GOA と UniProtKB から実験的にアノテーションされたタンパク質をダウンロードし、アノテーションの時期に基づいて学習、検証、テストの分割を生成した。
実験的アノテーションはエビデンスコードEXP、IDA、IPI、IMP、IGI、IEP、TAS、ICに基づいてフィルタリングされている。
このデータセットでは、配列の類似性は考慮されていない。


### アーキテクチャ
いくつかの予測モデルの比較を書いてくれている。

2.2 ベースライン手法
2.2.1 DiamondScore
DiamondScore法は、Diamond (Buchfink et al., 2015)によって得られた配列類似度スコアに基づいている。この手法は、トレーニングセットから類似配列を見つけ、そのアノテーションを転送することを目的としている。

2.2.2 多層パーセプトロン
MLP 法は、InterProScan（Mitchell et al.、2014）で得られたタンパク質配列のInterProドメイン注釈からMLPネットワークを用いてタンパク質機能を予測する。タンパク質をすべてのInterProドメインのバイナリベクトルで表現し、それを2層のMLPブロックに渡す。

最初の MLPBLock では InterPro ドメイン注釈を表すベクトル (26,406 次元) を 1024 次元に縮小
2層目の MLPBlock では 1024 次元に変換し、残差接続
最後に、このベクトルをシグモイド活性化関数を持つ分類層に渡します。この層の出力サイズは、各サブオントロジーのクラス数と同じ。
……というのを GO の各サブオントロジーごとに異なるモデルとして訓練する。

2.2.3 DeepGOPlusとDeepGOCNN
DeepGOPlus（Kulmanov and Hoehndorf, 2019）は、1次元 CNN を用いてタンパク質のアミノ酸配列から機能を予測するDeepGOCNNとDiamondScore法を組み合わせることで、タンパク質の機能アノテーションを予測する。
DeepGOCNN は GO 機能に関連する配列モチーフを捉える。

2.3 NetGO2.0
NetGO2.0 (Yao et al., 2021)は、5つの異なる情報源を組み合わせたアンサンブル手法である。具体的には、NetGO2.0 は GO 用語頻度、配列特徴（InterProドメイン）、タンパク質間相互作用ネットワーク、リカレントニューラルネットワーク、文献を使用する。テストセットの予測値を得るために NetGO2.0 ウェブサーバーを使用した。

2.4 DeepGraphGO
DeepGraphGO (You et al., 2021)法は、グラフ畳み込みニューラルネットワークを用いて、配列特徴とタンパク質間相互作用（PPI）ネットワークを結合する。我々は、この手法の著者から提供されたソース・コードを使用して、テスト・セットの予測値を得た。

2.5 TALE+
TALE+（Cao and Shen, 2021）は、トランスフォーマーベースの DNN モデルを用いて機能を予測する。TALE+はまた、GOの分類学をモデルにエンコードするために階層的損失関数を使用する。DNN による予測は、DeepGOPlus と同様に、配列の類似性に基づく予測と組み合わされる。

2.6 DeepGOZero
DeepGOPlus と同様に、配列類似性に基づく予測と組み合わされる。タンパク質機能予測を、オントロジーを分散空間に埋め込むためのモデル理論的アプローチである ELEmbeddings を用いた。
ELEmbeddingsはクラスをn個のボール、関係をベクトルとして表現し、オントロジーの構造を幾何学モデルに埋め込む。バイナリベクトルとして表現されたInterProアノテーションを入力として使用し、2 層の MLPBlock を挟んで、タンパク質に対してサイズ1024の埋め込みを生成する。


### DeepGOZero の詳細
> <img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470253/8bc090ff-4067-5268-8e1e-01c971ca1d19.png">
> <img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470253/49b41ee2-6256-0523-e045-8b672901503b.png">
> 
> ↑ DeepGOZero モデルの概要。
> 左側では、タンパク質 P が MLP を使用してベクトル空間に埋め込まれ、右側では、GO axioms が EL Embedding により埋め込まれている。
> 上の例は、プロテインキナーゼ B シグナル伝達の正の制御（GO: 0051897）とアノテーションされたタンパク質 P を示した。このクラスは生物学的制御（GO: 0065007）として定義され、いくつかのプロテインキナーゼBシグナル伝達（GO: 0043491）を正に制御（RO: 0002213）する。この知識により、トレーニングタンパク質がない場合でも、GO: 0051897でタンパク質をアノテーションすることができる（ゼロショット）。
> タンパク質とGOクラスの埋め込みは、DeepGOZeroのトレーニング中に同時に最適化される。


ELEmbeddingsはクラスをn個のボール、関係をベクトルとして表現し、オントロジーのセマンティクスを幾何学モデルに埋め込む。バイナリベクトルとして表現されたInterProドメイン注釈を入力として使用し、我々のMLPベースライン法からMLPBlockの2層を適用して、タンパク質に対してサイズ1024の埋め込みを生成する。与えられたタンパク質pについて、以下の式を用いてクラスcのアノテーションを予測します：

予測値とラベル間のバイナリクロスエントロピー損失を計算し、ELEmbeddingsのオントロジー公理に対する4つの正規形損失とともに最適化します。Adam オプティマイザを使用して、以下の損失関数を最小化する：

ELEmbeddingsは、以下の4つの異なる形式の正規化公理を使用する：

- NF1：$C \subseteq D$、例えば結合（GO: 0005488）は分子機能（GO: 0003674）のサブクラス。
`GO: 0005488 SubClassOf GO: 0003674`
- NF2：$C \cap D \subseteq E$、例えばクチナーゼ活性（GO: 0050525）および生物学的調節（GO: 0065007）プロテインキナーゼBシグナル伝達の正の調節（GO: 0051897）のサブクラス
`GO: 0050525 and GO: 0065007 SubClassOf GO: 0051897`
- NF3：$C \subseteq \exists R.D$、例えばアルギニン生合成過程の正の制御 (GO: 1900080) はアルギニン生合成過程 (GO: 0006526) を正の制御 (RO: 0002213)のサブクラス
`GO: 1900080 SubClassOf RO:0002213 some GO: 0006526`
- NF4：$\exists R.C \subseteq D$、例えば結合(GO: 0000746)の一部(BFO: 0000050)は乳腺幹細胞増殖(GO: 0002174)のサブクラス
`BFO: 0000050 some GO: 0000746 SubClassOf GO: 0002174`

ここで、C、D、E はクラスを表し、R はオントロジーの関係を表し、$\subseteq$ は SubClassOf を意味する。
JCel推論システム（Mendez, 2012）に実装された変換ルールを使用して、GO公理をこれら4つの正規形に変換する。その結果、これら4つの正規形のいずれかを持ち、GOの公理と等価な公理のセットが得られる。
ELEmbeddingsは、これらの正規化されたGOの公理を制約として使用し、各GOクラスをnボール（n次元空間の中心点と半径で表現）に、各関係をn次元空間内の変換として投影する。次元nは1024に設定し、タンパク質の埋め込みと同じになるようにした。


### Zero-shot function prediction について

DeepGOZeroは、ベクトル空間の埋め込みに対する幾何学的な関係に基づいて、タンパク質の機能を予測する。
GOの全クラスの埋め込みがあるため、DeepGOZeroは、トレーニングセット中にその機能に関連するタンパク質が1つもなかったとしても、タンパク質の機能を予測することができる。
このような予測を「ゼロショット」機能予測と呼ぶ。

ゼロショット予測の性能を評価するために、類似度ベースの分割UniProtKBSwissProtデータセットで2つの実験を行う。
第一に、同等のクラス公理定義を持つ特定のクラスに対する予測の性能をテストする。
例えば、GOのセリン型エンドペプチダーゼ阻害活性(GO: 0004867)というクラスは、分子機能レギュレーター(GO: 0098772)と同等に定義され、いくつかのセリン型エンドペプチダーゼ活性(GO: 0004252)を負に制御(RO: 0002212)する。
(コメント：negatively regulates という関係自体についても用語がついていて、それが RO:0002212.
Molecular Function というサブグループの中では GO:0098772 が一番の親。もうひとつ GO:0003824 もあるけど途中で negative relation を挟む。)

で、適切なデータ前処理をしてアノテーションをされていない GO クラスを予測した結果、うまくいったらしい。
さらに、トレーニングサンプルの数が非常に少ない（<10）クラスに対するゼロショット予測のパフォーマンスについてもよい結果が得られた。


# github のプログラムを読むよ

前回雑に deepgozero.py を動かして失敗した。
敗因は data/mf/test_data.pkl の interpros 列を全部空欄にしていたせい。ここが説明変数だったらしい。
じゃあ interpros 列は FASTA 形式から変換するプログラムがあるはず。
よくわからないのでとりあえず全部 chatGPT 先生に概要を作ってもらった。
今回は概要をコピペするところまで。ちゃんと読んできます。

### aminoacids.py
このプログラムは、タンパク質のアミノ酸配列を処理するための関数を提供しています。

入力データ:
プログラムに入力するデータは、タンパク質のアミノ酸配列です。アミノ酸配列は文字列で表され、各アミノ酸は1文字の記号で表されます。ただし、一部の無効なアミノ酸（'U', 'O', 'B', 'Z', 'J', 'X', '*'）は無視されます。

関数`to_ngrams`、`to_tokens`、`to_onehot`は、アミノ酸配列を異なる形式に変換するために使用されます。
- `to_ngrams`関数は、アミノ酸配列を3文字のn-gram（連続した3つのアミノ酸）のインデックスの配列に変換します。各n-gramは辞書`NGRAMS`に対応するインデックスが割り当てられています。
- `to_tokens`関数は、アミノ酸配列をアミノ酸のインデックスの配列に変換します。各アミノ酸は辞書`AAINDEX`に対応するインデックスが割り当てられています。
- `to_onehot`関数は、アミノ酸配列をone-hotエンコーディングされた配列に変換します。各アミノ酸は21次元のベクトルに変換され、対応するインデックスの要素が1で、それ以外の要素が0です。また、配列の先頭と末尾にはパディング用の要素が追加されます。

### annotations.py
このプログラムは、指定されたPandasデータフレームからタンパク質の配列と関連するアノテーションを抽出し、タブ区切りのファイルに書き込むものです。

入力データ:
- `data_file`オプションで指定されたPandasデータフレーム（デフォルトは'data/swissprot_exp_2021_03.pkl'）。
- データフレームは、タンパク質の配列と関連するアノテーションを含んでいます。

出力ファイル:
- `out_file`オプションで指定されたファイル（デフォルトは'data/swissprot_exp_annots_2021_03.tab'）。
- このファイルには、タンパク質の配列と関連するアノテーションがタブ区切りで書き込まれます。各行は1つのタンパク質を表し、タンパク質の配列の後に関連するアノテーションが続きます。アノテーションはコロン（:）がアンダースコア（_）に置き換えられています。

### annots_plot.py
このプログラムは、与えられたテキストファイルからデータを読み込み、グラフを作成して保存するものです。

入力データ:
- 'zero_completely.txt'というファイルからデータを読み込みます。このファイルは、各行にスペースで区切られた3つの要素を持つテキストファイルです。最初の要素はGO ID（Gene Ontology ID）であり、2番目の要素は無視されます。3番目の要素はアノテーションの数です。

出力ファイル:
- 'annots-num.eps'という名前のグラフが作成され、保存されます。

プログラムの概要:
1. テキストファイルを開き、各行を処理します。
2. 各行をスペースで分割し、GO IDとアノテーションの数を取得します。
3. アノテーションの数をカウントし、最も頻度の高い10個のアノテーションの数を取得します。
4. アノテーションの数と平均パフォーマンスを取得し、グラフを作成します。
5. グラフを保存します。

### axioms.py
このプログラムは、Pythonで書かれたコマンドラインツールです。主な目的は、OWL形式のオントロジーを読み込み、その内容を操作することです。

入力データ:
プログラムに入力するデータは、"data/go-plus.owl"というファイルです。このファイルはOWL形式のオントロジーを表しており、プログラムはこのファイルを読み込んで処理を行います。

プログラムのmain関数では、OWLAPIを使用してオントロジーを読み込みます。具体的には、OWLOntologyManagerを作成し、OWLDataFactoryを取得しています。そして、loadOntologyFromOntologyDocumentメソッドを使用して、"data/go-plus.owl"ファイルからオントロジーを読み込んでいます。
また、to_go関数とto_rel関数が定義されています。これらの関数は、URIを適切な形式に変換するために使用されます。


### axioms_data.py
このプログラムは、指定されたデータフレームにアノテーション情報を追加するためのものです。具体的には、指定されたデータフレームとアノテーションファイルを読み込み、データフレームにアノテーション情報を追加して保存します。

入力データ:
- --data-file（または -df）オプションで指定されたデータフレームは、Pandasのpickle形式で保存されたファイルです。データフレームには、タンパク質の配列情報が含まれています。
- --annots-file（または -af）オプションで指定されたアノテーションファイルは、タブ区切りのテキストファイルです。各行には、タンパク質のアノテーション情報が含まれています。

出力ファイル:
- プログラムは、指定されたデータフレームにアノテーション情報を追加して、元のデータフレームと同じ形式のPandasのpickle形式で保存します。保存されるファイル名は、元のデータフレームのファイル名に "_annots.pkl" を追加したものです。


### data.py
このプログラムは、OWLAPIを使用してOWL形式のオントロジーを読み込み、そのオントロジーから関連データを抽出し、データフレームとして保存します。

入力データ:
- "data/go.owl": OWL形式のオントロジーファイル
- "data/terms.pkl": データフレーム形式のGO用語のリスト
- "data/train_data.pkl": データフレーム形式のトレーニングデータ

出力ファイル:
- "data/train_subclass.pkl": データフレーム形式のサブクラス関係データ
- "data/train_relations.pkl": データフレーム形式の関係データ
- "data/train_hasfunc.pkl": データフレーム形式の関数データ
- "data/relations.pkl": データフレーム形式の関係IDデータ

### data_cafa3.py
このプログラムは、Gene Ontology（GO）のアノテーションデータを処理するためのものです。具体的には、GOの階層構造を読み込み、UniProtKBのデータとシーケンスの類似性データを処理します。

入力データ:
- GOファイル（デフォルトは'data-cafa3/go.obo'）：GOの階層構造を含むOBO形式のファイルです。
- データファイル（デフォルトは'data-cafa3/swissprot_exp.pkl'）：UniProtKBのデータを含むPandasのピクルファイルです。
- シミラリティファイル（デフォルトは'data-cafa3/swissprot_exp.sim'）：シーケンスの類似性データを含むファイルです。

出力ファイル:
- 'data-cafa3/CAFA3_targets/targets_all.fasta'：CAFA3のターゲットデータのFASTA形式のファイル
- 'data-cafa3/benchmark20171115/lists/bpo_all_type1.txt'、'data-cafa3/benchmark20171115/lists/mfo_all_type1.txt'、'data-cafa3/benchmark20171115/lists/cco_all_type1.txt'：GOのアノテーションデータのリストファイル
- 'data-cafa3/benchmark20171115/groundtruth/leafonly_all.txt'：GOのアノテーションデータのグラウンドトゥルースファイル
- 'data-cafa3/benchmark20171115/targets.fasta.tsv'：ターゲットのFASTA形式のファイルと関連するInterProデータのTSV形式のファイル

プログラムは、UniProtKBのデータとシーケンスの類似性データを処理し、トレーニングとバリデーションのアノテーションを生成します。具体的には、UniProtKBのデータからターゲットのリストを作成し、それぞれのターゲットに対してGOのアノテーションを取得します。また、ターゲットのシーケンスと関連するInterProデータも取得します。最終的に、トレーニングとバリデーションのアノテーションを含むPandasのデータフレームが作成されます。

### data_netgo.py
このプログラムは、Gene Ontology（GO）のデータとUniprotのデータを使用して、NetGO2データをロードし、それらのデータを処理するためのものです。

入力データ:
- GOファイル（OBO形式）：Gene Ontologyのデータを含むファイルのパスを指定します。
- データファイル（gzip圧縮されたタブ区切りファイル）：Uniprotのデータを含むファイルのパスを指定します。

出力ファイル:
プログラムの実行によって、"reviewed"とマークされたデータの数と、NetGO2データのロードが開始されたことを示すメッセージを表示します。

プログラムの詳細な処理は以下の通りです：
1. GOファイルを使用して、Ontologyオブジェクトを作成します。
2. Uniprotのデータファイルを読み込み、各プロテインIDに関連する情報（InterPro ID、組織ID、配列など）を保存します。
3. NetGO2データをロードし、プロテインIDと関連するアノテーション（GO ID）を保存します。ただし、テストデータの場合は、特定の条件を満たさないプロテインIDは除外されます。
4. プロテインIDごとに、関連するアノテーションの祖先を取得し、重複を除いたアノテーションリストを作成します。

### deepgocnn.py
このプログラムは、DeepGOPlusというタンパク質機能予測モデルをトレーニングし、予測結果を出力するものです。

入力データ:
- data-root: データのルートディレクトリのパス
- ont: 使用するオントロジーの種類（mf, bp, ccのいずれか）
- batch-size: トレーニング時のバッチサイズ
- epochs: トレーニングのエポック数
- load: モデルをロードするかどうか（フラグ）
- device: 使用するデバイス（デフォルトはcuda:1）

出力ファイル:
- go.obo: GOオントロジーファイル
- deepgocnn.th: トレーニングされたモデルの重みファイル
- terms.pkl: GO IDとインデックスの対応関係を保存したファイル
- predictions_deepgocnn.pkl: 予測結果を保存したファイル
- train_logs.tsv: トレーニングのログを保存したファイル

### deepgogat.py
このプログラムは、DeepGO-GATモデルを使用してタンパク質の機能アノテーションを予測するためのものです。

入力データ:
- go-file：OBO形式のHuman Phenotype Ontologyファイル
- data-file：配列と完全なアノテーションのセットを含むデータファイル
- terms-file：配列と完全なアノテーションのセットを含むデータファイル
- model-file：予測モデルのファイル
- batch-size：トレーニングのバッチサイズ
- epochs：トレーニングのエポック数
- load：モデルをロードするかどうかのフラグ
- out-file：予測結果の出力ファイル
- device：使用するデバイス（デフォルトはcuda:1）

出力ファイル:
予測結果はout-fileで指定されたファイルに保存されます。

### deepgopro.py
このプログラムは、DGPROモデルを使用してタンパク質の機能アノテーションを予測するためのものです。

入力データ:
- go.obo：Gene Ontology（GO）のオントロジーファイル
- mlb.th：学習済みのMLPモデルのパラメータファイル
- terms.pkl：GOの各項目に対応するインデックスを格納したpickleファイル
- predictions_mlp.pkl：MLPモデルの予測結果を格納するpickleファイル

出力ファイル:
- train_logs.tsv：トレーニングのログファイル

プログラムの実行には、以下のコマンドライン引数が使用されます。
- --data-rootまたは-dr：データのルートディレクトリのパス（デフォルトは"data"）
- --ontまたは-ont：予測モデル（デフォルトは"mf"）
- --batch-sizeまたは-bs：トレーニングのバッチサイズ（デフォルトは37）
- --epochsまたは-ep：トレーニングのエポック数（デフォルトは256）
- --loadまたは-ld：モデルをロードするかどうかのフラグ（デフォルトはFalse）
- --deviceまたは-d：デバイス（デフォルトは"cuda:1"）

プログラムの実行結果として、以下の情報が表示されます。
- トレーニングの進捗状況と損失
- バリデーションデータセットでの損失とAUC
- テストデータセットでの損失とAUC

また、予測結果は、GOの階層構造を使用してスコアを伝播させ、各GO IDに対して最大スコアを持つアノテーションを生成します。

### deepgozero.py
このプログラムは、DeepGOZeroと呼ばれるタンパク質の機能予測モデルをトレーニングするためのものです。

入力データ:
- go.norm: タンパク質の機能アノテーションデータ
- {ont}/deepgozero_zero_10.th: トレーニング済みのモデルファイル
- {ont}/terms_zero_10.pkl: タンパク質の機能アノテーションの辞書データ

出力ファイル:
- {ont}/predictions_deepgozero_zero_10.pkl: テストデータに対する予測結果のファイル

プログラムの詳細な流れは以下の通りです。
1. 必要なライブラリをインポートする。
2. コマンドライン引数を受け取る。
3. ファイルパスを設定する。
4. データをロードする。
5. モデルを定義する。
6. トレーニングを行い、モデルを評価する。
7. 最良のモデルを保存する。

### deepgozero_data.py
このプログラムは、Gene Ontology（GO）のアノテーションデータを処理し、トレーニング、バリデーション、テストデータに分割するためのものです。

入力データ:
- --go-fileまたは-gfオプションで指定されるGene Ontologyファイル（OBO形式）
- --data-fileまたは-dfオプションで指定されるUniprot KBのデータファイル（pkl形式）
- --sim-fileまたは-sfオプションで指定されるシーケンス類似性のデータファイル（sim形式）

出力ファイル:
- data/mf/terms.pkl、data/bp/terms.pkl、data/cc/terms.pkl：各GO領域（分子機能、生物学的プロセス、細胞部位）の用語のリストが含まれるpickleファイル
- data/mf/train_data_hard.pkl、data/bp/train_data_hard.pkl、data/cc/train_data_hard.pkl：各GO領域のトレーニングデータが含まれるpickleファイル
- data/mf/valid_data_hard.pkl、data/bp/valid_data_hard.pkl、data/cc/valid_data_hard.pkl：各GO領域のバリデーションデータが含まれるpickleファイル
- data/mf/test_data_hard.pkl、data/bp/test_data_hard.pkl、data/cc/test_data_hard.pkl：各GO領域のテストデータが含まれるpickleファイル

プログラムの概要は以下の通りです：
1. Gene Ontologyファイルを読み込み、Ontologyオブジェクトを作成します。
2. Uniprot KBのデータファイルを読み込み、データフレーム（df）を作成します。
3. データフレームからプロテインの一意のセットを取得します。
4. アノテーションの処理を行います。各GO領域（mf、bp、cc）について、以下の処理を行います：
   - データフレームをイテレーションし、各プロテインのアノテーションを取得します。
   - アノテーションの中から、対応するGO領域の用語（term）をカウントします。
   - アノテーションの中から、InterProの用語（ipr）をカウントします。
   - 対応するGO領域の用語とInterProの用語をリストに追加します。
   - カウントされた用語とInterProの用語をpickleファイルに保存します。
   - プロテインの類似性データを読み込み、トレーニング、バリデーション、テストデータに分割します。
   - 分割されたデータをpickleファイルに保存します。
5. 各GO領域について、トレーニング、バリデーション、テストデータのプロテイン数を表示します。

このプログラムは、Gene Ontologyのアノテーションデータを処理し、トレーニング、バリデーション、テストデータに分割するためのものです。分割されたデータはpickleファイルとして保存されます。

### deepgozero_predict.py
このプログラムは、DeepGOZeroモデルを使用して、タンパク質の機能アノテーションを予測するためのものです。

入力データ:
プログラムに入力するデータは、Pandasのpklファイルであり、タンパク質とその間接的なアノテーションが含まれています。

出力ファイル:
プログラムを実行すると、予測結果が出力されます。


### deepgozero_zero.py
このプログラムは、DeepGOELモデルを使用して、タンパク質の機能アノテーションを予測するためのものです。

入力データ:
- train_data_file: 訓練データのファイルパス（デフォルトは'data/{ont}/train_data.pkl'）
- valid_data_file: 検証データのファイルパス（デフォルトは'data/{ont}/valid_data.pkl'）
- test_data_file: テストデータのファイルパス（デフォルトは'data/{ont}/test_data.pkl'）
- terms_file: タームデータのファイルパス（デフォルトは'data/{ont}/terms_zero_10.pkl'）
- model_file: 予測モデルのファイルパス（デフォルトは'data/{ont}/deepgozero_zero_10.th'）

プログラムの実行方法にあたって、コマンドラインから以下を入力します：
- train-data-file: 訓練データのファイルパスを指定します。
- valid-data-file: 検証データのファイルパスを指定します。
- test-data-file: テストデータのファイルパスを指定します。
- terms-file: タームデータのファイルパスを指定します。
- model-file: 予測モデルのファイルパスを指定します。
- device: 使用するデバイスを指定します（デフォルトは'cuda:1'）。

プログラムの概要は以下の通りです：
1. インプットデータを読み込みます。
2. モデルをロードします。
3. モデルを評価し、予測結果を出力します。

### deepgo_data.py
このプログラムは、Gene Ontology（GO）ファイルとUniprot KBファイルを処理し、トレーニングデータとテストデータを生成します。

入力データ:
- GOファイル（OBO形式）：`--go-file`または`-gf`オプションで指定します。デフォルトは"data/go.obo"です。
- Uniprot KBファイル：`--data-file`または`-ndf`オプションで指定します。デフォルトは"data/swissprot_interactions.pkl"です。

出力ファイル:
- terms.pkl：トレーニングデータとテストデータに含まれるGOのリストが保存されます。
- train_data.pkl：トレーニングデータが保存されます。
- test_data.pkl：テストデータが保存されます。

プログラムの概要は以下の通りです：
1. GOファイルを読み込み、Ontologyオブジェクトを作成します。
2. Uniprot KBファイルを読み込み、データフレームに変換します。
3. アノテーションを処理し、各GOの出現回数をカウントします。
4. カウントされたGOのリストを保存します。
5. データフレームをトレーニングデータとテストデータに分割します。
6. トレーニングデータとテストデータをそれぞれ別のファイルに保存します。

### deepgraphgo_preds.py
このプログラムは、DeepGraphGOモデルを使用して、タンパク質の機能アノテーションを予測します。プログラムは、テストデータとアノテーションデータを入力として受け取り、DeepGraphGOモデルの予測結果を出力ファイルに保存します。

入力データ:
- テストデータファイル（test_data_file）：pickle形式のファイルで、タンパク質の情報が含まれています。
- アノテーションデータファイル（terms_file）：pickle形式のファイルで、タンパク質のアノテーション情報が含まれています。
- DeepGraphGOの予測結果ファイル（dgg_scores_file）：テキストファイルで、DeepGraphGOモデルによる予測スコアが含まれています。

出力ファイル:
- 出力ファイル（out_file）：pickle形式のファイルで、テストデータに対するDeepGraphGOモデルの予測結果が含まれています。

### definitions.py
このプログラムは、与えられたデータファイルから特定のGene Ontology（GO）の定義を抽出し、出力ファイルに保存するものです。

入力データ:
- `data_file`（デフォルト値：'data/definitions_go.txt'）：Pandasデータフレーム形式のタンパク質配列を含むファイルパス。
- `go_file`（デフォルト値：'data/go.obo'）：Gene Ontologyファイルのパス。
- `sub_ontology`（デフォルト値：'bp'）：抽出するサブオントロジー（GOの一部）の指定。
- `out_file`（デフォルト値：'data/definitions_go_bp.txt'）：出力ファイルのパス。

出力ファイル:
- `out_file`で指定されたパスに、抽出されたGO定義が保存されます。

### diamond_data.py
このプログラムは、指定されたデータフレームからタンパク質の配列を取得し、FASTA形式のファイルに書き込むものです。

入力データ:
- `data_file`オプション: データフレームのファイルパスを指定します。デフォルトは"data/swissprot_exp.pkl"です。このファイルはPandasのデータフレームとして保存されている必要があります。
- `out_file`オプション: 出力ファイルのパスを指定します。デフォルトは"data/swissprot_exp.fa"です。このファイルはFASTA形式で書き込まれます。

出力ファイル:
- `out_file`で指定されたパスにFASTA形式のファイルが生成されます。このファイルには、データフレームから取得したタンパク質の配列が書き込まれます。

### evaluate.py
このプログラムは、GO (Gene Ontology) のアノテーション予測モデルの評価を行うためのものです。

入力データ:
- `data-root`：データのルートディレクトリのパス
- `ont`：GOのオントロジー（分子機能：`mf`、生物学的過程：`bp`、細胞コンポーネント：`cc`）
- `model`：予測モデルの名前
- `combine`：ダイヤモンドとDeepGOのスコアを組み合わせるかどうか（フラグ）

出力ファイル:
- `train_data.pkl`：トレーニングデータのファイル
- `valid_data.pkl`：検証データのファイル
- `predictions_{model}.pkl`：テストデータの予測結果のファイル
- `terms.pkl`：GOの用語のファイル

プログラムの実行結果として、以下の情報が表示されます：
- 各GO用語のIC値
- ダイヤモンドとDeepGOのスコアを組み合わせた場合のFmax、Smin、しきい値
- ダイヤモンドとDeepGOのスコアを組み合わせなかった場合のFmax、Smin、しきい値

### evaluate_terms.py
このプログラムは、予測モデルの性能を評価するために、ROC曲線とAUC値を計算します。

入力データ:
- `data_root`ディレクトリ内の`ont`ディレクトリにある`predictions_model.pkl`ファイル：予測結果のデータフレーム
- `data_root`ディレクトリ内の`ont`ディレクトリにある`terms.pkl`ファイル：GO termのデータフレーム
- `data_root`ディレクトリ内の`ont`ディレクトリにある`train_data.pkl`ファイル：訓練データのデータフレーム
- `data_root`ディレクトリ内の`ont`ディレクトリにある`valid_data.pkl`ファイル：検証データのデータフレーム

出力ファイル:
- `data_root`ディレクトリ内の`ont`ディレクトリにある`zero_go_id_auc_train.pkl`ファイル：指定されたGO termの訓練データのAUC値とROC曲線のデータフレーム
- `data_root`ディレクトリ内の`ont`ディレクトリにある`model_auc_annots.pkl`ファイル：全てのGO termのAUC値とアノテーション数のデータフレーム

プログラムの実行時に指定するオプションは以下の通りです：
- `--data-root`または`-dr`：データのルートディレクトリのパス（デフォルトは"data"）
- `--ont`または`-ont`：評価するGO termの種類（デフォルトは"mf"）
- `--model`または`-m`：予測モデルの名前（デフォルトは"deepgozero_blast"）
- `--combine`または`-c`：予測結果を組み合わせるかどうかのフラグ（デフォルトはFalse）

### interpro.py
このプログラムは、タンパク質のアノテーション予測モデルをトレーニングし、評価するためのものです。

入力データ:
- data-file: タンパク質の配列と完全なアノテーションが含まれるデータファイル（デフォルトは'data/interpro_train_data.pkl'）
- terms-file: タンパク質の配列と完全なアノテーションが含まれるデータファイル（デフォルトは'data/interpros.pkl'）
- model-file: 予測モデルの保存先（デフォルトは'data/interpro.th'）
- batch-size: トレーニング時のバッチサイズ（デフォルトは32）
- epochs: トレーニングのエポック数（デフォルトは64）
- load: モデルをロードするかどうかのフラグ（デフォルトはFalse）

プログラムを実行すると、トレーニングデータと検証データを読み込み、モデルをトレーニングします。トレーニング中には、バッチごとに損失を計算し、モデルのパラメータを更新します。トレーニングが終了すると、検証データを使用してモデルの性能を評価し、損失、AUC、Fmaxを出力します。最も良い損失を持つモデルは、指定されたモデルファイルに保存されます。

なお、コメントアウトされたコードの一部は、テストデータを使用してモデルを評価するためのものです。

### interpro_data.py
このプログラムは、与えられたデータファイルからアノテーションを処理し、トレーニングデータとテストデータを作成するものです。

入力データ:
- data-file: データファイルのパス（デフォルトは'data/swissprot_interactions.pkl'）
- out-terms-file: 出力ファイルのパス（デフォルトは'data/interpros.pkl'）
- train-data-file: トレーニングデータの出力ファイルのパス（デフォルトは'data/interpro_train_data.pkl'）
- test-data-file: テストデータの出力ファイルのパス（デフォルトは'data/interpro_test_data.pkl'）

プログラムの実行によって生成または編集されるファイル:
- interpros.pkl: 出力ファイル。アノテーションのリストが保存されます。
- interpro_train_data.pkl: トレーニングデータの出力ファイル。トレーニングデータが保存されます。
- interpro_test_data.pkl: テストデータの出力ファイル。テストデータが保存されます。

プログラムの概要:
1. データファイルを読み込みます。
2. アノテーションを処理し、アノテーションの辞書を作成します。
3. アノテーションの出現回数をカウントし、出現回数が3未満のアノテーションを削除します。
4. データフレームをフィルタリングし、アノテーションを追加します。
5. トレーニングデータとテストデータに分割し、それぞれのデータを保存します。

### inter_data.py
このプログラムは、指定されたデータファイルと相互作用ファイルから、タンパク質の相互作用情報を抽出し、結果を新しいファイルに保存します。

入力データ:
- `data_file`（デフォルト値：`data/swissprot_exp_annots.pkl`）：uni2pandasスクリプトによって生成されたデータファイル（Pandasのpickle形式）
- `inter_file`（デフォルト値：`data/protein.links.full.v11.0.txt.gz`）：STRING DBからの相互作用データファイル（gzip圧縮されたテキストファイル）

出力ファイル:
- `out_file`（デフォルト値：`data/swissprot_interactions.pkl`）：タンパク質、配列、注釈、および相互作用のリストを含む結果ファイル（Pandasのpickle形式）

プログラムの実行手順：
1. `data_file`を読み込み、データフレーム（df）に格納します。
2. df内の各行に対して、タンパク質ID（prot_id）とSTRING ID（st_id）の対応関係を辞書（st2uni）に保存します。
3. df内の全てのタンパク質IDを集合（proteins）に保存します。
4. `inter_file`をgzipで解凍し、各行に対して以下の処理を行います。
   - タンパク質ID（p1、p2）と相互作用スコア（com_score）を取得します。
   - 相互作用スコアが700未満の場合は無視します。
   - タンパク質IDがst2uniに存在しない場合は無視します。
   - p1とp2の相互作用をinteractions辞書に保存します。
5. df内の各行に対して、タンパク質IDがinteractionsに存在する場合は、その相互作用リストをintersリストに追加します。
6. dfに新しい列（interactions）を追加し、intersリストを格納します。
7. dfをpickle形式で`out_file`に保存します。
8. 処理が完了したら、相互作用の数（c）を表示します。

### netgo_preds.py
このプログラムは、NetGOと呼ばれる遺伝子オントロジー予測モデルを使用して、タンパク質の機能アノテーションを予測します。具体的には、与えられたテストデータとNetGOスコアファイルを使用して、タンパク質の各GO（Gene Ontology）アノテーションの予測スコアを計算し、結果を出力します。

入力データ:
- test_data_file: テストデータファイルのパス（デフォルトは'data-netgo/{ont}/test_data.pkl'）
- terms_file: シーケンスと完全なアノテーションセットを含むデータファイルのパス（デフォルトは'data-netgo/{ont}/terms.pkl'）
- netgo_scores_file: NetGO予測結果のファイルパス（デフォルトは'data-netgo/netgo-{ont}.txt'）
- out_file: 出力ファイルのパス（デフォルトは'data-netgo/{ont}/predictions_netgo.pkl'）

出力ファイル:
- out_file: 出力ファイルには、テストデータと予測スコアが含まれます。

### plot.py
このプログラムは、ゼロショット予測のパフォーマンスを評価するために使用されます。プログラムは、3つの異なるオントロジー（分子機能、生物学的過程、細胞部位）に対して、複数の評価用語に対するAUC（曲線下面積）を計算します。

入力データ:
- 'data/go.obo': GO（Gene Ontology）のオントロジーファイル
- 'data/{ont}/zero_{term}_auc.pkl': ゼロショット予測のAUCデータ（{ont}と{term}はオントロジーと評価用語を表す変数です）
- 'data/{ont}/zero_{term}_auc_all.pkl': 全データを使用した場合のAUCデータ
- 'data/{ont}/zero_{term}_auc_train.pkl': トレーニングデータのみを使用した場合のAUCデータ

プログラムは、各オントロジーと評価用語に対してAUCを計算し、結果を出力します。また、各オントロジーと評価用語の平均AUCも計算され、最後に出力されます。出力は、LaTeXのテーブル形式で表示されます。

なお、プログラム中のコメントアウトされた部分は、グラフの描画に関するコードですが、現在はコメントアウトされているため、グラフは生成されません。

### plot3d.py
このプログラムは、DeepGOELモデルを使用して、GO（Gene Ontology）のアノテーションを予測し、埋め込み表現を可視化するものです。

入力データ:
- go.normファイル：GOの正規化ファイル
- deepgozero.thファイル：DeepGOELモデルの重みファイル
- terms.pklファイル：GOの用語のデータフレームをpickle形式で保存したファイル
- interpros.pklファイル：InterProのデータフレームをpickle形式で保存したファイル
- go.oboファイル：GOのオントロジーファイル

プログラムを実行すると、embeds3d.pdfという名前のファイルが生成されます。このファイルには、GOの埋め込み表現の3Dプロットが含まれています。

### predict_deepgopp.py
このプログラムは、タンパク質の機能アノテーションを予測するためのモデルを構築するために使用されます。具体的には、タンパク質の類似性を計算し、その類似性に基づいてタンパク質の機能アノテーションを予測します。

入力データ:
- train_data_file: 訓練データの特徴量が含まれるファイル（デフォルトは"data/mf/train_data.pkl"）
- valid_data_file: 訓練データの特徴量が含まれるファイル（デフォルトは"data/mf/valid_data.pkl"）
- test_data_file: テストデータの特徴量が含まれるファイル（デフォルトは"data/mf/predictions_deepgoel.pkl"）
- terms_file: シーケンスと完全なアノテーションのセットが含まれるファイル（デフォルトは"data/mf/terms.pkl"）
- diamond_scores_file: Diamondの出力ファイル（デフォルトは"data/mf/test_diamond.res"）
- out_file: 出力ファイル（指定されていない場合はなし）

プログラムの実行によって生成または編集されるファイルはありません。ただし、出力ファイルが指定されている場合は、予測結果がそのファイルに書き込まれます。

### predict_diamond.py
このプログラムは、GO (Gene Ontology) のアノテーションを予測するためのモデルを評価するために使用されます。プログラムは、指定されたデータセットとモデルを使用して、テストデータのGOアノテーションを予測します。具体的には、プログラムは、トレーニングデータ、バリデーションデータ、テストデータを読み込み、トレーニングデータとバリデーションデータを結合します。そして、テストデータの各サンプルに対して、BLAST (Basic Local Alignment Search Tool) による類似性スコアを計算し、それを使用してGOアノテーションを予測します。最後に、予測結果を保存します。

入力データ:
- data_root: データセットのルートディレクトリのパス (デフォルトは"data")
- ont: 使用するGOオントロジーの種類 (デフォルトは"mf")
- model: 使用する予測モデルの種類 (デフォルトは"deepgozero")
- train_data.pkl: トレーニングデータのPickleファイル
- valid_data.pkl: バリデーションデータのPickleファイル
- predictions_{model}.pkl: テストデータの予測結果のPickleファイル
- terms.pkl: GOの用語データのPickleファイル
- test_diamond.res: テストデータのBLASTスコアのファイル

出力ファイル:
- {data_root}/{ont}/test_data_blast.pkl: テストデータにBLAST予測結果を追加したPickleファイル


### save_graph.py
このプログラムは、OWLファイルとデータフレームを使用して、グラフデータを生成します。

入力データ:
- OWLファイル: "data/go.owl"という名前のファイルが必要です。このファイルは、GO (Gene Ontology) のオントロジーを表しています。
- データフレーム: "data/terms.pkl"という名前のファイルが必要です。このファイルには、GOの用語とそのIDが含まれています。

出力ファイル:
- "data/go.bin": GOの用語間の関係を表すグラフデータが保存されます。このデータは、DGL (Deep Graph Library) の形式で保存されます。
- "data/ppi.bin": タンパク質間の相互作用を表すグラフデータが保存されます。このデータもDGLの形式で保存されます。

プログラムの詳細な解説は以下の通りです。
1. ライブラリのインポートとJVMの起動：click, numpy, pandas, gzip, logging, torch, jpype, osなどのライブラリをインポートします。また、jpypeを使用してJVMを起動します。
2. OWLAPIのインポート：OWLAPIのクラスやメソッドをインポートします。
3. DGLのインポート：DGLのクラスやメソッドをインポートします。
4. main関数の定義：clickデコレータを使用して、main関数を定義します。
5. OWLファイルの読み込みと処理：OWLファイルを読み込み、JcelReasonerを使用して推論を行います。さらに、推論結果をグラフデータに変換し、関係を抽出します。
6. データフレームの読み込みと処理：データフレームを読み込み、タンパク質間の相互作用を表すグラフデータを生成します。
7. グラフデータの保存：DGLの形式で生成されたグラフデータを保存します。
8. to_go関数とto_rel関数の定義：URIを適切な形式に変換するための関数を定義します。
9. main関数の実行：プログラムのエントリーポイントとなるmain関数を実行します。

### sim_plot.py
このプログラムは、与えられたファイルからデータを読み込み、類似度の分布をヒストグラムとして表示するものです。

入力データ:
入力データは、"data/swissprot_exp.sim"というファイルです。このファイルはタブ区切りのテキストファイルであり、各行には3つの要素が含まれています。最初の要素はp1と呼ばれるタンパク質のID、2番目の要素はp2と呼ばれる別のタンパク質のID、3番目の要素はそれらのタンパク質間の類似度を表す数値です。

出力ファイル:
プログラムの実行によって生成されるファイルは"sim-hist.eps"という名前のグラフの画像ファイルです。このファイルには、類似度の分布を表すヒストグラムが保存されます。

### tale_preds.py
このプログラムは、タンパク質のアノテーション予測を行うためのものです。具体的には、タンパク質のアノテーションデータと、予測スコアが含まれたファイルを入力として受け取り、予測結果を含むファイルを出力します。

入力データ:
- test_data_file: テストデータのファイルパス（デフォルトは"data-netgo/{ont}/test_data.pkl"）
- terms_file: タンパク質のアノテーションデータのファイルパス（デフォルトは"data-netgo/{ont}/terms.pkl"）
- tale_scores_file: 予測スコアが含まれたファイルパス（デフォルトは"data-netgo/tale_netgo_{ont}.txt"）
- out_file: 出力ファイルのパス（デフォルトは"data-netgo/{ont}/predictions_tale.pkl"）

出力ファイル:
- out_file: 出力ファイル。テストデータに対する予測結果が含まれます。

### term_plot.py
このプログラムは、DeepGOZeroとMLPのパフォーマンスを比較するために、アノテーションの数による項目中心のパフォーマンスを可視化します。具体的には、DeepGOZeroとMLPのAUC値をアノテーションの数ごとにプロットし、エラーバーを表示します。

入力データ:
- 'data/go.obo'：GO（Gene Ontology）のデータファイルで、Ontologyクラスのインスタンスを作成するために使用されます。
- 'data/{ont}/deepgozero_auc_annots.pkl'：DeepGOZeroのAUC値とアノテーション数が含まれるPickleファイル。ontはmf、bp、ccのいずれかのオントロジーを指定します。
- 'data/{ont}/mlp_auc_annots.pkl'：MLPのAUC値とアノテーション数が含まれるPickleファイル。ontはmf、bp、ccのいずれかのオントロジーを指定します。

出力ファイル:
- 'data/annot-terms.eps'：可視化されたアノテーションの数による項目中心のパフォーマンスのプロットが保存されるEPSファイル。


### torch_utils.py
このプログラムは、高速なデータローディングを実現するためのFastTensorDataLoaderクラスを定義しています。通常のTensorDataset + DataLoaderよりも高速であり、データセットの個々のインデックスを取得し、catメソッドを呼び出す必要がないためです。
このクラスは、複数のテンソルを受け取り、それらを保持します。各テンソルは、dim 0の長さが同じである必要があります。また、バッチサイズとシャッフルの有無も指定できます。

このクラスの主なメソッドは次のとおりです。
- `__init__(self, *tensors, batch_size=32, shuffle=False)`: FastTensorDataLoaderを初期化します。テンソルを受け取り、バッチサイズとシャッフルの有無を指定します。
- `__iter__(self)`: イテレータを作成します。シャッフルが有効な場合は、データをインプレースでシャッフルします。
- `__next__(self)`: 次のバッチを返します。バッチサイズごとにテンソルをスライスして返します。
- `__len__(self)`: データセットのバッチ数を返します。

このプログラムに入力するデータは、複数のテンソルです。各テンソルは、dim 0の長さが同じである必要があります。これらのテンソルは、FastTensorDataLoaderの初期化時に渡されます。


### transformer.py
このプログラムは、DeepGOGCNと呼ばれる深層学習モデルを使用して、タンパク質の機能アノテーションを予測するためのものです。プログラムは、指定されたデータファイルとオントロジーファイルからデータを読み込み、モデルを訓練し、予測結果を出力します。

入力データ:
- go-file: Human Phenotype Ontologyファイル（OBO形式）
- data-file: タンパク質の配列と完全なアノテーションのセットを含むデータファイル（Pickle形式）
- terms-file: タンパク質の配列と完全なアノテーションのセットを含むデータファイル（Pickle形式）
- model-file: 予測モデルのファイル
- batch-size: トレーニングのバッチサイズ
- epochs: トレーニングのエポック数
- load: モデルをロードするかどうかのフラグ
- out-file: 予測結果を出力するファイル

出力ファイル:
- predictions_deepgogcn.pkl: 予測結果を含むファイル

### uni2pandas.py
このプログラムは、UniProt/SwissProtデータベースから情報を抽出し、データフレームに保存するためのものです。具体的には、UniProt/SwissProtの知識ベースファイルを読み込み、各タンパク質のID、アクセッション番号、配列、アノテーションなどの情報を抽出してデータフレームに保存します。また、実験的なアノテーションを持つタンパク質のみをフィルタリングし、アノテーションを伝播させる処理も行います。最後に、結果をpickle形式のファイルに保存します。

入力データ:
- --swissprot-file（-sf）：UniProt/SwissProtの知識ベースファイル（テキスト形式、圧縮されている場合はgzip形式）を指定します。デフォルトでは"data/uniprot_sprot_2021_04.dat.gz"が使用されます。

出力ファイル:
- --out-file（-o）：結果を保存するファイルのパスを指定します。デフォルトでは"data/swissprot.pkl"が使用されます。結果はpickle形式で保存されます。

### utils.py
このプログラムは、GO (Gene Ontology) のアノテーションデータを処理するためのユーティリティを提供します。

入力データ:
プログラムに入力するデータは、GOのアノテーションデータと、GOの定義データです。アノテーションデータは、各遺伝子またはタンパク質に関連付けられたGO IDのリストです。定義データは、GO IDとその定義のペアのリストです。


### zero_data.py
このプログラムは、与えられたデータフレームに対して、特定の条件を満たすアノテーションを持つタンパク質を抽出し、新しいデータフレームを作成します。

入力データ:
入力データは、`data_file`というオプションで指定されたデータフレームです。データフレームには、タンパク質、配列、およびアノテーションが含まれています。

出力ファイル:
出力ファイルは、`out_file`というオプションで指定されたファイル名です。このファイルには、特定の条件を満たすタンパク質のアノテーションが含まれます。

プログラムの詳細な動作については、以下の手順で説明します。
1. `go.obo`というファイルからオントロジー情報を読み込みます。
2. `definitions_go.txt`というファイルからアノテーションの定義を読み込みます。
3. `go.norm`というファイルから正規形の情報を読み込みます。
4. 入力データフレームの各行に対して、アノテーションのカウントを行います。
5. 特定の条件を満たすアノテーションを持つタンパク質を抽出します。条件は、アノテーションの数が0より大きく10未満であり、かつ特定のクラスに所属していることです。
6. 抽出されたタンパク質のアノテーションを他のタンパク質に伝播させます。
7. 新しいデータフレームを作成し、`out_file`に保存します。


------
### Axioms.groovy
このプログラムは、OWL形式のオントロジーを読み込み、特定の条件に基づいてオントロジーを変換します。具体的には、オントロジーのサブクラス関係の中で、特定のクラス表現タイプ（OBJECT_SOME_VALUES_FROM）を持つクラスを特定の形式に変換します。

入力データ:
プログラムは、"data/go-plus.owl"というファイルからOWL形式のオントロジーを読み込みます。

出力ファイル:
プログラムは、読み込んだオントロジーを変換し、変更を加えた後、同じファイルに上書き保存します。


### Corpus.groovy
このプログラムは、OWL形式のオントロジーを読み込み、クラスの階層構造や定義を取得するためのものです。

入力データ:
プログラムに入力するデータは、"data/go.owl"というファイルです。このファイルはOWL形式のオントロジーであり、プログラムが解析する対象です。

出力ファイル:
プログラムを実行することで生成されるファイルは、"data/definitions_go.txt"というテキストファイルです。このファイルには、"GO_"または"DG_"で始まるクラスの定義が出力されます。

プログラムの実行フローは以下の通りです。
1. OWLOntologyManagerを作成し、OWLファイルを読み込むための準備をします。
2. OWLReasonerを作成し、推論を実行します。
3. クラスの定義を取得し、テキストファイルに出力します。


### Normalizer.groovy
このプログラムは、与えられたOWLファイルの論理的な公理を正規化し、OWL Functional Syntax形式で出力するものです。

入力データ:
プログラムに入力するデータは、OWLファイルです。入力ファイルは、`-i`オプションを使用して指定します。

出力ファイル:
プログラムの実行によって生成または編集されるファイルは、指定された出力ファイルです。このファイルには、正規化された公理がOWL Functional Syntax形式で書き込まれます。

プログラムを実行すると、指定された入力ファイルからOWLオントロジーが読み込まれます。次に、JCELリーズナーを使用してオントロジーを正規化し、整数形式の公理に変換します。その後、正規化された公理をOWL Functional Syntax形式に変換し、指定された出力ファイルに書き込まれます。


### Superclasses.groovy
このプログラムは、OWL形式のオントロジー（知識表現）ファイルから特定の用語とその上位の用語を抽出し、別のファイルに書き出すものです。具体的には、指定されたOWLファイルからクラスの階層構造を取得し、指定された用語とその上位の用語を抽出して、新しいファイルに書き出します。

入力データ:
1. "data/newGO.owl"という名前のOWLファイルがプログラムと同じディレクトリに存在する必要があります。このファイルは、OWL形式で記述されたオントロジー（知識表現）を含んでいます。
2. "data/terms.csv"という名前のCSVファイルがプログラムと同じディレクトリに存在する必要があります。このファイルには、抽出したい用語が1行に1つずつ記述されています。

出力ファイル:
プログラムの実行結果として、"data/newgo.sup"という名前のテキストファイルが生成されます。このファイルには、抽出した用語とその上位の用語がタブ区切りで書き込まれます。



------

### run_diamond.sh
このプログラムは、指定されたディレクトリ内のデータを使用してDiamondと呼ばれるプログラムを実行します。Diamondは、タンパク質の類似性検索やアライメントを行うためのツールです。

入力データ:
- ディレクトリのパス（data_root）: データが格納されているディレクトリのパスを指定します。

出力ファイル:
- train_data.fa: トレーニングデータのFASTA形式のファイルです。Diamondのデータベースの作成に使用されます。
- valid_data.fa: バリデーションデータのFASTA形式のファイルです。トレーニングデータに追加されます。
- test_data.fa: テストデータのFASTA形式のファイルです。Diamondのblastpコマンドに使用されます。
- train_data.dmnd: Diamondのデータベースファイルです。トレーニングデータから作成されます。
- test_diamond.res: Diamondのblastpコマンドの結果が保存されるファイルです。

具体的なプログラムの実行手順は以下の通りです。
1. トレーニングデータ、バリデーションデータ、テストデータのそれぞれに対して、diamond_data.pyというPythonスクリプトを実行します。このスクリプトは、指定された.pklファイルからFASTA形式のファイルを生成します。
2. バリデーションデータをトレーニングデータに追加します。
3. トレーニングデータからDiamondのデータベースを作成します。
4. テストデータを使用してDiamondのblastpコマンドを実行し、結果をtest_diamond.resファイルに保存します。

このプログラムは、mf、bp、ccという3つのオントロジーに対して繰り返し実行されます。各オントロジーに対して、トレーニングデータ、バリデーションデータ、テストデータのファイルパスが異なることが想定されています。