Ejemplo n.º 1
0
    def test_does_not_return_front_back_junction_verification_primers_if_they_are_not_useful(
            self):
        upstream = "gagattgtccgcgttttagctgatacgtacgtgtcgatcgacttgcgtatctgatcatctgacgtagat"
        front_bs = "catagcgcacaggacgcggag"
        middle = "ccagtcgctgaggcagtcgatgcaggcatcgatcaggctggcacctgtgagccgagctcacgtatgcatcatcattga"
        back_bs = "taatgaccccgaagcagg"
        downstream = "gttaaggcgcgaacatagctagtactagtcacgtagtcatttgtcgtacgtacgtattgagtcatca"
        replaced = "gactacgatcagtcgtagtaacgcgtagcgtagtcagcgtacacgtacgtagacgacgtacatgcatcgtactgtatc"

        template = ''.join([upstream, front_bs, middle, back_bs, downstream])
        cassette = ''.join([front_bs, replaced, back_bs])
        arm_len = min(len(front_bs), len(back_bs))

        g = self.build_genome(False, template)
        r = find_swap_region(g, cassette, arm_len, design_primers=True)

        self.assertEquals(len(r), 1)
        self.assertEquals(len(r[0].verification_cassette), 5)
        self.assertEquals(len(r[0].verification_front), 5)
        self.assertEquals(len(r[0].verification_back), 5)

        # cassette same as region to be replaced, front and back verification
        # primers are not useful
        cassette = ''.join([front_bs, middle, back_bs])
        r = find_swap_region(g, cassette, arm_len, design_primers=True)

        self.assertEquals(len(r), 1)
        self.assertEquals(len(r[0].verification_cassette), 5)
        self.assertEquals(len(r[0].verification_front), 0)
        self.assertEquals(len(r[0].verification_back), 0)
Ejemplo n.º 2
0
    def test_does_not_return_front_back_junction_verification_primers_if_they_are_not_useful(self):
        upstream = "gagattgtccgcgttttagctgatacgtacgtgtcgatcgacttgcgtatctgatcatctgacgtagat"
        front_bs = "catagcgcacaggacgcggag"
        middle = "ccagtcgctgaggcagtcgatgcaggcatcgatcaggctggcacctgtgagccgagctcacgtatgcatcatcattga"
        back_bs = "taatgaccccgaagcagg"
        downstream = "gttaaggcgcgaacatagctagtactagtcacgtagtcatttgtcgtacgtacgtattgagtcatca"
        replaced = "gactacgatcagtcgtagtaacgcgtagcgtagtcagcgtacacgtacgtagacgacgtacatgcatcgtactgtatc"

        template = ''.join([upstream, front_bs, middle, back_bs, downstream])
        cassette = ''.join([front_bs, replaced, back_bs])
        arm_len = min(len(front_bs), len(back_bs))

        g = self.build_genome(False, template)
        r = find_swap_region(g, cassette, arm_len, design_primers=True)

        self.assertEquals(len(r), 1)
        self.assertEquals(len(r[0].verification_cassette), 5)
        self.assertEquals(len(r[0].verification_front), 5)
        self.assertEquals(len(r[0].verification_back), 5)

        # cassette same as region to be replaced, front and back verification
        # primers are not useful
        cassette = ''.join([front_bs, middle, back_bs])
        r = find_swap_region(g, cassette, arm_len, design_primers=True)

        self.assertEquals(len(r), 1)
        self.assertEquals(len(r[0].verification_cassette), 5)
        self.assertEquals(len(r[0].verification_front), 0)
        self.assertEquals(len(r[0].verification_back), 0)
