bioRxivでバズってる論文を抽出してSNSにメッセージを流してみた

きっかけ

近年、NatureやCell, Scienceに論文が投稿される前に、preprintサーバであるBioRxivに投稿する流れが増えてきています(2015年以降、急激に増加。ちなみに、Natureなどの多くの主要ジャーナルが、preprintサーバへ事前に投稿することを許可しているので、BioRxivへの投稿はいわゆる二重投稿に引っかかりません)。

また、BioRxivへの投稿が増えている背景には、オープンイノベーションを推進するという目的だけでなく、論文のPriorityを確保することや研究の宣伝を行う目的なども相まってのことだと考えられます。

とにかく、これからのサイエンスでは最新の研究動向を理解する上で、BioRxivの論文をフォローしていくことはますます重要になってくるでしょう。しかしながら、その論文の本数が多すぎます…。

直近で、preprintサーバに1ヶ月あたり1673本の論文が登録されています(1日あたり約50〜60本)。今後、さらに数が伸びることが予想されます。これを人力で全て確認するのは不可能です…。 image.png (218.9 kB) 元データはこちら。
http://www.prepubmed.org/monthly_stats/

BioRxivに登録されている論文はとにかく玉石混交なので、注目されている論文だけを抽出することはできないか考えました。そんな中で見つけたのが、こちらの記事です。

A Twitter bot to find the most interesting bioRxiv preprints
https://gigabaseorgigabyte.wordpress.com/2017/08/08/a-twitter-bot-to-find-the-most-interesting-biorxiv-preprints/

こちらの記事では、 Altmetric scoreという指標(論文の注目度を数値化したもの)を用いて、BioRxivに投稿された論文の中で、特に注目度の高い記事を抽出し、Tweetするという仕組みを作っていました。

ちなみに、Altmetric scoreとは、TwitterFacebookなどのSNSやNews、Mendeleyへの登録数などの様々な指標を元に算出した論文の注目度を示すスコアです(詳しく解析したわけではないですが、個人的な印象として、BioRxivに登録されている論文のAltmetric scoreは、Tweet数に引っ張られている印象を受けましたが…)。

上記の記事で紹介されているスクリプトをそのまま使うのも手でしたが、後々PubMedに登録されている論文に対しても応用したかったのと、データのストアをSQLデータベースではなく、Pickleで管理しているなど、実装部分で個人的に作り変えたい部分があったので、1から自分で作ってみることにしました。

そんなわけで、上記の記事を参考に、Raspberry Pi上で動作するBioRxivのキュレーションシステムを作って見たというのが今回の内容になります。

サンプル

SNSへのメッセージ出力として、SlackとTwitterに対応させました(現状、個人的に興味のある「Genomics」と「Bioinformatics」の分野に関する論文しかキュレーションの対象にしていません)。

サンプルのTwitter botはこちらになります。
https://twitter.com/BioRxivCurator

image.png (546.9 kB)

ソースコード

BioRxivCurator
https://github.com/Imamachi-n/BioRxivCurator

内容

全体像

システム全体の流れは以下の通りです(内部的なデータ処理の流れとはちょっと違いますが、概略図ということで解釈してもらえば良いです)。 image.png (218.7 kB)

RSS feedで取得した論文データについて、Altmetric scoreを取得し、データをSQLiteデータベースに格納しておきます。Altmetric scoreが一定以上の論文(注目度の高い論文)について、定期的にTwitterやSlackにメッセージを配信します。

また、一定のスコアに達しない論文については、情報をデータベースに保持し続けておき、定期的にAltmetric scoreを確認します。データの保持期限は1ヶ月とします(多くの場合、1ヶ月以降はあまりAltmeric scoreが変動しない傾向にあるため)。それを過ぎた論文データは破棄します(厳密には、フラグ管理により論理削除する形をとります)。

Pythonで実装し、プログラム自体はRaspberry Pi3 ModelB上で動かします。手作業でプログラムを動かすのは面倒なので、ジョブスケジューラであるcronを使って毎日論文を自動でチェックする形にしました。 image.png (171.0 kB) https://commons.wikimedia.org/w/index.php?curid=47497384

Pythonによる実装

まず、Pythonによる実装例を見ていきます。かいつまんで重要な箇所を説明しているだけなので、詳しくは上述のソースコードをご覧ください。

RSS feedの取得

BioRxivのRSS feedはこちらから取得できます。直近の30 articlesを取得できます。
https://www.biorxiv.org/alertsrss

論文の絞り込みとしては、
http://connect.biorxiv.org/biorxiv_xml.php?subject=all
で全体から取得するか、
http://connect.biorxiv.org/biorxiv_xml.php?subject=キーワード
で特定の分野の論文のみを取得する方法があります。

後者の場合、+でつなげて
http://connect.biorxiv.org/biorxiv_xml.php?subject=genomics+bioinformatics
のように複数の分野からRSSを取得することも可能です。

PythonRSS feedから得たデータをパースするために、今回はfeedparserライブラリを使いました。

import feedparser

feed = feedparser.parse(
        "http://connect.biorxiv.org/biorxiv_xml.php?subject={0}".format("+".join(subjects)))

 for pub in feed["items"]:
    <処理を書く>
     # pub["dc_identifier"] # DOI
     # pub["title"]          # 論文のタイトル
     # pub["link"].split('?')[0]  # 論文のURL
     # pub["updated"]        # 更新日

以上のように、feedparser.parse()に先ほど取得したRSS feedのURLを渡すことで、ディクショナリ型にパースされたRSSデータを取得できます。

各論文のデータは、itemsごとに格納されているので、Forループで各論文の情報を取得します。例えば、dc_identifierにはDOI、titleには論文のタイトル、linkには論文のリンク、updatedには更新日が格納されています。DOIはAltmetric scoreの取得の際に必要となるので、必ず取得しておきます。

実際にどんなデータが入っているか確認したい場合は、RSS feed URLに直接アクセスして、中身のXMLファイルを覗いてみるといいです。 ブラウザによって見え方が異なります。以下の例では、Google Chromeを使って表示しています。 image.png (389.8 kB)

Altmetric scoreの取得

RSS feedから取得したDOIを使って、Altmetric scoreを取得します。 Altmetric scoreの取得には、AltmetricのAPIを使用します。
https://api.altmetric.com/

ソースコード中では、Altmetric APIの薄いラッパークラスを作っていますが、要はAltmetric scoreの取得先URLに対してGETしてるだけです。

import requests
import json

# GET request
doi = "10.1038/480426a"
request = requests.get("https://api.altmetric.com/v1/doi/{0}".format(doi))
response = json.loads(request.text)
# response["context"]['journal']['pct']    # Altmetric scoreを「0〜100」に正規化した値。
# response["score"]            # Altmetric score

Altmetric APIは、
リクエストURL: https://api.altmetric.com/v1/doi/DOI
に対してGETすると、JSON形式でデータを返してくれます。

そこで、JSON形式のデータをjson.load()を使ってディクショナリ型に変換します。 あとは、キーを指定して欲しいデータを取り出すだけです。

こちらも、実際にどんなデータが入っているか確認したい場合は、リクエストURLに直接アクセスして、中身のJSONファイルを覗いてみるといいです。
ブラウザによって見え方が異なります。以下の例では、Firefoxを使って表示しています。Firefoxではこのように、 JSON形式のデータを見やすく表示してくれます。 image.png (298.8 kB) 今回は、赤枠で囲った値を取得しています。

SQLiteデータベースへの格納

順番は前後しますが、ここでまとめてSQLiteデータベースの処理を説明します。

