スキップしてメイン コンテンツに移動

Google App EngineとChart APIを使って簡単な遺伝子発現データベースを作ってみた

追記: コードを整理してgithubにアップしました。http://github.com/dritoshi/gaexpr2/

徹夜のサンプリングの合間にプログラミングをすると、最後までテンションが下がらないライフハックを発見した。しかし寝ぼけた頭で、研究に使うプログラムは書きたくない。そこで前から hack してみたかった Google App Engine と Google Chart APIで遊んでみることにした。[[Google App Engine|http://code.google.com/appengine/]]はGoogleのサーバと開発環境を使ってウェブアプリを作るフレームワークみたいなもの。[[Google Chart API|http://code.google.com/apis/chart/]]はデータを渡すとグラフを返してくれるウェブサービス。

しょぼいが、Pythonを思い出しつつGAEとGCAを覚えつつサンプリングしつつ書いたのがこれ。

http://gaexpr2.appspot.com/search

データは以前書いた [[Ruby on Rails + Gruffを使って、11分で作る遺伝子発現データベース|http://itoshi.tv/d/?date=20060506]]で使ったDNA microarrayのデータを使っている。

Railsも便利だけど、サーバを自分で確保しないといけない。Google App Engine はサーバも提供してくれるし、Googleのリソースを使えるので規模が大きくなってもスケールするんだろうなぁ。Google Chart API も軸の取り扱いに癖があったり、エラーバーが描けなかったりするけど、依存関係が激しくなりがちなグラフ生成ライブラリをインストールする手間がまったくいらないというのは魅力的。

しかし、これだけ簡単だと気軽にデータベースを自作するウェット研究者が増えるんじゃないかな。

コードは以下の通り。あとでgithub.comにも上げておく。
<<<
import wsgiref.handlers

from google.appengine.ext import webapp
from google.appengine.ext import search
from google.appengine.ext.webapp.util import run_wsgi_app

class MainPage(webapp.RequestHandler):
def get(self):

url = "http://chart.apis.google.com/chart?cht=lxy&chco=1E5692,3E9A3B&chs=200x125&chxt=x,y&chxl=0:|0|2|4|6|8|10|1:|2|4|6|8|10&chds=0,10,2,10,0,10,2,10&chd=t:"
self.response.headers['Content-Type'] = 'text/html'
self.response.out.write('')

# I use the webapp framework to retrieve the keyword
keyword = self.request.get('keyword')

if not keyword:
self.response.out.write("No keyword has been set")
else:
# Search the 'Expression' Entity based on our keyword
query = search.SearchableQuery('Expression')
query.Search(keyword)
for result in query.Run():
# Annotation
self.response.out.write('
')
self.response.out.write('Affy ID: %s\n' % result['affy_id'])
self.response.out.write('Gene Symbol: %s\n' % result['gene_symbol'])
self.response.out.write('Gene Name: %s\n' % result['gene_name'])
self.response.out.write('Entrez Gene: ' % result['entrezid'] + "%s\n" % result['entrezid'])
self.response.out.write('
')

# Graph (Using Google Chart API)
evector = ",".join([`result['evector_day' + suffix]` for suffix in ["0", "2", "4", "10"]])
ppargox = ",".join([`result['ppargox_day' + suffix]` for suffix in ["0", "2", "4", "10"]])
graph = url + "0,2,4,10|" + evector + "|0,2,4,10|" + ppargox
self.response.out.write('' % graph)

self.response.out.write('')
self.response.out.write('')

class IdSearchForm(webapp.RequestHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/html'
self.response.out.write("""


Gene Expression Database




Keyword:
(ex. 100005_at, Traf4)




Itoshi NIKAIDO, Ph. D., dritoshi at gmail dot com

""")


application = webapp.WSGIApplication(
[('/', MainPage),
('/search', IdSearchForm)],
debug=True)

def main():
run_wsgi_app(application)

if __name__ == "__main__":
main()
>>>

app.yaml
<<<
application: gaexpr2
version: 1
runtime: python
api_version: 1

handlers:
- url: /load
script: myloader.py
login: admin

- url: /.*
script: gaexpr2.py
>>>

myloader.py
<<<
from google.appengine.api import users
from google.appengine.ext import bulkload
from google.appengine.api import datastore_types
from google.appengine.ext import search

class ExpressionLoader(bulkload.Loader):
def __init__(self):
# Our 'Expression' entity contains a affyid string and an expression float data
bulkload.Loader.__init__(self, 'Expression',
[('affy_id', str),
('gene_symbol', str),
('entrezid', str),
('gene_name', str),
('evector_day0', float),
('evector_day2', float),
('evector_day4', float),
('evector_day10', float),
('ppargox_day0', float),
('ppargox_day2', float),
('ppargox_day4', float),
('ppargox_day10', float),
])

def HandleEntity(self, entity):
ent = search.SearchableEntity(entity)
return ent

if __name__ == '__main__':
bulkload.main(ExpressionLoader())
>>>

Google のAppサーバにプログラムをアップして、
/usr/local/google_appengine/appcfg.py update gaexpr2/
データをロードする。expressions.table.100.txtがデータ(45000ぐらいあるので最初の100行だけ)で、xxxの部分はGoogleにログインして http://gaexpr2.appspot.com/load を表示すると値が得られるのでそれを入れておくこと。
<<<
/usr/local/google_appengine/tools/bulkload_client.py --cookie='ACSID=xxx' --kind Expression --url http://gaexpr2.appspot.com/load --filename expressions.table.100.txt
>>>

コメント

このブログの人気の投稿

シーケンスアダプタ配列除去ツールまとめ

FASTQ/A file からシーケンスアダプター配列やプライマー配列を除くためのプログラムをまとめてみる。 まず、配列の除去には大別して2つの方向性がある。ひとつは、アダプター配列を含む「リード」を除いてしまう方法。もうひとつは除きたい配列をリードからトリムする方法である。後者のほうが有効リードが増えるメリットが、綺麗に除ききれない場合は、ゲノムへのマップ率が下がる。 気をつける点としては、アダプター/プライマーの reverse complement を検索するかどうか。paired end の際には大事になる。クオリティでトリムできるものや、Paired-end を考慮するものなどもある。アダプター/プライマー配列の文字列を引数として直接入力するものと、multi fasta 形式で指定できるももある。 From Evernote: シーケンスアダプタ配列除去ツールまとめ TagDust http://genome.gsc.riken.jp/osc/english/software/src/nexalign-1.3.5.tgz http://bioinformatics.oxfordjournals.org/content/25/21/2839.full インストール: curl -O http://genome.gsc.riken.jp/osc/english/software/src/tagdust.tgztar zxvf tagdust.tgz cd tagdust/ make sudo make install rehash 使いかた: tagdust adapter.fasta input.fastq -fdr 0.05 -o output.clean.fastq -a output.artifactual.fastq 解説: 入出力形式は fastq/a が使える。リード全体を除く。速い。アダプター配列を fasta 形式で入力できるのが地味に便利で、これに対応しているものがなかなかない。Muth–Manber algorithm (Approximate multiple

ChIP-seq の Peak calling tool を集めたよ

ほかにもあったら教えてください。プログラム/プロジェクト名がツールのプロジェクトサイトへのリンク。その論文タイトルは論文へのリンクになっています。 ツール名の50音順です。 CCCT -  A signal–noise model for significance analysis of ChIP-seq with negative control , chipdiff と同じグループ CisGenome -  CisGenome: An integrated software system for analyzing ChIP-chip and ChIP-seq data . ChromSig -  ChromaSig: a probabilistic approach to finding common chromatin signatures in the human genome. ChIPDiff -  An HMM approach to genome-wide identification of differential histone modification sites from ChIP-seq data ChIP-Seq Analysis Server FindPeaks -  FindPeaks 3.1: a tool for identifying areas of enrichment from massively parallel short-read sequencing technology. Version 4.0 is out. GLITR -  Extracting transcription factor targets from ChIP-Seq data HPeak -  HPeak: an HMM-based algorithm for defining read-enriched regions in ChIP-Seq data MACS -  Model-based Analysis of ChIP-Seq (MACS). PeakSeq -  PeakSeq enables systematic scoring of ChIP-seq experimen

ふりかえり

2013年4月に独立して7年目が終わろうとしている。ざっくりこれまでの研究を振り返る。 2013年から2017年の4年はフルスタックのゲノム科学、ゲノムインフォのラボを立ち上げることに集中していた。しかも人様が作った技術のユーザとして研究するのではなく、新しい技術を開発できるラボを目指した。ウェットの開発については、ドライのPIであっても本物を創りたいと考えたので世界最強や唯一の技術を目指した。特に1細胞ゲノム科学に注力した。そのためにまずグラントを取り仲間を集め技術を作った。幸いウェットは元同僚を中心に、ドライはドクター新卒の優秀な人材に囲まれた。並行して開発した実験やデータ解析技術を応用するため、データ生産や共同研究を支えるチームも作った。 2015年ぐらいからドライの論文が少しずつ出始め、2018年にはウェットのフラッグシップとなる技術RamDA-seqとQuartz-Seq2の2つ出版された。2021年1月現在、これらはそれぞれ世界唯一と世界最高性能の2冠である。これが達成できた大きな理由のひとつは、反応原理を徹底的に理解し制御するというチームやそのメンバーの特性にある。ここは世界最高レベルだと確信している。 2017-2018年はラボの移転がありウェットの開発や実験が大きく停滞した。その間ドライのチームががんばってくれて2019-2020年にはドライ研究の収穫の時期がきた。またRamDA-seqの試薬キット化・装置化、Quartz-Seq2とそのデータ解析技術での起業、実験試薬や道具の上市など社会実装の年でもあった。実験が少なくなった分、ウェットのメンバーの解析技術がかなり向上した時期でもある。これはウェットとドライがうまくコミュニケーションできる証拠でもある。 2019-2020年はウェット技術のフラッグシップを駆使した共同研究がいくつか花咲いた。主に「再生医療分野」への応用と「細胞ゆらぎと転写制御の謎」に迫る基礎的なテーマが対象で、もともと1細胞ゲノム科学を始めたときに目標としたものだった。 並行してゲノムデータの科学計算環境のインフラ開発に注力してきた。beowulf型PCクラスタからクラウドの移行やハイブリッド化、DevOpsによる自動構築、ワークフロー言語の導入、動的レポート生成などの導入・開発を行いこれらを日常的に使うラボになった。これらはNI