samtools の FILTER EXPRESSION について、日本語でサクッと見返せるように、マニュアルをChatGPTに日本語に翻訳してもらいました。原文は man samtools
もしくは、上のリンクから確認できます。
FILTER EXPRESSIONS(フィルター式)
フィルター式は、SAM、BAM、CRAMレコードを随時チェックし、指定された条件に一致しないレコードを破棄するために使用します。
この言語は主にC言語スタイルに基づいていますが、ビット演算子の優先順位規則に若干の違いがあり、正規表現の一致もサポートしています。
演算子の優先順位
優先順位が高い順から低い順に並べています:
-
グルーピング
(
,)
例:(1 + 2) * 3
-
値: リテラル、変数
数値、文字列、変数 -
単項演算子:
+
,-
,!
,~
例:-10
,+10
,!10
(論理否定),~5
(ビット否定) -
算術演算子:
*
,/
,%
乗算、除算、剰余(整数) -
算術演算子:
+
,-
加算、減算 -
ビット単位の演算:
&
ビットAND -
ビット単位の演算:
^
ビットXOR -
ビット単位の演算:
|
ビットOR -
条件演算子:
>
,>=
,<
,<=
-
等価演算子:
==
,!=
,=~
,!~
=~
と!~
は正規表現の一致を確認します。 -
論理演算子:
&&
,||
論理AND、論理OR
演算の詳細
フィルター式の計算には浮動小数点演算が使用されるため、10 / 4
は 2.5
となり、2
ではありません。数値は10進数や16進数(0x
を付与)で表現できます。浮動小数点も指数付きで表現可能です。
ただし、整数を要求する演算では暗黙的に型変換が行われます。たとえば、7.9 % 5
は 2
となり、7.9 & 4.1
は 7 & 4
と等価で 4
になります。
文字列は必ずダブルクォートで囲み、ダブルクォート自体を文字列内に含めるにはバックスラッシュを使用します(例:ab\"c\\d
は ab"c\d
)。
比較演算と未定義値の扱い
比較演算は一致した場合 1
、不一致の場合 0
を返します。たとえば、(2 > 1) + (3 < 5)
は 2
になります。未定義(null)値を含むすべての比較は偽(false)と見なされます。
変数とSAMフィールド
変数はSAM形式のフィールドを表しており、これを使ってレコードをフィルタリングします。たとえば、高いマッピング品質(mapping quality)かつ非常に大きなインサートサイズを持つペアのアラインメントを探す場合、次の式を使用します:
mapq >= 30 && (tlen >= 100000 || tlen <= -100000)
使用できる変数とそのデータ型を以下に示します:
-
endpos
(int): アラインメント終了位置(1-based) -
flag
(int): FLAGフィールド全体 -
flag.paired
(int): シングルビット(0 または 1) -
flag.proper_pair
(int): シングルビット(0 または 2) -
flag.unmap
(int): シングルビット(0 または 4) -
flag.munmap
(int): シングルビット(0 または 8) -
flag.reverse
(int): シングルビット(0 または 16) -
flag.mreverse
(int): シングルビット(0 または 32) -
flag.read1
(int): シングルビット(0 または 64) -
flag.read2
(int): シングルビット(0 または 128) -
flag.secondary
(int): シングルビット(0 または 256) -
flag.qcfail
(int): シングルビット(0 または 512) -
flag.dup
(int): シングルビット(0 または 1024) -
flag.supplementary
(int): シングルビット(0 または 2048) -
hclen
(int): ハードクリップされた塩基数 -
library
(string): ライブラリ(RGヘッダーのLBフィールド) -
mapq
(int): マッピング品質(mapping quality) -
mpos
(int):pnext
の同義語 -
mrefid
(int): メイトの参照番号(0-based) -
mrname
(string):rnext
の同義語 -
ncigar
(int): CIGAR操作の数 -
pnext
(int): メイトのアラインメント位置(1-based) -
pos
(int): アラインメント位置(1-based) -
qlen
(int): クエリ塩基数 -
qname
(string): クエリ名 -
qual
(string): 品質値(0-based) -
refid
(int): 参照番号(0-based) -
rlen
(int): 参照塩基数 -
rname
(string): 参照名 -
rnext
(string): メイトの参照名 -
sclen
(int): ソフトクリップされた塩基数 -
seq
(string): 配列 -
tlen
(int): テンプレート長(インサートサイズ) -
[XX]
(int / string): XXタグの値
補助タグの扱い
タグが存在するかの確認は単にタグ名を記述するだけで行います(例:[NM]
)。htslib <= 1.15
では、![NM]
がタグが存在しない場合や値が0の場合のどちらでも真(true)でしたが、1.16
以降では「存在しない」場合のみ真と判断されるようになりました。
関数
文字列や数値を操作するための関数がいくつか用意されています。
-
length(x)
:文字列の長さ(null文字を除く) -
min(x)
:文字列内の最小バイト値 -
max(x)
:文字列内の最大バイト値 -
avg(x)
:文字列内のバイト値の平均
数値専用の関数もあります:
-
sqrt(x)
:平方根 -
log(x)
:自然対数 -
pow(x, y)
:x
のy
乗 -
exp(x)
:自然指数関数