Esempio n. 1
0
    def test_protocol_equality(self):
        # Set up a protocol.
        p1 = Protocol()
        p1.add_instrument('A', 'p200')
        p1.add_container('C1', 'tiprack.p200')
        p1.add_container('A1', 'microplate.96')
        p1.calibrate('A1', x=1, y=2, z=3)
        p1.calibrate_instrument('A', top=0, blowout=10)
        p1.transfer('A1:A1', 'A1:A2', ul=100)
        p1.transfer('A1:A2', 'A1:A3', ul=80)

        # And a copy.
        p2 = Protocol()
        p2.add_container('A1', 'microplate.96')
        p2.add_container('C1', 'tiprack.p200')
        p2.add_instrument('A', 'p200')
        p2.calibrate('A1', x=1, y=2, z=3)
        p2.calibrate_instrument('A', top=0, blowout=10)
        p2.transfer('A1:A1', 'A1:A2', ul=100)
        p2.transfer('A1:A2', 'A1:A3', ul=80)

        # They're identical.
        self.assertEqual(p1, p2)

        # Make a change.
        p2.add_instrument('B', 'p10')

        # No longer identical.
        self.assertNotEqual(p1, p2)
Esempio n. 2
0
    def test_protocol_addition_of_partials(self):
        p1 = Protocol()
        p1.add_instrument('A', 'p20')
        p1.add_container('A1', 'microplate.96')
        p1.transfer('A1:A1', 'A1:A2', ul=10)

        p2 = Protocol.partial()
        p2.add_container('A2', 'microplate.96')
        p2.transfer('A1:A1', 'A1:A3', ul=20)
        p2.transfer('A2:A1', 'A2:A4', ul=15)

        p3 = Protocol.partial()
        p3.add_container('A3', 'microplate.96')
        p3.transfer('A1:A1', 'A1:A3', ul=20)
        p3.transfer('A1:A1', 'A3:A4', ul=15)

        p4 = Protocol()
        p4.add_instrument('A', 'p20')
        p4.add_container('A1', 'microplate.96')
        p4.add_container('A2', 'microplate.96')
        p4.add_container('A3', 'microplate.96')
        p4.transfer('A1:A1', 'A1:A2', ul=10)
        p4.transfer('A1:A1', 'A1:A3', ul=20)
        p4.transfer('A2:A1', 'A2:A4', ul=15)
        p4.transfer('A1:A1', 'A1:A3', ul=20)
        p4.transfer('A1:A1', 'A3:A4', ul=15)

        self.assertEqual(p4, p1 + p2 + p3)
Esempio n. 3
0
    def test_protocol_addition_container_conflict(self):
        p1 = Protocol()
        p1.add_instrument('A', 'p10')
        p1.add_container('A1', 'microplate.96')
        p1.transfer('A1:A1', 'A1:A2', ul=10)

        p2 = Protocol()
        p2.add_container('A1', 'tiprack.p20')

        with self.assertRaises(x.ContainerConflict):
            p1 + p2
Esempio n. 4
0
    def test_protocol_addition_info(self):
        p1 = Protocol()
        p1.set_info(author="John Doe", name="Lorem Ipsum")

        p2 = Protocol()
        p2.set_info(author="Jane Doe")

        p3 = p1 + p2

        self.assertEqual('Jane Doe', p3.info['author'])
        self.assertEqual('Lorem Ipsum', p3.info['name'])
Esempio n. 5
0
    def test_protocol_addition_label_case(self):
        p1 = Protocol()
        p1.add_instrument('A', 'p10')
        p1.add_container('A1', 'microplate.96', label="Input")

        p2 = Protocol()
        p2.add_instrument('A', 'p10')
        p2.add_container('A1', 'microplate.96', label="INPUT")

        p3 = Protocol()
        p3.add_instrument('A', 'p10')
        p3.add_container('A1', 'microplate.96', label="INPUT")

        self.assertEqual((p1 + p2), p3)
