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))