現在、ファイルに遺伝子のリストがあります。各行には、その情報を含む染色体があります。このようなエントリは次のように表示されます。
NM_198212 chr7 + 115926679 115935830 115927071 11593344 2 115926679、'115933260'、 115927221、'115935830'、
染色体の配列は、塩基 115926679 から始まり、塩基115935830まで (ただし含まない)続きます。
スプライシングされた配列が必要な場合は、エクソンを使用します。最初は 115926679 から 155927221に拡張され、2 番目は '115933260' から '115935830' に拡張されます。
ただし、次のような補完的なシーケンスで問題が発生しました。
NM_001005286 chr1 - 245941755 245942680 245941755 245942680 1 245941755、「245942680」
列 3 は「-」であるため、これらの座標はアンチセンス鎖 (鎖の補体) を参照しています。最初の塩基 (太字) は、センス鎖の最後の塩基 (イタリック体) と一致します。ファイルにはセンス スタンドしかないため、アンチセンス鎖の座標をセンス鎖に変換し、正しい配列を選択してから逆補完する必要があります。
とは言っても、私はプログラミングを始めてまだ半年ほどで、どうやって始めればいいのかわかりません。
私は正規表現を書きました:
'(NM_\d+)\s+(chr\d+)([(\+)|(-)])\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+),(\d+),s+(\d+),(\d+),'
しかし、この機能を開始する方法がわかりません...誰かがこれを始めるのを手伝ってくれて、おそらくこれを行う方法を教えてくれたら、とても感謝しています。
OK: これが 25 番染色体だとします:
AAAAAAAAAACCCCCCCCCCTTTTTTTTTTGGGGGGGGGG
(各キャラクターは10人です)。
今:スプライスされていない遺伝子を探している場合: chr25 + 10 20
次に、遺伝子は 10 番目の位置 (0 から開始) から始まり、20 番目の位置まで上昇しますが、20 番目の位置は含まれません。したがって、次のようになります。
CCCCCCCCCC
かんたんだよ。Python の文字列スライスと非常によく一致します。
私があなたに与えると、より混乱します:
chr25 - 10 20
あなたが持っているのはポジティブストランドです。しかし、この遺伝子はマイナス(相補)鎖にあります。染色体が二本鎖としてどのように見えるかを思い出してください。
AAAAAAAAAACCCCCCCCCCTTTTTTTTTTGGGGGGGGGGGGGGGGGGAAAAAAAAAACCCCCCCCCC
_
一番下の鎖の遺伝子を探しています。つまり、右から 0 から数えます。上のストランドには左から、下のストランドには右から番号を付けます。ここで欲しいのは AAAAAAAAAA です。
キャッチは、私があなたにトップストランドだけを与えているということです. 私はあなたに一番下のストランドを与えていません。(一番上のストランドから自分自身を生成することもできますが、それがどれほど大きいかを考えると、そうしないことをお勧めします。)
したがって、座標を変換する必要があります。下の鎖では、塩基 0 (一番右の C) が上の鎖の塩基 39 と反対になっています。底 1 は底 38 に対して、底 2 はケース 37 に対してです。
つまり、下の鎖の塩基 10-20 を見つけたい場合は、上の鎖の塩基 20-29 を見ることができます (そして、それを逆補数します)。
下部ストランドの座標を下部ストランドの同等の座標に変換する方法を理解する必要があります。はい: とても紛らわしいです
私はウェロニカの元の答えを試しました:
fields = line.split(' \t')
geneID, chr, strand = fields[:2]
start = int(fields[3])
end = int(fields[4])
if strand == '-':
start,end = -(start + 1), -(end + 1) # this part was changed from original answer.
これは正しい軌道に乗っていますが、十分ではありません。これは 10 と 20 を取り、それを 20 と 10 に変えます。
そして、これを行うことで文字列を逆補完できることを知っています:
r = s[::-1]
bc = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}
l = list(r)
o = [bc[base] for base in l]
return ''.join(o)
編集しました!これは正しいように見えますか?!
fp2 = open('chr22.fa', 'r')
fp = open('chr22.fa', 'r')
for line in fp2:
newstring = ''
z = line.strip()
newstring += z
for line in fp:
fields = line.split('\t')
gene_ID, chr, strand = fields[:2]
start = int(fields[3])
end = int(fields[4])
bc = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A', 'a': 't', 't': 'a', 'c':'g', 'g':'c', 'N':'N', 'n':'n'}
l = list(newstring)
if strand == '+':
geneseq = ''.join([bc[base] for base in l[start:end]])
if strand == '-':
newstart, newend = -(start + 1), -(end + 1)
genseq = ''.join([bc[base] for base in l[newstart:newend]])