我目前在一个文件中有一个基因列表。每条线都有一条带有它的信息的染色体。这样的条目显示为:
NM_198212 chr7 + 115926679 115935830 115927071 11593344 2 115926679 ,'115933260', 115927221 ,'115935830',
染色体的序列从碱基115926679开始,一直到(但不包括)碱基115935830
如果我们想要拼接序列,我们使用外显子。第一个从 115926679延伸到155927221,第二个从 '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+),'
但现在我不确定如何启动这个功能......如果有人可以帮助我开始这方面的工作,也许让我知道如何做到这一点,我将非常感激。
好的:假设这是 25 号染色体:
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!
(每个字符有 10 个)。
现在:如果我正在寻找未剪接的基因:chr25 + 10 20
然后基因从位置 10(从 0 开始)开始,向上但不包括位置 20。所以它:
中交中交中交
这很简单。它非常适合 python 字符串切片。
如果我给你,它会更令人困惑:
chr25 - 10 20
你所拥有的是积极的一面。但是这个基因在负(互补)链上。记住染色体看起来像双链:
啊啊
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!
我们正在寻找底部链上的基因。这意味着我们从右边开始从 0 开始计数。上链从左开始编号,下链从右开始。所以我在这里想要的是 AAAAAAAAAA。
问题是我只给你最上面的部分。我不会给你底线。(你可以从顶层生成自己——但考虑到它有多大,我建议不要这样做。)
所以你需要转换坐标。在底链上,碱基 0(最右边的 C)与顶链上的碱基 39 相对。以 1 为底数与 38 为底数。以 2 为底数以 37 为底数。(重要一点:注意每次将这两个数字相加时会发生什么。)因此,以 10 为底数以 29 为底数,以 19 为底数以 20 为底数。
所以:如果我想在底部链上找到基数 10-20,我可以查看顶部的基数 20-29(然后反向补码)。
我需要弄清楚如何将底部链上的坐标转换为底部链上的等效坐标。是的:这很混乱
我试过weronika的原始答案:
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]])