Skip to content
Snippets Groups Projects
Commit 7a5ea266 authored by Marco Biasini's avatar Marco Biasini
Browse files

added slice operator to SequenceHandle

Also, added unit tests for slice operators of SequenceList,
SequenceHandle and AlignmentHandle exports. Fixes BZDNG-249.
parent 9250f246
Branches
Tags
No related merge requests found
......@@ -57,11 +57,17 @@ T do_slice(const T& t, slice& sl) {
int start=0, end=t.GetCount();
try {
start=extract<int>(sl.start());
if (start<0) {
start=t.GetCount()+start;
}
} catch(error_already_set) {
PyErr_Clear();
}
try {
end=extract<int>(sl.stop());
if (end<0) {
end=t.GetCount()+end;
}
} catch(error_already_set) {
PyErr_Clear();
}
......@@ -78,16 +84,43 @@ SequenceList do_slice_b(SequenceList& t, slice sl)
return do_slice<SequenceList>(t, sl);
}
String slice_seq(const ConstSequenceHandle& sh, slice& sl) {
int start=0, end=sh.GetLength();
try {
start=extract<int>(sl.start());
if (start<0) {
start=sh.GetLength()+start;
}
} catch(error_already_set) {
PyErr_Clear();
}
try {
end=extract<int>(sl.stop());
if (end<0) {
end=sh.GetLength()+end;
}
} catch(error_already_set) {
PyErr_Clear();
}
String s=sh.GetString();
return s.substr(start, end-start);
}
AlignedRegion slice_aln(const AlignmentHandle& aln, slice sl) {
int start=0, end=aln.GetLength();
try {
start=extract<int>(sl.start());
if (start<0) {
start=aln.GetLength()+start;
}
} catch(error_already_set) {
PyErr_Clear();
}
try {
end=extract<int>(sl.stop());
if (end<0) {
end=aln.GetLength()+end;
}
} catch(error_already_set) {
PyErr_Clear();
}
......@@ -212,6 +245,7 @@ void const_seq_handle_def(O& bp_class)
.def("GetOneLetterCode", &C::GetOneLetterCode)
.def("__iter__", iterator<C>())
.def("__getitem__", &C::GetOneLetterCode)
.def("__getitem__", slice_seq)
.def("GetOffset", &C::GetOffset)
.def("Copy", &C::Copy)
.def("IsValid", &C::IsValid)
......
......
......@@ -20,6 +20,55 @@ class TestSeq(unittest.TestCase):
def setUp(self):
self.ent=fixture()
def testSeqSlice(self):
seq_string='abcdefg'
s=seq.CreateSequence('A', seq_string)
self.assertEqual(s[1:5], seq_string[1:5])
self.assertEqual(s[:-1], seq_string[:-1])
self.assertEqual(s[-3:-2], seq_string[-3:-2])
self.assertEqual(s[-3:], seq_string[-3:])
self.assertEqual(s[3:4], seq_string[3:4])
def testSeqListSlice(self):
a=seq.CreateSequence('A','aaaa')
b=seq.CreateSequence('B','bbbb')
c=seq.CreateSequence('C','cccc')
d=seq.CreateSequence('D','dddd')
sl=seq.CreateSequenceList(a, b, c, d)
sliced=sl[1:]
self.assertEqual(len(sliced), 3)
self.assertEqual(str(sliced[0]), str(b))
self.assertEqual(str(sliced[1]), str(c))
self.assertEqual(str(sliced[2]), str(d))
sliced=sl[:-1]
self.assertEqual(len(sliced), 3)
self.assertEqual(str(sliced[0]), str(a))
self.assertEqual(str(sliced[1]), str(b))
self.assertEqual(str(sliced[2]), str(c))
sliced=sl[-1:]
self.assertEqual(len(sliced), 1)
self.assertEqual(str(sliced[0]), str(d))
def testAlnSlice(self):
a=seq.CreateSequence('A','abcd')
b=seq.CreateSequence('B','efgh')
c=seq.CreateSequence('C','ijkl')
d=seq.CreateSequence('D','mnop')
aln=seq.CreateAlignment(a, b, c, d)
sliced=aln[1:]
self.assertEqual(len(sliced), 3)
self.assertEqual(str(sliced[0]), 'bfjn')
self.assertEqual(str(sliced[1]), 'cgko')
self.assertEqual(str(sliced[2]), 'dhlp')
sliced=aln[:-1]
self.assertEqual(len(sliced), 3)
self.assertEqual(str(sliced[0]), 'aeim')
self.assertEqual(str(sliced[1]), 'bfjn')
self.assertEqual(str(sliced[2]), 'cgko')
sliced=aln[-1:]
self.assertEqual(len(sliced), 1)
self.assertEqual(str(sliced[0]), 'dhlp')
def testViewsFromSequences_01(self):
seq_a=seq.CreateSequence("A", "ABCD-FGH")
seq_a.AttachView(self.ent.Select('rname=A,B,C,D,F,G,H'))
......
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment