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)
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)
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
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'])
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)
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
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'])
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
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)
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)
def setUp(self): self.protocol = Protocol() self.maxDiff = None
def setUp(self): self.protocol = Protocol()
def __init__(self, protocol=None): if protocol: self._protocol = protocol else: self._protocol = Protocol()
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