Esempio n. 1
0
    def findAllMotifPattern(self, maxMergeCnt, hasFilter=False):
        """
        ABANDONED!!

        calculate all the Patterns(mergeCnt <= maxMergeCnt) by merging iteratively
            from initial pattern(mergeCnt = 0, i.e. path)

        The patterns are stored in self.pattern which is a dict
            key : (k, mergeCnt)
            value : [(newPattern, pattern1, pattern2)]
        :param hasFilter:
            whether the filter works
        :param maxMergeCnt:
            how many times do we merge
        """
        for k, pathLis in self.path.iteritems():
            patternLis2 = set([(BioinfoComm.Kmer2Str(path.nodeLis), tuple(path.visitLis)) for path in pathLis])
            for mergeCnt in range(maxMergeCnt):
                print "searching motif pattern: length = %s, mergeCnt = %s " % (k + 1, mergeCnt + 1)
                Comm.PrintTime()

                # fetch two pattern list(contain all the patterns with a certain length and mergeCnt) to merge
                # patternLis2 is a list of paths and never change
                if (k, mergeCnt) in self.pattern: # (after the first loop) patternLis1 to be merged is pattern
                    mergedPatternLis = map(lambda x:x[0], self.pattern[(k, mergeCnt)])
                    # 'tuple' conversion is necessary otherwise there will be an error because list is unhashable
                    patternLis1 = set([(x.patternStr, tuple(x.visitLis)) for x in mergedPatternLis])
                    patternLis1 = [(x[0], x[1]) for x in patternLis1]
                    patternLis2 = patternLis2.union(patternLis1)
                else: # (in the first loop) patternLis1 to be merged is paths
                    patternLis1 = patternLis2

                # merge two pattern lists
                for (patternStr1, visitLis1) in patternLis1:
                    pattern1 = Pattern(patternStr1, list(visitLis1))
                    if hasFilter and self.IsPatternFiltered(visitLis1): continue
                    for (patternStr2, visitLis2) in patternLis2:
                        # TODO: to be improved
                        if patternStr1 >= patternStr2: continue
                        if self.IsPatternFiltered(visitLis1): continue
                        visitLis2 = list(visitLis2)
                        pattern2 = Pattern(patternStr2, visitLis2)
                        newPattern = Pattern.mergePattern(pattern1, pattern2)
                        if not newPattern: continue
                        self.pattern.setdefault((k, mergeCnt + 1), [])
                        self.pattern[(k, mergeCnt + 1)].append((newPattern, pattern1, pattern2))