def setUp(self):
        self.hit_a1 = {
            'locus_tag': 'locus_tag_a',
            'location': '[1000:2000]',
            'label': 'a1_generic_label',
            'domain': 'RRE_type_A',
            'evalue': 0.1,
            'protein_start': 0,
            'protein_end': 50,
            'score': 38.0,
            'description': 'description_type_A',
            'translation': 'FAKESEQ',
            'identifier': 'RREFam001',
        }
        self.hit_b1 = {
            'locus_tag': 'locus_tag_b',
            'location': '[500:1500]',
            'label': 'b1_generic_label',
            'domain': 'RRE_type_B',
            'evalue': 0.2,
            'protein_start': 0,
            'protein_end': 90,
            'score': 25.0,
            'description': 'description_type_B',
            'translation': 'FAKESEQ',
            'identifier': 'RREFam002',
        }

        self.hit_info = dict(
            (hit['locus_tag'], [hit]) for hit in [self.hit_a1, self.hit_b1])
        self.hits_per_protocluster = {1: ['locus_tag_a'], 2: ['locus_tag_b']}
        self.tool = 'rrefinder'
        self.database = 'RREFam.hmm'
        self.detection = 'hmmscan'

        self.min_length = 50
        self.bitscore_cutoff = 25.0

        self.record = unittest.mock.Mock()
        self.record.id = self.record_id = 'test_record'

        self.record2 = unittest.mock.Mock()
        self.record2.record_id = 'another_record'

        self.json_dict = {
            "schema_version": RREFinderResults.schema_version,
            "bitscore_cutoff": self.bitscore_cutoff,
            "hits_per_protocluster": self.hits_per_protocluster,
            "hit_info": self.hit_info,
            "min_length": self.min_length,
            "record_id": self.record_id,
        }

        self.res_object = RREFinderResults(self.record_id,
                                           self.bitscore_cutoff,
                                           self.min_length,
                                           self.hits_per_protocluster,
                                           self.hit_info)
    def test_from_json(self):
        res_object = RREFinderResults.from_json(self.json_dict, self.record,
                                                self.min_length,
                                                self.bitscore_cutoff)
        assert res_object
        assert res_object.hits_per_protocluster == self.hits_per_protocluster
        assert res_object.hit_info == self.hit_info
        assert res_object.bitscore_cutoff == self.bitscore_cutoff
        assert res_object.min_length == self.min_length
        assert res_object.record_id == self.record_id

        json_dict2 = dict(self.json_dict)
        json_dict2['record_id'] = 'another_record'
        assert not RREFinderResults.from_json(
            json_dict2, self.record, self.min_length, self.bitscore_cutoff)

        json_dict3 = dict(self.json_dict)
        json_dict3['schema_version'] = 'not_a_valid_schema'
        assert not RREFinderResults.from_json(
            json_dict3, self.record, self.min_length, self.bitscore_cutoff)

        # Invalid arguments should return None
        json_dict4 = dict(self.json_dict)
        _ = json_dict4.pop('bitscore_cutoff')
        with self.assertRaises(ValueError):
            _ = RREFinderResults.from_json(json_dict4, self.record,
                                           self.min_length,
                                           self.bitscore_cutoff)

        json_dict5 = dict(self.json_dict)
        _ = json_dict5.pop('min_length')
        with self.assertRaises(ValueError):
            _ = RREFinderResults.from_json(json_dict5, self.record,
                                           self.min_length,
                                           self.bitscore_cutoff)

        # More lenient settings shouldn't return results
        assert not RREFinderResults.from_json(self.json_dict, self.record, 25,
                                              self.bitscore_cutoff)
        assert not RREFinderResults.from_json(self.json_dict, self.record,
                                              self.min_length, 15.0)

        # Stricter settings should filter
        res_object2 = RREFinderResults.from_json(self.json_dict, self.record,
                                                 self.min_length, 35.0)
        assert res_object2.hit_info['locus_tag_a'] == [self.hit_a1]
        assert len(res_object2.hit_info) == 1
        assert res_object2.hits_per_protocluster[1] == ['locus_tag_a']
        assert len(res_object2.hits_per_protocluster) == 1

        res_object3 = RREFinderResults.from_json(self.json_dict, self.record,
                                                 80, self.bitscore_cutoff)
        assert res_object3.hits_per_protocluster[2] == ['locus_tag_b']
        assert len(res_object3.hits_per_protocluster) == 1
        assert res_object3.hit_info['locus_tag_b'] == [self.hit_b1]
        assert len(res_object3.hit_info) == 1
Ejemplo n.º 3
0
    def test_json_conversion(self):
        results = self.create_results()

        json = jsonlib.loads(jsonlib.dumps(results.to_json()))

        regenerated = RREFinderResults.from_json(json, self.record)
        assert regenerated.hits_by_protocluster == results.hits_by_protocluster
        assert regenerated.hits_by_cds == results.hits_by_cds
        assert regenerated.bitscore_cutoff == results.bitscore_cutoff
        assert regenerated.min_length == results.min_length
        assert regenerated.record_id == results.record_id
Ejemplo n.º 4
0
 def test_from_json_higher_bitscore(self):
     json = self.create_results().to_json()
     assert get_config().rre_cutoff == 25.
     new = 35.
     assert self.hits[0].score > new
     assert self.hits[1].score < new
     update_config({"rre_cutoff": new})
     result = RREFinderResults.from_json(json, self.record)
     assert len(result.hits_by_cds) == 1
     assert result.hits_by_cds[self.hits[0].locus_tag] == [self.hits[0]]
     assert len(result.hits_by_protocluster) == 1
     assert result.hits_by_protocluster[1] == [self.hits[0].locus_tag]
Ejemplo n.º 5
0
 def test_from_json_higher_min_length(self):
     json = self.create_results().to_json()
     assert get_config().rre_min_length == 50
     new = 80
     assert len(self.hits[0]) < new
     assert len(self.hits[1]) > new
     update_config({"rre_min_length": new})
     results = RREFinderResults.from_json(json, self.record)
     assert len(results.hits_by_cds) == 1
     assert results.hits_by_cds[self.hits[1].locus_tag] == [self.hits[1]]
     assert len(results.hits_by_protocluster) == 1
     assert results.hits_by_protocluster[2] == [self.hits[1].locus_tag]
Ejemplo n.º 6
0
    def create_results(self,
                       record_id=None,
                       cutoff=None,
                       min_length=None,
                       hits_by_protocluster=None,
                       hits_by_cds=None):
        record_id = record_id or self.record.id
        bitscore_cutoff = cutoff if cutoff is not None else self.bitscore_cutoff
        min_length = min_length or self.min_length
        hits_by_protocluster = hits_by_protocluster or self.hits_by_protocluster
        hits_by_cds = hits_by_cds or self.hits_by_cds

        return RREFinderResults(record_id, bitscore_cutoff, min_length,
                                hits_by_protocluster, hits_by_cds)
 def test_convert_hits_to_features(self):
     hit_info = self.hit_info.copy()
     _ = hit_info.pop('locus_tag_b')
     res_object = RREFinderResults(self.record_id, self.bitscore_cutoff,
                                   self.min_length,
                                   self.hits_per_protocluster, hit_info)
     assert len(res_object.features) == 1
     feature = res_object.features[0]
     assert isinstance(feature, RRE)
     assert feature.location == FeatureLocation(1000, 2000)
     assert feature.protein_location == FeatureLocation(0, 50)
     assert feature.description == 'description_type_A'
     assert feature.domain == 'RRE_type_A'
     assert feature.locus_tag == 'locus_tag_a'
     assert feature.domain_id == '{}_locus_tag_a_0001'.format(self.tool)
     assert feature.database == self.database
     assert feature.detection == self.detection
     assert feature.score == self.hit_a1['score']
     assert feature.evalue == self.hit_a1['evalue']
     assert feature.label == self.hit_a1['label']
     assert feature.translation == self.hit_a1['translation']