Ejemplo n.º 3
0
    def test_finding_swap_region_across_circular_boundary(self):
        upstream = "gagattgtccgcgtttt"
        front_bs = "catagcgcacaggacgcggag"
        middle = "cggcacctgtgagccg"
        back_bs = "taatgaccccgaagcagg"
        downstream = "gttaaggcgcgaacat"
        replaced = "aaaaaaaaaaaaaaaaaaa"

        cassette = ''.join([front_bs, replaced, back_bs])
        arm_len = min(len(front_bs), len(back_bs))

        template = ''.join(
            [middle[8:], back_bs, downstream, upstream, front_bs, middle[0:8]])
        g = self.build_genome(True, template)

        r = find_swap_region(g, cassette, arm_len)
        self.assertEquals(len(r), 1)
        self.assertEquals(r[0].fragment_id, g.fragments.all()[0].id)
        self.assertEquals(r[0].fragment_name, g.fragments.all()[0].name)
        self.assertEquals(r[0].start, len(template) - 8 - len(front_bs) + 1)
        self.assertEquals(r[0].end, len(middle) - 8 + len(back_bs))
        self.assertEquals(r[0].sequence, ''.join([front_bs, middle, back_bs]))
        self.assertEquals(r[0].cassette_reversed, False)
        self.assertEquals(r[0].front_arm, front_bs[0:arm_len])
        self.assertEquals(r[0].back_arm, back_bs[-arm_len:])
Ejemplo n.º 4
0
    def test_finds_correct_region_for_swapping_with_reverse_complement_cassette(
            self):
        upstream = "gagattgtccgcgtttt"
        front_bs = "catagcgcacaggacgcggag"
        middle = "cggcacctgtgagccg"
        back_bs = "taatgaccccgaagcagg"
        downstream = "gttaaggcgcgaacat"
        replaced = "aaaaaaaaaaaaaaaaaaa"

        cassette = str(
            Seq(''.join([front_bs, replaced, back_bs])).reverse_complement())
        arm_len = min(len(front_bs), len(back_bs))

        template = ''.join([upstream, front_bs, middle, back_bs, downstream])
        g = self.build_genome(False, template)

        r = find_swap_region(g, cassette, arm_len)
        self.assertEquals(len(r), 1)
        self.assertEquals(r[0].fragment_id, g.fragments.all()[0].id)
        self.assertEquals(r[0].fragment_name, g.fragments.all()[0].name)
        self.assertEquals(r[0].start, len(upstream) + 1)
        self.assertEquals(r[0].end, len(template) - len(downstream))
        self.assertEquals(r[0].sequence, ''.join([front_bs, middle, back_bs]))
        self.assertEquals(r[0].cassette_reversed, True)
        self.assertEquals(r[0].front_arm,
                          str(Seq(back_bs[-arm_len:]).reverse_complement()))
        self.assertEquals(r[0].back_arm,
                          str(Seq(front_bs[0:arm_len]).reverse_complement()))
Ejemplo n.º 5
0
    def test_finding_reverse_complement_region_when_back_arm_is_across_circular_boundary(
        self, ):
        upstream = "gagattgtccgcgtttt"
        front_bs = "catagcgcacaggacgcggag"
        middle = "cggcacctgtgagccg"
        back_bs = "taatgaccccgaagcagg"
        downstream = "gttaaggcgcgaacat"
        replaced = "aaaaaaaaaaaaaaaaaaa"

        cassette = str(
            Seq("".join([front_bs, replaced, back_bs])).reverse_complement())
        arm_len = min(len(front_bs), len(back_bs))

        template = "".join([
            back_bs[8:], downstream, upstream, front_bs, middle, back_bs[0:8]
        ])
        g = self.build_genome(True, template)

        r = find_swap_region(g, cassette, arm_len)
        self.assertEquals(len(r), 1)
        self.assertEquals(r[0].fragment_id, g.fragments.all()[0].id)
        self.assertEquals(r[0].fragment_name, g.fragments.all()[0].name)
        self.assertEquals(r[0].start,
                          len(back_bs) - 8 + len(downstream + upstream) + 1)
        self.assertEquals(r[0].end, len(back_bs) - 8)
        self.assertEquals(r[0].sequence, "".join([front_bs, middle, back_bs]))
        self.assertEquals(r[0].cassette_reversed, True)
        self.assertEquals(r[0].front_arm,
                          str(Seq(back_bs[-arm_len:]).reverse_complement()))
        self.assertEquals(r[0].back_arm,
                          str(Seq(front_bs[0:arm_len]).reverse_complement()))
