yNagaokaのブログ

このブログはNGS解析初心者がつまずいた部分と解決方法をまとめた覚書のようなものです。

Singularityとは何か?の覚書ーその1

はじめに

今回はDockerと合わせて重要になるSingularityに関して簡単にまとめようと思います。Singularityの公式ユーザーガイドは以下を参照してください。
https://docs.sylabs.io/guides/latest/user-guide/:embed:cite

Singularityとは?

・Singularityは、米LBNL(Lawrence Berkeley National Laboratory)で生まれた科学および高性能コンピューティング環境向けに設計されたオープンソースベースのコンテナープラットフォームです。

・アプリケーションの本体及び動作に必要なライブラリ、データをパッケージ化し、コンテナイメージを作成します。(Dockerのようなコンテナシステムを自分で環境構築して実行環境が作れます)

・コンテナイメージは基本的に1ファイルでDokcer imageよりも軽量です。

・コンテナを立ち上げなくても直接コマンドを実行することができます。

・Docker HubやSingularity Hubから直接イメージを作成することができます。

・Dockerと違い、できるだけ「コンテナ外のリソースを取り込む」ことを主眼としたコンテナです。

Singularityを使うメリット

・sudo権限が不要なため、一般ユーザアカウントでコンテナを起動・停止することができます。Dockerと違いユーザアカウントにsudo権限を付与しなくても良い!

・既にDockerで作成されているコンテナイメージがそのまま使える!

・実行ユーザアカウントの権限をそのままコンテナに引き継ぎできます。コンテナ内でファイルの作成・編集をしてもownerは実行ユーザのまま!

GPUの仮想化に対応しています。コンテナ起動時にオプションを付与すれば、コンテナ内でGPUも利用できる!

・デフォルトでホストの$HOME下をコンテナに共有します。$HOME以外にも システム管理者がユーザにバインドを許可していた場合は、ユーザ側でバインド元と先を指定することも可能です。 また、/sys, /proc, /tmp, /var/tmp, /etc/resolv.conf, /etc/passwdもデフォルトでコンテナ側にマウントされます。

Singularityと他の仮想環境との比較

・コンテナ型はハイパーバイザーがないため仮想化によるオーバーヘッドがない。
※オーバーヘッド:何らかの処理を行うためにかかるシステムやプロトコルの動作に対する負荷。 「仮想化オーバーヘッド」という場合には、物理サーバー上での動作では発生しないが仮想サーバー上では発生する余分な制御や余分な時間のことを指す。

・Dockerはコンテナの内外が分断された独立環境となるが、Singularityはコンテナ外を容易に参照できる環境である。 つまり、Singularityはホストのリソース (ファイル・ハイドウェア) を直接利用できる。

参考資料:以下が非常に参考になります。

https://qiita.com/mkt3/items/b9f86f5ddf9eb0f43608:title:embed:cite https://abci.ai/ja/how_to_use/data/ABCI-MiniCamp_Singularity_202105.pdf

Dockerを用いるメリットもありますが、個人的にはSingularityの方が柔軟性があって使いやすいなと感じています。

samplepairlist.txtの作製方法に関しての覚書

はじめに

さて、前回はsamplelist.txtの作製方法をまとめました。今回はsamplepairlist.txtの作製方法をまとめようと思います。(例題のサンプルは前回と同様です。)

samplepairlist.txt (各項目は , 区切り)の形式おさらい

ChIP-samplename,Input-samplename,prefix,peak mode
HepG2_H2A.Z,HepG2_Control,HepG2_H2A.Z,sharp
HepG2_H3K4me3,HepG2_Control,HepG2_H3K4me3,sharp
HepG2_H3K27ac,HepG2_Control,HepG2_H3K27ac,sharp
HepG2_H3K27me3,HepG2_Control,HepG2_H3K27me3,broad
HepG2_H3K36me3,HepG2_Control,HepG2_H3K36me3,broad

サンプルによってかもしれませんがsamplelist.txtを作製するときに使用したsample.txtが使えそうです。ChIP-samplenameとprefixは同じ名前でOKで、Input-samplenameは繰り返しで行けそうです。

