def new_pot(x, x_len, y, y_len): mpotsnp = MeltingPotSNP( a=''.join([before[before_len - shift:], x, after[:pr_len - shift - x_len]]), am=''.join([before[before_len - shift:], y, after[:pr_len - shift - x_len]]), b=reverse_complement(''.join( [before[before_len - shift:], x, after[:pr_len - shift - y_len]])), bm=reverse_complement(''.join( [before[before_len - shift:], y, after[:pr_len - shift - y_len]])), position=str(shift)) mpotsnp.meltDone.connect(self.on_melt_ready) return mpotsnp
def task(self, task): self.__task = task.replace(" ", "") self.__task = task.replace("\n", "") self.__melting_pots = [] patterns = {re.compile(SIMPLE_TASK_PATTERN, re.IGNORECASE): TaskType.simple, re.compile(SNP_TASK_PATTERN, re.IGNORECASE): TaskType.snp, re.compile(SNP_TASK_WITH_SHIFT_PATTERN, re.IGNORECASE): TaskType.snp_shift, re.compile(MISMATCH_TASK_PATTERN, re.IGNORECASE): TaskType.mismatch, re.compile(RANGE_TASK_PATTERN, re.IGNORECASE): TaskType.cut_range, } self.__task_type = TaskType.error match_result = None for pat in patterns: match_result = pat.match(self.__task) if match_result: self.__task_type = patterns[pat] break if self.__task_type is TaskType.simple: self.__melting_pots = [MeltingPot(self.__task, reverse_complement(self.__task))] elif self.__task_type is TaskType.cut_range: before = match_result.group('before') variable = match_result.group('range') after = match_result.group('after') step = 1 if before else -1 variable_parts = [variable[:i] for i in range(0, len(variable) + 1)] \ if before else \ reversed([variable[i:] for i in range(0, len(variable) + 1)]) self.__melting_pots = [MeltingPot( ''.join([before, variable, after]), reverse_complement(''.join([before, variable, after])) ) for variable in variable_parts] elif self.__task_type is TaskType.mismatch: before = match_result.group('before') a = match_result.group('a') b = match_result.group('b') after = match_result.group('after') self.__melting_pots = [ MeltingPot(''.join([before, a, after]), reverse_complement(''.join( [before, b, after]))) ] elif self.__task_type is TaskType.snp: before = match_result.group('before') wt = match_result.group('wt') mut = match_result.group('mut') after = match_result.group('after') self.__melting_pots = [ MeltingPot(''.join([before, wt, after]), reverse_complement(''.join( [before, wt, after]))), MeltingPot(''.join([before, wt, after]), reverse_complement(''.join( [before, mut, after]))), MeltingPot(''.join([before, mut, after]), reverse_complement(''.join( [before, mut, after]))), MeltingPot(''.join([before, mut, after]), reverse_complement(''.join( [before, wt, after]))), ] elif self.__task_type is TaskType.snp_shift: before = match_result.group('before').lower() before_len = len(before) wt = match_result.group('wt').upper() wt_len = len(wt) mut = match_result.group('mut').upper() mut_len = len(mut) after = match_result.group('after').lower() self.probeMin = int(match_result.group('min')) self.probeMax = int(match_result.group('max')) self.__task = '{bef}({wt}>{mut}){aft}'.format(bef=before, wt=wt, mut=mut, aft=after,) self.__melting_pots = [] for pr_len in range(self.probeMin, self.probeMax + 1): for shift in range(0, pr_len): def new_pot(x, x_len, y, y_len): mpotsnp = MeltingPotSNP( a=''.join([before[before_len - shift:], x, after[:pr_len - shift - x_len]]), am=''.join([before[before_len - shift:], y, after[:pr_len - shift - x_len]]), b=reverse_complement(''.join( [before[before_len - shift:], x, after[:pr_len - shift - y_len]])), bm=reverse_complement(''.join( [before[before_len - shift:], y, after[:pr_len - shift - y_len]])), position=str(shift)) mpotsnp.meltDone.connect(self.on_melt_ready) return mpotsnp self.melting_pots.append( new_pot(wt, wt_len, mut, mut_len) ) elif self.__task_type is TaskType.error: raise MTaskParsingError else: raise MTaskParsingError