アメリエフのブログ

バイオインフォマティクスの紹介と社員の日々
どの括弧が閉じているのかよく分かるVimの設定
京都支店に居た頃、鴨川でサンドウィッチを食べているところをトンビに襲われ、出血したことがある久保(kubor)です。

Vimを使っていて、コーディング中、
括弧が重なって困るなら、対応する括弧をハイライトしましょう。
もしくは対応する括弧へカーソルをジャンプしましょう。

対応する括弧にジャンプする

括弧の上にカーソルがある状態で「%」を入力すると対応する括弧にジャンプします。

対応する括弧をハイライトする

.vimrcに以下を書いておきます
showmatchで機能が有効になり、matchtimeで、対応する括弧がハイライトされるまでの待ち時間を設定できます。
matchpairsで、HTMLを書くときのために<>も強調表示対象に入れておくと便利です。
set showmatch
set matchtime=1
set matchpairs& matchpairs+=<:>


試してみてください。
| kubor | システム | 15:09 | comments(0) | - |
どんな改行コードでも・後
前回に引き続き改行コードの処理の話です。
今回はPerl・Pythonのなかでどう扱うか、コード例を挙げて説明します。

perlの例


行末の「¥n」はchompで取り除くことができます。それ以外は正規表現を使うと簡単と思います。
open IN,"file.txt" or die "$!";
while(my $line = <IN>>){
chomp($line);
$line =~ s/¥r$//g;
# 処理
}



Pythonの例


Pythonの場合少し注意が必要です。
下の,諒法だと、「¥n」を改行の目印にしている(「¥r」を改行コードだとみなしてくれない)ため、「¥r」で改行しているファイルを読み込んだとき、1行ずつ読み込むつもりが、ファイルすべてを1行であるかのように扱ってしまいます。
with open('file.txt', 'r') as f:
for line in f:
line = line.replace(('¥r' or '¥r¥n'), '¥n').rstrip('¥n')
# 処理