Esempio n. 6
0
    def test_protocol_addition_label_conflict(self):
        p1 = Protocol()
        p1.add_instrument('A', 'p10')
        p1.add_container('A1', 'microplate.96', label="Input")
        p1.transfer('A1:A1', 'A1:A1', ul=10)

        p2 = Protocol()
        p2.add_instrument('A', 'p10')  # Same definition; no conflict.
        p2.add_instrument('B', 'p20')  # New instrument.
        p2.add_container('A1', 'microplate.96', label="Output")  # Conflict.
        p2.add_container('A2', 'microplate.96')  # New container.
        p2.transfer('A1:A1', 'A1:A1', ul=12)
        p2.transfer('Output:A1', 'A2:A2', ul=20)

        with self.assertRaises(x.ContainerConflict):
            p1 + p2
Esempio n. 7
0
 def __init__(self, json_str):
     data = json.loads(json_str)
     self._protocol = Protocol()
     self._load_info(data['info'])
     self._load_containers(data['containers'])
     self._load_instruments(data['instruments'])
     self._load_instructions(data['instructions'])
Esempio n. 8
0
    def test_protocol_added_to_partial(self):
        p1 = Protocol()
        p1.add_instrument('A', 'p20')
        p1.add_container('A1', 'microplate.96')
        p1.transfer('A1:A1', 'A1:A2', ul=10)

        p2 = Protocol.partial()
        p2.add_container('A2', 'microplate.96')
        p2.transfer('A1:A1', 'A1:A3', ul=20)
        p2.transfer('A2:A1', 'A2:A4', ul=15)

        with self.assertRaises(TypeError):
            p2 + p1
Esempio n. 9
0
    def test_protocol_label_addition(self):
        p1 = Protocol()
        p1.add_instrument('A', 'p10')
        p1.add_container('A1', 'microplate.96', label="Input")
        p1.transfer('A1:A1', 'A1:A1', ul=10)

        p2 = Protocol()
        p2.add_instrument('A', 'p10')  # Same definition; no conflict.
        p2.add_instrument('B', 'p20')  # New instrument.
        p2.add_container('A1', 'microplate.96', label="Input")  # No conflict.
        p2.add_container('A2', 'microplate.96')  # New container.
        p2.transfer('A1:A1', 'A1:A1', ul=9)
        p2.transfer('Input:A1', 'A2:A2', ul=20)

        p3 = Protocol()
        p3.add_instrument('A', 'p10')
        p3.add_instrument('B', 'p20')
        p3.add_container('A1', 'microplate.96', label="Input")
        p3.add_container('A2', 'microplate.96')
        p3.transfer('A1:A1', 'A1:A1', ul=10)
        p3.transfer('A1:A1', 'A1:A1', ul=9)
        p3.transfer('A1:A1', 'A2:A2', ul=20)

        self.assertEqual(p3, p1 + p2)
Esempio n. 10
0
 def setUp(self):
     self.protocol = Protocol()
     self.stub_info = {
         'name': "Test Protocol",
         'description': "A protocol to test JSON output.",
         'author': "Michelle Steigerwalt",
         'created': "Thu Aug 11 20:19:55 2016"
     }
     # Same definitions as the protocol JSON above.
     self.protocol.set_info(**self.stub_info)
     self.protocol.add_instrument('A', 'p10')
     self.protocol.add_instrument('B', 'p200')
     self.protocol.add_container('A1', 'microplate.96', label="Ingredients")
     self.protocol.add_container('B1', 'microplate.96', label="Output")
     self.protocol.transfer('A1:A1', 'B1:B1', ul=10, tool='p10')
     self.protocol.transfer_group(
         ('A1:A3', 'B1:B3', {'ul': 3}),
         ('INGREDIENTS:A4', 'B1:B4'),
         ('A1:A5', 'B1:C1'),
         tool='p10',
         ul=10
     )
     self.protocol.consolidate(
         'Output:B3',
         ('A1:A3', {'ul': 3}),
         'INGREDIENTS:A4',
         'A1:A5',
         tool='p10',
         ul=10
     )
     self.protocol.distribute(
         'Ingredients:A1',
         ('Output:A1', {'ul': 3}),
         'Output:A2',
         'Output:A3',
         tool='p10',
         ul=10
     )
     self.protocol.mix('Output:A1', ul=50, repetitions=30)
