Example #1
0
def test_quick_wire_to_input_array_with_set_sample(session):
    canvas = Planner(session)

    frags = session.Sample.where(
        {"sample_type_id": session.SampleType.find_by_name("Fragment").id},
        opts={"limit": 10},
    )

    purify1 = canvas.create_operation_by_name("Purify Gel Slice", category="Cloning")
    purify2 = canvas.create_operation_by_name("Purify Gel Slice", category="Cloning")

    canvas.set_field_value(purify1.inputs[0], sample=frags[0])
    canvas.set_field_value(purify2.inputs[0], sample=frags[1])

    assemble = canvas.create_operation_by_name("Assemble Plasmid", category="Cloning")

    canvas.quick_wire(purify1, assemble)
    canvas.quick_wire(purify2, assemble)

    canvas.chain("Purify Gel Slice", assemble, category="Cloning")

    input_array = assemble.input_array("Fragment")

    assert len(input_array) == 3, "There should be 3 field values"
    assert input_array[0].sample == frags[0]
    assert input_array[1].sample == frags[1]
    assert input_array[2].sample is None
Example #2
0
    def test_optimize_case2(self, session):
        """Here, we are trying to optimize two chains of 5 operations.

        We expect to merge 10 operation to 5 operations.
        """
        with session.with_cache() as sess:
            canvas = Planner(sess)

            q = self.sql({
                "object_type_id":
                sess.ObjectType.find_by_name("E coli Plate of Plasmid").id,
                "location":
                self.Not("deleted"),
            })
            item = sess.Item.one(query=q)
            assert item

            chain = [
                "Check Plate",
                "Make Overnight Suspension",
                "Make Miniprep",
                "Yeast Transformation",
                "Yeast Overnight Suspension",
            ]

            yeasts = session.Sample.last(
                2,
                query={
                    "sample_type_id":
                    session.SampleType.find_by_name("Yeast Strain").id
                },
            )

            for i in range(2):
                ops = canvas.chain(*chain)
                canvas.set_field_value_and_propogate(ops[0].inputs[0],
                                                     sample=item.sample)
                canvas.set_to_available_item(ops[0].inputs[0])
                canvas.set_field_value_and_propogate(ops[-1].outputs[0],
                                                     sample=yeasts[0])
                canvas.set_field_value(ops[-2].inputs[1], sample=yeasts[1])
            assert len(canvas.plan.operations) == 10

            canvas.optimize()

            # we expect to merge everything except 'Yeast Transformation' and
            # 'Yeast Overnight' since these have absent sample definition for either
            # their input or outputs and FieldValues with no samples are never mergable.
            expected_op_types = [
                "Check Plate",
                "Make Miniprep",
                "Make Overnight Suspension",
                "Yeast Overnight Suspension",
                "Yeast Transformation",
            ]
            op_types = sorted(
                [op.operation_type.name for op in canvas.operations])
            assert len(canvas.plan.operations) == 5
            assert expected_op_types == op_types
Example #3
0
def test_inventory_updater(session):
    ot = session.ObjectType.one(query="rows > 2 AND columns > 2")
    collection = session.Collection.new(object_type=ot)

    primer = session.SampleType.find_by_name("Primer")
    fragment = session.SampleType.find_by_name("Fragment")
    plasmid = session.SampleType.find_by_name("Plasmid")
    yeast = session.SampleType.find_by_name("Yeast Strain")

    frag = fragment.new_sample(
        str(uuid4()),
        project="test",
        description="",
        properties={
            "Forward Primer":
            primer.new_sample(
                str(uuid4()),
                project="test",
                description="",
                properties={
                    "Anneal Sequence": "AGGGATAT",
                    "T Anneal": 50
                },
            ),
            "Length":
            1000,
            "Sequence":
            "",
        },
    )

    collection[0, 0] = frag

    item = session.Item.new(
        object_type=session.ObjectType.find_by_name("Fragment Stock"),
        sample=collection.sample_matrix[0, 0],
    )

    print(item.object_type)

    planner = Planner(session)
    op = planner.create_operation_by_name("Make PCR Fragment")
    planner.set_field_value(op.input("Template"), item=item)

    saved = save_inventory(session, [planner.plan, collection])

    # assert frag in saved
    assert frag.id
    assert frag.properties["Forward Primer"].id
    assert item.id
    assert planner.plan.id
    assert collection.id

    save_inventory(session, [planner.plan, collection], merge_samples=True)