$ cat sample.txt
F1-CiPSC-Input
F1-CiPSC-K27ac
F1-CiPSC-K27me3
F1-CiPSC-K4me1
F1-CiPSC-K4me3
F1-CiPSC-p300
F1-CiPSC-Pol2
F1-CPC-Input
F1-CPC-K27ac
F1-CPC-K27me3
F1-CPC-K4me1
F1-CPC-K4me3
F1-CPC-p300
F1-CPC-Pol2

1行目のサンプルが2−7行目のInput-samplenameで、8行目が9−14行目のInput-samplenameというように84サンプル分続きます。

そこでInputが含まれていないものをsamplename.txtとして抜粋しておきます。

"含まれていないもの"を指定するには -v オプションを使います。

$ grep -v Input sample.txt > samplename.txt
$ cat samplename.txt
F1-CiPSC-K27ac
F1-CiPSC-K27me3
F1-CiPSC-K4me1
F1-CiPSC-K4me3
F1-CiPSC-p300
F1-CiPSC-Pol2
F1-CPC-K27ac
F1-CPC-K27me3
F1-CPC-K4me1
F1-CPC-K4me3
F1-CPC-p300
F1-CPC-Pol2

これを見るとinputのサンプルを6回ずつ繰り返したファイルを作ればpasteコマンドで楽に連結させることができそうです。やってみましょう。

$ for id in $(grep Input sample.txt)
do
    for i in {1..6}
  do
    echo $id >> inputname.txt
  done
done
$ cat inputname.txt 
F1-CiPSC-Input
F1-CiPSC-Input
F1-CiPSC-Input
F1-CiPSC-Input
F1-CiPSC-Input
F1-CiPSC-Input
F1-CPC-Input
F1-CPC-Input
F1-CPC-Input
F1-CPC-Input
F1-CPC-Input
F1-CPC-Input

 id という変数の中に $() の実行結果を入れます。内容はsample.txtからInputの名前が入ったサンプルを書き出しています。その後 id の中身を6回書き出して次の中身に行くといったものです。結果を見るとうまく準備できているようです。

これをpasteすればpeak modeを除いた部分の完成です。

$ paste -d , samplename.txt input.txt samplename.txt > samplepair.txt
$ cat samplepair.txt
F1-CiPSC-K27ac,F1-CiPSC-Input,F1-CiPSC-K27ac
F1-CiPSC-K27me3,F1-CiPSC-Input,F1-CiPSC-K27me3
F1-CiPSC-K4me1,F1-CiPSC-Input,F1-CiPSC-K4me1
F1-CiPSC-K4me3,F1-CiPSC-Input,F1-CiPSC-K4me3
F1-CiPSC-p300,F1-CiPSC-Input,F1-CiPSC-p300
F1-CiPSC-Pol2,F1-CiPSC-Input,F1-CiPSC-Pol2
F1-CPC-K27ac,F1-CPC-Input,F1-CPC-K27ac
F1-CPC-K27me3,F1-CPC-Input,F1-CPC-K27me3
F1-CPC-K4me1,F1-CPC-Input,F1-CPC-K4me1
F1-CPC-K4me3,F1-CPC-Input,F1-CPC-K4me3
F1-CPC-p300,F1-CPC-Input,F1-CPC-p300
F1-CPC-Pol2,F1-CPC-Input,F1-CPC-Pol2

あとはpeak modeですが以下の組み合わせで行きたいと思います。

K27ac→sharp
K27me3→broad
K4me1→sharp
K4me3→sharp
p300→sharp
Pol2→sharp

samplepair.txtは72行あるので12回繰り返したファイルを作れば良さそうです。

echoで書き出す際に\nを追加するとその部分で改行を入れることができます。

” ” で文字を指定してさらに改行する場合は-eオプションが必要です。

$ for i in {1..12}
do
    echo -e "sharp\nbroad\nsharp\nsharp\nsharp\nsharp" >> peaklist.txt
done
$ cat peaklist.txt 
sharp
broad
sharp
sharp
sharp
sharp
sharp
broad
sharp
sharp
sharp
sharp

最後にこのファイルをpasteすればsamplepairlist.txtの完成です。