Ejemplo n.º 6
0
    def test_finds_single_crossover_region(self):
        upstream = "gagattgtccgcgtttt"
        locus = "catagcgcacaggacgcggagtaggcgtagtcggttgatctgatgtc"
        downstream = "gttaaggcgcgaacat"
        insertion = "aaaaaaaaaaaaaaaaaaa"
        locus_len = len(locus)
        bs_len = int(locus_len / 2)

        template = "".join([upstream, locus, downstream])
        cassette = "".join(
            [locus[locus_len - bs_len:], insertion, locus[0:bs_len]])

        g = self.build_genome(False, template)
        arm_len = bs_len - 2
        r = find_swap_region(g, cassette, arm_len)
        self.assertEquals(len(r), 1)
        self.assertEquals(r[0].fragment_id, g.fragments.all()[0].id)
        self.assertEquals(r[0].fragment_name, g.fragments.all()[0].name)
        self.assertEquals(r[0].is_double_crossover, False)
        self.assertEquals(r[0].start, 20)
        self.assertEquals(r[0].end, 62)
Ejemplo n.º 7
0
    def test_finds_correct_region_for_swapping(self):
        upstream = "gagattgtccgcgtttt"
        front_bs = "catagcgcacaggacgcggag"
        middle = "cggcacctgtgagccg"
        back_bs = "taatgaccccgaagcagg"
        downstream = "gttaaggcgcgaacat"
        replaced = "aaaaaaaaaaaaaaaaaaa"

        template = ''.join([upstream, front_bs, middle, back_bs, downstream])
        cassette = ''.join([front_bs, replaced, back_bs])

        arm_len = min(len(front_bs), len(back_bs))
        g = self.build_genome(False, template)
        r = find_swap_region(g, cassette, arm_len)
        self.assertEquals(len(r), 1)
        self.assertEquals(r[0].fragment_id, g.fragments.all()[0].id)
        self.assertEquals(r[0].fragment_name, g.fragments.all()[0].name)
        self.assertEquals(r[0].start, len(upstream)+1)
        self.assertEquals(r[0].end, len(template)-len(downstream))
        self.assertEquals(r[0].sequence, ''.join([front_bs, middle, back_bs]))
        self.assertEquals(r[0].cassette_reversed, False)
        self.assertEquals(r[0].front_arm, front_bs[0:arm_len])
        self.assertEquals(r[0].back_arm, back_bs[-arm_len:])
Ejemplo n.º 8
0
    def test_finding_swap_region_across_circular_boundary(self):
        upstream = "gagattgtccgcgtttt"
        front_bs = "catagcgcacaggacgcggag"
        middle = "cggcacctgtgagccg"
        back_bs = "taatgaccccgaagcagg"
        downstream = "gttaaggcgcgaacat"
        replaced = "aaaaaaaaaaaaaaaaaaa"

        cassette = ''.join([front_bs, replaced, back_bs])
        arm_len = min(len(front_bs), len(back_bs))

        template = ''.join([middle[8:], back_bs, downstream, upstream, front_bs, middle[0:8]])
        g = self.build_genome(True, template)

        r = find_swap_region(g, cassette, arm_len)
        self.assertEquals(len(r), 1)
        self.assertEquals(r[0].fragment_id, g.fragments.all()[0].id)
        self.assertEquals(r[0].fragment_name, g.fragments.all()[0].name)
        self.assertEquals(r[0].start, len(template)-8-len(front_bs)+1)
        self.assertEquals(r[0].end, len(middle)-8+len(back_bs))
        self.assertEquals(r[0].sequence, ''.join([front_bs, middle, back_bs]))
        self.assertEquals(r[0].cassette_reversed, False)
        self.assertEquals(r[0].front_arm, front_bs[0:arm_len])
        self.assertEquals(r[0].back_arm, back_bs[-arm_len:])
