dratools 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +120 -0
- data/bin/dratools +8 -0
- data/docs/design.md +80 -0
- data/docs/development.md +39 -0
- data/docs/environment.md +71 -0
- data/docs/usage.md +289 -0
- data/lib/dratools/accession_input_collector.rb +53 -0
- data/lib/dratools/accession_resolver.rb +104 -0
- data/lib/dratools/accession_resource_type_classifier.rb +34 -0
- data/lib/dratools/byte_formatter.rb +25 -0
- data/lib/dratools/checksum_verifier.rb +34 -0
- data/lib/dratools/command_line_interface.rb +138 -0
- data/lib/dratools/commands/base_command.rb +189 -0
- data/lib/dratools/commands/get_command.rb +87 -0
- data/lib/dratools/commands/meta_command.rb +123 -0
- data/lib/dratools/commands/probe_command.rb +55 -0
- data/lib/dratools/commands/runs_command.rb +70 -0
- data/lib/dratools/commands/size_command.rb +163 -0
- data/lib/dratools/commands/tree_command.rb +45 -0
- data/lib/dratools/commands/url_command.rb +118 -0
- data/lib/dratools/config.rb +114 -0
- data/lib/dratools/ddbj_record_fields.rb +56 -0
- data/lib/dratools/ddbj_resource_client.rb +78 -0
- data/lib/dratools/download_candidate.rb +45 -0
- data/lib/dratools/download_candidate_builder.rb +90 -0
- data/lib/dratools/download_service.rb +221 -0
- data/lib/dratools/errors.rb +39 -0
- data/lib/dratools/external_command_runner.rb +115 -0
- data/lib/dratools/run_record_collector.rb +198 -0
- data/lib/dratools/traversal_node.rb +68 -0
- data/lib/dratools/tree_renderer.rb +83 -0
- data/lib/dratools/version.rb +6 -0
- data/lib/dratools.rb +19 -0
- metadata +76 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 48f8f5324602da01372e8590c74a22ae9a3474b125c96c3d2bf8de501e80160a
|
|
4
|
+
data.tar.gz: 9980db4882cefe19b2143496262ec785a6994e04d3c75ac6edc23deb0607f226
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 687ca0459f6bead0d1ca7d4349fcb023b1c142b05e4b2e4e1eda461b54a42209a3ac7cec08d8552522921c691da38ffe89d367270859dd15cefc17af9bf99210
|
|
7
|
+
data.tar.gz: e2ea8839bcb20737af0880e20694d266c0fc1ee9ab0a2f77e6b027fbe4750b09bba2e9f42ae839a4492d94dbb6f22ed4118ff3ffb72ebe206bd2689ce9e6d795
|
data/LICENSE.txt
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 kojix2
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# dratools
|
|
2
|
+
|
|
3
|
+
[](https://github.com/kojix2/dratools/actions/workflows/ci.yml)
|
|
4
|
+
[](https://tokei.kojix2.net/github/kojix2/dratools)
|
|
5
|
+
|
|
6
|
+
[dratools](https://github.com/kojix2/dratools) は、日本国内の [DDBJ](https://www.ddbj.nig.ac.jp) からゲノムデータをダウンロードするためのツールです。
|
|
7
|
+
|
|
8
|
+
[DDBJ Search](https://ddbj.nig.ac.jp/search/) を使って [DRA/SRA](https://en.wikipedia.org/wiki/Sequence_Read_Archive) のダウンロード URL を解決します。日本国内のサーバーから `.sra` を取得します。
|
|
9
|
+
|
|
10
|
+
dratools は非公式のツールです。DDBJ や国立遺伝学研究所が提供する公式のツールではありません。
|
|
11
|
+
|
|
12
|
+
## インストール
|
|
13
|
+
|
|
14
|
+
必要なものは次のとおりです。
|
|
15
|
+
|
|
16
|
+
- [ruby](https://www.ruby-lang.org/)
|
|
17
|
+
- [curl](https://curl.se/) または [wget](https://www.gnu.org/software/wget/)
|
|
18
|
+
|
|
19
|
+
Rubyのgemとしてインストールできます。
|
|
20
|
+
|
|
21
|
+
```sh
|
|
22
|
+
gem install dratools
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 使い方
|
|
26
|
+
|
|
27
|
+
`dratools` はサブコマンド方式です。`dratools <command> --help` で各コマンドのオプションを確認できます。
|
|
28
|
+
|
|
29
|
+
| コマンド | 役割 |
|
|
30
|
+
| --- | --- |
|
|
31
|
+
| `url` | ダウンロード URL を表示する(`--tsv` で TAB 区切り列、`--json` で JSON 出力) |
|
|
32
|
+
| `get` | ファイルをダウンロードする |
|
|
33
|
+
| `probe` | 短時間の接続確認だけを行う |
|
|
34
|
+
| `tree` | accession から run へ辿る探索ツリーを表示する |
|
|
35
|
+
| `meta` | レコードのメタ情報を表示する(`--json` で生 JSON) |
|
|
36
|
+
| `runs` | run accession の一覧を出力する |
|
|
37
|
+
| `size` | ダウンロード合計サイズを集計する(`--per-run` で run ごとに分割) |
|
|
38
|
+
|
|
39
|
+
コマンド名は基本的に単数形ですが、一覧を返す `runs` だけ複数形です。打ち間違い対策として `run`/`urls`/`sizes`/`trees` の別名も受け付けます。
|
|
40
|
+
|
|
41
|
+
```sh
|
|
42
|
+
# まずダウンロード URL を確認する
|
|
43
|
+
dratools url DRR000001
|
|
44
|
+
|
|
45
|
+
# BioProject などから run へ辿る経路を確認する
|
|
46
|
+
dratools tree PRJNA341783
|
|
47
|
+
|
|
48
|
+
# レコードの概要を確認する
|
|
49
|
+
dratools meta DRR000001
|
|
50
|
+
|
|
51
|
+
# BioProject を run accession 一覧に展開する
|
|
52
|
+
dratools runs PRJNA341783
|
|
53
|
+
|
|
54
|
+
# ダウンロード前に合計サイズを見積もる
|
|
55
|
+
dratools size PRJNA341783
|
|
56
|
+
|
|
57
|
+
# カレントディレクトリにダウンロードする
|
|
58
|
+
dratools get DRR000001
|
|
59
|
+
|
|
60
|
+
# 保存先ディレクトリを指定してダウンロードする
|
|
61
|
+
dratools get -O ~/Downloads DRR000001
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
複数の accession もまとめて渡せます。
|
|
65
|
+
|
|
66
|
+
```sh
|
|
67
|
+
# 引数で複数指定
|
|
68
|
+
dratools get -O ~/Downloads DRR000001 DRR000002
|
|
69
|
+
|
|
70
|
+
# ファイルから渡す
|
|
71
|
+
dratools get --input list.txt -O ~/Downloads
|
|
72
|
+
|
|
73
|
+
# 標準入力から渡す
|
|
74
|
+
printf 'DRR000001\nDRR000002\n' | dratools get -O ~/Downloads
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## そのほかのコマンド例
|
|
78
|
+
|
|
79
|
+
```sh
|
|
80
|
+
dratools probe DRR000001 # URL の到達性だけ確認する
|
|
81
|
+
dratools url --json DRR000001 # URL 情報を JSON で表示する
|
|
82
|
+
dratools url --tsv DRR000001 # run/type/url/size/md5 を TAB 区切りで
|
|
83
|
+
dratools meta --json DRR000001 # resource JSON を表示する
|
|
84
|
+
dratools runs PRJNA341783 | dratools get -O ~/Downloads # run 一覧をダウンロードへ渡す
|
|
85
|
+
dratools size --bytes PRJNA341783 # 合計サイズをバイト数で表示する
|
|
86
|
+
dratools size --per-run DRX000001 # 親 accession を run ごとに集計する
|
|
87
|
+
dratools get --skip-existing -O ~/Downloads DRR000001 # 既存ファイルは触らない
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
詳しくは [使い方](docs/usage.md) をご覧ください。親 accession を扱うときの設定は [環境変数](docs/environment.md) にまとめています。
|
|
91
|
+
|
|
92
|
+
実際のファイル転送には `curl` または `wget` を使います。ダウンロード中は進捗表示を端末にそのまま流します。md5 が得られる場合だけ、ダウンロード後に照合します。
|
|
93
|
+
|
|
94
|
+
ツールは全てコーディングエージェントによって実装されました。
|
|
95
|
+
|
|
96
|
+
## ドキュメント
|
|
97
|
+
|
|
98
|
+
- [使い方](docs/usage.md)
|
|
99
|
+
- [環境変数](docs/environment.md)
|
|
100
|
+
- [設計メモ](docs/design.md)
|
|
101
|
+
- [開発](docs/development.md)
|
|
102
|
+
|
|
103
|
+
## お役立ちノート
|
|
104
|
+
|
|
105
|
+
海外からゲノムデータをダウンロードするのは大変な作業です。
|
|
106
|
+
日本国内のサーバーからゲノムデータをダウンロードすると作業が楽になります。
|
|
107
|
+
|
|
108
|
+
なるべく手間をかけずに、寝ている間にデータをダウンロードしたい方は「NASに課金する」という手段もあります。
|
|
109
|
+
NASの付属ソフトにURLを入力すると、何もしなくても自動でダウンロードが進むのでストレスが少ないです。
|
|
110
|
+
|
|
111
|
+
## 開発
|
|
112
|
+
|
|
113
|
+
本ツールの開発は日本語で行います。
|
|
114
|
+
バグ報告を issue にお寄せください。
|
|
115
|
+
プルリクエストは高い確率でマージされます。
|
|
116
|
+
バグレポートやプルリクエストは、日本語でなくても構いません。
|
|
117
|
+
|
|
118
|
+
## ライセンス
|
|
119
|
+
|
|
120
|
+
MIT
|
data/bin/dratools
ADDED
data/docs/design.md
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# 設計メモ
|
|
2
|
+
|
|
3
|
+
## 目的
|
|
4
|
+
|
|
5
|
+
SRA 系のツールには、DDBJ の accession を受け付けるものがあります。しかし内部では ENA API や NCBI SRA Toolkit を使うことが多いです。
|
|
6
|
+
|
|
7
|
+
`dratools` は DDBJ Search の情報だけを使います。DDBJ が公開する DRA ファイルの URL を取得します。用途はこれに絞ります。
|
|
8
|
+
|
|
9
|
+
## データ取得の流れ
|
|
10
|
+
|
|
11
|
+
accession から URL までの流れは次のとおりです。
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
accession
|
|
15
|
+
-> DDBJ Search resource JSON
|
|
16
|
+
-> sra-run record
|
|
17
|
+
-> downloadUrl
|
|
18
|
+
-> https / ftp URL
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## ダウンロード確認
|
|
22
|
+
|
|
23
|
+
ゲノムデータはサイズが大きいです。`probe` は完全なダウンロードを行いません。
|
|
24
|
+
|
|
25
|
+
- `curl` がある場合: `--range 0-0` と `--max-time` を使う
|
|
26
|
+
- `wget` がある場合: `--spider` と `--timeout` を使う
|
|
27
|
+
|
|
28
|
+
これは URL が使えるかどうかを短時間で確認するためです。完全な整合性の確認ではありません。
|
|
29
|
+
|
|
30
|
+
## サイズ確認
|
|
31
|
+
|
|
32
|
+
`size` は resource JSON のサイズ情報を使いません。実レコードにはサイズや md5 が含まれないことが多いためです。代わりに、解決した URL に HTTP `HEAD` を送ります。`Content-Length` を合計します。
|
|
33
|
+
|
|
34
|
+
FASTQ はディレクトリ URL で返ることがあります。その場合はディレクトリ一覧を取得します。`*.fastq*` のリンクを取り出します。各ファイルに `HEAD` を送ります。取得できないものは失敗にしません。`unresolved` として数えます。
|
|
35
|
+
|
|
36
|
+
`--protocol ftp` を指定しても、候補に `ftpUrl` が無いことがあります。その場合は URL 選択ルールに従って HTTPS URL を使います。この場合も `size` は HTTP `HEAD` で容量を取得します。
|
|
37
|
+
|
|
38
|
+
## 実ダウンロード
|
|
39
|
+
|
|
40
|
+
実ダウンロードでは総時間の上限を設けません。数十 GB のファイルでは長時間かかるためです。代わりに、接続のタイムアウトと失速検知を `curl` / `wget` に渡します。
|
|
41
|
+
|
|
42
|
+
- `curl`: `--connect-timeout`, `--speed-limit`, `--speed-time`, `--retry`
|
|
43
|
+
- `wget`: `--connect-timeout`, `--read-timeout`, `--tries`, `--waitretry`
|
|
44
|
+
|
|
45
|
+
ダウンロードは `system(*command)` で実行します。`Open3.capture3` は使いません。`curl` / `wget` の進捗を端末にそのまま表示するためです。失敗した場合は、コマンド行と終了ステータスを `CommandError` にします。
|
|
46
|
+
|
|
47
|
+
## チェックサムと既存ファイル
|
|
48
|
+
|
|
49
|
+
md5 が得られる候補では、ダウンロード後に `Digest::MD5.file` で照合します。これはストリーム処理です。
|
|
50
|
+
|
|
51
|
+
既存ファイルがある場合は、次の順で扱います。
|
|
52
|
+
|
|
53
|
+
1. `--force` があれば既存ファイルを使わず再取得する
|
|
54
|
+
2. `--skip-existing` があれば md5 を見ずに既存ファイルを使う
|
|
55
|
+
3. md5 があり、既存ファイルの md5 が一致すれば再取得せず `Skipped` にする
|
|
56
|
+
4. それ以外は `curl --continue-at -` または `wget --continue` でレジュームを試みる
|
|
57
|
+
|
|
58
|
+
md5 が無い候補では、既定では既存ファイルをスキップしません。SRA ファイルとしての検証は dratools の既定動作には含めません。
|
|
59
|
+
|
|
60
|
+
## 標準ライブラリ中心
|
|
61
|
+
|
|
62
|
+
Ruby 側の依存は増やしません。次の標準ライブラリを使います。
|
|
63
|
+
|
|
64
|
+
- `net/http`
|
|
65
|
+
- `json`
|
|
66
|
+
- `optparse`
|
|
67
|
+
- `open3`
|
|
68
|
+
- `fileutils`
|
|
69
|
+
- `digest/md5`
|
|
70
|
+
- `minitest`
|
|
71
|
+
|
|
72
|
+
実ファイルの転送だけは外部コマンドに任せます。環境にある `curl` または `wget` を使います。
|
|
73
|
+
|
|
74
|
+
## 今後の候補
|
|
75
|
+
|
|
76
|
+
- DDBJ Search API の追加形式に対応
|
|
77
|
+
- `ascp` 対応
|
|
78
|
+
- `vdb-validate` 呼び出し
|
|
79
|
+
- DRA 以外の DDBJ Search レコードを扱う `search` サブコマンド
|
|
80
|
+
- `getentry` を扱うサブコマンド
|
data/docs/development.md
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# 開発
|
|
2
|
+
|
|
3
|
+
## テスト
|
|
4
|
+
|
|
5
|
+
単体テストは次のコマンドで実行します。
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
bundle exec rake test
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
DDBJ へアクセスする統合テストは次のコマンドで実行します。
|
|
12
|
+
|
|
13
|
+
```sh
|
|
14
|
+
DRATOOLS_INTEGRATION=1 bundle exec rake test
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
静的解析は次のコマンドで実行します。
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
bundle exec rake rubocop
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
統合テストは `DRR000001` を使います。URL 解決と短時間の接続確認を行います。ファイルを最後までダウンロードしません。
|
|
24
|
+
|
|
25
|
+
## gem の確認
|
|
26
|
+
|
|
27
|
+
```sh
|
|
28
|
+
gem build dratools.gemspec
|
|
29
|
+
gem install ./dratools-*.gem
|
|
30
|
+
dratools --help
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 方針
|
|
34
|
+
|
|
35
|
+
- なるべく Ruby の標準ライブラリで実装する
|
|
36
|
+
- CLI は薄く保ち、主要な処理はライブラリ側に置く
|
|
37
|
+
- ネットワークを使うテストは opt-in にする
|
|
38
|
+
- ファイルを最後まで誤って落とすテストは書かない
|
|
39
|
+
- CI では RuboCop とテストの両方を実行する
|
data/docs/environment.md
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# 環境変数
|
|
2
|
+
|
|
3
|
+
`dratools` は通常、コマンドラインオプションだけで使えます。BioProject や Study が大きい場合は、環境変数で上限を調整できます。
|
|
4
|
+
|
|
5
|
+
値には正の整数を指定します。`unlimited` を指定すると、その上限を無効にします。誤った値を指定すると、エラーで終了します。
|
|
6
|
+
|
|
7
|
+
| 環境変数 | 既定値 | 役割 |
|
|
8
|
+
| --- | ---: | --- |
|
|
9
|
+
| `DRATOOLS_MAX_RECURSIVE_NON_RUN_XREFS` | `100` | `runs` などが direct run を持たない親レコードから experiment/sample/study などの非 run レコードを再帰的に辿る最大件数 |
|
|
10
|
+
| `DRATOOLS_TREE_MAX_DIRECT_RUNS` | `50` | `tree` が direct run レコードを個別取得して URL まで展開する最大 run 件数。超えた場合は件数だけを要約表示 |
|
|
11
|
+
| `DRATOOLS_URL_MAX_DIRECT_RUNS` | `50` | `url` が 1 つの親 accession から direct run を暗黙展開して URL を解決する最大 run 件数 |
|
|
12
|
+
| `DRATOOLS_SIZE_MAX_DIRECT_RUNS` | `50` | `size` が 1 つの親 accession から direct run を暗黙展開して HEAD する最大 run 件数 |
|
|
13
|
+
|
|
14
|
+
`unlimited` が使えるのは、上の 4 つの上限設定だけです。
|
|
15
|
+
|
|
16
|
+
## ダウンロード開始と失速検知
|
|
17
|
+
|
|
18
|
+
`get` は大きいファイルを扱います。このため、総ダウンロード時間の上限を設けません。代わりに、接続タイムアウト、失速検知、リトライの設定を `curl` / `wget` に渡します。
|
|
19
|
+
|
|
20
|
+
| 環境変数 | 既定値 | 役割 |
|
|
21
|
+
| --- | ---: | --- |
|
|
22
|
+
| `DRATOOLS_DOWNLOAD_CONNECT_TIMEOUT` | `30` | 接続確立のタイムアウト秒数 |
|
|
23
|
+
| `DRATOOLS_DOWNLOAD_STALL_TIMEOUT` | `60` | この秒数のあいだ転送速度が閾値を下回ると失速扱いにする |
|
|
24
|
+
| `DRATOOLS_DOWNLOAD_STALL_SPEED` | `1024` | 失速判定に使う最低転送速度。単位は bytes/sec |
|
|
25
|
+
| `DRATOOLS_DOWNLOAD_RETRY_COUNT` | `3` | ダウンロード失敗時のリトライ回数。`0` も指定可能 |
|
|
26
|
+
| `DRATOOLS_DOWNLOAD_RETRY_WAIT` | `5` | `wget` のリトライ待ち秒数 |
|
|
27
|
+
|
|
28
|
+
## 例
|
|
29
|
+
|
|
30
|
+
`tree` で 200 件まで URL を展開する:
|
|
31
|
+
|
|
32
|
+
```sh
|
|
33
|
+
DRATOOLS_TREE_MAX_DIRECT_RUNS=200 dratools tree PRJDB12740
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
この値を小さくすると、展開しない direct run は要約だけを表示します。
|
|
37
|
+
|
|
38
|
+
`size` で 100 件まで direct run を暗黙展開する:
|
|
39
|
+
|
|
40
|
+
```sh
|
|
41
|
+
DRATOOLS_SIZE_MAX_DIRECT_RUNS=100 dratools size PRJDB12740
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
`url` で 100 件まで direct run を暗黙展開する:
|
|
45
|
+
|
|
46
|
+
```sh
|
|
47
|
+
DRATOOLS_URL_MAX_DIRECT_RUNS=100 dratools url --tsv PRJDB12740
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
再帰的な非 run 展開の上限を外す:
|
|
51
|
+
|
|
52
|
+
```sh
|
|
53
|
+
DRATOOLS_MAX_RECURSIVE_NON_RUN_XREFS=unlimited dratools runs ERP005466
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
ダウンロードの開始を検証するため、接続と失速の設定を小さくする:
|
|
57
|
+
|
|
58
|
+
```sh
|
|
59
|
+
DRATOOLS_DOWNLOAD_CONNECT_TIMEOUT=2 \
|
|
60
|
+
DRATOOLS_DOWNLOAD_STALL_TIMEOUT=2 \
|
|
61
|
+
DRATOOLS_DOWNLOAD_RETRY_COUNT=0 \
|
|
62
|
+
dratools get --no-verify -O ~/Downloads DRR000001
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 注意
|
|
66
|
+
|
|
67
|
+
これらは上級の設定です。上限を大きくすると、DDBJ Search API へのリクエスト数が増えます。`size` の HTTP `HEAD` の回数も増えます。
|
|
68
|
+
|
|
69
|
+
`DRATOOLS_URL_MAX_DIRECT_RUNS` と `DRATOOLS_SIZE_MAX_DIRECT_RUNS` は direct run 数の上限です。experiment や sample や study を経由して見つかる run の総数は制限しません。まず `meta` や `tree` で構造を確認してください。必要なら `runs` で accession を絞ってください。その後で重い操作を実行してください。
|
|
70
|
+
|
|
71
|
+
ダウンロード用の設定を小さくしすぎる場合を考えます。正常なサーバーでも、開始前や転送中に失敗します。短い値は動作検証やネットワーク問題の切り分けに使ってください。通常のダウンロードでは既定値を使ってください。
|
data/docs/usage.md
ADDED
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
# 使い方
|
|
2
|
+
|
|
3
|
+
`dratools` はサブコマンド方式です。コマンド一覧は `dratools --help` で確認できます。各コマンドのオプションは `dratools <command> --help` で確認できます。
|
|
4
|
+
|
|
5
|
+
親 accession を扱うときの設定は [環境変数](environment.md) にまとめています。
|
|
6
|
+
|
|
7
|
+
## インストール
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
gem install dratools
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
開発中のリポジトリからインストールする場合は、次の手順を実行します。
|
|
14
|
+
|
|
15
|
+
```sh
|
|
16
|
+
git clone https://github.com/kojix2/dratools
|
|
17
|
+
cd dratools
|
|
18
|
+
bundle install
|
|
19
|
+
bundle exec rake install
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## コマンド一覧
|
|
23
|
+
|
|
24
|
+
| コマンド | 役割 |
|
|
25
|
+
| --- | --- |
|
|
26
|
+
| `url` | ダウンロード URL を表示する(`--tsv` で TAB 区切り列、`--json` で JSON 出力) |
|
|
27
|
+
| `get` | ファイルをダウンロードする |
|
|
28
|
+
| `probe` | 短時間の接続確認だけを行う |
|
|
29
|
+
| `tree` | accession から run へ辿る探索ツリーを表示する |
|
|
30
|
+
| `meta` | レコードのメタ情報を表示する(`--json` で生 JSON) |
|
|
31
|
+
| `runs` | run accession の一覧を出力する |
|
|
32
|
+
| `size` | ダウンロード合計サイズを集計する |
|
|
33
|
+
|
|
34
|
+
コマンド名は基本的に単数形です。一覧を返す `runs` だけが複数形です。`run` は「実行する」と読み間違えやすいためです。打ち間違いに備えて別名も使えます。`run` は `runs`、`urls` は `url`、`sizes` は `size`、`trees` は `tree` として扱います。ヘルプとエラーとバナーには、表の正規名だけを表示します。
|
|
35
|
+
|
|
36
|
+
## メタ情報を表示する (`meta`)
|
|
37
|
+
|
|
38
|
+
`meta` は DDBJ Search の resource JSON を要約して表示します。
|
|
39
|
+
|
|
40
|
+
```sh
|
|
41
|
+
dratools meta DRR300000
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
生の JSON を見る場合は `--json` を付けます。
|
|
45
|
+
|
|
46
|
+
```sh
|
|
47
|
+
dratools meta --json DRR300000
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
サイズは DDBJ Search API だけでは分かりません。`meta` はサイズを表示しません。容量は `size` で確認します。
|
|
51
|
+
|
|
52
|
+
run accession のレコードには platform や libraryStrategy が含まれないことがあります。実験条件を見たい場合は experiment accession も確認してください。
|
|
53
|
+
|
|
54
|
+
`runs:` は run 数を表示する行です。run と experiment の関係から分かるときだけ表示します。BioProject や BioSample では run 数を表示しません。これらのレコードで多数の探索を始めないためです。run の一覧が必要な場合は `runs` を使ってください。
|
|
55
|
+
|
|
56
|
+
## run 一覧を表示する (`runs`)
|
|
57
|
+
|
|
58
|
+
`runs` は accession を run accession の一覧に展開します。
|
|
59
|
+
|
|
60
|
+
```sh
|
|
61
|
+
dratools runs PRJNA341783
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
出力は1行1件です。`get` にそのまま渡せます。
|
|
65
|
+
|
|
66
|
+
```sh
|
|
67
|
+
dratools runs PRJNA341783 | dratools get -O ~/Downloads
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Study や BioProject には多数の experiment や sample が含まれることがあります。`runs` はこれらを無制限には辿りません。上限を超えるとエラーで止まります。run へ直接リンクがある場合は、100 件を超えても制限の対象外です。レコードが大きい場合は、先に `tree` や `meta` で構造を確認してください。experiment や sample に絞ってから `runs` を使ってください。
|
|
71
|
+
|
|
72
|
+
## 合計サイズを確認する (`size`)
|
|
73
|
+
|
|
74
|
+
`size` は実ファイルの URL に HTTP `HEAD` を送ります。`Content-Length` を合計します。FASTQ はディレクトリ URL で返ることがあります。その場合はディレクトリ一覧から `*.fastq*` を取り出します。取り出した各ファイルに `HEAD` を送ります。
|
|
75
|
+
|
|
76
|
+
```sh
|
|
77
|
+
dratools size PRJNA341783
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
出力は1行1件です。各行は accession、ファイル数、合計サイズ、`unresolved` 数を並べます。区切りは TAB です。先頭に `#` で始まるヘッダ行が付きます。合計サイズだけを取り出すには `cut -f3` を使います。ヘッダを除くには `grep -v '^#'` を使います。サイズを1つも取得できなかった行は、size 列を `NA` にします。accession を複数渡すと、最後に `total` 行が付きます。
|
|
81
|
+
|
|
82
|
+
```text
|
|
83
|
+
#accession files size unresolved
|
|
84
|
+
DRR000001 1 1.0 KiB 0
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
既定では accession 1 件につき1行です。親 accession の場合は配下をすべて合算します。`--per-run`(`-r`)を付けると、run accession ごとに分けて集計します。これは `dratools runs XXX | xargs dratools size` と同じ結果です。1 コマンドで実行できます。
|
|
88
|
+
|
|
89
|
+
```sh
|
|
90
|
+
dratools size --per-run DRX000001
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
`--per-run` のとき、`total` 行は標準エラーに出します。標準出力には集計行だけが残ります。`awk` で合計するときに `total` 行を二重に数えないためです。
|
|
94
|
+
|
|
95
|
+
```text
|
|
96
|
+
#accession files size unresolved
|
|
97
|
+
DRR000001 2 1.2 GiB 0
|
|
98
|
+
DRR000002 1 0.8 GiB 0
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
バイト数で表示する場合は `--bytes` を付けます。
|
|
102
|
+
|
|
103
|
+
```sh
|
|
104
|
+
dratools size --bytes PRJNA341783
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
JSON で表示する場合は `--json` を付けます。
|
|
108
|
+
|
|
109
|
+
```sh
|
|
110
|
+
dratools size --json PRJNA341783
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
`size` はネットワークにアクセスします。サイズを取得できないファイルは `unresolved` に数えます。direct run を多数持つ親 accession は、暗黙には展開しません。上限を超えるとエラーで止まります。先に `runs` で一覧を確認してください。範囲を絞ってから `size` を実行してください。
|
|
114
|
+
|
|
115
|
+
## URL を表示する (`url`)
|
|
116
|
+
|
|
117
|
+
`url` は `.sra` の URL を表示します。
|
|
118
|
+
|
|
119
|
+
```sh
|
|
120
|
+
dratools url DRR000001
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
FTP URL を優先する場合は `--protocol ftp` を付けます。
|
|
124
|
+
ftp URL が無いレコードでは https URL を表示します。
|
|
125
|
+
|
|
126
|
+
```sh
|
|
127
|
+
dratools url --protocol ftp DRR000001
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
FASTQ を探す場合は `--type fastq` を付けます。
|
|
131
|
+
|
|
132
|
+
```sh
|
|
133
|
+
dratools url --type fastq DRR000001
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
FASTQ はディレクトリ URL で返ることがあります。その URL は `url` と `tree` で確認できます。`get` は単一ファイルとして保存できません。この場合 `get` はエラーにします。
|
|
137
|
+
|
|
138
|
+
direct run を多数持つ親 accession は、暗黙には展開しません。上限を超えるとエラーで止まります。先に `runs` で一覧を確認してください。範囲を絞ってから `url` を実行してください。
|
|
139
|
+
|
|
140
|
+
`--tsv` を付けると、列を TAB 区切りで表示します。列は `run_accession`、`type`、URL、`size`、`md5` です。先頭に `#` で始まるヘッダ行が付きます。`size` と `md5` が無い場合は `NA` にします。
|
|
141
|
+
|
|
142
|
+
```text
|
|
143
|
+
#run_accession type url size md5
|
|
144
|
+
DRR000001 sra https://...DRR000001.sra 1024 abc123
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
特定の列を取り出すには `grep -v '^#'` と `cut` を組み合わせます。
|
|
148
|
+
|
|
149
|
+
```sh
|
|
150
|
+
dratools url --tsv DRR000001 | grep -v '^#' | cut -f3
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
JSON で表示する場合は `--json` を付けます。
|
|
154
|
+
|
|
155
|
+
```sh
|
|
156
|
+
dratools url --json DRR000001
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## 接続確認 (`probe`)
|
|
160
|
+
|
|
161
|
+
`probe` は接続確認だけを行います。ファイルを最後までダウンロードしません。
|
|
162
|
+
|
|
163
|
+
```sh
|
|
164
|
+
dratools probe --timeout 5 DRR000001
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
接続できた URL は標準出力に表示します。形式は `OK<TAB>URL` です。`probe ... | grep OK` のように使えます。接続に失敗した accession は、エラーを標準エラーに出します。
|
|
168
|
+
|
|
169
|
+
## 探索ツリー (`tree`)
|
|
170
|
+
|
|
171
|
+
`tree` は accession から run までの経路を表示します。
|
|
172
|
+
|
|
173
|
+
```sh
|
|
174
|
+
dratools tree PRJNA341783
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
対象のファイル種別が見つからない理由を調べるときにも使えます。
|
|
178
|
+
|
|
179
|
+
```sh
|
|
180
|
+
dratools tree --type fastq PRJNA341783
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
direct run を多数持つ親 accession では、`tree` は各 run を個別取得しません。run の件数だけを表示します。run accession の全リストが必要な場合は `runs` を使ってください。
|
|
184
|
+
|
|
185
|
+
## ダウンロード (`get`)
|
|
186
|
+
|
|
187
|
+
`get` はファイルをダウンロードします。
|
|
188
|
+
|
|
189
|
+
```sh
|
|
190
|
+
dratools get -O ~/Downloads DRR000001
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
ダウンロード中は `curl` または `wget` の進捗が標準エラーに出ます。取得したファイルは `Downloaded<TAB>PATH` と表示します。既存ファイルを再利用した場合は `Skipped<TAB>PATH` と表示します。これらは標準エラーに出ます。最後に `dratools get: N downloaded, M skipped` のサマリを出します。状態とパスは TAB 区切りです。パスだけを取り出すには `cut -f2` を使います。
|
|
194
|
+
|
|
195
|
+
### ダウンロード時の検証と既存ファイル
|
|
196
|
+
|
|
197
|
+
md5 が得られる場合、`get` はダウンロード後に照合します。md5 が無い場合、既定では既存ファイルをスキップしません。
|
|
198
|
+
|
|
199
|
+
検証を省略する場合は `--no-verify` を付けます。
|
|
200
|
+
|
|
201
|
+
```sh
|
|
202
|
+
dratools get --no-verify -O ~/Downloads DRR000001
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
同名のファイルが既にある場合を考えます。その md5 が DDBJ の値と一致すれば、再ダウンロードしません。`Skipped` と表示します。
|
|
206
|
+
|
|
207
|
+
既存ファイルがあっても必ず再取得する場合は `--force` を付けます。
|
|
208
|
+
|
|
209
|
+
```sh
|
|
210
|
+
dratools get --force -O ~/Downloads DRR000001
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
md5 を確認せずに既存ファイルを再取得しない場合は `--skip-existing` を付けます。
|
|
214
|
+
|
|
215
|
+
```sh
|
|
216
|
+
dratools get --skip-existing -O ~/Downloads DRR000001
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
`--force` と `--skip-existing` を同時に指定した場合は、`--force` を優先します。
|
|
220
|
+
|
|
221
|
+
## accession の渡し方
|
|
222
|
+
|
|
223
|
+
どのコマンドも accession を3つの方法で受け取れます。引数、ファイル、標準入力です。
|
|
224
|
+
|
|
225
|
+
ファイルから読む場合は `--input` を使います。
|
|
226
|
+
|
|
227
|
+
```sh
|
|
228
|
+
dratools url --input accessions.txt
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
標準入力から読む場合は、accession をパイプで渡します。
|
|
232
|
+
|
|
233
|
+
```sh
|
|
234
|
+
printf 'DRR000001\nDRR000002\n' | dratools url
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
標準入力を明示する場合は `--input -` を指定します。
|
|
238
|
+
|
|
239
|
+
```sh
|
|
240
|
+
printf 'DRR000001\nDRR000002\n' | dratools url --input -
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## ライブラリとして使う
|
|
244
|
+
|
|
245
|
+
`dratools` は Ruby のライブラリとしても使えます。
|
|
246
|
+
|
|
247
|
+
```ruby
|
|
248
|
+
require "dratools"
|
|
249
|
+
|
|
250
|
+
resolver = Dratools::AccessionResolver.new
|
|
251
|
+
downloads = resolver.resolve_downloads("DRR000001", file_type: "sra")
|
|
252
|
+
|
|
253
|
+
downloads.each do |download|
|
|
254
|
+
puts download.url_for_protocol("https")
|
|
255
|
+
end
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
接続確認は次のように書きます。
|
|
259
|
+
|
|
260
|
+
```ruby
|
|
261
|
+
downloader = Dratools::DownloadService.new
|
|
262
|
+
downloader.probe_download(downloads.first, timeout: 5)
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
ダウンロードは次のように書きます。
|
|
266
|
+
|
|
267
|
+
```ruby
|
|
268
|
+
result = downloader.save_download(downloads.first, outdir: "downloads")
|
|
269
|
+
puts result.skipped? ? "skipped: #{result.path}" : "downloaded: #{result.path}"
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
## 対応アクセッション
|
|
273
|
+
|
|
274
|
+
DDBJ Search の JSON から `sra-run` を辿れる accession を対象にします。
|
|
275
|
+
|
|
276
|
+
- Run: `DRR`, `ERR`, `SRR`
|
|
277
|
+
- Experiment: `DRX`, `ERX`, `SRX`
|
|
278
|
+
- Sample: `DRS`, `ERS`, `SRS`
|
|
279
|
+
- Study: `DRP`, `ERP`, `SRP`
|
|
280
|
+
- Submission: `DRA`, `ERA`, `SRA`
|
|
281
|
+
- BioProject: `PRJDA`, `PRJDB`, `PRJEB`, `PRJNA`
|
|
282
|
+
- BioSample: `SAMD`, `SAMN`, `SAMEA`, `SAMEG`
|
|
283
|
+
|
|
284
|
+
## 終了ステータス
|
|
285
|
+
|
|
286
|
+
- `0`: 成功
|
|
287
|
+
- `1`: URL 解決、接続確認、ダウンロード、オプション指定、不明なサブコマンドのいずれかで失敗
|
|
288
|
+
|
|
289
|
+
複数の accession をまとめて処理する場合を考えます。成功した accession は処理を続けます。失敗した accession はエラーを標準エラーに出します。1 件でも失敗すると、全体の終了ステータスは `1` になります。
|