$ paste -d , samplepair.txt peaklist.txt > samplepairlist.txt
$ cat samplepairlist.txt
F1-CiPSC-K27ac,F1-CiPSC-Input,F1-CiPSC-K27ac,sharp
F1-CiPSC-K27me3,F1-CiPSC-Input,F1-CiPSC-K27me3,broad
F1-CiPSC-K4me1,F1-CiPSC-Input,F1-CiPSC-K4me1,sharp
F1-CiPSC-K4me3,F1-CiPSC-Input,F1-CiPSC-K4me3,sharp
F1-CiPSC-p300,F1-CiPSC-Input,F1-CiPSC-p300,sharp
F1-CiPSC-Pol2,F1-CiPSC-Input,F1-CiPSC-Pol2,sharp
F1-CPC-K27ac,F1-CPC-Input,F1-CPC-K27ac,sharp
F1-CPC-K27me3,F1-CPC-Input,F1-CPC-K27me3,broad
F1-CPC-K4me1,F1-CPC-Input,F1-CPC-K4me1,sharp
F1-CPC-K4me3,F1-CPC-Input,F1-CPC-K4me3,sharp
F1-CPC-p300,F1-CPC-Input,F1-CPC-p300,sharp
F1-CPC-Pol2,F1-CPC-Input,F1-CPC-Pol2,sharp

これでようやく解析のスタートラインに立ちました。

このような感じでサクサクとリストが作製できればどんなにサンプル数が多くても対応できそうですね。

samplelist.txtの作製方法に関しての覚書

初めに

Churrosを用いてChIP-seq解析を行うにはsamplelist.txtとsamplepairlist.txtが必要になります。少ないサンプル数であれば手動でリストを作製してもよいのですが、多いと手動だとしんどくなります。そこで効率よくsamplelist.txtを作製する方法をまとめようと思います。

 

今回はHuman iPSCとその親株細胞 (線維芽細胞[F]、内皮細胞[EC]、心筋前駆細胞[CPC])を用いてプロモーターとエンハンサーのマーカー(H3K4me1、H3K4me3、H3K27ac、H3K27me3の)のChIP-seq(n=84)解析を行った研究を例にします。

Churros

https://churros.readthedocs.io/en/latest/content/Tutorial.html

Reference

Zhao MT, Shao NY, Hu S, Ma N et al. Cell Type-Specific Chromatin Signatures Underline Regulatory DNA Elements in Human Induced Pluripotent Stem Cells and Somatic Cells. Circ Res 2017 Nov 10;121(11):1237-1250. PMID: 29030344

それぞれのリストの形式は下記

samplelist.txt (sampleとfastqfileの間はTab区切り)

samplename     fastqfile(rep1) ※rep2があれば,で区切って記載
HepG2_H2A.Z    fastq/SRR227639.fastq.gz,fastq/SRR227640.fastq.gz
HepG2_H3K4me3  fastq/SRR227563.fastq.gz,fastq/SRR227564.fastq.gz
HepG2_H3K27ac  fastq/SRR227575.fastq.gz,fastq/SRR227576.fastq.gz
HepG2_H3K27me3 fastq/SRR227598.fastq.gz,fastq/SRR227599.fastq.gz
HepG2_H3K36me3 fastq/SRR227447.fastq.gz,fastq/SRR227448.fastq.gz
HepG2_Control  fastq/SRR227552.fastq.gz,fastq/SRR227553.fastq.gz

samplepairlist.txt (各項目は , 区切り)

ChIP-samplename,Input-samplename,prefix,peak mode
HepG2_H2A.Z,HepG2_Control,HepG2_H2A.Z,sharp
HepG2_H3K4me3,HepG2_Control,HepG2_H3K4me3,sharp
HepG2_H3K27ac,HepG2_Control,HepG2_H3K27ac,sharp
HepG2_H3K27me3,HepG2_Control,HepG2_H3K27me3,broad
HepG2_H3K36me3,HepG2_Control,HepG2_H3K36me3,broad

まず論文からGEOのAssecion IDを探します。GSE97033にアクセスしRaw dataをゲットするためにSRAサイトに飛びます。

SRR5376453からSRR5376536までが欲しいデータなのでこれらをダウンロードします。

#!/bin/bash
mkdir -p fastq
for id in {453..536}
do
    fastq-dump --gzip SRR5376$id -O fastq
done

今回のデータはSingle-end readなのでオプションの--split-filesは無しです。

Single-end readのサンプルにこのオプションを付けるとSRRXXX_1.fastq.gzとなり後の処理がやや面倒になります。

