🤖

EGAのDeposit dataをダウンロード

2024/08/07に公開

The European Genome-phenome Archive (EGA)ではRaw FASTQファイルなどがコントロールアクセスでdepositされている。
ユーザーは使いたいDatasetがあると、コメント付きでリクエストを送る。

リクエストページの一例



リクエストしても全然連絡が無いので諦めていたが、1か月以上空いてやっとアクセス可の連絡が来た。depositしたグループの対応が早いか遅いかでかなり変わる。

アクセス許可の通知メール



データのダウンロードには2通りの方法が用意されている。どちらの手法でもPythonを扱える環境が必要になる。

方法2のPyEGA3は復元処理などが必要無いが、巨大ファイルのダウンロードがうまくいかなかったりする。方法1の方がダウンロードはうまくいきやすい印象。


方法1『 SFTP接続で暗号化ファイルをダウンロード 』

暗号化されたファイルをダウンロードして、その後復元する方法。ダウンロードされたファイルは「.c4gh」という拡張子になっている。ファイルのダウンロードはFileZillaソフトやsftpコマンドでEGA serverに接続して行う。



EGAの紹介ページに沿って挑戦する。
https://ega-archive.org/access/download/files/live-outbox/

秘密鍵・公開鍵の作成と登録

EGAアカウントは既に作っているとして、3番目のCrypt4GH-compatible public keyとやらをEGA accountに登録するところから行う。

EGA公式サイト(Live Distribution)より抜粋



EGAサイトにログインして、 My profile ➔ Edit ➔ Public key と進む。同ページに「How do I create a key?」というリンクがある。
ssh-keygenコマンドを使った秘密鍵・公開鍵の作成と、登録方法が書いてある。

https://profile.ega-archive.org/edit/keys/



ssh-keygenコマンドはWindowsではコマンドプロンプト、Powershell、WSLなどで使用できる。本記事ではWindows Powershellを使用した。

ssh-keygen -t ed25519

ファイル名を聞かれるが何も打たずにEnter(C:/Users/admin/.ssh/id_ed25519にファイルが保存)
passphraseを聞かれるので、任意のパスワードを設定する。※ このパスワードは後々良く使う。

出力先のフォルダには2つのファイルが出力されている。.pubファイルの中身をPublic keyとして登録する。.pubと付いていない方は後述のFileZillaで使用する。


公開鍵の内容をPublic keyページに登録していく。中身を表示するためにcatコマンドを使用している。

cat C:\Users\admin\.ssh\id_ed25519.pub

これをアカウントのPublic keyページにコピペしてUpdata。


方法1-1【 FileZilla 】

SFTP接続でファイルをダウンロードするのに、EGAサイトでもFileZillaが紹介されているので、こちらを使用する。

EGA公式サイト(Live Distribution)より抜粋

https://ega-archive.org/access/download/files/live-outbox/


インストール

以下のリンクから無料版のインストーラーをダウンロードし、PCにインストールした。
https://filezilla-project.org/download.php?type=client


FileZillaのメインウィンドウ


EGAサイトとの接続を登録

ファイルサイトマネージャー

新しいサイトをクリック。ウィンドウ右側をEGAの紹介ページ通りに埋めていく。


接続を押してEGA serverとの接続を試みる。
(私の場合はその日は何回やっても接続できなかったが、数日後に接続すると、)接続先を信頼するか聞かれ、その後パスワード(ssh-keygenのpassphrase)を打つと接続される。

パスワード画面

接続に成功すると、FileZillaの右側パネルにEGA側のアクセス可能なdatasetが確認できるようになる。

接続後画面


ファイル転送

FileZilla画面の右側のリモート先のファイルを左側のローカルサイトの好きな場所へドラッグしていく。



方法1-2【 sftpコマンドで接続 】

FileZillaソフトを使わずにsftpコマンドを使った方法もEGAサイトで紹介されている。

EGA公式サイト(Live Distribution)より抜粋

https://ega-archive.org/access/download/files/live-outbox/

Linux/Unixと書いてあるが、WindowsではWSLやPowershellなどで実行可能。ユーザー名に「@outbox.ega-archive.org」を付ける。

sftp ユーザー名@outbox.ega-archive.org

途中yesと打ったりpassphraseを打ったりがあってプロンプトがsftp>に変われば成功。(何度かやり直したりがあるかも。)


接続成功画面

アクセス可能なファイル確認。

ls -la

datasetごとにフォルダがある。

1つのdatasetフォルダに移動してファイル確認
cd <dataset ID>
ls

getコマンドでダウンロードするファイル名を指定する。ダウンロード先を指定する場合は第二引数に出力先ディレクトリパスを指定する。

