Exemple #1
0
    def try_to_combine(self, irandom):
        """
        Create a recombination event and write it to disk
        <irandom> is used as the seed for the myriad random number calls.
        If combine() is called with the same <irandom>, it will find the same event, i.e. it should be a random number, not just a seed
        """
        if self.args.debug:
            print 'combine (seed %d)' % irandom
        numpy.random.seed(irandom)
        random.seed(irandom)

        reco_event = RecombinationEvent(self.glfo)
        self.choose_vdj_combo(reco_event)
        self.erode_and_insert(reco_event)
        if self.args.debug:
            print '  joining eroded seqs'
            print '         v: %s' % reco_event.eroded_seqs['v']
            print '    insert: %s' % reco_event.insertions['vd']
            print '         d: %s' % reco_event.eroded_seqs['d']
            print '    insert: %s' % reco_event.insertions['dj']
            print '         j: %s' % reco_event.eroded_seqs['j']
        reco_event.recombined_seq = reco_event.eroded_seqs['v'] + reco_event.insertions['vd'] + reco_event.eroded_seqs['d'] + reco_event.insertions['dj'] + reco_event.eroded_seqs['j']
        reco_event.set_final_codon_positions()

        # set the original conserved codon words, so we can revert them if they get mutated NOTE we do it here, *after* setting the full recombined sequence, so the germline Vs that don't extend through the cysteine don't screw us over
        reco_event.unmutated_codons = {}
        for region, codon in utils.conserved_codons[self.args.chain].items():
            fpos = reco_event.final_codon_positions[region]
            original_codon = reco_event.recombined_seq[fpos : fpos + 3]
            reco_event.unmutated_codons[region] = reco_event.recombined_seq[fpos : fpos + 3]
            # print fpos, original_codon, utils.codon_ok(codon, reco_event.recombined_seq, fpos)

        codons_ok = utils.both_codons_ok(self.glfo['chain'], reco_event.recombined_seq, reco_event.final_codon_positions, extra_str='      ', debug=self.args.debug)
        if not codons_ok:
            if self.args.rearrange_from_scratch and self.args.generate_germline_set:  # if you let it try more than once, it screws up the desired allele prevalence ratios
                raise Exception('arg')
            return False
        in_frame = reco_event.cdr3_length % 3 == 0
        if self.args.rearrange_from_scratch and not in_frame:
            raise Exception('arg 2')  # if you let it try more than once, it screws up the desired allele prevalence ratios
            return False

        self.add_mutants(reco_event, irandom)  # toss a bunch of clones: add point mutations

        if self.args.debug:
            reco_event.print_event()

        # write output to csv
        reco_event.write_event(self.outfname, irandom=irandom)

        return True
Exemple #2
0
    def try_to_combine(self, irandom):
        """
        Create a recombination event and write it to disk
        <irandom> is used as the seed for the myriad random number calls.
        If combine() is called with the same <irandom>, it will find the same event, i.e. it should be a random number, not just a seed
        """
        if self.args.debug:
            print 'combine (seed %d)' % irandom
        numpy.random.seed(irandom)
        random.seed(irandom)

        reco_event = RecombinationEvent(self.glfo)
        self.choose_vdj_combo(reco_event)
        self.erode_and_insert(reco_event)
        if self.args.debug:
            print '  joining eroded seqs'
            print '         v: %s' % reco_event.eroded_seqs['v']
            print '    insert: %s' % reco_event.insertions['vd']
            print '         d: %s' % reco_event.eroded_seqs['d']
            print '    insert: %s' % reco_event.insertions['dj']
            print '         j: %s' % reco_event.eroded_seqs['j']
        reco_event.recombined_seq = reco_event.eroded_seqs[
            'v'] + reco_event.insertions['vd'] + reco_event.eroded_seqs[
                'd'] + reco_event.insertions['dj'] + reco_event.eroded_seqs['j']
        reco_event.set_final_codon_positions()

        # set the original conserved codon words, so we can revert them if they get mutated NOTE we do it here, *after* setting the full recombined sequence, so the germline Vs that don't extend through the cysteine don't screw us over
        reco_event.unmutated_codons = {}
        for region, codon in utils.conserved_codons[self.args.locus].items():
            fpos = reco_event.final_codon_positions[region]
            original_codon = reco_event.recombined_seq[fpos:fpos + 3]
            reco_event.unmutated_codons[region] = reco_event.recombined_seq[
                fpos:fpos + 3]
            # print fpos, original_codon, utils.codon_unmutated(codon, reco_event.recombined_seq, fpos)

        codons_ok = utils.both_codons_unmutated(
            self.glfo['locus'],
            reco_event.recombined_seq,
            reco_event.final_codon_positions,
            extra_str='      ',
            debug=self.args.debug)
        if not codons_ok:
            if self.args.rearrange_from_scratch and self.args.generate_germline_set:  # if you let it try more than once, it screws up the desired allele prevalence ratios
                raise Exception('arg')
            return False
        in_frame = utils.in_frame(
            reco_event.recombined_seq, reco_event.final_codon_positions, '',
            reco_event.effective_erosions['v_5p']
        )  # NOTE empty string is the fv insertion, which is hard coded to zero in event.py. I no longer recall the details of that decision, but I have a large amount of confidence that it's more sensible than it looks
        if self.args.rearrange_from_scratch and not in_frame:
            raise Exception(
                'arg 2'
            )  # if you let it try more than once, it screws up the desired allele prevalence ratios
            return False

        self.add_mutants(
            reco_event, irandom)  # toss a bunch of clones: add point mutations

        if self.args.debug:
            reco_event.print_event()

        # write output to csv
        reco_event.write_event(self.outfname, irandom=irandom)

        return True