예제 #1
0
def test_parse_error():
    from pydna.parsers import parse
    data = '''
LOCUS
DATA_IS_NOT_A_SEQUENCE
//'''
    parse(data)
    assert parse(data) == []
예제 #2
0
def test_misc_parse():
    from pydna.parsers import parse

    from Bio.SeqIO import read as BPread
    from Bio.SeqIO import parse as BPparse

    q = BPread("read1.gb", "gb")
    w = BPread("read2.gb", "gb")
    e = BPread("read3.fasta", "fasta")
    r = BPread("read4.fasta", "fasta")

    with open("pth1.txt", "r", encoding="utf-8") as f:
        a, b = BPparse(f, "gb")

    print("|" + a.features[13].qualifiers['label'][0] + "|")
    print("|" + a.format("gb")[3314:3324] + "|")

    assert a.features[13].qualifiers['label'][0] == '2micron 2µ'
    assert a.format("gb")[3268:3278] == '2micron 2µ'

    x, y = parse("pth1.txt")

    assert "".join(a.format("gb").splitlines()[1:]) == "".join(
        x.format("gb").splitlines()[1:])
    assert "".join(b.format("gb").strip().splitlines()[4:]) == "".join(
        y.format("gb").splitlines()[4:])
예제 #3
0
def test_ypk():

    datafiles = '''pth1.txt|pYPK0_CiGXF1_PsXYL2.gb|iM8oDuvJPMPO995IdW3B0oo0Hkc
                   pth2.txt|pYPK0_SsXYL1_SsXYL2.gb|CB_qLhPgemW0XNLQOQEAdJKFujU
                   pth3.txt|pYPK0_NC_006038_CiGXF1_PsXYL2.gb|48_Bek9U1wxXlq1otmE7YHjYpnk
                   pth4.txt|pYPK0_SsXYL1_SsXYL2_ScXKS1.gb|5OxynmwQA3br0cKAG8It7VVNGrg
                   pth5.txt|pYPK0_SsXYL1_SsXYL2_ScXKS1_ScTAL1.gb|K8z4ijkYa0hA0KEOhv7-6PNJgBM
                   pth6.txt|pYPK0_SsXYL1_SsXYL2_ScXKS1_ScTAL1.gb|K8z4ijkYa0hA0KEOhv7-6PNJgBM
                   pth7.txt|pYPK0_SsXYL1_SsXYL2_ScXKS1_ScTAL1.gb|K8z4ijkYa0hA0KEOhv7-6PNJgBM'''

    for pYPKa_A in (True, False):
        for datafile in textwrap.dedent(datafiles).split():

            file_, name, code = datafile.split("|")

            print()
            print("############################")
            print("datafile = ", file_)
            print("pYPKa_A  = ", pYPKa_A)
            print("############################")

            with open(file_, "r",) as f: text = f.read()

            try:
                shutil.rmtree(tmp)
            except OSError:
                pass

            pw = pathway( parse(text), tmp, pYPKa_A=pYPKa_A)

            s = read( os.path.join(tmp, name) )

            with open(code+".txt") as f: c = f.read()

            assert "".join( x for x in c.lower() if not x.isspace()) == str(s.seq).lower()
예제 #4
0
def test_read_from_unicode():
    from pydna.readers import read
    from pydna.parsers import parse
    with open("pth1.txt", "r", encoding="utf-8") as f:
        text = f.read()
    assert type(text) == str
    x, y = parse(text)
    assert x.format()[3268:3278] == '2micron 2µ'
예제 #5
0
def main():

    try:
        arguments = docopt.docopt(__doc__)
    except docopt.DocoptExit as e:
        #print(e)
        sys.exit(0)

    dir_ = "ypk_assembly"

    if arguments["<dir>"]:
        dir_= str(arguments["<dir>"])

    if arguments["--no_pYPKa_A"]:
        pYPKa_A = False
    else:
        pYPKa_A = True

    if arguments["--version"]:
        from ._version import get_versions
        __version__ = get_versions()["version"][:5]
        del get_versions
        print("ypkpathway version:",__version__)
        print("     pydna version:",pydna.__version__)

    if arguments["<path>"]:
        file_ = str(arguments["<path>"])
        try:
            with open(file_, "r") as f: text=f.read()
        except IOError:
            print(arguments["<path>"], "could not be opened!")
            sys.exit(1)

        #dir_ = os.path.splitext(os.path.basename(file_))[0]
        dir_, ext = os.path.splitext(os.path.abspath(file_))

        print("Assembly started! (This might take a while...)")
        #print(file_)
        #print(dir_)
        #print(os.path.abspath(file_))
        #print(os.path.abspath(dir_))
        #print(os.path.splitext(os.path.abspath(file_)))
        #print(os.path.basename(dir_))
        #import sys;sys.exit(42)

        fl, log = pathway( parse(text), dir_, pYPKa_A=pYPKa_A )

        with open(os.path.join(dir_, "log.txt"),"w") as f: f.write(log)

        filename = os.path.basename(file_)

        shutil.copy2( filename, os.path.join(dir_, "INDATA_"+os.path.basename((dir_)+".txt")))

        print("opening IPython notebook {}".format(fl.path))

        subprocess.Popen(["jupyter", "notebook", os.path.join(dir_, "pw.ipynb")])
예제 #6
0
def test_circ_pcr():
    """
    <-----------------------------------------------------58->

    <----------------------------33->
      ccaccaccaccaccaccaccaccaccaccacggaggggccgtggtggacgagggcc
                                     |||||||||||||||||||||||||
    TCAGGTGAGGCGGAACCAACCCTCCTGGCCATGggaggggccgtggtggacgagggccccacaggcg-->
            ||||||||||||||||||||||||||
            ggcggaaccaaccctcctggccATGgactacaaagacgatgacgacaagcttgcggc

    <----------------------------------------------------------------------42->
    <-----------------------------------------------------25-><------------17->
      ccaccaccaccaccaccaccaccaccaccacggaggggccgtggtggacgagggcc
                                     |||||||||||||||||||||||||
                                     ggaggggccgtggtggacgagggccccacaggcgTCAGGTGAGGCGGAACCAACCCTCCTGGCCATG
                                                                               ||||||||||||||||||||||||||
                                                                               ggcggaaccaaccctcctggccATGgactacaaagacgatgacgacaagcttgcggc


    """

    s = parse(
        """
    >MCT4_flaghis_rv
    gccgcaagcttgtcgtcatcgtctttgtagtcCATggccaggagggttggttccgcc
    >MCT4_flaghis_fw
    ccaccaccaccaccaccaccaccaccaccacggaggggccgtggtggacgagggcc""",
        ds=False,
    )

    t = parse("""
    >hej circular
    TCAGGTGAGGCGGAACCAACCCTCCTGGCCATGggaggggccgtggtggacgagggccccacaggcg
    """)

    p = pcr(s, t)

    assert (
        str(p.seq).lower() ==
        "ccaccaccaccaccaccaccaccaccaccacggaggggccgtggtggacgagggccccacaggcgtcaggtgaggcggaaccaaccctcctggccatggactacaaagacgatgacgacaagcttgcggc"
    )
예제 #7
0
    def solveAssembly(self):
        printline = self.qprintline
        self.plainTextEdit_2.clear()
        self.tabWidget.setCurrentIndex(1)
        flbase = os.path.basename(str(self.filename))

        title = 'Assembly log for ' + flbase

        printline('='*len(title))
        printline(title)
        printline('='*len(title))


        #print(type(self.plainTextEdit.toPlainText()))
        #qstringobj = self.plainTextEdit.toPlainText().encode('utf-8')
        #print(type(qstringobj)) #<class 'PyQt4.QtCore.QString'>
        #print(qstringobj.toUtf8()[3268:3279])
        #print(str(qstringobj.toUtf8()[3268:3279]))
        #print(type(rawtext), "rawtext")
        #codec0 = .QTextCodec.codecForName("UTF-16");
        #rawtext = unicode(codec0.fromUnicode(tmp), 'UTF-16')
        #unicode(qstringobj.toUtf8(), encoding="UTF-8").decode()
        
        qstringobj = self.plainTextEdit.toPlainText()

        #import sys;sys.exit(42)

        pth = parse( qstringobj )
        
        #import sys;sys.exit(42)

        if len(pth)==0:
            printline("No of sequences found in Data window")
            return

        if self.filename is None:
            self.fileSaveAs()

        dir_, ext = os.path.splitext( str(self.filename))

        fl, log = ypkpathway.pathway( pth, dir_, pYPKa_A = not self.checkbox.isChecked(), print = printline)

        if not fl:
            return

        with open(os.path.join(dir_, "log.txt"),"w") as f: f.write(log)

        shutil.copy2( str(self.filename), os.path.join(dir_, "INDATA_"+os.path.basename(str(self.filename))))

        printline('')
        printline('\n\nAssembly finished.')
        printline('click on the Open pathway button above to open the pathway in the default web browser')
        self.nb =  fl.path
