Exemplo n.º 1
0
class Test_seq_align(TestCase):
    """Unit tests for the data.seq_align relax module."""


    def setUp(self):
        """Set 'self.seq_align' to an empty instance of the Sequence_alignments class."""

        self.seq_align = Sequence_alignments()


    def generate_ids(self, object_ids, models, molecules):
        """Generate the expected IDs."""

        # Generate the IDs.
        ids = []
        for i in range(len(object_ids)):
            ids.append("Object '%s'" % object_ids[i])
            if models[i] != None:
                ids[-1] += "; Model %i" % models[i]
            ids[-1] += "; Molecule '%s'" % molecules[i]

        # Return the IDs.
        return ids


    def return_align_data(self):
        """Return a data set for alignment testing."""

        # The data.
        object_ids = ['frame_order', 'ensemble', 'ensemble', 'ensemble', 'ensemble', 'ensemble', 'ensemble', 'ensemble']
        models = [None, 1, 1, 1, 1, 1, 1, 1]
        molecules = [
            'N-dom',
            'ensemble 4M A',
            'ensemble 4M B',
            'ensemble 4M C',
            'ensemble 4M D',
            'CaM-IQ A',
            'CaM-IQ B',
            'CaM-IQ C'
        ]
        sequences = [
            'LTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTIDFPEFLTMMARK*****',
            '*DQLTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTIDFPEFLTMMARKMKDTDSEEEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREADIDGDGQVNYEEFVQMMTA*****',
            '*DQLTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTIDFPEFLTMMARKMKDTDSEEEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREADIDGDGQVNYEEFVQMMTA*****',
            '*DQLTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTIDFPEFLTMMARKMKDTDSEEEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREADIDGDGQVNYEEFVQMMTA*****',
            '*DQLTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTIDFPEFLTMMARKMKDTDSEEEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREADIDGDGQVNYEEFVQMMTA*****',
            '                                                                                                                           QLTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTIDFPEFLTMMARKMKSEEEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREADIDGDGQVNYEEFVQMMT*****',
            '                                                                                                                           LTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTIDFPEFLTMMARKMKDEEEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREADIDGDGQVNYEEFVQMMT*****',
            '                                                                                                                           LTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTIDFPEFLTMMARKEEEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREADIDGDGQVNYEEFVQMMT*****',

            'TEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADG',
            'ADQLTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTIDFPEFLTMMARKM',
            'LTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTIDFPEFLTMMAR'
        ]
        strings = [
            '---LTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTIDFPEFLTMMARK------------------------------------------------------------------------*****----------------------------------------------------------------------------',
            '*DQLTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTIDFPEFLTMMARK----------------------------------------------------------------------------MKDTDSEEEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREADIDGDGQVNYEEFVQMMTA*****',
            '*DQLTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTIDFPEFLTMMARKMKDTDSEEEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREADIDGDGQVNYEEFVQMMTA*****----------------------------------------------------------------------------',
            '*DQLTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTIDFPEFLTMMARKMKDTDSEEEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREADIDGDGQVNYEEFVQMMTA*****----------------------------------------------------------------------------',
            '*DQLTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTIDFPEFLTMMARKMKDTDSEEEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREADIDGDGQVNYEEFVQMMTA*****----------------------------------------------------------------------------',
            '--QLTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTIDFPEFLTMMARK----MKSEEEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREADIDGDGQVNYEEFVQMMT*****----------------------------------------------------------------------------',
            '---LTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTIDFPEFLTMMARK----MKDEEEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREADIDGDGQVNYEEFVQMMT*****----------------------------------------------------------------------------',
            '---LTEEQIAEFKEAFSLFDKDGDGTITTKELGTVMRSLGQNPTEAELQDMINEVDADGNGTIDFPEFLTMMARK-------EEEIREAFRVFDKDGNGYISAAELRHVMTNLGEKLTDEEVDEMIREADIDGDGQVNYEEFVQMMT*****----------------------------------------------------------------------------',
        ]
        gaps = []
        for i in range(len(strings)):
            gaps.append([])
            for j in range(len(strings[0])):
                if strings[i][j] == '-':
                    gaps[i].append(1)
                else:
                    gaps[i].append(0)
        msa_algorithm = 'Central Star'
        pairwise_algorithm = 'NW70'
        matrix = 'BLOSUM62'
        gap_open_penalty = 10.0
        gap_extend_penalty = 1.0
        end_gap_open_penalty = 0.0
        end_gap_extend_penalty = 0.0

        # Return the data.
        return object_ids, models, molecules, sequences, strings, gaps, msa_algorithm, pairwise_algorithm, matrix, gap_open_penalty, gap_extend_penalty, end_gap_open_penalty, end_gap_extend_penalty


    def test_alignment_addition(self):
        """Test the creation of a new sequence alignment object."""

        # The data.
        object_ids, models, molecules, sequences, strings, gaps, msa_algorithm, pairwise_algorithm, matrix, gap_open_penalty, gap_extend_penalty, end_gap_open_penalty, end_gap_extend_penalty = self.return_align_data()

        # Add the alignment.
        self.seq_align.add(object_ids=object_ids, models=models, molecules=molecules, sequences=sequences, strings=strings, gaps=gaps, msa_algorithm=msa_algorithm, pairwise_algorithm=pairwise_algorithm, matrix=matrix, gap_open_penalty=gap_open_penalty, gap_extend_penalty=gap_extend_penalty, end_gap_open_penalty=end_gap_open_penalty, end_gap_extend_penalty=end_gap_extend_penalty)

        # Generate the expected IDs.
        ids = self.generate_ids(object_ids, models, molecules)

        # Check the data.
        for i in range(8):
            print("Checking \"%s\"" % ids[i])
            self.assertEqual(self.seq_align[0].ids[i], ids[i])
            self.assertEqual(self.seq_align[0].object_ids[i], object_ids[i])
            self.assertEqual(self.seq_align[0].models[i], models[i])
            self.assertEqual(self.seq_align[0].molecules[i], molecules[i])
            self.assertEqual(self.seq_align[0].sequences[i], sequences[i])
            self.assertEqual(self.seq_align[0].strings[i], strings[i])
            self.assertEqual(self.seq_align[0].gaps[i], gaps[i])
            self.assertEqual(self.seq_align[0].msa_algorithm, msa_algorithm)
            self.assertEqual(self.seq_align[0].pairwise_algorithm, pairwise_algorithm)
            self.assertEqual(self.seq_align[0].matrix, matrix)
            self.assertEqual(self.seq_align[0].gap_open_penalty, gap_open_penalty)
            self.assertEqual(self.seq_align[0].gap_extend_penalty, gap_extend_penalty)
            self.assertEqual(self.seq_align[0].end_gap_open_penalty, end_gap_open_penalty)
            self.assertEqual(self.seq_align[0].end_gap_extend_penalty, end_gap_extend_penalty)


    def test_find_alignment(self):
        """Test the retrieval of pre-existing alignment."""

        # Execute the body of the test_alignment_addition() unit test to set up the object.
        self.test_alignment_addition()

        # The identifying data.
        object_ids, models, molecules, sequences, strings, gaps, msa_algorithm, pairwise_algorithm, matrix, gap_open_penalty, gap_extend_penalty, end_gap_open_penalty, end_gap_extend_penalty = self.return_align_data()

        # Retrieve the alignment.
        align = self.seq_align.find_alignment(object_ids=object_ids, models=models, molecules=molecules, sequences=sequences, msa_algorithm=msa_algorithm, pairwise_algorithm=pairwise_algorithm, matrix=matrix, gap_open_penalty=gap_open_penalty, gap_extend_penalty=gap_extend_penalty, end_gap_open_penalty=end_gap_open_penalty, end_gap_extend_penalty=end_gap_extend_penalty)

        # Check that something was returned.
        self.assertNotEqual(align, None)

        # Generate the expected IDs.
        ids = self.generate_ids(object_ids, models, molecules)

        # Check some of the data.
        for i in range(8):
            print("Checking \"%s\"" % ids[i])
            self.assertEqual(self.seq_align[0].object_ids[i], object_ids[i])
            self.assertEqual(self.seq_align[0].models[i], models[i])
            self.assertEqual(self.seq_align[0].molecules[i], molecules[i])


    def test_find_missing_alignment(self):
        """Test the retrieval of non-existent alignment."""

        # Execute the body of the test_alignment_addition() unit test to set up the object.
        self.test_alignment_addition()

        # The identifying data.
        object_ids, models, molecules, sequences, strings, gaps, msa_algorithm, pairwise_algorithm, matrix, gap_open_penalty, gap_extend_penalty, end_gap_open_penalty, end_gap_extend_penalty = self.return_align_data()

        # Change a gap penalty.
        gap_open_penalty = 0.5

        # Retrieve the alignment.
        align = self.seq_align.find_alignment(object_ids=object_ids, models=models, molecules=molecules, sequences=sequences, msa_algorithm=msa_algorithm, pairwise_algorithm=pairwise_algorithm, matrix=matrix, gap_open_penalty=gap_open_penalty, gap_extend_penalty=gap_extend_penalty, end_gap_open_penalty=end_gap_open_penalty, end_gap_extend_penalty=end_gap_extend_penalty)

        # Check that nothing was returned.
        self.assertEqual(align, None)