get <fileID> <出力パス>

dataset内の複数ファイルをダウンロードするには、fileIDを半角スペース区切りで指定することや、ワイルドカードを使うことで実行できる。

get <fileID1 fileID2 fileID3> <出力パス>
get <*.c4gh> <出力パス>

【 Crypt4GHを用いてファイル復元 】

上記まででダウンロードした暗号化ファイルを復元していく。Crypt4GHというツールが必要。


EGA公式サイト(Live Distribution)より抜粋

https://ega-archive.org/access/download/files/live-outbox/


インストール

Pythonツールなので事前にPythonが使える環境が必要となる。私の場合はWindows版Anacondaをインストール済みでコマンドプロンプトからpipコマンドが使用可能であるのでこちらを使用する。

pip install crypt4gh


インストール画面


復元

crypt4gh decryptコマンドを使用する。--skフラグを立てて、秘密鍵のファイルパスを指定する。その次に、暗号化ファイルのパスを< 暗号化ファイルパスという風に入力し、出力をリダイレクト>でファイルに書き込む。出力ファイル名では任意のファイル名を付けてよい。
出力にディレクトリパスを含めるとうまくいかなかったので、ファイル名だけを指定してカレントディレクトリに書き出させている。(cdで事前に出力先フォルダに移動しておけばよい。)

crypt4gh decrypt --sk C:\Users\admin\.ssh\id_ed25519 < 「.c4ghファイルのパス」 > 「出力ファイル名」

この処理は17GBのファイルでも2,3分で終了した。


複数ファイルのdecrypt

参考
https://docs.csc.fi/data/sensitive-data/tutorials/decrypt-directory/

crypt4gh decryptは複数ファイルの入力に対応していない。
datasetのファイルが沢山ある場合、crypt4gh decryptを何回もやるのは面倒である。

EGAサーバーからダウンロードした暗号化ファイルたち

ここでは繰り返し処理による復元処理を紹介する。※ ファイル名のキャプチャーにsedコマンドを使う関係でWSLにcrypt4ghをインストールして、WSL内で処理を行った。


パスワードを環境変数に登録

crypt4gh decryptを実行するとPassphraseの入力が求められるが、複数ファイルに繰り返し処理すると、処理の度にPassphraseが求められるため、自動で進まない。

crypt4ghコマンドのhelpを見ると、環境変数にC4GH_PASSPHRASEがある。

crypt4gh --help
crypt4gh --help
Utility for the cryptographic GA4GH standard, reading from stdin and outputting to stdout.

Usage:
   crypt4gh [-hv] [--log <file>] encrypt [--sk <path>] --recipient_pk <path> [--recipient_pk <path>]... [--range <start-end>] [--header <path>]
   crypt4gh [-hv] [--log <file>] decrypt [--sk <path>] [--sender_pk <path>] [--range <start-end>]
   crypt4gh [-hv] [--log <file>] rearrange [--sk <path>] --range <start-end>
   crypt4gh [-hv] [--log <file>] reencrypt [--sk <path>] --recipient_pk <path> [--recipient_pk <path>]... [--trim] [--header-only]

Options:
   -h, --help             Prints this help and exit
   -v, --version          Prints the version and exits
   --log <file>           Path to the logger file (in YML format)
   --sk <keyfile>         Curve25519-based Private key
                          When encrypting, if neither the private key nor C4GH_SECRET_KEY are specified, we generate a new key
   --recipient_pk <path>  Recipient's Curve25519-based Public key
   --sender_pk <path>     Peer's Curve25519-based Public key to verify provenance (akin to signature)
   --range <start-end>    Byte-range either as  <start-end> or just <start> (Start included, End excluded)
   -t, --trim             Keep only header packets that you can decrypt
   --header <path>        Where to write the header (default: stdout)
   --header-only          Whether the input data consists only of a header (default: false)

Environment variables:
   C4GH_LOG         If defined, it will be used as the default logger
   C4GH_SECRET_KEY  If defined, it will be used as the default secret key (ie --sk ${C4GH_SECRET_KEY})
   C4GH_PASSPHRASE  If defined, it will be used as the passphrase
                    for decoding the secret key, replacing the callback.
                    Note: this is insecure. Only used for testing
   C4GH_DEBUG       If True, it will print (a lot of) debug information.
                    (Watch out: the output contains secrets)

つまり環境変数にC4GH_PASSPHRASEという名前でパスワードを登録しておけば、これを参照しにいく。

# 環境変数を確認 ➔ C4GHで始まるものはない
env | grep C4GH

# 環境変数を登録
export C4GH_PASSPHRASE=〇〇