Example #4
0
def test_add_wire_sets_sample_from_source(session):
    session.set_verbose(True)
    canvas = Planner(session)
    assert len(canvas.plan.wires) == 0
    p = session.Sample.one(
        query=dict(sample_type_id=session.SampleType.find_by_name("Primer").id)
    )
    destination = canvas.create_operation_by_name(
        "Make PCR Fragment", category="Cloning"
    )
    source = canvas.create_operation_by_name("Rehydrate Primer", category="Cloning")
    canvas.set_field_value(source.outputs[0], sample=p)
    canvas.add_wire(source.outputs[0], destination.input("Forward Primer"))
    assert destination.input("Forward Primer").sample.id == p.id
Example #5
0
    def test_optimize_case3_array_inputs(self, session):
        """Here we test whether operation types with field_value array inputs
        are mergable despite being in a different order."""
        with session.with_cache() as sess:
            canvas = Planner(sess)

            q = self.sql({
                "object_type_id":
                sess.ObjectType.find_by_name("Fragment Stock").id,
                "location":
                self.Not("deleted"),
            })
            items = sess.Item.last(4, query=q)
            assert items

            assemble_op1 = canvas.create_operation_by_name("Assemble Plasmid")
            assemble_op2 = canvas.create_operation_by_name("Assemble Plasmid")
            assemble_op3 = canvas.create_operation_by_name("Assemble Plasmid")
            assemble_op4 = canvas.create_operation_by_name("Assemble Plasmid")

            assemble_op1.add_to_input_array("Fragment", item=items[0])
            assemble_op1.add_to_input_array("Fragment", item=items[1])

            assemble_op2.add_to_input_array("Fragment", item=items[0])
            assemble_op2.add_to_input_array("Fragment", item=items[1])

            assemble_op3.add_to_input_array("Fragment", item=items[1])
            assemble_op3.add_to_input_array("Fragment", item=items[0])

            assemble_op4.add_to_input_array("Fragment", item=items[1])
            assemble_op4.add_to_input_array("Fragment", item=items[2])

            sample = sess.Sample.one(query={
                "sample_type_id":
                sess.SampleType.find_by_name("Plasmid").id
            })
            canvas.set_field_value(assemble_op1.outputs[0], sample=sample)
            canvas.set_field_value(assemble_op2.outputs[0], sample=sample)
            canvas.set_field_value(assemble_op3.outputs[0], sample=sample)
            canvas.set_field_value(assemble_op4.outputs[0], sample=sample)

            assert len(canvas.plan.operations) == 4

            canvas.optimize()

            assert len(canvas.plan.operations) == 2
Example #6
0
    def test_restrict_to_one(self, session, restrict_to_one):
        with session.with_cache() as sess:
            sess.set_verbose(True)
            p = Planner(sess)
            for i in range(2):

                comp_cell_type = session.ObjectType.find_by_name(
                    "Yeast Competent Cell")
                comp_cells = session.Item.last(
                    100,
                    query='object_type_id = {} AND location != "deleted"'.
                    format(comp_cell_type.id),
                )
                grouped_by_samples = {}
                for c in comp_cells:
                    grouped_by_samples.setdefault(c.sample_id,
                                                  list()).append(c)
                more_than_one = [
                    cells for cells in grouped_by_samples.values()
                    if len(cells) > 1
                ][0]
                assert more_than_one
                parent_sample = more_than_one[0].sample

                op = p.create_operation_by_name("Yeast Transformation")
                p.set_field_value(op.input("Parent"), sample=parent_sample)
                if restrict_to_one:
                    p.set_to_available_item(
                        op.input("Parent"),
                        item_preference=p.ITEM_SELECTION_PREFERENCE.
                        RESTRICT_TO_ONE,
                    )
                else:
                    p.set_to_available_item(op.input("Parent"))
            items = set()
            for op in p.plan.operations:
                for fv in op.field_values:
                    if fv.child_item_id:
                        items.add(fv.child_item_id)
            if restrict_to_one:
                assert len(items) == 2
            else:
                assert len(items) == 1
Example #7
0
def test_proper_setting_of_object_types(session):

    canvas = Planner(session)
    yeast = session.Sample.where(
        {"sample_type_id": session.SampleType.find_by_name("Yeast Strain").id},
        opts={"limit": 10},
    )[-1]

    streak = canvas.create_operation_by_name("Streak Plate", category="Yeast")
    glycerol = canvas.create_operation_by_name("Yeast Glycerol Stock", category="Yeast")
    canvas.set_field_value(glycerol.inputs[0], sample=yeast)
    canvas.set_field_value(streak.inputs[0], sample=yeast)
    mating = canvas.create_operation_by_name("Yeast Mating")
    canvas.add_wire(streak.outputs[0], mating.inputs[0])
    canvas.add_wire(glycerol.outputs[0], mating.inputs[1])
    assert (
        mating.inputs[0].allowable_field_type.object_type.name == "Divided Yeast Plate"
    )
    assert (
        mating.inputs[1].allowable_field_type.object_type.name == "Yeast Glycerol Stock"
    )
