37,721
社区成员
发帖
与我相关
我的任务
分享
# -*- coding:utf-8 -*-
import time
import re
def getdra(filename):
fh= open(filename,'r')
s = fh.readline()
while s != '':
N = {} #运用字典N将二联核苷酸的种类放入其中
k = 1 #为字典索引定义一个初始值
for i in ['A','C','G','T']: #将四个核苷酸放入i列表中
for j in ['A','C','G','T']: #将四个核苷酸放入j列表中
N[k] = i+j #进行核苷酸的组合
k += 1 #索引加1
O = {} #运用字典O将二联核苷酸的出现的次数放入其中
if s[0] == '>':
print s[:-1]
line=fh.readline()
else:
line=fh.readline()
M = {1:0,2:0,3:0,4:0}
seq_len=0
for j in range(1,17,1): #设置步长1-16
O[j] = 0 #初始化字典的值
last=''
while line and line[0] != '>':
line1 = last+line
seq=line[:-1].upper()
seq_len+=len(seq)
M[1] += seq.count('A') #用count函数获取核苷酸A的数目
M[2] += seq.count('C') #用count函数获取核苷酸C的数目
M[3] += seq.count('G') #用count函数获取核苷酸G的数目
M[4] += seq.count('T') #用count函数获取核苷酸T的数目
for j in range(1,17,1): #设置步长1-16
if j in [1,6,11,16]:
ls=re.compile(N[j]+"+").findall(line1)
O[j]+=len("".join(ls)) - len(ls)
else:
O[j]+=line1.count(N[j])
last=seq[-1:]
line=fh.readline()
T = {} #运用字典T将最终频率结果放入其中
l = 1 #为字典索引定义一个初始值
for i in range(1,5,1): #通过两个嵌套循环实现求值
for j in range(1,5,1):
T[l] = float(O[l]*seq_len)/float(M[i]*M[j]) #根据公式可将T值简化为这个式子,使用float为了浮点输出,默认只保留小数点1位
#即如:(AA出现的次数O[1]*核苷酸总数seq_len)/A的数目(M[1]*A的数目M[1])
l += 1 #索引加1
for i in range(1,17,1): #运用循环将结果输出
print 'T('+N[i]+''')'s value is : '''+ str(T[i])
s = line
f.close()
if __name__ == '__main__':
bt=time.time()
getdra('chr1.fast')
print time.time()-bt
cdef extern from *:
char *strstr(char *str1, char *str2)
int memcmp(char *str1, char *str2, int n)
int strlen(char *str )
def count(char *s1, char *s2):
cdef char *curr
cdef int i, cnt, step
if strlen(s1) == 0 or strlen(s2) == 0:
return 0
# 分析重叠找最小步进
step = strlen(s2)
for i in range(step):
if memcmp(s2, s2+i, step-i) == 0:
step = i
break
# 分2支,单字符不调用strstr()
cnt , curr = 0, s1
if step == 1:
while True:
curr = strstr(curr, s2)
if curr == NULL:
break
cnt = cnt + 1
curr = curr + strlen(s2)
while curr[0] == s2[0]:
cnt = cnt + 1
curr = curr +1
else:
while True:
curr = strstr(curr, s2)
if curr == NULL:
break
cnt= cnt + 1
curr = curr + step
return cnt