Ejemplo n.º 9
0
    def on_post(self, request, genome_id):
        from edge.recombine import find_swap_region, recombine
        genome = get_genome_or_404(genome_id)

        parser = RequestParser()
        parser.add_argument('cassette', field_type=str, required=True, location='json')
        parser.add_argument('homology_arm_length', field_type=int, required=True, location='json')
        parser.add_argument('create', field_type=bool, required=True, location='json')
        parser.add_argument('genome_name', field_type=str, required=False,
                            default=None, location='json')
        parser.add_argument('cassette_name', field_type=str, required=False,
                            default=None, location='json')
        parser.add_argument('notes', field_type=str, required=False,
                            default=None, location='json')

        args = parser.parse_args(request)
        cassette = args['cassette']
        arm_length = args['homology_arm_length']
        create = args['create']
        genome_name = args['genome_name']
        cassette_name = args['cassette_name']
        notes = args['notes']

        if create is False:
            r = find_swap_region(genome, cassette, arm_length)
            return [x.to_dict() for x in r], 200
        else:
            c = recombine(genome, cassette, arm_length,
                          genome_name=genome_name,
                          cassette_name=cassette_name,
                          notes=notes)
            if c is None:
                return None, 400
            else:
                schedule_building_blast_db(c.id)
                return GenomeView.to_dict(c), 201
Ejemplo n.º 10
0
    def __test_verification_primers(self, template, middle, cassette, arm_len,
                                    is_reversed):
        from edge.pcr import pcr_from_genome

        g = self.build_genome(False, template)
        r = find_swap_region(g, cassette, arm_len, design_primers=True)

        self.assertEquals(len(r), 1)
        self.assertEquals(len(r[0].verification_cassette), 5)
        self.assertEquals(len(r[0].verification_front), 5)
        self.assertEquals(len(r[0].verification_back), 5)

        # cassette verification primers should work on unmodified genome
        for primer in r[0].verification_cassette:
            p = pcr_from_genome(g, primer['PRIMER_LEFT_SEQUENCE'],
                                primer['PRIMER_RIGHT_SEQUENCE'])
            self.assertNotEqual(p[0], None)
            self.assertEquals(p[0].index(middle) >= 0, True)

        # front verification primers should NOT produce product
        for primer in r[0].verification_front:
            p = pcr_from_genome(g, primer['PRIMER_LEFT_SEQUENCE'],
                                primer['PRIMER_RIGHT_SEQUENCE'])
            self.assertEqual(p[0], None)

        # back verification primers should NOT produce product
        for primer in r[0].verification_back:
            p = pcr_from_genome(g, primer['PRIMER_LEFT_SEQUENCE'],
                                primer['PRIMER_RIGHT_SEQUENCE'])
            self.assertEqual(p[0], None)

        # do recombination, then try primers again on modified genome

        c = recombine(g, cassette, arm_len)

        for f in c.fragments.all():
            try:
                os.unlink(fragment_fasta_fn(f))
            except:
                pass
        build_all_genome_dbs(refresh=True)
        # reload to get blastdb
        c = Genome.objects.get(pk=c.id)

        if is_reversed:
            cassette = str(Seq(cassette).reverse_complement())

        # cassette verification primers should work on modified genome, finding cassette
        for primer in r[0].verification_cassette:
            p = pcr_from_genome(c, primer['PRIMER_LEFT_SEQUENCE'],
                                primer['PRIMER_RIGHT_SEQUENCE'])
            self.assertNotEqual(p[0], None)
            self.assertEquals(p[0].index(cassette) >= 0, True)

        # front verification primers should find a product including front of cassette
        for primer in r[0].verification_front:
            p = pcr_from_genome(c, primer['PRIMER_LEFT_SEQUENCE'],
                                primer['PRIMER_RIGHT_SEQUENCE'])
            self.assertNotEqual(p[0], None)
            self.assertEquals(
                p[0].index(cassette[0:edge.recombine.CHECK_JUNCTION_LEFT_DN])
                >= 0, True)

        # back verification primers should find a product including back of cassette
        for primer in r[0].verification_back:
            p = pcr_from_genome(c, primer['PRIMER_LEFT_SEQUENCE'],
                                primer['PRIMER_RIGHT_SEQUENCE'])
            self.assertNotEqual(p[0], None)
            self.assertEquals(
                p[0].index(cassette[-edge.recombine.CHECK_JUNCTION_RIGHT_UP:])
                >= 0, True)