Ejemplo n.º 8
0
 def test_from_json_lower_bitscore(self):
     json = self.create_results().to_json()
     assert get_config().rre_cutoff == 25.
     update_config({"rre_cutoff": 15.})
     assert not RREFinderResults.from_json(json, self.record)
Ejemplo n.º 9
0
 def test_from_json_lower_min_length(self):
     json = self.create_results().to_json()
     assert get_config().rre_min_length == 50
     update_config({"rre_min_length": 25})
     assert not RREFinderResults.from_json(json, self.record)
Ejemplo n.º 10
0
 def test_from_json_wrong_schema_version(self):
     json = self.create_results().to_json()
     json['schema_version'] = 'not_a_valid_schema'
     assert not RREFinderResults.from_json(json, self.record)
Ejemplo n.º 11
0
 def test_from_json_wrong_record(self):
     json = self.create_results().to_json()
     json['record_id'] = 'another_record'
     assert not RREFinderResults.from_json(json, self.record)
class TestRREResults(unittest.TestCase):
    def setUp(self):
        self.hit_a1 = {
            'locus_tag': 'locus_tag_a',
            'location': '[1000:2000]',
            'label': 'a1_generic_label',
            'domain': 'RRE_type_A',
            'evalue': 0.1,
            'protein_start': 0,
            'protein_end': 50,
            'score': 38.0,
            'description': 'description_type_A',
            'translation': 'FAKESEQ',
            'identifier': 'RREFam001',
        }
        self.hit_b1 = {
            'locus_tag': 'locus_tag_b',
            'location': '[500:1500]',
            'label': 'b1_generic_label',
            'domain': 'RRE_type_B',
            'evalue': 0.2,
            'protein_start': 0,
            'protein_end': 90,
            'score': 25.0,
            'description': 'description_type_B',
            'translation': 'FAKESEQ',
            'identifier': 'RREFam002',
        }

        self.hit_info = dict(
            (hit['locus_tag'], [hit]) for hit in [self.hit_a1, self.hit_b1])
        self.hits_per_protocluster = {1: ['locus_tag_a'], 2: ['locus_tag_b']}
        self.tool = 'rrefinder'
        self.database = 'RREFam.hmm'
        self.detection = 'hmmscan'

        self.min_length = 50
        self.bitscore_cutoff = 25.0

        self.record = unittest.mock.Mock()
        self.record.id = self.record_id = 'test_record'

        self.record2 = unittest.mock.Mock()
        self.record2.record_id = 'another_record'

        self.json_dict = {
            "schema_version": RREFinderResults.schema_version,
            "bitscore_cutoff": self.bitscore_cutoff,
            "hits_per_protocluster": self.hits_per_protocluster,
            "hit_info": self.hit_info,
            "min_length": self.min_length,
            "record_id": self.record_id,
        }

        self.res_object = RREFinderResults(self.record_id,
                                           self.bitscore_cutoff,
                                           self.min_length,
                                           self.hits_per_protocluster,
                                           self.hit_info)

    def test_init(self):
        assert self.res_object.record_id == self.record_id
        assert self.res_object.bitscore_cutoff == self.bitscore_cutoff
        assert self.res_object.min_length == self.min_length
        assert self.res_object.hits_per_protocluster == self.hits_per_protocluster
        assert self.res_object.hit_info == self.hit_info
        assert self.res_object.tool == self.tool
        assert self.res_object.detection == self.detection
        assert self.res_object.database == self.database
        assert self.res_object.features

    def test_convert_hits_to_features(self):
        hit_info = self.hit_info.copy()
        _ = hit_info.pop('locus_tag_b')
        res_object = RREFinderResults(self.record_id, self.bitscore_cutoff,
                                      self.min_length,
                                      self.hits_per_protocluster, hit_info)
        assert len(res_object.features) == 1
        feature = res_object.features[0]
        assert isinstance(feature, RRE)
        assert feature.location == FeatureLocation(1000, 2000)
        assert feature.protein_location == FeatureLocation(0, 50)
        assert feature.description == 'description_type_A'
        assert feature.domain == 'RRE_type_A'
        assert feature.locus_tag == 'locus_tag_a'
        assert feature.domain_id == '{}_locus_tag_a_0001'.format(self.tool)
        assert feature.database == self.database
        assert feature.detection == self.detection
        assert feature.score == self.hit_a1['score']
        assert feature.evalue == self.hit_a1['evalue']
        assert feature.label == self.hit_a1['label']
        assert feature.translation == self.hit_a1['translation']

    def test_to_json(self):
        assert self.json_dict == self.res_object.to_json()

    def test_from_json(self):
        res_object = RREFinderResults.from_json(self.json_dict, self.record,
                                                self.min_length,
                                                self.bitscore_cutoff)
        assert res_object
        assert res_object.hits_per_protocluster == self.hits_per_protocluster
        assert res_object.hit_info == self.hit_info
        assert res_object.bitscore_cutoff == self.bitscore_cutoff
        assert res_object.min_length == self.min_length
        assert res_object.record_id == self.record_id

        json_dict2 = dict(self.json_dict)
        json_dict2['record_id'] = 'another_record'
        assert not RREFinderResults.from_json(
            json_dict2, self.record, self.min_length, self.bitscore_cutoff)

        json_dict3 = dict(self.json_dict)
        json_dict3['schema_version'] = 'not_a_valid_schema'
        assert not RREFinderResults.from_json(
            json_dict3, self.record, self.min_length, self.bitscore_cutoff)

        # Invalid arguments should return None
        json_dict4 = dict(self.json_dict)
        _ = json_dict4.pop('bitscore_cutoff')
        with self.assertRaises(ValueError):
            _ = RREFinderResults.from_json(json_dict4, self.record,
                                           self.min_length,
                                           self.bitscore_cutoff)

        json_dict5 = dict(self.json_dict)
        _ = json_dict5.pop('min_length')
        with self.assertRaises(ValueError):
            _ = RREFinderResults.from_json(json_dict5, self.record,
                                           self.min_length,
                                           self.bitscore_cutoff)

        # More lenient settings shouldn't return results
        assert not RREFinderResults.from_json(self.json_dict, self.record, 25,
                                              self.bitscore_cutoff)
        assert not RREFinderResults.from_json(self.json_dict, self.record,
                                              self.min_length, 15.0)

        # Stricter settings should filter
        res_object2 = RREFinderResults.from_json(self.json_dict, self.record,
                                                 self.min_length, 35.0)
        assert res_object2.hit_info['locus_tag_a'] == [self.hit_a1]
        assert len(res_object2.hit_info) == 1
        assert res_object2.hits_per_protocluster[1] == ['locus_tag_a']
        assert len(res_object2.hits_per_protocluster) == 1

        res_object3 = RREFinderResults.from_json(self.json_dict, self.record,
                                                 80, self.bitscore_cutoff)
        assert res_object3.hits_per_protocluster[2] == ['locus_tag_b']
        assert len(res_object3.hits_per_protocluster) == 1
        assert res_object3.hit_info['locus_tag_b'] == [self.hit_b1]
        assert len(res_object3.hit_info) == 1

    def test_add_record(self):
        with self.assertRaisesRegex(
                ValueError,
                "Record to store in and record analysed don't match"):
            self.res_object.add_to_record(self.record2)
        self.res_object.add_to_record(self.record)
        assert self.record.add_feature.call_count == 2
        for arg in self.record.add_feature.call_args_list:
            # First argument of positional arguments
            assert isinstance(arg[0][0], RRE)