vic zai 2020-05-08 15:02 采纳率: 28.6%
浏览 385

如何成功运行以下代码并输出结果

运行代码出现报错:
Traceback (most recent call last):
line 138, in test()

line 118, in test motifs = MyMotifs(lseqs)
line 17, in init
self.alphabet = seqs[0].alphabet()
TypeError: 'Alphabet' object is not callable
Process finished with exit code 1

from Bio.Seq import Seq
def create_matrix_zeros(nrows,ncols):
    res = []
    for i in range(0,nrows):
        res.append([0]*ncols)
    return res

def print_matrix(mat):
    for i in range(0,len(mat)):
        print(mat[i])

class MyMotifs:
    def __init__(self,seqs=(),pwm=(),alphabet=None):
        if seqs:
            self.size = len(seqs[0])
            self.seqs = seqs
            self.alphabet = seqs[0].alphabet()
            self.do_counts()
            self.create_pwm()
        else:
            self.pwm = pwm
            self.size = len(pwm(0))
            self.alphabet = alphabet

    def __len__(self):
        return self.size

    def do_counts(self):
        # noinspection PyAttributeOutsideInit
        self.counts = create_matrix_zeros(len(self.alphabet),self.size)
        # noinspection PyShadowingNames
        for si in self.seqs:
            for i in range(self.size):
                lin = self.alphabet.index(si[i])
                self.counts[lin][i] += 1

    def create_pwm(self):
        if self.counts is None:
            self.do_counts()
        self.pwm = create_matrix_zeros(len(self.alphabet),self.size)
        for i in range(len(self.alphabet)):
            for j in range(self.size):
                # noinspection PyTypeChecker
                self.pwm[i][j] = float(self.counts[i][j]) / len(self.seqs)

    def consensus(self):
        res = ""
        for j in range(self.size):
            maxcol = self.counts[0][j]
            maxcoli = 0
            for i in range(1,len(self.alphabet)):
                if self.counts[i][j] > maxcol:
                    maxcol = self.counts[i][j]
                    maxcoli = i
            res += self.alphabet[maxcoli]
        return res

    def masked_consensus(self):
        res = ""
        for j in range(self.size):
            maxcol = self.counts[0][j]
            maxcoli = 0
            for i in range(1,len(self.alphabet)):
                if self.counts[i][j] > maxcol:
                    maxcol = self.counts[i][j]
                    maxcoli = i
            if maxcol > len(self.seqs) / 2:
                res += self.alphabet[maxcoli]
            else:
                res += "-"
        return res

    def probability_sequence(self,seq):
        res = 1.0
        for i in range(self.size):
            lin = self.alphabet.index(seq[i])
            res *= self.pwm[lin][i]
            return res

    def probability_all_positions(self,seq):
        res = []
        for k in range(len(seq)-self.size+1):
            res.append(self.probability_sequence(seq))
        return res

    def most_probable_sequence(self,seq):
        maximum = -1.0
        maxind = -1
        for k in range(len(seq)-self.size):
            p = self.probability_sequence(seq[k:k+self.size])
            if p > maximum:
                maximum = p
                maxind = k
        return maxind

    def create_motif(self,seqs):
        from Bio.Seq import Seq
        l = []
        # noinspection PyShadowingNames
        for si in seqs:
            ind = self.most_probable_sequence(si.seq)
            subseq = Seq(si[ind:(ind+self.size)],si.get_seq_biotype())
            l.append(subseq)

        return MyMotifs(l)


def test():
    seq1 = Seq("AAAGTT")
    seq2 = Seq("CACGTG")
    seq3 = Seq("TTGGGT")
    seq4 = Seq("GACCGT")
    seq5 = Seq("AACCAT")
    seq6 = Seq("AACCCT")
    seq7 = Seq("AAACCT")
    seq8 = Seq("GAACCT")
    lseqs = [seq1,seq2,seq3,seq4,seq5,seq6,seq7,seq8]
    motifs = MyMotifs(lseqs)
    print ("Counts matrix")
    print_matrix(motifs.counts)
    print ("PWM")
    print_matrix(motifs.pwm)
    print ("Sequence alphabet")
    print(motifs.alphabet)

    for s in lseqs:
        print(s)
    print ("Consensus sequence")
    print(motifs.consensus())
    print ("Masked Consensus sequence")
    print(motifs.masked_consensus())

    print(motifs.probability_sequence("AAACCT"))
    print(motifs.probability_sequence("ATACAG"))
    print(motifs.most_probable_sequence("CTATAAACCTTACATC"))


test()


我改不出来了请各位帮忙试着运行下并可以输出结果

  • 写回答

1条回答 默认 最新

  • Nora持续行 2020-05-09 08:11
    关注

    TypeError: 'Alphabet' object is not callable,类型错误,Alphabet对象不是可调用的。
    可调用的意思是指,你在这个对象的后面加了个括号。
    因此根据错误可以看出来,在第17行时,你的alphabet后面不应该有括弧。(你这一行只有alphabet后面有括号,所以说的就是这个了)

    因为你的代码引用的Bio库不是官方库,所以其他人没有办法运行你的程序。
    当你的程序出现错误时,你可以把最后一行的提示信息放到百度搜索框里,看看其他人的类似问题是什么原因。

    评论

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置