# 環境変数を確認 ➔ C4GH_PASSPHRASEの内容が表示される
env | grep C4GH


出力ファイル名

crypt4gh decryptは明示的にリダイレクト先のファイル名を指定しなければならないので、繰り返し処理の中で出力ファイル名も自動で設定させなければならない。

本記事の暗号化ファイルは、元のファイル名の前後にIDやらが追記されており、「prod_ega-box-429_encrypted_元ファイル名.1620591546353.c4gh」という風なファイル名になっている。
sedコマンドで元ファイル名の部分だけを抜き出す。

雑な一例だが、こんな風に元ファイル名の箇所をキャプチャーして返すことができる。

FILENAME=prod_ega-box-429_encrypted_元ファイル名.1620591546353.c4gh
echo $FILENAME | sed "s/.*encrypted_\(.*\)\..*.c4gh/\1/"

※ ここではsedコマンドの解説はしない。またキャプチャーは何通りもやり方があるのでここで紹介する以外でももちろん構わない。

for分の中で入力ファイル名を受け取り、元ファイル名を取り出す処理を加えて書き出しファイル名に使用することとする。


繰り返し処理の実行

以下に必要なコマンドを記載したスクリプトを用意した。変数やsedのキャプチャーは自身の環境に合わせて使用してほしい。
(本記事の例では元ファイル名に「scRNA...fastq.gz」というパターンがあったので、これをsedでキャプチャーしている。)

# 変数設定
FILE_DIR=<encrypt fileがあるディレクトリパス>
OUT_DIR=<出力先ディレクトリパス>
KEY_FILE=<秘密鍵ファイルのパス Ex) /mnt/c/Users/admin/.ssh/id_ed25519>

# 環境変数にPasswordを登録
export C4GH_PASSPHRASE=〇〇

# ファイル一覧を取得
FILEPATHS=$(ls ${FILE_DIR}*.c4gh)

# 出力先フォルダへ移動
cd $OUT_DIR

# 繰り返し処理
for FILEPATH in $FILEPATHS
do
echo $FILEPATH ;\
OUTFILE_NAME=$(echo $FILEPATH | sed "s/.*\(scRNA.*fastq.gz\).*/\1/") ;\
echo $OUTFILE_NAME ;\
crypt4gh decrypt --sk $KEY_FILE < "$FILEPATH" > $OUTFILE_NAME
done


crypt4gh decryptの繰り返し処理画面

「Warning: Using a passphrase in an environment variable is insecure」という警告が出るが、処理自体は進んでいく。


方法2『 PyEGA3 』

EGAのビデオチュートリアルでPyEGA3を用いた方法が紹介されている。
https://embl-ebi.cloud.panopto.eu/Panopto/Pages/Viewer.aspx?id=be79bb93-1737-4f95-b80f-ab4300aa6f5a


インストール

こちらのGitHubからツールのインストールが可能。

https://github.com/EGA-archive/ega-download-client#ega-download-client-pyega3

pip3 install pyega3

エラーメッセージは出たが、pyega3-5.2.0はインストールできている。

pip3 install pyega3 --upgrade


Credential fileの用意

EGAのユーザー名とログインパスワードを記載したjsonファイルが必要。

GitHubにひな形があるので、ダウンロードして自分用に書き換えると良い。

{
    "username": "ega-test-data@ebi.ac.uk",
    "password": "egarocks"
}

https://github.com/EGA-archive/ega-download-client/blob/master/pyega3/config/default_credential_file.json


ダウンロード可能なdatasetを確認

-cfフラグをたてcredential fileのファイルパスを指定するとEGAのserverに接続される。その上でdatasetsフラグを立てるとダウンロード可能なアクセッション番号の一覧が確認できる。

pyega3 -cf <credential_file.json> datasets


ダウンロード可能なdataset一覧

ダウンロード可能なFile IDを確認

fileフラグとdataset IDを指定すると、dataset内のFile IDが確認できる。

pyega3 -cf <credential_file.json> files <EGAD0000....>


ダウンロード可能なFile ID一覧(1つのdataset内)

ダウンロード

fetchフラグをたててアクセッション番号を指定することでダウンロードされる。dataset IDの場合は、dataset内の全てのファイル、File IDの場合はそのファイルがダウンロードされる。

保存先フォルダは事前に作っておく。

pyega3 -cf <credential_file.json> fetch <EGAD0000....> --output-dir <保存先ディレクトリパス>

dataset IDを指定した場合も、dataset内のファイルを1つずつダウンロードしていく。

私のネット環境だと一晩かかって30GB弱。datasetが巨大だと何日もかかる勢い。


Discussion