1. テーブルの作成(CREATE TABLE

まず、テーブルを作成します。 ここでは、CREATE TABLE IF NOT EXISTSとすることで、システムの初回起動時にのみテーブルが作成される仕組みになっています。 また、論文のDOIをprimary keyに指定します(各論文に対してユニークな文字列が割り振られるため)。

import sqlite3

sqlite3_file = "./storeAltmetrics.sqlite3"
with sqlite3.connect(sqlite3_file) as conn:
        c = conn.cursor()

        # Create biorxiv_altmetrics_log table
        sql = """CREATE TABLE IF NOT EXISTS biorxiv_altmetrics_log
                (doi TEXT,
                 title TEXT,
                 link TEXT,
                 update_date TEXT,
                 altmetric_score INTEGER,
                 altmetric_pct INTEGER,
                 altmetric_flg INTEGER,
                 PRIMARY KEY(doi)
                )"""
        c.execute(sql)
        conn.commit()

基本的に、Javaなどの言語と書き方は似てます。 sqlite3.connect()でデータベースに接続します。ここでは、sqlite3_fileが格納先のデータベースのファイルだとします。 続いて、cursorオブジェクトを作成し、execute()メソッドでSQL文を実行します。最後に、変更点を保存するために、Connectionオブジェクトのcommit()メソッドを実行します(コミット)。

テーブルのフィールドについてです。 RSS feedから取得したデータをdoi, title, link, update_dateにそれぞれ格納します。 また、Altmetric APIから取得したスコアを、altmetric_score, altmetric_pctにそれぞれ格納します。

フラグ 意味
0 PCTが90未満
1 PCTが90以上
-1 PCTが90未満で1ヶ月が経過(解析対象から除外)
2. RSS feedから得た論文データの格納(INSERT INTO

RSS feedから取得した論文のデータ(論文のタイトル、論文のURL、DOI、更新日)をデータベースのテーブルに格納します。 ここでは、INSERT OR IGNORE INTOとすることで、テーブルに格納されていない論文についてのみ登録する形になっています。

with sqlite3.connect(sqlite3_file) as conn:
            c = conn.cursor()

            # Insert article info into biorxiv_altmetrics_log if not already exists
            sql = """INSERT OR IGNORE INTO biorxiv_altmetrics_log
                     VALUES(?,?,?,?,?,?,?)"""
            doi_info = [tuple([p.doi, p.title, p.url, p.date, 0, 0, 0])
                        for p in RSS_data_list]
            c.executemany(sql, doi_info)
            conn.commit()

ここでは、RSS_dataクラスのインスタンスRSS_data_listに論文のデータが格納されていることを想定しています。 データを渡す際には、タプル型である必要があります。

("value1,")
("value1", "value2", "value3")

また、タプル型のデータのリストを作成し、cursorオブジェクトのexecutemany()メソッドを使うことで、一気に複数のレコードをテーブルに格納することができます。最後は、connectionオブジェクトのcommit()メソッドを使って、変更点をコミットします。

ちなみに、突然出てきたRSS_data_listですが、下記の通りに定義しています。

class RSS_data(object):
    def __init__(self, doi, title, url, date):
        self.doi = doi
        self.title = title
        self.url = url
        self.date = date

RSS_data(doi=pub["dc_identifier"],
         title=pub["title"],
         url=pub["link"].split('?')[0],
         date=pub["updated"]))

またここでは、pubは上述したfeedparser.parse()メソッドで取得したRSS feedから得たデータをディクショナリ型で格納したオブジェクトだとします。

3. Altmeric scoreを取得する論文データの抽出(SELECT

続いて、過去に取得した論文データを含めて、一定のAltmetric scoreを超えていない論文のリストを取得します。
先ほど説明した通り、altmetric_flgが「0」である論文がAltmetric scoreを検索する対象となります。

with sqlite3.connect(sqlite3_file) as conn:
            c = conn.cursor()

            # Select target doi from biorxiv_altmetrics_log
            sql = """SELECT doi, title, link, update_date from biorxiv_altmetrics_log
                     WHERE altmetric_flg = 0"""
            c.execute(sql)

            # Store doi data as target_doi_data object
            target_doi_list = []
            for doi_info in c.fetchall():
                target_doi_list.append(target_doi_data(
                    doi=doi_info[0], title=doi_info[1], url=doi_info[2], date=doi_info[3]))

cursorオブジェクトのexecute()メソッドでSQL文を実行した後、検索した結果はcursorオブジェクトに格納されます。fetchall()メソッドを使うことで、条件に一致した全てのレコードをリストとして取得できます。

class target_doi_data(object):
    def __init__(self, doi, title, url, date):
        self.doi = doi
        self.title = title
        self.url = url
        self.date = date

取得したレコードの情報は、上記target_doi_dataオブジェクトのリストとして格納しておきます。

4. Altmetric scoreの値の格納(UPDATE

最後に、Altmetric scoreの更新を行います。APIから取得したスコアをテーブルに書き込みます。最後に忘れずに、変更をコミットします。

with sqlite3.connect(sqlite3_file) as conn:
            c = conn.cursor()

            # insert altmetric score into biorxiv_altmetrics_log
            sql = """UPDATE biorxiv_altmetrics_log
                     SET altmetric_score = ?,
                          altmetric_pct = ?,
                          altmetric_flg = ?
                     WHERE doi = ?"""
            c.execute(sql, tuple([altmetrics_data.altmetric_score,
                                  altmetrics_data.pct, altmetrics_data.flg,
                                  doi]))
            conn.commit()

Slackのアクセストークンを取得する

SlackのAPIを介してデータのやり取りをします。そのため、Slackのアクセストークンを取得する必要があります。以下ではその取得方法について説明します。

基本的に以下の記事を参考にしました。
https://qiita.com/ykhirao/items/3b19ee6a1458cfb4ba21

1. アプリの登録

まず、以下のURLにアクセスします。Slackにログインしていない場合、ログインしてください。
https://api.slack.com/apps

Create an Appをクリックします。 image.png (250.5 kB)

Create a Slack Appという画面が出てくるので、
App Name: 好きな名前を入力する。
Development Slack Workspace: Slackのメッセージを流したいワークスペースを選択。
を入力して、Create Appをクリックします。 image.png (194.2 kB)

2. スコープの設定

登録したアプリの権限の範囲を設定します。 Install your app to your workspaceを開くと、権限のスコープを設定してくださいとメッセージが出ているので、permission scopeをクリックします。 image.png (280.0 kB)

今回は、Slackへメッセージを送るだけなので、ChatのSend messages as xxxxxxを選択します。 image.png (233.3 kB)

すると、選択したPermission Scopeが表示されます。
状態を保存するために、Save Changesを必ずクリックしてください。 image.png (181.5 kB)

3. アプリをSlackにインストールする

最後に、アプリをSlackにインストールします。 image.png (168.1 kB)

先ほど設定したメッセージを送る権限を付与していいか聞かれるので、Authrizeをクリックします。 image.png (81.0 kB)

インストールが完了すると、OAuth Access Tokenを取得できます。 この文字列を使うので、コピーして保存しておきます。 image.png (119.7 kB)

Slackへのメッセージ配信

Slackへのメッセージ送信は、公式のPythonライブラリであるSlackClientを使います。
https://slackapi.github.io/python-slackclient/basic_usage.html#sending-a-message

使い方は簡単で、先ほど取得したSlackのアクセストークslack_tokenを指定し、spi_call()メソッドに、送り先のチャンネルchannelと送信するテキストtextを指定するだけです。エラーハンドリングについては、上記のURLの記事を参照してください。

slack_token = "xxxxxxxx"
channel = "@imamachi"
text = "Hello World !!"

sc = SlackClient(slack_token)
    response = sc.api_call(
        "chat.postMessage",
        channel=channel,
        text=message
    )

Twitterのアクセストークンを取得する

Slack同様、TwitterAPIを介してデータのやり取りをします。そのため、Twitterについてもアクセストークンを取得する必要がありmす。以下ではその取得方法について説明します。

1. Twitterアプリの作成

まず、Twitter Application Managementにアクセスします。アカウントにログインしていない場合は、ツイート対象となるアカウントにログインしてください。
https://apps.twitter.com/

Create New Appをクリックします。 image.png (84.9 kB)

Name: アプリ名を記載する。
Description: アプリの説明を記載する。
Website: ソースコードやアプリが入手できるURLを入力。
Create your Twitter applicationをクリックし、アプリを作ります。 image.png (343.5 kB)

image.png (55.1 kB)

すると、次のようなページに遷移します。 image.png (223.4 kB)

2. アクセストークンの取得

Keys and Access Tokensタブをクリックし、 Consumer Key (API Key)Consumer Secret (API Secret)を確認します。 これらはAPIでのやり取りに必要となるので、コピーして保存しておきます。 image.png (318.7 kB)

続いて、Your Access TokenでCreate my access tokenをクリックします。 image.png (65.5 kB)

Access TokenAccess Token Secretを取得します。 これらも同様に、APIでのやり取りに必要となるので、コピーして保存しておきます。 image.png (85.4 kB)

Twitterへのメッセージ配信

Twitterへのツイートは、tweepyというライブラリを使います。 こちらも使い方は非常に簡単で、先ほど取得した各種の値を設定し、メッセージをupdate_status()メソッドに指定するだけです。

こちらも参照。
https://review-of-my-life.blogspot.jp/2017/07/python-cloud9-tweepy.html

consumer_key = "xxxxxxxx"
consumer_secret = "xxxxxxxx"
access_token = "xxxxxxxx"
access_token_secret = "xxxxxxxx"
message = "Hello World !!"

auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth)
api.update_status(message)

追記: 余談ですが、TweepyはメインのContributorがいなくなり、他のmaintainerに引き継がれています。アップデートが最近されていないので、TwitterAPIの仕様変更で動かなくなるリスクがあります。
https://qiita.com/utgwkk/items/4beed333e8262c675028

Raspberry Pi3の用意

以下のサイトを参考にRaspberry Pi3のOSをインストールしたMicro SDカードを用意します。
https://getpocket.com/redirect?url=http%3A%2F%2Fhirazakura.hatenablog.com%2Fentry%2Fraspberrypi%2Fsetup%2Ffirst&formCheck=3f0b1d005779f9a1ac22bfac92159bea

続いて、アップデートをかけて、リブートします(再起動)。

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo rpi-update
$ sudo reboot

テキストエディタが入っていないので、VSCodeをインストールします。
https://code.headmelted.com/ 管理者権限でないとインストールできないので注意してください。

$ wget -O - https://code.headmelted.com/installers/apt.sh 
$ chmod 755 apt.sh
$ sudo apt.sh

以下でVisual Studio Codeを実行できます。

$ code-oss

SQLiteのクライアントアプリをインストール

SQLiteデータベースをGUIで見たい場合、以下のクライアントアプリがオススメです。
http://sqlitebrowser.org/

Raspberry Pi上では、以下のコマンドでインストール可能です。

$ sudo apt-get install sqlitebrowser

cronの設定

Raspberry Piで作成したPythonスクリプトを定期的に自動で実行するために、cronを使います。 cronはUnix OS系に標準で搭載されているジョブスケジューリングのプログラムです。

cronについての記事はこちらを参照のこと。
https://qiita.com/hikouki/items/e744b3a4d356d2af12cf

ここでは、簡単な設定例を示したいと思います。 まず、cronのconfigureファイルcron.confを作成します。 スペース区切りで日時を指定、最後に実行コマンドを指定します。 行の最後に改行が必要なので、入れ忘れないように。

分 時 日 月 曜日 <実行コマンド> [改行]

あと、念のため、エラーになった時にエラーログを確認できるように、標準出力でエラーログを取っておきます。

0 11 * * * bash /home/pi/Desktop/BioRxivCurator/src/startup4RaspberryPi.sh > /home/pi/Desktop/error.txt 2>&1

cronのconfigureファイルを作成したら、以下のコマンドを実行します。

$ crontab ./cron.conf

設定内容を確認したい場合は、

$ crontab -e

で設定内容を確認・編集できます。

間違って登録してしまった場合、

$ crontab -r

で全ての設定を削除することができます(このコマンドの実行には注意が必要です)。

cron使用時の注意点

だいたいのエラーは、上記pythonへのパスに起因した問題です。

相対パスに注意

cronが実行するコマンドは、実行ユーザーのホームディレクトリで実行されます。

特に今回の場合、pythonのコードの中に相対パスを設定している箇所があるので、実行コマンド中で、cdでカレントディレクトリをソースコードの置いてあるディレクトリに移動しておきます。

$ cd /home/pi/Desktop/BioRxivCurator/src

Minicondaを使用している場合

python絶対パスで指定する必要があります。そうしないと、cronは標準でインストールされているpythonを使おうとします。

/home/pi/miniconda3/bin/python /.main.py --yaml_setting_file ./production.yaml

原因がわからないエラーの場合

cronで実行するコマンドの最後に、エラー出力先を指定しておくと良いです。

0 11 * * * bash /home/pi/Desktop/BioRxivCurator/src/startup.sh > /home/pi/Desktop/error.txt 2>&1

こうすることで、指定したファイルerror.txtにエラーログが出力される。

また、/var/log/syslog内にもcron実行時のログが残るので、そちらも参照すると原因の特定につながります。

cron.confが登録できない

コマンドの打ち間違え(こんなミスをするのは私だけかもしれませんが…)。

$ cron ./cron.conf
cron: can't lock /var/run/crond.pid, otherpid may be 3505: Resource temporarily unavailable

正しくは、cronではなくcrontabです。

$ crontab ./cron.conf

どうしようもなくなったら、とりあえず、リブート(再起動)してみましょう。

$ reboot

Windows Mixed RealityのImmersive Headsetの初期設定

概要

Acerから出たAcer Windows Mixed Reality Development Editionが届いたので、セットアップ方法をまとめました。

IMG_20170826_145612.jpg (2.6 MB)

設定方法

(1)HDMIケーブルとUSB3.0ケーブルをパソコンに差し込みます。

(2)しばらく待っていると、次のような画面が出てきます。 image.png (562.6 kB)

(3)次へを押していくと、接続しているパソコンのスペックが動作要件を満たしているかどうかチェックが行われます。問題なければ、次へを押します。 image.png (188.2 kB)

(4)HMDの説明が入り、ヘッドフォンジャックの位置などが示されます。 image.png (158.5 kB)

(5)身長を聞かれます(メートル法じゃない…)。 image.png (176.0 kB)

フィートとかインチでは身長がわからないので、メートル法を指定して自分の身長を入力します。 image.png (170.8 kB)

(6)フロアの設定が始まります。 image.png (477.6 kB)

HMDかぶって部屋の中央に立ち、開始ボタンを押します。 image.png (192.3 kB)

10秒間待つと、フロアが検出されましたと表示されます。 image.png (182.4 kB)

(7)続いて、フロアの境界を検知します。 image.png (664.1 kB)

できるだけ障害物を除いて、 image.png (669.3 kB)

腰のあたりにHMDを持ち、フロアの境界(壁)をスキャニングしていきます。 image.png (238.4 kB)

一周りすると、いかのように境界が設定されます(あんまりうまくない例です)。 image.png (262.3 kB)

(8)以上で基本的な設定は終わりで、 image.png (176.0 kB)

複合現実ポータルに入れます。 image.png (779.4 kB)

右クリックで、場所の移動。 キーボードのWindowsキーを押すと、メニューが出現します。 全体的な操作感は、HoloLensと似ています。 image.png (902.6 kB)

簡単ではありますが、以上になります。

Ribo-seqデータ解析 (RiboTaper, short ORF prediction)

概要

Ribo-seq (Ribosome Profiling)とは、リボソームが結合しているRNA領域をシークエンスする手法です。この方法を利用することで、mRNAのどの領域が翻訳されているか、つまりはORFを予測することができます。また、特定の刺激などによる翻訳活性の変化を捉えることができます。

ここでは、データのダウンロード方法からLinuxを用いたデータ解析まで、Ribo-seqのデータ解析の詳細をStep by Stepで説明します。ただし、基本的なLinuxのコマンド操作は理解している前提で説明を行います。

使用するデータ

SRA160745 (Gao X et al. Nat. Methods 2015)

https://trace.ddbj.nig.ac.jp/DRASearch/submission?acc=SRA160745

使用するソフトウェア

解析ワークフロー

今回の解析の流れを以下にまとめました。

PowerPoint スライド ショー - [2016-08-22_NGS_workflow.pptx] 2017-03-30 10.21.48.png (140.1 kB)

サンプルコード

Github上に必要なファイルはすべて置いてあります。
https://github.com/Imamachi-n/NGS-Tutorial/tree/master/Ribo-seq_RiboTaper

シェルスクリプトを使用するときの注意点

権限の問題

実行権限をシェルスクリプトに与えた後、実行すること。

$ chmod 755 <hoge.sh>

改行コードの問題

WindowsLinuxで改行コードが異なるため、Windows-Linux間でファイルのやり取りをしていると、改行コードの違いに起因する問題が生じることがある。対処法としては、テキストエディタの設定を変えることでLinuxの改行コードを使用する。

ここではAtomと呼ばれるテキストエディタでの設定方法を説明する。

  • [Ctrl] + [ , ](カンマ)キーを押して、Settingsの画面を呼び出す。
  • 左のメニューから、Packagesをクリック。
  • Installed Packagesでline-ending-selectorと検索。
  • Core Packagesの項目から、line-ending-selectorのSettingsをクリック。
  • 設定画面で、Default line endingをLFに変更。

Settings — C__Users_Naoto_OneDrive_NGS解析_NGS-Tutorial_RNA-seq_Tutorial — Atom 2017-01-31 11.20.21.png (250.6 kB)

これで、新規に作成したファイルの改行コードがデフォルトでLF(Linuxの改行コード)になります。

各ステップの説明

0. 必要なソフトウェアのインストール

まず、前述したソフトウェアをbiocondaを用いて自身の解析環境にインストールします。 biocondaのインストールに関しては、下記の記事を参照のこと。

imamachi-n.hatenablog.com

まず、Biocondaで仮想環境をつくります。ここでは、python2.7をベースに仮想環境を構築します。

conda create -n ribotaper python=2.7
  • -nで仮想環境の名前を指定します。
  • pythonに2.7を指定することで、python2.7を仮想環境にインストール

source activateに続けて、先ほど作成した仮想環境の名称を指定することで、仮想環境に入ることができます。

source activate ribotaper

conda info --envsで現在どの環境にいる確認できるので、前後でどの環境にいるか確認してみましょう。

$ conda info --envs
  # conda environments:
  #
  ribotaper                /home/akimitsu/miniconda2/envs/ribotaper
  root                  *  /home/akimitsu/miniconda2

$ source activate miso
$ conda info --envs
  # conda environments:
  #
  ribotaper             *  /home/akimitsu/miniconda2/envs/ribotaper
  root                     /home/akimitsu/miniconda2

最初はrootという環境にいたのが、source activate ribotaperの後、ribotaperという仮想環境に移動していることがわかると思います。

RiboTaperの実行は、このribotaperと名付けた仮想環境上で行うこととします。また、その他の必要なソフトウェアに関しても同様の環境上にインストールしていきます。

それでは、RiboTaperに必要なパッケージやソフトウェアをBiocondaを利用してあらかじめインストールしておきましょう。

注意!!

samtoolsとbedtoolsはバージョンに依存しているので、最新のものをインストールしてはならない。

$ conda install fastqc
$ conda install cutadapt
$ conda install fastx_toolkit
$ conda install star
$ conda install samtools
$ conda install rseqc
$ conda install bedtools
$ conda install subread

# For RiboTaper
$ conda install samtools=0.1.19
$ conda install bedtools=2.17.0
$ conda install r-seqinr
# conda install r-ade4
$ conda install r-multitaper
$ conda install r-xnomial

# DOWNGRADED due to dependency conflicts (R(v3.2.2-0))
$ conda install r-domc
# conda install r-iterators
# conda install r-foreach

RiboTaperのソースコードをダウンロードして、ファイルを解凍します。

$ wget https://ohlerlab.mdc-berlin.de/files/RiboTaper/RiboTaper_v1.3.tar.gz
$ tar zxvf RiboTaper_v1.3.tar.gz

RiboTaper_v1.3ディレクトリにパスを通します。下記のように、ホームディレクトリにある.bashrcにパスを書き加えます。

export PATH=/home/akimitsu/software/RiboTaper_v1.3/scripts:${PATH}

1. SRAダウンロード

NGSデータはシークエンスされたリード(塩基配列)の情報とクオリティスコアのデータをまとめたFASTQ形式のファイルとして保存されています。

FASTQファイルの詳細についてはこちらを参照。
https://en.wikipedia.org/wiki/FASTQ_format

FASTQデータは非常に大きいファイルなので、NCBI GEOでは、FASTQファイルを圧縮したSRAファイルと呼ばれるファイル形式でデータを公開しています。

まず、下記のURLにアクセスすると、
https://trace.ddbj.nig.ac.jp/DRASearch/submission?acc=SRA160745

DDBJ DRAのサイトはこんな感じ。NCBI GEOと比較してIDが羅列してあるだけなので、どのIDがどのサンプルに対応しているかぱっと見わかりません…。

SRA160745 - DRA Search と 2 ページ - Microsoft Edge 2017-03-30 18.23.54.png (155.3 kB)

下記のサイトでDRAに登録されているデータの詳細をリスト化してみることができます。

DBCLS SRA: Survey of Read Archives
http://sra.dbcls.jp/v1/

早速、SRA#の欄にSRA160745と入力して、検索してみましょう。

DBCLS SRA と 7 ページ - Microsoft Edge 2017-03-30 19.15.36.png (109.3 kB)

Expsの項目をクリックします。

STUDIES と 10 ページ - Microsoft Edge 2017-03-30 19.27.42.png (36.5 kB)

すると、各IDに対してタイトルなどの情報を見ることができます。

今回使用するのは、No16とNo19のデータになります。Exp#の項目のSRX740748とSRX740751をそれぞれクリックします。

EXPERIMENTS と 10 ページ - Microsoft Edge 2017-03-30 19.28.11.png (137.1 kB)

DDBJ DRAのページに移動します。NavigationのRunのSRAボタンをクリックします。

SRX740748 - DRA Search と 10 ページ - Microsoft Edge 2017-03-30 19.32.40.png (42.9 kB)

SRR1630831のURLをコピーします、

_ddbj_database_dra_sralite_ByExp_litesra_SRX_SRX740_SRX740748_SRR1630831 のインデックス - Google Chrome 2017-03-30 19.33.17.png (29.7 kB)

wgetで該当するSRAファイルをダウンロードします。

$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/SRX/SRX740/SRX740748/SRR1630831/SRR1630831.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/SRX/SRX740/SRX740751/SRR1630838/SRR1630838.sra

2. SRAファイルからFASTQファイルに変換

まず、SRA IDだけだったファイル名にサンプルの情報を付け加えます(SRRのIDだけだと何のファイルかわからなくなるので)。mvコマンドを使ってリネームを行います。

$ mv SRR1630831.sra Ribo-Seq_HEK293_Cell_Control_SRR1630831.sra
$ mv SRR1630838.sra RNA-Seq_HEK293_Cell_SRR1630838.sra 

リネーム後、先ほどインストールしたSRA Toolkitを使って、NCBI GEOからダウンロードしたSRAファイルをFASTQファイルに展開します。

$ fastq-dump Ribo-Seq_HEK293_Cell_Control_SRR1630831.sra
$ fastq-dump RNA-Seq_HEK293_Cell_SRR1630838.sra 

カレントディレクトリにFASTQファイルが展開されているはずです。

3. Quality check

FastQCを使って、FASTQファイルに記載されている各リードのクオリティをチェックします。

FASTQファイルはPhred Quality Scoreと呼ばれる指標によって、各塩基のクオリティを記述しています。

詳しくはこちらのサイトを参照のこと。
https://en.wikipedia.org/wiki/Phred_quality_score

実行例

$ mkdir fastqc_Ribo-Seq_HEK293_Cell_Control_SRR1630831
$ fastqc -t 8 -o ./fastqc_Ribo-Seq_HEK293_Cell_Control_SRR1630831 ./Ribo-Seq_HEK293_Cell_Control_SRR1630831.fastq -f fastq

mkdirコマンドでfastqc_Ribo-Seq_HEK293_Cell_Control_SRR1630831という名前のディレクトリをカレントディレクトリに作ります。

次に、fastqcを使ってRibo-Seq_HEK293_Cell_Control_SRR1630831.fastqのデータのクオリティをチェックします。 -tオプションで使用するCPUのコア数を指定します。コア数を増やせば単純に計算速度が向上しますが、FastQCではメモリを1コアあたり250MB消費するので、要求できるメモリ量を超えるコア数を指定するとエラーが起こります。

-oオプションで出力先のディレクトリを指定し、-fオプションでInputファイルのファイル形式を指定しています。

FastQCから出力されるデータが、fastqc_Ribo-Seq_HEK293_Cell_Control_SRR1630831ディレクトリの中のRibo-Seq_HEK293_Cell_Control_SRR1630831_fastqc.htmlになります。 ファイルをブラウザで開くと以下のようなグラフを確認できます。

Basic Statistics

基本的な統計量が示されています。

  • 全リード数
  • リード長
  • GC contents

などなど

Per base sequence quality

リードの各塩基のクオリティスコアを示しています。 Phred quality scoreがだいたいグリーンの領域(Scoreが28以上)に収まっているかどうか確認します。 結果として、クオリティが低いリードは含まれていないことが確認できます。

ダウンロード.png (8.5 kB)

Per tile sequence quality

フローセルの各タイルごとのクオリティスコアを示しています。

Illumina社製の次世代シーケンサーでは、「フローセル」と呼ばれるガラス基板上でDNA合成反応を行います。このフローセルは「タイル」と呼ばれる単位に区切られており、各タイルごとに塩基配列を決定しています。

シーケンスをかけたときに、例えば特定のタイルに気泡やゴミが入っているとクオリティの低下が見られることがあります。

特定のタイルで著しいクオリティの低下が見られる場合は、シークエンス時に上記のような問題があったと考えられます。

詳しくはこちらの資料を参照のこと。
http://nagasakilab.csml.org/ja/wp-content/uploads/2012/04/Sato_Sugar_JPNreview.pdf

ダウンロード (1).png (8.6 kB)

Per sequence quality scores

各リードの全長のクオリティスコアの分布を示しています。 ダウンロード (2).png (16.2 kB)

Per base sequence content

各塩基のA, T, G, Cの含有量を示しています。 RNA-seqの場合、それぞれの含有量はほぼ25%ずつになりますが、PAR-CLIPのようにRNA結合タンパク質と結合しているRNA配列を抽出してきている場合、それぞれの含有率に偏りが見られます。

ダウンロード (3).png (33.0 kB)

Per sequence GC content

リードのGC contentsの分布を示しています。 ダウンロード (4).png (32.4 kB)

Per base N content

各塩基中に含まれるNの含有率(塩基を読めなかった箇所)を示しています。 ダウンロード (5).png (7.2 kB)

Sequence Length Distribution

リード長の分布を示しています。 ダウンロード (10).png (20.3 kB)

Sequence Duplication Levels

Duplidate readsの含まれている数を示しています。 ダウンロード (6).png (22.9 kB)

Overrepresented sequences

頻出する特徴配列が示されています。リード中にアダプター配列などが混入している場合、その配列が示されます。

Adapter Content

各塩基ごとに見たときのリード中に含まれているアダプターの割合を示しています。 あくまで、FastQCに登録されているアダプター配列しか確認していないので、登録されていないアダプター配列を使っていた場合、そのアダプター配列がリード中に混入していても確認できないことがあります。 ダウンロード (7).png (8.8 kB)

Kmer Content

特定の塩基配列のパターンがリード中に頻出していないかどうかチェックしています。 ダウンロード (8).png (60.2 kB)

4. Adapter trimming

PAR-CLIPのリードはアダプター配列の一部が含まれているので、Cutadaptを利用してそれを除きます。 アダプター配列の設定はサンプルに応じて変更が必要です。

どのようなアダプター配列がリードに混入しているかどうか調べるには、ダウンロード時に参照したNCBI GEOの各サンプルのページから得るか、もしくは論文のMaterial & Methodsを参照して得ます。

今回は、論文から情報を得ました。Ribo-seqで用いられるアダプター配列はほとんど同じで、下記の論文に記載されている、TCGTATGCCGTCTTCTGCTTGという配列です。

Hafner, et al. Methods, 44:3-12 (2008);
https://www.ncbi.nlm.nih.gov/pubmed/18158127

まず、TCGTATGCCGTCTTCTGCTTGというアダプター配列がそもそもFASTQファイル内に保存されている各リードに含まれているかどうか、目で確認したいと思います。

$ less Ribo-Seq_HEK293_Cell_Control_SRR1630831.fastq

ここでは、lessコマンドでFASTQファイルの中身を見ています。lessで表示したとき、十字キーでさらに下の情報も見ることができます。

また、/に続けて文字列を入力してEnterを押すと、その文字列を含む列を検索することができます。アダプター配列全長を検索にかけるとヒットしにくくなるので、5'end側から6-7bpぐらいの配列で検索にかけるとよいかもしれません(TCGTATGとか)。

slogin.hgc.jp_22 - Tera Term VT 2017-01-18 17.29.15.png (126.9 kB)

検索した文字列と一致する箇所に、このようにハイライトがつきます。

slogin.hgc.jp_22 - Tera Term VT 2017-01-18 17.30.28.png (165.7 kB)

上図では、今回のサンプルとは異なるサンプルを見ています。

実行例

$ cutadapt  -m 10 -a TCGTATGCCGTCTTCTGCTTG \
  Ribo-Seq_HEK293_Cell_Control_SRR1630831.fastq > Ribo-Seq_HEK293_Cell_Control_SRR1630831_1_trimmed_adapter.fastq 2>> ./log_Ribo-Seq_HEK293_Cell_Control_SRR1630831.txt
  • -f: フォーマットの指定。
  • -m: トリミング後のリードの最低配列長。例えば、10と指定すると、トリミング後にリード長が10未満のリードは排除する。
  • -a: 3'側にライゲーションされている、指定したアダプター配列を除去する。

5. Quality filtering

FASTQファイル中にクオリティスコアの低いリードが含まれている場合、FASTX-toolkitを用いてクオリティの低い塩基及びリードを除去します。

コード例

$ fastq_quality_trimmer -Q33 -t 20 -l 18 -i ./Ribo-Seq_HEK293_Cell_Control_SRR1630831_1_trimmed_adapter.fastq | fastq_quality_filter -Q33 -q 20 -p 80 -o Ribo-Seq_HEK293_Cell_Control_SRR1630831_2_filtered.fastq
fastq_quality_trimmerのパラメータ。
  • -Q: Phred quality scoreのバージョン指定(Solexa, Illumina 1.3+, Illumina 1.5+といったかなり古いバージョンのFASTQファイルでは'64'を指定。最近のFASTQファイルは'33'と指定しておけばOK)。
  • -t: 指定したPhred quality scoreを下回る塩基をトリミングする。
  • -l: トリミング後の最低リード長。
fastq_quality_filterのパラメータ。
  • -q 20 -q 80: リードの80%でPhred quality scoreが20を下回る場合、そのリードを排除する。

6. リボソームRNA由来のリードを除く

リボソームをIPしている関係で、Ribo-seqのFASTQファイルにはある程度リボソームRNA由来のコンタミしています。そのため、ゲノムにマッピングする前に、リボソームRNA由来のリードを除去します。

まず、リボソームRNAの配列を用意します。 NCBIの登録されているX12811.1| Human 5S DNAU13369.1|HSU13369 Human ribosomal DNA complete repeating unitの配列情報を使います。 下記のURLからFASTA形式のデータをコピペしてFASTAファイルをつくります。

Human 5S DNA

https://www.ncbi.nlm.nih.gov/nuccore/23898

Human ribosomal DNA complete repeating unit

https://www.ncbi.nlm.nih.gov/nuccore/555853

上記のrRNAのFASTA形式のデータをcontam_Ribosomal_RNA.faとしてまとめます。

rRNAを除去するために、FASTQファイルに格納されている各リードをそれらの配列にアライメント(マッピング)して、それらの配列にマッピングされないリードを抽出します。こうすることで、rRNAに由来しないリードのみをもとのFASTQファイルから抽出することができます。

STARと呼ばれるソフトでマッピングさせるために、まず、rRNAのIndexファイルを用意する必要があります。以下で、先ほど作成したFASTAファイルをもとに、STAR用のIndexファイルを作成しています。

実行例

$ mkdir ./STAR_Index_rRNA_contam
$ STAR --runThreadN 8 --runMode genomeGenerate --genomeDir ./STAR_Index_rRNA_contam \
     --genomeFastaFiles ./contam_Ribosomal_RNA.fa

まず、Indexファイルを保存するディレクトリをmkdirコマンドで作成します。ここでは、STAR_Index_rRNA_contamという名前のディレクトリを用意しました。

STARのパラメータ。
  • --runThreadN: 使用するコア数を指定。
  • --runMode: genomeGenerateを指定して、Indexファイルを作成するモードに設定。
  • --genomeDir: 出力先のディレクトリを指定。
  • --genomeFastaFiles: Indexを作成したいFASTAファイルを指定。ここでは、先ほど用意したリピート配列とrRNAの配列データ(FASTAファイル)を指定する。

rRNAを除く

Indexファイルを作成した後、rRNAへのマッピングを行います。マッピングされなかったリードについては、FASTQファイルとして出力されるようにオプションを指定します。

実行例

$ STAR --runMode alignReads --runThreadN 8 --genomeDir ./STAR_Index_rRNA_contam \
--readFilesIn ./Ribo-Seq_HEK293_Cell_Control_SRR1630831_2_filtered.fastq \
--outSAMunmapped Within --outFilterMultimapNmax 30 --outFilterMultimapScoreRange 1 \
--outFileNamePrefix ./Ribo-Seq_HEK293_Cell_Control_SRR1630831_3_rm_repbase_rrna.fastq \
--outSAMattributes All --outStd BAM_Unsorted --outSAMtype BAM Unsorted \
--outFilterType BySJout --outReadsUnmapped Fastx --outFilterScoreMin 10 \
--alignEndsType EndToEnd > ./Ribo-Seq_HEK293_Cell_Control_SRR1630831_3_repbase_rrna_comtam.bam
$ mv ./Ribo-Seq_HEK293_Cell_Control_SRR1630831_3_rm_repbase_rrna.fastqUnmapped.out.mate1 ./Ribo-Seq_HEK293_Cell_Control_SRR1630831_3_rm_repbase_rrna.fastq
STARのパラメータ。
  • --runMode: alignReadsを指定して、アライメントを行うモードに設定。
  • --runThreadN: 使用するコア数を指定。
  • --genomeDir: Indexファイルの保存されているディレクトリを指定。
  • --readFilesIn: マッピングさせたいFASTQファイルを指定。
  • --outSAMunmapped Within: 出力されるBAMファイルにマッピングされなかったリード情報も含める。
  • --outFilterMultimapNmax: 複数箇所にマッピング(Multi-mapping)されることをどこまで許容するか設定する。指定した数を超える箇所にマッピングされたリードは排除する。
  • --outFilterMultimapScoreRange: Multi-mappingアライメントのスコアの範囲。複数箇所マッピングされてもアライメントスコアが高ければ残す。
  • --outFileNamePrefix: 出力ファイルのPrefixを指定。
  • -outSAMattributes: 基本情報以外に、BAMファイルに追加する情報を指定。
  • --outStd BAM_Unsorted: 出力されるBAMファイルをソートしない。
  • --outSAMtype BAM Unsorted: SAMファイルでなく、BAMファイルとしてマッピングされた情報を直接出力する。ただし、ソートはしない。
  • --outFilterType BySJout: SJ.out.tabファイルとして出力される信頼性の高いExon junctionをまたぐリードのみを残す。Filteringをクリアできないリードは排除する。
  • --outReadsUnmapped Fastx: マッピングされなかったリードをFASTQファイルとして出力する。
  • --outFilterScoreMin 10: アライメントスコアが10を下回るリードは排除する。
  • --alignEndsType EndToEnd: End-to-Endアライメントを行う(Localアライメントでない)。

7. Quality check

rRNAに由来するリードを除いた後、フィルタリング後のFASTQファイルをFastQCを用いて再確認します。

実行例

$ mkdir fastqc_${file}_filtered
$ fastqc -o ./fastqc_Ribo-Seq_HEK293_Cell_Control_SRR1630831_filtered ./Ribo-Seq_HEK293_Cell_Control_SRR1630831_3_rm_repbase_rrna.fastq -f fastq

8. Mapping

Indexファイルの作成

ここでも先ほどのマッピング時と同じように、GenomeとTranscriptomeのSTAR用のIndexファイルを作成する必要があります。このIndexファイルの作成には、50G程度のメモリが必要になるので注意してください。

まず、Human Genome(hg38)のFASTAファイルのダウンロードしてきます。 各染色体ごとにファイルが用意されているので、catコマンドでダウンロードしたすべてのファイルをマージして、hg38.faという名前で出力します。

$ for file in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 X Y M
  do
    wget http://hgdownload.soe.ucsc.edu/goldenPath/hg38/chromosomes/chr${file}.fa.gz
    gunzip chr${file}.fa.gz
  done

$ cat chr1.fa chr2.fa chr3.fa chr4.fa chr5.fa chr6.fa chr7.fa chr8.fa chr9.fa chr10.fa chr11.fa chr12.fa chr13.fa chr14.fa chr15.fa chr16.fa chr17.fa chr18.fa chr19.fa chr20.fa chr21.fa chr22.fa chrX.fa chrY.fa chrM.fa > hg19.fa

Transcriptomeの情報として、Gencodeのアノテーション情報を利用します。
https://www.gencodegenes.org/releases/24.html

上記のサイトにアクセスすると、さまざまなデータが置いてあるが基本的にgencode.v19.annotation.gtfというメインのアノテーション情報を利用すればOKです。
ftp://ftp.sanger.ac.uk/pub/gencode/Gencode_human/release_24/gencode.v24.annotation.gtf.gz

wgetコマンドで該当のファイルをダウンロードし解凍します。

$ wget ftp://ftp.sanger.ac.uk/pub/gencode/Gencode_human/release_24/gencode.v24.annotation.gtf.gz
$ tar zxvf ftp://ftp.sanger.ac.uk/pub/gencode/Gencode_human/release_24/gencode.v24.annotation.gtf.gz

カレントディレクトリにgencode.v24.annotation.gtfが保存されます。

最後に、STARを使ってhg24+Gencode_v24のIndexファイルを作成します。

ここまでで、ゲノムとトランスクリプトームのIndexファイル用意できたので、いよいよSTARを用いて各シークエンスリードマッピングします。

実行例

$ mkdir hg38_Genome_Gencode_v24
$ STAR --runThreadN 8 --runMode genomeGenerate --genomeDir hg38_Genome_Gencode_v24 \
     --genomeFastaFiles ./hg38.fa --sjdbGTFfile ./gencode.v24.annotation.gtf --sjdbOverhang 100
STARのパラメータ。
  • --runThreadN: 使用するコア数を指定。
  • --runMode: genomeGenerateを指定して、Indexファイルを作成するモードに設定。
  • --genomeDir: 出力先のディレクトリを指定。
  • --genomeFastaFiles: Indexを作成したいFASTAファイルを指定。ここでは、先ほど用意したヒトゲノムのデータ(hg19、FASTAファイル)を指定する。
  • --sjdbGTFfile: STARではアノテーション情報のGTFファイルからExon junctionの情報を抽出する。ここでは、先ほどダウンロードしたgencode.v19.annotation.gtfを使用する。
  • --sjdbOverhang 100: Exon junctionの周囲、100塩基のゲノム配列をIndex化する。マッピングに使用するFASTQファイルのリード長と設定すると良い。公式のおすすめは100

ゲノムとトランスクリプトームへのマッピング

Indexファイルが用意できたので、ゲノム(hg38)とトランスクリプトーム(Gencode v24)にリードをマッピングします。

実行例

$ mkdir STAR_output_Ribo-Seq_HEK293_Cell_Control_SRR1630831
$ STAR --runMode alignReads --runThreadN 8 --genomeDir ${indexFile} \
  --readFilesIn ./Ribo-Seq_HEK293_Cell_Control_SRR1630831_3_rm_repbase_rrna.fastq \
  --outFilterMultimapNmax 8 --alignSJoverhangMin 8 --alignSJDBoverhangMin 1 --sjdbScore 1 \
  --outFilterMismatchNmax 4 --alignIntronMin 20 --alignIntronMax 1000000 --alignMatesGapMax 1000000 \
  --outFileNamePrefix ./STAR_output_Ribo-Seq_HEK293_Cell_Control_SRR1630831/Ribo-Seq_HEK293_Cell_Control_SRR1630831_4_STAR_result_ \
  --outSAMattributes All --outSAMtype BAM SortedByCoordinate --limitBAMsortRAM ${maxRAM} \
  --outFilterType BySJout --outReadsUnmapped Fastx
STARのパラメータ。
  • --outSAMtype BAM SortedByCoordinate: SAMファイルでなく、BAMファイルとしてマッピングされた情報を直接出力する。出力ファイルは染色体の座標でソートする。
  • --limitBAMsortRAM 32000000000: BAMファイルをソートするときに割り当てられるメモリの上限を設定。

9. RiboTaperによるORF予測

80Sリボソームと結合するRNA領域の長さは28-30nt程度であることが知られており、実際にRibo-seqのリード長も同じ長さを取っています。

また、コドンは3塩基ごとに読まれていくので、マッピングされたシークエンスリードの分布には、ORFの読み枠に合わせてバイアスがかかっていることが知られています。

例えば、RibosomeのP-siteにmRNAのAUG配列がロードされている場合、シークエンスリードの5'末から12nt下流の位置を1とすると、AUGのAがそれに該当します(13-15nt目がリボソームのP-siteの位置になります)。

------------AUG---------------
<-- 12nt -->1<----15/16nt---->

Ribo-seqのデータでは、先ほど定義したP-siteの相対的な位置(1: 5'末から13nt目)に、コドンの最初の塩基が来るケースが多いです(これがマッピングされたリードの偏り)。 https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4193932/

RiboTaperでは、上記のようなRibo-seqにおけるシークエンスリードの分布の偏りから、リードがマッピングされた領域がORFとしてリボソームに読まれて翻訳されている領域かどうか判断しています。

また、RiboTaperでは、このシークエンスリードマッピングバイアスを事前にチェックするプログラムが用意されているので、それを使ってデータのクオリティに問題がないか最初に確認しましょう。

# RiboTaper用のアノテーション情報の準備

まず、ORFなどのアノテーション情報をRiboTaper用に用意する必要があります。RiboTaper側で用意されているcreate_annotations_files.bashシェルスクリプトを用いて、GencodeなどのGTFファイルからRiboTaper用のアノテーション情報を作成します。

$ create_annotations_files.bash  \
  ./gencode.v24.basic.annotation.gtf \
  ./hg38.fa \
  true \
  true \
  /home/akimitsu/software/RiboTaper_v1.3/annotation/hg38_Gencode_v24 \
  /home/akimitsu/software/RiboTaper_v1.3/bedtools_dir \
  /home/akimitsu/software/RiboTaper_v1.3/scripts
  • 1つ目の引数: アノテーション情報のGTFファイルを指定。
  • 2つ目の引数: ヒトゲノム(hg38)のFASTAファイルを指定。
  • 3つ目の引数: CCDS annotationを利用するかどうか(Gencodeのデータを推奨)。
  • 4つ目の引数: Appris annotationを利用するかどうか(Gencodeのデータを推奨)。
  • 5つ目の引数: 保存先のディレクトリを指定。
  • 6つ目の引数: 使用するBedtoolsのパスを指定。
  • 7つ目の引数: 使用するRiboTaper用のスクリプトのパスを指定。

CCDSとApprisについては下記のサイトを参照のこと。 https://www.gencodegenes.org/gencode_tags.html

# Ribo-seqデータのチェック

冒頭で説明したとおり、まず、マッピングしたRibo-seqのBAMファイルをチェックします。

実行例

$ create_metaplots.bash \
  ./STAR_output_Ribo-Seq_HEK293_Cell_Control_SRR1630831/Ribo-Seq_HEK293_Cell_Control_SRR1630831_4_STAR_result_Aligned.sortedByCoord.out.bam \
  /home/akimitsu/software/RiboTaper_v1.3/annotation/hg38_Gencode_v24/start_stops_FAR.bed \
  metaplots_result \
  /home/akimitsu/software/RiboTaper_v1.3/bedtools_dir/ \
  /home/akimitsu/software/RiboTaper_v1.3/scripts/
  • 1つ目の引数: マッピングしたRibo-seqのBAMファイルを指定。
  • 2つ目の引数: 先ほど作成したRiboTaper用のアノテーション情報のstart_stops_FAR.bedというファイルを指定。
  • 3つ目の引数: 保存するファイルの名称を指定。
  • 4つ目の引数: 使用するBedtoolsのパスを指定。
  • 5つ目の引数: 使用するRiboTaper用のスクリプトのパスを指定。

実行すると、リード長ごとに、開始コドンと終止コドンの周辺のリードの分布を図にしてくれます。

緑色のバーがORFの読み枠(例えば、AUGのA)と一致しているリードの数になります。結果の図を見たときに、良い例のように緑色のバーにリードの分布が偏っているのが使えるシークエンスデータになります。

良い例

metaplots_result_28.pdf - Adobe Acrobat Reader DC 2016-09-01 15.47.32.png (103.9 kB)

一方で、悪い例のようにリードの分布にバイアスがイマイチかかっていないサンプルは、ノイズの大きいデータになるので、RiboTaperによる解析には使えません。

悪い例

metaplots_result_28.pdf - Adobe Acrobat Reader DC 2016-09-01 15.48.43.png (107.0 kB)

データのクオリティに問題がないと判断できたら、RiboTaperのシェルスクリプトを実行します。

RiboTaperの実行

RiboTaperには計算上のボトルネックが存在したり、プログラムが不安定で途中で処理が止まってしまったりします。

今回は、スクリプトを修正したり、処理を細分化して実行時にエラーが起こらないようにしたファイルを用意したので、そちらを使用した場合の実行例を示したいと思います。

とりあえず、下記のサイトにおいてあるscriptsディレクトリを、自分の環境のRiboTaper_v1.3の直下に上書きすればOKです。
https://github.com/Imamachi-n/NGS-Tutorial/tree/master/Ribo-seq_RiboTaper
(注: RiboTaperのソースコードGNU General Public Licenseのもとに配布されています。)

参考(スクリプトの修正箇所)

念のため、スクリプトの修正箇所について言及しておきます。 修正を加えている点はすべて、Rスクリプトを実行している箇所です。

もとのRスクリプトでは、1行目が、

#!/usr/bin/Rscript

となっており、スクリプトの実行はRscriptを利用したコマンドライン上での実行を行っていません。 例えばこんな感じ。

./hoge.R

そのため、Rscript/usr/bin/Rscriptに存在する環境下では機能しますが、Biocondaなどでローカル環境にRをインストールした場合には機能しません。

そこで、以下のように書き換えます。

Rscript ./hoge.R

こうすることで、/usr/bin/RscriptにRscriptがなくても、Rスクリプトが機能します。

修正箇所は、以下のとおりです。

CCDS_orf_finder.R (821行目)
# syst_scr<-paste(scr,"bed_tocheck_ccds",sep = " ")
scr2<-paste("Rscript",scr,sep=" ")
syst_scr<-paste(scr2,"bed_tocheck_ccds",sep = " ")
NONCCDS_orf_finder.R (738行目)
# syst_scr<-paste(scr,"bed_tocheck_nonccds",sep = " ")
scr2<-paste("Rscript",scr,sep=" ")
syst_scr<-paste(scr2,"bed_tocheck_nonccds",sep = " ")
Ribotaper_ORF_find.R (105-121行目)
# $scripts_dir"/CCDS_orf_finder.R" $annot_dir $scripts_dir $bedtools_dir $n_of_cores
Rscript $scripts_dir"/CCDS_orf_finder.R" $annot_dir $scripts_dir $bedtools_dir $n_of_cores

echo "NONCCDS ORF finding..."

# $scripts_dir"/NONCCDS_orf_finder.R" $annot_dir $scripts_dir $bedtools_dir $n_of_cores
Rscript $scripts_dir"/NONCCDS_orf_finder.R" $annot_dir $scripts_dir $bedtools_dir $n_of_cores

# Groups ORFs and creates BED files + protein fasta database

echo "Grouping ORFs and creating protein fasta database..."

# $scripts_dir"/create_protein_db.R"
Rscript $scripts_dir"/create_protein_db.R"

# makes summary plot for the found ORFs

echo "Summarizing ORF finding results"

# $scripts_dir"/ORF_final_results.R"
Rscript $scripts_dir"/ORF_final_results.R"
create_annotations_files.bash (220行目, 225行目, 235行目)
# $scripts_dir_full"/write_startstops.R"
Rscript $scripts_dir_full"/write_startstops.R"
# $scripts_dir_full"/gtf_to_start_stop_tr.R" 
Rscript $scripts_dir_full"/gtf_to_start_stop_tr.R" 
# $scripts_dir_full"/genes_coor.R"
Rscript $scripts_dir_full"/genes_coor.R"
create_metaplots.bash (68行目)
# $scripts_dir"metag.R" $3
Rscript $scripts_dir"metag.R" $3
Ribotaper.sh (135-153行目, 167-177行目)

今回は、このスクリプトを分割して実行していますが、シェルスクリプトの中身は以下のように修正しています。

# $scripts_dir"/tracks_analysis.R" ccds $scripts_dir $n_of_cores 
Rscript $scripts_dir"/tracks_analysis.R" ccds $scripts_dir $n_of_cores 

echo "Running calculations exons_ccds..."

# $scripts_dir"/tracks_analysis.R" exonsccds $scripts_dir $n_of_cores 
Rscript $scripts_dir"/tracks_analysis.R" exonsccds $scripts_dir $n_of_cores 

echo "Running calculations nonccds..."

# $scripts_dir"/tracks_analysis.R" nonccds $scripts_dir $n_of_cores 
Rscript $scripts_dir"/tracks_analysis.R" nonccds $scripts_dir $n_of_cores 

# annotates the exons relative to ccds regions TO BE ADAPTED, CHECK WHICH FILES THEY NEED.

echo "Annotate exons..."

# $scripts_dir"/annotate_exons.R" $annot_dir $scripts_dir $n_of_cores 
Rscript $scripts_dir"/annotate_exons.R" $annot_dir $scripts_dir $n_of_cores 

echo "Making quality plots..."

# $scripts_dir"/quality_check.R" $annot_dir
Rscript $scripts_dir"/quality_check.R" $annot_dir
# $scripts_dir"/CCDS_orf_finder.R" $annot_dir $scripts_dir $bedtools_dir $n_of_cores
Rscript $scripts_dir"/CCDS_orf_finder.R" $annot_dir $scripts_dir $bedtools_dir $n_of_cores

echo "NONCCDS ORF finding..."

# $scripts_dir"/NONCCDS_orf_finder.R" $annot_dir $scripts_dir $bedtools_dir $n_of_cores
Rscript $scripts_dir"/NONCCDS_orf_finder.R" $annot_dir $scripts_dir $bedtools_dir $n_of_cores

# Groups ORFs and creates BED files + protein fasta database

echo "Grouping ORFs and creating protein fasta database..."

# $scripts_dir"/create_protein_db.R"
Rscript $scripts_dir"/create_protein_db.R"

今回実行に使うRiboTaperのシェルスクリプトは以下の通りに分割しておきます。
https://github.com/Imamachi-n/NGS-Tutorial/tree/master/Ribo-seq_RiboTaper/scripts

  • Ribo-seq-RiboTaper-3-define_ORF_STEP1.sh
  • Ribo-seq-RiboTaper-3-define_ORF_STEP2-1.sh
  • Ribo-seq-RiboTaper-3-define_ORF_STEP2-2.sh
  • Ribo-seq-RiboTaper-3-define_ORF_STEP2-3.sh
  • Ribo-seq-RiboTaper-3-define_ORF_STEP3.sh
  • Ribo-seq-RiboTaper-3-define_ORF_STEP4.sh

上記が、実行するためのシェルスクリプトになります。これらを、ribotaperscriptsディレクトリにあらかじめコピーしておきます。

実行時に注意すべき点は、RiboTaperはマルチコアで処理させる場合、使用するCPUのコア数によりますが、実行時に50-60GB程度のメモリを確保したほうがよいです(メモリが不足すると途中で処理が止まってしまいます)。

以下では、コマンドライン上で1つずつ実行したときの例を示します。 まず、最初に作成したribotaperの仮想環境に移行します。

source activate ribotaper
STEP1(所要時間: 2.5hr)
Ribotaper_step1.sh \
  ./STAR_output_Ribo-Seq_HEK293_Cell_Control_SRR1630831/Ribo-Seq_HEK293_Cell_Control_SRR1630831_4_STAR_result_Aligned.sortedByCoord.out.bam \
  ./STAR_output_RNA-Seq_HEK293_Cell_SRR1630838/RNA-Seq_HEK293_Cell_SRR1630838_4_STAR_result_Aligned.sortedByCoord.out.bam \
  /home/akimitsu/software/RiboTaper_v1.3/annotation/hg38_Gencode_v24 \
  27,28,29 \
  12,12,12 \
  /home/akimitsu/software/RiboTaper_v1.3/scripts \
  /home/akimitsu/software/RiboTaper_v1.3/bedtools_dir \
  8
  • 1つ目の引数: Ribo-seqデータのBAMファイルを指定。
  • 2つ目の引数: RNA-seqデータのBAMファイルを指定。
  • 3つ目の引数: 先ほど作成したRiboTaper用のアノテーション情報のディレクトリを指定。
  • 4つ目の引数: 使用するリード長(ノイズでなく、Ribosomeが結合していたリードのみを選抜)を指定(カンマ区切り)。先ほどのRibo-seqデータのチェック時に、緑色のバーに偏ってリードがマッピングされたリード長のみを選抜してくる。
  • 5つ目の引数: P-sitesの計算に使用するOffset値を指定(カンマ区切り)。
  • 6つ目の引数: 使用するRiboTaper用のスクリプトのパスを指定。
  • 7つ目の引数: 使用するBedtoolsのパスを指定。
  • 8つ目の引数: 使用するCPUのコア数。

実行後、以下のファイル群が得られるはずです。

P_sites_all
Centered_RNA
RIBO_unique_counts_ccds
RIBO_best_counts_ccds
RNA_unique_counts_ccds
RNA_best_counts_ccds
RIBO_unique_counts_exonsccds
RIBO_best_counts_exonsccds
RNA_unique_counts_exonsccds
RNA_best_counts_exonsccds
RIBO_unique_counts_nonccds
RIBO_best_counts_nonccds
RNA_unique_counts_nonccds
RNA_best_counts_nonccds

# data_tracks/
Centered_RNA_tracks_ccds
Centered_RNA_tracks_exonsccds
Centered_RNA_tracks_nonccds
P_sites_all_tracks_ccds
P_sites_all_tracks_exonsccds
P_sites_all_tracks_nonccds
Psit_Ribo_Rna_Cent_tracks_ccds
Psit_Ribo_Rna_Cent_tracks_exonsccds
Psit_Ribo_Rna_Cent_tracks_nonccds
RIBO_tracks_ccds
RIBO_tracks_exonsccds
RIBO_tracks_nonccds
RNA_tracks_ccds
RNA_tracks_exonsccds
RNA_tracks_nonccds
index_tracks_ccds
index_tracks_exonsccds
index_tracks_nonccds
STEP2-1, 2-2, 2-3(所要時間: 2.5hr)

STEP2以降も同様に実行するだけです。STEP2-1, 2-2, 2-3は、並行して実行して構いません。Sun Grid Engineなどの並列計算システムを利用している場合、計算時間を短縮するために、並行してジョブを実行するようにしましょう。

以下には、STEP2-1の実行例を示しました。

Ribotaper_step2-1.sh \
  ./STAR_output_Ribo-Seq_HEK293_Cell_Control_SRR1630831/Ribo-Seq_HEK293_Cell_Control_SRR1630831_4_STAR_result_Aligned.sortedByCoord.out.bam \
  ./STAR_output_RNA-Seq_HEK293_Cell_SRR1630838/RNA-Seq_HEK293_Cell_SRR1630838_4_STAR_result_Aligned.sortedByCoord.out.bam \
  /home/akimitsu/software/RiboTaper_v1.3/annotation/hg38_Gencode_v24 \
  27,28,29 \
  12,12,12 \
  /home/akimitsu/software/RiboTaper_v1.3/scripts \
  /home/akimitsu/software/RiboTaper_v1.3/bedtools_dir \
  8

実行後、以下のファイル群が得られるはずです。

results_ccds
results_exonsccds
results_nonccds
STEP3(所要時間: 40min)
Ribotaper_step3.sh \
  ./STAR_output_Ribo-Seq_HEK293_Cell_Control_SRR1630831/Ribo-Seq_HEK293_Cell_Control_SRR1630831_4_STAR_result_Aligned.sortedByCoord.out.bam \
  ./STAR_output_RNA-Seq_HEK293_Cell_SRR1630838/RNA-Seq_HEK293_Cell_SRR1630838_4_STAR_result_Aligned.sortedByCoord.out.bam \
  /home/akimitsu/software/RiboTaper_v1.3/annotation/hg38_Gencode_v24 \
  27,28,29 \
  12,12,12 \
  /home/akimitsu/software/RiboTaper_v1.3/scripts \
  /home/akimitsu/software/RiboTaper_v1.3/bedtools_dir \
  8

実行後、以下のファイル群が得られるはずです。

results_nonccds_annot
all_calculations_ccdsgenes_annot_new
quality_check_plots.pdf
STEP4(所要時間: 8-9hr)
Ribotaper_step4.sh \
  ./STAR_output_Ribo-Seq_HEK293_Cell_Control_SRR1630831/Ribo-Seq_HEK293_Cell_Control_SRR1630831_4_STAR_result_Aligned.sortedByCoord.out.bam \
  ./STAR_output_RNA-Seq_HEK293_Cell_SRR1630838/RNA-Seq_HEK293_Cell_SRR1630838_4_STAR_result_Aligned.sortedByCoord.out.bam \
  /home/akimitsu/software/RiboTaper_v1.3/annotation/hg38_Gencode_v24 \
  27,28,29 \
  12,12,12 \
  /home/akimitsu/software/RiboTaper_v1.3/scripts \
  /home/akimitsu/software/RiboTaper_v1.3/bedtools_dir \
  8

実行後、以下のファイル群が得られるはずです。

# ORFs_CCDS/
# ORFs_NONCCDS/
  • ORF_max
  • ORF_max_filt: filtered for multimapping and non-coding nonccds_coding_ORFs (see below) (recommended for further analysis)
  • protein_db_max.fasta: (for proteomics search, not filtered for multimapping)
  • translated_ORFs_sorted.bed: corresponding to ORF_max
  • translated_ORFs_filtered_sorted.bed: corresponding to ORF_max_filt filtered for multimapping and non-coding nonccds_coding_ORFs (see below) (recommended for further analysis)
  • ORFs_genes_found: tab-separated values for number of ORFs found and their corresponding genes
  • Final_ORF_results.pdf: pdf file with length/coverage distributions for different ORF categories.

太文字で書かれたファイルが予測されたORFになります。ファイルの中身を確認すると以下の通り。

f:id:biodata:20170331214311p:plain

詳細については言及しませんが、Categoryを確認すると、主に、

  • ORFs_ccds
  • uORF
  • ncORFS

があります。

ORFs_ccdsはmRNA由来のCanonical ORFを、uORFはmRNAの上流5'UTR中に存在するUpstream ORFを、ncORFsはNoncoding RNA中に予測されるORFを指しています。

PAR-CLIP解析データ(Peak calling, Motif discovery, Peak annotation)

概要

CLIP-seqとは、RNA結合タンパク質(RBP)の結合サイトを網羅的に同定する手法です。CLIP-seqには主に、HITS-CLIP、iCLIP、PAR-CLIP、eCLIPの4種類が存在します。今回は、中でも幅広く利用されているPAR-CLIPのデータについて取り上げたいと思います。

ここでは、データのダウンロード方法からLinuxを用いたデータ解析まで、PAR-CLIPのデータ解析の詳細をStep by Stepで説明します。

ただし、基本的なLinuxのコマンド操作は理解している前提で説明を行います。

このTutorialを通した到達目標

PAR-CLIPのデータ解析に対する理解

  • SRAファイルを解凍してFASTQファイルを生成することができる。
  • アダプター配列を各リードからトリミングすることができる。
  • リピート配列に該当するリードをFASTQファイルから除外することができる。
  • FASTQファイルをゲノムとトランスクリプトームにマッピングすることができる。
  • マッピングされたリードのStrandnessを確認することができる。
  • BAMファイルからBase Substitution frequency(T>C置換の割合)を計算することができる。
  • UCSC genome browser上でデータを可視化することができる。
  • PAR-CLIPのデータからPARalyzerを用いてPeak callを行うことができる。
  • MEMEでモチーフ検索を行うことができる。

NGSで扱う種々のデータに対する理解

  • FASTQ, BAM/SAM, BedGraph, BED, GTFがそれぞれどのようなデータか説明することができる。
  • (特に)SAMファイルからMutationの情報を取得することができる。
  • FastQCから得られたシークエンスリードのクオリティデータから、FASTQファイルの状態を確認できる。
  • STARのIndexファイルを作成することができる。
  • MEMEに用いるMarkov Backgroundモデルを作成することができる。

PAR-CLIP法の特徴

シークエンスのデータを解析を始める前に、PAR-CLIPの手法の特徴について概説します。

PAR-CLIPでは一般的に、ウリジンのアナログである4-チオウリジン(4SU)を細胞培地中に添加し細胞に取り込ませ、4SUを含むRNAを細胞内で転写させます(4SUによるラベル標識)。

次に、長波長の紫外線(UV 365 nm)を細胞に照射させることにより、RNA結合タンパク質とRNAとの間で架橋反応(共有結合)を起こします。

RNAase処理、特定のRNA結合タンパク質(RBP)をIP、Protease K処理した後、精製して得られたRNA(RBPと結合しているサイト)を次世代シーケンサーのサンプルとして使用します。

精製したRNAからDNAライブラリを作成する過程(逆転写・cDNA合成)で4SUがシトシン(C)に置換されます。そのため、マッピング後に検出される各ピークを形成するリードにこのT→C置換が入っていた場合、その領域でRBPと架橋していた可能性が高いといえます。

このことから、PARalyzerを用いたPeak callでは、このT→C置換を指標にNon-specificでないピークを検出しています。

使用するデータ

Genome-wide analysis of pre-mRNA 3' end processing reveals a decisive role of human cleavage factor I in the regulation of 3' UTR length: CLIP

https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE37398

上記のデータのうち、3'endのcleavageに関与するRNA結合タンパク質である「CstF-64」のPAR-CLIPデータを解析する。詳細は下記に載っている。
https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSM917676

使用するソフトウェア

解析ワークフロー

今回の解析の流れを以下にまとめました。 PowerPoint スライド ショー - [2016-08-22_NGS_workflow.pptx] 2017-01-19 14.53.30.png (190.0 kB) 上記の解析はENCODEプロジェクトのeCLIP解析を参考に作成しました。
https://www.encodeproject.org/documents/dde0b669-0909-4f8b-946d-3cb9f35a6c52/@@download/attachment/eCLIP_analysisSOP_v1.P.pdf

サンプルコード

Github上に必要なファイルはすべて置いてあります。
https://github.com/Imamachi-n/NGS-Tutorial/tree/master/PAR-CLIP_Tutorial_CstF64

シェルスクリプトを使用するときの注意点

権限の問題

実行権限をシェルスクリプトに与えた後、実行すること。

$ chmod 755 <hoge.sh>

改行コードの問題

WindowsLinuxで改行コードが異なるため、Windows-Linux間でファイルのやり取りをしていると、改行コードの違いに起因する問題が生じることがある。対処法としては、テキストエディタの設定を変えることでLinuxの改行コードを使用する。

ここではAtomと呼ばれるテキストエディタでの設定方法を説明する。

  • [Ctrl] + [ , ](カンマ)キーを押して、Settingsの画面を呼び出す。
  • 左のメニューから、Packagesをクリック。
  • Installed Packagesでline-ending-selectorと検索。
  • Core Packagesの項目から、line-ending-selectorのSettingsをクリック。
  • 設定画面で、Default line endingをLFに変更。

Settings — C__Users_Naoto_OneDrive_NGS解析_NGS-Tutorial_RNA-seq_Tutorial — Atom 2017-01-31 11.20.21.png (250.6 kB)

これで、新規に作成したファイルの改行コードがデフォルトでLF(Linuxの改行コード)になります。

各ステップの説明

0. 必要なソフトウェアのインストール

まず、前述したソフトウェアをbiocondaを用いて自身の解析環境にインストールします。 biocondaのインストールに関しては、下記の記事を参照のこと。

imamachi-n.hatenablog.com

$ conda install sra-tools
$ conda install fastqc
$ conda install cutadapt
$ conda install fastx_toolkit
$ conda install bowtie2
$ conda install star
$ conda install samtools
$ conda install bedtools
$ conda install paralyzer
$ conda install meme

1. SRAファイルのダウンロード

NGSデータはシークエンスされたリード(塩基配列)の情報とクオリティスコアのデータをまとめたFASTQ形式のファイルとして保存されています。

FASTQファイルの詳細についてはこちらを参照。
https://en.wikipedia.org/wiki/FASTQ_format

FASTQデータは非常に大きいファイルなので、NCBI GEOでは、FASTQファイルを圧縮したSRAファイルと呼ばれるファイル形式でデータを公開しています。

まず、下記のURLにアクセスすると、
https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSM917676

サンプル名、使用したCell lineや抗体、簡単な実験プロトコルなどの情報が見ることができます。

GEO Accession viewer - Google Chrome 2017-01-13 11.12.08.png (273.9 kB)

そこから、さらに下を見ていくと、SRAファイルの置き場所があります。 Downloadの(ftp)をクリックして、SRAファイルをダウンロードします。

GEO Accession viewer - Google Chrome 2017-01-13 11.12.38.png (141.2 kB)

SRR488740をクリック。 ブラウザによって見え方が異なります。ここではGoogle Chromeを使っています。

_sra_sra-instant_reads_ByExp_sra_SRX_SRX143_SRX143276 のインデックス - Google Chrome 2017-01-14 23.22.04.png (44.8 kB)

SRR488740.sraのURLをコピー。

_sra_sra-instant_reads_ByExp_sra_SRX_SRX143_SRX143276_SRR488740_ のインデックス - Google Chrome 2017-01-14 23.22.50.png (50.9 kB)

wgetで該当するSRAファイルをダウンロードします。

$ wget ftp://ftp-trace.ncbi.nlm.nih.gov/sra/sra-instant/reads/ByExp/sra/SRX/SRX143/SRX143276/SRR488740/SRR488740.sra

2. SRAファイルからFASTQファイルに変換

先ほどインストールしたSRA Toolkitを使って、NCBI GEOからダウンロードしたSRAファイルをFASTQファイルに展開します。

$ fastq-dump SRR488740.sra
$ mv SRR488740.fastq SRR488740_PAR-CLIP_CstF-64.fastq

カレントディレクトリにSRR488740.fastqファイルが展開されているはずです。次に、mvコマンドを使ってファイル名をSRR488740.fastqからSRR488740_PAR-CLIP_CstF-64.fastqに変更します(SRRのIDだけだと何のファイルかわからなくなるので)。

3. Quality check

FastQCを使って、FASTQファイルに記載されている各リードのクオリティをチェックします。

FASTQファイルはPhred Quality Scoreと呼ばれる指標によって、各塩基のクオリティを記述しています。

詳しくはこちらのサイトを参照のこと。 https://en.wikipedia.org/wiki/Phred_quality_score

実行例

$ mkdir fastqc_SRR488740_PAR-CLIP_CstF-64
$ fastqc -t 8 -o ./fastqc_SRR488740_PAR-CLIP_CstF-64 ./SRR488740_PAR-CLIP_CstF-64.fastq -f fastq

mkdirコマンドでfastqc_SRR488740_PAR-CLIP_CstF-64という名前のディレクトリをカレントディレクトリに作ります。

次に、fastqcを使ってSRR488740_PAR-CLIP_CstF-64.fastqのデータのクオリティをチェックします。 -tオプションで使用するCPUのコア数を指定します。コア数を増やせば単純に計算速度が向上しますが、FastQCではメモリを1コアあたり250MB消費するので、要求できるメモリ量を超えるコア数を指定するとエラーが起こります。

-oオプションで出力先のディレクトリを指定し、-fオプションでInputファイルのファイル形式を指定しています。

FastQCから出力されるデータが、fastqc_SRR488740_PAR-CLIP_CstF-64ディレクトリの中のSRR488740_PAR-CLIP_CstF-64_fastqc.htmlになります。 ファイルをブラウザで開くと以下のようなグラフを確認できます。

Basic Statistics

基本的な統計量が示されています。

  • 全リード数
  • リード長
  • GC contents

などなど

Per base sequence quality

リードの各塩基のクオリティスコアを示しています。 Phred quality scoreがだいたいグリーンの領域(Scoreが28以上)に収まっているかどうか確認します。 結果として、クオリティが低いリードは含まれていないことが確認できます。

ダウンロード.png (8.5 kB)

Per tile sequence quality

フローセルの各タイルごとのクオリティスコアを示しています。

Illumina社製の次世代シーケンサーでは、「フローセル」と呼ばれるガラス基板上でDNA合成反応を行います。このフローセルは「タイル」と呼ばれる単位に区切られており、各タイルごとに塩基配列を決定しています。

シーケンスをかけたときに、例えば特定のタイルに気泡やゴミが入っているとクオリティの低下が見られることがあります。

特定のタイルで著しいクオリティの低下が見られる場合は、シークエンス時に上記のような問題があったと考えられます。

詳しくはこちらの資料を参照のこと。
http://nagasakilab.csml.org/ja/wp-content/uploads/2012/04/Sato_Sugar_JPNreview.pdf

ダウンロード (1).png (8.6 kB)

Per sequence quality scores

各リードの全長のクオリティスコアの分布を示しています。 ダウンロード (2).png (16.2 kB)

Per base sequence content

各塩基のA, T, G, Cの含有量を示しています。 RNA-seqの場合、それぞれの含有量はほぼ25%ずつになりますが、PAR-CLIPのようにRNA結合タンパク質と結合しているRNA配列を抽出してきている場合、それぞれの含有率に偏りが見られます。

ダウンロード (3).png (33.0 kB)

Per sequence GC content

リードのGC contentsの分布を示しています。 ダウンロード (4).png (32.4 kB)

Per base N content

各塩基中に含まれるNの含有率(塩基を読めなかった箇所)を示しています。 ダウンロード (5).png (7.2 kB)

Sequence Length Distribution

リード長の分布を示しています。 ダウンロード (10).png (20.3 kB)

Sequence Duplication Levels

Duplidate readsの含まれている数を示しています。 ダウンロード (6).png (22.9 kB)

Overrepresented sequences

頻出する特徴配列が示されています。リード中にアダプター配列などが混入している場合、その配列が示されます。

Adapter Content

各塩基ごとに見たときのリード中に含まれているアダプターの割合を示しています。 あくまで、FastQCに登録されているアダプター配列しか確認していないので、登録されていないアダプター配列を使っていた場合、そのアダプター配列がリード中に混入していても確認できないことがあります。 ダウンロード (7).png (8.8 kB)

Kmer Content

特定の塩基配列のパターンがリード中に頻出していないかどうかチェックしています。 ダウンロード (8).png (60.2 kB)

4. Adapter trimming

PAR-CLIPのリードはアダプター配列の一部が含まれているので、Cutadaptを利用してそれを除きます。 アダプター配列の設定はサンプルに応じて変更が必要です。

どのようなアダプター配列がリードに混入しているかどうか調べるには、ダウンロード時に参照したNCBI GEOの各サンプルのページから得るか、もしくは論文のMaterial & Methodsを参照して得ます。

今回は、NCBI GEOのサイトにアダプター配列の情報が載っているので、それを使います。

GEO Accession viewer - Google Chrome 2017-01-16 09.40.49.png (270.9 kB)

まず、TCGTATGCCGTCTTCTGCTTGTというアダプター配列がそもそもFASTQファイル内に保存されている各リードに含まれているかどうか、目で確認したいと思います。

$ less SRR488740_PAR-CLIP_CstF-64.fastq

ここでは、lessコマンドでFASTQファイルの中身を見ています。lessで表示したとき、十字キーでさらに下の情報も見ることができます。

また、/に続けて文字列を入力してEnterを押すと、その文字列を含む列を検索することができます。アダプター配列全長を検索にかけるとヒットしにくくなるので、5'end側から6-7bpぐらいの配列で検索にかけるとよいかもしれません(TCGTATGとか)。

slogin.hgc.jp_22 - Tera Term VT 2017-01-18 17.29.15.png (126.9 kB)

検索した文字列と一致する箇所に、このようにハイライトがつきます。

slogin.hgc.jp_22 - Tera Term VT 2017-01-18 17.30.28.png (165.7 kB)

上図では、今回のサンプルとは異なるサンプルを見ています。ちなみにCstF64に対するPAR-CLIPデータでは、20%程度しかアダプター配列が含まれていません。これは、そもそもシークエンスしたリード長が38bpと短いため、アダプター配列の混入率が低かったと考えられます。

実行例

$ cutadapt -f fastq --match-read-wildcards --times 1 -e 0.1 -O 5 --quality-cutoff 6 -m 18 \
-a TCGTATGCCGTCTTCTGCTTGT \
SRR488740_PAR-CLIP_CstF-64.fastq > SRR488740_PAR-CLIP_CstF-64_1_trimmed_adapter.fastq 2>> ./log_SRR488740_PAR-CLIP_CstF-64.txt
  • -f: フォーマットの指定。
  • --match-read-wildcards: IUPACワイルドカードを許容。
  • --times: 各リードに対してトリミングを実行する回数。
  • -e: 指定したアダプター配列とのミスマッチ率の許容範囲。
  • -O: アダプター配列とOverlapする最低配列長。例えば、5と指定すると、最低5塩基分Overlapしている必要がある。
  • --quality-cutoff: クオリティの低い塩基を除く。
  • -m: トリミング後のリードの最低配列長。例えば、18と指定すると、トリミング後にリード長が18未満のリードは排除する。
  • -a: 3'側にライゲーションされている、指定したアダプター配列を除去する。

5. Quality filtering

FASTQファイル中にクオリティスコアの低いリードが含まれていることが確認されたので、FASTX-toolkitを用いてクオリティの低い塩基及びリードを除去します。

コード例

$ fastq_quality_trimmer -Q33 -t 20 -l 18 -i ./SRR488740_PAR-CLIP_CstF-64_1_trimmed_adapter.fastq | fastq_quality_filter -Q33 -q 20 -p 80 -o SRR488740_PAR-CLIP_CstF-64_2_filtered.fastq
fastq_quality_trimmerのパラメータ。
  • -Q: Phred quality scoreのバージョン指定(Solexa, Illumina 1.3+, Illumina 1.5+といったかなり古いバージョンのFASTQファイルでは'64'を指定。最近のFASTQファイルは'33'と指定しておけばOK)。
  • -t: 指定したPhred quality scoreを下回る塩基をトリミングする。
  • -l: トリミング後の最低リード長。
fastq_quality_filterのパラメータ。
  • -q 20 -q 80: リードの80%でPhred quality scoreが20を下回る場合、そのリードを排除する。

6. リボソームRNAとRepetitive elementsを除く

次に、リボソームRNAとRepetitive elements (RepBase databaseから得た配列)由来のリードを除去します。

Repetitive elementsの用意

RepBaseと呼ばれるデータベースから、Repetitive elementsの配列情報を取得します。 下記のURLから最新のRepBaseのデータ (FASTAファイル)を入手することができます。
ただし、データの取得にはRegistrationが必要になるので注意してください。
http://www.girinst.org/server/RepBase/index.php

FASTA format (42.11 MB) 01-24-2017:と書いてあるほうをダウンロードします。
http://www.girinst.org/server/RepBase/protected/RepBase22.01.fasta.tar.gz

ファイルを展開して、

$ tar xzvf RepBase22.01.fasta.tar.gz

appendix/humapp.refhumrep.refhumsub.refをマージします。ファイル名はRepBase_human_v22_01.faとしておきます。

$ cat humapp.ref  humrep.ref  humsub.ref > RepBase_human_v22_01.fa

次に、リボソームRNAの配列を用意します。 NCBIの登録されているX12811.1| Human 5S DNAU13369.1|HSU13369 Human ribosomal DNA complete repeating unitの配列情報を使います。 下記のURLからFASTA形式のデータをコピペしてFASTAファイルをつくります。

Human 5S DNA

https://www.ncbi.nlm.nih.gov/nuccore/23898

Human ribosomal DNA complete repeating unit

https://www.ncbi.nlm.nih.gov/nuccore/555853

上記のrRNAのFASTA形式のデータをcontam_Ribosomal_RNA.faとしてまとめ、先ほど取得したRepetitive elementsのFASTAファイルとマージさせます。名前をRepBase_v22_01_human_rRNA.faとしておきます。

cat RepBase_human_v22_01.fa contam_Ribosomal_RNA.fa > RepBase_v22_01_human_rRNA.fa

rRNAやRepetitive elementsを除去するために、FASTQファイルに格納されている各リードをそれらの配列にアライメント(マッピング)して、それらの配列にマッピングされないリードを抽出します。こうすることで、rRNAやRepetitive elementsに由来しないリードのみをもとのFASTQファイルから抽出することができます。

STARと呼ばれるソフトでマッピングさせるために、まず、rRNAやRepetitive elementsのIndexファイルを用意する必要があります。以下で、先ほど作成したFASTAファイルをもとに、STAR用のIndexファイルを作成しています。

実行例

$ mkdir ./STAR_Index_repBase_v22_01_rRNA_contam
$ STAR --runThreadN 8 --runMode genomeGenerate --genomeDir ./STAR_Index_repBase_v22_01_rRNA_contam \
     --genomeFastaFiles ./RepBase_v22_01_human_rRNA.fa

まず、Indexファイルを保存するディレクトリをmkdirコマンドで作成します。ここでは、STAR_Index_repBase_v22_01_rRNA_contamという名前のディレクトリを用意しました。

STARのパラメータ。
  • --runThreadN: 使用するコア数を指定。
  • --runMode: genomeGenerateを指定して、Indexファイルを作成するモードに設定。
  • --genomeDir: 出力先のディレクトリを指定。
  • --genomeFastaFiles: Indexを作成したいFASTAファイルを指定。ここでは、先ほど用意したリピート配列とrRNAの配列データ(FASTAファイル)を指定する。

rRNAとRepetitive elementsを除く

Indexファイルを作成した後、rRNAとRepetitive elementsへのマッピングを行います。マッピングされなかったリードについては、FASTQファイルとして出力されるようにオプションを指定します。

実行例

$ STAR --runMode alignReads --runThreadN 8 --genomeDir ./STAR_Index_repBase_v22_01_rRNA_contam \
--readFilesIn ./SRR488740_PAR-CLIP_CstF-64_2_filtered.fastq \
--outSAMunmapped Within --outFilterMultimapNmax 30 --outFilterMultimapScoreRange 1 \
--outFileNamePrefix ./SRR488740_PAR-CLIP_CstF-64_3_rm_repbase_rrna.fastq \
--outSAMattributes All --outStd BAM_Unsorted --outSAMtype BAM Unsorted \
--outFilterType BySJout --outReadsUnmapped Fastx --outFilterScoreMin 10 \
--alignEndsType EndToEnd > ./SRR488740_PAR-CLIP_CstF-64_3_repbase_rrna_comtam.bam
$ mv ./SRR488740_PAR-CLIP_CstF-64_3_rm_repbase_rrna.fastqUnmapped.out.mate1 ./SRR488740_PAR-CLIP_CstF-64_3_rm_repbase_rrna.fastq
STARのパラメータ。
  • --runMode: alignReadsを指定して、アライメントを行うモードに設定。
  • --runThreadN: 使用するコア数を指定。
  • --genomeDir: Indexファイルの保存されているディレクトリを指定。
  • --readFilesIn: マッピングさせたいFASTQファイルを指定。
  • --outSAMunmapped Within: 出力されるBAMファイルにマッピングされなかったリード情報も含める。
  • --outFilterMultimapNmax: 複数箇所にマッピング(Multi-mapping)されることをどこまで許容するか設定する。指定した数を超える箇所にマッピングされたリードは排除する。
  • --outFilterMultimapScoreRange: Multi-mappingアライメントのスコアの範囲。複数箇所マッピングされてもアライメントスコアが高ければ残す。
  • --outFileNamePrefix: 出力ファイルのPrefixを指定。
  • -outSAMattributes: 基本情報以外に、BAMファイルに追加する情報を指定。
  • --outStd BAM_Unsorted: 出力されるBAMファイルをソートしない。
  • --outSAMtype BAM Unsorted: SAMファイルでなく、BAMファイルとしてマッピングされた情報を直接出力する。ただし、ソートはしない。
  • --outFilterType BySJout: SJ.out.tabファイルとして出力される信頼性の高いExon junctionをまたぐリードのみを残す。Filteringをクリアできないリードは排除する。
  • --outReadsUnmapped Fastx: マッピングされなかったリードをFASTQファイルとして出力する。
  • --outFilterScoreMin 10: アライメントスコアが10を下回るリードは排除する。
  • --alignEndsType EndToEnd: End-to-Endアライメントを行う(Localアライメントでない)。

7. Quality check

rRNAやRepetitive elementsに由来するリードを除いた後、フィルタリング後のFASTQファイルをFastQCを用いて再確認します。

実行例

$ mkdir fastqc_${file}_filtered
$ fastqc -o ./fastqc_SRR488740_PAR-CLIP_CstF-64_filtered ./SRR488740_PAR-CLIP_CstF-64_3_rm_repbase_rrna.fastq -f fastq

8. Mapping

PAR-CLIPから得られるリード長は短い (25 ntぐらい)ので、リードの複雑度によってはゲノム上に重複してマッピングされるおそれがあります。そのため、ここではゲノムとトランスクリプトームにユニークにマッピングされるリードしか扱わないよう、オプションを指定しています。

Indexファイルの作成

ここでも先ほどのマッピング時と同じように、GenomeとTranscriptomeのSTAR用のIndexファイルを作成する必要があります。このIndexファイルの作成には、50G程度のメモリが必要になるので注意してください。

まず、Human Genome(hg19)のFASTAファイルのダウンロードしてきます。 各染色体ごとにファイルが用意されているので、catコマンドでダウンロードしたすべてのファイルをマージして、hg19.faという名前で出力します。

$ for file in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 X Y M
  do
    wget http://hgdownload.soe.ucsc.edu/goldenPath/hg19/chromosomes/chr${file}.fa.gz
    gunzip chr${file}.fa.gz
  done

$ cat chr1.fa chr2.fa chr3.fa chr4.fa chr5.fa chr6.fa chr7.fa chr8.fa chr9.fa chr10.fa chr11.fa chr12.fa chr13.fa chr14.fa chr15.fa chr16.fa chr17.fa chr18.fa chr19.fa chr20.fa chr21.fa chr22.fa chrX.fa chrY.fa chrM.fa > hg19.fa

Transcriptomeの情報として、Gencodeのアノテーション情報を利用します。
https://www.gencodegenes.org/releases/19.html

上記のサイトにアクセスすると、さまざまなデータが置いてあるが基本的にgencode.v19.annotation.gtfというメインのアノテーション情報を利用すればOKです。
ftp://ftp.sanger.ac.uk/pub/gencode/Gencode_human/release_19/gencode.v19.annotation.gtf.gz

wgetコマンドで該当のファイルをダウンロードし解凍します。

$ wget ftp://ftp.sanger.ac.uk/pub/gencode/Gencode_human/release_19/gencode.v19.annotation.gtf.gz
$ tar zxvf ftp://ftp.sanger.ac.uk/pub/gencode/Gencode_human/release_19/gencode.v19.annotation.gtf.gz

カレントディレクトリにgencode.v19.annotation.gtfが保存されます。

最後に、STARを使ってhg19+Gencode_v19のIndexファイルを作成します。

実行例

$ mkdir hg19_Genome_Gencode_v19
$ STAR --runThreadN 8 --runMode genomeGenerate --genomeDir hg19_Genome_Gencode_v19 \
     --genomeFastaFiles ./hg19.fa --sjdbGTFfile ./gencode.v19.annotation.gtf --sjdbOverhang 100
STARのパラメータ。
  • --runThreadN: 使用するコア数を指定。
  • --runMode: genomeGenerateを指定して、Indexファイルを作成するモードに設定。
  • --genomeDir: 出力先のディレクトリを指定。
  • --genomeFastaFiles: Indexを作成したいFASTAファイルを指定。ここでは、先ほど用意したヒトゲノムのデータ(hg19、FASTAファイル)を指定する。
  • --sjdbGTFfile: STARではアノテーション情報のGTFファイルからExon junctionの情報を抽出する。ここでは、先ほどダウンロードしたgencode.v19.annotation.gtfを使用する。
  • --sjdbOverhang 100: Exon junctionの周囲、100塩基のゲノム配列をIndex化する。マッピングに使用するFASTQファイルのリード長と設定すると良い。公式のおすすめは100

ゲノムとトランスクリプトームへのマッピング

Indexファイルが用意できたので、ゲノム(hg19)とトランスクリプトーム(Gencode v19)にリードをマッピングします。

実行例

$ mkdir STAR_output_SRR488740_PAR-CLIP_CstF-64_EndtoEnd
$ STAR --runMode alignReads --runThreadN 8 --genomeDir ./hg19_Genome_RefSeq \
--readFilesIn ./SRR488740_PAR-CLIP_CstF-64_3_rm_repbase_rrna.fastq \
--outFilterMultimapNmax 1 -- outFilterMultimapScoreRange 1 \
--outFileNamePrefix ./STAR_output_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/SRR488740_PAR-CLIP_CstF-64_4_STAR_result_ \
--outSAMattributes All --outSAMtype BAM SortedByCoordinate --limitBAMsortRAM 32000000000 \
--outFilterType BySJout --outReadsUnmapped Fastx --outFilterScoreMin 10 \
--alignEndsType EndToEnd
STARのパラメータ。
  • --outSAMtype BAM SortedByCoordinate: SAMファイルでなく、BAMファイルとしてマッピングされた情報を直接出力する。出力ファイルは染色体の座標でソートする。
  • --limitBAMsortRAM 32000000000: BAMファイルをソートするときに割り当てられるメモリの上限を設定。

マッピング後に、samtoolsを用いてBAMファイルをSAMファイルに変換します(この後の作業で、SAMファイルを使っていきます)。

実行例

$ samtools view -h ./STAR_output_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/SRR488740_PAR-CLIP_CstF-64_4_STAR_result_Aligned.sortedByCoord.out.bam \
  > ./STAR_output_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/SRR488740_PAR-CLIP_CstF-64_4_STAR_result_Aligned.sortedByCoord.out.sam

9. Base Substitution frequencyの確認

PAR-CLIPの場合、TからCの置換が見られるはずなので、SAMファイルからリファレンスゲノムと比較して、ミスマッチしている塩基配列を抽出し、各塩基のミスマッチの割合を調べます。

SAMファイルの中身について

詳しくは下記のURL・PDFファイルを参照のこと。
https://samtools.github.io/hts-specs/
https://samtools.github.io/hts-specs/SAMv1.pdf
https://samtools.github.io/hts-specs/SAMtags.pdf

Mandatory field

SAMファイルの各行には、以下のような必須項目が含まれています。 image.png (194.6 kB) ミスマッチの情報は、CIGAR stringMD fieldに記載されています。 CIGAR stringは「6カラム目」に記載されており、MD fieldはオプションとして各行の後半に記載されています。

SAMファイルの中身の例

SRR488740_PAR-CLIP_CstF-64.13819410     256     chr1    11488   0       38M     *       0       0       ATGCTGTTTGGTCTCAGTAGACTCCTAAATATGGGACT  BCCCCCBCCCCBBBBACABB>BBBBCBAAB?AABBBBB  NH:i:7  HI:i:2  AS:i:35 nM:i:1  NM:i:1  MD:Z:36T1       jM:B:c,-1       jI:B:i,-1
SRR488740_PAR-CLIP_CstF-64.462991       16      chr1    12953   0       38M     *       0       0       GGTTCATCCCCTTCACTCCCAGCTCAGAGCCCAGGCCA  ;='9@@;9<2@5@9@BB<5BB9<)B=+=9)&7B5BB@A  NH:i:6  HI:i:1  AS:i:35 nM:i:1  NM:i:1  MD:Z:2G35       jM:B:c,-1       jI:B:i,-1
SRR488740_PAR-CLIP_CstF-64.14573742     272     chr1    14320   0       10M1D28M        *       0       0       CAACAGGGGCGGAGGCAGTCACTGACCCCGAGACGTTT  >B;1=A@B5<@=2A<<=BAB:A6B;B2;BA>ABCBACB  NH:i:8  HI:i:4  AS:i:33 nM:i:0  NM:i:1  MD:Z:10^A28     jM:B:c,-1       jI:B:i,-1
SRR488740_PAR-CLIP_CstF-64.2153554      272     chr1    17024   0       32M177N6M       *       0       0       AGGTCTGGCACATAGAGGTAGTTCTCTGGGACCTGCTG  55A=AA@;@7B@;@B=??B>??>B9BA=?A9ABBABB@  NH:i:7  HI:i:7  AS:i:36 nM:i:1  NM:i:1  MD:Z:16A21      jM:B:c,22       jI:B:i,17056,17232
SRR488740_PAR-CLIP_CstF-64.15174491     256     chr1    360396  0       19M1I18M        *       0       0       TCAGGCACCGTGGAGAAAAAGTCGCCGTGTGTAGGCAG  BBB?ABBB@BABBABBBCBBB?ABAAB<B<>29=AA;A  NH:i:8  HI:i:4  AS:i:32 nM:i:0  NM:i:1  MD:Z:37 jM:B:c,-1       jI:B:i,-1

上記の表と照らし合わせると、各列の情報は以下の通りになります。 ここでは、上記のSAMファイルの1行目の情報を見ています。

  • QNAME: SRR488740_PAR-CLIP_CstF-64.13819410
  • FLAG: 256
  • RNAME: chr1
  • POS: 11488
  • MAPQ: 0
  • CIGAR: 38M
  • RNEXT: *
  • PNEXT: 0
  • TLEN: 0
  • SEQ: GGTTCATCCCCTTCACTCCCAGCTCAGAGCCCAGGCCA
  • QUAL: ;='9@@;9<2@5@9@BB<5BB9<)B=+=9)&7B5BB@A
  • オプション領域: NH:i:6 HI:i:1 AS:i:35 nM:i:1 NM:i:1 MD:Z:2G35 jM:B:c,-1 jI:B:i,-1

STARでマッピングして得られたSAMファイルの中身を見てみると、CIGAR stringには38M, 10M1D28M, 32M177N6M, 19M1I18Mなどがあります。

CIGER stringには以下の種類があり、 image.png (100.1 kB) 38Mは、ミスマッチを含めて38塩基長のリードであることを示しています。

10M1D28Mは、最初の10塩基(10M)と後半の28塩基(28M)はミスマッチを含めてアライメントされており、その間にリード中にDeletionの箇所(1D)が存在することを意味しています。

An image of meaning of CIGAR    <---10--->D<--------28-------->
D: Deletion from the reference

32M177N6Mは、最初の32塩基(32M)と後半の6塩基(6M)はミスマッチを含めてアライメントされており、その間はExon junctionである(177N)ことを意味しています。RNA-seqで今回のようにExon junctionを考慮してリードをマッピングしている場合、このようなCIGAR stringが散見されます。

An image of meaning of CIGAR    <--------32-------->NNNNN...NNNNN<-6->
                                [------exon_1------]             [-exon_2-]
N: Skipped region from the reference

19M1I18Mは、最初の19塩基(19M)と後半の18塩基(18M)はミスマッチを含めてアライメントされており、その間にリファレンスゲノムに特定の塩基が挿入されている(1I)ことを意味しています。

An image of meaning of CIGAR    <-----19-----> I <-----18----->
I: Insertion region from the reference

今回例示したPythonスクリプトでは、データマイニングを簡単にするために、Deletion、Exon juction、Insertionを含むリードを解析対象から除外しています。つまりは、38Mのようなミスマッチ箇所のみを含むリードだけを抽出して解析しています。

CIGAR stringだけでは、いったいATGCのどの塩基からどの塩基へのMutationが起こっているかの情報がわかりません。そこで、さらにMD fieldを参照します。

先ほどのリードでCIGAR stringとMD fieldを比較すると以下のようになります。 38Mに対して、MD:Z:36T1というMD fieldが記述されています。

An image of meaning of CIGAR    <-------36------->N<-1->    :Sequence Read
An image of meaning of MD tag   <-------36------->T<-1->    :Reference genome
N: A, T, G, Cのいずれかの塩基

これは、リファレンスゲノムでTだった箇所で、リード中で塩基のミスマッチが見られるということを意味しています。

10M1D28Mに対して、MD:Z:10^A28という記述がされています。

An image of meaning of CIGAR    <--10-->D<-------28------->    :Sequence Read
An image of meaning of MD tag   <--10-->A<-------28------->    :Reference genome
D: Deletion from the reference

これは、リファレンスゲノムでAだった箇所で、リード中で塩基の欠失が見られるということを意味しています。

19M1I18Mに対して、MD:Z:37という記述がされています。

An image of meaning of CIGAR    <-------36------->N<-6->    :Sequence Read
An image of meaning of MD tag   <-------36------->D<-6->    :Reference genome
D: Deletion from the reference
N: A, T, G, Cのいずれかの塩基

これは、リファレンスゲノムの対して、リード中に特定の塩基の挿入が見られるということを意味しています。

必要なスクリプト

以下のURLに必要なスクリプトが置いてある。
https://github.com/Imamachi-n/NGS-Tutorial/tree/master/PAR-CLIP_Tutorial_CstF64

$ python E_mismatch_call_from_bam.py ./STAR_output_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/SRR488740_PAR-CLIP_CstF-64_4_STAR_result_Aligned.sortedByCoord.out.sam \
./STAR_output_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/SRR488740_PAR-CLIP_CstF-64_4_STAR_result_Aligned.sortedByCoord.out_indel.txt \
Base_substitution_frequency.txt
  • 1つ目の引数: 解析するSAMファイルを指定。
  • 2つ目の引数: ミスマッチを含むリードを抽出した中間ファイルを出力。
  • 3つ目の引数: 各塩基のミスマッチの数を出力。

結果の図

上記のスクリプトから得られた各塩基の置換の割合をもとに、Excelを用いて結果を図示した。STARでのマッピング条件によって結果が異なります。

STARでのマッピング条件(PARalyzer default)

--outFilterMultimapNmax 10

image.png (19.0 kB)

STARでのマッピング条件(ENCODE eCLIP)

--outFilterMultimapNmax 1 -- outFilterMultimapScoreRange 1

image.png (19.5 kB)

予想通り、T>C substitutionが起こっているリードがEnrichされていることがわかります。この後行うPARalyzerによるPeak callは、このT>C substitutionを指標にしてピークを検出するので、T>C substitutionが高いことが以降の解析で重要となってきます。

上記の結果を見てみると、ユニークにマッピングされたリードのみを使ったほうが、T>C substitutionの割合が大きいことがわかります。このことから、今回の解析では--outFilterMultimapNmax 1 -- outFilterMultimapScoreRange 1の条件でマッピングを行ったほうがよいと考えました。

10. マッピングされたリードのStrandnessの確認

PAR-CLIPではリードがStrand-specificにマッピングされると想定されることから、リードのStrandnessを確認します。ここでは、RSeQCのinfer_experiment.pyというスクリプトを用いました。

アノテーション情報としてBEDファイルを用意

下記のURLに置いてあるgtf2bed.plを使用します。
https://github.com/Imamachi-n/NGS-Tutorial/tree/master/PAR-CLIP_Tutorial_CstF64

$ perl gtf2bed.pl gencode.v19.annotation.gtf gencode.v19.annotation.bed
  • 1つ目の引数: 変換したいGTFファイルを指定
  • 2つ目の引数: 出力するBEDファイルを指定。

Strandnessの確認

$ infer_experiment.py -i ./STAR_output_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/SRR488740_PAR-CLIP_CstF-64_4_STAR_result_Aligned.sortedByCoord.out.bam -r ./gencode.v19.annotation.bed -s 400000 >  ./STAR_output_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/SRR488740_PAR-CLIP_CstF-64_4_STAR_result_strand_stat.txt
  • -i: Strandnessを調べるBAMファイルを指定。
  • -r: 先ほど用意したBEDファイルのアノテーション情報を指定。
  • s: 解析に使用するリードを指定。ここでは、40万リードを抽出してStrandnessを調べています。指定する数値を大きくすれば計算精度も上がると思いますが、その分時間もかかります。

下記がその結果になります。"++“や”+-“のように2文字で表現されていますが、1つ目がアノテーション情報でのStrandの向き、2つ目がマッピングされたリードのStrandの向きを表しています。

unstranded RNA-seqの場合、Fraction of reads explained by “++,–"とFraction of reads explained by ”+-,-+“の割合が、50%に近くなりますが、今回のようにStrand-specificに読まれているサンプルの場合、下記のように偏りが見られます。

PAR-CLIPのデータでは、+鎖のRNA配列は+鎖として、-鎖のRNA配列は-鎖としてそれぞれ読まれていることがわかりました。

This is SingleEnd Data
Fraction of reads failed to determine: 0.0622
Fraction of reads explained by "++,--": 0.8506
Fraction of reads explained by "+-,-+": 0.0873

この情報をもとに、以下でUCSC genome browserで可視化させるデータを作成する際に、+と-鎖をそれぞれ分けてファイルを作成します。

11. Visualization (For UCSC genome browser)

Bedtoolsを利用して、STARから得られたBAMファイルを、UCSC genome browser上で可視化できるファイル(Bedgraphファイル)に変換します。

$ mkdir UCSC_visual_SRR488740_PAR-CLIP_CstF-64_EndtoEnd

$ bedtools genomecov -ibam ./STAR_output_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/SRR488740_PAR-CLIP_CstF-64_4_STAR_result_Aligned.sortedByCoord.out.bam -bg -split -strand + > ./UCSC_visual_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/SRR488740_PAR-CLIP_CstF-64_4_STAR_result_Aligned.sortedByCoord.out_Forward.bg
$ bedtools genomecov -ibam ./STAR_output_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/SRR488740_PAR-CLIP_CstF-64_4_STAR_result_Aligned.sortedByCoord.out.bam -bg -split -strand - > ./UCSC_visual_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/SRR488740_PAR-CLIP_CstF-64_4_STAR_result_Aligned.sortedByCoord.out_Reverse.bg

$ echo "track type=bedGraph name=SRR488740_PAR-CLIP_CstF-64_STAR_End_Fw description=SRR488740_PAR-CLIP_CstF-64_STAR_End_Fw visibility=2 maxHeightPixels=40:40:20 color=255,0,0" > ./UCSC_visual_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/tmp_SRR488740_PAR-CLIP_CstF-64_forward.txt
$ echo "track type=bedGraph name=SRR488740_PAR-CLIP_CstF-64_STAR_End_Re description=SRR488740_PAR-CLIP_CstF-64_STAR_End_Re visibility=2 maxHeightPixels=40:40:20 color=0,0,255" > ./UCSC_visual_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/tmp_SRR488740_PAR-CLIP_CstF-64_reverse.txt

$ cat ./UCSC_visual_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/tmp_SRR488740_PAR-CLIP_CstF-64_forward.txt ./UCSC_visual_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/SRR488740_PAR-CLIP_CstF-64_4_STAR_result_Aligned.sortedByCoord.out_Forward.bg > ./UCSC_visual_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/SRR488740_PAR-CLIP_CstF-64_4_STAR_result_Aligned.sortedByCoord.out_forward_for_UCSC.bg
$ cat ./UCSC_visual_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/tmp_SRR488740_PAR-CLIP_CstF-64_reverse.txt ./UCSC_visual_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/SRR488740_PAR-CLIP_CstF-64_4_STAR_result_Aligned.sortedByCoord.out_Reverse.bg > ./UCSC_visual_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/SRR488740_PAR-CLIP_CstF-64_4_STAR_result_Aligned.sortedByCoord.out_reverse_for_UCSC.bg

$ bzip2 -c ./UCSC_visual_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/SRR488740_PAR-CLIP_CstF-64_4_STAR_result_Aligned.sortedByCoord.out_forward_for_UCSC.bg > ./UCSC_visual_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/SRR488740_PAR-CLIP_CstF-64_4_STAR_result_Aligned.sortedByCoord.out_forward_for_UCSC.bg.bz2
$ bzip2 -c ./UCSC_visual_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/SRR488740_PAR-CLIP_CstF-64_4_STAR_result_Aligned.sortedByCoord.out_reverse_for_UCSC.bg > ./UCSC_visual_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/SRR488740_PAR-CLIP_CstF-64_4_STAR_result_Aligned.sortedByCoord.out_reverse_for_UCSC.bg.bz2

bedtools genomecovで特定のゲノム領域でのCoverageを計算する。このとき、-bgオプションで、出力ファイルの形式をBedGraphファイルに指定しておく。また、-splitオプションで、Splicing juctionにマッピングされたリード(リードが分割されてマッピングされているリード)を考慮する。

+鎖と-鎖で別々のBedGraphファイルを作るために、-strandオプションを指定する。+鎖もしくは-鎖のみを抽出することができる。

先ほどのチェックで、+鎖のRNA配列は+鎖として、-鎖のRNA配列は-鎖としてそれぞれ読まれていることがわかっているので、ここでは-strand +-strand -と指定して、それぞれを+鎖と-鎖のデータとして保存する。

UCSC genome browserへデータをアップロードする際に、ファイルの種類やTrackの名前などを提示する必要がある。

それらの情報をヘッダー行(ファイルの一行目)に記載する。 echoコマンドのところでヘッダー行の情報をtxtファイルとして出力している。

そのあとに、catコマンドを用いて、先程作ったBedGraphファイルと結合させる。

出力されたファイルをアップロードしてもOKですが、容量が大きいためアップロードに時間がかかります。そのため、アップロードするファイルのサイズを小さくするために、ここではbzip2ファイルに圧縮しています。

12. UCSC genome browserへのアップロード

下記のURLからUCSC genome browserにアクセスします。
http://genome.ucsc.edu/

[MyData] -> [Custom Tracks]をクリック。

image.png (1.0 MB)

Add Custom Tracksのページに飛ぶので、「ファイルを選択」をクリックし、アップロードしたいファイル(先ほど作成したbzip2に圧縮したBedGraph)を選択します。

Add Custom Tracks - Google Chrome 2017-01-18 17.11.59.png (91.5 kB)

「Submit」ボタンをクリックします。

Add Custom Tracks - Google Chrome 2017-01-18 17.12.47.png (91.3 kB)

「add custom tracks」をクリックすると、先ほどのページに飛び再び別のファイルをアップロードできます。また、「go」をクリックするとGenome browser上でアップロードしたデータを閲覧することができます。

Manage Custom Tracks - Google Chrome 2017-01-18 17.13.26.png (72.4 kB)

最初は、chr1の先頭に飛ばされるので、検索欄に興味のある遺伝子名・もしくはGencodeのIDを入力して検索することができます。

Human chr1_10611-10629 - UCSC Genome Browser v343 - Google Chrome 2017-01-18 17.16.46.png (312.5 kB)

実際に検索すると、マッピングされたCsfF64のPAR-CLIPのデータを見ることができ、3'endにピークが確認されます。

Human chr19_2475589-2478791 - UCSC Genome Browser v343 - Google Chrome 2017-01-18 17.17.50.png (629.1 kB)

13. PARalyzerの実行 (Peak calling)

必要なスクリプト

下記のURLに必要なスクリプト群が置いてある。
https://github.com/Imamachi-n/NGS-Tutorial/tree/master/PAR-CLIP_Tutorial_CstF64

  • PARalyzer_v1_5.sh
  • PARalyzer_ini_file_generator.py

内容

STARでマッピングした後、カレントディレクトリにSTAR_output_xxxという名前のディレクトリが生成されていると思います。その直下に、SRR488740_PAR-CLIP_CstF-64_4_STAR_result_Aligned.sortedByCoord.out.bamという名前のBAMファイルがあると思います。

ここでは、そのBAMファイルから、PARalyzerと呼ばれるソフトウェアを用いてPeak callを行いたいと思います。

まず、PARalyzerではマッピングデータであるBAMファイルやGenome情報、各種パラメータの情報をまとめたiniファイルを用意する必要があります。

詳細については下記のURLを参照のこと。
https://ohlerlab.mdc-berlin.de/files/duke/PARalyzer/README.txt

iniファイルの準備

今回は、このiniファイルを生成するPythonスクリプトを用意したのでそれを用います。

$ python2 ./PARalyzer_ini_file_generator.py ./ SRR488740_PAR-CLIP_CstF-64 ./hg19.2bit ./PARalyzer_v1_5.ini
  • 1つ目の引数 BAMファイルの置いてあるディレクトリ。
  • 2つ目の引数: FASTQファイルのファイル名(.fastqを除いた部分)。
  • 3つ目の引数: 2bitのゲノム情報。
  • 4つ目の引数: 出力されるiniファイルの名前。

実際のiniファイルの中身。 自身でパラメータを設定したい場合は、下記の情報を書き換えたiniファイルを用意する必要があります。

BANDWIDTH=3
CONVERSION=T>C
MINIMUM_READ_COUNT_PER_GROUP=5
MINIMUM_READ_COUNT_PER_CLUSTER=5
MINIMUM_READ_COUNT_FOR_KDE=5
MINIMUM_CLUSTER_SIZE=8
MINIMUM_CONVERSION_LOCATIONS_FOR_CLUSTER=1
MINIMUM_CONVERSION_COUNT_FOR_CLUSTER=1
MINIMUM_READ_COUNT_FOR_CLUSTER_INCLUSION=5
MINIMUM_READ_LENGTH=13
MAXIMUM_NUMBER_OF_NON_CONVERSION_MISMATCHES=0
EXTEND_BY_READ
SAM_FILE=./STAR_output_SRR488740_PAR-CLIP_CstF-64_EndtoEnd/SRR488740_PAR-CLIP_CstF-64_4_STAR_result_Aligned.sortedByCoord.out.sam
GENOME_2BIT_FILE=./hg19.2bit
OUTPUT_DISTRIBUTIONS_FILE=SRR488740_PAR-CLIP_CstF-64_distribution.csv
OUTPUT_GROUPS_FILE=SRR488740_PAR-CLIP_CstF-64_groups.csv
OUTPUT_CLUSTERS_FILE=SRR488740_PAR-CLIP_CstF-64_clusters.csv
  • SAM_FILE: SAMファイルを指定。
  • GENOME_2BIT_FILE: 2bitのゲノム情報を指定。
  • OUTPUT_DISTRIBUTIONS_FILE: 出力ファイル。任意の名前を指定。
  • OUTPUT_GROUPS_FILE: 出力ファイル。任意の名前を指定。
  • OUTPUT_CLUSTERS_FILE: 出力ファイル。任意の名前を指定。

2bitのゲノム情報の取得

PARalyzerで2bitのゲノム情報が必要になるので、ダウンロードしておく。

$ wget http://hgdownload.cse.ucsc.edu/goldenpath/hg19/bigZips/hg19.2bit

PARalyzerの実行

PARalyzer v1.5から引数として「消費メモリ」と「iniファイル」を指定する必要がある。このとき、消費メモリはSGE (qsubによるジョブ)で指定・確保したメモリ量よりも小さい値を指定する必要がある。例えば、下記のコードでは、qsubによるジョブで「16G」のメモリを確保したケースで、PARalyzerの実行に「11G」のメモリを使用するように指定している。

$ PARalyzer 11G ./PARalyzer_v1_5.ini
  • 1つ目の引数: 先ほど作成したiniファイルを指定。

14. BED, FASTAファイルの作成

下記のURLに必要なスクリプト群が置いてある。
https://github.com/Imamachi-n/NGS-Tutorial/tree/master/PAR-CLIP_Tutorial_CstF64 * PARalyzer2BEDandFASTA.py

Annotation付けやモチーフ検索のために、BEDとFASTAファイルを用意する。 入力ファイルは、PARalyzerから得られたXXX_clusters.csvを利用する。

$ python2 ./PARalyzer2BEDandFASTA.py SRR488740_PAR-CLIP_CstF-64_clusters.csv SRR488740_PAR-CLIP_CstF-64_clusters.bed SRR488740_PAR-CLIP_CstF-64_clusters.fa
  • 1つ目の引数: PARalyzerから出力されたCSVファイルを指定。
  • 2つ目の引数: 出力されるBEDファイルの名前を指定。
  • 3つ目の引数: 出力されるFASTAファイルの名前を指定。

15. MEMEによるモチーフ検索

PAR-CLIPのデータから得られた、CstF64タンパク質が結合しているRNA配列のFASTAファイルを用意します。

MEMEに投げる配列の数が多い場合、計算にかなりの時間を要します(一日以上)。そのため、数として10,000配列未満に抑えたほうがよいです。

PARalyzerから得られたピーク数が20万を超えるので、これを1万程度まで絞り込む必要があります。今回は、CstF64がRNAの3'endに結合していることがわかっているので、3'UTR上で検出されたピークのみを解析対象としたいと思います。

さらに、3'UTR上で複数のピークが確認された場合は、ピークのリード数が多いものを各遺伝子の代表のピークとして選択するようにします。

Representative isoformの用意

必要なスクリプト

下記のURLに必要なスクリプト群が置いてある。
https://github.com/Imamachi-n/NGS-Tutorial/tree/master/PAR-CLIP_Tutorial_CstF64

  • prep_gtf_for_PAR-CLIP_analysis.sh
  • A_prep_gtf_for_PAR-CLIP.py
  • gtf2bed.pl
  • B_prep_longest_trx_id_list.py
  • bed12to3UTRbed.pl

内容

各遺伝子に対してRepresentative isoformに対するBEDファイルとFASTAファイルをそれぞれ用意します。

まず、GTFファイルから代表的なIsoformを絞り込みます。Gencodeに登録されている各GeneのIsoformsはナンセンス変異を持つIsoformやTrancateなIsoformなどを含んでいます。

そこで、ここではbasicというタグの付いた完全長のIsoformだけを抽出しています。また、StatusがPUTATIVEとなっているIsoformについても除外しています。

# Prepare Protein-coding RNAs (Status: Basic)
$ python A_prep_gtf_for_PAR-CLIP.py gencode.v19.annotation.gtf \
gencode.v19.annotation_only_basic_mRNAs.gtf \
gencode.v19.annotation_only_basic_mRNAs_gene_trx_list.txt
  • 1つ目の引数: もとのGTFファイルを指定。
  • 2つ目の引数: 代表的なIsoformのみに絞ったGTFファイルを出力。
  • 3つ目の引数: 遺伝子リストを出力。

GTFファイルをBEDファイルに変換します。

# Convert gtf to bed
$ perl ./gtf2bed.pl gencode.v19.annotation_only_basic_mRNAs.gtf gencode.v19.annotation_only_basic_mRNAs.bed
  • 1つ目の引数: 先ほど作成したGTFファイルを指定。
  • 2つ目の引数: BED形式に変換したファイルを出力。

各Geneに対して1つの代表Isoformを決めるために、最長のIsoformのみを抽出します。

# Extract longest isoforms
$ python2 ./B_prep_longest_trx_id_list.py ./gencode.v19.annotation_only_basic_mRNAs.bed \
./gencode.v19.annotation_only_basic_mRNAs_gene_trx_list.txt \
./gencode.v19.annotation_only_Rep_basic_mRNAs.bed
  • 1つ目の引数: 先ほど作成したBEDファイルを指定。
  • 2つ目の引数: 先ほど作成した遺伝子リストを指定。
  • 3つ目の引数: 最終的に得られる代表IsoformのBEDファイルを出力。

先ほど作成したBEDファイルから、各遺伝子の3'UTRの領域についてのBEDファイルとFASTAファイルを用意します。

# Extract 3UTR bed file
$ perl ./bed12to3UTRbed.pl ./gencode.v19.annotation_only_Rep_basic_mRNAs.bed \
./gencode.v19.annotation_only_Rep_basic_mRNAs_3UTR.bed \
./gencode.v19.annotation_only_Rep_basic_mRNAs_non-3UTR.bed

# Get fasta file
$ bedtools getfasta -name -s -split -fi ./hg19.fa \
-bed ./gencode.v19.annotation_only_Rep_basic_mRNAs_3UTR.bed \
> ./gencode.v19.annotation_only_Rep_basic_mRNAs_3UTR.fa
bed12to3UTRbed.plスクリプト
  • 1つ目の引数: 先ほど作成した代表IsoformについてのBEDファイルを指定。
  • 2つ目の引数: 各遺伝子の3'UTRの領域についてのBEDファイルを出力。
  • 3つ目の引数: 3'UTRを持たないRNAのデータを出力(ncRNAはすべてこちらに出力される)。
bedtools getfastaコマンド。
  • -name: BEDの名前の列の情報を、FASTAファイルの各配列の名前として記述。
  • -s: Strandの向きを考慮する。
  • -bed: FASTAファイルに変換したいBEDファイルを指定。 標準出力で、FASTAファイルが出力される。

Representative peaksの選定

必要なスクリプト

下記のURLに必要なスクリプト群が置いてあります。
https://github.com/Imamachi-n/NGS-Tutorial/tree/master/PAR-CLIP_Tutorial_CstF64

  • compare_annotation_3UTR_with_peaks.sh
  • D_prep_fasta_file_for_MEME_rep_version.py

PARalyzerにより検出されたピーク情報と3'UTRのアノテーション情報を比較。3'UTRの領域とOverlapするピークを抽出します(中でも、ピークのリード数が最も多い代表のピークを選抜する)。

# Compare 3'UTR annotation with PAR-CLIP peaks
$ bedtools intersect -a ./SRR488740_PAR-CLIP_CstF-64_clusters.bed -b ./gencode.v19.annotation_only_Rep_basic_mRNAs_3UTR.bed -wa -wb -s -split > ./SRR488740_PAR-CLIP_CstF-64_on_mRNAs_plus_anno.bed

# make a fasta file for MEME
$ python2 D_prep_fasta_file_for_MEME_rep_version.py ./SRR488740_PAR-CLIP_CstF-64_on_mRNAs_plus_anno.bed \
./SRR488740_PAR-CLIP_CstF-64_on_mRNAs_plus_anno_rep_version.fa
bedtools intersectコマンド
  • -a: 比較したいBEDファイルを指定。
  • -b: 比較したいBEDファイルを指定。
  • -wa: -aで指定したBEDファイルの情報を結果に出力。
  • -wb: -bで指定したBEDファイルの情報を結果に出力。
  • -s: Strandを考慮する。
  • -split: スプライシングの情報を含む12列のBEDファイル(BED12)に対応する。 標準出力で、2つのBEDファイルを比較したファイルが出力される。
D_prep_fasta_file_for_MEME_rep_version.pyスクリプト
  • 1つ目の引数: 先ほど作成したBEDファイルを比較したファイルを指定。
  • 2つ目の引数: MEMEに用いるピークの配列情報(FASTAファイル)を出力。

Markov Backgroundモデルの作成

MEMEに用いるBackgroundモデルを作成します。

$ fasta-get-markov -m 3 ./gencode.v19.annotation_only_Rep_basic_mRNAs_3UTR.fa \ ./SRR488740_PAR-CLIP_CstF-64_markov_background_for_MEME.txt
  • 1つ目の引数: 先ほど作成した代表Isoformの3'UTR領域のFASTAファイルを指定。
  • 2つ目の引数: MEMEで使用するBackgroundファイルを出力。

詳しくは下記のサイトを参照のこと。
fasta-get-markov http://meme-suite.org/doc/fasta-get-markov.html

モチーフ検索

MEMEを用いて、モチーフ検索を行います。

$ meme ./SRR488740_PAR-CLIP_CstF-64_clusters_on_mRNAs_plus_anno_rep_version.fa \
-dna -bfile ./SRR488740_PAR-CLIP_CstF-64_markov_background_for_MEME.txt \
-oc MEME_result_SRR488740_PAR-CLIP_CstF-64_rep -minw 5 -maxw 8 -nmotifs 3 -maxsize 1000000000 -mod zoops
  • 1つ目の引数: 先ほど作成したピークの配列情報をまとめたFASTAファイルを指定。
  • -dna: DNA配列として処理(RNA、Proteinも選択できる)。
  • -oc: 出力先のディレクトリを指定。
  • -minw: 予測する最小モチーフ配列長を指定。
  • -maxw: 予測する最大モチーフ配列長を指定。
  • -maxsize: 最大文字数を指定(ファイルが大きいと最大文字数を超過してエラーが起こる。適当に大きな数字を入れておく)。
  • -mod zoops: 1つの配列中に予測されたモチーフ配列が0もしくは1以上含まれる。

memeのオプションの詳細については、こちらを参照のこと。
http://meme-suite.org/doc/meme.html

モチーフ検索の結果

先行研究の結果と一致することを確認します。Cstf64タンパク質は、RNAのGU-richなモチーフに結合することが知られているので、モチーフ検索の結果、GU-richな配列が抽出されると期待されます。

以下がMEMEで予測されたモチーフ配列です。 Cstf64タンパク質が結合するRNA配列。

logo1.png (7.4 kB) p-value: 8.6e-1435

Cstf64はpolyA付加シグナル配列の近傍に結合することが知られているため、polyA付加シグナルのモチーフ配列も検出されました。

logo2.png (7.2 kB) p-value: 7.2e-828

今回解析したPAR-CLIPのデータ元の論文では、Top 500のピークについてモチーフ検索を行っているが、今回は約8,000のピークについて大まかに解析している。それでも、GU-richな配列が取れてきた。

参考

以下はRBPDBで検索した結果。

RBPDB - Google Chrome 2017-01-18 10.28.42.png (101.9 kB) (RBPDB [http://rbpdb.ccbr.utoronto.ca/]より抜粋)

Cstf64タンパク質の結合サイトに関する論文。

  • Cañadillas, J. M. P., & Varani, G. (2003). Recognition of GU‐rich polyadenylation regulatory elements by human CstF‐64 protein. The EMBO journal, 22(11), 2821-2830. [PubMed]

  • Martin, G., Gruber, A. R., Keller, W., & Zavolan, M. (2012). Genome-wide analysis of pre-mRNA 3′ end processing reveals a decisive role of human cleavage factor I in the regulation of 3′ UTR length. Cell reports, 1(6), 753-763. [PubMed]

(おまけ)16. アノテーション付け

内容

さきほど作成したRepresentative isoformの情報から、各遺伝子領域(5'UTR, CDS, 3'UTR, intron)上に見られるCstf64のPAR-CLIPのピークを確認します。

必要なスクリプト

下記のURLに必要なスクリプト群が置いてある。
https://github.com/Imamachi-n/NGS-Tutorial/tree/master/PAR-CLIP_Tutorial_CstF64

  • extract_gene_symbol_type_from_gtf.py
  • I_prep_mRNA_lncRNA_symbol_refid_list.py
  • F_split_into_each_section.py
  • G_add_intron_infor.py
  • H_annotate_peaks.py
  • prep_anno_list_for_user.sh
  • peak_anno.sh

遺伝子リストの準備

Gencode v19に収載されているmRNAとlncRNAの遺伝子をGTFファイルからリストアップする。

# Extract gene symbol & ref ID from GTF file
$ python2 ./extract_gene_symbol_type_from_gtf.py \
  ./gencode.v19.annotation.gtf \
  ./gencode.v19.annotation_symbol_type_list.txt

# Prepare mRNA & lncRNA data list
$ python2 ./I_prep_mRNA_lncRNA_symbol_refid_list.py \
  ./gencode.v19.annotation_symbol_type_list.txt \
  ./gencode.v19.annotation_symbol_type_mRNA_list.txt \
  ./gencode.v19.annotation_symbol_type_lncRNA_list.txt
extract_gene_symbol_type_from_gtf.pyスクリプト

GTFファイルから遺伝子リストを作成。 * 1つ目の引数: GTFファイルを指定。 * 2つ目の引数: GTFファイルから作成した遺伝子リストを出力。

I_prep_mRNA_lncRNA_symbol_refid_list.pyスクリプト

先ほど作成した遺伝子リストからmRNAとlncRNAをそれぞれ抽出。

  • 1つ目の引数: 先ほど作成した遺伝子リストを指定。
  • 2つ目の引数: mRNAのみの遺伝子リストを出力。
  • 3つ目の引数: lncRNAのみの遺伝子リストを出力。

PAR-CLIPのピークと遺伝子領域を比較

「15. MEMEによるモチーフ検索 / Representative isoformの用意」のところで作成した、各遺伝子の代表Isoformを抽出したgencode.v19.annotation_only_Rep_basic_mRNAs.bedのBEDファイルから、5' UTR、CDS、3' UTRごとに分割したBEDファイルを作成する。

# Get region infor for each gene (5UTR, ORF, 3UTR)
python2 ./F_split_into_each_section.py \
  ./gencode.v19.annotation_only_Rep_basic_mRNAs.bed \
  ./gencode.v19.annotation_only_Rep_basic_mRNAs_each_region.bed
  • 1つ目の引数: 各遺伝子の代表Isoformを抽出したBEDファイルを指定。
  • 2つ目の引数: 5' UTR、CDS、3' UTRごとに分割したBEDファイルを出力。

さらに、Intron領域についてもBEDファイルを作成する。

# Add intron region
$ python G_add_intron_infor.py  \
  ./gencode.v19.annotation_only_Rep_basic_mRNAs_each_region.bed \
  ./gencode.v19.annotation_only_Rep_basic_mRNAs_each_region_intron_plus.bed
  • 1つ目の引数: 先ほど作成した5' UTR、CDS、3' UTRごとに分割したBEDファイルを指定。
  • 2つ目の引数: 5' UTR、CDS、3' UTR、Intronごとに分割したBEDファイルを出力。

各遺伝子の5' UTR、CDS、3' UTR、Intronの領域とOverlapするPAR-CLIPのピークをbedtoolsを使って見つける。

# Compare mRNA region with CLIP peaks
$ bedtools intersect -a ./SRR488740_PAR-CLIP_CstF-64_clusters.bed.bed \
  -b ./gencode.v19.annotation_only_Rep_basic_mRNAs_each_region_intron_plus.bed \
  -wa -wb -loj > ./SRR488740_PAR-CLIP_CstF-64_clusters.bed_with_mRNA_region.tmp
  • -a: 先ほど作成した5' UTR、CDS、3' UTR、Intronごとに分割したBEDファイルを指定。
  • -b: 5' UTR、CDS、3' UTR、Intronごとに分割したBEDファイルを出力。
  • -wa: -aに指定したBEDファイルの情報を出力。
  • -wb: -bに指定したBEDファイルの情報を出力。
  • -loj: 通常、-a-bで指定したBEDファイルを比較して、overlapした領域(各行)の情報しか出力しない。このオプションを付けると、-aに指定したBEDファイルの領域とoverlapしていなかった場合NULLを返すことで、-aで指定したBEDファイルは全行結果として出力されるようになる。

標準出力で比較結果が出力される。

bedtoolsの出力ファイルを整理して、各遺伝子についてPAR-CLIPのピークがどの遺伝子領域(5' UTR、CDS、3' UTR、Intron)に位置しているのかtab-delimited tableとしてまとめる(Excelにコピペして見れる状態にする)。

# Annotate peaks
$ python2 ./H_annotate_peaks.py SRR488740_PAR-CLIP_CstF-64_clusters.bed_with_mRNA_region.tmp \
  ./gencode.v19.annotation_symbol_type_mRNA_list.txt \
  ./SRR488740_PAR-CLIP_CstF-64_clusters_with_mRNA_region.txt
  • 1つ目の引数: 先ほど作成したbedtoolsの出力ファイルを指定。
  • 2つ目の引数: 遺伝子リストの準備の項で準備した、mRNAの遺伝子リストを指定。
  • 3つ目の引数: ピークの位置情報を加えた遺伝子リストを出力。

以上になります。

RNA-seqデータ解析(Alternative splicingの解析, Strand-specific, Single-end)

概要

RNA-seqのデータを用いて、Alternative splicingのイベント(後述)の変化を検出する方法(2群間のデータの比較)を紹介します。

ここでは、データのダウンロード方法からLinuxを用いたデータ解析まで、Alternative splicingのデータ解析の詳細をStep by Stepで説明します。

ただし、基本的なLinuxのコマンド操作は理解している前提で説明を行います。 パソコン(もしくはスパコン)のメモリは16-32GB以上を確保することが望ましいです。

使用するデータ

RNA-seq (Single-end, 101bp; Control siRNA, UPF1 siRNA)

https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE86148

使用するソフトウェア

解析ワークフロー

Alternative splicingを解析する方法として、MISO, DEXSeq, rMATSそれぞれを用いた方法を紹介したいと思います。

TopHat-MISO workflow

PowerPoint スライド ショー - [2016-08-22_NGS_workflow.pptx] 2017-03-28 14.34.30.png (48.7 kB)

TopHat-featureCounts-DEXSeq workflow

PowerPoint スライド ショー - [2016-08-22_NGS_workflow.pptx] 2017-03-28 14.34.56.png (53.5 kB)

TopHat-rMATS workflow

PowerPoint スライド ショー - [2016-08-22_NGS_workflow.pptx] 2017-03-28 14.34.42.png (48.6 kB)

各ソフトウェアの特徴(主観的な意見です…)

MISO
  • 最も引用数が多く、精度も高い(個人的な意見です)。Alternative splicingの解析では、デファクトスタンダードのソフト。
  • skipped exons (SE), mutually exclusive exons (MXE), alternative 3' splice sites (A3SS) , alternative 5' splice sites (A5SS), retained introns (RI)のパターンごとに解析してくれる。
  • n=1のデータしか扱えない(n=2同士のデータを比較することができない)。
  • 扱えるアノテーション情報が限定されている(UCSC gene, RefSeq, Gencodeの組み合わせ。UCSC genome browserにアップロードされている最新のデータにしか対応していない)。
  • 結果ファイルの中身がSplicingのイベントごとに評価されているため、どの遺伝子でSplicingのパターンの変化が起こっているかわかりにくい。
  • p-valueによる有意差検定でなく、Bayes factorを計算しているので、どこでThresholdを引いたらいいかわかりにくい。
DEXSeq
  • MISOについで有名なソフト。精度自体はイマイチなイメージ(個人的な意見です)。
  • Duplicatesに対応しているので、n>=2のデータ同士の比較が可能(内部的にはDESeqのアルゴリズムで2群間比較している)。
  • アノテーション情報は自由に選択できる。
  • 遺伝子のIDとTranscriptのIDがタグ付けされているのでリストが見やすい。
  • Exonブロックごとに評価する(この方法がイマイチな印象)ので、SE, MXE, A3SS, A5SS, RIのどのパターンの変化か判別しづらい。
rMATS
  • あまり引用されてないソフト。
  • Duplicatesに対応しているので、n>=2のデータ同士の比較が可能。
  • Novel splicing sitesの検出も可能。
  • アノテーション情報を自由に選択できる。
  • 遺伝子のIDとGene symbolがタグ付けされているのでリストが見やすい。
  • SE, MXE, A3SS, A5SS, RIごとに解析してくれる。
  • 3つのソフトの中で、最も計算時間がかかる(長いと1日半くらいかかる)。

サンプルコード

Github上に必要なファイルはすべて置いてあります。
https://github.com/Imamachi-n/NGS-Tutorial/tree/master/RNA-seq_for_alternative_splicing_Tutorial

RNA-seq_strand-specific_single-end_1_mapping_for_AS.sh

TopHatによるを行うスクリプト。FASTQファイルを引数として指定。

$ ./RNA-seq_strand-specific_single-end_1_mapping_for_AS.sh  hoge.fastq
  • 10行目: gtfFileにGTFファイル(アノテーション情報)を指定。
  • 11行目: indexContamFileにrRNAなどのコンタミ配列のBowtie用のIndexファイルを指定。
  • 12行目: indexGenomeFileにGenome配列のBowtie用のIndexファイルを指定。
  • 24行目: -rオプションでHouse-keeping genesの遺伝子領域のBEDファイルを指定。
  • 29行目: -rオプションでGencodeアノテーション情報に関するBEDファイルを指定。
MISO_test.sh

MISOでリードカウントを行うスクリプト。FASTQファイルを引数として指定。

$ ./MISO_test.sh hoge.fastq  
  • 14行目: MISO_setting_fileにMISOの設定ファイルを指定。
MISO_comparison.sh

MISOで2群間比較を行うスクリプト。引数として、2群のFASTQファイルを指定する。

$ ./MISO_comparison.sh control.fastq knockdown.fastq
DEXSeq_test.sh

featureCountsでリードカウントを行い、DEXSeqで2群間比較を行うスクリプト

$ ./DEXSeq_test.sh  
  • 8行目: gtfFileにDEXSeq用に用意したアノテーション情報に関するGTFファイルを指定。
  • 9行目: resultDirに保存先のディレクトリ名を指定。
  • 10行目: featureCountFileにfeatureCountsの出力ファイルの名前を指定。
  • 11行目: resultFileにDEXSeqの出力ファイルの名前を指定。
  • 18-23行: リードカウントするBAMファイルをスペース区切りで指定。
  • 30行目: 18-23行で指定したBAMファイルのラベル名をカンマ(,)区切りで指定。
  • 31行目: 18-23行で指定したBAMファイルの属性(Control or Knockdownなど)をカンマ(,)区切りで指定。
rMATS_test.sh

rMATSで2群間比較を行うスクリプト

$ ./rMATS_test.sh  
  • 8行目: gtfFileにGencodeなどのアノテーション情報に関するGTFファイルを指定。
  • 10行目: -b1にControlのBAMファイルをカンマ(,)区切りで指定。
  • 11行目: -b2にKnockdownのBAMファイルをカンマ(,)区切りで指定。

~/custom_command/<hoge.py>となっている箇所はカスタムのPythonスクリプトが置いてあるパス・ファイル名を指定する。

シェルスクリプトを使用するときの注意点

権限の問題

実行権限をシェルスクリプトに与えた後、実行すること。

$ chmod 755 hoge.sh

改行コードの問題

WindowsLinuxで改行コードが異なるため、Windows-Linux間でファイルのやり取りをしていると、改行コードの違いに起因する問題が生じることがある。対処法としては、テキストエディタの設定を変えることでLinuxの改行コードを使用する。

ここではAtomと呼ばれるテキストエディタでの設定方法を説明する。

  • [Ctrl] + [ , ](カンマ)キーを押して、Settingsの画面を呼び出す。
  • 左のメニューから、Packagesをクリック。
  • Installed Packagesでline-ending-selectorと検索。
  • Core Packagesの項目から、line-ending-selectorのSettingsをクリック。
  • 設定画面で、Default line endingをLFに変更。

Settings — C__Users_Naoto_OneDrive_NGS解析_NGS-Tutorial_RNA-seq_Tutorial — Atom 2017-01-31 11.20.21.png (250.6 kB)

これで、新規に作成したファイルの改行コードがデフォルトでLF(Linuxの改行コード)になります。

各ステップの説明

0. 必要なソフトウェアのインストール

まず、前述したソフトウェアをbiocondaを用いて自身の解析環境にインストールします。 biocondaのインストールに関しては、下記の記事を参照のこと。

imamachi-n.hatenablog.com

基本的なソフトのインストール

$ conda install fastqc
$ conda install fastx_toolkit
$ conda install bowtie=1.12
$ conda install tophat
$ conda install samtools
$ conda install rseqc
$ conda install bedtools
$ conda install subread
$ conda install bioconductor-dexseq
注意!!

tophatによるマッピングで最新のbowtieを使うとエラーが出るので、以前のバージョンのbowtie v1.12を代わりにインストールする。

MISOとrMATSのインストールは一筋縄ではいかないので、個別にインストール方法について説明します(あくまで、自分の解析環境にインストールしたときのやり方で、一般的な方法ではありません)。

MISOのインストール

インストールするもの
  • fastmiso (MISO)
  • rnaseqlib
インストールの方法

詳細は下記のURLを参照のこと。
http://miso.readthedocs.io/en/fastmiso/
http://rnaseqlib.readthedocs.io/en/clip/

まず、biocondaで新しい仮想環境を作ります。ここでは、python2.7をベースに仮想環境を構築します。

$ conda create -n miso python=2.7
  • -nで仮想環境の名前を指定します。
  • pythonに2.7を指定することで、python2.7を仮想環境にインストール

source activateに続けて、先ほど作成した仮想環境の名称を指定することで、仮想環境に入ることができます。

$ source activate miso

conda info --envsで現在どの環境にいる確認できるので、前後でどの環境にいるか確認してみましょう。

$ conda info --envs
  # conda environments:
  #
  miso                     /home/akimitsu/miniconda2/envs/miso
  root                  *  /home/akimitsu/miniconda2

$ source activate miso
$ conda info --envs
  # conda environments:
  #
  miso                 *  /home/akimitsu/miniconda2/envs/miso
  root                     /home/akimitsu/miniconda2

最初はrootという環境にいたのが、source activate misoの後、misoという仮想環境に移動していることがわかると思います。

MISOの実行は、このmisoと名付けた仮想環境上で行うこととします。また、その他の必要なソフトウェアに関しても同様の環境上にインストールしていきます。

それでは、fastmiso, rnaseqlibに必要なパッケージやソフトウェアをBiocondaを利用してあらかじめインストールしておきましょう。

$ conda install matplotlib
$ conda install scipy 
$ conda install pysam
$ conda install pandas
$ conda install pybedtools
$ conda install cutadapt
$ conda install samtools=0.1.19
$ conda install bedtools
$ conda install gffutils
注意!!

MISOは内部でSamtoolsを利用していますが、バージョンはv1.0未満のものに対応しています。なので、v1.0以上だとエラーが発生してMISOが動きません。

conda install samtools=0.1.19
fastmiso (MISO)のインストール

下記のURLにアクセスして、
http://genes.mit.edu/burgelab/miso/software.html
MISO from the latest GitHub repository can be downloaded as a zipfile without going through GitHub here:
* C version of MISO (fastmiso)

をクリックしてサイトから直接ソースコードをダウンロードします。 PyPyからインストールしたものだとうまく機能しないことがありました。
http://genes.mit.edu/burgelab/miso/software.html

ダウンロード後、ファイルを解凍します。

$ unzip rden-MISO-09b2a92.zip
yarden-MISO-09b2a92/misopy/credible_intervals.pyスクリプトの修正

現行のソースコードでは、MISOの実行中にcredible_intervals.pyでエラーが発生してしまいます。エラーを回避するために、面倒ですがソースコードを訂正する必要があります。

46行目:
lower_bound_indx = round((alpha/2)*num_samples) - 1から
lower_bound_indx = int(round((alpha/2)*num_samples) - 1)に変更

49行目:
upper_bound_indx = round((1-alpha/2)*num_samples) - 1から
upper_bound_indx = int(round((1-alpha/2)*num_samples) - 1)に変更

ちなみに元のソースコードだと、54行目で以下のようなエラーが発生します。

cred_interval = [samples[lower_bound_indx], samples[upper_bound_indx]]
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

これは、lower_bound_indxupper_bound_indxがint型でなく、float型であることに起因したエラーだと考えられます(Indexとして整数でない数値を指定してしまっている)。

そのため、エラーを回避するために、途中でlower_bound_indxupper_bound_indxをint型に型変換を行うように書き換える必要があったということです。

ソースコードを修正し終わったら、MISOを現在の仮想環境にインストールします。

$ cd rden-MISO-09b2a92
$ python setup.py install
インストールのチェック

MISO側で、必要なパッケージがちゃんとインストールされているかどうかのチェックを行うコマンドを用意してます。実行してエラーが出ないことを確認します。

$ module_availability
Checking availability of Python modules for MISO
Looking for required Python modules..
Checking for availability of: numpy
Checking for availability of: scipy
Checking for availability of: json
Checking for availability of: matplotlib
Checking for availability of: pysam
All modules are available!
Looking for required executables..
Checking if samtools is available
  - samtools is available
Checking if bedtools is available
  - bedtools is available

また、ユニットテストも用意されているのであわせて実行します。

$ python -m unittest discover misopy
Testing fr-unstranded...
Checking read  f_read  against  +
Checking read  f_read  against  -
Checking read  r_read  against  +
Checking read  r_read  against  -
Testing fr-firststrand...
.Testing conversion of SAM to BAM...
Executing: sam_to_bam --convert /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/test-data/sam-data/c2c12.Atp2b1.sam /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/test-output/sam-output
Converting SAM to BAM...
  - Executing: samtools view -Sbh /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/test-data/sam-data/c2c12.Atp2b1.sam  > /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/test-output/sam-output/c2c12.Atp2b1.bam
[samopen] SAM header is present: 35 sequences.
Sorting BAM file...
  - Executing: samtools sort /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/test-output/sam-output/c2c12.Atp2b1.bam /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/test-output/sam-output/c2c12.Atp2b1.sorted
Indexing BAM...
  - Executing: samtools index /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/test-output/sam-output/c2c12.Atp2b1.sorted.bam
Conversion took 0.00 minutes.
.Testing gene-level Psi...
Testing GFF indexing of: /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/gff-events/mm9/genes/Atp2b1.mm9.gff
Executing: index_gff --index /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/gff-events/mm9/genes/Atp2b1.mm9.gff /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/gff-events/mm9/genes/Atp2b1/indexed
Indexing GFF...
/sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/gff-events/mm9/genes/Atp2b1.mm9.gff appears to already be indexed. Aborting.
Executing: miso --run /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/gff-events/mm9/genes/Atp2b1/indexed /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/test-output/sam-output/c2c12.Atp2b1.sorted.bam --output-dir /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/test-output/gene-psi-output --read-len 36
MISO (Mixture of Isoforms model)
Probabilistic analysis of RNA-Seq data for detecting differential isoforms
Use --help argument to view options.

Using MISO settings file: /home/akimitsu/miniconda2/envs/miso/lib/python2.7/site-packages/misopy-0.5.3-py2.7-linux-x86_64.egg/misopy/settings/miso_settings.txt
Computing Psi values...
  - GFF index: /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/gff-events/mm9/genes/Atp2b1/indexed
  - BAM: /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/test-output/sam-output/c2c12.Atp2b1.sorted.bam
  - Read length: 36
  - Output directory: /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/test-output/gene-psi-output
Checking your GFF annotation and BAM for mismatches...
Checking if BAM has mixed read lengths...
Found reads of length 36 in BAM.
Mapping genes to their indexed GFF representation, using /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/gff-events/mm9/genes/Atp2b1/indexed
Searching for /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/gff-events/mm9/genes/Atp2b1/indexed/genes_to_filenames.shelve..
  - File not found.
Skipping: /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/gff-events/mm9/genes/Atp2b1/indexed/compressed_ids_to_genes.shelve.bak
Skipping: /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/gff-events/mm9/genes/Atp2b1/indexed/genes.gff
Skipping: /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/gff-events/mm9/genes/Atp2b1/indexed/genes_to_filenames.shelve.bak
Skipping: /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/gff-events/mm9/genes/Atp2b1/indexed/compressed_ids_to_genes.shelve.dat
Skipping: /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/gff-events/mm9/genes/Atp2b1/indexed/genes_to_filenames.shelve.dir
Skipping: /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/gff-events/mm9/genes/Atp2b1/indexed/genes_to_filenames.shelve.dat
Skipping: /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/gff-events/mm9/genes/Atp2b1/indexed/compressed_ids_to_genes.shelve.dir
Preparing to run 1 batches of jobs...
Running batch of 1 genes..
  - Executing: python /home/akimitsu/miniconda2/envs/miso/lib/python2.7/site-packages/misopy-0.5.3-py2.7-linux-x86_64.egg/misopy/run_miso.py --compute-genes-from-file "/sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/test-output/gene-psi-output/batch-genes/batch-0_genes.txt" /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/test-output/sam-output/c2c12.Atp2b1.sorted.bam /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/test-output/gene-psi-output --read-len 36  --overhang-len 1 --settings-filename /home/akimitsu/miniconda2/envs/miso/lib/python2.7/site-packages/misopy-0.5.3-py2.7-linux-x86_64.egg/misopy/settings/miso_settings.txt
  - Submitted thread batch-0
Waiting on 1 threads...
.Testing gene-level Psi...
Executing: python /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/index_gff.py --index /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/gff-events/mm9/genes/Atp2b1.mm9.gff /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/gff-events/mm9/indexed
Indexing GFF...
/sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/gff-events/mm9/genes/Atp2b1.mm9.gff appears to already be indexed. Aborting.
Executing: python /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/run_events_analysis.py  --compute-genes-psi /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/gff-events/mm9/indexed /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/test-output/sam-output/c2c12.Atp2b1.sorted.bam --output-dir /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/test-output/gene-psi-output --read-len 36  --paired-end 250 30 --use-cluster
MISO (Mixture of Isoforms model)
To run MISO, please use "miso" instead.
.Testing single-end SE event interface...
Executing: python /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/run_events_analysis.py  --compute-events-psi se-sample /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/test-data/se-counts/se_test.counts --output-dir /sshare4/home_mig/akimitsu/software/yarden-MISO-09b2a92/misopy/test-output/SE-output --read-len 35 --overhang-len 4  --event-type SE --use-cluster
MISO (Mixture of Isoforms model)
To run MISO, please use "miso" instead.
.
----------------------------------------------------------------------
Ran 5 tests in 9.273s

OK

エラーが出ずに、最後にOKが出力されればインストールが適切に行われたと判断します。

rnaseqlibのインストール

次に、MISO用のアノテーション情報を用意するためのスクリプト群をまとめたrnaseqlibをインストールします。Github上にソースコードがあるので、クローンを自身の環境につくります。

git clone https://github.com/yarden/rnaseqlib.git

しかし、現在のバージョンのソースコードではインストールできないので注意してください。こちらも先ほどと同様に、ソースコードを訂正する必要があります。

現行のソースコードでは、setuptoolsをsetup.pyでインポートしていないことによるエラーが発生してしまいます。

問題点の詳細については、下記を参照。
http://stackoverflow.com/questions/12767023/python-packaging

そのため、setup.pyに下記の一文を書き加える必要があります。パッケージをインポートしている序盤の行に書き加えます。

from setuptools import setup

スクリプトを訂正した後、rnaseqlibをインストールします。

# rnaseqlib/
python setup.py install

rMATSのインストール

BiocondaにすでにrMATSは登録されているのですが、現行のレシピでは正常に動作しません。そのため、ソースコードからインストールを行います。
http://rnaseq-mats.sourceforge.net/

まず、ソースコードをダウンロードします。

wget https://sourceforge.net/projects/rnaseq-mats/files/MATS/rMATS.3.2.5.tgz
tar zxvf rMATS.3.2.5.tgz

rMATS.3.2.5ディレクトリにパスを通します。下記のように、ホームディレクトリにあるbashrcにパスを書き加えます。

export PATH=/home/akimitsu/software/rMATS.3.2.5:${PATH}

RNASeq-MATS.pyの1行目を書き換えます。rMATS.3.2.5/RNASeq-MATS.pyの一行目に、下記のようにPythonのパスを書いておくことで、どこからでも実行できるようにします(ここでは、Bioconda2をインストールしているケースを示している)。

#!/home/<ユーザーの名前>/miniconda2/bin/python

1. SRAファイルのダウンロード

NGSデータはシークエンスされたリード(塩基配列)の情報とクオリティスコアのデータをまとめたFASTQ形式のファイルとして保存されています。

FASTQファイルの詳細についてはこちらを参照。
https://en.wikipedia.org/wiki/FASTQ_format

FASTQデータは非常に大きいファイルなので、NCBI GEOでは、FASTQファイルを圧縮したSRAファイルと呼ばれるファイル形式でデータを公開しています。

まず、下記のURLにアクセスすると、
https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE86148

GSEと呼ばれるIDで管理された研究プロジェクトごとのページで、研究の概要や引用されている論文情報を見ることができます。

また、そのプロジェクトで解析したNGSデータがSamplesという項目にリストアップしてあります。

GEO Accession viewer - Google Chrome 2017-02-07 16.27.03.png (236.8 kB)

今回は、35サンプルのうち上6つのサンプルを使用します。

GSMから始まるIDをクリックすると、各サンプルの情報を見ることができます。 サンプル名、使用したCell lineや抗体、簡単な実験プロトコルなどの情報が見ることができます。

そこから、さらに下を見ていくと、SRAファイルの置き場所があります。 Downloadの(ftp)をクリックして、SRAファイルをダウンロードします。

GEO Accession viewer - Google Chrome 2017-02-07 16.34.35.png (280.0 kB)

SRR4081222をクリック。 ブラウザによって見え方が異なります。ここではGoogle Chromeを使っています。

SRR4081222.sraのURLをコピー。

_sra_sra-instant_reads_ByExp_sra_SRX_SRX205_SRX2059672 のインデックス - Google Chrome 2017-02-07 17.13.13.png (61.2 kB)

wgetで該当するSRAファイルをダウンロードします。

$ wget https://sra-download.ncbi.nlm.nih.gov/srapub/SRR4081227
$ wget https://sra-download.ncbi.nlm.nih.gov/srapub/SRR4081226
$ wget https://sra-download.ncbi.nlm.nih.gov/srapub/SRR4081225
$ wget https://sra-download.ncbi.nlm.nih.gov/srapub/SRR4081224
$ wget https://sra-download.ncbi.nlm.nih.gov/srapub/SRR4081223
$ wget https://sra-download.ncbi.nlm.nih.gov/srapub/SRR4081222

SRRのIDだけだとわかりにくいので、ファイル名をリネームします。

$ mv SRR4081222 SRR4081222_Control_1.sra
$ mv SRR4081223 SRR4081223_Control_2.sra
$ mv SRR4081224 SRR4081224_Control_3.sra
$ mv SRR4081225 SRR4081225_UPF1_knockdown_1.sra
$ mv SRR4081226 SRR4081226_UPF1_knockdown_2.sra
$ mv SRR4081227 SRR4081227_UPF1_knockdown_3.sra

SRAファイルからFASTQファイルに変換

先ほどインストールしたSRA Toolkitを使って、NCBI GEOからダウンロードしたSRAファイルをFASTQファイルに展開します。

$ fastq-dump SRR4081222_Control_1.sra
$ fastq-dump SRR4081223_Control_2.sra
$ fastq-dump SRR4081224_Control_3.sra
$ fastq-dump SRR4081225_UPF1_knockdown_1.sra
$ fastq-dump SRR4081226_UPF1_knockdown_2.sra
$ fastq-dump SRR4081227_UPF1_knockdown_3.sra

2. Quality check

FastQCを使って、FASTQファイルに記載されている各リードのクオリティをチェックします。

FASTQファイルはPhred Quality Scoreと呼ばれる指標によって、各塩基のクオリティを記述しています。

詳しくはこちらのサイトを参照のこと。
https://en.wikipedia.org/wiki/Phred_quality_score

実行例

$ mkdir fastqc_SRR4081222_Control_1
$ fastqc -t 8 -o ./fastqc_SRR4081222_Control_1 \
  ./SRR4081222_Control_1.fastq -f fastq

mkdirコマンドでfastqc_SRR4081222_Control_1という名前のディレクトリをカレントディレクトリに作ります。

次に、fastqcを使ってSRR4081222_Control_1.fastqのデータのクオリティをチェックします。 -tオプションで使用するCPUのコア数を指定します。コア数を増やせば単純に計算速度が向上しますが、FastQCではメモリを1コアあたり250MB消費するので、要求できるメモリ量を超えるコア数を指定するとエラーが起こります。

-oオプションで出力先のディレクトリを指定し、-fオプションでInputファイルのファイル形式を指定しています。

FastQCから出力されるデータが、fastqc_SRR4081222_Control_1ディレクトリの中のSRR4081222_Control_1_fastqc.htmlになります。 ファイルをブラウザで開くと以下のようなグラフを確認できます。

Basic Statistics

基本的な統計量が示されています。

  • 全リード数
  • リード長
  • GC contents

などなど

Per base sequence quality

リードの各塩基のクオリティスコアを示しています。 Phred quality scoreがだいたいグリーンの領域(Scoreが28以上)に収まっているかどうか確認します。 結果として、クオリティが低いリードは含まれていないことが確認できます。

ダウンロード.png (8.5 kB)

Per tile sequence quality

フローセルの各タイルごとのクオリティスコアを示しています。

Illumina社製の次世代シーケンサーでは、「フローセル」と呼ばれるガラス基板上でDNA合成反応を行います。このフローセルは「タイル」と呼ばれる単位に区切られており、各タイルごとに塩基配列を決定しています。

シーケンスをかけたときに、例えば特定のタイルに気泡やゴミが入っているとクオリティの低下が見られることがあります。

特定のタイルで著しいクオリティの低下が見られる場合は、シークエンス時に上記のような問題があったと考えられます。

詳しくはこちらの資料を参照のこと。
http://nagasakilab.csml.org/ja/wp-content/uploads/2012/04/Sato_Sugar_JPNreview.pdf

ダウンロード (1).png (8.6 kB)

Per sequence quality scores

各リードの全長のクオリティスコアの分布を示しています。 ダウンロード (2).png (16.2 kB)

Per base sequence content

各塩基のA, T, G, Cの含有量を示しています。 RNA-seqの場合、それぞれの含有量はほぼ25%ずつになりますが、PAR-CLIPのようにRNA結合タンパク質と結合しているRNA配列を抽出してきている場合、それぞれの含有率に偏りが見られます。

ダウンロード (3).png (33.0 kB)

Per sequence GC content

リードのGC contentsの分布を示しています。 ダウンロード (4).png (32.4 kB)

Per base N content

各塩基中に含まれるNの含有率(塩基を読めなかった箇所)を示しています。 ダウンロード (5).png (7.2 kB)

Sequence Length Distribution

リード長の分布を示しています。 ダウンロード (10).png (20.3 kB)

Sequence Duplication Levels

Duplidate readsの含まれている数を示しています。 ダウンロード (6).png (22.9 kB)

Overrepresented sequences

頻出する特徴配列が示されています。リード中にアダプター配列などが混入している場合、その配列が示されます。

Adapter Content

各塩基ごとに見たときのリード中に含まれているアダプターの割合を示しています。 あくまで、FastQCに登録されているアダプター配列しか確認していないので、登録されていないアダプター配列を使っていた場合、そのアダプター配列がリード中に混入していても確認できないことがあります。 ダウンロード (7).png (8.8 kB)

Kmer Content

特定の塩基配列のパターンがリード中に頻出していないかどうかチェックしています。 ダウンロード (8).png (60.2 kB)

3. Mapping

注意!!

マッピングするリード長は必ず同じ長さになるようにしてください。今回使用するAlternative splicingの解析を行うソフトは、異なるリード長が混在するデータを受け付けてくれません。リードのトリミングは避けてください。

TopHatを用いてGenomeとTranscriptomeにリードをマッピングを行います。

注意!!

RNA-seqのデータ解析については近年、マッピングソフトとしてSTARがデファクトスタンダードになっています(あくまで個人的な意見です。ENDODEプロジェクトで使われて一気にスタンダードになった気がします)。

確かに、STARのほうがTopHatと比較してマッピングの精度が向上しているので、現時点ではSTARがファーストチョイスかと思います。

しかし、STARはメモリを大量に消費し、ヒトゲノムだと32GB以上は必要となります。メモリ不足が懸念される解析環境では、メモリ消費が少ないTopHatを選択するのが無難だと思います(昔はこれがデファクトだったので)。

Indexファイルの作成

TopHatの内部で使用されているBowtieでゲノムへマッピングするために、ヒトゲノムに対するIndexファイルを用意する必要があります。

Bowtieのサイトから、Indexファイルはダウンロードすることもできます。右端のカラムに各ゲノムのIndexファイルが羅列されているので、任意のIndexファイルをダウンロードしてきます。 http://bowtie-bio.sourceforge.net/index.shtml

もしくは、自身でIndexファイルを作成することも可能です。以下では、その方法を説明します。

まず、Human Genome(hg19)のFASTAファイルのダウンロードしてきます。 次に、catコマンドで各染色体ごとのFASTAファイルをマージして、hg19.faという名前で出力します。

$ for file in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 X Y M
  do
    wget http://hgdownload.soe.ucsc.edu/goldenPath/hg19/chromosomes/chr${file}.fa.gz
    gunzip chr${file}.fa.gz
  done

$ cat chr1.fa chr2.fa chr3.fa chr4.fa chr5.fa chr6.fa chr7.fa chr8.fa chr9.fa chr10.fa chr11.fa chr12.fa chr13.fa chr14.fa chr15.fa chr16.fa chr17.fa chr18.fa chr19.fa chr20.fa chr21.fa chr22.fa chrX.fa chrY.fa chrM.fa > hg19.fa

最後に、hg19.faファイルからBowtie用のIndexファイルを作成します。

$ bowtie-build ./hg19.fa hg19
  • 1つ目の引数: リファレンスゲノムのFASTAファイルを指定。
  • 2つ目の引数: Indexファイルの名前を指定します。ここでは、Indexの名前をhg19とします。

アノテーション情報(GTFファイル)の準備

TopHatでは、GTF形式のファイルのTranscriptomeのアノテーション情報を使って、Splice junctionサイトに対してもマッピングを行うことができます。

今回はTranscriptomeの情報として、Gencodeのアノテーション情報を利用します。
https://www.gencodegenes.org/releases/19.html

上記のサイトにアクセスすると、さまざまなデータが置いてあるが基本的にgencode.v19.annotation.gtfというメインのアノテーション情報を利用すればOKです。
ftp://ftp.sanger.ac.uk/pub/gencode/Gencode_human/release_19/gencode.v19.annotation.gtf.gz

wgetコマンドで該当のファイルをダウンロードし解凍します。

$ wget ftp://ftp.sanger.ac.uk/pub/gencode/Gencode_human/release_19/gencode.v19.annotation.gtf.gz
$ gunzip ftp://ftp.sanger.ac.uk/pub/gencode/Gencode_human/release_19/gencode.v19.annotation.gtf.gz

カレントディレクトリにgencode.v19.annotation.gtfが保存されます。

GenomeとTranscriptomeへのマッピング

ここまでで、ゲノムのIndexファイルと、アノテーション情報の入ったGTFファイルが用意できたので、いよいよTopHatを用いて各シークエンスリードをゲノムとトランスクリプトームにマッピングします。

以下のコマンドを各サンプル(FASTQファイル)に対して行います。注意すべき点は、--library-typeオプションでサンプルがStrand-specificであることを明示する点です。
https://ccb.jhu.edu/software/tophat/manual.shtml

実行例

$ tophat --bowtie1 -p 8 --library-type fr-firststrand -o ./tophat_out_SRR4081222_Control_1_ss \
  -G ./gencode.v19.annotation.gtf \
  ./hg19 ./SRR4081222_Control_1_1_filtered.fastq
  • --bowtie1: マッピングソフトにBowtie1を使用。
  • -p: 使用するコア数を指定。
  • --library-type fr-firststrand: dUTP法を利用したStrand-specific RNA-seqサンプルに対して、この設定を使用する。
  • -o: 出力先のディレクトリ名を指定(ディレクトリは作成していなくても自動的に作成してくれる)。
  • -G: アノテーション情報として、GTFファイルを指定。
  • 1つ目の引数: 先ほど作成したヒトゲノム(hg19)のBowtie1のIndexファイルを指定。
  • 2つ目の引数: マッピングしたいFASTQファイルを指定。

TopHatによるマッピングが終わると、

  • align_summary.txt
  • accepted_hits.bam

というファイルが出力されます。

align_summary.txtマッピング結果をまとめたテキストファイルで、中身を見てみると、

Reads:
          Input     :  13282516
           Mapped   :  12196063 (91.8% of input)
            of these:   1887950 (15.5%) have multiple alignments (985 have >20)
91.8% overall read mapping rate.

上記のように、マッピングされたリードの数・割合や、Multi-hitしたリードの数・割合などが記載されています。

accepted_hits.bamマッピングされたリードの情報、具体的には、各リードがマッピングされた染色体座標軸、アライメントスコア、リファレンスゲノムと比較したときのIndelやMutationの有無などの情報が記載されています。

ただし、BAMファイルはバイナリファイルなので、ファイルを開いて直接中身を見ることができません。

ファイルの中身を確認したい場合はsamtoolsを用いることで、SAM形式に変換してファイルの中身を確認することができます。

$ samtools view ./tophat_out_SRR4081222_Control_1/accepted_hits.bam | less

SAMファイルの中身。

HWI-ST1075L:319:C42GNACXX:1:1315:16479:46448    256     chr1    12137   0       36M     *       0       0       CCTGCATGTAACTTAATACCACAACCAGGCATAGGG    @@@FFFFFHHHHHJJJJJJIJJJJJGIGEHIGGIEG    XA:i:1  MD:Z:0T35       NM:i:1  XS:A:+  NH:i:6  CC:Z:chr15      CP:i:102518998  HI:i:0
HWI-ST1075L:319:C42GNACXX:1:1214:15035:37072    272     chr1    12333   0       36M     *       0       0       GGCTGTGACTGCTCAGACCAGCCGGCTGGAGGGAGG    JIJJIIIIIJJIGIIIIJJJJJIHHHGHFFFFFCCC    XA:i:0  MD:Z:36 NM:i:0  XS:A:+  NH:i:6  CC:Z:chr15      CP:i:102518802  HI:i:0
HWI-ST1075L:319:C42GNACXX:1:1301:7343:9547      272     chr1    12693   1       36M     *       0       0       CTCTTGTGAGTGTCCCCAGTGTTGCAGAGGTGAGAG    JJIHIJJJJJJIGJJJJJJJJJJHHHHHFFFFFCCC    XA:i:0  MD:Z:36 NM:i:0  XS:A:+  NH:i:4  CC:Z:chr15      CP:i:102518442  HI:i:0
HWI-ST1075L:319:C42GNACXX:1:2204:8186:34501     16      chr1    12693   1       36M     *       0       0       CTCTTGTGAGTGTCCCCAGTGTTGCAGAGGTGAGAG    JJJJJJJJIJJJIIJJJJJJIJJHHHHHFFFFFCCC    XA:i:0  MD:Z:36 NM:i:0  XS:A:+  NH:i:4  CC:Z:chr15      CP:i:102518442  HI:i:0
HWI-ST1075L:319:C42GNACXX:1:1305:5797:18762     272     chr1    12957   0       36M     *       0       0       CATCCCCTTCACTCCCAGCTCAGAGCCCAGGCCAGG    DEHIGGIFF?2F;GGFAIIHIGGHDFHDDFDFD@@@    XA:i:0  MD:Z:36 NM:i:0  XS:A:+  NH:i:6  CC:Z:chr12      CP:i:92621      HI:i:0
HWI-ST1075L:319:C42GNACXX:1:2213:9952:39080     272     chr1    13024   0       36M     *       0       0       GTGCATGAAGGCTGTCAACCAGTCCATAGGCAAGCC    JJJJJJJJJJIIJIIHIGJJJJJHHGHHFFFFFCCC    XA:i:0  MD:Z:36 NM:i:0  XS:A:+  NH:i:7  CC:Z:chr12      CP:i:92554      HI:i:0

BAM/SAMファイルについての詳細を知りたい場合は、下記のURLを参照のこと。
https://samtools.github.io/hts-specs/
https://samtools.github.io/hts-specs/SAMv1.pdf
https://samtools.github.io/hts-specs/SAMtags.pdf

4. データの品質チェック

RNA-seq用のRNAサンプルはバイオアナライザーなどの機械であらかじめRNAの品質をチェックしてからcDNAライブラリを作成しています。

ただ、古いデータの中にはRNAの品質に問題があるものもあり、遺伝子領域を見たときに、例えば、5'側から3'側でのCoverageがガタガタするケースがあります。

その他にも、PolyAセレクションを行ったサンプルの場合、RNAの品質が悪いと3'側に極端にリードが偏る傾向にあることが知られています。

そこで、マッピングされたリードから遺伝子領域上のシークエンスリードのCoverageを調べることによって、大まかにRNAの品質も問題がないか確認を行います。

今回は、RSeQCスクリプトの1つであるgeneBody_coverage.pyを用いて、遺伝子領域上でのCoverageを調べてみようと思います。

このスクリプトの実行には、BAMファイルとそのIndexファイル、BED形式で記述された遺伝子領域の情報(アノテーション情報)が必要になります。

まず、アノテーション情報に関しては、基本的にどの細胞でも発現しているHouse-keeping genesのみに絞って解析したほうがよいです。

そこで、RSeQCの開発元が配布しているHouse-keeping genesのBEDファイルのリストを入手してきます。

$ wget https://sourceforge.net/projects/rseqc/files/BED/Human_Homo_sapiens/hg19.HouseKeepingGenes.bed

次に、結果の保存先のディレクトリの用意と、BAMファイルのIndexファイルを作成しておきます。

$ mkdir geneBody_coverage_SRR4081222_Control_1
$ samtools index ./tophat_out_SRR4081222_Control_1/accepted_hits.bam

mkdirコマンドで新しいディレクトリを作成。samtools indexでBAMファイルのIndexファイルを作成します。引数にはBAMファイルを指定するだけです。

それでは、House-keeping genesの遺伝子領域のCoverageを調べてみたいと思います。

実行例

$ geneBody_coverage.py -r ./hg19.HouseKeepingGenes.bed \
  -i ./tophat_out_SRR4081222_Control_1/accepted_hits.bam  \
  -o ./geneBody_coverage_SRR4081222_Control_1/SRR4081222_Control_1_RSeQC_output
  • -r: 先ほどダウンロードしたHouse-keeping genesの情報が格納されているBEDファイルを指定。
  • -i: Coverageを調べたいBAMファイルを指定(加えて、Indexファイルを同じディレクトリにおいておく必要がある)。
  • -o: 出力先のディレクトリとファイル名のPrefix。

結果として、指定した名前.geneBodyCoverage.curves.pdfというファイルが出力されます。ファイルの中身を見るとこんな感じ。

image.png (73.1 kB)

RNAの品質に問題がある(例えば、RNAが壊れている)と、3'側にリードが偏っていたり、cDNAライブラリの構築に使ったRNA量が少なく、PCR時に特定の配列が異常に増幅され(PCR bias、Duplicate readsが多い)、ガタガタしたCoverageの分布を取ることがあります。

こういったデータはRNA定量性に問題があるため、使用しないように気をつけましょう。

このステップで問題がありそうだと判断されるデータに関しては、下記のUCSC genome browserでの可視化により、個々の遺伝子上にマッピングされたリードの分布に注意して見ていく必要があります。

5. マッピングされたリードのStrandnessの確認

RNA-seqの各シークエンスリードがStrand-specificに読まれているかどうか(リードのStrandness)を確認します。ここでは、RSeQCのinfer_experiment.pyというスクリプトを用いました。

アノテーション情報としてBEDファイルを用意

下記のURLに置いてあるgtf2bed.plを使用します。
https://github.com/Imamachi-n/NGS-Tutorial/tree/master/PAR-CLIP_Tutorial_CstF64

使用するスクリプトアノテーション情報としてBEDファイルしか受け付けないので、マッピングの際に使用したGTFファイルgencode.v19.annotation.gtfをここで一旦BEDファイルに変換します。

$ perl gtf2bed.pl gencode.v19.annotation.gtf gencode.v19.annotation.bed
  • 1つ目の引数: 変換したいGTFファイルを指定
  • 2つ目の引数: 出力するBEDファイルを指定。

Strandnessの確認

マッピングしたデータであるBAMファイルと、アノテーション情報であるBEDファイルを指定して実行します。

$ infer_experiment.py -i ./tophat_out_SRR4081222_Control_1_ss/accepted_hits.bam \
  -r ./gencode.v19.annotation.bed -s 400000 \
  >  ./tophat_out_SRR4081222_Control_1_ss/SRR4081222_Control_1_strand_stat.txt
  • -i: Strandnessを調べるBAMファイルを指定。
  • -r: 先ほど用意したBEDファイルのアノテーション情報を指定。
  • s: 解析に使用するリードを指定。ここでは、40万リードを抽出してStrandnessを調べています。指定する数値を大きくすれば計算精度も上がると思いますが、その分時間もかかります。

下記がその結果になります。"++“や”+-“のように2文字で表現されていますが、1文字目がアノテーション情報でのStrandの向き、2文字目がマッピングされたリードのStrandの向きを表しています。

unstranded RNA-seqの場合、Fraction of reads explained by “++,–"とFraction of reads explained by ”+-,-+“の割合が、50%に近くなりますが、今回のようにStrand-specificに読まれているサンプルの場合、下記のように偏りが見られます。

dUTP法でシークエンスされたRNA-seqデータでは、RNAに対してAntisense鎖が読まれます。そのため、+鎖のRNA配列は-鎖として、-鎖のRNA配列は+鎖としてそれぞれ読まれているはずです。

This is SingleEnd Data
Fraction of reads failed to determine: 0.1910
Fraction of reads explained by "++,--": 0.1045
Fraction of reads explained by "+-,-+": 0.7045

例えば上記のように、予想したとおり+-,-+の組み合わせのリードが70%程度大半を占めていることがわかります。

次に、この情報をもとに、UCSC genome browserで可視化させるデータを作成する際に、+と-鎖をそれぞれ分けてファイルを作成します。

6. Visualization (For UCSC genome browser)

BedGraphファイルの準備

Bedtoolsを利用して、TopHatから得られたBAMファイルを、UCSC genome browser上で可視化できるファイル(Bedgraphファイル)に変換します。

まず、mkdirコマンドでデータを保存するディレクトリを作っておきます。

$ mkdir UCSC_visual_SRR4081222_Control_1_ss

bedtools genomecovで特定のゲノム領域でのCoverageを計算する(BAMファイルからBedgraphファイルを作成)。

Bedgraphファイルの詳細については、下記のURLを参照のこと。
https://genome.ucsc.edu/goldenpath/help/bedgraph.html

$ bedtools genomecov -ibam ./SRR4081222_Control_1_ss/accepted_hits.bam \
  -bg -split -strand - \
  > ./UCSC_visual_SRR4081222_Control_1_ss/SRR4081222_Control_1_Forward.bg
$ bedtools genomecov -ibam ./SRR4081222_Control_1_ss/accepted_hits.bam \
  -bg -split -strand + \
  > ./UCSC_visual_SRR4081222_Control_1_ss/SRR4081222_Control_1_Reverse.bg
  • -ibam: BAMファイルを入力ファイルとして指定する。
  • -bg: 出力ファイルの形式をBedGraphファイルに指定。
  • -split: Splicing juctionにマッピングされたリード(リードが分割されてマッピングされているリード)を考慮する。
  • -strand: +もしくは-を指定することで、ゲノムに対して+鎖もしくは-鎖にあたるリードを選択的に抽出することができる。

標準出力でBedGraphファイルが出力されます。

UCSC genome browserへデータをアップロードする際に、ファイルの種類やTrackの名前などを提示する必要があります。それらの情報をヘッダー行(ファイルの一行目)に記載します。

$ echo "track type=bedGraph name=SRR4081222_Control_1_Fw description=SRR4081222_Control_1_Fw visibility=2 maxHeightPixels=40:40:20 color=255,0,0" \
  > ./UCSC_visual_SRR4081222_Control_1_ss/tmp_SRR4081222_Control_1_forward.txt
$ echo "track type=bedGraph name=SRR4081222_Control_1_Re description=SRR4081222_Control_1_Re visibility=2 maxHeightPixels=40:40:20 color=0,0,255" \
  > ./UCSC_visual_SRR4081222_Control_1_ss/tmp_SRR4081222_Control_1_reverse.txt

echoコマンドを使って、ヘッダー行の情報をtxtファイルとして出力しています。

そのあとに、catコマンドを用いて、先ほど作ったBedGraphファイルと結合させます。

$ cat ./UCSC_visual_SRR4081222_Control_1_ss/tmp_SRR4081222_Control_1_forward.txt ./UCSC_visual_SRR4081222_Control_1_ss/SRR4081222_Control_1_Forward.bg \
  > ./UCSC_visual_SRR4081222_Control_1_ss/SRR4081222_Control_1_forward_for_UCSC.bg
$ cat ./UCSC_visual_SRR4081222_Control_1_ss/tmp_SRR4081222_Control_1_reverse.txt ./UCSC_visual_SRR4081222_Control_1_ss/SRR4081222_Control_1_Reverse.bg 
  > ./UCSC_visual_SRR4081222_Control_1_ss/SRR4081222_Control_1_reverse_for_UCSC.bg

出力されたファイルをそのままアップロードしてもOKですが、容量が大きいためアップロードに時間がかかります。そのため、アップロードするファイルのサイズを小さくするために、ここではbzip2ファイルに圧縮しています。echoコマンドのところでヘッダー行の情報をtxtファイルとして出力しています。

$ bzip2 -c ./UCSC_visual_SRR4081222_Control_1_ss/SRR4081222_Control_1_forward_for_UCSC.bg \
  > ./UCSC_visual_SRR4081222_Control_1_ss/SRR4081222_Control_1_forward_for_UCSC.bg.bz2
$ bzip2 -c ./UCSC_visual_SRR4081222_Control_1_ss/SRR4081222_Control_1_reverse_for_UCSC.bg \
  > ./UCSC_visual_SRR4081222_Control_1_ss/SRR4081222_Control_1_reverse_for_UCSC.bg.bz2

データのアップロード

UCSC genome browserにデータをアップロードします。

ホーム画面から、[MyData] -> [Custom Tracks]をクリックします。

Add Custom Tracksというページに移動するので、ファイルを選択をクリックし、アップロードするファイルを選択し、submitボタンをクリックします。

アップロードが完了すると、Manage Custom Tracksというページに移動します。右端にあるgoボタンをクリックすると、データをみることができます。

20170205212758.png (1.7 MB)

7. MISOの実行(所要時間: 1hr)

MISO用のアノテーション情報のIndexファイル作成

MISOの実行には、MISO用のアノテーション情報(Alternative splicingのパターン)を用意する必要があります。使用するアノテーション情報が決まっており、UCSCのknownGene、RefSeqのrefGene、GencodeのensGeneの3つを使用します。

まず、必要なファイルのダウンロードし、解凍します。

$ wget http://hgdownload.soe.ucsc.edu/goldenPath/hg19/database/knownGene.txt.gz
$ wget http://hgdownload.soe.ucsc.edu/goldenPath/hg19/database/refGene.txt.gz
$ wget http://hgdownload.soe.ucsc.edu/goldenPath/hg19/database/ensGene.txt.gz
$ gunzip *.gz

GFFファイルの作成

skipped exons (SE), mutually exclusive exons (MXE), alternative 3' splice sites (A3SS) , alternative 5' splice sites (A5SS), retained introns (RI)のそれぞれのパターンをGFFファイルにまとめます。

gff_make_annotation ./ ./gff --flanking-rule commonshortest --genome-label hg19_Gencode_v19
  • --genome-labelでGFFファイルの名称を指定。

Indexファイルの作成

GFFファイルを作成したら、それぞれのパターンに対して、Indexファイルを作成します。

index_gff --index A3SS.hg19_Gencode_v19.gff3 indexed_A3SS_events/
index_gff --index A5SS.hg19_Gencode_v19.gff3 indexed_A5SS_events/
index_gff --index MXE.hg19_Gencode_v19.gff3 indexed_MXE_events/
index_gff --index SE.hg19_Gencode_v19.gff3 indexed_SE_events/
index_gff --index RI.hg19_Gencode_v19.gff3 indexed_RI_events/

MISOの設定ファイルの準備

miso_settings.txtというファイル名のMISOの設定ファイルを作成します。 以下のような内容を記述しておきます。

[data]
filter_results = True
min_event_reads = 20
strand = fr-firststrand

[sampler]
burn_in = 500
lag = 10
num_iters = 5000
num_processors = 8
  • filter_results: 低Coverageだった場合、解析対象から外すかどうか
  • min_event_reads: 最低リード数を指定。
  • strand: Strandの情報について指定。
  • num_processors: 使用するコア数を指定。

strandに関しては以下のサイトを参照のこと。
http://onetipperday.sterding.com/2012/07/how-to-tell-which-library-type-to-use.html

MISOを実行する

5つそれぞれのパターン(A3SS, A5SS, MXE, RI, SE)についてMISOで解析を行います。

$ for type in A3SS A5SS MXE RI SE
  do
      gff_index="./MISO_index/gff/commonshortest/indexed_${type}_events"
      outputDir="MISO_output_SRR4081222_Control_1_${type}_events/"

      miso --run ${gff_index} ./tophat_out_SRR4081222_Control_1/accepted_hits.bam --output-dir ${outputDir} \
      --read-len 101 --settings-filename ./miso_settings.txt

      summarize_miso --summarize-samples ${outputDir} ${outputDir}
  done
miso

2群間比較する前に、各サンプルについてSplicingのパターンごとにリードカウントを行います。

  • --runで先ほど用意したGFFのIndexファイルを指定します。
  • --output-dirで保存先のディレクトリを指定。
  • --read-lenでリード長を指定。
  • --settings-filenameで先ほど用意したMISOの設定ファイルを指定。
  • 1つめの引数として、解析するBAMファイルを指定。
miso summary

misoでリードカウントした結果をまとめたファイルを出力します(解析に直接使うことはない)。

  • --summarize-samplesmisoで保存先として指定したディレクトリを指定。
  • 1つめの引数として、保存先のディレクトリを指定。
miso_compare

Alternative splicingのパターンの変化を2群間で比較します。

$ for type in A3SS A5SS MXE RI SE
  do
      outputDir="./MISO_comparison_${type}_events"
      MISOFile1="./MISO_output_SRR4081222_Control_1_${type}_events"
      MISOFile2="./MISO_output_SRR4081225_UPF1_knockdown_1_${type}_events"

      compare_miso --compare-samples ${MISOFile1} ${MISOFile2} ${outputDir}
  done
  • --compare-samplesで比較したい2群のデータを指定します(スペース区切り)。このとき指定するのは、misoで保存先に指定したディレクトリです。
  • 1つめの引数として、保存先のディレクトリを指定。

保存先のディレクトリに結果のファイルが出力されます。 ファイルの中身は以下のような感じ。

Book1 - Excel 2017-03-28 22.35.39.png (38.0 kB)

基本的に、diffbayes_factorの値に着目すればOKです。 詳しくは以下のサイトを参照のこと。
http://miso.readthedocs.io/en/fastmiso/#interpreting-and-filtering-miso-output

diffはΔ Ψを意味しています。bayes_factorはその値が高いほど有意な差が2群間であると判断できます。

8. DEXSeqの実行(所要時間: 5hr)

アノテーション情報の準備

必要なスクリプトGithubから入手します。

git clone https://github.com/vivekbhr/Subread_to_DEXSeq.git

Subread_to_DEXSeqディレクトリにパスを通します。下記のように、ホームディレクトリにあるbashrcにパスを書き加えます。

export PATH=/home/akimitsu/software/Subread_to_DEXSeq:${PATH}

次に、アノテーション情報を用意します。

dexseq_prepare_annotation2.py -f gencode.v19.annotation_filtered_DEXSeq.gtf gencode.v19.annotation_filtered.gtf gencode.v19.annotation_filtered_DEXSeq.gff
  • -fオプションでfeatureCountsで集計する用のGTFファイルの出力先を指定。
  • 1つ目の引数で、アノテーションに使用するGTFファイルを指定。
  • 2つ目の引数で、DEXSeq用のGTFファイルの出力先を指定。

featureCountsで集計する

$ mkdir DEXSeq_output_test
$ featureCounts -T 8 -f -O -s 2 \
  -F GTF -t exon -a ./gencode.v19.annotation_filtered_DEXSeq.gtf \
  -o DEXSeq_output_test \
  ./tophat_out_SRR4081222_Control_1/accepted_hits.bam \
  ./tophat_out_SRR4081223_Control_2/accepted_hits.bam \
  ./tophat_out_SRR4081224_Control_3/accepted_hits.bam \
  ./tophat_out_SRR4081225_UPF1_knockdown_1/accepted_hits.bam \
  ./tophat_out_SRR4081226_UPF1_knockdown_2/accepted_hits.bam \
  ./tophat_out_SRR4081227_UPF1_knockdown_3/accepted_hits.bam

mkdirコマンドを使って、保存先のディレクトリを作り、そのあとfeatureCountsを実行します。

  • -T: 使用するコア数の指定。
  • -f: 特徴(Exonなど)ごとにリードをカウントする。
  • -O: 複数の領域にOverlapしているリードもカウントする。
  • -s 2: Transcriptの配列に対してAntisense鎖にあたるリードをカウントする(dUTP法でStrand-specific RNA-seqのデータが得られているため)。
  • -F: GTF/GFFファイルをInputファイルとしていることを明示。
  • -t exon: リードのカウントに使用するExonの情報を指定。ここでは、GTFファイル内で3列目のfeatureがexonである行を使用する用に指定している。
  • -a: アノテーション情報(GTFファイル)を指定。
  • -o: 出力先のパスとファイル名を指定。
  • 1つ目の引数: BAMファイルを指定。

DEXSeqでExonごとのUsageを調べる

内部的には、DESeq2の方法でDispersionを求めてGeneごとでなく、Exonごとに有意差検定を行っています(MISOと計算方法が異なる)。

Rで以下のコードを実行します(もしくはスクリプトにまとめて実行)。

source("~/software/Subread_to_DEXSeq/load_SubreadOutput.R")
suppressPackageStartupMessages({
  require(dplyr)
})

# Load featureCounts result file
samp <- data.frame(row.names = c("cont_1","cont_2","test_1","test_2"), 
                   condition = c("Control","Control","Treatment","Treatment"))
dxd.fc <- DEXSeqDataSetFromFeatureCounts("featureCounts_result_test.txt",
                                         flattenedfile = "/home/akimitsu/database/gencode.v19.annotation_filtered_DEXSeq.gtf",
                                         sampleData = samp)

# Adjust for coverage biases among samples
dxd <- estimateSizeFactors(dxd.fc)

# Estimate variance or dispersion parameters individually exon by exon
dxd <- estimateDispersions(dxd)

png(filename = "test.png", width = 600, height = 600)
plotDispEsts(dxd)
dev.off()

# Test for differential exon usage in each gene
dxd <- testForDEU(dxd)

# Estimate relative exon usage fold changes
dxd <- estimateExonFoldChanges(dxd, fitExpToVar="condition")

# Output DEXSeq result
dxr1 <- DEXSeqResults(dxd)
write.table(dxr1, quote = F, sep = "\t", file = "DEXSeq_test_result.txt")
  • sourceGithubからクローンを作成したSubread_to_DEXSeqディレクトリの直下にあるload_SubreadOutput.Rを呼び出す。
  • data.framerow.namesにBAMファイルのラベル名を、conditionにBAMファイルの属性(Control or Knockdownなど)を代入したデータフレームを作成。
  • DEXSeqDataSetFromFeatureCountsでfeatureCountsから出力されたファイルを指定し、flattenedfileにDEXSeq用に用意したアノテーション情報に関するGTFファイルを代入する。
  • write.tablefileに保存先のファイル名を指定する。

保存先のディレクトリに結果のファイルが出力されます。 ファイルの中身は以下のような感じ。

Book1 - Excel 2017-03-28 23.12.34.png (51.0 kB)

多重検定補正を行ったp-value値であるpadjと、発現量の変化を示したlog2fold_Treatment_Controlに着目すればよい。

9. rMATSの実行(所要時間: 1.5 days)

RNASeq-MATS.py \
-b1 ./tophat_out_SRR4081222_Control_1/accepted_hits.bam,./tophat_out_SRR4081223_Control_2/accepted_hits.bam,./tophat_out_SRR4081224_Control_3/accepted_hits.bam \
-b2 ./tophat_out_SRR4081225_UPF1_knockdown_1/accepted_hits.bam,./tophat_out_SRR4081226_UPF1_knockdown_2/accepted_hits.bam,./tophat_out_SRR4081227_UPF1_knockdown_3/accepted_hits.bam \
-gtf /home/akimitsu/database/gencode.v19.annotation_filtered.gtf \
-o rMATS_test -t single -len 101 -c 0.0001 -analysis U -libType fr-firststrand -novelSS 1
  • -b1: ControlのBAMファイルをカンマ(,)区切りで指定。
  • -b2: KnockdownのBAMファイルをカンマ(,)区切りで指定。
  • -gtf: Gencodeなどのアノテーション情報に関するGTFファイルを指定。
  • -o: 保存先のディレクトリを指定。
  • -t: Single-endかPaired-endか明示する。
  • -len: リード長を指定。
  • -c: Splicingパターンの変化のcutoff値を指定。0.0001の場合、Transcript全体から見て0.01%以上の変化を検出する。
  • -analysis: paired analysisかunpaired analysisか指定する。
  • -libType: Strandの向きの指定(MISOのときと同じ)。
  • -novelSS: Noval splicing sitesを検出するかどうか。1でYes、0でNo。

オプションの詳細はこちらのサイトを参照のこと。
http://rnaseq-mats.sourceforge.net/user_guide.htm

保存先のディレクトリに結果のファイルが出力されます。 ファイルの中身は以下のような感じ。

AS_Event.MATS.JunctionCountOnly.txt

Junctionをまたぐリードだけを集計。

AS_Event.MATS.ReadsOnTargetAndJunctionCounts.txt

Junctionリードを含むExon上にマッピングされたすべてのリードを集計。

  • IncFormLen: length of inclusion form, used for normalization
  • SkipFormLen: length of skipping form, used for normalization
  • IncLevel1: inclusion level for SAMPLE_1 replicates (comma separated) calculated from normalized counts
  • IncLevel2: inclusion level for SAMPLE_2 replicates (comma separated) calculated from normalized counts
  • IncLevelDifference: average(IncLevel1) - average(IncLevel2)

以上になります。

BRIC-seqデータ解析(2群間比較, Unstranded, Single-end)

概要

BRIC-seqはゲノムワイドにmRNAとlncRNAのRNA分解速度を測定する方法です。

ここでは、データのダウンロード方法からLinuxを用いたデータ解析まで、BRIC-seqのデータ解析の詳細をStep by Stepで説明します。

ただし、基本的なLinuxのコマンド操作は理解している前提で説明を行います。パソコン(もしくはスパコン)のメモリは16GB以上を確保することが望ましいです。

このTutorialを通した到達目標

  • FastQCから得られたシークエンスリードのクオリティデータから、FASTQファイルの状態を確認できる。
  • FASTQファイルをゲノムとトランスクリプトームにマッピングすることができる。
  • BAMファイルからデータの品質チェックを行うことができる。
  • UCSC genome browser上でデータを可視化することができる。
  • RNA半減期を算出することができる。
  • 各遺伝子に対するRNA分解曲線(Fitting curve)を描くことができる。
  • Webブラウザを介して、各遺伝子に対するRNA分解曲線のデータを共有することができる。

使用するデータ

BRIC-seq (DRA001215: Control siRNA, STAU1 siRNA)

https://trace.ddbj.nig.ac.jp/DRASearch/submission?acc=DRA001215

使用するソフトウェア

解析ワークフロー

BRIC-seqデータからRNA半減期を算出し、さらに2群間の半減期を比較する方法を紹介したいと思います。 PowerPoint スライド ショー - [2016-08-22_NGS_workflow.pptx] 2016-09-06 16.00.52.png (152.5 kB)

サンプルコード

Github上に必要なファイルはすべて置いてあります。
https://github.com/Imamachi-n/NGS-Tutorial/tree/master/BRIC-seq_Tutorial

BRIC-seq_unstr_single-end_1_mapping.sh

TopHatによるマッピング・featureCountsによるリードカウントまでを行うスクリプト。FASTQファイルを引数として指定。

$ ./BRIC-seq_unstr_single-end_1_mapping.sh hoge.fastq

11行目: gtfFileにGTFファイル(アノテーション情報)を指定。
12行目: indexContamFileにrRNAなどのコンタミ配列のBowtie用のIndexファイルを指定。
13行目: indexGenomeFileにGenome配列のBowtie用のIndexファイルを指定。
35行目: -rオプションでHouse-keeping genesの遺伝子領域のBEDファイルを指定。

BRIC-seq_unstr_single-end_2_RPKM_calc_Control.sh/BRIC-seq_unstr_single-end_2_RPKM_calc_Knockdown.sh

Cuffnormによるリードカウントを行うスクリプト

$ ./BRIC-seq_unstr_single-end_2_RPKM_calc_Control.sh 

8行目: filenameに保存先のディレクトリ名を指定。
9行目: gtfFileにGTFファイル(アノテーション情報)を指定。
13-18行目: スペース()区切りでBAMファイルを時系列順に指定。
21行目: gene_listgencode.v19.annotation_filtered_symbol_type_list.txt(後述)を指定。

BRIC-seq_unstr_single-end_3_RNA_half-life_calc.sh(BridgeR_analysis_mRNA.R/BridgeR_analysis_lncRNA.R)

BridgeR2によるRNA半減期の算出、および2群間比較を行うスクリプト

$ ./BRIC-seq_unstr_single-end_3_RNA_half-life_calc.sh

3,4行目: 算出したmRNAとlncRNAのRNA半減期のリストを保存するディレクトリ名を指定。 9,14行目: ControlとKnockdownのリードカウント(集計)データを指定(カンマ(,)区切り)。

BridgeR_analysis_mRNA.R/BridgeR_analysis_lncRNA.Rに関しては、 8行目: group変数に2群のラベル名を代入。 9行目: hour変数にタイムコースを代入。 35行目: comparisonFile変数に2群のラベル名を代入。 37行目: “BridgeR_6_PUM1KD"を任意の名前に変更。

BridgeR_shinyapp.R

6行目: BridgeR2から得られたRNA半減期のリストを指定。 11行目: hour変数にタイムコースを代入。

~/custom_command/<hoge.py>となっている箇所はカスタムのPythonスクリプトが置いてあるパス・ファイル名を指定する。

シェルスクリプトを使用するときの注意点

権限の問題

実行権限をシェルスクリプトに与えた後、実行すること。

$ chmod 755 <hoge.sh>

改行コードの問題

WindowsLinuxで改行コードが異なるため、Windows-Linux間でファイルのやり取りをしていると、改行コードの違いに起因する問題が生じることがある。対処法としては、テキストエディタの設定を変えることでLinuxの改行コードを使用する。

ここではAtomと呼ばれるテキストエディタでの設定方法を説明する。

  • [Ctrl] + [ , ](カンマ)キーを押して、Settingsの画面を呼び出す。
  • 左のメニューから、Packagesをクリック。
  • Installed Packagesでline-ending-selectorと検索。
  • Core Packagesの項目から、line-ending-selectorのSettingsをクリック。
  • 設定画面で、Default line endingをLFに変更。

Settings — C__Users_Naoto_OneDrive_NGS解析_NGS-Tutorial_RNA-seq_Tutorial — Atom 2017-01-31 11.20.21.png (250.6 kB)

これで、新規に作成したファイルの改行コードがデフォルトでLF(Linuxの改行コード)になります。

各ステップの説明

0. 必要なソフトウェアのインストール

まず、前述したソフトウェアをbiocondaを用いて自身の解析環境にインストールします。 biocondaのインストールに関しては、下記の記事を参照のこと。

imamachi-n.hatenablog.com

$ conda install fastqc
$ conda install fastx_toolkit
$ conda install bowtie=1.12
$ conda install tophat
$ conda install samtools
$ conda install bedtools
$ conda install cufflinks

tophatによるマッピングで最新のbowtieを使うとエラーが出るので、以前のバージョンのbowtie v1.12を代わりにインストールする。

BRIC-seq解析用のRパッケージbridger2をインストールします。

$ R
> Sys.setenv(CURL_CA_BUNDLE = "/home/akimitsu/miniconda2/ssl/cacert.pem")
> install.packages('bridger2', repos='http://cran.us.r-project.org')

1. SRAファイルのダウンロード

DDBJ DRAに登録されているBRIC-seqのSRAファイルをダウンロードし、FASTQファイルに変換します。

$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012976/DRR014456/DRR014456.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012974/DRR014454/DRR014454.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012972/DRR014452/DRR014452.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012970/DRR014450/DRR014450.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012968/DRR014448/DRR014448.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012966/DRR014446/DRR014446.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012965/DRR014445/DRR014445.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012963/DRR014443/DRR014443.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012961/DRR014441/DRR014441.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012959/DRR014439/DRR014439.sra
$ wget  ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012957/DRR014437/DRR014437.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012955/DRR014435/DRR014435.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012954/DRR014434/DRR014434.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012952/DRR014432/DRR014432.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012950/DRR014430/DRR014430.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012948/DRR014428/DRR014428.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012946/DRR014426/DRR014426.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012944/DRR014424/DRR014424.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012943/DRR014423/DRR014423.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012941/DRR014421/DRR014421.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012939/DRR014419/DRR014419.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012937/DRR014417/DRR014417.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012935/DRR014415/DRR014415.sra
$ wget ftp://ftp.ddbj.nig.ac.jp/ddbj_database/dra/sralite/ByExp/litesra/DRX/DRX012/DRX012933/DRR014413/DRR014413.sra

$ mv DRR014456.sra BRIC_siSTAU1_705min_2_DRR014456.sra
$ mv DRR014434.sra BRIC_siSTAU1_705min_1_DRR014434.sra
$ mv DRR014454.sra BRIC_siSTAU1_465min_2_DRR014454.sra
$ mv DRR014432.sra BRIC_siSTAU1_465min_1_DRR014432.sra
$ mv DRR014452.sra BRIC_siSTAU1_225min_2_DRR014452.sra
$ mv DRR014430.sra BRIC_siSTAU1_225min_1_DRR014430.sra
$ mv DRR014450.sra BRIC_siSTAU1_105min_2_DRR014450.sra
$ mv DRR014428.sra BRIC_siSTAU1_105min_1_DRR014428.sra
$ mv DRR014448.sra BRIC_siSTAU1_45min_2_DRR014448.sra
$ mv DRR014426.sra BRIC_siSTAU1_45min_1_DRR014426.sra
$ mv DRR014446.sra BRIC_siSTAU1_0min_2_DRR014446.sra
$ mv DRR014424.sra BRIC_siSTAU1_0min_1_DRR014424.sra
$ mv DRR014445.sra BRIC_siCTRL_705min_2_DRR014445.sra
$ mv DRR014423.sra BRIC_siCTRL_705min_1_DRR014423.sra
$ mv DRR014443.sra BRIC_siCTRL_465min_2_DRR014443.sra
$ mv DRR014421.sra BRIC_siCTRL_465min_1_DRR014421.sra
$ mv DRR014441.sra BRIC_siCTRL_225min_2_DRR014441.sra
$ mv DRR014419.sra BRIC_siCTRL_225min_1_DRR014419.sra
$ mv DRR014439.sra BRIC_siCTRL_105min_2_DRR014439.sra
$ mv DRR014417.sra BRIC_siCTRL_105min_1_DRR014417.sra
$ mv DRR014437.sra BRIC_siCTRL_45min_2_DRR014437.sra
$ mv DRR014415.sra BRIC_siCTRL_45min_1_DRR014415.sra
$ mv DRR014435.sra BRIC_siCTRL_0min_2_DRR014435.sra
$ mv DRR014413.sra BRIC_siCTRL_0min_1_DRR014413.sra

$ for file in *.sra
  do
      fastq-dump ${file}
  done

$ cat BRIC_siSTAU1_0min_1_DRR014424.fastq BRIC_siSTAU1_0min_2_DRR014446.fastq > BRIC_siSTAU1_0min_DRR014424_DRR014446.fastq
$ cat BRIC_siSTAU1_45min_1_DRR014426.fastq BRIC_siSTAU1_45min_2_DRR014448.fastq > BRIC_siSTAU1_45min_DRR014426_DRR014448.fastq
$ cat BRIC_siSTAU1_105min_1_DRR014428.fastq BRIC_siSTAU1_105min_2_DRR014450.fastq > BRIC_siSTAU1_105min_DRR014428_DRR014450.fastq
$ cat BRIC_siSTAU1_225min_1_DRR014430.fastq BRIC_siSTAU1_225min_2_DRR014452.fastq > BRIC_siSTAU1_225min_DRR014430_DRR014452.fastq
$ cat BRIC_siSTAU1_465min_1_DRR014432.fastq BRIC_siSTAU1_465min_2_DRR014454.fastq > BRIC_siSTAU1_465min_DRR014432_DRR014454.fastq
$ cat BRIC_siSTAU1_705min_1_DRR014434.fastq BRIC_siSTAU1_705min_2_DRR014456.fastq > BRIC_siSTAU1_705min_DRR014434_DRR014456.fastq
$ cat BRIC_siCTRL_0min_1_DRR014413.fastq BRIC_siCTRL_0min_2_DRR014435.fastq > BRIC_siCTRL_0min_DRR014413_DRR014435.fastq
$ cat BRIC_siCTRL_45min_1_DRR014415.fastq BRIC_siCTRL_45min_2_DRR014437.fastq > BRIC_siCTRL_45min_DRR014415_DRR014437.fastq
$ cat BRIC_siCTRL_105min_1_DRR014417.fastq BRIC_siCTRL_105min_2_DRR014439.fastq > BRIC_siCTRL_105min_DRR014417_DRR014439.fastq
$ cat BRIC_siCTRL_225min_1_DRR014419.fastq BRIC_siCTRL_225min_2_DRR014441.fastq > BRIC_siCTRL_225min_DRR014419_DRR014441.fastq
$ cat BRIC_siCTRL_465min_1_DRR014421.fastq BRIC_siCTRL_465min_2_DRR014443.fastq > BRIC_siCTRL_465min_DRR014421_DRR014443.fastq
$ cat BRIC_siCTRL_705min_1_DRR014423.fastq BRIC_siCTRL_705min_2_DRR014445.fastq > BRIC_siCTRL_705min_DRR014423_DRR014445.fastq

$ rm BRIC_siSTAU1_705min_2_DRR014456.fastq
$ rm BRIC_siSTAU1_705min_1_DRR014434.fastq
$ rm BRIC_siSTAU1_465min_2_DRR014454.fastq
$ rm BRIC_siSTAU1_465min_1_DRR014432.fastq
$ rm BRIC_siSTAU1_225min_2_DRR014452.fastq
$ rm BRIC_siSTAU1_225min_1_DRR014430.fastq
$ rm BRIC_siSTAU1_105min_2_DRR014450.fastq
$ rm BRIC_siSTAU1_105min_1_DRR014428.fastq
$ rm BRIC_siSTAU1_45min_2_DRR014448.fastq
$ rm BRIC_siSTAU1_45min_1_DRR014426.fastq
$ rm BRIC_siSTAU1_0min_2_DRR014446.fastq
$ rm BRIC_siSTAU1_0min_1_DRR014424.fastq
$ rm BRIC_siCTRL_705min_2_DRR014445.fastq
$ rm BRIC_siCTRL_705min_1_DRR014423.fastq
$ rm BRIC_siCTRL_465min_2_DRR014443.fastq
$ rm BRIC_siCTRL_465min_1_DRR014421.fastq
$ rm BRIC_siCTRL_225min_2_DRR014441.fastq
$ rm BRIC_siCTRL_225min_1_DRR014419.fastq
$ rm BRIC_siCTRL_105min_2_DRR014439.fastq
$ rm BRIC_siCTRL_105min_1_DRR014417.fastq
$ rm BRIC_siCTRL_45min_2_DRR014437.fastq
$ rm BRIC_siCTRL_45min_1_DRR014415.fastq
$ rm BRIC_siCTRL_0min_2_DRR014435.fastq
$ rm BRIC_siCTRL_0min_1_DRR014413.fastq

2. Quality check

FastQCを使って、FASTQファイルに記載されている各リードのクオリティをチェックします。

FASTQファイルはFred Quality Scoreと呼ばれる指標によって、各塩基のクオリティを記述しています。

詳しくはこちらのサイトを参照のこと。
https://en.wikipedia.org/wiki/Phred_quality_score

実行例

$ mkdir fastqc_BRIC_siSTAU1_0min_DRR014424_DRR014446
$ fastqc -t 8 -o ./fastqc_BRIC_siSTAU1_0min_DRR014424_DRR014446 \
  ./BRIC_siSTAU1_0min_DRR014424_DRR014446.fastq -f fastq

mkdirコマンドでfastqc_BRIC_siSTAU1_0min_DRR014424_DRR014446という名前のディレクトリをカレントディレクトリに作ります。

次に、fastqcを使ってBRIC_siSTAU1_0min_DRR014424_DRR014446.fastqのデータのクオリティをチェックします。 -tオプションで使用するCPUのコア数を指定します。コア数を増やせば単純に計算速度が向上しますが、FastQCではメモリを1コアあたり250MB消費するので、要求できるメモリ量を超えるコア数を指定するとエラーが起こります。

-oオプションで出力先のディレクトリを指定し、-fオプションでInputファイルのファイル形式を指定しています。

FastQCから出力されるデータが、fastqc_BRIC_siSTAU1_0min_DRR014424_DRR014446ディレクトリの中のBRIC_siSTAU1_0min_DRR014424_DRR014446_fastqc.htmlになります。 ファイルをブラウザで開くと以下のようなグラフを確認できます。

Basic Statistics

基本的な統計量が示されています。

  • 全リード数
  • リード長
  • GC contents

などなど

Per base sequence quality

リードの各塩基のクオリティスコアを示しています。 Phred quality scoreがだいたいグリーンの領域(Scoreが28以上)に収まっているかどうか確認します。 結果として、クオリティが低いリードは含まれていないことが確認できます。

ダウンロード.png (8.5 kB)

Per tile sequence quality

フローセルの各タイルごとのクオリティスコアを示しています。

Illumina社製の次世代シーケンサーでは、「フローセル」と呼ばれるガラス基板上でDNA合成反応を行います。このフローセルは「タイル」と呼ばれる単位に区切られており、各タイルごとに塩基配列を決定しています。

シーケンスをかけたときに、例えば特定のタイルに気泡やゴミが入っているとクオリティの低下が見られることがあります。

特定のタイルで著しいクオリティの低下が見られる場合は、シークエンス時に上記のような問題があったと考えられます。

詳しくはこちらの資料を参照のこと。
http://nagasakilab.csml.org/ja/wp-content/uploads/2012/04/Sato_Sugar_JPNreview.pdf

ダウンロード (1).png (8.6 kB)

Per sequence quality scores

各リードの全長のクオリティスコアの分布を示しています。 ダウンロード (2).png (16.2 kB)

Per base sequence content

各塩基のA, T, G, Cの含有量を示しています。 RNA-seqの場合、それぞれの含有量はほぼ25%ずつになりますが、PAR-CLIPのようにRNA結合タンパク質と結合しているRNA配列を抽出してきている場合、それぞれの含有率に偏りが見られます。

ダウンロード (3).png (33.0 kB)

Per sequence GC content

リードのGC contentsの分布を示しています。 ダウンロード (4).png (32.4 kB)

Per base N content

各塩基中に含まれるNの含有率(塩基を読めなかった箇所)を示しています。 ダウンロード (5).png (7.2 kB)

Sequence Length Distribution

リード長の分布を示しています。 ダウンロード (10).png (20.3 kB)

Sequence Duplication Levels

Duplidate readsの含まれている数を示しています。 ダウンロード (6).png (22.9 kB)

Overrepresented sequences

頻出する特徴配列が示されています。リード中にアダプター配列などが混入している場合、その配列が示されます。

Adapter Content

各塩基ごとに見たときのリード中に含まれているアダプターの割合を示しています。 あくまで、FastQCに登録されているアダプター配列しか確認していないので、登録されていないアダプター配列を使っていた場合、そのアダプター配列がリード中に混入していても確認できないことがあります。 ダウンロード (7).png (8.8 kB)

Kmer Content

特定の塩基配列のパターンがリード中に頻出していないかどうかチェックしています。 ダウンロード (8).png (60.2 kB)

3. Quality filtering

FASTQファイル中にクオリティスコアの低いリードが含まれていることが確認された場合、FASTX-toolkitを用いてクオリティの低い塩基及びリードを除去します。

実行例

$ fastq_quality_trimmer -Q33 -t 20 -l 18 -i ./BRIC_siSTAU1_0min_DRR014424_DRR014446.fastq | fastq_quality_filter -Q33 -q 20 -p 80 -o ./BRIC_siSTAU1_0min_DRR014424_DRR014446_1_filtered.fastq
fastq_quality_trimmerのパラメータ
  • -Q: Phred quality scoreのバージョン指定(Solexa, Illumina 1.3+, Illumina 1.5+といったかなり古いバージョンのFASTQファイルでは'64'を指定。最近のFASTQファイルは'33'と指定しておけばOK)。
  • -t: 指定したPhred quality scoreを下回る塩基をトリミングする。
  • -l: トリミング後の最低リード長。
fastq_quality_filterのパラメータ
  • -q 20 -q 80: リードの80%でPhred quality scoreが20を下回る場合、そのリードを排除する。

4. rRNA removal

polyAセレクションやRiboZero等のrRNAのコンタミを除去しない場合、BRIC-seqではかなりの割合(50%以上)でリボソームRNAコンタミを多く含んでいます。そのため、あらかじめrRNAのコンタミを除いたリードをGenomeやTranscriptomeにリードをマッピングしたほうが計算時間を短縮できます。ここではBowtie1を用いて、リボソームRNAマッピングされなかったリードを抽出します。

Bowtieでマッピングするために、まず、rRNAのIndexファイルを用意する必要があります。まずは、Indexファイルを作成するための配列情報をFASTAファイルとして取ってきます。

NCBIに登録されているX12811.1| Human 5S DNAU13369.1|HSU13369 Human ribosomal DNA complete repeating unitの配列情報を使います。 下記のURLからFASTA形式のデータをコピペしてFASTAファイルをつくります。

Human 5S DNA

https://www.ncbi.nlm.nih.gov/nuccore/23898

Human ribosomal DNA complete repeating unit

https://www.ncbi.nlm.nih.gov/nuccore/555853

上記のrRNAのFASTA形式のデータをcontam_Ribosomal_RNA.faと名前をつけてまとめます。 以下で、先ほど作成したFASTAファイルをもとに、Bowtie用のIndexファイルを作成しています。

$ bowtie-build ./contam_Ribosomal_RNA.fa contam_Ribosomal_RNA
  • 1つ目の引数: 先ほど作成したrRNAのFASTAファイルを指定。
  • 2つ目の引数: Indexファイル名を記載。

Indexファイルを作成した後、rRNAとRepetitive elementsへのマッピングを行います。マッピングされなかったリードについては、FASTQファイルとして出力されるようにオプションを指定します。

実行例

$ bowtie -p 8 --un ./BRIC_siSTAU1_0min_DRR014424_DRR014446_2_norrna.fastq \
  ./contam_Ribosomal_RNA \ 
  ./BRIC_siSTAU1_0min_DRR014424_DRR014446_1_filtered.fastq \
  > rRNA_BRIC_siSTAU1_0min_DRR014424_DRR014446.fastq \
  2>> ./log_BRIC_siSTAU1_0min_DRR014424_DRR014446.txt
  • -p: 使用するコア数。
  • --un: マッピングされなかったリードの出力先(FASTQで出力される)。
  • 1つ目の引数: マッピングさせたいFASTQファイルを指定。
  • 標準出力でマッピングさせた結果は出力される。
  • 標準エラー出力でログデータが出力される。ここでは、2>>でこの標準エラー出力の結果をtxtファイルとして追加保存している。

5. Quality check

rRNAやRepetitive elementsに由来するリードを除いた後、フィルタリング後のFASTQファイルをFastQCを用いて再確認します。

実行例

$ mkdir fastqc_BRIC_siSTAU1_0min_DRR014424_DRR014446_filtered
$ fastqc -o ./fastqc_BRIC_siSTAU1_0min_DRR014424_DRR014446_filtered ./BRIC_siSTAU1_0min_DRR014424_DRR014446_2_norrna.fastq -f fastq

6. Mapping

TopHatを用いてGenomeとTranscriptomeにリードをマッピングを行います。

注意!!

RNA-seq(BRIC-seqも同様)のデータ解析については近年、マッピングソフトとしてSTARがデファクトスタンダードになっています(あくまで個人的な意見です。ENDODEプロジェクトで使われて一気にスタンダードになった気がします)。

確かに、STARのほうがTopHatと比較してマッピングの精度が向上しているので、現時点ではSTARがファーストチョイスかと思います。

しかし、STARはメモリを大量に消費し、ヒトゲノムだと32GB以上は必要となります。メモリ不足が懸念される解析環境では、メモリ消費が少ないTopHatを選択するのが無難だと思います(昔はこれがデファクトだったので)。

Indexファイルの作成

ここでも先ほどのマッピング時と同じように、特定のGenomeのBowtie用のIndexファイルを作成する必要があります。

Bowtieのサイトから、Indexファイルはダウンロードすることもできます。右端のカラムに各ゲノムのIndexファイルが羅列されているので、任意のIndexファイルをダウンロードしてきます。
http://bowtie-bio.sourceforge.net/index.shtml

もしくは、自身でIndexファイルを作成することも可能です。以下では、その方法を説明します。

まず、Human Genome(hg19)のFASTAファイルのダウンロードしてきます。 各染色体ごとにファイルが用意されているので、catコマンドでダウンロードしたすべてのファイルをマージして、hg19.faという名前で出力します。

$ for file in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 X Y M
  do
    wget http://hgdownload.soe.ucsc.edu/goldenPath/hg19/chromosomes/chr${file}.fa.gz
    gunzip chr${file}.fa.gz
  done

$ cat chr1.fa chr2.fa chr3.fa chr4.fa chr5.fa chr6.fa chr7.fa chr8.fa chr9.fa chr10.fa chr11.fa chr12.fa chr13.fa chr14.fa chr15.fa chr16.fa chr17.fa chr18.fa chr19.fa chr20.fa chr21.fa chr22.fa chrX.fa chrY.fa chrM.fa > hg19.fa

最後に、hg19.faファイルからBowtie用のIndexファイルを作成します。

$ bowtie-build ./hg19.fa hg19
  • 1つ目の引数: リファレンスゲノムのFASTAファイルを指定。
  • 2つ目の引数: Indexファイルの名前を指定します。ここでは、Indexの名前をhg19とします。

アノテーション情報(GTFファイル)の準備

TopHatでは、GTF形式のファイルのTranscriptomeのアノテーション情報を使って、Splice junctionに対してもマッピングを行います。

今回はTranscriptomeの情報として、Gencodeのアノテーション情報を利用します。
https://www.gencodegenes.org/releases/19.html

上記のサイトにアクセスすると、さまざまなデータが置いてあるが基本的にgencode.v19.annotation.gtfというメインのアノテーション情報を利用すればOKです。
ftp://ftp.sanger.ac.uk/pub/gencode/Gencode_human/release_19/gencode.v19.annotation.gtf.gz

wgetコマンドで該当のファイルをダウンロードし解凍します。

$ wget ftp://ftp.sanger.ac.uk/pub/gencode/Gencode_human/release_19/gencode.v19.annotation.gtf.gz
$ gunzip ftp://ftp.sanger.ac.uk/pub/gencode/Gencode_human/release_19/gencode.v19.annotation.gtf.gz

カレントディレクトリにgencode.v19.annotation.gtfが保存されます。

GenomeとTranscriptomeへのマッピング

ここまでで、ゲノムのIndexファイルと、アノテーション情報の入ったGTFファイルが用意できたので、いよいよTopHatを用いて各シークエンスリードをゲノムとトランスクリプトームにマッピングします。

以下のコマンドを各サンプル(FASTQファイル)に対して行います。

実行例

$ tophat --bowtie1 -p 8 -o ./tophat_out_BRIC_siSTAU1_0min_DRR014424_DRR014446 \
  -G ./gencode.v19.annotation.gtf \
  ./hg19 ./BRIC_siSTAU1_0min_DRR014424_DRR014446_2_norrna.fastq
  • --bowtie1: マッピングソフトにBowtie1を使用。
  • -p: 使用するコア数を指定。
  • -o: 出力先のディレクトリ名を指定(ディレクトリは作成していなくても自動的に作成してくれる)。
  • -G: アノテーション情報として、GTFファイルを指定。
  • 1つ目の引数: 先ほど作成したヒトゲノム(hg19)のBowtie1のIndexファイルを指定。
  • 2つ目の引数: マッピングしたいFASTQファイルを指定。

TopHatによるマッピングが終わると、

  • align_summary.txt
  • accepted_hits.bam

というファイルが出力されます。

align_summary.txtマッピング結果をまとめたテキストファイルで、中身を見てみると、

Reads:
          Input     :  13282516
           Mapped   :  12196063 (91.8% of input)
            of these:   1887950 (15.5%) have multiple alignments (985 have >20)
91.8% overall read mapping rate.

上記のように、マッピングされたリードの数・割合や、Multi-hitしたリードの数・割合などが記載されています。

accepted_hits.bamマッピングされたリードの情報、具体的には、各リードがマッピングされた染色体座標軸、アライメントスコア、リファレンスゲノムと比較したときのIndelやMutationの有無などの情報が記載されています。

ただし、BAMファイルはバイナリファイルなので、ファイルを開いて直接中身を見ることができません。

ファイルの中身を確認したい場合はsamtoolsを用いることで、SAM形式に変換してファイルの中身を確認することができます。

$ samtools view ./tophat_out_SRR4081222_Control_1/accepted_hits.bam | less

SAMファイルの中身。

HWI-ST1075L:319:C42GNACXX:1:1315:16479:46448    256     chr1    12137   0       36M     *       0       0       CCTGCATGTAACTTAATACCACAACCAGGCATAGGG    @@@FFFFFHHHHHJJJJJJIJJJJJGIGEHIGGIEG    XA:i:1  MD:Z:0T35       NM:i:1  XS:A:+  NH:i:6  CC:Z:chr15      CP:i:102518998  HI:i:0
HWI-ST1075L:319:C42GNACXX:1:1214:15035:37072    272     chr1    12333   0       36M     *       0       0       GGCTGTGACTGCTCAGACCAGCCGGCTGGAGGGAGG    JIJJIIIIIJJIGIIIIJJJJJIHHHGHFFFFFCCC    XA:i:0  MD:Z:36 NM:i:0  XS:A:+  NH:i:6  CC:Z:chr15      CP:i:102518802  HI:i:0
HWI-ST1075L:319:C42GNACXX:1:1301:7343:9547      272     chr1    12693   1       36M     *       0       0       CTCTTGTGAGTGTCCCCAGTGTTGCAGAGGTGAGAG    JJIHIJJJJJJIGJJJJJJJJJJHHHHHFFFFFCCC    XA:i:0  MD:Z:36 NM:i:0  XS:A:+  NH:i:4  CC:Z:chr15      CP:i:102518442  HI:i:0
HWI-ST1075L:319:C42GNACXX:1:2204:8186:34501     16      chr1    12693   1       36M     *       0       0       CTCTTGTGAGTGTCCCCAGTGTTGCAGAGGTGAGAG    JJJJJJJJIJJJIIJJJJJJIJJHHHHHFFFFFCCC    XA:i:0  MD:Z:36 NM:i:0  XS:A:+  NH:i:4  CC:Z:chr15      CP:i:102518442  HI:i:0
HWI-ST1075L:319:C42GNACXX:1:1305:5797:18762     272     chr1    12957   0       36M     *       0       0       CATCCCCTTCACTCCCAGCTCAGAGCCCAGGCCAGG    DEHIGGIFF?2F;GGFAIIHIGGHDFHDDFDFD@@@    XA:i:0  MD:Z:36 NM:i:0  XS:A:+  NH:i:6  CC:Z:chr12      CP:i:92621      HI:i:0
HWI-ST1075L:319:C42GNACXX:1:2213:9952:39080     272     chr1    13024   0       36M     *       0       0       GTGCATGAAGGCTGTCAACCAGTCCATAGGCAAGCC    JJJJJJJJJJIIJIIHIGJJJJJHHGHHFFFFFCCC    XA:i:0  MD:Z:36 NM:i:0  XS:A:+  NH:i:7  CC:Z:chr12      CP:i:92554      HI:i:0

BAM/SAMファイルについての詳細を知りたい場合は、下記のURLを参照のこと。
https://samtools.github.io/hts-specs/
https://samtools.github.io/hts-specs/SAMv1.pdf
https://samtools.github.io/hts-specs/SAMtags.pdf

7. データの品質チェック

RNA-seq用のRNAサンプルはバイオアナライザーなどの機械であらかじめRNAの品質をチェックしてからcDNAライブラリを作成しています。

ただ、古いデータの中にはRNAの品質に問題があるものもあり、遺伝子領域を見たときに、例えば、5'側から3'側でのCoverageがガタガタするケースがあります。

その他にも、PolyAセレクションを行ったサンプルの場合、RNAの品質が悪いと3'側に極端にリードが偏る傾向にあることが知られています。

そこで、マッピングされたリードから遺伝子領域上のシークエンスリードのCoverageを調べることによって、大まかにRNAの品質も問題がないか確認を行います。

今回は、RSeQCスクリプトの1つであるgeneBody_coverage.pyを用いて、遺伝子領域上でのCoverageを調べてみようと思います。

このスクリプトの実行には、BAMファイルとそのIndexファイル、BED形式で記述された遺伝子領域の情報(アノテーション情報)が必要になります。

まず、アノテーション情報に関しては、基本的にどの細胞でも発現しているHouse-keeping genesのみに絞って解析したほうがよいです。

そこで、RSeQCの開発元が配布しているHouse-keeping genesのBEDファイルのリストを入手してきます。

$ wget https://sourceforge.net/projects/rseqc/files/BED/Human_Homo_sapiens/hg19.HouseKeepingGenes.bed

次に、結果の保存先のディレクトリの用意と、BAMファイルのIndexファイルを作成しておきます。

$ mkdir geneBody_coverage_BRIC_siSTAU1_0min_DRR014424_DRR014446
$ samtools index ./tophat_out_BRIC_siSTAU1_0min_DRR014424_DRR014446/accepted_hits.bam

mkdirコマンドで新しいディレクトリを作成。samtools indexでBAMファイルのIndexファイルを作成します。引数にはBAMファイルを指定するだけです。

それでは、House-keeping genesの遺伝子領域のCoverageを調べてみたいと思います。

実行例

$ geneBody_coverage.py -r ./hg19.HouseKeepingGenes.bed \
  -i ./tophat_out_BRIC_siSTAU1_0min_DRR014424_DRR014446/accepted_hits.bam  \
  -o ./geneBody_coverage_BRIC_siSTAU1_0min_DRR014424_DRR014446/BRIC_siSTAU1_0min_DRR014424_DRR014446_RSeQC_output
  • -r: 先ほどダウンロードしたHouse-keeping genesの情報が格納されているBEDファイルを指定。
  • -i: Coverageを調べたいBAMファイルを指定(加えて、Indexファイルを同じディレクトリにおいておく必要がある)。
  • -o: 出力先のディレクトリとファイル名のPrefix。

結果として、指定した名前.geneBodyCoverage.curves.pdfというファイルが出力されます。ファイルの中身を見るとこんな感じ。

image.png (73.1 kB)

RNAの品質に問題がある(例えば、RNAが壊れている)と、3'側にリードが偏っていたり、cDNAライブラリの構築に使ったRNA量が少なく、PCR時に特定の配列が異常に増幅され(PCR bias、Duplicate readsが多い)、ガタガタしたCoverageの分布を取ることがあります。

こういったデータはRNA定量性に問題があるため、使用しないように気をつけましょう。

このステップで問題がありそうだと判断されるデータに関しては、下記のUCSC genome browserでの可視化により、個々の遺伝子上にマッピングされたリードの分布に注意して見ていく必要があります。

8. Visualization (For UCSC genome browser)

BedGraphファイルの準備

Bedtoolsを利用して、TopHatから得られたBAMファイルを、UCSC genome browser上で可視化できるファイル(Bedgraphファイル)に変換します。

まず、mkdirコマンドでデータを保存するディレクトリを作っておきます。

$ mkdir UCSC_visual_BRIC_siSTAU1_0min_DRR014424_DRR014446

bedtools genomecovで特定のゲノム領域でのCoverageを計算します(BAMファイルからBedgraphファイルを作成)。

Bedgraphファイルの詳細については、下記のURLを参照のこと。
https://genome.ucsc.edu/goldenpath/help/bedgraph.html

$ bedtools genomecov -ibam ./tophat_out_BRIC_siSTAU1_0min_DRR014424_DRR014446/accepted_hits.bam -bg -split \
  > ./UCSC_visual_BRIC_siSTAU1_0min_DRR014424_DRR014446/BRIC_siSTAU1_0min_DRR014424_DRR014446_4_result.bg
  • -ibam: BAMファイルを入力ファイルとして指定する。
  • -bg: 出力ファイルの形式をBedGraphファイルに指定。
  • -split: Splicing juctionにマッピングされたリード(リードが分割されてマッピングされているリード)を考慮する。

標準出力でBedGraphファイルが出力されます。

UCSC genome browserへデータをアップロードする際に、ファイルの種類やTrackの名前などを提示する必要があります。
https://genome.ucsc.edu/goldenpath/help/customTrack.html

それらの情報をヘッダー行(ファイルの一行目)に記載します。

$ echo "track type=bedGraph name=BRIC_siSTAU1_0min_DRR014424_DRR014446 description=BRIC_siSTAU1_0min_DRR014424_DRR014446 visibility=2 maxHeightPixels=40:40:20" \
  > ./UCSC_visual_BRIC_siSTAU1_0min_DRR014424_DRR014446/tmp.txt

echoコマンドを使って、ヘッダー行の情報をtxtファイルとして出力しています。

そのあとに、catコマンドを用いて、先ほど作ったBedGraphファイルと結合させます。

$ cat ./UCSC_visual_BRIC_siSTAU1_0min_DRR014424_DRR014446/tmp.txt ./UCSC_visual_BRIC_siSTAU1_0min_DRR014424_DRR014446/BRIC_siSTAU1_0min_DRR014424_DRR014446_4_result.bg \
  > ./UCSC_visual_BRIC_siSTAU1_0min_DRR014424_DRR014446/BRIC_siSTAU1_0min_DRR014424_DRR014446_4_result_for_UCSC.bg

出力されたファイルをそのままアップロードしてもOKですが、容量が大きいためアップロードに時間がかかります。そのため、アップロードするファイルのサイズを小さくするために、ここではbzip2ファイルに圧縮します。

$ bzip2 -c ./UCSC_visual_BRIC_siSTAU1_0min_DRR014424_DRR014446/BRIC_siSTAU1_0min_DRR014424_DRR014446_4_result_for_UCSC.bg \
  > ./UCSC_visual_BRIC_siSTAU1_0min_DRR014424_DRR014446/BRIC_siSTAU1_0min_DRR014424_DRR014446_4_result_for_UCSC.bg.bz2

データのアップロード

UCSC genome browserにデータをアップロードします。

ホーム画面から、[MyData] -> [Custom Tracks]をクリックします。

Add Custom Tracksというページに移動するので、ファイルを選択をクリックし、アップロードするファイルを選択し、submitボタンをクリックします。

アップロードが完了すると、Manage Custom Tracksというページに移動します。右端にあるgoボタンをクリックすると、データをみることができます。

20170205212758.png (1.7 MB)

9. RPKMの算出

BRIC-seqにより得られた各時間のデータ(0h, 1h, 2h, 4h, 8h, 12h)に対して、Cuffnormを用いてRPKM値を算出すします。

Cuffnormの計算に必要なアノテーション情報(GTFファイル)は、Mapping時にダウンロードしたgencode.v19.annotation.gtfを使用します。

# siCTRL
$ cuffnorm -p 8 --compatible-hits-norm -o BRIC-seq_siCTRL1_Gencode ./gencode.v19.annotation_filtered.gtf \
tophat_out_BRIC_siCTRL_0min_DRR014413_DRR014435/accepted_hits.bam \
tophat_out_BRIC_siCTRL_45min_DRR014415_DRR014437/accepted_hits.bam \
tophat_out_BRIC_siCTRL_105min_DRR014417_DRR014439/accepted_hits.bam \
tophat_out_BRIC_siCTRL_225min_DRR014419_DRR014441/accepted_hits.bam \
tophat_out_BRIC_siCTRL_465min_DRR014421_DRR014443/accepted_hits.bam \
tophat_out_BRIC_siCTRL_705min_DRR014423_DRR014445/accepted_hits.bam


# siSTAU1
$ cuffnorm -p 8 --compatible-hits-norm -o BRIC-seq_siSTAU_Gencode ./gencode.v19.annotation_filtered.gtf \
tophat_out_BRIC_siSTAU1_0min_DRR014424_DRR014446/accepted_hits.bam \
tophat_out_BRIC_siSTAU1_45min_DRR014426_DRR014448/accepted_hits.bam \
tophat_out_BRIC_siSTAU1_105min_DRR014428_DRR014450/accepted_hits.bam \
tophat_out_BRIC_siSTAU1_225min_DRR014430_DRR014452/accepted_hits.bam \
tophat_out_BRIC_siSTAU1_465min_DRR014432_DRR014454/accepted_hits.bam \
tophat_out_BRIC_siSTAU1_705min_DRR014434_DRR014456/accepted_hits.bam
  • -p: 使用するコア数を指定。
  • --compatible-hits-norm: アノテーション情報(GTFファイル)に含まれる遺伝子群にマッピングされた総リード数からRPKM値を算出する。
  • -o: 出力先のディレクトリを指定。

  • 1つ目の引数: アノテーション情報のGTFファイルを指定。

  • 2つ目以降の引数: BAMファイルを指定。空白区切りで、時系列順にデータを指定(例えば、0h, 1h, 2h, 4h, 8h, 12hの順)。

パラメータの詳しい解説は以下のサイトを参照のこと。
http://cole-trapnell-lab.github.io/cufflinks/cuffnorm/

10. RNA半減期の計算

カスタムRパッケージであるbridger2を用いて、RNA半減期を算出します。

遺伝子リストの準備

以下のURLに必要なスクリプトが置いてあります。
https://github.com/Imamachi-n/NGS-Tutorial/tree/master/BRIC-seq_Tutorial

まず、extract_gene_symbol_type_from_gtf.pyスクリプトを用いて、GTFファイルから遺伝子リストを作成します(Cuffnormで集計したデータからmRNAとlncRNAに分類分けするために用います)。

$ python2 extract_gene_symbol_type_from_gtf.py  gencode.v19.annotation_filtered.gtf gencode.v19.annotation_filtered_symbol_type_list.txt
  • 1つ目の引数: GTFファイルを指定する。
  • 2つ目の引数: 遺伝子リストが出力される。

bridger2向けのInputファイルの作成

siCTRLとsiPUM1に対するBRIC-seqデータから得られたRPKM値のリストから、mRNAとlncRNAのデータをそれぞれ抽出すします。

# siCTRL
## mRNA
$ python2 ~/custom_command/BridgeR_prep.py \
  ./gencode.v19.annotation_filtered_symbol_type_list.txt \
  ./BRIC-seq_siCTRL_Gencode/genes.fpkm_table \
  mRNA \
  ./BRIC-seq_siCTRL_Gencode/BridgeR_input_file_mRNA.txt

## lncRNA
$ python2 ~/custom_command/BridgeR_prep.py \
  ./gencode.v19.annotation_filtered_symbol_type_list.txt \
  ./BRIC-seq_siCTRL_Gencode/genes.fpkm_table \
  lncRNA \
  ./BRIC-seq_siCTRL_Gencode/BridgeR_input_file_lncRNA.txt

# siPUM1
## mRNA
$ python2 ~/custom_command/BridgeR_prep.py \
  ./gencode.v19.annotation_filtered_symbol_type_list.txt \
  ./BRIC-seq_siSTAU_Gencode/genes.fpkm_table \
  mRNA \
  ./BRIC-seq_siSTAU_Gencode/BridgeR_input_file_mRNA.txt

## lncRNA
$ python2 ~/custom_command/BridgeR_prep.py \
  ./gencode.v19.annotation_filtered_symbol_type_list.txt \
  ./BRIC-seq_siSTAU_Gencode/genes.fpkm_table \
  lncRNA \
  ./BRIC-seq_siSTAU_Gencode/BridgeR_input_file_lncRNA.txt
  • 1つ目の引数: 先ほど用意した遺伝子リストのファイル (gencode.v19.annotation_filtered_symbol_type_list.txt)を指定する。
  • 2つ目の引数: Cuffnormの出力ファイルgenes.fpkm_tableを指定する。
  • 3つ目の引数: mRNAもしくはlncRNAを指定。指定したRNA群を抽出する。
  • 4つ目の引数: 出力ファイル名を指定する。

RNA半減期を測定する

bridger2パッケージを用いてRNA半減期を計算します。

以下のURLに必要なスクリプトが置いてある。
https://github.com/Imamachi-n/NGS-Tutorial/tree/master/BRIC-seq_Tutorial

mRNAとlncRNAのそれぞれに対して、まずmkdirコマンドで保存先にディレクトリを作成します。その後、BridgeR_analysis_mRNA.Rを実行し、RNA半減期を計算します。

# mRNA half-life
$ mkdir BridgeR_result_mRNA
$ Rscript ./BridgeR_analysis_mRNA.R \
  ./BridgeR_result_mRNA \
  ./BRIC-seq_siCTRL_Gencode/BridgeR_input_file_mRNA.txt,./BRIC-seq_siSTAU_Gencode/BridgeR_input_file_mRNA.txt

# lncRNA half-life
$ mkdir BridgeR_result_lncRNA
$ Rscript ./BridgeR_analysis_lncRNA.R \
  ./BridgeR_result_lncRNA \
  ./BridgeR_result_mRNA \
  ./BRIC-seq_siCTRL_Gencode/BridgeR_input_file_lncRNA.txt,./BRIC-seq_siSTAU_Gencode/BridgeR_input_file_lncRNA.txt
BridgeR_analysis_mRNA.Rスクリプト
  • 1つ目の引数: 作成したmRNAデータの保存先ディレクトリを指定。
  • 2つ目の引数: 先ほど用意したsiCTRLとsiPUM1のデータの場所を指定。2つ以上のデータに対しては、カンマ区切りでつなげる。
BridgeR_analysis_lncRNA.Rスクリプト
  • 1つ目の引数: 作成したlncRNAデータの保存先ディレクトリを指定。
  • 2つ目の引数: 作成したmRNAデータの保存先ディレクトリを指定(ノーマライズに使用する重み付けデータをRスクリプト内で使用)。
  • 3つ目の引数: 先ほど用意したsiCTRLとsiPUM1のデータの場所を指定。2つ以上のデータに対しては、カンマ区切りでつなげる。

BridgeR_analysis_mRNA.Rスクリプトについて

8, 9行目のgrouphourの変数は、サンプルごとに変更する必要がある。

> group <- c("siCTRL", "siSTAU1")    # Required
> hour <- c(0, 1, 2, 4, 8, 12)    # Required

BridgeR_analysis_mRNA.RBridgeR_analysis_lncRNA.Rの最後の引数で指定したファイルの数に応じて、groupの名前を指定する。

また、自身のサンプルのタイムコースに合わせて、hourを変更する。

21-29行目のTimePointRemoval1, TimePointRemoval2, ThresholdHalfLife1, ThresholdHalfLife2について、タイムコースのとり方に応じて変更する必要がある。

> halflife_table <- BridgeRCore(input_matrix,
                              group=group,
                              hour=hour,
                              save = TRUE,
                              TimePointRemoval1 = c(1,2),
                              TimePointRemoval2 = c(8,12),
                              ThresholdHalfLife1 = 3,
                              ThresholdHalfLife2 = 12,
                              outputPrefix = paste(dirname, "BridgeR", sep="/"))

TimePointRemoval1TimePointRemoval2では、それぞれの点を削ったときにFittingの精度が向上するかどうか判定する際に削る点を指定する。各点は、タイムコースの点と一致させる必要がある。

また、ThresholdHalfLife1の意味は、すべての点を用いてRNA半減期を求めたときに、半減期が3時間を下回る場合、TimePointRemoval1で指定した点を除いて計算させたときに、Fittingの精度が向上するか検討する。

ThresholdHalfLife2の意味は、すべての点を用いてRNA半減期を求めたときに、半減期が12時間を超える場合、TimePointRemoval2で指定した点を除いて計算させたときに、Fittingの精度が向上するか検討する。

34-37行目のcomparisonFileoutputPrefixで指定する名前をサンプルごとに変更する必要がある。

> pvalue_table <- BridgeRPvalueEvaluation(halflife_table, group = group,
                        hour = hour, comparisonFile = c("siCTRL","siSTAU1"),
                        inforColumn = 4, CutoffTimePointNumber = 4, calibration = FALSE,
                        save = TRUE, outputPrefix = paste(dirname, "BridgeR_6_STAU1KD", sep="/"))    # Required

BridgeR_analysis_lncRNA.Rスクリプトについて

9, 10行目のgrouphourの変数は、サンプルごとに変更する必要がある。

> group <- c("siCTRL", "siPUM1")    # Required
> hour <- c(0, 1, 2, 4, 8, 12)    # Required

46-57行目のTimePointRemoval1, TimePointRemoval2, ThresholdHalfLife1, ThresholdHalfLife2について、先程と同様に、タイムコースのとり方に応じて変更する必要がある。

> halflife_table <- BridgeRHalfLifeCalcR2Select(normalized_table,
                                              group = group,
                                              hour = hour,
                                              inforColumn = 4,
                                              CutoffTimePointNumber = 4,
                                              R2_criteria = 0.9,
                                              TimePointRemoval1 = c(1,2),
                                              TimePointRemoval2 = c(8,12),
                                              ThresholdHalfLife1 = 3,
                                              ThresholdHalfLife2 = 12,
                                              save = T,
                                              outputPrefix = paste(dirname_lncRNA, "BridgeR_5", sep="/"))

59-62行目のcomparisonFileoutputPrefixで指定する名前をサンプルごとに変更する必要がある。

> pvalue_table <- BridgeRPvalueEvaluation(halflife_table, group = group,
                        hour = hour, comparisonFile = c("siCTRL", "siPUM1"),
                        inforColumn = 4, CutoffTimePointNumber = 4, calibration = FALSE,
                        save = TRUE, outputPrefix = paste(dirname_lncRNA, "BridgeR_6_STAU1KD", sep="/"))

11. BRIC-seqデータの可視化(RNA分解曲線を描かせる)

bridger2パッケージのBridgeReport関数を使うことで、RNA分解曲線を描くことができます。

実行するためには、Rの統合開発環境であるRStudioをあらかじめ自身のパソコンにインストールしておく必要があります。
https://www.rstudio.com/products/RStudio/#Desktop

Rstudioを開き、以下のスクリプトを実行します。

> setwd("C:/Users/Naoto/Downloads")

> library(bridger2)
> library(data.table)

> filename <- "BridgeR_6_STAU1KD_halflife_pvalue_evaluation.txt"

> pvalue_table <- fread(filename, header=T)
> shiny_test <- BridgeReport(pvalue_table,
                           searchRowName = "gene_symbol",
                           hour = c(0,1,2,4,8,12),
                           TimePointRemoval1 = c(1, 2), 
                           TimePointRemoval2 = c(8, 12))
> shiny_test

setwdでファイルが保存されている先を指定し、filenameにインポートしたいデータ(RNA半減期の計算で出力されるファイル)を指定します。

表示させると、以下のようになります。

C__Users_Naoto_Downloads - Shiny 2017-02-06 19.41.22.png (115.4 kB)

12. shinyapp.ioサーバーにBRIC-seqデータ可視化用のWebアプリを作成する

shinyapp.ioとは、Rstudioを開発する会社が提供しているShinyアプリをWeb上で公開するためのクラウドサーバーです。

無料で使えるFree版も提供されていますが、作成できるアプリ数は5つまでで、一ヶ月に稼働できる時間は25時間までという制限が設けられています。

shinyapp.ioのアカウントを取得する

下記のURLにアクセスし、アカウントを作成する。
https://www.shinyapps.io/admin/#/signup

Shinyアプリの作成・デプロイ

RStudioを開き、新しいプロジェクトを作成する。

無題 - ペイント 2017-02-06 19.46.39.png (175.0 kB)

保存したフォルダを開き、server.Rui.Rを消します。代わりにapp.Rというファイルを作成してください(ここは必ずapp.Rという名前にしてください。別名にするとshinyapp.ioにデプロイできません)。

また、10. RNA半減期の計算の最後に生成された./BridgR_result_PUM1_study_mRNA/BridgeR_6_PUM1KD_halflife_pvalue_evaluation.txtのファイルをコピーして同じフォルダに入れます。

こんな感じになります。

BRIC-seq_shinyapp 2017-02-07 10.56.39.png (14.2 kB)

上図のように、保存先のフォルダにxxxxx.Rprojというファイルができているので、RStudioで開きます。さらに、先ほど作成したapp.Rも開きます。

app.Rスクリプトに以下の内容を書き込みます。

library(bridger2)
library(shiny)
library(data.table)

filename <- "BridgeR_6_STAU1KD_halflife_pvalue_evaluation.txt"

pvalue_table <- fread(filename, header=T)
shiny_test <- BridgeReport(pvalue_table,
                           searchRowName = "gene_symbol",
                           hour = c(0,1,2,4,8,12),
                           TimePointRemoval1 = c(1, 2), 
                           TimePointRemoval2 = c(8, 12))
shiny_test

bridger2で用意されているRridgeReport関数は、先ほど削除したserver.Rui.RスクリプトをBRIC-seqデータ用にまとめたWrapperになっているので、この関数1つでShinyアプリが簡単に作れます。

元のスクリプトはこちら。
https://github.com/Imamachi-n/BridgeR2/blob/master/R/reporting.R

RStudioのConsoleから、rsconnectパッケージをインストールします。これはshinyapp.ioのサーバーへShinyアプリをデプロイするのに必要になります。

> install.packages('rsconnect')

rsconnectパッケージを呼び込みます。

library(rsconnect)

自身のshinyapp.ioのアカウントにログインし、サーバーとやり取りするためにトークンを取得します。

[Account] -> [Tokens]からAdd Tokenをクリックし、Tokenを生成してShowをクリックする。すると、RStudioのConsoleで実行するコマンドが表示されるので、Copy to clipboardをクリックして内容をコピーします。

shinyapps.io - Google Chrome 2017-02-07 11.20.19.png (248.3 kB)

[Ctrl] + [v]でRStudioのConsoleにペーストして実行します。

> rsconnect::setAccountInfo(name='hogehoge', token='xxxxxx', secret='yyyyy')

念のため、app.Rスクリプトが動くかどうかローカル環境で確認します。

library(shiny)
runApp()

実行して、11. BRIC-seqデータの可視化(RNA分解曲線を描かせる)の時と同様にポップアップウインドウが表示され、Input gene symbolに適当な遺伝子名を入れたときにRNAの分解曲線が表示されればOKです。

最後に、shinyapp.ioのクラウドサーバーにShinyアプリをデプロイします。

library(rsconnect)
deployApp()

しばらく待ちます。初回は必要なRパッケージのインストールなどが行われるため、時間がかかります。

下記のように、Application successfully deployed to https://hogehoge.shinyapps.io/hogeと出たら、デプロイ成功です。

C__Users_Naoto_OneDrive_Shiny_app_BRIC-seq_shinyapp - RStudio 2017-02-06 20.05.00.png (31.4 kB)

表示されているURLにアクセスすると、今までRStudio上で見ていたRNAの分解曲線のデータをWeb上でも閲覧することが可能になります。

また、指定されたURLを他人に公開することで、RStudioをインストールしていないユーザーに対しても、Webブラウザを介してデータを共有することができます。

shinyapps.ioの自身のDashboardからもShinyアプリのURLを確認することができます。

Recent ApplicationsのところにアップロードしたShinyアプリが表示されており、それをクリックすると、URLなどの情報が記載されているページに飛ぶことができます。

shinyapps.io - Google Chrome 2017-02-07 14.59.04.png (249.6 kB)

内容は以上になります。

RNA-seqデータ解析(2群間比較, Strand-specific, Single-end)

概要

RNA-seqのデータを用いて、siRNAによるノックダウンや特定の刺激により発現量が変動したRNA群を同定する方法(2群間のデータの比較)を紹介します。

ここでは、データのダウンロード方法からLinuxを用いたデータ解析まで、RNA-seqのデータ解析の詳細をStep by Stepで説明します。

ただし、基本的なLinuxのコマンド操作は理解している前提で説明を行います。 パソコン(もしくはスパコン)のメモリは16GB以上を確保することが望ましいです。

使用するデータ

RNA-seq (Single-end, 101bp; Control siRNA, UPF1 siRNA)

https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE86148

使用するソフトウェア

解析ワークフロー

RNA-seqデータを2群間比較する方法として、Cuffdiffを用いた方法とfeatureCount-edgeRを用いた方法を紹介したいと思います。

TopHat-Cuffdiff workflow

PowerPoint スライド ショー - [2016-08-22_NGS_workflow.pptx] 2016-09-02 11.33.15.png (62.3 kB)

TopHat-featureCounts-edgeR workflow

PowerPoint スライド ショー - [2016-08-22_NGS_workflow.pptx] 2016-09-01 18.22.58.png (156.1 kB)

サンプルコード

Github上に必要なファイルはすべて置いてあります。
https://github.com/Imamachi-n/NGS-Tutorial/tree/master/Strand-specific_RNA-seq_Tutorial

RNA-seq_strand-specific_single-end_1_mapping.sh

TopHatによるマッピング・featureCountsによるリードカウントまでを行うスクリプト。FASTQファイルを引数として指定。

$ ./RNA-seq_strand-specific_single-end_1_mapping.sh hoge.fastq

10行目: gtfFileにGTFファイル(アノテーション情報)を指定。
11行目: indexContamFileにrRNAなどのコンタミ配列のBowtie用のIndexファイルを指定。
12行目: indexGenomeFileにGenome配列のBowtie用のIndexファイルを指定。
31行目: -rオプションでHouse-keeping genesの遺伝子領域のBEDファイルを指定。

RNA-seq_strand-specific_single-end_2_cuffdiff_calc.sh

Cuffdiffによる2群間比較を行うスクリプト

$ ./RNA-seq_strand-specific_single-end_2_cuffdiff_calc.sh  

8行目: filenameに保存先のディレクトリ名を指定。
9行目: gtfFileにGTFファイル(アノテーション情報)を指定。
13-14行目: カンマ(,)区切りでBAMファイル(比較したい2種類)を指定。
17行目: gene_listgencode.v19.annotation_filtered_symbol_type_list.txt(後述)を指定。

RNA-seq_strand-specific_single-end_2_edgeR_calc.sh

edgeRによる2群間比較を行うスクリプト

$ ./RNA-seq_strand-specific_single-end_2_edgeR_calc.sh

8行目: annoListgencode.v19.annotation_filtered_symbol_type_list.txt(後述)を指定。
11行目: saveDirに保存先のディレクトリ名を指定。

~/custom_command/<hoge.py>となっている箇所はカスタムのPythonスクリプトが置いてあるパス・ファイル名を指定する。

シェルスクリプトを使用するときの注意点

権限の問題

実行権限をシェルスクリプトに与えた後、実行すること。

$ chmod 755 hoge.sh

改行コードの問題

WindowsLinuxで改行コードが異なるため、Windows-Linux間でファイルのやり取りをしていると、改行コードの違いに起因する問題が生じることがある。対処法としては、テキストエディタの設定を変えることでLinuxの改行コードを使用する。

ここではAtomと呼ばれるテキストエディタでの設定方法を説明する。

  • [Ctrl] + [ , ](カンマ)キーを押して、Settingsの画面を呼び出す。
  • 左のメニューから、Packagesをクリック。
  • Installed Packagesでline-ending-selectorと検索。
  • Core Packagesの項目から、line-ending-selectorのSettingsをクリック。
  • 設定画面で、Default line endingをLFに変更。

Settings — C__Users_Naoto_OneDrive_NGS解析_NGS-Tutorial_RNA-seq_Tutorial — Atom 2017-01-31 11.20.21.png (250.6 kB)

これで、新規に作成したファイルの改行コードがデフォルトでLF(Linuxの改行コード)になります。

各ステップの説明

0. 必要なソフトウェアのインストール

まず、前述したソフトウェアをbiocondaを用いて自身の解析環境にインストールします。 biocondaのインストールに関しては、下記の記事を参照のこと。

imamachi-n.hatenablog.com

$ conda install fastqc
$ conda install fastx_toolkit
$ conda install bowtie=1.12
$ conda install tophat
$ conda install samtools
$ conda install rseqc
$ conda install bedtools
$ conda install cufflinks
$ conda install subread
$ conda install bioconductor-edger
注意!!

tophatによるマッピングで最新のbowtieを使うとエラーが出るので、以前のバージョンのbowtie v1.12を代わりにインストールする。

1. SRAファイルのダウンロード

NGSデータはシークエンスされたリード(塩基配列)の情報とクオリティスコアのデータをまとめたFASTQ形式のファイルとして保存されています。

FASTQファイルの詳細についてはこちらを参照。
https://en.wikipedia.org/wiki/FASTQ_format

FASTQデータは非常に大きいファイルなので、NCBI GEOでは、FASTQファイルを圧縮したSRAファイルと呼ばれるファイル形式でデータを公開しています。

まず、下記のURLにアクセスすると、
https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE86148

GSEと呼ばれるIDで管理された研究プロジェクトごとのページで、研究の概要や引用されている論文情報を見ることができます。

また、そのプロジェクトで解析したNGSデータがSamplesという項目にリストアップしてあります。

GEO Accession viewer - Google Chrome 2017-02-07 16.27.03.png (236.8 kB)

今回は、35サンプルのうち上6つのサンプルを使用します。

GSMから始まるIDをクリックすると、各サンプルの情報を見ることができます。 サンプル名、使用したCell lineや抗体、簡単な実験プロトコルなどの情報が見ることができます。

そこから、さらに下を見ていくと、SRAファイルの置き場所があります。 Downloadの(ftp)をクリックして、SRAファイルをダウンロードします。

GEO Accession viewer - Google Chrome 2017-02-07 16.34.35.png (280.0 kB)

SRR4081222をクリック。 ブラウザによって見え方が異なります。ここではGoogle Chromeを使っています。

SRR4081222.sraのURLをコピー。

_sra_sra-instant_reads_ByExp_sra_SRX_SRX205_SRX2059672 のインデックス - Google Chrome 2017-02-07 17.13.13.png (61.2 kB)

wgetで該当するSRAファイルをダウンロードします。

$ wget https://sra-download.ncbi.nlm.nih.gov/srapub/SRR4081227
$ wget https://sra-download.ncbi.nlm.nih.gov/srapub/SRR4081226
$ wget https://sra-download.ncbi.nlm.nih.gov/srapub/SRR4081225
$ wget https://sra-download.ncbi.nlm.nih.gov/srapub/SRR4081224
$ wget https://sra-download.ncbi.nlm.nih.gov/srapub/SRR4081223
$ wget https://sra-download.ncbi.nlm.nih.gov/srapub/SRR4081222

SRRのIDだけだとわかりにくいので、ファイル名をリネームします。

$ mv SRR4081222 SRR4081222_Control_1.sra
$ mv SRR4081223 SRR4081223_Control_2.sra
$ mv SRR4081224 SRR4081224_Control_3.sra
$ mv SRR4081225 SRR4081225_UPF1_knockdown_1.sra
$ mv SRR4081226 SRR4081226_UPF1_knockdown_2.sra
$ mv SRR4081227 SRR4081227_UPF1_knockdown_3.sra

SRAファイルからFASTQファイルに変換

先ほどインストールしたSRA Toolkitを使って、NCBI GEOからダウンロードしたSRAファイルをFASTQファイルに展開します。

$ fastq-dump SRR4081222_Control_1.sra
$ fastq-dump SRR4081223_Control_2.sra
$ fastq-dump SRR4081224_Control_3.sra
$ fastq-dump SRR4081225_UPF1_knockdown_1.sra
$ fastq-dump SRR4081226_UPF1_knockdown_2.sra
$ fastq-dump SRR4081227_UPF1_knockdown_3.sra

2. Quality check

FastQCを使って、FASTQファイルに記載されている各リードのクオリティをチェックします。

FASTQファイルはPhred Quality Scoreと呼ばれる指標によって、各塩基のクオリティを記述しています。

詳しくはこちらのサイトを参照のこと。
https://en.wikipedia.org/wiki/Phred_quality_score

実行例

$ mkdir fastqc_SRR4081222_Control_1
$ fastqc -t 8 -o ./fastqc_SRR4081222_Control_1 \
  ./SRR4081222_Control_1.fastq -f fastq

mkdirコマンドでfastqc_SRR4081222_Control_1という名前のディレクトリをカレントディレクトリに作ります。

次に、fastqcを使ってSRR4081222_Control_1.fastqのデータのクオリティをチェックします。 -tオプションで使用するCPUのコア数を指定します。コア数を増やせば単純に計算速度が向上しますが、FastQCではメモリを1コアあたり250MB消費するので、要求できるメモリ量を超えるコア数を指定するとエラーが起こります。

-oオプションで出力先のディレクトリを指定し、-fオプションでInputファイルのファイル形式を指定しています。

FastQCから出力されるデータが、fastqc_SRR4081222_Control_1ディレクトリの中のSRR4081222_Control_1_fastqc.htmlになります。 ファイルをブラウザで開くと以下のようなグラフを確認できます。

Basic Statistics

基本的な統計量が示されています。

  • 全リード数
  • リード長
  • GC contents

などなど

Per base sequence quality

リードの各塩基のクオリティスコアを示しています。 Phred quality scoreがだいたいグリーンの領域(Scoreが28以上)に収まっているかどうか確認します。 結果として、クオリティが低いリードは含まれていないことが確認できます。

ダウンロード.png (8.5 kB)

Per tile sequence quality

フローセルの各タイルごとのクオリティスコアを示しています。

Illumina社製の次世代シーケンサーでは、「フローセル」と呼ばれるガラス基板上でDNA合成反応を行います。このフローセルは「タイル」と呼ばれる単位に区切られており、各タイルごとに塩基配列を決定しています。

シーケンスをかけたときに、例えば特定のタイルに気泡やゴミが入っているとクオリティの低下が見られることがあります。

特定のタイルで著しいクオリティの低下が見られる場合は、シークエンス時に上記のような問題があったと考えられます。

詳しくはこちらの資料を参照のこと。
http://nagasakilab.csml.org/ja/wp-content/uploads/2012/04/Sato_Sugar_JPNreview.pdf

ダウンロード (1).png (8.6 kB)

Per sequence quality scores

各リードの全長のクオリティスコアの分布を示しています。 ダウンロード (2).png (16.2 kB)

Per base sequence content

各塩基のA, T, G, Cの含有量を示しています。 RNA-seqの場合、それぞれの含有量はほぼ25%ずつになりますが、PAR-CLIPのようにRNA結合タンパク質と結合しているRNA配列を抽出してきている場合、それぞれの含有率に偏りが見られます。

ダウンロード (3).png (33.0 kB)

Per sequence GC content

リードのGC contentsの分布を示しています。 ダウンロード (4).png (32.4 kB)

Per base N content

各塩基中に含まれるNの含有率(塩基を読めなかった箇所)を示しています。 ダウンロード (5).png (7.2 kB)

Sequence Length Distribution

リード長の分布を示しています。 ダウンロード (10).png (20.3 kB)

Sequence Duplication Levels

Duplidate readsの含まれている数を示しています。 ダウンロード (6).png (22.9 kB)

Overrepresented sequences

頻出する特徴配列が示されています。リード中にアダプター配列などが混入している場合、その配列が示されます。

Adapter Content

各塩基ごとに見たときのリード中に含まれているアダプターの割合を示しています。 あくまで、FastQCに登録されているアダプター配列しか確認していないので、登録されていないアダプター配列を使っていた場合、そのアダプター配列がリード中に混入していても確認できないことがあります。 ダウンロード (7).png (8.8 kB)

Kmer Content

特定の塩基配列のパターンがリード中に頻出していないかどうかチェックしています。 ダウンロード (8).png (60.2 kB)

3. Quality filtering

FASTQファイル中にクオリティスコアの低いリードが含まれていることが確認された場合、FASTX-toolkitを用いてクオリティの低い塩基及びリードを除去します。

今回のデータでは、クオリティの低いリードが含まれていないのでこの工程をパスします。

Illumina製のシークエンサーでいうと、HiSeq以降のデータはデータのクオリティが非常に高いので、いちいちクオリティフィルターにかける必要がなくなりました。

一応、実行例を示すと以下の通りになります。

実行例

$ fastq_quality_trimmer -Q33 -t 20 -l 18 -i ./SRR4081222_Control_1.fastq | fastq_quality_filter -Q33 -q 20 -p 80 -o ./SRR4081222_Control_1_1_filtered.fastq
fastq_quality_trimmerのパラメータ
  • -Q: Phred quality scoreのバージョン指定(Solexa, Illumina 1.3+, Illumina 1.5+といったかなり古いバージョンのFASTQファイルでは'64'を指定。最近のFASTQファイルは'33'と指定しておけばOK)。
  • -t: 指定したPhred quality scoreを下回る塩基をトリミングする。
  • -l: トリミング後の最低リード長。
fastq_quality_filterのパラメータ
  • -q 20 -q 80: リードの80%でPhred quality scoreが20を下回る場合、そのリードを排除する。

4. Quality check

フィルタリング後のFASTQファイルをFastQCを用いて再確認します(今回のデータはフィルタリングを行わないのでこの工程もパス)。

実行例

$ mkdir fastqc_SRR4081222_Control_1_filtered
$ fastqc -o ./fastqc_SRR4081222_Control_1_filtered ./SRR4081222_Control_1_1_filtered.fastq -f fastq

5. Mapping

TopHatを用いてGenomeとTranscriptomeにリードをマッピングを行います。

注意!!

RNA-seqのデータ解析については近年、マッピングソフトとしてSTARがデファクトスタンダードになっています(あくまで個人的な意見です。ENDODEプロジェクトで使われて一気にスタンダードになった気がします)。

確かに、STARのほうがTopHatと比較してマッピングの精度が向上しているので、現時点ではSTARがファーストチョイスかと思います。

しかし、STARはメモリを大量に消費し、ヒトゲノムだと32GB以上は必要となります。メモリ不足が懸念される解析環境では、メモリ消費が少ないTopHatを選択するのが無難だと思います(昔はこれがデファクトだったので)。

Indexファイルの作成

TopHatの内部で使用されているBowtieでゲノムへマッピングするために、ヒトゲノムに対するIndexファイルを用意する必要があります。

Bowtieのサイトから、Indexファイルはダウンロードすることもできます。右端のカラムに各ゲノムのIndexファイルが羅列されているので、任意のIndexファイルをダウンロードしてきます。 http://bowtie-bio.sourceforge.net/index.shtml

もしくは、自身でIndexファイルを作成することも可能です。以下では、その方法を説明します。

まず、Human Genome(hg19)のFASTAファイルのダウンロードしてきます。 次に、catコマンドで各染色体ごとのFASTAファイルをマージして、hg19.faという名前で出力します。

$ for file in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 X Y M
  do
    wget http://hgdownload.soe.ucsc.edu/goldenPath/hg19/chromosomes/chr${file}.fa.gz
    gunzip chr${file}.fa.gz
  done

$ cat chr1.fa chr2.fa chr3.fa chr4.fa chr5.fa chr6.fa chr7.fa chr8.fa chr9.fa chr10.fa chr11.fa chr12.fa chr13.fa chr14.fa chr15.fa chr16.fa chr17.fa chr18.fa chr19.fa chr20.fa chr21.fa chr22.fa chrX.fa chrY.fa chrM.fa > hg19.fa

最後に、hg19.faファイルからBowtie用のIndexファイルを作成します。

$ bowtie-build ./hg19.fa hg19
  • 1つ目の引数: リファレンスゲノムのFASTAファイルを指定。
  • 2つ目の引数: Indexファイルの名前を指定します。ここでは、Indexの名前をhg19とします。

アノテーション情報(GTFファイル)の準備

TopHatでは、GTF形式のファイルのTranscriptomeのアノテーション情報を使って、Splice junctionサイトに対してもマッピングを行うことができます。

今回はTranscriptomeの情報として、Gencodeのアノテーション情報を利用します。
https://www.gencodegenes.org/releases/19.html

上記のサイトにアクセスすると、さまざまなデータが置いてあるが基本的にgencode.v19.annotation.gtfというメインのアノテーション情報を利用すればOKです。
ftp://ftp.sanger.ac.uk/pub/gencode/Gencode_human/release_19/gencode.v19.annotation.gtf.gz

wgetコマンドで該当のファイルをダウンロードし解凍します。

$ wget ftp://ftp.sanger.ac.uk/pub/gencode/Gencode_human/release_19/gencode.v19.annotation.gtf.gz
$ gunzip ftp://ftp.sanger.ac.uk/pub/gencode/Gencode_human/release_19/gencode.v19.annotation.gtf.gz

カレントディレクトリにgencode.v19.annotation.gtfが保存されます。

GenomeとTranscriptomeへのマッピング

ここまでで、ゲノムのIndexファイルと、アノテーション情報の入ったGTFファイルが用意できたので、いよいよTopHatを用いて各シークエンスリードをゲノムとトランスクリプトームにマッピングします。

以下のコマンドを各サンプル(FASTQファイル)に対して行います。注意すべき点は、--library-typeオプションでサンプルがStrand-specificであることを明示する点です。
https://ccb.jhu.edu/software/tophat/manual.shtml

実行例

$ tophat --bowtie1 -p 8 --library-type fr-firststrand -o ./tophat_out_SRR4081222_Control_1_ss \
  -G ./gencode.v19.annotation.gtf \
  ./hg19 ./SRR4081222_Control_1_1_filtered.fastq
  • --bowtie1: マッピングソフトにBowtie1を使用。
  • -p: 使用するコア数を指定。
  • --library-type fr-firststrand: dUTP法を利用したStrand-specific RNA-seqサンプルに対して、この設定を使用する。
  • -o: 出力先のディレクトリ名を指定(ディレクトリは作成していなくても自動的に作成してくれる)。
  • -G: アノテーション情報として、GTFファイルを指定。
  • 1つ目の引数: 先ほど作成したヒトゲノム(hg19)のBowtie1のIndexファイルを指定。
  • 2つ目の引数: マッピングしたいFASTQファイルを指定。

TopHatによるマッピングが終わると、

  • align_summary.txt
  • accepted_hits.bam

というファイルが出力されます。

align_summary.txtマッピング結果をまとめたテキストファイルで、中身を見てみると、

Reads:
          Input     :  13282516
           Mapped   :  12196063 (91.8% of input)
            of these:   1887950 (15.5%) have multiple alignments (985 have >20)
91.8% overall read mapping rate.

上記のように、マッピングされたリードの数・割合や、Multi-hitしたリードの数・割合などが記載されています。

accepted_hits.bamマッピングされたリードの情報、具体的には、各リードがマッピングされた染色体座標軸、アライメントスコア、リファレンスゲノムと比較したときのIndelやMutationの有無などの情報が記載されています。

ただし、BAMファイルはバイナリファイルなので、ファイルを開いて直接中身を見ることができません。

ファイルの中身を確認したい場合はsamtoolsを用いることで、SAM形式に変換してファイルの中身を確認することができます。

$ samtools view ./tophat_out_SRR4081222_Control_1/accepted_hits.bam | less

SAMファイルの中身。

HWI-ST1075L:319:C42GNACXX:1:1315:16479:46448    256     chr1    12137   0       36M     *       0       0       CCTGCATGTAACTTAATACCACAACCAGGCATAGGG    @@@FFFFFHHHHHJJJJJJIJJJJJGIGEHIGGIEG    XA:i:1  MD:Z:0T35       NM:i:1  XS:A:+  NH:i:6  CC:Z:chr15      CP:i:102518998  HI:i:0
HWI-ST1075L:319:C42GNACXX:1:1214:15035:37072    272     chr1    12333   0       36M     *       0       0       GGCTGTGACTGCTCAGACCAGCCGGCTGGAGGGAGG    JIJJIIIIIJJIGIIIIJJJJJIHHHGHFFFFFCCC    XA:i:0  MD:Z:36 NM:i:0  XS:A:+  NH:i:6  CC:Z:chr15      CP:i:102518802  HI:i:0
HWI-ST1075L:319:C42GNACXX:1:1301:7343:9547      272     chr1    12693   1       36M     *       0       0       CTCTTGTGAGTGTCCCCAGTGTTGCAGAGGTGAGAG    JJIHIJJJJJJIGJJJJJJJJJJHHHHHFFFFFCCC    XA:i:0  MD:Z:36 NM:i:0  XS:A:+  NH:i:4  CC:Z:chr15      CP:i:102518442  HI:i:0
HWI-ST1075L:319:C42GNACXX:1:2204:8186:34501     16      chr1    12693   1       36M     *       0       0       CTCTTGTGAGTGTCCCCAGTGTTGCAGAGGTGAGAG    JJJJJJJJIJJJIIJJJJJJIJJHHHHHFFFFFCCC    XA:i:0  MD:Z:36 NM:i:0  XS:A:+  NH:i:4  CC:Z:chr15      CP:i:102518442  HI:i:0
HWI-ST1075L:319:C42GNACXX:1:1305:5797:18762     272     chr1    12957   0       36M     *       0       0       CATCCCCTTCACTCCCAGCTCAGAGCCCAGGCCAGG    DEHIGGIFF?2F;GGFAIIHIGGHDFHDDFDFD@@@    XA:i:0  MD:Z:36 NM:i:0  XS:A:+  NH:i:6  CC:Z:chr12      CP:i:92621      HI:i:0
HWI-ST1075L:319:C42GNACXX:1:2213:9952:39080     272     chr1    13024   0       36M     *       0       0       GTGCATGAAGGCTGTCAACCAGTCCATAGGCAAGCC    JJJJJJJJJJIIJIIHIGJJJJJHHGHHFFFFFCCC    XA:i:0  MD:Z:36 NM:i:0  XS:A:+  NH:i:7  CC:Z:chr12      CP:i:92554      HI:i:0

BAM/SAMファイルについての詳細を知りたい場合は、下記のURLを参照のこと。
https://samtools.github.io/hts-specs/
https://samtools.github.io/hts-specs/SAMv1.pdf
https://samtools.github.io/hts-specs/SAMtags.pdf

6. データの品質チェック

RNA-seq用のRNAサンプルはバイオアナライザーなどの機械であらかじめRNAの品質をチェックしてからcDNAライブラリを作成しています。

ただ、古いデータの中にはRNAの品質に問題があるものもあり、遺伝子領域を見たときに、例えば、5'側から3'側でのCoverageがガタガタするケースがあります。

その他にも、PolyAセレクションを行ったサンプルの場合、RNAの品質が悪いと3'側に極端にリードが偏る傾向にあることが知られています。

そこで、マッピングされたリードから遺伝子領域上のシークエンスリードのCoverageを調べることによって、大まかにRNAの品質も問題がないか確認を行います。

今回は、RSeQCスクリプトの1つであるgeneBody_coverage.pyを用いて、遺伝子領域上でのCoverageを調べてみようと思います。

このスクリプトの実行には、BAMファイルとそのIndexファイル、BED形式で記述された遺伝子領域の情報(アノテーション情報)が必要になります。

まず、アノテーション情報に関しては、基本的にどの細胞でも発現しているHouse-keeping genesのみに絞って解析したほうがよいです。

そこで、RSeQCの開発元が配布しているHouse-keeping genesのBEDファイルのリストを入手してきます。

$ wget https://sourceforge.net/projects/rseqc/files/BED/Human_Homo_sapiens/hg19.HouseKeepingGenes.bed

次に、結果の保存先のディレクトリの用意と、BAMファイルのIndexファイルを作成しておきます。

$ mkdir geneBody_coverage_SRR4081222_Control_1
$ samtools index ./tophat_out_SRR4081222_Control_1/accepted_hits.bam

mkdirコマンドで新しいディレクトリを作成。samtools indexでBAMファイルのIndexファイルを作成します。引数にはBAMファイルを指定するだけです。

それでは、House-keeping genesの遺伝子領域のCoverageを調べてみたいと思います。

実行例

$ geneBody_coverage.py -r ./hg19.HouseKeepingGenes.bed \
  -i ./tophat_out_SRR4081222_Control_1/accepted_hits.bam  \
  -o ./geneBody_coverage_SRR4081222_Control_1/SRR4081222_Control_1_RSeQC_output
  • -r: 先ほどダウンロードしたHouse-keeping genesの情報が格納されているBEDファイルを指定。
  • -i: Coverageを調べたいBAMファイルを指定(加えて、Indexファイルを同じディレクトリにおいておく必要がある)。
  • -o: 出力先のディレクトリとファイル名のPrefix。

結果として、指定した名前.geneBodyCoverage.curves.pdfというファイルが出力されます。ファイルの中身を見るとこんな感じ。

image.png (73.1 kB)

RNAの品質に問題がある(例えば、RNAが壊れている)と、3'側にリードが偏っていたり、cDNAライブラリの構築に使ったRNA量が少なく、PCR時に特定の配列が異常に増幅され(PCR bias、Duplicate readsが多い)、ガタガタしたCoverageの分布を取ることがあります。

こういったデータはRNA定量性に問題があるため、使用しないように気をつけましょう。

このステップで問題がありそうだと判断されるデータに関しては、下記のUCSC genome browserでの可視化により、個々の遺伝子上にマッピングされたリードの分布に注意して見ていく必要があります。

7. マッピングされたリードのStrandnessの確認

RNA-seqの各シークエンスリードがStrand-specificに読まれているかどうか(リードのStrandness)を確認します。ここでは、RSeQCのinfer_experiment.pyというスクリプトを用いました。

アノテーション情報としてBEDファイルを用意

下記のURLに置いてあるgtf2bed.plを使用します。
https://github.com/Imamachi-n/NGS-Tutorial/tree/master/PAR-CLIP_Tutorial_CstF64

使用するスクリプトアノテーション情報としてBEDファイルしか受け付けないので、マッピングの際に使用したGTFファイルgencode.v19.annotation.gtfをここで一旦BEDファイルに変換します。

$ perl gtf2bed.pl gencode.v19.annotation.gtf gencode.v19.annotation.bed
  • 1つ目の引数: 変換したいGTFファイルを指定
  • 2つ目の引数: 出力するBEDファイルを指定。

Strandnessの確認

マッピングしたデータであるBAMファイルと、アノテーション情報であるBEDファイルを指定して実行します。

$ infer_experiment.py -i ./tophat_out_SRR4081222_Control_1_ss/accepted_hits.bam \
  -r ./gencode.v19.annotation.bed -s 400000 \
  >  ./tophat_out_SRR4081222_Control_1_ss/SRR4081222_Control_1_strand_stat.txt
  • -i: Strandnessを調べるBAMファイルを指定。
  • -r: 先ほど用意したBEDファイルのアノテーション情報を指定。
  • s: 解析に使用するリードを指定。ここでは、40万リードを抽出してStrandnessを調べています。指定する数値を大きくすれば計算精度も上がると思いますが、その分時間もかかります。

下記がその結果になります。"++“や”+-“のように2文字で表現されていますが、1文字目がアノテーション情報でのStrandの向き、2文字目がマッピングされたリードのStrandの向きを表しています。

unstranded RNA-seqの場合、Fraction of reads explained by “++,–"とFraction of reads explained by ”+-,-+“の割合が、50%に近くなりますが、今回のようにStrand-specificに読まれているサンプルの場合、下記のように偏りが見られます。

dUTP法でシークエンスされたRNA-seqデータでは、RNAに対してAntisense鎖が読まれます。そのため、+鎖のRNA配列は-鎖として、-鎖のRNA配列は+鎖としてそれぞれ読まれているはずです。

This is SingleEnd Data
Fraction of reads failed to determine: 0.1910
Fraction of reads explained by "++,--": 0.1045
Fraction of reads explained by "+-,-+": 0.7045

例えば上記のように、予想したとおり+-,-+の組み合わせのリードが70%程度大半を占めていることがわかります。

次に、この情報をもとに、UCSC genome browserで可視化させるデータを作成する際に、+と-鎖をそれぞれ分けてファイルを作成します。

8. Visualization (For UCSC genome browser)

BedGraphファイルの準備

Bedtoolsを利用して、TopHatから得られたBAMファイルを、UCSC genome browser上で可視化できるファイル(Bedgraphファイル)に変換します。

まず、mkdirコマンドでデータを保存するディレクトリを作っておきます。

$ mkdir UCSC_visual_SRR4081222_Control_1_ss

bedtools genomecovで特定のゲノム領域でのCoverageを計算する(BAMファイルからBedgraphファイルを作成)。

Bedgraphファイルの詳細については、下記のURLを参照のこと。
https://genome.ucsc.edu/goldenpath/help/bedgraph.html

$ bedtools genomecov -ibam ./SRR4081222_Control_1_ss/accepted_hits.bam \
  -bg -split -strand - \
  > ./UCSC_visual_SRR4081222_Control_1_ss/SRR4081222_Control_1_Forward.bg
$ bedtools genomecov -ibam ./SRR4081222_Control_1_ss/accepted_hits.bam \
  -bg -split -strand + \
  > ./UCSC_visual_SRR4081222_Control_1_ss/SRR4081222_Control_1_Reverse.bg
  • -ibam: BAMファイルを入力ファイルとして指定する。
  • -bg: 出力ファイルの形式をBedGraphファイルに指定。
  • -split: Splicing juctionにマッピングされたリード(リードが分割されてマッピングされているリード)を考慮する。
  • -strand: +もしくは-を指定することで、ゲノムに対して+鎖もしくは-鎖にあたるリードを選択的に抽出することができる。

標準出力でBedGraphファイルが出力されます。

UCSC genome browserへデータをアップロードする際に、ファイルの種類やTrackの名前などを提示する必要があります。それらの情報をヘッダー行(ファイルの一行目)に記載します。

$ echo "track type=bedGraph name=SRR4081222_Control_1_Fw description=SRR4081222_Control_1_Fw visibility=2 maxHeightPixels=40:40:20 color=255,0,0" \
  > ./UCSC_visual_SRR4081222_Control_1_ss/tmp_SRR4081222_Control_1_forward.txt
$ echo "track type=bedGraph name=SRR4081222_Control_1_Re description=SRR4081222_Control_1_Re visibility=2 maxHeightPixels=40:40:20 color=0,0,255" \
  > ./UCSC_visual_SRR4081222_Control_1_ss/tmp_SRR4081222_Control_1_reverse.txt

echoコマンドを使って、ヘッダー行の情報をtxtファイルとして出力しています。

そのあとに、catコマンドを用いて、先ほど作ったBedGraphファイルと結合させます。

$ cat ./UCSC_visual_SRR4081222_Control_1_ss/tmp_SRR4081222_Control_1_forward.txt ./UCSC_visual_SRR4081222_Control_1_ss/SRR4081222_Control_1_Forward.bg \
  > ./UCSC_visual_SRR4081222_Control_1_ss/SRR4081222_Control_1_forward_for_UCSC.bg
$ cat ./UCSC_visual_SRR4081222_Control_1_ss/tmp_SRR4081222_Control_1_reverse.txt ./UCSC_visual_SRR4081222_Control_1_ss/SRR4081222_Control_1_Reverse.bg 
  > ./UCSC_visual_SRR4081222_Control_1_ss/SRR4081222_Control_1_reverse_for_UCSC.bg

出力されたファイルをそのままアップロードしてもOKですが、容量が大きいためアップロードに時間がかかります。そのため、アップロードするファイルのサイズを小さくするために、ここではbzip2ファイルに圧縮しています。echoコマンドのところでヘッダー行の情報をtxtファイルとして出力しています。

$ bzip2 -c ./UCSC_visual_SRR4081222_Control_1_ss/SRR4081222_Control_1_forward_for_UCSC.bg \
  > ./UCSC_visual_SRR4081222_Control_1_ss/SRR4081222_Control_1_forward_for_UCSC.bg.bz2
$ bzip2 -c ./UCSC_visual_SRR4081222_Control_1_ss/SRR4081222_Control_1_reverse_for_UCSC.bg \
  > ./UCSC_visual_SRR4081222_Control_1_ss/SRR4081222_Control_1_reverse_for_UCSC.bg.bz2

データのアップロード

UCSC genome browserにデータをアップロードします。

ホーム画面から、[MyData] -> [Custom Tracks]をクリックします。

Add Custom Tracksというページに移動するので、ファイルを選択をクリックし、アップロードするファイルを選択し、submitボタンをクリックします。

アップロードが完了すると、Manage Custom Tracksというページに移動します。右端にあるgoボタンをクリックすると、データをみることができます。

20170205212758.png (1.7 MB)

8. RNA-seqデータの2群間比較(Cuffdiffのケース)

Cuffdiffを用いて、siCTRLとsiUPF1の2群間のRNA-seqデータを比較します。 注意すべき点は、--library-typeオプションでサンプルがStrand-specificであることを明示する点です。
http://cole-trapnell-lab.github.io/cufflinks/cuffdiff/index.html#library-types

cuffdiff -p 8 --multi-read-correct --library-type fr-firststrand -o ./cuffdiff_out_RNA-seq_UPF1_Knockdown_Gencode \
/home/akimitsu/database/gencode.v19.annotation_filtered.gtf \
./tophat_out_SRR4081222_Control_1/accepted_hits.bam,./tophat_out_SRR4081223_Control_2/accepted_hits.bam,./tophat_out_SRR4081224_Control_3/accepted_hits.bam \
./tophat_out_SRR4081225_UPF1_knockdown_1/accepted_hits.bam,./tophat_out_SRR4081226_UPF1_knockdown_2/accepted_hits.bam,./tophat_out_SRR4081227_UPF1_knockdown_3/accepted_hits.bam
  • -p: 使用するコア数を指定。
  • --multi-read-correct: 定量の精度を上げる目的で、複数箇所にマッピングされたリードに重み付けを行う。
  • --library-type fr-firststrand: dUTP法を利用したStrand-specific RNA-seqサンプルに対して、この設定を使用する。
  • -o: 出力先のディレクトリを指定。
  • 1つ目の引数: アノテーション情報のGTFファイルを指定。
  • 2つ目・3つ目の引数: 2種類のBAMファイルをそれぞれ指定。今回のように、siCTRLとsiUPF1の条件でn=3でデータがある場合、それぞれのBAMファイルのパスをカンマ区切りで並べる(例えば、CTRL_1.bam,CTRL_2.bam,CTRL_3.bam KD_1.bam,KD_2.bam,KD_3.bam)。

パラメータの詳しい解説は以下のサイトを参照のこと。
http://cole-trapnell-lab.github.io/cufflinks/cuffdiff/index.html

最後に、Gene symbolなどの情報をCuffdiffから出力されるファイルに加えます。

遺伝子リストの準備

まず、extract_gene_symbol_type_from_gtf.pyスクリプトを用いて、GTFファイルから遺伝子リストを作成します(Cuffdiffで集計したデータからmRNAとlncRNAに分類分けするために用います)。

以下のURLに必要なスクリプトが置いてあります。
https://github.com/Imamachi-n/NGS-Tutorial/blob/master/RNA-seq_Tutorial

$ python2 extract_gene_symbol_type_from_gtf.py  gencode.v19.annotation_filtered.gtf gencode.v19.annotation_filtered_symbol_type_list.txt
  • 1つ目の引数: GTFファイルを指定する。
  • 2つ目の引数: 遺伝子リストが出力される。

次に、先ほど作成した遺伝子リストをもとに、cuffdiffの出力ファイルからmRNAとlncRNAの情報を抽出し、リストアップします。

# mRNA
$ python ~/custom_command/cuffdiff_result.py \
  ./gencode.v19.annotation_filtered_symbol_type_list.txt \
  ./cuffdiff_out_RNA-seq_UPF1_Knockdown_Gencode/gene_exp.diff \
  mRNA \
  ./cuffdiff_out_RNA-seq_UPF1_Knockdown_Gencode/cuffdiff_result_mRNA.txt

# lncRNA
$ python ~/custom_command/cuffdiff_result.py \
  ./gencode.v19.annotation_filtered_symbol_type_list.txt \
  ./cuffdiff_out_RNA-seq_UPF1_Knockdown_Gencode/gene_exp.diff \
  lncRNA \
  ./cuffdiff_out_RNA-seq_UPF1_Knockdown_Gencode/cuffdiff_result_lncRNA.txt
  • 1つ目の引数: 先ほど用意した遺伝子リストを指定。
  • 2つ目の引数: cuffdiffの出力ファイルであるgene_exp.diffファイルを指定。
  • 3つ目の引数: mRNAもしくはlncRNAを指定(指定したRNA群のデータを取得)。
  • 4つ目の引数: mRNAもしくはlncRNAのリストを出力。

8. RNA-seqデータの2群間比較(featureCounts-edgeRのケース)

各遺伝子に対してのリード数のカウント

まず、featureCountsで各遺伝子領域にマッピングされたリード数をカウントします。注意すべき点は、-sオプションでStrand-specificであることを明示する点です。

$ mkdir featureCounts_result_SRR4081222_Control_1
$ featureCounts -T 8 -t exon -g gene_id -s 2 -a ./gencode.v19.annotation_filtered.gtf \
  -o featureCounts_result_SRR4081222_Control_1/featureCounts_result_SRR4081222_Control_1.txt \
  ./tophat_out_SRR4081222_Control_1/accepted_hits.bam

mkdirコマンドを使って、保存先のディレクトリを作り、そのあとfeatureCountsを実行します。

  • -T: 使用するコア数の指定。
  • -t exon: リードのカウントに使用するExonの情報を指定。ここでは、GTFファイル内で3列目のfeatureexonである行を使用する用に指定している。
  • -g gene_id: 各行のメタ情報(遺伝子ID、Transcript ID、遺伝子名など)のうち、名前として使用する情報を指定する。ここでは、gene_idを指定することで、Gencodeで決められた遺伝子IDを使っている。
  • -s 2: Transcriptの配列に対してAntisense鎖にあたるリードをカウントする(dUTP法でStrand-specific RNA-seqのデータが得られているため)。
  • -a: アノテーション情報(GTFファイル)を指定。
  • -o: 出力先のパスとファイル名を指定。
  • 1つ目の引数: BAMファイルを指定。

featureCountsから出力されたリードの集計データのリストのうち、遺伝子IDとリード数の列だけを抽出します。

$ sed -e "1,2d" featureCounts_result_SRR4081222_Control_1/featureCounts_result_SRR4081222_Control_1.txt \
  | cut -f1,7 - > featureCounts_result_SRR4081222_Control_1/featureCounts_result_SRR4081222_Control_1_for_R.txt

1, 2行目はHeader行なので、sedコマンドで除きます。次に、cutコマンドで遺伝子IDとリード数の列だけを抽出して、データを標準出力で得ます。

edgeRを用いて2群間比較を行う

edgeR_test.Rスクリプトを使って、edgeRを用いた2群間比較を行います。

以下のURLに必要なスクリプトが置いてあります。
https://github.com/Imamachi-n/NGS-Tutorial/blob/master/RNA-seq_Tutorial

まず、mkdirコマンドで保存先のディレクトリを用意します。

mkdir edgeR_result_UPF1_Knockdown

edgeR_test.Rスクリプトを用いて、2群間比較を行います。

Rscript ./edgeR_test.R \
featureCounts_result_SRR4081222_Control_1_ss/featureCounts_result_SRR4081222_Control_1_for_R.txt,\
featureCounts_result_SRR4081223_Control_2_ss/featureCounts_result_SRR4081223_Control_2_for_R.txt,\
featureCounts_result_SRR4081224_Control_3_ss/featureCounts_result_SRR4081224_Control_3_for_R.txt,\
featureCounts_result_SRR4081225_UPF1_knockdown_1_ss/featureCounts_result_SRR4081225_UPF1_knockdown_1_for_R.txt,\
featureCounts_result_SRR4081226_UPF1_knockdown_2_ss/featureCounts_result_SRR4081226_UPF1_knockdown_2_for_R.txt,\
featureCounts_result_SRR4081227_UPF1_knockdown_3_ss/featureCounts_result_SRR4081227_UPF1_knockdown_3_for_R.txt \
Control,Control,Control,Knockdown,Knockdown,Knockdown \
edgeR_result_UPF1_Knockdown \
Yes
  • 1つ目の引数: 先ほど用意したリード数を集計した各データをカンマ区切りで指定する。
  • 2つ目の引数: 1つ目の引数で指定したサンプルに対して、ラベル付け(例えば、ControlKnockdown)を行う。データはカンマ区切りで指定する。
  • 3つ目の引数: 保存先のディレクトリを指定する。
  • 4つ目の引数: 複数のサンプル(n=2以上)を取っているかどうか(Duplicateのチェック)。YesもしくはNoと記入。

アノテーション情報を追加する

edgeRから出力されたデータでは、遺伝子IDしか情報がないので遺伝子名などの情報を付け加えます。

$ python2 ./annotate_gene_symbol_type.py  \
  ./gencode.v19.annotation_symbol_type_list.txt \
  ./edgeR_result_UPF1_Knockdown/edgeR_test_result.txt \
  ./edgeR_result_UPF1_Knockdown/edgeR_test_result_anno_plus.txt \
$ python2 ./split_into_each_gene_type.py \
  ./edgeR_result_UPF1_Knockdown/edgeR_test_result_anno_plus.txt

annotate_gene_symbol_type.pyスクリプトアノテーション情報を付加しています。

  • 1つ目の引数: GTFファイルから作成した遺伝子リストを指定します。
  • 2つ目の引数: 先ほどのスクリプトを使って得られた出力ファイルを指定します。
  • 3つ目の引数: アノテーション情報を付加したデータを出力します。

split_into_each_gene_type.pyスクリプトでmRNAやlncRNAなどRNAの種類に応じてデータを分割します。

  • 1つ目の引数: 上記のスクリプトから得られた出力ファイルを指定します。

以上になります。