open関数の引数を 'r' ではなく 'rU'('U'だけでも可)に変えると、すべての改行コードに対応して、ちゃんと1行ずつ読み込んでくれます。
詳細はこちら(PEP 278 -- Universal Newline Support
首尾よく1行ずつ読み込んだあとは、replaceメソッドなどで「¥r」や「¥r¥n」を「¥n」に置き換えたり、rstripメソッドで右端から改行コードを取り除いたりします。
with open('file.txt', 'rU') as f:
for line in f:
line = line.replace(('¥r' or '¥r¥n'), '¥n').rstrip('¥n')
# 処理



スクリプトに入力するファイルにどんな改行コードが含まれているかわからないときは、全部の改行コードにあらかじめ対応しておくと、後々改行コードにまつわるトラブルに悩まされることがありません。
とhatさんに教えていただいたので、私も気を付けます!
| kubo | システム | 14:21 | comments(0) | - |
どんな改行コードでも・前
弊社のトレーニングやNGSハンズオン講習会などでPerlやPythonに触れた方は「『¥n』で行の末尾を示す」と聞いたことがあると思います。
『¥n』はLine Feed、LFとも呼び、LinuxまたはMac OS Xで使われる改行コードです。改行コードはOSの種類やバージョン、ソフトごとに種類が異なります。
Linux、Mac OS X… ¥n
Windows… ¥r¥n
OS Xより前のMac… ¥r
『¥r』はCarriage Return、CRと呼びます。
ファイルにどんな改行コードが含まれているかは「od -c」コマンドなどで確認できます。(過去の記事を参照

バイオインフォの解析はLinux上で行われることが多いと思います。しかし、普段の作業はMacやWindows上で行っており、そちらで作製したファイルをLinux上で扱いたいときなど、改行コードが混在するケースも多々あると思います(テキストエディタによっては、ファイル保存時の改行コードを指定することができるものもあります)。

以下のコマンドで、ファイルの改行コードをすべて「¥n」に変換することができます。
$ cat oldfile.txt | tr -s '¥r' > newfile.txt


そのほかに、自分で組んだPerl/Pythonスクリプト内で、改行コードを処理するようにしてもいいです。
PerlやPythonのスクリプト内部で「ファイルを一行ずつ読み込んで処理する」ときは、基本的に処理前に行末から改行コードを削除します。スクリプト内部で、どのような改行コードがきても対応できるように処理をしておくと、上の tr コマンドを実行する手間を減らすことができ、トラブルが少なくなると思います。

次回にPerlとPythonの例を示します。
| kubo | システム | 15:09 | comments(0) | - |
Somatic SNV検出編
2014年6月21日に開催した、アメリエフ株式会社・第33回バイオインフォマティクス勉強会の「フリーソフトではじめるがん体細胞変異解析入門」のスライドをSlideShareにて公開いたしました。
主に、ブログでもご紹介したことがあるソフトウェアSomaticSniperをつかった解析のご紹介です。昨年の日本癌学会学術総会でもポスターで発表しました。



なぜわざわざ体細胞変異解析に特化したソフトウェアを使用するのか、どんな点に注意して実験・解析を行うのかについて説明しています。
また少しですがCNV検出にも触れています。
みなさまの解析のご参考になりましたら幸いです。
| kubo | 次世代シーケンサー解析 | 16:31 | comments(0) | - |
Pythonでgzipされたテキストファイルをcsvモジュールで読み込む
gzip圧縮されたファイルをPythonで読み込むときには、少し注意が必要です。
例として、手元に偶然あった魔法の言葉が書かれたタブ区切りテキストファイルを使用してみます。
zcat supercalifragilisticexpialidocious.txt.gz
super cali fragilistic expia lidocious!
su percali fragili stic expialidocious!
su per califragilis ticexpia lidocious!
読み込みましょう。

[magic.py]
import gzip
import csv

file = 'supercalifragilisticexpialidocious.txt.gz'
with gzip.open(file, 'r') as f:
reader = csv.reader(f, delimiter='¥t')
for row in reader:
print ''.join(row)
もし、下記のようなエラーが出た場合は、お使いのPythonバージョンがPython2.7未満かと思います。
Traceback (most recent call last):
File "magic.py", line 5, in <module>
with gzip.open(file, 'r') as f:
AttributeError: GzipFile instance has no attribute '__exit__'
Python2.7未満の場合はgzipにコンテキストマネージャーの機能が実装されていませんので、with文では使えません。→ [Pythonドキュメント-gzip]
以下のように書きます。
import gzip
import csv

file = 'supercalifragilisticexpialidocious.txt.gz'
f = gzip.open(file, 'r')
reader = csv.reader(f, delimiter='¥t')
for row in reader:
print ''.join(row)
f.close()
下記の出力が得られるはずです。
supercalifragilisticexpialidocious!
supercalifragilisticexpialidocious!
supercalifragilisticexpialidocious!
大きなファイルを圧縮できたらスッキリ!
supercalifragilisticexpialidocious!
| kubor | システム | 14:34 | comments(0) | - |
シェル芸
hatです。
先日、jus & USP友の会さんのシェル芸勉強会に参加してきました。

シェル芸は、USP友の会会長上田さんのブログで次のように定義されています。
「マウスも使わず、ソースコードも残さず、GUIツールを立ち上げる間もなく、あらゆる調査・計算・テキスト処理をCLI端末へのコマンド入力一撃で終わらすこと。あるいはそのときのコマンド入力のこと。」

シェル芸勉強会、ディープでした。
まがりなりにも十数年仕事でLinuxを使ってきて、それなりにシェルスクリプトを使える自信はあったのですが、私などまだまだだということを痛感しました。
知らなかった(ほとんど変態的ともいえる)テクニックや便利なコマンドを教えていただき、大変勉強になりました。

上田さんのブログで勉強会の過去問が公開されていますので(シェル芸勉強会問題一覧)、ご興味のある方はシェル芸に挑戦してみてはいかがでしょう。
| hat | システム | 15:29 | comments(0) | - |
Pythonを書くときに、タブじゃなくてスペースでインデントする
こんにちは。
先日、金さん(kimk)がお土産で買ってきてくださった栗羊羹があまりに美味しかったので、いっそ羊羹をまとめ買いするかどうか、悩んでいる久保(kubor)です。

羊羹のまとめ買いで悩む方が読者にいるかどうかはわかりませんが、プログラムを書くときにスペースインデントかタブインデントか悩むことはあるかと思います。

例えば、Python2では問題になりませんが、Python3だとスクリプト中のインデントに使うスペースとタブの混在は許されません。
したがってどちらかに統一する必要があります。
この場合、タブで書くのか、スペースで書くのか、悩むならスペースで書くのがおすすめです。

タブは環境依存で幅が変わる

多くのテキストエディタにおいて、タブはスペース8個分で表示されますが、
テキストエディタや、設定によって表示幅が変わります。

これによって大きく可読性が損なわれることもあります。
スペースでインデントするメリットは、この幅が変わらないという点です。

スペースでインデントするためにスペースキーの連打は不要

pep8ではインデントのスペース幅は4個分を推奨しています。
とは言え、毎回スペースを4回もタイプしていると気が狂いそうです。

テキストエディタ側で、タブキーをタイプした際にスペースが4個入力されるように設定していまいましょう。

例えば、Vimをお使いの方は、「~/.vimrc」に以下を記述します。
set expandtab
set shitwidth=4
set softtabstop=4
各項目の意味は以下の通りです。
  • expandtab:タブキーをタイプしたときに、タブの代わりにスペースを入力
  • shiftwidth:Vimが自動的にインデントするときのスペースの数
  • softtabstop:タブキーを入力した時のスペースの数

これで気が狂わずに済みます。
この設定を有効にしている時に、本当にタブを入力したいときは、
Ctrl+V [TAB]
で入力可能です。

自分が入力したのがタブなのかスペースなのか見えないからわからない時には、不可視文字を表示させる設定が有用です。
「Vimで不可視文字を表示させる方法」
| kubor | バイオインフォマティクス | 16:03 | comments(0) | - |
Pythonでタブ区切りテキストの読み込み
世の中には、2種類の人間がいる。
タブ区切りテキストを使う人と、使わない人だ。

こんにちは、タブ区切りテキストを使う人、久保(kubor)です。
Pythonでタブ区切りテキストを読み込むときは、csvライブラリが便利です。
標準ライブラリなので環境依存をそれほど考えなくて良いです。

以下にBEDファイルのヘッダー以降について、「end」と「行番号」を出力する例を示しました。

5行目のdelimiter='¥t'としているのがポイントです。
ここを変えればどんな区切り文字でも対応できます。

6行目のnext(reader)で、sample.tsvのヘッダーを飛ばしています。

行番号の取得はline_num()メソッドを使います。

sample.tsv
chr    start    end
chr1 18900 19356
chr2 1133 35211
chr3 21234 552312

サンプルスクリプト
import csv
tsv_file = sample.tsv
with open(tsv_file, 'r') as f:
reader = csv.reader(f, delimiter='¥t')
next(reader)
for row in reader:
print reader.line_num, row[2]
2 19356
3 35211
4 552312
ファイルハンドルは、with文を使うとスッキリするので好きです。
| kubor | バイオインフォマティクス | 14:04 | comments(0) | - |
  12345
6789101112
13141516171819
20212223242526
27282930   
<< September 2015 >>

このページの先頭へ