예제 #1
0
 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
예제 #2
0
    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