Esempio n. 11
0
 def setUp(self):
     self.protocol = Protocol()
     self.maxDiff = None
Esempio n. 12
0
 def setUp(self):
     self.protocol = Protocol()
Esempio n. 13
0
 def __init__(self, protocol=None):
     if protocol:
         self._protocol = protocol
     else:
         self._protocol = Protocol()
Esempio n. 14
0
def compile(*sequences, output=None):
    """
    Takes a list of sequence arguments (RVD or DNA) and outputs a generated
    protocol to make plasmids targetting those sequences.
    """
    sequences = list(sequences)

    # Limit right now is the number of tips in the static deck map we're
    # using for this protocol.
    if len(sequences) > 15:
        raise ValueError("FusX compiler only supports up to 15 sequences.")

    # Argument normalization.
    normalized = []
    for i, s in enumerate(sequences):
        try:
            normalized.append(_normalize_sequence(s))
        except ValueError as e:
            raise ValueError("Sequence #{}: {}".format(i + 1, e))

    # Make the transfers for every sequence.
    buffers = []
    tals = []
    enzymes = []

    well_map = {}
    for n, s in enumerate(normalized):
        n = n + 1
        if n > 12:
            well = 'B{}'.format(n - 12)
        else:
            well = 'A{}'.format(n)
        # We're going to do all the buffers at the start...
        buffers += [('Ingredients:A1', 'FusX Output:' + well, 10)]
        # TALs in the middle...
        tals += _get_tal_transfers(s, well=well)
        # Enzyme (BsmBI) at the end.
        enzymes += [("Ingredients:B1", 'FusX Output:' + well, 10)]
        # For printing an output map.
        well_map[well] = sequences[n - 1]  # Map to original input.

    # Nicely formatted well map for the description.
    output_map = []
    for well in sorted(well_map):
        output_map.append("{}: {}".format(well, well_map[well]))

    protocol = Protocol()
    protocol.set_info(name="FusX Transfer",
                      created=str(datetime.date.today()),
                      description="; ".join(output_map))
    protocol.add_instrument('A', 'p10')
    protocol.add_instrument('B', 'p200')
    protocol.add_container('A1', 'tuberack.15-50ml', label='Ingredients')
    protocol.add_container('E1', 'microplate.96', label='Fusx Output')
    protocol.add_container('A2', 'point.trash')
    protocol.add_container('E3', 'microplate.96')  # Cool deck.
    protocol.add_container('B2', 'tiprack.p10')
    protocol.add_container('B1', 'tiprack.p10')
    protocol.add_container('B3', 'tiprack.p10')
    protocol.add_container('C1', 'microplate.96', label='TALE1')
    protocol.add_container('D1', 'microplate.96', label='TALE2')
    protocol.add_container('C2', 'microplate.96', label='TALE3')
    protocol.add_container('D2', 'microplate.96', label='TALE4')
    protocol.add_container('C3', 'microplate.96', label='TALE5')

    # Take our three transfer groups and make them into a consolidated
    # transfer list.

    # Buffers
    group = []
    for start, end, volume in buffers:
        group.append((start, end, {'ul': volume}))
    protocol.transfer_group(*group, tool="p10")

    # TALS
    for start, end, volume in tals:
        protocol.transfer(start, end, ul=volume)

    # Enzymes
    for start, end, volume in enzymes:
        protocol.transfer(start, end, ul=volume)

    compiled = protocol.export(JSONFormatter)

    if output:
        with open(output, 'w') as f:
            f.write(compiled)

    return compiled