예제 #8
0
def test_circ_pcr():
    '''
    <-----------------------------------------------------58->
    
    <----------------------------33->
      ccaccaccaccaccaccaccaccaccaccacggaggggccgtggtggacgagggcc
                                     |||||||||||||||||||||||||
    TCAGGTGAGGCGGAACCAACCCTCCTGGCCATGggaggggccgtggtggacgagggccccacaggcg-->
            ||||||||||||||||||||||||||
            ggcggaaccaaccctcctggccATGgactacaaagacgatgacgacaagcttgcggc
    
    <----------------------------------------------------------------------42->
    <-----------------------------------------------------25-><------------17->
      ccaccaccaccaccaccaccaccaccaccacggaggggccgtggtggacgagggcc
                                     |||||||||||||||||||||||||
                                     ggaggggccgtggtggacgagggccccacaggcgTCAGGTGAGGCGGAACCAACCCTCCTGGCCATG
                                                                               ||||||||||||||||||||||||||
                                                                               ggcggaaccaaccctcctggccATGgactacaaagacgatgacgacaagcttgcggc
    
    
    '''

    s = parse('''
    >MCT4_flaghis_rv
    gccgcaagcttgtcgtcatcgtctttgtagtcCATggccaggagggttggttccgcc
    >MCT4_flaghis_fw
    ccaccaccaccaccaccaccaccaccaccacggaggggccgtggtggacgagggcc''',
              ds=False)

    t = parse('''
    >hej circular
    TCAGGTGAGGCGGAACCAACCCTCCTGGCCATGggaggggccgtggtggacgagggccccacaggcg
    ''')

    p = pcr(s, t)

    assert str(p.seq).lower(
    ) == 'ccaccaccaccaccaccaccaccaccaccacggaggggccgtggtggacgagggccccacaggcgtcaggtgaggcggaaccaaccctcctggccatggactacaaagacgatgacgacaagcttgcggc'
예제 #9
0
def test_parse2():
    from Bio.Alphabet.IUPAC import IUPACAmbiguousDNA
    from pydna.parsers import parse
    from pydna.readers import read
    seqs = parse('RefDataBjorn.fas')

    assert len(seqs) == 771
    assert list(set([len(a) for a in seqs])) == [901]

    for i, s in enumerate(seqs):
        a = s.description
        b = a.split()
        c = "|".join([b[0], b[1], b[3]])
        s.id = b[2].replace(" ", "_") + "_" + str(i)
        s.description = ""
        if b[3] == "Zenion hololepis":
            s.id = b[3].replace(" ", "_") + "_" + str(i)
        s.seq.alphabet = IUPACAmbiguousDNA()
예제 #10
0
def test_read_from_file():
    from pydna.readers import read
    from pydna.parsers import parse
    a = read("read1.gb")
    b = read("read2.gb")
    c = read("read3.fasta")
    d = read("read4.fasta")
    x, y = parse("pth1.txt")

    a.format("gb")
    b.format("gb")
    c.format("gb")
    d.format("gb")
    x.format("gb")
    y.format("gb")
    assert x.format()[3268:3278] == '2micron 2µ'
    assert x.features[13].qualifiers['label'][0] == u'2micron 2µ'
    assert str(a.seq).lower() == str(b.seq).lower() == str(
        c.seq).lower() == str(d.seq).lower()