さてここからリスト作製に移ります。samplenameはGEOに記載されているのもで良いので該当項目をcopy.txtにコピペします。

ここら辺一体をコピペしておきます。

出来上がったものが下記です。(長いので一部記載)

$ cat copy.txt
GSM2550183      F1-CiPSC-Input
GSM2550184      F1-CiPSC-K27ac
GSM2550185      F1-CiPSC-K27me3
GSM2550186      F1-CiPSC-K4me1
GSM2550187      F1-CiPSC-K4me3
GSM2550188      F1-CiPSC-p300
GSM2550189      F1-CiPSC-Pol2

1列目のGSM...というのが不要なのでカットしてsample.txtにします。

$ cat copy.txt | awk '{print $2}' > sample.txt
$ cat sample.txt
F1-CiPSC-Input
F1-CiPSC-K27ac
F1-CiPSC-K27me3
F1-CiPSC-K4me1
F1-CiPSC-K4me3
F1-CiPSC-p300
F1-CiPSC-Pol2

ちなみにコピぺしたうちの一部を使用したい場合は以下のようにNR==行番号で行を$列番号で列を指定することが可能です。ここでは2列目の2行目から4行目を指定しています。

$ cat copy.txt | awk 'NR==2,NR==4 {print $2}'
F1-CiPSC-K27ac
F1-CiPSC-K27me3
F1-CiPSC-K4me1

 

次に必要なのはfastqfileです。

今回は連番のサンプルなので以下のコマンドでlist.txtとして作製します。

>では単に上書きされてしまうので>>で追記するようにします。

for id in {453..536}
do
  echo fastq/SRR5376$id.fastq.gz >> list.txt
done
$ cat list.txt 
fastq/SRR5376536.fastq.gz
fastq/SRR5376453.fastq.gz
fastq/SRR5376454.fastq.gz
fastq/SRR5376455.fastq.gz
fastq/SRR5376456.fastq.gz
fastq/SRR5376457.fastq.gz
fastq/SRR5376458.fastq.gz

最後にsample.txtとlist.txtをマージすればsamplelist.txtの完成です。

$ paste sample.txt list.txt > samplelist.txt
$ cat samplelist.txt
F1-CiPSC-Input    fastq/SRR5376536.fastq.gz
F1-CiPSC-K27ac    fastq/SRR5376453.fastq.gz
F1-CiPSC-K27me3   fastq/SRR5376454.fastq.gz
F1-CiPSC-K4me1    fastq/SRR5376455.fastq.gz
F1-CiPSC-K4me3    fastq/SRR5376456.fastq.gz
F1-CiPSC-p300     fastq/SRR5376457.fastq.gz
F1-CiPSC-Pol2     fastq/SRR5376458.fastq.gz

列方向でファイルを結合したい場合はpasteコマンドを使います。デフォルトではタブ区切りでファイル同士が結合されます。

$ cat -T samplelist.txt
F1-CiPSC-Input^Ifastq/SRR5376536.fastq.gz
F1-CiPSC-K27ac^Ifastq/SRR5376453.fastq.gz
F1-CiPSC-K27me3^Ifastq/SRR5376454.fastq.gz
F1-CiPSC-K4me1^Ifastq/SRR5376455.fastq.gz
F1-CiPSC-K4me3^Ifastq/SRR5376456.fastq.gz
F1-CiPSC-p300^Ifastq/SRR5376457.fastq.gz
F1-CiPSC-Pol2^Ifastq/SRR5376458.fastq.gz

区切る文字を指定したい場合は-dオプションを使います。

$ paste -d , sample.txt list.txt 
F1-CiPSC-Input,fastq/SRR5376453.fastq.gz
F1-CiPSC-K27ac,fastq/SRR5376454.fastq.gz
F1-CiPSC-K27me3,fastq/SRR5376455.fastq.gz
F1-CiPSC-K4me1,fastq/SRR5376456.fastq.gz
F1-CiPSC-K4me3,fastq/SRR5376457.fastq.gz
F1-CiPSC-p300,fastq/SRR5376458.fastq.gz
F1-CiPSC-Pol2,fastq/SRR5376459.fastq.gz

これはsamplepairlist.txtを作るときに使えそうです。

初歩的な内容ですがこれらは非常に重要なコマンドなので使いこなせるようになるべきですね。