Generate manifest files for ENCODE3
[htsworkflow.git] / htsworkflow / submission / trackhub.py
1 import logging
2 import os
3
4 import RDF
5
6 from htsworkflow.submission.submission import Submission
7
8 from htsworkflow.util.rdfhelp import \
9      fromTypedNode, \
10      geoSoftNS, \
11      stripNamespace, \
12      submissionOntology
13
14 from django.conf import settings
15 from django.template import Context, loader
16
17 LOGGER = logging.getLogger(__name__)
18
19 class TrackHubSubmission(Submission):
20     def __init__(self, name, model, host):
21         super(TrackHubSubmission, self).__init__(name, model, host)
22
23     def make_hub(self, result_map):
24         samples = []
25         for lib_id, result_dir in result_map.items():
26             an_analysis = self.get_submission_node(result_dir)
27             metadata = self.get_sample_metadata(an_analysis)
28             if len(metadata) == 0:
29                 errmsg = 'No metadata found for {0}'
30                 LOGGER.error(errmsg.format(str(an_analysis),))
31                 continue
32             elif len(metadata) > 1:
33                 errmsg = 'Confused there are more than one sample for %s'
34                 LOGGER.debug(errmsg % (str(an_analysis),))
35             metadata = metadata[0]
36             samples.append(metadata)
37
38         template = loader.get_template('trackDb.txt')
39         context = Context({
40             'samples': samples,
41         })
42         return str(template.render(context))
43
44     def make_manifest(self, result_map):
45         files = []
46         for lib_id, result_dir in result_map.items():
47             an_analysis = self.get_submission_node(result_dir)
48             metadata = self.get_manifest_metadata(an_analysis)
49             files.extend(metadata)
50
51         template = loader.get_template('manifest.txt')
52         context = Context({
53             'files': files
54         })
55         return str(template.render(context))
56         
57     def get_sample_metadata(self, analysis_node):
58         """Gather information for filling out sample section of a SOFT file
59         """
60         query_template = loader.get_template('trackhub_samples.sparql')
61
62         context = Context({
63             'submission': str(analysis_node.uri),
64             'submissionSet': str(self.submissionSetNS[''].uri),
65             })
66
67         results = self.execute_query(query_template, context)
68         return results
69
70     def get_manifest_metadata(self, analysis_node):
71         query_template = loader.get_template('trackhub_manifest.sparql')
72
73         context = Context({
74             'submission': str(analysis_node.uri),
75             'submissionSet': str(self.submissionSetNS[''].uri),
76             })
77         results = self.execute_query(query_template, context)
78         return results