예제 #11
0
def test_parse1():
    from pydna.parsers import parse
    from pydna.readers import read
    ''' test parsing fasta sequences from a text'''

    text = '''
            points....: 1

            The sequence seq below represents a double stranded linear DNA molecule.

            >seq
            CTCCCCTATCACCAGGGTACCGATAGCCACGAATCT

            Give the sequence(s) of the fragment(s) formed after digesting seq
            with the restriction enzyme Acc65I in the order that they appear in seq.

            Use FASTA format and give the Watson strand(s) in 5'-3' direction below.
            Give the sequences the names frag1,frag2,... etc.
            >frag1
            CTCCCCTATCACCAGG

            >frag2
            GTACCGATAGCCACGAATCT

            *********** Question 4 ***********

            QuestionID:
            '''
    result = parse(text)

    correct = [
        'CTCCCCTATCACCAGGGTACCGATAGCCACGAATCT', 'CTCCCCTATCACCAGG',
        'GTACCGATAGCCACGAATCT'
    ]

    assert [str(s.seq) for s in result] == correct
    assert [s.linear for s in result] == [True, True, True]

    input = '''
            LOCUS       ScCYC1                   330 bp    DNA              UNK 01-JAN-1980
            DEFINITION  ScCYC1
            ACCESSION   ScCYC1
            VERSION     ScCYC1
            KEYWORDS    .
            SOURCE      .
              ORGANISM  .
                        .
            FEATURES             Location/Qualifiers
            ORIGIN
                    1 ATGACTGAAT TCAAGGCCGG TTCTGCTAAG AAAGGTGCTA CACTTTTCAA GACTAGATGT
                   61 CTACAATGCC ACACCGTGGA AAAGGGTGGC CCACATAAGG TTGGTCCAAA CTTGCATGGT
                  121 ATCTTTGGCA GACACTCTGG TCAAGCTGAA GGGTATTCGT ACACAGATGC CAATATCAAG
                  181 AAAAACGTGT TGTGGGACGA AAATAACATG TCAGAGTACT TGACTAACCC AAAGAAATAT
                  241 ATTCCTGGTA CCAAGATGGC CTTTGGTGGG TTGAAGAAGG AAAAAGACAG AAACGACTTA
                  301 ATTACCTACT TGAAAAAAGC CTGTGAGTAA
            //
            '''
    result = parse(input).pop()

    assert str(result.seq) == str(read(input).seq)
    correct = '''ATGACTGAATTCAAGGCCGGTTCTGCTAAGAAAGGTGCTACACTTTTCAAGACTAGATGTCTACAATGCCACACCGTGGAAAAGGGTGGCCCACATAAGGTTGGTCCAAACTTGCATGGTATCTTTGGCAGACACTCTGGTCAAGCTGAAGGGTATTCGTACACAGATGCCAATATCAAGAAAAACGTGTTGTGGGACGAAAATAACATGTCAGAGTACTTGACTAACCCAAAGAAATATATTCCTGGTACCAAGATGGCCTTTGGTGGGTTGAAGAAGGAAAAAGACAGAAACGACTTAATTACCTACTTGAAAAAAGCCTGTGAGTAA'''

    assert str(result.seq) == correct
    assert result.linear == True
    assert result.circular == False

    seqs = parse('RefDataBjorn.fas')

    assert len(seqs) == 771
    assert list(set([len(a) for a in seqs])) == [901]
    pAG25 = read("pAG25.gb")

    assert pAG25.circular == True
    assert pAG25.linear == False

    pCAPs = read("pCAPs.gb")

    assert pCAPs.circular == True
    assert pCAPs.linear == False

    pUC19 = read("pUC19.gb")

    assert pUC19.circular == True
    assert pUC19.linear == False

    input = '''
    ID   example    standard; DNA; UNC; 3 BP.
    SQ   Sequence 3 BP;
         aaa                                                                       3
    //
    '''
    result = parse(input).pop()
    input = '''
    ID   name?      standard; circular DNA; UNK; 100 BP.
    XX
    DT   25-DEC-2017
    XX
    DE   description?.
    XX
    AC   id?;
    XX
    SV   id?
    XX
    KW   .
    XX
    OS   .
    OC   .
    OC   .
    XX
    FH   Key             Location/Qualifiers
    SQ   Sequence 100 BP;
         aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa        60
         aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa                             100
    //
    '''
    result = parse(input).pop()
import pytest

from pydna.amplify import pcr
from pydna.assembly import Assembly
from pydna.dseqrecord import Dseqrecord
from pydna.design import primer_design
from pydna.design import assembly_fragments
from pydna.design import circular_assembly_fragments
from pydna.parsers import parse
from pydna.primer import Primer

frags = parse('''
>49
ccaaggacacaatcgagctccgatccgtactgtcgagaaacttgtatcc
>50
ctctaactagtatggatagccgtgtcttcactgtgctgcggctacccatc
>51
gtagtgaaacatacacgttgctcgggttcaccccggtccgttctgagtcga
''')

