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

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

DNAを増幅するサーマルサイクラーを自作してみたよ

DNAをPCR法で増幅するために必要なサーマルサイクラーを自作してみました。自作と言っても、いわゆる、PCの自作と同じでパーツを組み立てていく感じです。購入から組み立ての様子を簡単に紹介します。 モチベーション ラボには様々なレクリエーションがあります。例えば、単にどこかに遊びに行ったり、スポーツ大会したり、ひたすら合宿形式でプログレスのプレゼンをするミーティングするなどがあります。それもよいのですが、せっかくなので、普段の研究時間ではトライできないが、研究に関わる hack を行う、というイベントを企画してみました。夏休みの自由研究や社会科見学的なノリです。   うちのラボでは、PCRを使ったウェットの実験技術の開発をしてきました。しかし、サーマルサイクラーのハードウェアの仕組みを体験的に理解している訳ではありません。そこで、サーマルサイクラーを作ってみました。   欧米で始まっている、自宅のガレージやキッチンでバイオロジーを行うムーブメント、バイオパンク、DIYbio を体験しておきたいというのもありますし、Arduino などオープンハードウェア、Maker のムーブメントを体験するのも目的の一つです。ハードウェア開発が思っているほどハードルが下っていることを体験できて、かつ、将来、ウェットの開発だけでなく、装置開発などもできたら、ラッキー、ぐらいの気持ちでやってみました。   購入 今回作ったのは、組み立て式で、かつ、仕様などや設計図が公開されているOpenPCRというサーマルサイクラーです。ハードウェアの仕様・設計図、制御ソフトウェアなどの情報がすべて公開されており、部品からも自作することが可能です。今回は、「設計図から部品や回路のパーツを作り、それらを組み立てる直前のもの」を購入しました。   ChaiBio https://www.chaibio.com/   OpenPCR https://www.chaibio.com/products/openpcr   なぜか http://openpcr.org/  で購入できなかったので、eBay にある ChaiBio で買いました。   OpenPCR - eBay http://www.ebay.com/itm/111096418574   本体価格は

R でいまどきなパッケージ開発 (devtools, testthat, roxygen2)

追記 (2012/04/21): 以下のコードは S4 classes で書いていますが、R5 reference classes で書き直してみました。こちらもどうぞ。 http://blog.hackingisbelieving.org/2012/04/r5-reference-class-r-devtools-testthat.html R のパッケージ開発の情報があまりないので、自分はこんな感じでやってます、というのを書いてみます。パッケージ開発支援の devtools と単体テスト支援の testthat, そしてドキュメント生成支援の roxygen を使うのがいまどきっぽいです。 そもそもパッケージを作製しているひとをあまりみたことがないので、もっとこうすべき、というのがあれば教えてほしいです。 今回はデモケースとして S4 OOP で、Idol クラスを定義し、とある身体的特徴の統計量を計算するパッケージを作ります。R のプロンプトは > で、シェルのプロンプトは $ で示しています。 0. 準備 必要になるパッケージをインストールします。 $ sudo R > install.packages(devtools) > install.packages(testthat) > q() devtools の設定をします。~/.Rpackages に設定を記述します。 $ emacs ~/.Rpackages list(   default = function(x) {     file.path("~/Project/dev/R/", x, x)   },   "idol" = "~/Projects/dev/R/idol/idol" ) 以下の行は今回パッケージを作製する作業ディレクトリになります。   "idol" = "~/Projects/dev/R/idol/idol" 1. ともあれ実装を始める 作業ディレクトリに移動します。 $mkdir -p ~/Project/dev/R/idol $ cd ~