1 from contextlib import contextmanager
3 from StringIO import StringIO
8 from htsworkflow.submission import daf
9 from htsworkflow.util.rdfhelp import \
20 test_daf = """# Lab and general info
24 variables cell, antibody,sex,age,strain,control
25 compositeSuffix CaltechHistone
28 validationSettings validateFiles.bam:mismatches=2,bamPercent=99.9;validateFiles.fastq:quick=1000
30 # Track/view definition
32 longLabelPrefix Caltech Fastq Read 1
38 longLabelPrefix Caltech Histone Signal
44 test_daf_no_rep = """# Lab and general info
48 variables cell, antibody,sex,age,strain,control
49 compositeSuffix CaltechHistone
52 validationSettings validateFiles.bam:mismatches=2,bamPercent=99.9;validateFiles.fastq:quick=1000
54 # Track/view definition
56 longLabelPrefix Caltech Fastq Read 1
62 test_daf_extra = """# Lab and general info
66 variables cell,antibody,sex,age,strain
67 extraVariables controlId,treatment
68 compositeSuffix CaltechHistone
71 validationSettings validateFiles.bam:mismatches=2,bamPercent=99.9;validateFiles.fastq:quick=1000
73 # Track/view definition
75 longLabelPrefix Caltech Fastq Read 1
82 class TestDAF(unittest.TestCase):
85 parsed = daf.fromstring(test_daf)
87 self.failUnlessEqual(parsed['assembly'], 'mm9')
88 self.failUnlessEqual(parsed['grant'], 'Hardison')
89 self.failUnlessEqual(len(parsed['variables']), 6)
90 self.failUnlessEqual(len(parsed['views']), 2)
91 self.failUnlessEqual(len(parsed['views']['FastqRd1']), 5)
92 self.failUnlessEqual(len(parsed['views']['Signal']), 5)
93 signal = parsed['views']['Signal']
94 self.failUnlessEqual(signal['required'], False)
95 self.failUnlessEqual(signal['longLabelPrefix'],
96 'Caltech Histone Signal')
101 parsed = daf.fromstring(test_daf)
102 #mem = RDF.Storage(storage_name='hashes',
103 # options_string='hash-type="memory"'),
104 mem = RDF.MemoryStorage()
105 model = RDF.Model(mem)
108 subNS = RDF.NS(str(submissionLog[name].uri))
109 daf.add_to_model(model, parsed, submissionLog[name].uri)
111 signal_view_node = RDF.Node(subNS['/view/Signal'].uri)
113 writer = get_serializer()
114 turtle = writer.serialize_model_to_string(model)
116 self.failUnless(str(signal_view_node.uri) in turtle)
118 statements = list(model.find_statements(
120 signal_view_node, None, None)))
121 self.failUnlessEqual(len(statements), 6)
122 name = model.get_target(signal_view_node, dafTermOntology['name'])
123 self.failUnlessEqual(fromTypedNode(name), u'Signal')
125 def test_get_view_namespace_from_string(self):
126 url = "http://jumpgate.caltech.edu/wiki/SubmissionLog/cursub/"
127 target = RDF.NS(url + 'view/')
128 view_namespace = daf.get_view_namespace(url)
129 self.assertEqual(view_namespace[''], target[''])
131 def test_get_view_namespace_from_string_no_trailing_slash(self):
132 url = "http://jumpgate.caltech.edu/wiki/SubmissionLog/cursub"
133 target = RDF.NS(url + '/view/')
134 view_namespace = daf.get_view_namespace(url)
135 self.assertEqual(view_namespace[''], target[''])
137 def test_get_view_namespace_from_uri_node(self):
138 url = "http://jumpgate.caltech.edu/wiki/SubmissionLog/cursub/"
139 node = RDF.Node(RDF.Uri(url))
140 target = RDF.NS(url + 'view/')
141 view_namespace = daf.get_view_namespace(node)
142 self.assertEqual(view_namespace[''], target[''])
145 def load_daf_mapper(name, extra_statements=None, ns=None, test_daf=test_daf):
146 """Load test model in
152 if extra_statements is not None:
153 parser = RDF.Parser(name='turtle')
154 parser.parse_string_into_model(model, extra_statements,
157 test_daf_stream = StringIO(test_daf)
158 mapper = daf.DAFMapper(name, daf_file = test_daf_stream, model=model)
161 def dump_model(model):
162 writer = get_serializer()
163 turtle = writer.serialize_model_to_string(model)
167 class TestDAFMapper(unittest.TestCase):
168 def test_create_mapper_add_pattern(self):
170 mapper = load_daf_mapper(name)
171 pattern = '.bam\Z(?ms)'
172 mapper.add_pattern('Signal', pattern)
174 s = RDF.Statement(mapper.viewNS['Signal'],
175 dafTermOntology['filename_re'],
177 search = list(mapper.model.find_statements(s))
178 self.failUnlessEqual(len(search), 1)
179 self.failUnlessEqual(str(search[0].subject),
180 str(submissionLog['testsub/view/Signal']))
181 self.failUnlessEqual(str(search[0].predicate),
182 str(dafTermOntology['filename_re']))
183 #self.failUnlessEqual(search[0].object.literal_value['string'], pattern)
186 def test_find_one_view(self):
188 extra = '''@prefix dafTerm:<http://jumpgate.caltech.edu/wiki/UcscDaf#> .
189 @prefix thisView: <http://jumpgate.caltech.edu/wiki/SubmissionsLog/{0}/view/> .
191 thisView:Signal dafTerm:filename_re ".*\\\\.bam" .
192 thisView:FastqRd1 dafTerm:filename_re ".*_r1\\\\.fastq" .
194 daf_mapper = load_daf_mapper(name, extra_statements = extra)
196 view = daf_mapper.find_view('filename_r1.fastq')
198 # dump_model(daf_mapper.model)
199 view_root = 'http://jumpgate.caltech.edu/wiki/SubmissionsLog/{0}/view/'
200 view_root = view_root.format(name)
201 self.failUnlessEqual(str(view)[1:-1],
202 '{0}{1}'.format(view_root,'FastqRd1'))
204 def test_find_overlapping_view(self):
206 extra = '''@prefix dafTerm:<http://jumpgate.caltech.edu/wiki/UcscDaf#> .
207 @prefix thisView: <http://jumpgate.caltech.edu/wiki/SubmissionsLog/{0}/view/> .
209 thisView:fastq dafTerm:filename_re ".*\\\\.fastq" .
210 thisView:FastqRd1 dafTerm:filename_re ".*_r1\\\\.fastq" .
212 daf_mapper = load_daf_mapper(name, extra_statements = extra)
214 self.failUnlessRaises(daf.ModelException,
215 daf_mapper.find_view,
218 def test_find_attributes(self):
220 lib_url = 'http://jumpgate.caltech.edu/library/%s/' %(lib_id)
221 extra = '''@prefix dafTerm: <http://jumpgate.caltech.edu/wiki/UcscDaf#> .
222 @prefix submissionOntology: <http://jumpgate.caltech.edu/wiki/UcscSubmissionOntology#> .
223 @prefix thisView: <http://jumpgate.caltech.edu/wiki/SubmissionsLog/testfind/view/> .
224 @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
226 thisView:Signal dafTerm:filename_re ".*\\\\.bam" ;
227 submissionOntology:view_name "Signal" .
228 thisView:FastqRd1 dafTerm:filename_re ".*\\\\.fastq" ;
229 submissionOntology:view_name "FastqRd1" .
230 <%(libUrl)s> <%(libraryOntology)sgel_cut> "100"^^xsd:decimal .
231 ''' % {'libraryOntology': 'http://jumpgate.caltech.edu/wiki/LibraryOntology#',
234 daf_mapper = load_daf_mapper('testfind', extra)
235 libNode = RDF.Node(RDF.Uri(lib_url))
236 daf_mapper._add_library_details_to_model(libNode)
237 gel_cut = daf_mapper._get_library_attribute(libNode, 'gel_cut')
238 # make sure we can override attributes, the value in our
239 # server is 500 for this library
240 self.failUnlessEqual(gel_cut, 100)
242 species = daf_mapper._get_library_attribute(libNode, 'species')
243 self.failUnlessEqual(species, "Homo sapiens")
245 with mktempdir('analysis') as analysis_dir:
246 path, analysis_name = os.path.split(analysis_dir)
247 with mktempfile('.bam', dir=analysis_dir) as filename:
248 daf_mapper.construct_track_attributes(analysis_dir,
252 #dump_model(daf_mapper.model)
254 sub_root = "http://jumpgate.caltech.edu/wiki/SubmissionsLog/testfind/"
255 submission_name = sub_root + analysis_name
256 source = daf_mapper.model.get_source(rdfNS['type'], submissionOntology['submission'])
257 self.failUnlessEqual(str(source.uri), submission_name)
259 view_name = submission_name + '/Signal'
260 view = daf_mapper.model.get_target(source, submissionOntology['has_view'])
261 self.failUnlessEqual(str(view.uri), view_name)
264 def test_library_url(self):
265 daf_mapper = load_daf_mapper('urltest')
267 self.failUnlessEqual(daf_mapper.library_url,
268 'http://jumpgate.caltech.edu/library/')
269 daf_mapper.library_url = 'http://google.com'
270 self.failUnlessEqual(daf_mapper.library_url, 'http://google.com' )
272 def test_daf_with_replicate(self):
273 daf_mapper = load_daf_mapper('test_rep')
274 self.failUnlessEqual(daf_mapper.need_replicate(), True)
275 self.failUnless('replicate' in daf_mapper.get_daf_variables())
277 def test_daf_without_replicate(self):
278 daf_mapper = load_daf_mapper('test_rep',test_daf=test_daf_no_rep)
279 self.failUnlessEqual(daf_mapper.need_replicate(), False)
280 self.failUnless('replicate' not in daf_mapper.get_daf_variables())
282 def test_daf_with_extra(self):
283 daf_mapper = load_daf_mapper('test_rep',test_daf=test_daf_extra)
284 variables = daf_mapper.get_daf_variables()
285 self.assertEqual(len(variables), 9)
286 self.failUnless('treatment' in variables)
287 self.failUnless('controlId' in variables)
291 def mktempdir(prefix='tmp'):
292 d = tempfile.mkdtemp(prefix=prefix)
298 def mktempfile(suffix='', prefix='tmp', dir=None):
299 fd, pathname = tempfile.mkstemp(suffix=suffix, prefix=prefix, dir=dir)
306 suite = unittest.makeSuite(TestDAF, 'test')
307 suite.addTest(unittest.makeSuite(TestDAFMapper, 'test'))
310 if __name__ == "__main__":
311 unittest.main(defaultTest='suite')