from Bio.Restriction import BamHI
bam = Dseqrecord(BamHI.site)


def test_primer_design_all_Dseqrecords():
    with pytest.raises(ValueError):
        assembly_fragments(frags, 20)


def test_primer_design_all_pcr_products():
    x = [primer_design(f) for f in frags]
예제 #13
0
def test_shifts():
    from pydna.parsers import parse
    from pydna.parsers import parse_primers
    from pydna.amplify import pcr
    #from pydna.amplify import nopcr

    s = parse('''
    >MCT4_flaghis_rv
    gccgcaagcttgtcgtcatcgtctttgtagtcCATggccaggagggttggttccgcc
    >MCT4_flaghis_fw
    ccaccaccaccaccaccaccaccaccaccacggaggggccgtggtggacgagggcc''',
              ds=False)

    t = parse('''
    >hej circular
    TCAGGTGAGGCGGAACCAACCCTCCTGGCCATGggaggggccgtggtggacgagggccccacaggcg
    ''')

    p = pcr(s, t)

    assert str(p.seq).lower(
    ) == 'ccaccaccaccaccaccaccaccaccaccacggaggggccgtggtggacgagggccccacaggcgtcaggtgaggcggaaccaaccctcctggccatggactacaaagacgatgacgacaagcttgcggc'

    f, r, t = parse('''
    #A
    
    >ForwardPrimer
    actacacacgtactgactg
    
    >ReversePrimer
    ggttactgactctatcttg
    
    >MyTemplate
    gctactacacacgtactgactGcctcCaagatAgagtcagtaaccaca''')
    a = pcr(f, r, t)
    assert str(
        a.seq).lower() == "actacacacgtactgactGcctcCaagatAgagtcagtaacc".lower()

    f, r, t = parse('''
    #B
    
    >ForwardPrimer
    actacacacgtactgactg
    
    >ReversePrimer
    ggttactgactctatcttg
    
    >MyTemplate circular
    gctactacacacgtactgactgcctccaagatagagtcagtaaccaca''')

    #    actacacacgtactgactg>
    #    |||||||||||||||||||
    # gctactacacacgtactgactgcctccaagatagagtcagtaaccaca
    #
    # cgatgatgtgtgcatgactgacggaggttctatctcagtcattggtgt
    #                           |||||||||||||||||||
    #                          <gttctatctcagtcattgg

    b = pcr(f, r, t)

    assert a.seq == b.seq

    a.template = None
    b.template = None

    assert a == b

    f, r, t = parse('''
    #C
    
    >ForwardPrimer
    actacacacgtactgactg
    
    >ReversePrimer
    ggttactgactctatcttg
    
    >MyTemplate circular
    cgtactgactgcctccaagatagagtcagtaaccacagctactacaca''')
    c = pcr(f, r, t)

    assert b.seq == c.seq

    f, r, t = parse('''
    #D
    
    >ForwardPrimer
    actacacacgtactgactg
    
    >ReversePrimer
    ggttactgactctatcttg
    
    >MyTemplate48 circular
    tccaagatagagtcagtaaccacagctactacacacgtactgactgcc''')
    '''
    012345678901234567890123456789012345678901234567
    ------------27--------------
                               actacacacgtactgactg
    tccaagatagagtcagtaaccacagctactacacacgtactgactgcc
      caagatagagtcagtaacc
    --  
    012345678901234567890123456789012345678901234567
    
    ------------23----------
    actacacacgtactgactg
    actacacacgtactgactgcctccaagatagagtcagtaaccacagct
                           caagatagagtcagtaacc
                           
    ------------------------------------------
    actacacacgtactgactgcctccaagatagagtcagtaacc
    
    '''

    d = pcr(f, r, t)

    assert c.seq == d.seq

    f, r, t = parse('''
    #E
    
    >ForwardPrimer
    actacacacgtactgactg
    
    >ReversePrimer
    ggttactgactctatcttg
    
    >MyTemplate circular
    gagtcagtaaccacagctactacacacgtactgactGcctccaagata''')
    e = pcr(f, r, t)

    assert d.seq == e.seq

    f, r, t = parse('''
    #F
    
    >ForwardPrimer
    actacacacgtactgactg
    
    >ReversePrimer
    ggttactgactctatcttg
    
    >MyTemplate circular
    actacacacgtactgactGcctccaagatagagtcagtaaccacagct''')
    f = pcr(f, r, t)
