diff --git a/clone/clone.go b/clone/clone.go index cc9939ba1..4b9096bf8 100644 --- a/clone/clone.go +++ b/clone/clone.go @@ -188,7 +188,15 @@ func CutWithEnzyme(part Part, directional bool, enzyme Enzyme) []Fragment { // In the case of a single cut in a linear sequence, we get two fragments with only 1 stick end fragmentSequence1 := sequence[overhangs[0].Position+overhangs[0].Length:] fragmentSequence2 := sequence[:overhangs[0].Position] - overhangSequence := sequence[overhangs[0].Position : overhangs[0].Position+overhangs[0].Length] + + var overhangSequence string + + if len(forwardOverhangs) > 0 { + overhangSequence = sequence[overhangs[0].Position : overhangs[0].Position+overhangs[0].Length] + } else { + overhangSequence = sequence[overhangs[0].Position-overhangs[0].Length : overhangs[0].Position] + } + fragments = append(fragments, Fragment{fragmentSequence1, overhangSequence, ""}) fragments = append(fragments, Fragment{fragmentSequence2, "", overhangSequence}) return fragments diff --git a/clone/clone_test.go b/clone/clone_test.go index fb5ade198..3c02e523e 100644 --- a/clone/clone_test.go +++ b/clone/clone_test.go @@ -96,6 +96,44 @@ func TestCutWithEnzyme(t *testing.T) { } } +func TestCutWithEnzymeRegression(t *testing.T) { + sequence := "AGCTGCTGTTTAAAGCTATTACTTTGAGACC" // this is a real sequence I came across that was causing problems + + part := Part{sequence, false} + + // get enzymes with enzyme manager + enzymeManager := NewEnzymeManager(GetBaseRestrictionEnzymes()) + bsa1, err := enzymeManager.GetEnzymeByName("BsaI") + if err != nil { + t.Errorf("Error when getting Enzyme. Got error: %s", err) + } + + // cut with BsaI + fragments := CutWithEnzyme(part, false, bsa1) + + // check that the fragments are correct + if len(fragments) != 2 { + t.Errorf("Expected 2 fragments, got: %d", len(fragments)) + } + + if fragments[0].ForwardOverhang != "ACTT" { + t.Errorf("Expected forward overhang to be ACTT, got: %s", fragments[0].ForwardOverhang) + } + + if fragments[0].ReverseOverhang != "" { + t.Errorf("Expected reverse overhang to be GAGT, got: %s", fragments[0].ReverseOverhang) + } + + if fragments[1].ForwardOverhang != "" { + t.Errorf("Expected forward overhang to be empty, got: %s", fragments[1].ForwardOverhang) + } + + if fragments[1].ReverseOverhang != "ACTT" { + t.Errorf("Expected reverse overhang to be GAGT, got: %s", fragments[1].ReverseOverhang) + } + +} + func TestCircularLigate(t *testing.T) { // The following tests for complementing overhangs. Specific, this line: // newSeed := Fragment{seedFragment.Sequence + seedFragment.ReverseOverhang + ReverseComplement(newFragment.Sequence), seedFragment.ForwardOverhang, ReverseComplement(newFragment.ForwardOverhang)}