Finish new RDF based ddf construction.
[htsworkflow.git] / htsworkflow / submission / test / test_daf.py
1 from StringIO import StringIO
2 import unittest
3
4 from htsworkflow.submission import daf
5 from htsworkflow.util.rdfhelp import \
6      dafTermOntology, \
7      fromTypedNode, \
8      rdfNS, \
9      submissionLog, \
10      submissionOntology, \
11      get_model, \
12      get_serializer
13
14 import RDF
15
16 test_daf = """# Lab and general info
17 grant             Hardison
18 lab               Caltech-m
19 dataType          ChipSeq 
20 variables         cell, antibody,sex,age,strain,control
21 compositeSuffix   CaltechHistone
22 assembly          mm9
23 dafVersion        2.0
24 validationSettings validateFiles.bam:mismatches=2,bamPercent=99.9;validateFiles.fastq:quick=1000
25
26 # Track/view definition
27 view             FastqRd1
28 longLabelPrefix  Caltech Fastq Read 1
29 type             fastq
30 hasReplicates    yes
31 required         no
32
33 view             Signal
34 longLabelPrefix  Caltech Histone Signal
35 type             bigWig
36 hasReplicates    yes
37 required         no
38 """
39
40 class TestDAF(unittest.TestCase):
41     def test_parse(self):
42
43         parsed = daf.fromstring(test_daf)
44         
45         self.failUnlessEqual(parsed['assembly'], 'mm9')
46         self.failUnlessEqual(parsed['grant'], 'Hardison')
47         self.failUnlessEqual(len(parsed['variables']), 6)
48         self.failUnlessEqual(len(parsed['views']), 2)
49         self.failUnlessEqual(len(parsed['views']['FastqRd1']), 5)
50         self.failUnlessEqual(len(parsed['views']['Signal']), 5)
51         signal = parsed['views']['Signal']
52         self.failUnlessEqual(signal['required'], False)
53         self.failUnlessEqual(signal['longLabelPrefix'],
54                              'Caltech Histone Signal')
55
56     def test_rdf(self):
57
58         parsed = daf.fromstring(test_daf)
59         #mem = RDF.Storage(storage_name='hashes',
60         #                  options_string='hash-type="memory"'),
61         mem = RDF.MemoryStorage()
62         model = RDF.Model(mem)
63
64         name = 'cursub'
65         subNS = RDF.NS(str(submissionLog[name].uri))
66         daf.add_to_model(model, parsed, name)
67
68         signal_view_node = RDF.Node(subNS['/view/Signal'].uri)
69
70         writer = get_serializer()
71         turtle =  writer.serialize_model_to_string(model)
72         self.failUnless(str(signal_view_node) in turtle)
73
74         statements = list(model.find_statements(
75             RDF.Statement(
76                 signal_view_node, None, None)))
77         self.failUnlessEqual(len(statements), 6)
78         name = model.get_target(signal_view_node, dafTermOntology['name'])
79         self.failUnlessEqual(fromTypedNode(name), u'Signal')
80
81 def load_daf_mapper(name, extra_statements=None):
82     """Load test model in
83     """
84     model = get_model()
85     if extra_statements is not None:
86         parser = RDF.Parser(name='turtle')
87         parser.parse_string_into_model(model, extra_statements,
88                                        'http://extra.extra')
89         
90     test_daf_stream = StringIO(test_daf)
91     mapper = daf.DAFMapper(name, daf_file = test_daf_stream, model=model)
92     return mapper
93
94 def dump_model(model):
95     writer = get_serializer()
96     turtle =  writer.serialize_model_to_string(model)
97     print turtle
98     
99 class TestDAFMapper(unittest.TestCase):
100     def test_create_mapper_add_pattern(self):
101         name = 'testsub'
102         mapper = load_daf_mapper(name)
103         pattern = '.bam\Z(?ms)'
104         mapper.add_pattern('Signal', pattern)
105
106         s = RDF.Statement(daf.get_view_namespace(name)['Signal'],
107                           dafTermOntology['filename_re'],
108                           None)
109         search = list(mapper.model.find_statements(s))
110         self.failUnlessEqual(len(search), 1)
111         self.failUnlessEqual(str(search[0].subject),
112                              str(submissionLog['testsub/view/Signal']))
113         self.failUnlessEqual(str(search[0].predicate),
114                              str(dafTermOntology['filename_re']))
115         #self.failUnlessEqual(search[0].object.literal_value['string'], pattern)
116
117     def test_find_one_view(self):
118         extra = '''@prefix dafTerm:<http://jumpgate.caltech.edu/wiki/UcscDaf#> .
119
120 <%(submissionLog)s/testfind/view/Signal> dafTerm:filename_re ".*\\\\.bam" .
121 <%(submissionLog)s/testfind/view/FastqRd1> dafTerm:filename_re ".*_r1\\\\.fastq" .
122 ''' % {'submissionLog': 'http://jumpgate.caltech.edu/wiki/SubmissionsLog'}
123
124         daf_mapper = load_daf_mapper('testfind', extra_statements = extra)
125
126         view = daf_mapper.find_view('filename_r1.fastq')
127         self.failUnlessEqual(str(view),
128                              str(submissionLog['testfind/view/FastqRd1']))
129
130         #writer = get_serializer()
131         #turtle =  writer.serialize_model_to_string(model)
132         #print turtle
133
134     def test_find_overlapping_view(self):
135         extra = '''@prefix dafTerm:<http://jumpgate.caltech.edu/wiki/UcscDaf#> .
136
137 <%(submissionLog)s/testfind/view/fastq> dafTerm:filename_re ".*\\\\.fastq" .
138 <%(submissionLog)s/testfind/view/FastqRd1> dafTerm:filename_re ".*_r1\\\\.fastq" .
139 ''' % {'submissionLog': 'http://jumpgate.caltech.edu/wiki/SubmissionsLog'}
140
141         daf_mapper = load_daf_mapper('testfind', extra_statements = extra)
142
143         self.failUnlessRaises(daf.ModelException,
144                               daf_mapper.find_view,
145                               'filename_r1.fastq')
146
147     def test_find_attributes(self):
148         lib_id = '11204'
149         lib_url = 'http://jumpgate.caltech.edu/library/%s' %(lib_id)
150         extra = '''@prefix dafTerm: <http://jumpgate.caltech.edu/wiki/UcscDaf#> .
151 @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
152
153 <%(submissionLog)s/testfind/view/Signal> dafTerm:filename_re ".*\\\\.bam" .
154 <%(submissionLog)s/testfind/view/FastqRd1> dafTerm:filename_re ".*\\\\.fastq" .
155 <%(libUrl)s> <%(libraryOntology)sgel_cut> "100"^^xsd:decimal . 
156 ''' % {'submissionLog': 'http://jumpgate.caltech.edu/wiki/SubmissionsLog',
157        'libraryOntology': 'http://jumpgate.caltech.edu/wiki/LibraryOntology#',
158        'libUrl': lib_url}
159
160         daf_mapper = load_daf_mapper('testfind', extra)
161         libNode = RDF.Node(RDF.Uri(lib_url))
162         daf_mapper._add_library_details_to_model(libNode)
163         gel_cut = daf_mapper._get_library_attribute(libNode, 'gel_cut')
164         # make sure we can override attributes, the value in our
165         # server is 500 for this library
166         self.failUnlessEqual(gel_cut, 100)
167         
168         species = daf_mapper._get_library_attribute(libNode, 'species')
169         self.failUnlessEqual(species, "Homo sapiens")
170         
171         daf_mapper.construct_file_attributes('/tmp/analysis1', libNode, 'filename.bam')
172         source = daf_mapper.model.get_source(rdfNS['type'], submissionOntology['submission'])
173         self.failUnlessEqual(str(source), "<http://jumpgate.caltech.edu/wiki/SubmissionsLog/testfind/analysis1>")
174         view = daf_mapper.model.get_target(source, submissionOntology['has_view'])
175         self.failUnlessEqual(str(view), "<http://jumpgate.caltech.edu/wiki/SubmissionsLog/testfind/analysis1/Signal>")
176
177
178     def test_library_url(self):
179         daf_mapper = load_daf_mapper('urltest')
180
181         self.failUnlessEqual(daf_mapper.library_url,
182                              'http://jumpgate.caltech.edu/library/')
183         daf_mapper.library_url = 'http://google.com'
184         self.failUnlessEqual(daf_mapper.library_url, 'http://google.com' )
185         
186
187 def suite():
188     suite = unittest.makeSuite(TestDAF, 'test')
189     suite.addTest(unittest.makeSuite(TestDAFMapper, 'test'))
190     return suite
191
192 if __name__ == "__main__":
193     unittest.main(defaultTest='suite')