Ejemplo n.º 11
0
    def __test_verification_primers(self, template, middle, cassette, arm_len, is_reversed):
        from edge.pcr import pcr_from_genome

        g = self.build_genome(False, template)
        r = find_swap_region(g, cassette, arm_len, design_primers=True)

        self.assertEquals(len(r), 1)
        self.assertEquals(len(r[0].verification_cassette), 5)
        self.assertEquals(len(r[0].verification_front), 5)
        self.assertEquals(len(r[0].verification_back), 5)

        # cassette verification primers should work on unmodified genome
        for primer in r[0].verification_cassette:
            p = pcr_from_genome(g, primer['PRIMER_LEFT_SEQUENCE'], primer['PRIMER_RIGHT_SEQUENCE'])
            self.assertNotEqual(p[0], None)
            self.assertEquals(p[0].index(middle) >= 0, True)

        # front verification primers should NOT produce product
        for primer in r[0].verification_front:
            p = pcr_from_genome(g, primer['PRIMER_LEFT_SEQUENCE'], primer['PRIMER_RIGHT_SEQUENCE'])
            self.assertEqual(p[0], None)

        # back verification primers should NOT produce product
        for primer in r[0].verification_back:
            p = pcr_from_genome(g, primer['PRIMER_LEFT_SEQUENCE'], primer['PRIMER_RIGHT_SEQUENCE'])
            self.assertEqual(p[0], None)

        # do recombination, then try primers again on modified genome

        c = recombine(g, cassette, arm_len)

        for f in c.fragments.all():
            try:
                os.unlink(fragment_fasta_fn(f))
            except:
                pass
        build_all_genome_dbs(refresh=True)
        # reload to get blastdb
        c = Genome.objects.get(pk=c.id)

        if is_reversed:
            cassette = str(Seq(cassette).reverse_complement())

        # cassette verification primers should work on modified genome, finding cassette
        for primer in r[0].verification_cassette:
            p = pcr_from_genome(c, primer['PRIMER_LEFT_SEQUENCE'], primer['PRIMER_RIGHT_SEQUENCE'])
            self.assertNotEqual(p[0], None)
            self.assertEquals(p[0].index(cassette) >= 0, True)

        # front verification primers should find a product including front of cassette
        for primer in r[0].verification_front:
            p = pcr_from_genome(c, primer['PRIMER_LEFT_SEQUENCE'], primer['PRIMER_RIGHT_SEQUENCE'])
            self.assertNotEqual(p[0], None)
            self.assertEquals(p[0].index(cassette[0:edge.recombine.CHECK_JUNCTION_LEFT_DN]) >= 0,
                              True)

        # back verification primers should find a product including back of cassette
        for primer in r[0].verification_back:
            p = pcr_from_genome(c, primer['PRIMER_LEFT_SEQUENCE'], primer['PRIMER_RIGHT_SEQUENCE'])
            self.assertNotEqual(p[0], None)
            self.assertEquals(p[0].index(cassette[-edge.recombine.CHECK_JUNCTION_RIGHT_UP:]) >= 0,
                              True)