예제 #14
0
def test_pcr():
    ''' test pcr'''

    raw = []

    raw.append((
        '7JOV1MJBZJp2Smja/7KFGhS2SWY',
        parse('''
    >524_pFA6aF (29-mer)
    cacatacgatttaggtgacactatagaac

    >523_AgTEF1tpR (21-mer)
    ggttgtttatgttcggatgtg
    '''),
        parse("pAG25.gb"),
    ))

    raw.append((
        '7pPxy/bQvs4+7CaOgiywQVzUFDc',
        parse('''
    >lowgc_f
    TTTCACTAGTTACTTGTAGTCGacgtgccatctgtgcagacaaacgcatcaggatat

    >lowgc_r
    AAGTTGGAAATCTAGCTTTTCTTgacgtcagcggccgcattgcaca
    '''),
        parse("pCAPs.gb"),
    ))

    raw.append((
        '7JOV1MJBZJp2Smja/7KFGhS2SWY',
        parse('''
    >524_pFA6aF (29-mer)
    cacatacgatttaggtgacactatagaac

    >523_AgTEF1tpR (21-mer)
    ggttgtttatgttcggatgtg
    '''),
        parse("pAG25.gb"),
    ))

    raw.append((
        'yshvYTXr9iXCnh3YytWQRDBNQzI',
        parse('''
    >ForwardPrimer1
    gctactacacacgtactgactg

    >ReversePrimer
    tgtggttactgactctatcttg

    LOCUS       sequence_50_bp            46 bp    DNA     circular UNK 08-FEB-2013
    DEFINITION  sequence_50_bp circular
    ACCESSION   sequence_50_bp
    VERSION     sequence_50_bp
    KEYWORDS    .
    SOURCE      .
      ORGANISM  .
                .
    FEATURES             Location/Qualifiers
    ORIGIN
            1 ccaagataga gtcagtaacc acagctacta cacacgtact gactgt
    //

    '''),
    ))

    raw.append((
        'yshvYTXr9iXCnh3YytWQRDBNQzI',
        parse('''
    >ForwardPrimer2
    gctactacacacgtactgactg

    >ReversePrimer
    tgtggttactgactctatcttg

    LOCUS       template                  46 bp    DNA     circular UNK 15-OCT-2012
    DEFINITION  template circular
    ACCESSION   template
    VERSION     template
    KEYWORDS    .
    SOURCE      .
      ORGANISM  .
                .
    FEATURES             Location/Qualifiers
    ORIGIN
            1 ccaagataga gtcagtaacc acagctacta cacacgtact gactgt
    //
    '''),
    ))
    raw.append((
        'yshvYTXr9iXCnh3YytWQRDBNQzI',
        parse('''
    >ForwardPrimer3
    gctactacacacgtactgactg

    >ReversePrimer
    tgtggttactgactctatcttg

    LOCUS       template                  46 bp    DNA     circular UNK 08-FEB-2013
    DEFINITION  template circular
    ACCESSION   template
    VERSION     template
    KEYWORDS    .
    SOURCE      .
      ORGANISM  .
                .
    FEATURES             Location/Qualifiers
    ORIGIN
            1 tccaagatag agtcagtaac cacagctact acacacgtac tgactg
    //
    '''),
    ))

    raw.append((
        'yshvYTXr9iXCnh3YytWQRDBNQzI',
        parse('''
    >ForwardPrimer4
    gctactacacacgtactgactg

    >ReversePrimer
    tgtggttactgactctatcttg

    LOCUS       template                  46 bp    DNA     circular UNK 15-OCT-2012
    DEFINITION  template circular
    ACCESSION   template
    VERSION     template
    KEYWORDS    .
    SOURCE      .
      ORGANISM  .
                .
    FEATURES             Location/Qualifiers
    ORIGIN
            1 gtccaagata gagtcagtaa ccacagctac tacacacgta ctgact
    //
    '''),
    ))

    raw.append((
        '60meNXeGKO7ahZwcIl5yXHFC3Yg',
        parse('''
    >fw1
    cacatacgatttaggtgacactatagaac
    >rv
    ggttgtttatgttcggatgtg

    LOCUS       tm                        50 bp    DNA     circular UNK 15-OCT-2012
    DEFINITION  tm circular
    ACCESSION   tm
    VERSION     tm
    KEYWORDS    .
    SOURCE      .
      ORGANISM  .
                .
    FEATURES             Location/Qualifiers
    ORIGIN
            1 cacatccgaa cataaacaac ccacatacga tttaggtgac actatagaac
    //
    '''),
    ))

    raw.append((
        '60meNXeGKO7ahZwcIl5yXHFC3Yg',
        parse('''
    >fw2
    cacatacgatttaggtgacactatagaac
    >rv
    ggttgtttatgttcggatgtg

    LOCUS       tm                        50 bp    DNA     circular UNK 15-OCT-2012
    DEFINITION  tm circular
    ACCESSION   tm
    VERSION     tm
    KEYWORDS    .
    SOURCE      .
      ORGANISM  .
                .
    FEATURES             Location/Qualifiers
    ORIGIN
            1 acatccgaac ataaacaacc cacatacgat ttaggtgaca ctatagaacc
    //

    '''),
    ))

    raw.append((
        '60meNXeGKO7ahZwcIl5yXHFC3Yg',
        parse('''
    >fw3
    cacatacgatttaggtgacactatagaac
    >rv
    ggttgtttatgttcggatgtg
    LOCUS       tm                        50 bp    DNA     circular UNK 15-OCT-2012
    DEFINITION  tm circular
    ACCESSION   tm
    VERSION     tm
    KEYWORDS    .
    SOURCE      .
      ORGANISM  .
                .
    FEATURES             Location/Qualifiers
    ORIGIN
            1 ccacatccga acataaacaa cccacatacg atttaggtga cactatagaa
    //

    '''),
    ))

    raw.append((
        'y6ohCJ4O+8Is012DItz4F4saxNo',
        parse('''
    >f_Eric_Ma
    ARATGAGTCTTCTRACCGAGGTCG
    >r_Eric_Ma
    TGAAAAGACATCYTCAAGYYTCTG
    >templ
    AGCAAAAGCAGGTAGATATTGAAAAATGAGTCTTCTAACCGAGGTCGAAACGTACGTTCTCTCTATCGTCCCGTCAGGCCCCCTCAAAGCCGAGATCGCGCAGAGACTTGAAGATGTCTCTGCAGGGAAGAACACTGATCTCGAGGCTCTCATGGAATGGCTAAAGACAAGACCAATCCTGTCACCTCTGACTAAGGGGATTTTAGGGTTTGTGTTCACGCTCACCGTGCCCAGTGAGCGAGGACTGCAGCGTAGACGCTTTGTCCAGAATGCCTTAAATGGGAATGGAGACCCAAACAACATGGACAGGGCAGTCAAACTATACAGGAAGCTGAAAAGAGAGATAACATTCCATGGGGCTAAAGAGGTTGCACTCAGCTATTCAACCGGTGCACTTGCCAGTTGCATGGGTCTCATATACAACAGGATGGGAACGGTAACCACAGAAGTAGCTTTTGGCCTGGTGTGTGCCACTTGTGAGCAGATTGCTGACTCACAGCATCGATCTCACAGACAGATGGTGACTACCACCAACCCACTAATCAGGCATGAAAACAGAATGGTGCTGGCCAGCACTACAGCTAAGGCTATGGAGCAGATGGCTGGATCGAGTGAACAGGCAGCGGAAGCCATGGAGGTTGCTAGTCAGGCTAGGCAGATGGTGCAGGCAATGAGGACAATTGGGACTCACCCTAGCTCCAGTGCCGGTCTGAAAGATGATCTTCTTGAAAATTTGCAGGCCTACCAGAAGCGGATGGGAGTGCAAATGCAGCGATTCAAGTGATCCTCTCGTTATTGCCGCAAGTATCATTGGGATCTTGCACTTGATATTGTGGATTCTTGATCGTCCTTTCTTCAAATGTATTTATCGTCGCCTTAAATACGGTTTGAAAAGAGGGCCTTCTACGGAAGGAGTGCCTGAGTCTATGAGGGAAGAGTATCGGCAGGAACAGCAGAGTGCTGTGGATGTTGACGATGGTCATTTTGTCAACATAGAGCTGGAGTAAAAAACTACCTTGTTTCTACT
    '''),
    ))

    for key, tst in enumerate(raw):
        assert tst[0] == seguid(pcr(tst[1:]).seq)