Example #8
0
    def test_optimize_case5_array_inputs_merge_missing_samples(self, session):
        with session.with_cache() as sess:

            canvas = Planner(sess)
            canvas.logger.set_level("DEBUG")
            q = self.sql({
                "object_type_id":
                sess.ObjectType.find_by_name("Fragment Stock").id,
                "location":
                self.Not("deleted"),
            })

            primers = sess.Sample.last(
                4,
                query={
                    "sample_type_id": sess.SampleType.find_by_name("Primer").id
                })

            fragments = sess.Sample.last(
                4,
                query={
                    "sample_type_id":
                    sess.SampleType.find_by_name("Fragment").id
                })

            plasmids = sess.Sample.last(
                3,
                query={
                    "sample_type_id":
                    sess.SampleType.find_by_name("Plasmid").id
                })

            subchain = [
                "Make PCR Fragment",
                "Run Gel",
                "Extract Gel Slice",
                "Purify Gel Slice",
            ]

            ops1 = canvas.chain(*(subchain + ["Assemble Plasmid"]))
            ops2 = canvas.chain(*(subchain + ops1[-1:]))

            ops3 = canvas.chain(*(subchain + ["Assemble Plasmid"]))
            ops4 = canvas.chain(*(subchain + ops3[-1:]))

            ops5 = canvas.chain(*(subchain + ["Assemble Plasmid"]))
            ops6 = canvas.chain(*(subchain + ops5[-1:]))
            ops7 = canvas.chain(*(subchain + ops5[-1:]))
            ops8 = canvas.chain(*(subchain + ops5[-1:]))
            ops9 = canvas.chain(*(subchain + ops5[-1:]))

            for op in canvas.get_op_by_name("Run Gel"):
                pour_gel = canvas.chain("Pour Gel", op)[0]

            # pour_gels = [op for op in canvas.operations if
            #              op.operation_type.name == 'Pour Gel']
            # print([op.outputs[0].sample for op in pour_gels])

            # chain1 using primer1
            canvas.set_field_value_and_propogate(ops1[0].outputs[0],
                                                 sample=fragments[0])
            # chain2 using primer2
            canvas.set_field_value_and_propogate(ops2[0].outputs[0],
                                                 sample=fragments[1])

            # chain3 using primer2
            canvas.set_field_value_and_propogate(ops3[0].outputs[0],
                                                 sample=fragments[1])
            # chain4 using primer1
            canvas.set_field_value_and_propogate(ops4[0].outputs[0],
                                                 sample=fragments[0])

            canvas.set_field_value_and_propogate(ops6[0].outputs[0],
                                                 sample=fragments[1])
            canvas.set_field_value_and_propogate(ops7[0].outputs[0],
                                                 sample=fragments[1])

            def pcr(op, p1, p2, t):
                canvas.set_field_value(op.input("Forward Primer"), sample=p1)
                canvas.set_field_value(op.input("Reverse Primer"), sample=p2)
                canvas.set_field_value(op.input("Template"), sample=t)

            pcr(ops1[0], primers[0], primers[1], plasmids[0])
            pcr(ops2[0], primers[2], primers[3], plasmids[1])
            pcr(ops4[0], primers[0], primers[1], plasmids[0])
            pcr(ops3[0], primers[2], primers[3], plasmids[1])

            canvas.set_field_value(ops1[-1].outputs[0], sample=plasmids[2])
            canvas.set_field_value(ops3[-1].outputs[0], sample=plasmids[2])

            op_types = sorted(
                [op.operation_type.name for op in canvas.operations])
            print(op_types)

            canvas.optimize(merge_missing_samples=True)

            op_types = sorted(
                [op.operation_type.name for op in canvas.operations])
            print(op_types)
            assert len(canvas.get_op_by_name("Assemble Plasmid")) == 2
            assert len(canvas.get_op_by_name("Pour Gel")) == 4

            for op in canvas.get_op_by_name("Assemble Plasmid"):
                assert len({fv.child_sample_id for fv in op.inputs}) == 2
                assert len(op.inputs) in [5, 2]